{"version":3,"file":"image-BL6L2uXT.mjs","names":[],"sources":["../src/core/image.ts"],"sourcesContent":["import { builtinProviders } from \"./providers.ts\";\nimport {\n  EmptyImageUrlError,\n  ImageSearchNotSupportedError,\n  InvalidImageUrlError,\n  validateMaxResults,\n} from \"./errors.ts\";\nimport { createImageSearchProvider, has, searchImageProviders } from \"./registry.ts\";\nimport { providerRequestOptions, throwIfAborted, withExecutionBudget } from \"./execution.ts\";\nimport type { ImageSearchOptions, ImageSearchResult } from \"./types.ts\";\n\n/** Built-in providers that accept an image URL as a search input. */\nexport const imageSearchProviderNames = [\"serpapi\"] as const;\n\n/** Name of a built-in reverse image search provider. */\nexport type ImageSearchProviderName = (typeof imageSearchProviderNames)[number];\n\n/** Reverse image search options with an optional provider override. */\nexport interface ImageSearchByUrlOptions extends ImageSearchOptions {\n  readonly provider?: string;\n}\n\nconst DEFAULT_IMAGE_SEARCH_PROVIDER: ImageSearchProviderName = \"serpapi\";\n\n/**\n * Finds public pages containing or resembling an image available by URL.\n * @param url - Public HTTP or HTTPS image URL.\n * @param options - Provider and result limit.\n * @returns {Promise<ImageSearchResult[]>} Normalized reverse image matches.\n */\nexport async function searchByImage(\n  url: string,\n  options?: Readonly<ImageSearchByUrlOptions>,\n): Promise<ImageSearchResult[]> {\n  const trimmedUrl = url.trim();\n  if (!trimmedUrl) throw new EmptyImageUrlError();\n  assertImageUrl(trimmedUrl);\n\n  const { provider = DEFAULT_IMAGE_SEARCH_PROVIDER, ...searchOptions } = options ?? {};\n  validateMaxResults(searchOptions.maxResults);\n  const effectiveSearchOptions = withExecutionBudget(searchOptions);\n  throwIfAborted(effectiveSearchOptions.signal);\n  const providerName = provider.trim();\n  const registeredOrBuiltin =\n    has(providerName) || (builtinProviders as readonly string[]).includes(providerName);\n  if (registeredOrBuiltin && !searchImageProviders().includes(providerName)) {\n    throw new ImageSearchNotSupportedError(providerName);\n  }\n  let results: ImageSearchResult[];\n  try {\n    const imageSearchProvider = await createImageSearchProvider(providerName);\n    throwIfAborted(effectiveSearchOptions.signal);\n    results = await imageSearchProvider.searchByImage(\n      trimmedUrl,\n      providerRequestOptions(effectiveSearchOptions),\n    );\n  } catch (error) {\n    throwIfAborted(effectiveSearchOptions.signal);\n    throw error;\n  }\n  throwIfAborted(effectiveSearchOptions.signal);\n  return results;\n}\n\nfunction assertImageUrl(url: string): void {\n  let protocol: string;\n  try {\n    protocol = new URL(url).protocol;\n  } catch {\n    throw new InvalidImageUrlError();\n  }\n  if (protocol !== \"http:\" && protocol !== \"https:\") throw new InvalidImageUrlError();\n}\n"],"mappings":";;;;;;AAYA,MAAa,2BAA2B,CAAC,SAAS;AAUlD,MAAM,gCAAyD;;;;;;;AAQ/D,eAAsB,cACpB,KACA,SAC8B;CAC9B,MAAM,aAAa,IAAI,KAAK;CAC5B,IAAI,CAAC,YAAY,MAAM,IAAI,mBAAmB;CAC9C,eAAe,UAAU;CAEzB,MAAM,EAAE,WAAW,+BAA+B,GAAG,kBAAkB,WAAW,CAAC;CACnF,mBAAmB,cAAc,UAAU;CAC3C,MAAM,yBAAyB,oBAAoB,aAAa;CAChE,eAAe,uBAAuB,MAAM;CAC5C,MAAM,eAAe,SAAS,KAAK;CAGnC,KADE,IAAI,YAAY,KAAM,iBAAuC,SAAS,YAAY,MACzD,CAAC,qBAAqB,CAAC,CAAC,SAAS,YAAY,GACtE,MAAM,IAAI,6BAA6B,YAAY;CAErD,IAAI;CACJ,IAAI;EACF,MAAM,sBAAsB,MAAM,0BAA0B,YAAY;EACxE,eAAe,uBAAuB,MAAM;EAC5C,UAAU,MAAM,oBAAoB,cAClC,YACA,uBAAuB,sBAAsB,CAC/C;CACF,SAAS,OAAO;EACd,eAAe,uBAAuB,MAAM;EAC5C,MAAM;CACR;CACA,eAAe,uBAAuB,MAAM;CAC5C,OAAO;AACT;AAEA,SAAS,eAAe,KAAmB;CACzC,IAAI;CACJ,IAAI;EACF,WAAW,IAAI,IAAI,GAAG,CAAC,CAAC;CAC1B,QAAQ;EACN,MAAM,IAAI,qBAAqB;CACjC;CACA,IAAI,aAAa,WAAW,aAAa,UAAU,MAAM,IAAI,qBAAqB;AACpF"}