{"mappings":"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","names":["StorageError","message","namespace","status","statusCode","isStorageError","error","StorageApiError","_objectSpread2","StorageUnknownError","originalError","StorageVectorsError","isStorageVectorsError","StorageVectorsApiError","StorageVectorsUnknownError","StorageVectorsErrorCode","StorageVectorsErrorCode$1","setHeader","headers","name","value","result","nameLower","key","normalizeHeaders","result: Record\u003cstring, string\u003e","resolveFetch","customFetch","args","isPlainObject","prototype","recursiveToCamel","item","el","result: Record\u003cstring, any\u003e","newKey","c","isValidBucketName","bucketName","_getErrorMessage","err","nested","handleError","reject","options","responseError","_getRequestParams","method","parameters","body","params: { [k: string]: any }","params","contentType: string | undefined","contentType","_contentType","_handleRequest","fetcher","url","resolve","data","createFetchApi","defaultApi","get","post","put","head","remove","vectorsApi","BaseApiClient","fetch$1","fetch","setHeaderUtil","operation","this","StreamDownloadBuilder","downloadFn: () =\u003e Promise\u003cResponse\u003e","shouldThrowOnError: boolean","downloadFn","shouldThrowOnError","onfulfilled","onrejected","BlobDownloadBuilder","onfinally","DEFAULT_SEARCH_OPTIONS","DEFAULT_FILE_OPTIONS: FileOptions","StorageFileApi","bucketId","path","fileBody","fileOptions","DEFAULT_FILE_OPTIONS","headers: Record\u003cstring, string\u003e","metadata","cleanPath","_path","token","fromPath","toPath","expiresIn","hasTransform","query","queryString","paths","datum","renderPath","_error$originalError","transform","version","DEFAULT_HEADERS","StorageBucketApi","opts","baseUrl","finalUrl","finalHeaders","id","params: Record\u003cstring, string\u003e","StorageAnalyticsClient","queryParams","catalog","IcebergRestCatalog","target","prop","VectorIndexApi","vectorBucketName","indexName","VectorDataApi","VectorBucketApi","StorageVectorsClient","VectorBucketScope","_this","_superprop_getCreateBucket","_this2","_superprop_getGetBucket","_this3","_superprop_getListBuckets","_this4","_superprop_getDeleteBucket","_this5","_superprop_getCreateIndex","_this6","_superprop_getListIndexes","_this7","_superprop_getGetIndex","_this8","_superprop_getDeleteIndex","VectorIndexScope","_this9","_superprop_getPutVectors","_this10","_superprop_getGetVectors","_this11","_superprop_getListVectors","_this12","_superprop_getQueryVectors","_this13","_superprop_getDeleteVectors","StorageClient"],"sources":["../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/common/errors.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/common/headers.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/common/helpers.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/common/fetch.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/common/BaseApiClient.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/StreamDownloadBuilder.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/BlobDownloadBuilder.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/StorageFileApi.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/version.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/lib/constants.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/StorageBucketApi.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/StorageAnalyticsClient.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/VectorIndexApi.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/VectorDataApi.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/VectorBucketApi.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/packages/StorageVectorsClient.ts","../esm/npm/@supabase/storage-js@2.105.4/node_modules/@supabase/storage-js/src/StorageClient.ts"],"sourcesContent":["/**\n * Namespace type for error classes\n * Determines the error class names and type guards\n */\nexport type ErrorNamespace = 'storage' | 'vectors'\n\n/**\n * Base error class for all Storage errors\n * Supports both 'storage' and 'vectors' namespaces\n */\nexport class StorageError extends Error {\n  protected __isStorageError = true\n  protected namespace: ErrorNamespace\n  status: number | undefined\n  statusCode: string | undefined\n\n  constructor(\n    message: string,\n    namespace: ErrorNamespace = 'storage',\n    status?: number,\n    statusCode?: string\n  ) {\n    super(message)\n    this.namespace = namespace\n    this.name = namespace === 'vectors' ? 'StorageVectorsError' : 'StorageError'\n    this.status = status\n    this.statusCode = statusCode\n  }\n\n  toJSON(): {\n    name: string\n    message: string\n    status: number | undefined\n    statusCode: string | undefined\n  } {\n    return {\n      name: this.name,\n      message: this.message,\n      status: this.status,\n      statusCode: this.statusCode,\n    }\n  }\n}\n\n/**\n * Type guard to check if an error is a StorageError\n * @param error - The error to check\n * @returns True if the error is a StorageError\n */\nexport function isStorageError(error: unknown): error is StorageError {\n  return typeof error === 'object' \u0026\u0026 error !== null \u0026\u0026 '__isStorageError' in error\n}\n\n/**\n * API error returned from Storage service\n * Includes HTTP status code and service-specific error code\n */\nexport class StorageApiError extends StorageError {\n  override status: number\n  override statusCode: string\n\n  constructor(\n    message: string,\n    status: number,\n    statusCode: string,\n    namespace: ErrorNamespace = 'storage'\n  ) {\n    super(message, namespace, status, statusCode)\n    this.name = namespace === 'vectors' ? 'StorageVectorsApiError' : 'StorageApiError'\n    this.status = status\n    this.statusCode = statusCode\n  }\n\n  toJSON(): {\n    name: string\n    message: string\n    status: number | undefined\n    statusCode: string | undefined\n  } {\n    return {\n      ...super.toJSON(),\n    }\n  }\n}\n\n/**\n * Unknown error that doesn't match expected error patterns\n * Wraps the original error for debugging\n */\nexport class StorageUnknownError extends StorageError {\n  originalError: unknown\n\n  constructor(message: string, originalError: unknown, namespace: ErrorNamespace = 'storage') {\n    super(message, namespace)\n    this.name = namespace === 'vectors' ? 'StorageVectorsUnknownError' : 'StorageUnknownError'\n    this.originalError = originalError\n  }\n}\n\n// ============================================================================\n// Backward Compatibility Exports for Vectors\n// ============================================================================\n\n/**\n * @deprecated Use StorageError with namespace='vectors' instead\n * Alias for backward compatibility with existing vector storage code\n */\nexport class StorageVectorsError extends StorageError {\n  constructor(message: string) {\n    super(message, 'vectors')\n  }\n}\n\n/**\n * Type guard to check if an error is a StorageVectorsError\n * @param error - The error to check\n * @returns True if the error is a StorageVectorsError\n */\nexport function isStorageVectorsError(error: unknown): error is StorageVectorsError {\n  return isStorageError(error) \u0026\u0026 (error as StorageError)['namespace'] === 'vectors'\n}\n\n/**\n * @deprecated Use StorageApiError with namespace='vectors' instead\n * Alias for backward compatibility with existing vector storage code\n */\nexport class StorageVectorsApiError extends StorageApiError {\n  constructor(message: string, status: number, statusCode: string) {\n    super(message, status, statusCode, 'vectors')\n  }\n}\n\n/**\n * @deprecated Use StorageUnknownError with namespace='vectors' instead\n * Alias for backward compatibility with existing vector storage code\n */\nexport class StorageVectorsUnknownError extends StorageUnknownError {\n  constructor(message: string, originalError: unknown) {\n    super(message, originalError, 'vectors')\n  }\n}\n\n/**\n * Error codes specific to S3 Vectors API\n * Maps AWS service errors to application-friendly error codes\n */\nexport enum StorageVectorsErrorCode {\n  /** Internal server fault (HTTP 500) */\n  InternalError = 'InternalError',\n  /** Resource already exists / conflict (HTTP 409) */\n  S3VectorConflictException = 'S3VectorConflictException',\n  /** Resource not found (HTTP 404) */\n  S3VectorNotFoundException = 'S3VectorNotFoundException',\n  /** Delete bucket while not empty (HTTP 400) */\n  S3VectorBucketNotEmpty = 'S3VectorBucketNotEmpty',\n  /** Exceeds bucket quota/limit (HTTP 400) */\n  S3VectorMaxBucketsExceeded = 'S3VectorMaxBucketsExceeded',\n  /** Exceeds index quota/limit (HTTP 400) */\n  S3VectorMaxIndexesExceeded = 'S3VectorMaxIndexesExceeded',\n}\n","/**\n * Sets a header with case-insensitive deduplication.\n * Removes any existing headers whose name matches (case-insensitive),\n * then sets the value under the lowercase key. Does not mutate the input object.\n *\n * @param headers - Existing headers object\n * @param name - Header name to set (stored as lowercase)\n * @param value - Header value\n * @returns New headers object with the header set\n */\nexport function setHeader(\n  headers: Record\u003cstring, string\u003e,\n  name: string,\n  value: string\n): Record\u003cstring, string\u003e {\n  const result = { ...headers }\n  const nameLower = name.toLowerCase()\n\n  for (const key of Object.keys(result)) {\n    if (key.toLowerCase() === nameLower) {\n      delete result[key]\n    }\n  }\n\n  result[nameLower] = value\n  return result\n}\n\n/**\n * Normalizes all header keys to lowercase with case-insensitive deduplication.\n * When duplicate keys exist (differing only in case), the last value wins.\n * Does not mutate the input object.\n *\n * @param headers - Headers object to normalize\n * @returns New headers object with all keys lowercased\n */\nexport function normalizeHeaders(headers: Record\u003cstring, string\u003e): Record\u003cstring, string\u003e {\n  const result: Record\u003cstring, string\u003e = {}\n  for (const [key, value] of Object.entries(headers)) {\n    result[key.toLowerCase()] = value\n  }\n  return result\n}\n","type Fetch = typeof fetch\n\n/**\n * Resolves the fetch implementation to use\n * Uses custom fetch if provided, otherwise uses native fetch\n *\n * @param customFetch - Optional custom fetch implementation\n * @returns Resolved fetch function\n */\nexport const resolveFetch = (customFetch?: Fetch): Fetch =\u003e {\n  if (customFetch) {\n    return (...args) =\u003e customFetch(...args)\n  }\n  return (...args) =\u003e fetch(...args)\n}\n\n/**\n * Resolves the Response constructor to use\n * Returns native Response constructor\n *\n * @returns Response constructor\n */\nexport const resolveResponse = (): typeof Response =\u003e {\n  return Response\n}\n\n/**\n * Determine if input is a plain object\n * An object is plain if it's created by either {}, new Object(), or Object.create(null)\n *\n * @param value - Value to check\n * @returns True if value is a plain object\n * @source https://github.com/sindresorhus/is-plain-obj\n */\nexport const isPlainObject = (value: object): boolean =\u003e {\n  if (typeof value !== 'object' || value === null) {\n    return false\n  }\n\n  const prototype = Object.getPrototypeOf(value)\n  return (\n    (prototype === null ||\n      prototype === Object.prototype ||\n      Object.getPrototypeOf(prototype) === null) \u0026\u0026\n    !(Symbol.toStringTag in value) \u0026\u0026\n    !(Symbol.iterator in value)\n  )\n}\n\n/**\n * Recursively converts object keys from snake_case to camelCase\n * Used for normalizing API responses\n *\n * @param item - Object to convert\n * @returns Converted object with camelCase keys\n */\nexport const recursiveToCamel = (item: Record\u003cstring, any\u003e): unknown =\u003e {\n  if (Array.isArray(item)) {\n    return item.map((el) =\u003e recursiveToCamel(el))\n  } else if (typeof item === 'function' || item !== Object(item)) {\n    return item\n  }\n\n  const result: Record\u003cstring, any\u003e = {}\n  Object.entries(item).forEach(([key, value]) =\u003e {\n    const newKey = key.replace(/([-_][a-z])/gi, (c) =\u003e c.toUpperCase().replace(/[-_]/g, ''))\n    result[newKey] = recursiveToCamel(value)\n  })\n\n  return result\n}\n\n/**\n * Validates if a given bucket name is valid according to Supabase Storage API rules\n * Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()\n *\n * Rules:\n * - Length: 1-100 characters\n * - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters\n * - Safe special characters: ! - . * ' ( ) space \u0026 $ @ = ; : + , ?\n * - Forbidden: path separators (/, \\), path traversal (..), leading/trailing whitespace\n *\n * AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n *\n * @param bucketName - The bucket name to validate\n * @returns true if valid, false otherwise\n */\nexport const isValidBucketName = (bucketName: string): boolean =\u003e {\n  if (!bucketName || typeof bucketName !== 'string') {\n    return false\n  }\n\n  // Check length constraints (1-100 characters)\n  if (bucketName.length === 0 || bucketName.length \u003e 100) {\n    return false\n  }\n\n  // Check for leading/trailing whitespace\n  if (bucketName.trim() !== bucketName) {\n    return false\n  }\n\n  // Explicitly reject path separators (security)\n  // Note: Consecutive periods (..) are allowed by backend - the AWS restriction\n  // on relative paths applies to object keys, not bucket names\n  if (bucketName.includes('/') || bucketName.includes('\\\\')) {\n    return false\n  }\n\n  // Validate against allowed character set\n  // Pattern matches backend regex: /^(\\w|!|-|\\.|\\*|'|\\(|\\)| |\u0026|\\$|@|=|;|:|\\+|,|\\?)*$/\n  // This explicitly excludes path separators (/, \\) and other problematic characters\n  const bucketNameRegex = /^[\\w!.\\*'() \u0026$@=;:+,?-]+$/\n  return bucketNameRegex.test(bucketName)\n}\n\n/**\n * Normalizes a number array to float32 format\n * Ensures all vector values are valid 32-bit floats\n *\n * @param values - Array of numbers to normalize\n * @returns Normalized float32 array\n */\nexport const normalizeToFloat32 = (values: number[]): number[] =\u003e {\n  // Use Float32Array to ensure proper precision\n  return Array.from(new Float32Array(values))\n}\n\n/**\n * Validates vector dimensions match expected dimension\n * Throws error if dimensions don't match\n *\n * @param vector - Vector data to validate\n * @param expectedDimension - Expected vector dimension\n * @throws Error if dimensions don't match\n */\nexport const validateVectorDimension = (\n  vector: { float32: number[] },\n  expectedDimension?: number\n): void =\u003e {\n  if (expectedDimension !== undefined \u0026\u0026 vector.float32.length !== expectedDimension) {\n    throw new Error(\n      `Vector dimension mismatch: expected ${expectedDimension}, got ${vector.float32.length}`\n    )\n  }\n}\n","import { StorageApiError, StorageError, StorageUnknownError, ErrorNamespace } from './errors'\nimport { setHeader } from './headers'\nimport { isPlainObject, resolveResponse } from './helpers'\nimport { FetchParameters } from '../types'\n\nexport type Fetch = typeof fetch\n\n/**\n * Options for fetch requests\n */\nexport interface FetchOptions {\n  headers?: {\n    [key: string]: string\n  }\n  duplex?: string\n  noResolveJson?: boolean\n}\n\n/**\n * HTTP methods supported by the API\n */\nexport type RequestMethodType = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD'\n\n/**\n * Extracts error message from various error response formats\n * @param err - Error object from API\n * @returns Human-readable error message\n */\nconst _getErrorMessage = (err: unknown): string =\u003e {\n  if (typeof err === 'object' \u0026\u0026 err !== null) {\n    const e = err as Record\u003cstring, unknown\u003e\n    if (typeof e.msg === 'string') return e.msg\n    if (typeof e.message === 'string') return e.message\n    if (typeof e.error_description === 'string') return e.error_description\n    if (typeof e.error === 'string') return e.error\n    if (typeof e.error === 'object' \u0026\u0026 e.error !== null) {\n      const nested = e.error as Record\u003cstring, unknown\u003e\n      if (typeof nested.message === 'string') return nested.message\n    }\n  }\n  return JSON.stringify(err)\n}\n\n/**\n * Handles fetch errors and converts them to Storage error types\n * @param error - The error caught from fetch\n * @param reject - Promise rejection function\n * @param options - Fetch options that may affect error handling\n * @param namespace - Error namespace ('storage' or 'vectors')\n */\nconst handleError = async (\n  error: unknown,\n  reject: (reason: StorageError) =\u003e void,\n  options: FetchOptions | undefined,\n  namespace: ErrorNamespace\n) =\u003e {\n  // Structural detection of json() method, present in all Response implementations\n  // (native, node-fetch, cross-fetch, undici) and absent from standard Error objects.\n  // Checking 'ok' or 'status' via `in` is unreliable across fetch polyfills/realms.\n  const isResponseLike =\n    error !== null \u0026\u0026\n    typeof error === 'object' \u0026\u0026\n    'json' in error \u0026\u0026\n    typeof (error as Record\u003cstring, unknown\u003e).json === 'function'\n\n  if (isResponseLike) {\n    const responseError = error as Response\n    // Defensive coercion: some fetch polyfills have historically returned status as a string.\n    let status = parseInt(String(responseError.status), 10)\n    if (!Number.isFinite(status)) {\n      status = 500\n    }\n\n    responseError\n      .json()\n      .then(\n        (err: { statusCode?: string; code?: string; error?: string; message?: string } | null) =\u003e {\n          const statusCode = err?.statusCode || err?.code || status + ''\n          reject(new StorageApiError(_getErrorMessage(err), status, statusCode, namespace))\n        }\n      )\n      .catch(() =\u003e {\n        const statusCode = status + ''\n        const message = responseError.statusText || `HTTP ${status} error`\n        reject(new StorageApiError(message, status, statusCode, namespace))\n      })\n  } else {\n    reject(new StorageUnknownError(_getErrorMessage(error), error, namespace))\n  }\n}\n\n/**\n * Builds request parameters for fetch calls\n * @param method - HTTP method\n * @param options - Custom fetch options\n * @param parameters - Additional fetch parameters like AbortSignal\n * @param body - Request body (will be JSON stringified if plain object)\n * @returns Complete fetch request parameters\n */\nconst _getRequestParams = (\n  method: RequestMethodType,\n  options?: FetchOptions,\n  parameters?: FetchParameters,\n  body?: object\n) =\u003e {\n  const params: { [k: string]: any } = { method, headers: options?.headers || {} }\n\n  if (method === 'GET' || method === 'HEAD' || !body) {\n    return { ...params, ...parameters }\n  }\n\n  if (isPlainObject(body)) {\n    const headers = options?.headers || {}\n    let contentType: string | undefined\n\n    for (const [key, value] of Object.entries(headers)) {\n      if (key.toLowerCase() === 'content-type') {\n        contentType = value\n      }\n    }\n\n    params.headers = setHeader(headers, 'Content-Type', contentType ?? 'application/json')\n    params.body = JSON.stringify(body)\n  } else {\n    params.body = body\n  }\n\n  if (options?.duplex) {\n    params.duplex = options.duplex\n  }\n\n  return { ...params, ...parameters }\n}\n\n/**\n * Internal request handler that wraps fetch with error handling\n * @param fetcher - Fetch function to use\n * @param method - HTTP method\n * @param url - Request URL\n * @param options - Custom fetch options\n * @param parameters - Additional fetch parameters\n * @param body - Request body\n * @param namespace - Error namespace ('storage' or 'vectors')\n * @returns Promise with parsed response or error\n */\nasync function _handleRequest(\n  fetcher: Fetch,\n  method: RequestMethodType,\n  url: string,\n  options: FetchOptions | undefined,\n  parameters: FetchParameters | undefined,\n  body: object | undefined,\n  namespace: ErrorNamespace\n): Promise\u003cany\u003e {\n  return new Promise((resolve, reject) =\u003e {\n    fetcher(url, _getRequestParams(method, options, parameters, body))\n      .then((result) =\u003e {\n        if (!result.ok) throw result\n        if (options?.noResolveJson) return result\n\n        // AWS S3 Vectors API returns 200 OK with content-length: 0 for successful mutations\n        // (putVectors, deleteVectors) instead of 204 or JSON response. This is AWS's design choice\n        // for performance optimization of bulk operations (up to 500 vectors per request).\n        // We handle this to prevent \"Unexpected end of JSON input\" errors when calling result.json()\n        if (namespace === 'vectors') {\n          const contentType = result.headers.get('content-type')\n          const contentLength = result.headers.get('content-length')\n\n          // Return empty object for explicitly empty responses\n          if (contentLength === '0' || result.status === 204) {\n            return {}\n          }\n\n          // Return empty object if no JSON content type\n          if (!contentType || !contentType.includes('application/json')) {\n            return {}\n          }\n        }\n\n        return result.json()\n      })\n      .then((data) =\u003e resolve(data))\n      .catch((error) =\u003e handleError(error, reject, options, namespace))\n  })\n}\n\n/**\n * Creates a fetch API with the specified namespace\n * @param namespace - Error namespace ('storage' or 'vectors')\n * @returns Object with HTTP method functions\n */\nexport function createFetchApi(namespace: ErrorNamespace = 'storage') {\n  return {\n    /**\n     * Performs a GET request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    get: async (\n      fetcher: Fetch,\n      url: string,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise\u003cany\u003e =\u003e {\n      return _handleRequest(fetcher, 'GET', url, options, parameters, undefined, namespace)\n    },\n\n    /**\n     * Performs a POST request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param body - Request body to be JSON stringified\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    post: async (\n      fetcher: Fetch,\n      url: string,\n      body: object,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise\u003cany\u003e =\u003e {\n      return _handleRequest(fetcher, 'POST', url, options, parameters, body, namespace)\n    },\n\n    /**\n     * Performs a PUT request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param body - Request body to be JSON stringified\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    put: async (\n      fetcher: Fetch,\n      url: string,\n      body: object,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise\u003cany\u003e =\u003e {\n      return _handleRequest(fetcher, 'PUT', url, options, parameters, body, namespace)\n    },\n\n    /**\n     * Performs a HEAD request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with Response object (not JSON parsed)\n     */\n    head: async (\n      fetcher: Fetch,\n      url: string,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise\u003cany\u003e =\u003e {\n      return _handleRequest(\n        fetcher,\n        'HEAD',\n        url,\n        {\n          ...options,\n          noResolveJson: true,\n        },\n        parameters,\n        undefined,\n        namespace\n      )\n    },\n\n    /**\n     * Performs a DELETE request\n     * @param fetcher - Fetch function to use\n     * @param url - Request URL\n     * @param body - Request body to be JSON stringified\n     * @param options - Custom fetch options\n     * @param parameters - Additional fetch parameters\n     * @returns Promise with parsed response\n     */\n    remove: async (\n      fetcher: Fetch,\n      url: string,\n      body: object,\n      options?: FetchOptions,\n      parameters?: FetchParameters\n    ): Promise\u003cany\u003e =\u003e {\n      return _handleRequest(fetcher, 'DELETE', url, options, parameters, body, namespace)\n    },\n  }\n}\n\n// Default exports for backward compatibility with 'storage' namespace\nconst defaultApi = createFetchApi('storage')\nexport const { get, post, put, head, remove } = defaultApi\n\n// Vectors API with 'vectors' namespace for proper error handling\nexport const vectorsApi = createFetchApi('vectors')\n","import { ErrorNamespace, isStorageError, StorageError } from './errors'\nimport { Fetch } from './fetch'\nimport { normalizeHeaders, setHeader as setHeaderUtil } from './headers'\nimport { resolveFetch } from './helpers'\n\n/**\n * @ignore\n * Base API client class for all Storage API classes\n * Provides common infrastructure for error handling and configuration\n *\n * @typeParam TError - The error type (StorageError or subclass)\n */\nexport default abstract class BaseApiClient\u003cTError extends StorageError = StorageError\u003e {\n  protected url: string\n  protected headers: { [key: string]: string }\n  protected fetch: Fetch\n  protected shouldThrowOnError = false\n  protected namespace: ErrorNamespace\n\n  /**\n   * Creates a new BaseApiClient instance\n   * @param url - Base URL for API requests\n   * @param headers - Default headers for API requests\n   * @param fetch - Optional custom fetch implementation\n   * @param namespace - Error namespace ('storage' or 'vectors')\n   */\n  constructor(\n    url: string,\n    headers: { [key: string]: string } = {},\n    fetch?: Fetch,\n    namespace: ErrorNamespace = 'storage'\n  ) {\n    this.url = url\n    this.headers = normalizeHeaders(headers)\n    this.fetch = resolveFetch(fetch)\n    this.namespace = namespace\n  }\n\n  /**\n   * Enable throwing errors instead of returning them.\n   * When enabled, errors are thrown instead of returned in { data, error } format.\n   *\n   * @returns this - For method chaining\n   */\n  public throwOnError(): this {\n    this.shouldThrowOnError = true\n    return this\n  }\n\n  /**\n   * Set an HTTP header for the request.\n   * Creates a shallow copy of headers to avoid mutating shared state.\n   *\n   * @param name - Header name\n   * @param value - Header value\n   * @returns this - For method chaining\n   */\n  public setHeader(name: string, value: string): this {\n    this.headers = setHeaderUtil(this.headers, name, value)\n    return this\n  }\n\n  /**\n   * Handles API operation with standardized error handling\n   * Eliminates repetitive try-catch blocks across all API methods\n   *\n   * This wrapper:\n   * 1. Executes the operation\n   * 2. Returns { data, error: null } on success\n   * 3. Returns { data: null, error } on failure (if shouldThrowOnError is false)\n   * 4. Throws error on failure (if shouldThrowOnError is true)\n   *\n   * @typeParam T - The expected data type from the operation\n   * @param operation - Async function that performs the API call\n   * @returns Promise with { data, error } tuple\n   *\n   * @example Handling an operation\n   * ```typescript\n   * async listBuckets() {\n   *   return this.handleOperation(async () =\u003e {\n   *     return await get(this.fetch, `${this.url}/bucket`, {\n   *       headers: this.headers,\n   *     })\n   *   })\n   * }\n   * ```\n   */\n  protected async handleOperation\u003cT\u003e(\n    operation: () =\u003e Promise\u003cT\u003e\n  ): Promise\u003c{ data: T; error: null } | { data: null; error: TError }\u003e {\n    try {\n      const data = await operation()\n      return { data, error: null }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n      if (isStorageError(error)) {\n        return { data: null, error: error as TError }\n      }\n      throw error\n    }\n  }\n}\n","import { isStorageError } from '../lib/common/errors'\nimport { DownloadResult } from '../lib/types'\n\nexport default class StreamDownloadBuilder implements PromiseLike\u003cDownloadResult\u003cReadableStream\u003e\u003e {\n  constructor(\n    private downloadFn: () =\u003e Promise\u003cResponse\u003e,\n    private shouldThrowOnError: boolean\n  ) {}\n\n  then\u003cTResult1 = DownloadResult\u003cReadableStream\u003e, TResult2 = never\u003e(\n    onfulfilled?:\n      | ((value: DownloadResult\u003cReadableStream\u003e) =\u003e TResult1 | PromiseLike\u003cTResult1\u003e)\n      | null,\n    onrejected?: ((reason: any) =\u003e TResult2 | PromiseLike\u003cTResult2\u003e) | null\n  ): Promise\u003cTResult1 | TResult2\u003e {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise\u003cDownloadResult\u003cReadableStream\u003e\u003e {\n    try {\n      const result = await this.downloadFn()\n\n      return {\n        data: result.body as ReadableStream,\n        error: null,\n      }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n\n      if (isStorageError(error)) {\n        return { data: null, error }\n      }\n\n      throw error\n    }\n  }\n}\n","import { isStorageError } from '../lib/common/errors'\nimport { DownloadResult } from '../lib/types'\nimport StreamDownloadBuilder from './StreamDownloadBuilder'\n\nexport default class BlobDownloadBuilder implements Promise\u003cDownloadResult\u003cBlob\u003e\u003e {\n  readonly [Symbol.toStringTag]: string = 'BlobDownloadBuilder'\n  private promise: Promise\u003cDownloadResult\u003cBlob\u003e\u003e | null = null\n\n  constructor(\n    private downloadFn: () =\u003e Promise\u003cResponse\u003e,\n    private shouldThrowOnError: boolean\n  ) {}\n\n  asStream(): StreamDownloadBuilder {\n    return new StreamDownloadBuilder(this.downloadFn, this.shouldThrowOnError)\n  }\n\n  then\u003cTResult1 = DownloadResult\u003cBlob\u003e, TResult2 = never\u003e(\n    onfulfilled?: ((value: DownloadResult\u003cBlob\u003e) =\u003e TResult1 | PromiseLike\u003cTResult1\u003e) | null,\n    onrejected?: ((reason: any) =\u003e TResult2 | PromiseLike\u003cTResult2\u003e) | null\n  ): Promise\u003cTResult1 | TResult2\u003e {\n    return this.getPromise().then(onfulfilled, onrejected)\n  }\n\n  catch\u003cTResult = never\u003e(\n    onrejected?: ((reason: any) =\u003e TResult | PromiseLike\u003cTResult\u003e) | null\n  ): Promise\u003cDownloadResult\u003cBlob\u003e | TResult\u003e {\n    return this.getPromise().catch(onrejected)\n  }\n\n  finally(onfinally?: (() =\u003e void) | null): Promise\u003cDownloadResult\u003cBlob\u003e\u003e {\n    return this.getPromise().finally(onfinally)\n  }\n\n  private getPromise(): Promise\u003cDownloadResult\u003cBlob\u003e\u003e {\n    if (!this.promise) {\n      this.promise = this.execute()\n    }\n    return this.promise\n  }\n\n  private async execute(): Promise\u003cDownloadResult\u003cBlob\u003e\u003e {\n    try {\n      const result = await this.downloadFn()\n\n      return {\n        data: await result.blob(),\n        error: null,\n      }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n\n      if (isStorageError(error)) {\n        return { data: null, error }\n      }\n\n      throw error\n    }\n  }\n}\n","import {\n  StorageApiError,\n  StorageError,\n  StorageUnknownError,\n  isStorageError,\n} from '../lib/common/errors'\nimport { get, head, post, put, remove, Fetch } from '../lib/common/fetch'\nimport { setHeader } from '../lib/common/headers'\nimport { recursiveToCamel } from '../lib/common/helpers'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport {\n  FileObject,\n  FileOptions,\n  SearchOptions,\n  FetchParameters,\n  TransformOptions,\n  DestinationOptions,\n  FileObjectV2,\n  Camelize,\n  SearchV2Options,\n  SearchV2Result,\n} from '../lib/types'\nimport BlobDownloadBuilder from './BlobDownloadBuilder'\n\nconst DEFAULT_SEARCH_OPTIONS = {\n  limit: 100,\n  offset: 0,\n  sortBy: {\n    column: 'name',\n    order: 'asc',\n  },\n}\n\nconst DEFAULT_FILE_OPTIONS: FileOptions = {\n  cacheControl: '3600',\n  contentType: 'text/plain;charset=UTF-8',\n  upsert: false,\n}\n\ntype FileBody =\n  | ArrayBuffer\n  | ArrayBufferView\n  | Blob\n  | Buffer\n  | File\n  | FormData\n  | NodeJS.ReadableStream\n  | ReadableStream\u003cUint8Array\u003e\n  | URLSearchParams\n  | string\n\nexport default class StorageFileApi extends BaseApiClient\u003cStorageError\u003e {\n  protected bucketId: string | undefined\n\n  constructor(\n    url: string,\n    headers: { [key: string]: string } = {},\n    bucketId?: string,\n    fetch?: Fetch\n  ) {\n    super(url, headers, fetch, 'storage')\n    this.bucketId = bucketId\n  }\n\n  /**\n   * Uploads a file to an existing bucket or replaces an existing file at the specified path with a new one.\n   *\n   * @param method HTTP method.\n   * @param path The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n   * @param fileBody The body of the file to be stored in the bucket.\n   */\n  private async uploadOrUpdate(\n    method: 'POST' | 'PUT',\n    path: string,\n    fileBody: FileBody,\n    fileOptions?: FileOptions\n  ): Promise\u003c\n    | {\n        data: { id: string; path: string; fullPath: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      let body\n      const options = { ...DEFAULT_FILE_OPTIONS, ...fileOptions }\n      let headers: Record\u003cstring, string\u003e = {\n        ...this.headers,\n        ...(method === 'POST' \u0026\u0026 { 'x-upsert': String(options.upsert as boolean) }),\n      }\n\n      const metadata = options.metadata\n\n      if (typeof Blob !== 'undefined' \u0026\u0026 fileBody instanceof Blob) {\n        body = new FormData()\n        body.append('cacheControl', options.cacheControl as string)\n        if (metadata) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n        body.append('', fileBody)\n      } else if (typeof FormData !== 'undefined' \u0026\u0026 fileBody instanceof FormData) {\n        body = fileBody\n        // Only append if not already present\n        if (!body.has('cacheControl')) {\n          body.append('cacheControl', options.cacheControl as string)\n        }\n        if (metadata \u0026\u0026 !body.has('metadata')) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n      } else {\n        body = fileBody\n        headers['cache-control'] = `max-age=${options.cacheControl}`\n        headers['content-type'] = options.contentType as string\n\n        if (metadata) {\n          headers['x-metadata'] = this.toBase64(this.encodeMetadata(metadata))\n        }\n\n        // Node.js streams require duplex option for fetch in Node 20+\n        // Check for both web ReadableStream and Node.js streams\n        const isStream =\n          (typeof ReadableStream !== 'undefined' \u0026\u0026 body instanceof ReadableStream) ||\n          (body \u0026\u0026 typeof body === 'object' \u0026\u0026 'pipe' in body \u0026\u0026 typeof body.pipe === 'function')\n\n        if (isStream \u0026\u0026 !options.duplex) {\n          options.duplex = 'half'\n        }\n      }\n\n      if (fileOptions?.headers) {\n        for (const [key, value] of Object.entries(fileOptions.headers)) {\n          headers = setHeader(headers, key, value)\n        }\n      }\n\n      const cleanPath = this._removeEmptyFolders(path)\n      const _path = this._getFinalPath(cleanPath)\n      const data = await (method == 'PUT' ? put : post)(\n        this.fetch,\n        `${this.url}/object/${_path}`,\n        body as object,\n        { headers, ...(options?.duplex ? { duplex: options.duplex } : {}) }\n      )\n\n      return { path: cleanPath, id: data.Id, fullPath: data.Key }\n    })\n  }\n\n  /**\n   * Uploads a file to an existing bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n   * @param fileBody The body of the file to be stored in the bucket.\n   * @param fileOptions Optional file upload options including cacheControl, contentType, upsert, and metadata.\n   * @returns Promise with response containing file path, id, and fullPath or error\n   *\n   * @example Upload file\n   * ```js\n   * const avatarFile = event.target.files[0]\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .upload('public/avatar1.png', avatarFile, {\n   *     cacheControl: '3600',\n   *     upsert: false\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"public/avatar1.png\",\n   *     \"fullPath\": \"avatars/public/avatar1.png\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Upload file using `ArrayBuffer` from base64 file data\n   * ```js\n   * import { decode } from 'base64-arraybuffer'\n   *\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .upload('public/avatar1.png', decode('base64FileData'), {\n   *     contentType: 'image/png'\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: only `insert` when you are uploading new files and `select`, `insert` and `update` when you are upserting files\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   * - For React Native, using either `Blob`, `File` or `FormData` does not work as intended. Upload file using `ArrayBuffer` from base64 file data instead, see example below.\n   */\n  async upload(\n    path: string,\n    fileBody: FileBody,\n    fileOptions?: FileOptions\n  ): Promise\u003c\n    | {\n        data: { id: string; path: string; fullPath: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.uploadOrUpdate('POST', path, fileBody, fileOptions)\n  }\n\n  /**\n   * Upload a file with a token generated from `createSignedUploadUrl`.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n   * @param token The token generated from `createSignedUploadUrl`\n   * @param fileBody The body of the file to be stored in the bucket.\n   * @param fileOptions HTTP headers (cacheControl, contentType, etc.).\n   * **Note:** The `upsert` option has no effect here. To enable upsert behavior,\n   * pass `{ upsert: true }` when calling `createSignedUploadUrl()` instead.\n   * @returns Promise with response containing file path and fullPath or error\n   *\n   * @example Upload to a signed URL\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .uploadToSignedUrl('folder/cat.jpg', 'token-from-createSignedUploadUrl', file)\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"folder/cat.jpg\",\n   *     \"fullPath\": \"avatars/folder/cat.jpg\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async uploadToSignedUrl(\n    path: string,\n    token: string,\n    fileBody: FileBody,\n    fileOptions?: FileOptions\n  ) {\n    const cleanPath = this._removeEmptyFolders(path)\n    const _path = this._getFinalPath(cleanPath)\n\n    const url = new URL(this.url + `/object/upload/sign/${_path}`)\n    url.searchParams.set('token', token)\n\n    return this.handleOperation(async () =\u003e {\n      let body\n      const options = { ...DEFAULT_FILE_OPTIONS, ...fileOptions }\n      let headers: Record\u003cstring, string\u003e = {\n        ...this.headers,\n        ...{ 'x-upsert': String(options.upsert as boolean) },\n      }\n\n      const metadata = options.metadata\n\n      if (typeof Blob !== 'undefined' \u0026\u0026 fileBody instanceof Blob) {\n        body = new FormData()\n        body.append('cacheControl', options.cacheControl as string)\n        if (metadata) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n        body.append('', fileBody)\n      } else if (typeof FormData !== 'undefined' \u0026\u0026 fileBody instanceof FormData) {\n        body = fileBody\n        if (!body.has('cacheControl')) {\n          body.append('cacheControl', options.cacheControl as string)\n        }\n        if (metadata \u0026\u0026 !body.has('metadata')) {\n          body.append('metadata', this.encodeMetadata(metadata))\n        }\n      } else {\n        body = fileBody\n        headers['cache-control'] = `max-age=${options.cacheControl}`\n        headers['content-type'] = options.contentType as string\n        if (metadata) {\n          headers['x-metadata'] = this.toBase64(this.encodeMetadata(metadata))\n        }\n\n        const isStream =\n          (typeof ReadableStream !== 'undefined' \u0026\u0026 body instanceof ReadableStream) ||\n          (body \u0026\u0026 typeof body === 'object' \u0026\u0026 'pipe' in body \u0026\u0026 typeof body.pipe === 'function')\n\n        if (isStream \u0026\u0026 !options.duplex) {\n          options.duplex = 'half'\n        }\n      }\n\n      if (fileOptions?.headers) {\n        for (const [key, value] of Object.entries(fileOptions.headers)) {\n          headers = setHeader(headers, key, value)\n        }\n      }\n\n      const data = await put(this.fetch, url.toString(), body as object, {\n        headers,\n        ...(options?.duplex ? { duplex: options.duplex } : {}),\n      })\n\n      return { path: cleanPath, fullPath: data.Key }\n    })\n  }\n\n  /**\n   * Creates a signed upload URL.\n   * Signed upload URLs can be used to upload files to the bucket without further authentication.\n   * They are valid for 2 hours.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the current file name. For example `folder/image.png`.\n   * @param options.upsert If set to true, allows the file to be overwritten if it already exists.\n   * @returns Promise with response containing signed upload URL, token, and path or error\n   *\n   * @example Create Signed Upload URL\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUploadUrl('folder/cat.jpg')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"signedUrl\": \"https://example.supabase.co/storage/v1/object/upload/sign/avatars/folder/cat.jpg?token=\u003cTOKEN\u003e\",\n   *     \"path\": \"folder/cat.jpg\",\n   *     \"token\": \"\u003cTOKEN\u003e\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `insert`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createSignedUploadUrl(\n    path: string,\n    options?: { upsert: boolean }\n  ): Promise\u003c\n    | {\n        data: { signedUrl: string; token: string; path: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      let _path = this._getFinalPath(path)\n\n      const headers = { ...this.headers }\n\n      if (options?.upsert) {\n        headers['x-upsert'] = 'true'\n      }\n\n      const data = await post(\n        this.fetch,\n        `${this.url}/object/upload/sign/${_path}`,\n        {},\n        { headers }\n      )\n\n      const url = new URL(this.url + data.url)\n\n      const token = url.searchParams.get('token')\n\n      if (!token) {\n        throw new StorageError('No token returned by API')\n      }\n\n      return { signedUrl: url.toString(), path, token }\n    })\n  }\n\n  /**\n   * Replaces an existing file at the specified path with a new one.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to update.\n   * @param fileBody The body of the file to be stored in the bucket.\n   * @param fileOptions Optional file upload options including cacheControl, contentType, and metadata.\n   * **Note:** The `upsert` option has no effect here. `update()` always replaces the\n   * file at the given path, so the `x-upsert` header is not sent. To control upsert\n   * behavior, use `upload()` instead.\n   * @returns Promise with response containing file path, id, and fullPath or error\n   *\n   * @example Update file\n   * ```js\n   * const avatarFile = event.target.files[0]\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .update('public/avatar1.png', avatarFile, {\n   *     cacheControl: '3600'\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"public/avatar1.png\",\n   *     \"fullPath\": \"avatars/public/avatar1.png\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Update file using `ArrayBuffer` from base64 file data\n   * ```js\n   * import {decode} from 'base64-arraybuffer'\n   *\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .update('public/avatar1.png', decode('base64FileData'), {\n   *     contentType: 'image/png'\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `update` and `select`\n   * - `update()` always replaces the file at the given path regardless of the `upsert` option.\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   * - For React Native, using either `Blob`, `File` or `FormData` does not work as intended. Update file using `ArrayBuffer` from base64 file data instead, see example below.\n   */\n  async update(\n    path: string,\n    fileBody:\n      | ArrayBuffer\n      | ArrayBufferView\n      | Blob\n      | Buffer\n      | File\n      | FormData\n      | NodeJS.ReadableStream\n      | ReadableStream\u003cUint8Array\u003e\n      | URLSearchParams\n      | string,\n    fileOptions?: FileOptions\n  ): Promise\u003c\n    | {\n        data: { id: string; path: string; fullPath: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.uploadOrUpdate('PUT', path, fileBody, fileOptions)\n  }\n\n  /**\n   * Moves an existing file to a new path in the same bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param fromPath The original file path, including the current file name. For example `folder/image.png`.\n   * @param toPath The new file path, including the new file name. For example `folder/image-new.png`.\n   * @param options The destination options.\n   * @returns Promise with response containing success message or error\n   *\n   * @example Move file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .move('public/avatar1.png', 'private/avatar2.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"message\": \"Successfully moved\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `update` and `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async move(\n    fromPath: string,\n    toPath: string,\n    options?: DestinationOptions\n  ): Promise\u003c\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await post(\n        this.fetch,\n        `${this.url}/object/move`,\n        {\n          bucketId: this.bucketId,\n          sourceKey: fromPath,\n          destinationKey: toPath,\n          destinationBucket: options?.destinationBucket,\n        },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * Copies an existing file to a new path in the same bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param fromPath The original file path, including the current file name. For example `folder/image.png`.\n   * @param toPath The new file path, including the new file name. For example `folder/image-copy.png`.\n   * @param options The destination options.\n   * @returns Promise with response containing copied file path or error\n   *\n   * @example Copy file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .copy('public/avatar1.png', 'private/avatar2.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"path\": \"avatars/private/avatar2.png\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `insert` and `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async copy(\n    fromPath: string,\n    toPath: string,\n    options?: DestinationOptions\n  ): Promise\u003c\n    | {\n        data: { path: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      const data = await post(\n        this.fetch,\n        `${this.url}/object/copy`,\n        {\n          bucketId: this.bucketId,\n          sourceKey: fromPath,\n          destinationKey: toPath,\n          destinationBucket: options?.destinationBucket,\n        },\n        { headers: this.headers }\n      )\n      return { path: data.Key }\n    })\n  }\n\n  /**\n   * Creates a signed URL. Use a signed URL to share a file for a fixed amount of time.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the current file name. For example `folder/image.png`.\n   * @param expiresIn The number of seconds until the signed URL expires. For example, `60` for a URL which is valid for one minute.\n   * @param options.download triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n   * @param options.transform Transform the asset before serving it to the client.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @returns Promise with response containing signed URL or error\n   *\n   * @example Create Signed URL\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrl('folder/avatar1.png', 60)\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=\u003cTOKEN\u003e\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Create a signed URL for an asset with transformations\n   * ```js\n   * const { data } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrl('folder/avatar1.png', 60, {\n   *     transform: {\n   *       width: 100,\n   *       height: 100,\n   *     }\n   *   })\n   * ```\n   *\n   * @example Create a signed URL which triggers the download of the asset\n   * ```js\n   * const { data } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrl('folder/avatar1.png', 60, {\n   *     download: true,\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createSignedUrl(\n    path: string,\n    expiresIn: number,\n    options?: {\n      download?: string | boolean\n      transform?: TransformOptions\n      cacheNonce?: string\n    }\n  ): Promise\u003c\n    | {\n        data: { signedUrl: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      let _path = this._getFinalPath(path)\n\n      const hasTransform =\n        typeof options?.transform === 'object' \u0026\u0026\n        options.transform !== null \u0026\u0026\n        Object.keys(options.transform).length \u003e 0\n\n      let data = await post(\n        this.fetch,\n        `${this.url}/object/sign/${_path}`,\n        { expiresIn, ...(hasTransform ? { transform: options!.transform } : {}) },\n        { headers: this.headers }\n      )\n\n      const query = new URLSearchParams()\n      if (options?.download)\n        query.set('download', options.download === true ? '' : options.download)\n      if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n      const queryString = query.toString()\n\n      // `data.signedURL` contains a `token` query parameter, so append extra params with `\u0026`\n      // only when we actually have something to add.\n      const signedUrl = encodeURI(\n        `${this.url}${data.signedURL}${queryString ? `\u0026${queryString}` : ''}`\n      )\n\n      return { signedUrl }\n    })\n  }\n\n  /**\n   * Creates multiple signed URLs. Use a signed URL to share a file for a fixed amount of time.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param paths The file paths to be downloaded, including the current file names. For example `['folder/image.png', 'folder2/image2.png']`.\n   * @param expiresIn The number of seconds until the signed URLs expire. For example, `60` for URLs which are valid for one minute.\n   * @param options.download triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @returns Promise with response containing array of objects with signedUrl, path, and error or error\n   *\n   * @example Create Signed URLs\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .createSignedUrls(['folder/avatar1.png', 'folder/avatar2.png'], 60)\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"error\": null,\n   *       \"path\": \"folder/avatar1.png\",\n   *       \"signedURL\": \"/object/sign/avatars/folder/avatar1.png?token=\u003cTOKEN\u003e\",\n   *       \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=\u003cTOKEN\u003e\"\n   *     },\n   *     {\n   *       \"error\": null,\n   *       \"path\": \"folder/avatar2.png\",\n   *       \"signedURL\": \"/object/sign/avatars/folder/avatar2.png?token=\u003cTOKEN\u003e\",\n   *       \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar2.png?token=\u003cTOKEN\u003e\"\n   *     }\n   *   ],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createSignedUrls(\n    paths: string[],\n    expiresIn: number,\n    options?: { download?: string | boolean; cacheNonce?: string }\n  ): Promise\u003c\n    | {\n        data: { error: string | null; path: string | null; signedUrl: string | null }[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      const data = await post(\n        this.fetch,\n        `${this.url}/object/sign/${this.bucketId}`,\n        { expiresIn, paths },\n        { headers: this.headers }\n      )\n\n      const query = new URLSearchParams()\n\n      if (options?.download)\n        query.set('download', options.download === true ? '' : options.download)\n      if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n\n      const queryString = query.toString()\n\n      return data.map((datum: { signedURL: string }) =\u003e ({\n        ...datum,\n        signedUrl: datum.signedURL\n          ? encodeURI(`${this.url}${datum.signedURL}${queryString ? `\u0026${queryString}` : ''}`)\n          : null,\n      }))\n    })\n  }\n\n  /**\n   * Downloads a file from a private bucket. For public buckets, make a request to the URL returned from `getPublicUrl` instead.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The full path and file name of the file to be downloaded. For example `folder/image.png`.\n   * @param options.transform Transform the asset before serving it to the client.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @param parameters Additional fetch parameters like signal for cancellation. Supports standard fetch options including cache control.\n   * @returns BlobDownloadBuilder instance for downloading the file\n   *\n   * @example Download file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": \u003cBLOB\u003e,\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Download file with transformations\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png', {\n   *     transform: {\n   *       width: 100,\n   *       height: 100,\n   *       quality: 80\n   *     }\n   *   })\n   * ```\n   *\n   * @example Download with cache control (useful in Edge Functions)\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png', {}, { cache: 'no-store' })\n   * ```\n   *\n   * @example Download with abort signal\n   * ```js\n   * const controller = new AbortController()\n   * setTimeout(() =\u003e controller.abort(), 5000)\n   *\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .download('folder/avatar1.png', {}, { signal: controller.signal })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  download\u003cOptions extends { transform?: TransformOptions; cacheNonce?: string }\u003e(\n    path: string,\n    options?: Options,\n    parameters?: FetchParameters\n  ): BlobDownloadBuilder {\n    const wantsTransformation =\n      typeof options?.transform === 'object' \u0026\u0026\n      options.transform !== null \u0026\u0026\n      Object.keys(options.transform).length \u003e 0\n    const renderPath = wantsTransformation ? 'render/image/authenticated' : 'object'\n\n    const query = new URLSearchParams()\n    if (options?.transform) this.applyTransformOptsToQuery(query, options.transform)\n    if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n    const queryString = query.toString()\n\n    const _path = this._getFinalPath(path)\n    const downloadFn = () =\u003e\n      get(\n        this.fetch,\n        `${this.url}/${renderPath}/${_path}${queryString ? `?${queryString}` : ''}`,\n        {\n          headers: this.headers,\n          noResolveJson: true,\n        },\n        parameters\n      )\n    return new BlobDownloadBuilder(downloadFn, this.shouldThrowOnError)\n  }\n\n  /**\n   * Retrieves the details of an existing file.\n   *\n   * Returns detailed file metadata including size, content type, and timestamps.\n   * Note: The API returns `last_modified` field, not `updated_at`.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. For example `folder/image.png`.\n   * @returns Promise with response containing file metadata or error\n   *\n   * @example Get file info\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .info('folder/avatar1.png')\n   *\n   * if (data) {\n   *   console.log('Last modified:', data.lastModified)\n   *   console.log('Size:', data.size)\n   * }\n   * ```\n   */\n  async info(path: string): Promise\u003c\n    | {\n        data: Camelize\u003cFileObjectV2\u003e\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    const _path = this._getFinalPath(path)\n\n    return this.handleOperation(async () =\u003e {\n      const data = await get(this.fetch, `${this.url}/object/info/${_path}`, {\n        headers: this.headers,\n      })\n\n      return recursiveToCamel(data) as Camelize\u003cFileObjectV2\u003e\n    })\n  }\n\n  /**\n   * Checks the existence of a file.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The file path, including the file name. For example `folder/image.png`.\n   * @returns Promise with response containing boolean indicating file existence or error\n   *\n   * @example Check file existence\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .exists('folder/avatar1.png')\n   * ```\n   */\n  async exists(path: string): Promise\u003c\n    | {\n        data: boolean\n        error: null\n      }\n    | {\n        data: boolean\n        error: StorageError\n      }\n  \u003e {\n    const _path = this._getFinalPath(path)\n\n    try {\n      await head(this.fetch, `${this.url}/object/${_path}`, {\n        headers: this.headers,\n      })\n\n      return { data: true, error: null }\n    } catch (error) {\n      if (this.shouldThrowOnError) {\n        throw error\n      }\n      if (isStorageError(error)) {\n        // HEAD requests produce StorageApiError (via handleError) or StorageUnknownError (legacy)\n        const status =\n          error instanceof StorageApiError\n            ? error.status\n            : error instanceof StorageUnknownError\n              ? (error.originalError as { status: number })?.status\n              : undefined\n\n        if (status !== undefined \u0026\u0026 [400, 404].includes(status)) {\n          return { data: false, error }\n        }\n      }\n\n      throw error\n    }\n  }\n\n  /**\n   * A simple convenience function to get the URL for an asset in a public bucket. If you do not want to use this function, you can construct the public URL by concatenating the bucket URL with the path to the asset.\n   * This function does not verify if the bucket is public. If a public URL is created for a bucket which is not public, you will not be able to download the asset.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The path and name of the file to generate the public URL for. For example `folder/image.png`.\n   * @param options.download Triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n   * @param options.transform Transform the asset before serving it to the client.\n   * @param options.cacheNonce Append a cache nonce parameter to the URL to invalidate the cache.\n   * @returns Object with public URL\n   *\n   * @example Returns the URL for an asset in a public bucket\n   * ```js\n   * const { data } = supabase\n   *   .storage\n   *   .from('public-bucket')\n   *   .getPublicUrl('folder/avatar1.png')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"publicUrl\": \"https://example.supabase.co/storage/v1/object/public/public-bucket/folder/avatar1.png\"\n   *   }\n   * }\n   * ```\n   *\n   * @example Returns the URL for an asset in a public bucket with transformations\n   * ```js\n   * const { data } = supabase\n   *   .storage\n   *   .from('public-bucket')\n   *   .getPublicUrl('folder/avatar1.png', {\n   *     transform: {\n   *       width: 100,\n   *       height: 100,\n   *     }\n   *   })\n   * ```\n   *\n   * @example Returns the URL which triggers the download of an asset in a public bucket\n   * ```js\n   * const { data } = supabase\n   *   .storage\n   *   .from('public-bucket')\n   *   .getPublicUrl('folder/avatar1.png', {\n   *     download: true,\n   *   })\n   * ```\n   *\n   * @remarks\n   * - The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [supabase.com/dashboard](https://supabase.com/dashboard), clicking the overflow menu on a bucket and choosing \"Make public\"\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  getPublicUrl(\n    path: string,\n    options?: {\n      download?: string | boolean\n      transform?: TransformOptions\n      cacheNonce?: string\n    }\n  ): { data: { publicUrl: string } } {\n    const _path = this._getFinalPath(path)\n\n    const query = new URLSearchParams()\n    if (options?.download) query.set('download', options.download === true ? '' : options.download)\n    if (options?.transform) this.applyTransformOptsToQuery(query, options.transform)\n    if (options?.cacheNonce != null) query.set('cacheNonce', String(options.cacheNonce))\n    const queryString = query.toString()\n\n    const wantsTransformation =\n      typeof options?.transform === 'object' \u0026\u0026\n      options.transform !== null \u0026\u0026\n      Object.keys(options.transform).length \u003e 0\n    const renderPath = wantsTransformation ? 'render/image' : 'object'\n\n    return {\n      data: {\n        publicUrl:\n          encodeURI(`${this.url}/${renderPath}/public/${_path}`) +\n          (queryString ? `?${queryString}` : ''),\n      },\n    }\n  }\n\n  /**\n   * Deletes files within the same bucket\n   *\n   * Returns an array of FileObject entries for the deleted files. Note that deprecated\n   * fields like `bucket_id` may or may not be present in the response - do not rely on them.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param paths An array of files to delete, including the path and file name. For example [`'folder/image.png'`].\n   * @returns Promise with response containing array of deleted file objects or error\n   *\n   * @example Delete file\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .remove(['folder/avatar1.png'])\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `delete` and `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async remove(paths: string[]): Promise\u003c\n    | {\n        data: FileObject[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await remove(\n        this.fetch,\n        `${this.url}/object/${this.bucketId}`,\n        { prefixes: paths },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * Get file metadata\n   * @param id the file id to retrieve metadata\n   */\n  // async getMetadata(\n  //   id: string\n  // ): Promise\u003c\n  //   | {\n  //       data: Metadata\n  //       error: null\n  //     }\n  //   | {\n  //       data: null\n  //       error: StorageError\n  //     }\n  // \u003e {\n  //   try {\n  //     const data = await get(this.fetch, `${this.url}/metadata/${id}`, { headers: this.headers })\n  //     return { data, error: null }\n  //   } catch (error) {\n  //     if (isStorageError(error)) {\n  //       return { data: null, error }\n  //     }\n\n  //     throw error\n  //   }\n  // }\n\n  /**\n   * Update file metadata\n   * @param id the file id to update metadata\n   * @param meta the new file metadata\n   */\n  // async updateMetadata(\n  //   id: string,\n  //   meta: Metadata\n  // ): Promise\u003c\n  //   | {\n  //       data: Metadata\n  //       error: null\n  //     }\n  //   | {\n  //       data: null\n  //       error: StorageError\n  //     }\n  // \u003e {\n  //   try {\n  //     const data = await post(\n  //       this.fetch,\n  //       `${this.url}/metadata/${id}`,\n  //       { ...meta },\n  //       { headers: this.headers }\n  //     )\n  //     return { data, error: null }\n  //   } catch (error) {\n  //     if (isStorageError(error)) {\n  //       return { data: null, error }\n  //     }\n\n  //     throw error\n  //   }\n  // }\n\n  /**\n   * Lists all the files and folders within a path of the bucket.\n   *\n   * **Important:** For folder entries, fields like `id`, `updated_at`, `created_at`,\n   * `last_accessed_at`, and `metadata` will be `null`. Only files have these fields populated.\n   * Additionally, deprecated fields like `bucket_id`, `owner`, and `buckets` are NOT returned\n   * by this method.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param path The folder path.\n   * @param options Search options including limit (defaults to 100), offset, sortBy, and search\n   * @param parameters Optional fetch parameters including signal for cancellation\n   * @returns Promise with response containing array of files/folders or error\n   *\n   * @example List files in a bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .list('folder', {\n   *     limit: 100,\n   *     offset: 0,\n   *     sortBy: { column: 'name', order: 'asc' },\n   *   })\n   *\n   * // Handle files vs folders\n   * data?.forEach(item =\u003e {\n   *   if (item.id !== null) {\n   *     // It's a file\n   *     console.log('File:', item.name, 'Size:', item.metadata?.size)\n   *   } else {\n   *     // It's a folder\n   *     console.log('Folder:', item.name)\n   *   }\n   * })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"avatar1.png\",\n   *       \"id\": \"e668cf7f-821b-4a2f-9dce-7dfa5dd1cfd2\",\n   *       \"updated_at\": \"2024-05-22T23:06:05.580Z\",\n   *       \"created_at\": \"2024-05-22T23:04:34.443Z\",\n   *       \"last_accessed_at\": \"2024-05-22T23:04:34.443Z\",\n   *       \"metadata\": {\n   *         \"eTag\": \"\\\"c5e8c553235d9af30ef4f6e280790b92\\\"\",\n   *         \"size\": 32175,\n   *         \"mimetype\": \"image/png\",\n   *         \"cacheControl\": \"max-age=3600\",\n   *         \"lastModified\": \"2024-05-22T23:06:05.574Z\",\n   *         \"contentLength\": 32175,\n   *         \"httpStatusCode\": 200\n   *       }\n   *     }\n   *   ],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @example Search files in a bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .list('folder', {\n   *     limit: 100,\n   *     offset: 0,\n   *     sortBy: { column: 'name', order: 'asc' },\n   *     search: 'jon'\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: none\n   *   - `objects` table permissions: `select`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async list(\n    path?: string,\n    options?: SearchOptions,\n    parameters?: FetchParameters\n  ): Promise\u003c\n    | {\n        data: FileObject[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      const body = { ...DEFAULT_SEARCH_OPTIONS, ...options, prefix: path || '' }\n      return await post(\n        this.fetch,\n        `${this.url}/object/list/${this.bucketId}`,\n        body,\n        { headers: this.headers },\n        parameters\n      )\n    })\n  }\n\n  /**\n   * Lists all the files and folders within a bucket using the V2 API with pagination support.\n   *\n   * **Important:** Folder entries in the `folders` array only contain `name` and optionally `key` —\n   * they have no `id`, timestamps, or `metadata` fields. Full file metadata is only available\n   * on entries in the `objects` array.\n   *\n   * @experimental this method signature might change in the future\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param options Search options including prefix, cursor for pagination, limit, with_delimiter\n   * @param parameters Optional fetch parameters including signal for cancellation\n   * @returns Promise with response containing folders/objects arrays with pagination info or error\n   *\n   * @example List files with pagination\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .from('avatars')\n   *   .listV2({\n   *     prefix: 'folder/',\n   *     limit: 100,\n   *   })\n   *\n   * // Handle pagination\n   * if (data?.hasNext) {\n   *   const nextPage = await supabase\n   *     .storage\n   *     .from('avatars')\n   *     .listV2({\n   *       prefix: 'folder/',\n   *       cursor: data.nextCursor,\n   *     })\n   * }\n   *\n   * // Handle files vs folders\n   * data?.objects.forEach(file =\u003e {\n   *   if (file.id !== null) {\n   *     console.log('File:', file.name, 'Size:', file.metadata?.size)\n   *   }\n   * })\n   * data?.folders.forEach(folder =\u003e {\n   *   console.log('Folder:', folder.name)\n   * })\n   * ```\n   */\n  async listV2(\n    options?: SearchV2Options,\n    parameters?: FetchParameters\n  ): Promise\u003c\n    | {\n        data: SearchV2Result\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      const body = { ...options }\n      return await post(\n        this.fetch,\n        `${this.url}/object/list-v2/${this.bucketId}`,\n        body,\n        { headers: this.headers },\n        parameters\n      )\n    })\n  }\n\n  protected encodeMetadata(metadata: Record\u003cstring, any\u003e) {\n    return JSON.stringify(metadata)\n  }\n\n  toBase64(data: string) {\n    if (typeof Buffer !== 'undefined') {\n      return Buffer.from(data).toString('base64')\n    }\n    return btoa(data)\n  }\n\n  private _getFinalPath(path: string) {\n    return `${this.bucketId}/${path.replace(/^\\/+/, '')}`\n  }\n\n  private _removeEmptyFolders(path: string) {\n    return path.replace(/^\\/|\\/$/g, '').replace(/\\/+/g, '/')\n  }\n\n  /** Modifies the `query`, appending values the from `transform` */\n  private applyTransformOptsToQuery(\n    query: URLSearchParams,\n    transform: TransformOptions\n  ): URLSearchParams {\n    if (transform.width) query.set('width', transform.width.toString())\n    if (transform.height) query.set('height', transform.height.toString())\n    if (transform.resize) query.set('resize', transform.resize)\n    if (transform.format) query.set('format', transform.format)\n    if (transform.quality) query.set('quality', transform.quality.toString())\n\n    return query\n  }\n}\n","// Generated automatically during releases by scripts/update-version-files.ts\n// This file provides runtime access to the package version for:\n// - HTTP request headers (e.g., X-Client-Info header for API requests)\n// - Debugging and support (identifying which version is running)\n// - Telemetry and logging (version reporting in errors/analytics)\n// - Ensuring build artifacts match the published package version\nexport const version = '2.105.4'\n","import { version } from './version'\nexport const DEFAULT_HEADERS = {\n  'X-Client-Info': `storage-js/${version}`,\n}\n","import { DEFAULT_HEADERS } from '../lib/constants'\nimport { StorageError } from '../lib/common/errors'\nimport { Fetch, get, post, put, remove } from '../lib/common/fetch'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport { Bucket, BucketType, ListBucketOptions } from '../lib/types'\nimport { StorageClientOptions } from '../StorageClient'\n\nexport default class StorageBucketApi extends BaseApiClient\u003cStorageError\u003e {\n  constructor(\n    url: string,\n    headers: { [key: string]: string } = {},\n    fetch?: Fetch,\n    opts?: StorageClientOptions\n  ) {\n    const baseUrl = new URL(url)\n\n    // if legacy uri is used, replace with new storage host (disables request buffering to allow \u003e 50GB uploads)\n    // \"project-ref.supabase.co\" becomes \"project-ref.storage.supabase.co\"\n    if (opts?.useNewHostname) {\n      const isSupabaseHost = /supabase\\.(co|in|red)$/.test(baseUrl.hostname)\n      if (isSupabaseHost \u0026\u0026 !baseUrl.hostname.includes('storage.supabase.')) {\n        baseUrl.hostname = baseUrl.hostname.replace('supabase.', 'storage.supabase.')\n      }\n    }\n\n    const finalUrl = baseUrl.href.replace(/\\/$/, '')\n    const finalHeaders = { ...DEFAULT_HEADERS, ...headers }\n\n    super(finalUrl, finalHeaders, fetch, 'storage')\n  }\n\n  /**\n   * Retrieves the details of all Storage buckets within an existing project.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param options Query parameters for listing buckets\n   * @param options.limit Maximum number of buckets to return\n   * @param options.offset Number of buckets to skip\n   * @param options.sortColumn Column to sort by ('id', 'name', 'created_at', 'updated_at')\n   * @param options.sortOrder Sort order ('asc' or 'desc')\n   * @param options.search Search term to filter bucket names\n   * @returns Promise with response containing array of buckets or error\n   *\n   * @example List buckets\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .listBuckets()\n   * ```\n   *\n   * @example List buckets with options\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .listBuckets({\n   *     limit: 10,\n   *     offset: 0,\n   *     sortColumn: 'created_at',\n   *     sortOrder: 'desc',\n   *     search: 'prod'\n   *   })\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: `select`\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async listBuckets(options?: ListBucketOptions): Promise\u003c\n    | {\n        data: Bucket[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      const queryString = this.listBucketOptionsToQueryString(options)\n      return await get(this.fetch, `${this.url}/bucket${queryString}`, {\n        headers: this.headers,\n      })\n    })\n  }\n\n  /**\n   * Retrieves the details of an existing Storage bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param id The unique identifier of the bucket you would like to retrieve.\n   * @returns Promise with response containing bucket details or error\n   *\n   * @example Get bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .getBucket('avatars')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"id\": \"avatars\",\n   *     \"name\": \"avatars\",\n   *     \"owner\": \"\",\n   *     \"public\": false,\n   *     \"file_size_limit\": 1024,\n   *     \"allowed_mime_types\": [\n   *       \"image/png\"\n   *     ],\n   *     \"created_at\": \"2024-05-22T22:26:05.100Z\",\n   *     \"updated_at\": \"2024-05-22T22:26:05.100Z\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: `select`\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async getBucket(id: string): Promise\u003c\n    | {\n        data: Bucket\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await get(this.fetch, `${this.url}/bucket/${id}`, { headers: this.headers })\n    })\n  }\n\n  /**\n   * Creates a new Storage bucket\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param id A unique identifier for the bucket you are creating.\n   * @param options.public The visibility of the bucket. Public buckets don't require an authorization token to download objects, but still require a valid token for all other operations. By default, buckets are private.\n   * @param options.fileSizeLimit specifies the max file size in bytes that can be uploaded to this bucket.\n   * The global file size limit takes precedence over this value.\n   * The default value is null, which doesn't set a per bucket file size limit.\n   * @param options.allowedMimeTypes specifies the allowed mime types that this bucket can accept during upload.\n   * The default value is null, which allows files with all mime types to be uploaded.\n   * Each mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n   * @param options.type (private-beta) specifies the bucket type. see `BucketType` for more details.\n   *   - default bucket type is `STANDARD`\n   * @returns Promise with response containing newly created bucket name or error\n   *\n   * @example Create bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .createBucket('avatars', {\n   *     public: false,\n   *     allowedMimeTypes: ['image/png'],\n   *     fileSizeLimit: 1024\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"name\": \"avatars\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: `insert`\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async createBucket(\n    id: string,\n    options: {\n      public: boolean\n      fileSizeLimit?: number | string | null\n      allowedMimeTypes?: string[] | null\n      type?: BucketType\n    } = {\n      public: false,\n    }\n  ): Promise\u003c\n    | {\n        data: Pick\u003cBucket, 'name'\u003e\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await post(\n        this.fetch,\n        `${this.url}/bucket`,\n        {\n          id,\n          name: id,\n          type: options.type,\n          public: options.public,\n          file_size_limit: options.fileSizeLimit,\n          allowed_mime_types: options.allowedMimeTypes,\n        },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * Updates a Storage bucket\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param id A unique identifier for the bucket you are updating.\n   * @param options.public The visibility of the bucket. Public buckets don't require an authorization token to download objects, but still require a valid token for all other operations.\n   * @param options.fileSizeLimit specifies the max file size in bytes that can be uploaded to this bucket.\n   * The global file size limit takes precedence over this value.\n   * The default value is null, which doesn't set a per bucket file size limit.\n   * @param options.allowedMimeTypes specifies the allowed mime types that this bucket can accept during upload.\n   * The default value is null, which allows files with all mime types to be uploaded.\n   * Each mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n   * @returns Promise with response containing success message or error\n   *\n   * @example Update bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .updateBucket('avatars', {\n   *     public: false,\n   *     allowedMimeTypes: ['image/png'],\n   *     fileSizeLimit: 1024\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"message\": \"Successfully updated\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: `select` and `update`\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async updateBucket(\n    id: string,\n    options: {\n      public: boolean\n      fileSizeLimit?: number | string | null\n      allowedMimeTypes?: string[] | null\n    }\n  ): Promise\u003c\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await put(\n        this.fetch,\n        `${this.url}/bucket/${id}`,\n        {\n          id,\n          name: id,\n          public: options.public,\n          file_size_limit: options.fileSizeLimit,\n          allowed_mime_types: options.allowedMimeTypes,\n        },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * Removes all objects inside a single bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param id The unique identifier of the bucket you would like to empty.\n   * @returns Promise with success message or error\n   *\n   * @example Empty bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .emptyBucket('avatars')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"message\": \"Successfully emptied\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: `select`\n   *   - `objects` table permissions: `select` and `delete`\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async emptyBucket(id: string): Promise\u003c\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await post(this.fetch, `${this.url}/bucket/${id}/empty`, {}, { headers: this.headers })\n    })\n  }\n\n  /**\n   * Deletes an existing bucket. A bucket can't be deleted with existing objects inside it.\n   * You must first `empty()` the bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   * @param id The unique identifier of the bucket you would like to delete.\n   * @returns Promise with success message or error\n   *\n   * @example Delete bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .deleteBucket('avatars')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"message\": \"Successfully deleted\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - RLS policy permissions required:\n   *   - `buckets` table permissions: `select` and `delete`\n   *   - `objects` table permissions: none\n   * - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works\n   */\n  async deleteBucket(id: string): Promise\u003c\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await remove(this.fetch, `${this.url}/bucket/${id}`, {}, { headers: this.headers })\n    })\n  }\n\n  private listBucketOptionsToQueryString(options?: ListBucketOptions): string {\n    const params: Record\u003cstring, string\u003e = {}\n    if (options) {\n      if ('limit' in options) {\n        params.limit = String(options.limit)\n      }\n      if ('offset' in options) {\n        params.offset = String(options.offset)\n      }\n      if (options.search) {\n        params.search = options.search\n      }\n      if (options.sortColumn) {\n        params.sortColumn = options.sortColumn\n      }\n      if (options.sortOrder) {\n        params.sortOrder = options.sortOrder\n      }\n    }\n    return Object.keys(params).length \u003e 0 ? '?' + new URLSearchParams(params).toString() : ''\n  }\n}\n","import { IcebergRestCatalog, IcebergError } from 'iceberg-js'\nimport { DEFAULT_HEADERS } from '../lib/constants'\nimport { StorageError } from '../lib/common/errors'\nimport { Fetch, get, post, remove } from '../lib/common/fetch'\nimport { isValidBucketName } from '../lib/common/helpers'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport { AnalyticBucket } from '../lib/types'\n\ntype WrapAsyncMethod\u003cT\u003e = T extends (...args: infer A) =\u003e Promise\u003cinfer R\u003e\n  ? (...args: A) =\u003e Promise\u003c{ data: R; error: null } | { data: null; error: IcebergError }\u003e\n  : T\n\nexport type WrappedIcebergRestCatalog = {\n  [K in keyof IcebergRestCatalog]: WrapAsyncMethod\u003cIcebergRestCatalog[K]\u003e\n}\n\n/**\n * Client class for managing Analytics Buckets using Iceberg tables\n * Provides methods for creating, listing, and deleting analytics buckets\n */\nexport default class StorageAnalyticsClient extends BaseApiClient\u003cStorageError\u003e {\n  /**\n   * @alpha\n   *\n   * Creates a new StorageAnalyticsClient instance\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Analytics Buckets\n   * @param url - The base URL for the storage API\n   * @param headers - HTTP headers to include in requests\n   * @param fetch - Optional custom fetch implementation\n   *\n   * @example Using supabase-js (recommended)\n   * ```typescript\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const { data, error } = await supabase.storage.analytics.listBuckets()\n   * ```\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```typescript\n   * import { StorageAnalyticsClient } from '@supabase/storage-js'\n   *\n   * const client = new StorageAnalyticsClient(url, headers)\n   * ```\n   */\n  constructor(url: string, headers: { [key: string]: string } = {}, fetch?: Fetch) {\n    const finalUrl = url.replace(/\\/$/, '')\n    const finalHeaders = { ...DEFAULT_HEADERS, ...headers }\n    super(finalUrl, finalHeaders, fetch, 'storage')\n  }\n\n  /**\n   * @alpha\n   *\n   * Creates a new analytics bucket using Iceberg tables\n   * Analytics buckets are optimized for analytical queries and data processing\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Analytics Buckets\n   * @param name A unique name for the bucket you are creating\n   * @returns Promise with response containing newly created analytics bucket or error\n   *\n   * @example Create analytics bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .analytics\n   *   .createBucket('analytics-data')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"name\": \"analytics-data\",\n   *     \"type\": \"ANALYTICS\",\n   *     \"format\": \"iceberg\",\n   *     \"created_at\": \"2024-05-22T22:26:05.100Z\",\n   *     \"updated_at\": \"2024-05-22T22:26:05.100Z\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - Creates a new analytics bucket using Iceberg tables\n   * - Analytics buckets are optimized for analytical queries and data processing\n   */\n  async createBucket(name: string): Promise\u003c\n    | {\n        data: AnalyticBucket\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await post(this.fetch, `${this.url}/bucket`, { name }, { headers: this.headers })\n    })\n  }\n\n  /**\n   * @alpha\n   *\n   * Retrieves the details of all Analytics Storage buckets within an existing project\n   * Only returns buckets of type 'ANALYTICS'\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Analytics Buckets\n   * @param options Query parameters for listing buckets\n   * @param options.limit Maximum number of buckets to return\n   * @param options.offset Number of buckets to skip\n   * @param options.sortColumn Column to sort by ('name', 'created_at', 'updated_at')\n   * @param options.sortOrder Sort order ('asc' or 'desc')\n   * @param options.search Search term to filter bucket names\n   * @returns Promise with response containing array of analytics buckets or error\n   *\n   * @example List analytics buckets\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .analytics\n   *   .listBuckets({\n   *     limit: 10,\n   *     offset: 0,\n   *     sortColumn: 'created_at',\n   *     sortOrder: 'desc'\n   *   })\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": [\n   *     {\n   *       \"name\": \"analytics-data\",\n   *       \"type\": \"ANALYTICS\",\n   *       \"format\": \"iceberg\",\n   *       \"created_at\": \"2024-05-22T22:26:05.100Z\",\n   *       \"updated_at\": \"2024-05-22T22:26:05.100Z\"\n   *     }\n   *   ],\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - Retrieves the details of all Analytics Storage buckets within an existing project\n   * - Only returns buckets of type 'ANALYTICS'\n   */\n  async listBuckets(options?: {\n    limit?: number\n    offset?: number\n    sortColumn?: 'name' | 'created_at' | 'updated_at'\n    sortOrder?: 'asc' | 'desc'\n    search?: string\n  }): Promise\u003c\n    | {\n        data: AnalyticBucket[]\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      // Build query string from options\n      const queryParams = new URLSearchParams()\n      if (options?.limit !== undefined) queryParams.set('limit', options.limit.toString())\n      if (options?.offset !== undefined) queryParams.set('offset', options.offset.toString())\n      if (options?.sortColumn) queryParams.set('sortColumn', options.sortColumn)\n      if (options?.sortOrder) queryParams.set('sortOrder', options.sortOrder)\n      if (options?.search) queryParams.set('search', options.search)\n\n      const queryString = queryParams.toString()\n      const url = queryString ? `${this.url}/bucket?${queryString}` : `${this.url}/bucket`\n\n      return await get(this.fetch, url, { headers: this.headers })\n    })\n  }\n\n  /**\n   * @alpha\n   *\n   * Deletes an existing analytics bucket\n   * A bucket can't be deleted with existing objects inside it\n   * You must first empty the bucket before deletion\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Analytics Buckets\n   * @param bucketName The unique identifier of the bucket you would like to delete\n   * @returns Promise with response containing success message or error\n   *\n   * @example Delete analytics bucket\n   * ```js\n   * const { data, error } = await supabase\n   *   .storage\n   *   .analytics\n   *   .deleteBucket('analytics-data')\n   * ```\n   *\n   * Response:\n   * ```json\n   * {\n   *   \"data\": {\n   *     \"message\": \"Successfully deleted\"\n   *   },\n   *   \"error\": null\n   * }\n   * ```\n   *\n   * @remarks\n   * - Deletes an analytics bucket\n   */\n  async deleteBucket(bucketName: string): Promise\u003c\n    | {\n        data: { message: string }\n        error: null\n      }\n    | {\n        data: null\n        error: StorageError\n      }\n  \u003e {\n    return this.handleOperation(async () =\u003e {\n      return await remove(\n        this.fetch,\n        `${this.url}/bucket/${bucketName}`,\n        {},\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /**\n   * @alpha\n   *\n   * Get an Iceberg REST Catalog client configured for a specific analytics bucket\n   * Use this to perform advanced table and namespace operations within the bucket\n   * The returned client provides full access to the Apache Iceberg REST Catalog API\n   * with the Supabase `{ data, error }` pattern for consistent error handling on all operations.\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Analytics Buckets\n   * @param bucketName - The name of the analytics bucket (warehouse) to connect to\n   * @returns The wrapped Iceberg catalog client\n   * @throws {StorageError} If the bucket name is invalid\n   *\n   * @example Get catalog and create table\n   * ```js\n   * // First, create an analytics bucket\n   * const { data: bucket, error: bucketError } = await supabase\n   *   .storage\n   *   .analytics\n   *   .createBucket('analytics-data')\n   *\n   * // Get the Iceberg catalog for that bucket\n   * const catalog = supabase.storage.analytics.from('analytics-data')\n   *\n   * // Create a namespace\n   * const { error: nsError } = await catalog.createNamespace({ namespace: ['default'] })\n   *\n   * // Create a table with schema\n   * const { data: tableMetadata, error: tableError } = await catalog.createTable(\n   *   { namespace: ['default'] },\n   *   {\n   *     name: 'events',\n   *     schema: {\n   *       type: 'struct',\n   *       fields: [\n   *         { id: 1, name: 'id', type: 'long', required: true },\n   *         { id: 2, name: 'timestamp', type: 'timestamp', required: true },\n   *         { id: 3, name: 'user_id', type: 'string', required: false }\n   *       ],\n   *       'schema-id': 0,\n   *       'identifier-field-ids': [1]\n   *     },\n   *     'partition-spec': {\n   *       'spec-id': 0,\n   *       fields: []\n   *     },\n   *     'write-order': {\n   *       'order-id': 0,\n   *       fields: []\n   *     },\n   *     properties: {\n   *       'write.format.default': 'parquet'\n   *     }\n   *   }\n   * )\n   * ```\n   *\n   * @example List tables in namespace\n   * ```js\n   * const catalog = supabase.storage.analytics.from('analytics-data')\n   *\n   * // List all tables in the default namespace\n   * const { data: tables, error: listError } = await catalog.listTables({ namespace: ['default'] })\n   * if (listError) {\n   *   if (listError.isNotFound()) {\n   *     console.log('Namespace not found')\n   *   }\n   *   return\n   * }\n   * console.log(tables) // [{ namespace: ['default'], name: 'events' }]\n   * ```\n   *\n   * @example Working with namespaces\n   * ```js\n   * const catalog = supabase.storage.analytics.from('analytics-data')\n   *\n   * // List all namespaces\n   * const { data: namespaces } = await catalog.listNamespaces()\n   *\n   * // Create namespace with properties\n   * await catalog.createNamespace(\n   *   { namespace: ['production'] },\n   *   { properties: { owner: 'data-team', env: 'prod' } }\n   * )\n   * ```\n   *\n   * @example Cleanup operations\n   * ```js\n   * const catalog = supabase.storage.analytics.from('analytics-data')\n   *\n   * // Drop table with purge option (removes all data)\n   * const { error: dropError } = await catalog.dropTable(\n   *   { namespace: ['default'], name: 'events' },\n   *   { purge: true }\n   * )\n   *\n   * if (dropError?.isNotFound()) {\n   *   console.log('Table does not exist')\n   * }\n   *\n   * // Drop namespace (must be empty)\n   * await catalog.dropNamespace({ namespace: ['default'] })\n   * ```\n   *\n   * @remarks\n   * This method provides a bridge between Supabase's bucket management and the standard\n   * Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.\n   * All authentication and configuration is handled automatically using your Supabase credentials.\n   *\n   * **Error Handling**: Invalid bucket names throw immediately. All catalog\n   * operations return `{ data, error }` where errors are `IcebergError` instances from iceberg-js.\n   * Use helper methods like `error.isNotFound()` or check `error.status` for specific error handling.\n   * Use `.throwOnError()` on the analytics client if you prefer exceptions for catalog operations.\n   *\n   * **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently\n   * deletes all table data. Without it, the table is marked as deleted but data remains.\n   *\n   * **Library Dependency**: The returned catalog wraps `IcebergRestCatalog` from iceberg-js.\n   * For complete API documentation and advanced usage, refer to the\n   * [iceberg-js documentation](https://supabase.github.io/iceberg-js/).\n   */\n  from(bucketName: string): WrappedIcebergRestCatalog {\n    // Validate bucket name using same rules as Supabase Storage API backend\n    if (!isValidBucketName(bucketName)) {\n      throw new StorageError(\n        'Invalid bucket name: File, folder, and bucket names must follow AWS object key naming guidelines ' +\n          'and should avoid the use of any other characters.'\n      )\n    }\n\n    // Construct the Iceberg REST Catalog URL\n    // The base URL is /storage/v1/iceberg\n    // Note: IcebergRestCatalog from iceberg-js automatically adds /v1/ prefix to API paths\n    // so we should NOT append /v1 here (it would cause double /v1/v1/ in the URL)\n    const catalog = new IcebergRestCatalog({\n      baseUrl: this.url,\n      catalogName: bucketName, // Maps to the warehouse parameter in Supabase's implementation\n      auth: {\n        type: 'custom',\n        getHeaders: async () =\u003e this.headers,\n      },\n      fetch: this.fetch,\n    })\n\n    const shouldThrowOnError = this.shouldThrowOnError\n\n    const wrappedCatalog = new Proxy(catalog, {\n      get(target, prop: keyof IcebergRestCatalog) {\n        const value = target[prop]\n        if (typeof value !== 'function') {\n          return value\n        }\n\n        return async (...args: unknown[]) =\u003e {\n          try {\n            const data = await (value as Function).apply(target, args)\n            return { data, error: null }\n          } catch (error) {\n            if (shouldThrowOnError) {\n              throw error\n            }\n            return { data: null, error: error as IcebergError }\n          }\n        }\n      },\n    }) as unknown as WrappedIcebergRestCatalog\n\n    return wrappedCatalog\n  }\n}\n","import { DEFAULT_HEADERS } from '../lib/constants'\nimport { StorageError } from '../lib/common/errors'\nimport { Fetch, vectorsApi } from '../lib/common/fetch'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport {\n  ApiResponse,\n  VectorIndex,\n  ListIndexesOptions,\n  ListIndexesResponse,\n  VectorDataType,\n  DistanceMetric,\n  MetadataConfiguration,\n} from '../lib/types'\n\n/**\n * @alpha\n *\n * Options for creating a vector index\n *\n * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n */\nexport interface CreateIndexOptions {\n  vectorBucketName: string\n  indexName: string\n  dataType: VectorDataType\n  dimension: number\n  distanceMetric: DistanceMetric\n  metadataConfiguration?: MetadataConfiguration\n}\n\n/**\n * @hidden\n * Base implementation for vector index operations.\n * Use {@link VectorBucketScope} via `supabase.storage.vectors.from('bucket')` instead.\n */\nexport default class VectorIndexApi extends BaseApiClient\u003cStorageError\u003e {\n  /** Creates a new VectorIndexApi instance */\n  constructor(url: string, headers: { [key: string]: string } = {}, fetch?: Fetch) {\n    const finalUrl = url.replace(/\\/$/, '')\n    const finalHeaders = { ...DEFAULT_HEADERS, 'Content-Type': 'application/json', ...headers }\n    super(finalUrl, finalHeaders, fetch, 'vectors')\n  }\n\n  /** Creates a new vector index within a bucket */\n  async createIndex(options: CreateIndexOptions): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      const data = await vectorsApi.post(this.fetch, `${this.url}/CreateIndex`, options, {\n        headers: this.headers,\n      })\n      return data || {}\n    })\n  }\n\n  /** Retrieves metadata for a specific vector index */\n  async getIndex(\n    vectorBucketName: string,\n    indexName: string\n  ): Promise\u003cApiResponse\u003c{ index: VectorIndex }\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(\n        this.fetch,\n        `${this.url}/GetIndex`,\n        { vectorBucketName, indexName },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /** Lists vector indexes within a bucket with optional filtering and pagination */\n  async listIndexes(options: ListIndexesOptions): Promise\u003cApiResponse\u003cListIndexesResponse\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(this.fetch, `${this.url}/ListIndexes`, options, {\n        headers: this.headers,\n      })\n    })\n  }\n\n  /** Deletes a vector index and all its data */\n  async deleteIndex(vectorBucketName: string, indexName: string): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      const data = await vectorsApi.post(\n        this.fetch,\n        `${this.url}/DeleteIndex`,\n        { vectorBucketName, indexName },\n        { headers: this.headers }\n      )\n      return data || {}\n    })\n  }\n}\n","import { DEFAULT_HEADERS } from '../lib/constants'\nimport { StorageError } from '../lib/common/errors'\nimport { Fetch, vectorsApi } from '../lib/common/fetch'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport {\n  ApiResponse,\n  PutVectorsOptions,\n  GetVectorsOptions,\n  GetVectorsResponse,\n  DeleteVectorsOptions,\n  ListVectorsOptions,\n  ListVectorsResponse,\n  QueryVectorsOptions,\n  QueryVectorsResponse,\n} from '../lib/types'\n\n/**\n * @hidden\n * Base implementation for vector data operations.\n * Use {@link VectorIndexScope} via `supabase.storage.vectors.from('bucket').index('idx')` instead.\n */\nexport default class VectorDataApi extends BaseApiClient\u003cStorageError\u003e {\n  /** Creates a new VectorDataApi instance */\n  constructor(url: string, headers: { [key: string]: string } = {}, fetch?: Fetch) {\n    const finalUrl = url.replace(/\\/$/, '')\n    const finalHeaders = { ...DEFAULT_HEADERS, 'Content-Type': 'application/json', ...headers }\n    super(finalUrl, finalHeaders, fetch, 'vectors')\n  }\n\n  /** Inserts or updates vectors in batch (1-500 per request) */\n  async putVectors(options: PutVectorsOptions): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    // Validate batch size\n    if (options.vectors.length \u003c 1 || options.vectors.length \u003e 500) {\n      throw new Error('Vector batch size must be between 1 and 500 items')\n    }\n\n    return this.handleOperation(async () =\u003e {\n      const data = await vectorsApi.post(this.fetch, `${this.url}/PutVectors`, options, {\n        headers: this.headers,\n      })\n      return data || {}\n    })\n  }\n\n  /** Retrieves vectors by their keys in batch */\n  async getVectors(options: GetVectorsOptions): Promise\u003cApiResponse\u003cGetVectorsResponse\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(this.fetch, `${this.url}/GetVectors`, options, {\n        headers: this.headers,\n      })\n    })\n  }\n\n  /** Lists vectors in an index with pagination */\n  async listVectors(options: ListVectorsOptions): Promise\u003cApiResponse\u003cListVectorsResponse\u003e\u003e {\n    // Validate segment configuration\n    if (options.segmentCount !== undefined) {\n      if (options.segmentCount \u003c 1 || options.segmentCount \u003e 16) {\n        throw new Error('segmentCount must be between 1 and 16')\n      }\n      if (options.segmentIndex !== undefined) {\n        if (options.segmentIndex \u003c 0 || options.segmentIndex \u003e= options.segmentCount) {\n          throw new Error(`segmentIndex must be between 0 and ${options.segmentCount - 1}`)\n        }\n      }\n    }\n\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(this.fetch, `${this.url}/ListVectors`, options, {\n        headers: this.headers,\n      })\n    })\n  }\n\n  /** Queries for similar vectors using approximate nearest neighbor search */\n  async queryVectors(options: QueryVectorsOptions): Promise\u003cApiResponse\u003cQueryVectorsResponse\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(this.fetch, `${this.url}/QueryVectors`, options, {\n        headers: this.headers,\n      })\n    })\n  }\n\n  /** Deletes vectors by their keys in batch (1-500 per request) */\n  async deleteVectors(options: DeleteVectorsOptions): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    // Validate batch size\n    if (options.keys.length \u003c 1 || options.keys.length \u003e 500) {\n      throw new Error('Keys batch size must be between 1 and 500 items')\n    }\n\n    return this.handleOperation(async () =\u003e {\n      const data = await vectorsApi.post(this.fetch, `${this.url}/DeleteVectors`, options, {\n        headers: this.headers,\n      })\n      return data || {}\n    })\n  }\n}\n","import { DEFAULT_HEADERS } from '../lib/constants'\nimport { StorageError } from '../lib/common/errors'\nimport { Fetch, vectorsApi } from '../lib/common/fetch'\nimport BaseApiClient from '../lib/common/BaseApiClient'\nimport {\n  ApiResponse,\n  VectorBucket,\n  ListVectorBucketsOptions,\n  ListVectorBucketsResponse,\n} from '../lib/types'\n\n/**\n * @hidden\n * Base implementation for vector bucket operations.\n * Use {@link StorageVectorsClient} via `supabase.storage.vectors` instead.\n */\nexport default class VectorBucketApi extends BaseApiClient\u003cStorageError\u003e {\n  /** Creates a new VectorBucketApi instance */\n  constructor(url: string, headers: { [key: string]: string } = {}, fetch?: Fetch) {\n    const finalUrl = url.replace(/\\/$/, '')\n    const finalHeaders = { ...DEFAULT_HEADERS, 'Content-Type': 'application/json', ...headers }\n    super(finalUrl, finalHeaders, fetch, 'vectors')\n  }\n\n  /** Creates a new vector bucket */\n  async createBucket(vectorBucketName: string): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      const data = await vectorsApi.post(\n        this.fetch,\n        `${this.url}/CreateVectorBucket`,\n        { vectorBucketName },\n        { headers: this.headers }\n      )\n      return data || {}\n    })\n  }\n\n  /** Retrieves metadata for a specific vector bucket */\n  async getBucket(vectorBucketName: string): Promise\u003cApiResponse\u003c{ vectorBucket: VectorBucket }\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(\n        this.fetch,\n        `${this.url}/GetVectorBucket`,\n        { vectorBucketName },\n        { headers: this.headers }\n      )\n    })\n  }\n\n  /** Lists vector buckets with optional filtering and pagination */\n  async listBuckets(\n    options: ListVectorBucketsOptions = {}\n  ): Promise\u003cApiResponse\u003cListVectorBucketsResponse\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      return await vectorsApi.post(this.fetch, `${this.url}/ListVectorBuckets`, options, {\n        headers: this.headers,\n      })\n    })\n  }\n\n  /** Deletes a vector bucket (must be empty first) */\n  async deleteBucket(vectorBucketName: string): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    return this.handleOperation(async () =\u003e {\n      const data = await vectorsApi.post(\n        this.fetch,\n        `${this.url}/DeleteVectorBucket`,\n        { vectorBucketName },\n        { headers: this.headers }\n      )\n      return data || {}\n    })\n  }\n}\n","import VectorIndexApi, { CreateIndexOptions } from './VectorIndexApi'\nimport VectorDataApi from './VectorDataApi'\nimport { Fetch } from '../lib/common/fetch'\nimport VectorBucketApi from './VectorBucketApi'\nimport {\n  ApiResponse,\n  DeleteVectorsOptions,\n  GetVectorsOptions,\n  ListIndexesOptions,\n  ListVectorsOptions,\n  ListVectorBucketsOptions,\n  ListVectorBucketsResponse,\n  PutVectorsOptions,\n  QueryVectorsOptions,\n  VectorBucket,\n} from '../lib/types'\n\n/**\n *\n * @alpha\n *\n * Configuration options for the Storage Vectors client\n *\n * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n */\nexport interface StorageVectorsClientOptions {\n  /**\n   * Custom headers to include in all requests\n   */\n  headers?: { [key: string]: string }\n  /**\n   * Custom fetch implementation (optional)\n   * Useful for testing or custom request handling\n   */\n  fetch?: Fetch\n}\n\n/**\n *\n * @alpha\n *\n * Main client for interacting with S3 Vectors API\n * Provides access to bucket, index, and vector data operations\n *\n * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n *\n * **Usage Patterns:**\n *\n * ```typescript\n * const { data, error } = await supabase\n *  .storage\n *  .vectors\n *  .createBucket('embeddings-prod')\n *\n * // Access index operations via buckets\n * const bucket = supabase.storage.vectors.from('embeddings-prod')\n * await bucket.createIndex({\n *   indexName: 'documents',\n *   dataType: 'float32',\n *   dimension: 1536,\n *   distanceMetric: 'cosine'\n * })\n *\n * // Access vector operations via index\n * const index = bucket.index('documents')\n * await index.putVectors({\n *   vectors: [\n *     { key: 'doc-1', data: { float32: [...] }, metadata: { title: 'Intro' } }\n *   ]\n * })\n *\n * // Query similar vectors\n * const { data } = await index.queryVectors({\n *   queryVector: { float32: [...] },\n *   topK: 5,\n *   returnDistance: true\n * })\n * ```\n */\nexport class StorageVectorsClient extends VectorBucketApi {\n  /**\n   * @alpha\n   *\n   * Creates a StorageVectorsClient that can manage buckets, indexes, and vectors.\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param url - Base URL of the Storage Vectors REST API.\n   * @param options.headers - Optional headers (for example `Authorization`) applied to every request.\n   * @param options.fetch - Optional custom `fetch` implementation for non-browser runtimes.\n   *\n   * @example Using supabase-js (recommended)\n   * ```typescript\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * ```\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```typescript\n   * import { StorageVectorsClient } from '@supabase/storage-js'\n   *\n   * const client = new StorageVectorsClient(url, options)\n   * ```\n   */\n  constructor(url: string, options: StorageVectorsClientOptions = {}) {\n    super(url, options.headers || {}, options.fetch)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Access operations for a specific vector bucket\n   * Returns a scoped client for index and vector operations within the bucket\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param vectorBucketName - Name of the vector bucket\n   * @returns Bucket-scoped client with index and vector operations\n   *\n   * @example Accessing a vector bucket\n   * ```typescript\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * ```\n   */\n  from(vectorBucketName: string): VectorBucketScope {\n    return new VectorBucketScope(this.url, this.headers, vectorBucketName, this.fetch)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Creates a new vector bucket\n   * Vector buckets are containers for vector indexes and their data\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param vectorBucketName - Unique name for the vector bucket\n   * @returns Promise with empty response on success or error\n   *\n   * @example Creating a vector bucket\n   * ```typescript\n   * const { data, error } = await supabase\n   *   .storage\n   *   .vectors\n   *   .createBucket('embeddings-prod')\n   * ```\n   */\n  async createBucket(vectorBucketName: string): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    return super.createBucket(vectorBucketName)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Retrieves metadata for a specific vector bucket\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param vectorBucketName - Name of the vector bucket\n   * @returns Promise with bucket metadata or error\n   *\n   * @example Get bucket metadata\n   * ```typescript\n   * const { data, error } = await supabase\n   *   .storage\n   *   .vectors\n   *   .getBucket('embeddings-prod')\n   *\n   * console.log('Bucket created:', data?.vectorBucket.creationTime)\n   * ```\n   */\n  async getBucket(vectorBucketName: string): Promise\u003cApiResponse\u003c{ vectorBucket: VectorBucket }\u003e\u003e {\n    return super.getBucket(vectorBucketName)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Lists all vector buckets with optional filtering and pagination\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Optional filters (prefix, maxResults, nextToken)\n   * @returns Promise with list of buckets or error\n   *\n   * @example List vector buckets\n   * ```typescript\n   * const { data, error } = await supabase\n   *   .storage\n   *   .vectors\n   *   .listBuckets({ prefix: 'embeddings-' })\n   *\n   * data?.vectorBuckets.forEach(bucket =\u003e {\n   *   console.log(bucket.vectorBucketName)\n   * })\n   * ```\n   */\n  async listBuckets(\n    options: ListVectorBucketsOptions = {}\n  ): Promise\u003cApiResponse\u003cListVectorBucketsResponse\u003e\u003e {\n    return super.listBuckets(options)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Deletes a vector bucket (bucket must be empty)\n   * All indexes must be deleted before deleting the bucket\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param vectorBucketName - Name of the vector bucket to delete\n   * @returns Promise with empty response on success or error\n   *\n   * @example Delete a vector bucket\n   * ```typescript\n   * const { data, error } = await supabase\n   *   .storage\n   *   .vectors\n   *   .deleteBucket('embeddings-old')\n   * ```\n   */\n  async deleteBucket(vectorBucketName: string): Promise\u003cApiResponse\u003cundefined\u003e\u003e {\n    return super.deleteBucket(vectorBucketName)\n  }\n}\n\n/**\n *\n * @alpha\n *\n * Scoped client for operations within a specific vector bucket\n * Provides index management and access to vector operations\n *\n * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n */\nexport class VectorBucketScope extends VectorIndexApi {\n  private vectorBucketName: string\n\n  /**\n   * @alpha\n   *\n   * Creates a helper that automatically scopes all index operations to the provided bucket.\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @example Creating a vector bucket scope\n   * ```typescript\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * ```\n   */\n  constructor(\n    url: string,\n    headers: { [key: string]: string },\n    vectorBucketName: string,\n    fetch?: Fetch\n  ) {\n    super(url, headers, fetch)\n    this.vectorBucketName = vectorBucketName\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Creates a new vector index in this bucket\n   * Convenience method that automatically includes the bucket name\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Index configuration (vectorBucketName is automatically set)\n   * @returns Promise with empty response on success or error\n   *\n   * @example Creating a vector index\n   * ```typescript\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * await bucket.createIndex({\n   *   indexName: 'documents-openai',\n   *   dataType: 'float32',\n   *   dimension: 1536,\n   *   distanceMetric: 'cosine',\n   *   metadataConfiguration: {\n   *     nonFilterableMetadataKeys: ['raw_text']\n   *   }\n   * })\n   * ```\n   */\n  override async createIndex(options: Omit\u003cCreateIndexOptions, 'vectorBucketName'\u003e) {\n    return super.createIndex({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Lists indexes in this bucket\n   * Convenience method that automatically includes the bucket name\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Listing options (vectorBucketName is automatically set)\n   * @returns Promise with response containing indexes array and pagination token or error\n   *\n   * @example List indexes\n   * ```typescript\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * const { data } = await bucket.listIndexes({ prefix: 'documents-' })\n   * ```\n   */\n  override async listIndexes(options: Omit\u003cListIndexesOptions, 'vectorBucketName'\u003e = {}) {\n    return super.listIndexes({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Retrieves metadata for a specific index in this bucket\n   * Convenience method that automatically includes the bucket name\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param indexName - Name of the index to retrieve\n   * @returns Promise with index metadata or error\n   *\n   * @example Get index metadata\n   * ```typescript\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * const { data } = await bucket.getIndex('documents-openai')\n   * console.log('Dimension:', data?.index.dimension)\n   * ```\n   */\n  override async getIndex(indexName: string) {\n    return super.getIndex(this.vectorBucketName, indexName)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Deletes an index from this bucket\n   * Convenience method that automatically includes the bucket name\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param indexName - Name of the index to delete\n   * @returns Promise with empty response on success or error\n   *\n   * @example Delete an index\n   * ```typescript\n   * const bucket = supabase.storage.vectors.from('embeddings-prod')\n   * await bucket.deleteIndex('old-index')\n   * ```\n   */\n  override async deleteIndex(indexName: string) {\n    return super.deleteIndex(this.vectorBucketName, indexName)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Access operations for a specific index within this bucket\n   * Returns a scoped client for vector data operations\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param indexName - Name of the index\n   * @returns Index-scoped client with vector data operations\n   *\n   * @example Accessing an index\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   *\n   * // Insert vectors\n   * await index.putVectors({\n   *   vectors: [\n   *     { key: 'doc-1', data: { float32: [...] }, metadata: { title: 'Intro' } }\n   *   ]\n   * })\n   *\n   * // Query similar vectors\n   * const { data } = await index.queryVectors({\n   *   queryVector: { float32: [...] },\n   *   topK: 5\n   * })\n   * ```\n   */\n  index(indexName: string): VectorIndexScope {\n    return new VectorIndexScope(\n      this.url,\n      this.headers,\n      this.vectorBucketName,\n      indexName,\n      this.fetch\n    )\n  }\n}\n\n/**\n *\n * @alpha\n *\n * Scoped client for operations within a specific vector index\n * Provides vector data operations (put, get, list, query, delete)\n *\n * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n */\nexport class VectorIndexScope extends VectorDataApi {\n  private vectorBucketName: string\n  private indexName: string\n\n  /**\n   *\n   * @alpha\n   *\n   * Creates a helper that automatically scopes all vector operations to the provided bucket/index names.\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @example Creating a vector index scope\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   * ```\n   */\n  constructor(\n    url: string,\n    headers: { [key: string]: string },\n    vectorBucketName: string,\n    indexName: string,\n    fetch?: Fetch\n  ) {\n    super(url, headers, fetch)\n    this.vectorBucketName = vectorBucketName\n    this.indexName = indexName\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Inserts or updates vectors in this index\n   * Convenience method that automatically includes bucket and index names\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Vector insertion options (bucket and index names automatically set)\n   * @returns Promise with empty response on success or error\n   *\n   * @example Insert vectors into an index\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   * await index.putVectors({\n   *   vectors: [\n   *     {\n   *       key: 'doc-1',\n   *       data: { float32: [0.1, 0.2, ...] },\n   *       metadata: { title: 'Introduction', page: 1 }\n   *     }\n   *   ]\n   * })\n   * ```\n   */\n  override async putVectors(options: Omit\u003cPutVectorsOptions, 'vectorBucketName' | 'indexName'\u003e) {\n    return super.putVectors({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n      indexName: this.indexName,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Retrieves vectors by keys from this index\n   * Convenience method that automatically includes bucket and index names\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Vector retrieval options (bucket and index names automatically set)\n   * @returns Promise with response containing vectors array or error\n   *\n   * @example Get vectors by keys\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   * const { data } = await index.getVectors({\n   *   keys: ['doc-1', 'doc-2'],\n   *   returnMetadata: true\n   * })\n   * ```\n   */\n  override async getVectors(options: Omit\u003cGetVectorsOptions, 'vectorBucketName' | 'indexName'\u003e) {\n    return super.getVectors({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n      indexName: this.indexName,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Lists vectors in this index with pagination\n   * Convenience method that automatically includes bucket and index names\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Listing options (bucket and index names automatically set)\n   * @returns Promise with response containing vectors array and pagination token or error\n   *\n   * @example List vectors with pagination\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   * const { data } = await index.listVectors({\n   *   maxResults: 500,\n   *   returnMetadata: true\n   * })\n   * ```\n   */\n  override async listVectors(\n    options: Omit\u003cListVectorsOptions, 'vectorBucketName' | 'indexName'\u003e = {}\n  ) {\n    return super.listVectors({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n      indexName: this.indexName,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Queries for similar vectors in this index\n   * Convenience method that automatically includes bucket and index names\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Query options (bucket and index names automatically set)\n   * @returns Promise with response containing matches array of similar vectors ordered by distance or error\n   *\n   * @example Query similar vectors\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   * const { data } = await index.queryVectors({\n   *   queryVector: { float32: [0.1, 0.2, ...] },\n   *   topK: 5,\n   *   filter: { category: 'technical' },\n   *   returnDistance: true,\n   *   returnMetadata: true\n   * })\n   * ```\n   */\n  override async queryVectors(\n    options: Omit\u003cQueryVectorsOptions, 'vectorBucketName' | 'indexName'\u003e\n  ) {\n    return super.queryVectors({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n      indexName: this.indexName,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Deletes vectors by keys from this index\n   * Convenience method that automatically includes bucket and index names\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   * @param options - Deletion options (bucket and index names automatically set)\n   * @returns Promise with empty response on success or error\n   *\n   * @example Delete vectors by keys\n   * ```typescript\n   * const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n   * await index.deleteVectors({\n   *   keys: ['doc-1', 'doc-2', 'doc-3']\n   * })\n   * ```\n   */\n  override async deleteVectors(\n    options: Omit\u003cDeleteVectorsOptions, 'vectorBucketName' | 'indexName'\u003e\n  ) {\n    return super.deleteVectors({\n      ...options,\n      vectorBucketName: this.vectorBucketName,\n      indexName: this.indexName,\n    })\n  }\n}\n","import StorageFileApi from './packages/StorageFileApi'\nimport StorageBucketApi from './packages/StorageBucketApi'\nimport StorageAnalyticsClient from './packages/StorageAnalyticsClient'\nimport { Fetch } from './lib/common/fetch'\nimport { StorageVectorsClient } from './packages/StorageVectorsClient'\n\nexport interface StorageClientOptions {\n  useNewHostname?: boolean\n}\n\nexport class StorageClient extends StorageBucketApi {\n  /**\n   * Creates a client for Storage buckets, files, analytics, and vectors.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   *\n   * @example Using supabase-js (recommended)\n   * ```ts\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const avatars = supabase.storage.from('avatars')\n   * ```\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```ts\n   * import { StorageClient } from '@supabase/storage-js'\n   *\n   * const storage = new StorageClient('https://xyzcompany.supabase.co/storage/v1', {\n   *   apikey: 'your-publishable-key',\n   * })\n   * const avatars = storage.from('avatars')\n   * ```\n   */\n  constructor(\n    url: string,\n    headers: { [key: string]: string } = {},\n    fetch?: Fetch,\n    opts?: StorageClientOptions\n  ) {\n    super(url, headers, fetch, opts)\n  }\n\n  /**\n   * Perform file operation in a bucket.\n   *\n   * @category Storage\n   * @subcategory File Buckets\n   *\n   * @param id The bucket id to operate on.\n   *\n   * @example Accessing a bucket\n   * ```typescript\n   * const avatars = supabase.storage.from('avatars')\n   * ```\n   */\n  from(id: string): StorageFileApi {\n    return new StorageFileApi(this.url, this.headers, id, this.fetch)\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Access vector storage operations.\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Vector Buckets\n   *\n   * @returns A StorageVectorsClient instance configured with the current storage settings.\n   */\n  get vectors(): StorageVectorsClient {\n    return new StorageVectorsClient(this.url + '/vector', {\n      headers: this.headers,\n      fetch: this.fetch,\n    })\n  }\n\n  /**\n   *\n   * @alpha\n   *\n   * Access analytics storage operations using Iceberg tables.\n   *\n   * **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n   *\n   * @category Storage\n   * @subcategory Analytics Buckets\n   *\n   * @returns A StorageAnalyticsClient instance configured with the current storage settings.\n   */\n  get analytics(): StorageAnalyticsClient {\n    return new StorageAnalyticsClient(this.url + '/iceberg', this.headers, this.fetch)\n  }\n}\n"],"version":3}
