{"version":3,"sources":["../src/boost.ts","../src/sdk.ts"],"sourcesContent":["const DIMENSIONS_BUCKETS = [80, 250, 500, 750, 1000, 2000, 4000]\n\nfunction findNextBucket(originalSize: number, boosted: number): number {\n  const originalBucket = DIMENSIONS_BUCKETS.find(\n    bucket => bucket >= originalSize,\n  )\n  let nextBucket = DIMENSIONS_BUCKETS.find(bucket => bucket >= boosted)\n\n  if (nextBucket === originalBucket) {\n    const currentIndex = DIMENSIONS_BUCKETS.indexOf(nextBucket!)\n    nextBucket = DIMENSIONS_BUCKETS[currentIndex + 1]\n  }\n\n  return nextBucket || DIMENSIONS_BUCKETS[DIMENSIONS_BUCKETS.length - 1]\n}\n\nexport function boostSize(\n  size: number | `${number}`,\n  boost: number | undefined,\n): number | `${number}` {\n  if (boost === undefined || boost <= 1) {\n    return size\n  }\n  const boosted = Number(size) * boost\n  return findNextBucket(Number(size), boosted)\n}\n","import { boostSize } from \"./boost\"\n\nexport type MediaFormat = \"webp\" | \"avif\" | \"jpeg\" | \"png\"\nexport type MediaFit = \"cover\" | \"contain\" | \"fill\" | \"inside\" | \"outside\"\n\nexport type MediaParams = {\n  width?: number | `${number}`\n  height?: number | `${number}`\n  format?: MediaFormat\n  quality?: number | `${number}`\n  fit?: MediaFit\n  frameTime?: number\n  boost?: number\n}\n\nexport function optimize(\n  image: string | URL,\n  { width, height, format, quality, fit, frameTime, boost }: MediaParams,\n): string {\n  try {\n    if (typeof image === \"string\") {\n      image = new URL(image)\n    }\n  } catch {\n    return image.toString()\n  }\n\n  if (!(image instanceof URL)) {\n    return image\n  }\n\n  if (image.host === \"raw2.seadn.io\") {\n    image.host = \"i2.seadn.io\"\n  }\n\n  const isFrameable = canExtractFrame(image)\n  if (!(canBeResized(image) || isFrameable)) {\n    return originalURL(image)\n  }\n\n  // for partial content stremaing\n  if (isVideo(image) && frameTime === undefined) {\n    return originalURL(image)\n  }\n\n  const params = new URLSearchParams()\n\n  if (frameTime !== undefined) {\n    if (isFrameable) {\n      params.set(\"frame-time\", String(frameTime))\n    }\n  } else if (isVideo(image)) {\n    return image.toString()\n  }\n\n  if (height !== undefined) {\n    params.set(\"h\", String(boostSize(height, boost)))\n  }\n  if (width !== undefined) {\n    params.set(\"w\", String(boostSize(width, boost)))\n  }\n  if (format !== undefined) {\n    params.set(\"format\", format)\n  }\n  if (quality) {\n    if (Number(quality) <= 0 || Number(quality) > 100) {\n      throw new Error(\"Quality has to be a positive number between 1 and 100\")\n    }\n    params.set(\"q\", String(quality))\n  }\n  if (fit !== undefined) {\n    params.set(\"fit\", fit)\n  }\n\n  image.search = params.toString()\n  return image.toString()\n}\n\nfunction isVideo(url: URL): boolean {\n  const extension = getExtension(url)\n  return (\n    extension === \"mp4\" ||\n    extension === \"mov\" ||\n    extension === \"webm\" ||\n    extension === \"m4v\" ||\n    extension === \"ogg\" ||\n    extension === \"ogv\"\n  )\n}\n\nfunction canExtractFrame(url: URL): boolean {\n  return isVideo(url) || getExtension(url) === \"gif\"\n}\n\nfunction canBeResized(url: URL): boolean {\n  if (!isSeadnURL(url)) {\n    return false\n  }\n  const extension = getExtension(url)\n  switch (extension) {\n    case \"jpg\":\n    case \"png\":\n    case \"jpeg\":\n    case \"webp\":\n    case \"avif\":\n    case \"ico\":\n    case \"bmp\":\n    case \"gif\":\n    case \"tiff\":\n    case \"tif\":\n    case undefined:\n      return true\n    default:\n      return false\n  }\n}\n\nfunction getExtension(url: URL): string | undefined {\n  const split = url.pathname.split(\".\")\n  if (split.length <= 1) {\n    return\n  }\n  return split[split.length - 1]\n}\n\nexport function isSeadnURL(url: URL): boolean {\n  return url.hostname.endsWith(\"seadn.io\")\n}\n\nexport function originalURL(image: URL | string): string {\n  try {\n    if (typeof image === \"string\") {\n      image = new URL(image)\n    }\n  } catch {\n    return image.toString()\n  }\n\n  if (!isSeadnURL(image)) {\n    return image.toString()\n  }\n\n  image.hostname = getOriginalHostname(image)\n  return image.toString()\n}\n\nexport function getOriginalHostname(url: URL): string {\n  return url.hostname.replace(\"i2c\", \"raw2\").replace(\"i2\", \"raw2\")\n}\n"],"mappings":"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","names":["DIMENSIONS_BUCKETS","findNextBucket","originalSize","boosted","originalBucket","bucket","nextBucket","currentIndex","boostSize","size","boost","optimize","image","width","height","format","quality","fit","frameTime","boost","e","isFrameable","canExtractFrame","canBeResized","isVideo","originalURL","params","boostSize","url","extension","getExtension","isSeadnURL","split","getOriginalHostname"]}