{"version":3,"sources":["../src/components/CldImage/CldImage.tsx","../src/helpers/getCldImageUrl.ts","../src/constants/analytics.ts","../package.json","../src/lib/cloudinary.ts","../src/loaders/cloudinary-loader.ts","../src/components/CldOgImage/CldOgImage.tsx","../src/helpers/getCldOgImageUrl.ts","../src/components/CldUploadButton/CldUploadButton.tsx","../src/components/CldUploadWidget/CldUploadWidget.tsx","../src/lib/util.ts","../src/components/CldVideoPlayer/CldVideoPlayer.tsx","../src/helpers/getCldVideoUrl.ts"],"sourcesContent":["import React, { useState, useCallback, forwardRef, SyntheticEvent } from 'react';\nimport Image, { ImageProps } from 'next/image';\nimport { pollForProcessingImage } from '@cloudinary-util/util';\nimport { transformationPlugins } from '@cloudinary-util/url-loader';\nimport type { ImageOptions, ConfigOptions } from '@cloudinary-util/url-loader';\n\nimport { getCldImageUrl } from '../../helpers/getCldImageUrl';\n\nimport { cloudinaryLoader } from '../../loaders/cloudinary-loader';\n\nexport type CldImageProps = Omit<ImageProps, 'src' | 'quality'> & ImageOptions & {\n  config?: ConfigOptions;\n  src: string;\n  unoptimized?: boolean;\n};\n\nconst CldImage = forwardRef<HTMLImageElement, CldImageProps>(function CldImage(props, ref) {\n  let hasThrownError = false;\n\n  // Add props here that are intended to only be used for\n  // Cloudinary URL construction to avoid them being forwarded\n  // to the DOM\n\n  const CLD_OPTIONS = [\n    'assetType',\n    'config',\n    'deliveryType',\n    'strictTransformations',\n  ];\n\n  // Loop through all of the props available on the transformation plugins and verify\n  // that we're not accientally applying the same prop twice\n\n  // We're also using those props to push into CLD_OPTIONS which helps us filter what\n  // props are applied to the underlaying Image component vs what's being sent\n  // to Cloudinary URL construction\n\n  transformationPlugins.forEach(({ props }: { props: Record<string, unknown> }) => {\n    const pluginProps = Object.keys(props);\n    pluginProps.forEach(prop => {\n      if ( CLD_OPTIONS.includes(prop) ) {\n        throw new Error(`Option ${prop} already exists!`);\n      }\n      CLD_OPTIONS.push(prop);\n    });\n  });\n\n  // Construct the base Image component props by filtering out Cloudinary-specific props\n\n  const imageProps: ImageProps = {\n    alt: props.alt,\n    src: props.src,\n  };\n\n  (Object.keys(props) as Array<keyof typeof props>)\n    .filter(key => typeof key === 'string' && !CLD_OPTIONS.includes(key))\n    .forEach(key => imageProps[key as keyof ImageProps] = props[key]);\n\n  const defaultImgKey = (Object.keys(imageProps) as Array<keyof typeof imageProps>).map(key => `${key}:${imageProps[key]}`).join(';');\n  const [imgKey, setImgKey] = useState(defaultImgKey);\n\n  // Construct Cloudinary-specific props by looking for values for any of the supported prop keys\n\n  type CldOptions = Omit<ImageOptions, 'src'>;\n\n  const cldOptions: CldOptions = {};\n\n  CLD_OPTIONS.forEach((key) => {\n    const prop = props[key as keyof ImageOptions];\n    if ( prop ) {\n      // @ts-expect-error\n      cldOptions[key as keyof CldOptions] = prop;\n    }\n  });\n\n  // The unoptimized flag is intended to remove all optimizations including quality, format, and sizing\n  // via responsive sizing. When passing this in, it also prevents the `loader` from running, thus\n  // breaking this component. This rewrites the `src` to construct a fully formed Cloudinary URL\n  // that also disables format and quality transformations, to deliver it as unoptimized\n  // See about unoptimized not working with loader: https://github.com/vercel/next.js/issues/50764\n\n  const IMAGE_OPTIONS: { unoptimized?: boolean } = (process.env.__NEXT_IMAGE_OPTS || {}) as unknown as object;\n\n  if ( props.unoptimized === true || IMAGE_OPTIONS?.unoptimized === true ) {\n    imageProps.src = getCldImageUrl({\n      ...cldOptions,\n      width: imageProps.width,\n      height: imageProps.height,\n      src: imageProps.src as string,\n      format: 'default',\n      quality: 'default',\n    }, props.config);\n  }\n\n  /**\n   * handleOnError\n   */\n\n  async function onError(options: SyntheticEvent<HTMLImageElement, Event>) {\n    let pollForImage = true;\n\n    // The onError function should never fire more than once. The use case for tracking it\n    // at all outside of the standard Next Image flow is for scenarios like when Cloudinary\n    // is processing an image where we want to try to update the UI upon completion.\n    // If this fires a second time, it is likely because of another issue, which will end\n    // up triggering an infinite loop if the resulting image keeps erroring and\n    // this function sets a key using the current time to force refresh the UI\n\n    if ( hasThrownError ) return;\n\n    hasThrownError = true;\n\n    if ( typeof props.onError === 'function' ) {\n      const onErrorResult = props.onError(options);\n\n      if ( typeof onErrorResult === 'boolean' && onErrorResult === false ) {\n        pollForImage = false;\n      }\n    } else if ( typeof props.onError === 'boolean' && props.onError === false ) {\n      pollForImage = false;\n    }\n\n    // Give an escape hatch in case the user wants to handle the error themselves\n    // or if they want to disable polling for the image\n\n    if ( pollForImage === false ) return;\n\n    const image = options.target as HTMLImageElement\n    const result = await pollForProcessingImage({ src: image.src })\n\n    if ( typeof result.error === 'string' && process.env.NODE_ENV === 'development' ) {\n      console.error(`[CldImage] Failed to load image ${props.src}: ${result.error}`)\n    }\n\n    if ( result.success ) {\n      setImgKey(`${defaultImgKey};${Date.now()}`);\n    }\n  }\n\n  const handleOnError = useCallback(onError, [pollForProcessingImage, defaultImgKey]);\n\n  // Copypasta from https://github.com/prismicio/prismic-next/pull/79/files\n  // Thanks Angelo!\n  // TODO: Remove once https://github.com/vercel/next.js/issues/52216 is resolved.\n\n  let ResolvedImage = Image;\n\n  if (\"default\" in ResolvedImage) {\n    ResolvedImage = (ResolvedImage as unknown as { default: typeof Image }).default;\n  }\n\n  return (\n    <ResolvedImage\n      key={imgKey}\n      {...imageProps}\n      loader={(loaderOptions) => cloudinaryLoader({ loaderOptions, imageProps, cldOptions, cldConfig: props.config })}\n      onError={handleOnError}\n      ref={ref}\n    />\n  );\n});\n\nexport default CldImage;","import { constructCloudinaryUrl } from '@cloudinary-util/url-loader';\nimport type { ImageOptions, ConfigOptions, AnalyticsOptions } from '@cloudinary-util/url-loader';\n\nimport { getCloudinaryConfig, getCloudinaryAnalytics } from \"../lib/cloudinary\";\n\n/**\n * getCldImageUrl\n */\n\nexport type GetCldImageUrlOptions = ImageOptions;\nexport type GetCldImageUrlConfig = ConfigOptions;\nexport type GetCldImageUrlAnalytics = AnalyticsOptions;\n\nexport function getCldImageUrl(options: GetCldImageUrlOptions, config?: GetCldImageUrlConfig, analytics?: GetCldImageUrlAnalytics) {\n  return constructCloudinaryUrl({\n    options,\n    config: getCloudinaryConfig(config),\n    analytics: getCloudinaryAnalytics(analytics)\n  });\n}\n","import nextPkg from 'next/package.json';\nimport pkg from '../../package.json';\n\nexport const NEXT_CLOUDINARY_ANALYTICS_PRODUCT_ID = 'A';\nexport const NEXT_CLOUDINARY_ANALYTICS_ID = 'V';\nexport const NEXT_VERSION = normalizeVersion(nextPkg.version);\nexport const NEXT_CLOUDINARY_VERSION = normalizeVersion(pkg.version);\n\nfunction normalizeVersion(version: string) {\n  let normalized = version;\n  if ( normalized.includes('-') ) {\n    normalized = normalized.split('-')[0];\n  }\n  return normalized;\n}","{\n  \"name\": \"next-cloudinary\",\n  \"version\": \"6.17.5\",\n  \"license\": \"MIT\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.mjs\",\n  \"types\": \"./dist/index.d.ts\",\n  \"source\": \"src/index.ts\",\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"dev\": \"tsup --watch\",\n    \"prepublishOnly\": \"cp ../README.md . && cp ../LICENSE . && pnpm build\",\n    \"postpublish\": \"rm ./README.md && rm ./LICENSE\",\n    \"test\": \"vitest run\",\n    \"test:app\": \"NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=\\\"test\\\" pnpm build && cd tests/nextjs-app && npm install && npm run build\",\n    \"test:watch\": \"vitest\"\n  },\n  \"dependencies\": {\n    \"@cloudinary-util/types\": \"1.5.10\",\n    \"@cloudinary-util/url-loader\": \"5.10.4\",\n    \"@cloudinary-util/util\": \"4.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-env\": \"^7.25.3\",\n    \"@tsconfig/recommended\": \"^1.0.7\",\n    \"@types/node\": \"^22.0.2\",\n    \"@types/react\": \"^18.3.3\",\n    \"@types/react-dom\": \"^18.3.0\",\n    \"dotenv\": \"^16.4.5\",\n    \"mkdirp\": \"^3.0.1\",\n    \"tsup\": \"^8.2.3\",\n    \"typescript\": \"^5.5.4\",\n    \"vitest\": \"^2.0.5\"\n  },\n  \"peerDependencies\": {\n    \"next\": \"^12 || ^13 || ^14 || >=15.0.0-rc || ^15\",\n    \"react\": \"^17 || ^18 || >=19.0.0-beta || ^19\"\n  }\n}\n","import { AnalyticsOptions, ConfigOptions } from \"@cloudinary-util/url-loader\";\n\nimport { NEXT_CLOUDINARY_ANALYTICS_PRODUCT_ID, NEXT_CLOUDINARY_ANALYTICS_ID, NEXT_CLOUDINARY_VERSION, NEXT_VERSION } from '../constants/analytics';\n\n/**\n * pollForProcessingImage\n */\n\nexport interface PollForProcessingImageOptions {\n  src: string;\n}\n\nexport async function pollForProcessingImage(options: PollForProcessingImageOptions): Promise<boolean> {\n  const { src } = options;\n  try {\n    await new Promise((resolve, reject) => {\n      fetch(src).then(res => {\n        if ( !res.ok ) {\n          reject(res);\n          return;\n        }\n        resolve(res);\n      });\n    });\n  } catch(e: any) {\n    // Timeout for 200ms before trying to fetch again to avoid overwhelming requests\n\n    if ( e.status === 423 ) {\n      await new Promise((resolve) => setTimeout(() => resolve(undefined), 200));\n      return await pollForProcessingImage(options);\n    }\n    return false;\n  }\n  return true;\n}\n\n/**\n * getCloudinaryConfig\n */\n\nexport function getCloudinaryConfig(config?: ConfigOptions): ConfigOptions {\n  const cloudName = config?.cloud?.cloudName ?? process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME;\n\n  if (!cloudName) {\n    throw new Error('A Cloudinary Cloud name is required, please make sure NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME is set and configured in your environment.');\n  }\n\n  const apiKey = config?.cloud?.apiKey ?? process.env.NEXT_PUBLIC_CLOUDINARY_API_KEY;\n  const secureDistribution = config?.url?.secureDistribution ?? process.env.NEXT_PUBLIC_CLOUDINARY_SECURE_DISTRIBUTION;\n  const privateCdn = config?.url?.privateCdn ?? process.env.NEXT_PUBLIC_CLOUDINARY_PRIVATE_CDN;\n\n  return Object.assign({\n    cloud: {\n      ...config?.cloud,\n      apiKey,\n      cloudName\n    },\n    url: {\n      ...config?.url,\n      secureDistribution,\n      privateCdn\n    }\n  }, config);\n}\n\n/**\n * getCloudinaryAnalytics\n */\n\nexport function getCloudinaryAnalytics(analytics?: AnalyticsOptions) {\n  return Object.assign({\n    product: NEXT_CLOUDINARY_ANALYTICS_PRODUCT_ID,\n    sdkCode: NEXT_CLOUDINARY_ANALYTICS_ID,\n    sdkSemver: NEXT_CLOUDINARY_VERSION,\n    techVersion: NEXT_VERSION,\n    feature: ''\n  }, analytics)\n}","import { ImageProps } from 'next/image';\n\nimport { getCldImageUrl } from '../helpers/getCldImageUrl';\n\nexport interface CloudinaryLoaderCldOptions {\n}\n\nexport interface CloudinaryLoaderLoaderOptions {\n  height?: string | number;\n  width?: string | number;\n}\n\nexport interface CloudinaryLoader {\n  loaderOptions: CloudinaryLoaderLoaderOptions;\n  imageProps: ImageProps;\n  cldOptions: CloudinaryLoaderCldOptions;\n  cldConfig?: object;\n}\n\nexport function cloudinaryLoader({ loaderOptions, imageProps, cldOptions, cldConfig = {} }: CloudinaryLoader) {\n  const options = {\n    ...imageProps,\n    ...cldOptions\n  }\n\n  options.width = typeof options.width === 'string' ? parseInt(options.width) : options.width;\n  options.height = typeof options.height === 'string' ? parseInt(options.height) : options.height;\n  \n  // // The loader options are used to create dynamic sizing when working with responsive images\n  // // so these should override the default options collected from the props alone if\n  // // the results are different. While we don't always use the height in the loader logic,\n  // // we always pass it here, as the usage is determined later based on cropping.js\n\n  if ( typeof loaderOptions?.width === 'number' && typeof options.width === 'number' && loaderOptions.width !== options.width ) {\n    const multiplier = loaderOptions.width / options.width;\n    \n    options.width = loaderOptions.width;\n\n    // The height may change based off of the value passed through via the loader options\n    // In an example where the user sizes is 800x600, but the loader is passing in 400\n    // due to responsive sizing, we want to ensure we're using a height that will\n    // resolve to the same aspect ratio\n    \n    if ( typeof options.height === 'number' ) {\n      options.height = Math.floor(options.height * multiplier);\n    }\n  } else if ( typeof loaderOptions?.width === 'number' && typeof options?.width !== 'number' ) {\n    // If we don't have a width on the options object, this may mean that the component is using\n    // the fill option: https://nextjs.org/docs/pages/api-reference/components/image#fill\n    // The Fill option does not allow someone to pass in a width or a height\n    // If this is the case, we still need to define a width for sizing optimization but also\n    // for responsive sizing to take effect, so we can utilize the loader width for the base width\n    options.width = loaderOptions?.width;\n  }\n\n  // @ts-ignore\n  return getCldImageUrl(options, cldConfig);\n}","import React from 'react';\nimport Head from 'next/head';\n\nimport { CldImageProps } from '../CldImage/CldImage';\nimport { getCldOgImageUrl } from '../../helpers/getCldOgImageUrl';\nimport { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../constants/sizes';\n\nconst TWITTER_CARD = 'summary_large_image';\n\nexport type CldOgImageProps = CldImageProps & {\n  excludeTags?: Array<string>;\n  keys?: object;\n  twitterTitle?: string;\n}\n\nconst CldOgImage = ({ excludeTags = [], twitterTitle, keys = {}, ...props }: CldOgImageProps) => {\n  const { alt } = props;\n\n  // We need to separately handle the width and the height to allow our user to pass in\n  // a custom value, but also we need to know this at the component level so that we can\n  // use it when rendering the meta tags\n\n  let {\n    width = OG_IMAGE_WIDTH,\n    height = OG_IMAGE_HEIGHT\n  } = props;\n\n  // Normalize the width and height\n\n  width = typeof width === 'string' ? parseInt(width) : width;\n  height = typeof height === 'string' ? parseInt(height) : height;\n\n  // Render the final URLs. We use two different format versions to deliver\n  // webp for Twitter as it supports it (and we can control with tags) where\n  // other platforms may not support webp, so we deliver jpg\n\n  const ogImageUrl = getCldOgImageUrl({\n    ...props,\n    width,\n    height\n  });\n\n  const twitterImageUrl = getCldOgImageUrl({\n    ...props,\n    width,\n    height,\n    format: props.format || 'webp',\n  });\n\n  const metaKeys = {\n    'og:image': 'og-image',\n    'og:image:secure_url': 'og-image-secureurl',\n    'og:image:width': 'og-image-width',\n    'og:image:height': 'og-image-height',\n    'og:image:alt': 'og-image-alt',\n    'twitter:title': 'twitter-title',\n    'twitter:card': 'twitter-card',\n    'twitter:image': 'twitter-image',\n    ...keys\n  }\n\n  // We need to include the tags within the Next.js Head component rather than\n  // direcly adding them inside of the Head otherwise we get unexpected results\n\n    return (\n    <Head>\n      <meta key={metaKeys['og:image']} property=\"og:image\" content={ogImageUrl} />\n      <meta key={metaKeys['og:image:secure_url']} property=\"og:image:secure_url\" content={ogImageUrl} />\n      <meta key={metaKeys['og:image:width']} property=\"og:image:width\" content={`${width}`} />\n      <meta key={metaKeys['og:image:height']} property=\"og:image:height\" content={`${height}`} />\n\n      {alt && (\n        <meta key={metaKeys['og:image:alt']} property=\"og:image:alt\" content={alt} />\n      )}\n\n      {/* Required for summary_large_image, exclude vai excludeTags */}\n      {/* https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary-card-with-large-image */}\n\n      {!excludeTags.includes('twitter:title') && (\n        <meta key={metaKeys['twitter:title']} property=\"twitter:title\" content={twitterTitle || ' '} />\n      )}\n\n      <meta key={metaKeys['twitter:card']} property=\"twitter:card\" content={TWITTER_CARD} />\n      <meta key={metaKeys['twitter:image']} property=\"twitter:image\" content={twitterImageUrl} />\n    </Head>\n  );\n}\n\nexport default CldOgImage;\n","import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../constants/sizes';\n\nimport { getCldImageUrl } from './getCldImageUrl';\nimport type { GetCldImageUrlOptions } from './getCldImageUrl';\n\n/**\n * getCldImageUrl\n */\n\nexport type GetCldOgImageUrlOptions = GetCldImageUrlOptions;\n\nexport function getCldOgImageUrl(options: GetCldOgImageUrlOptions) {\n  return getCldImageUrl({\n    ...options,\n    format: options.format || 'jpg',\n    width: options.width || OG_IMAGE_WIDTH,\n    height: options.height || OG_IMAGE_HEIGHT,\n    crop: options.crop || {\n      type: 'fill',\n      gravity: 'center',\n      source: true\n    }\n  });\n}","import React from 'react';\nimport CldUploadWidget, { CldUploadWidgetProps } from '../CldUploadWidget';\n\nexport interface CldUploadButtonProps extends Omit<CldUploadWidgetProps, 'children'> {\n  className?: string;\n  children?: JSX.Element | string | Array<JSX.Element|string>;\n  onClick?: Function;\n}\n\nconst CldUploadButton = ({\n  className,\n  children,\n  onClick,\n  onError,\n  onOpen,\n  onUpload,\n   onAbort,\n  onBatchCancelled,\n  onClose,\n  onDisplayChanged,\n  onPublicId,\n  onQueuesEnd,\n  onQueuesStart,\n  onRetry,\n  onShowCompleted,\n  onSourceChanged,\n  onSuccess,\n  onTags,\n  onUploadAdded,\n  options,\n  signatureEndpoint,\n  uploadPreset,\n  onAbortAction,\n  onBatchCancelledAction,\n  onCloseAction,\n  onDisplayChangedAction,\n  onPublicIdAction,\n  onQueuesEndAction,\n  onQueuesStartAction,\n  onRetryAction,\n  onShowCompletedAction,\n  onSourceChangedAction,\n  onSuccessAction,\n  onTagsAction,\n  onUploadAddedAction,\n  ...props\n}: CldUploadButtonProps) => {\n\n  return (\n    <>\n      <CldUploadWidget\n        onError={onError}\n        onOpen={onOpen}\n        onUpload={onUpload}\n        onAbort={onAbort}\n        onBatchCancelled={onBatchCancelled}\n        onClose={onClose}\n        onDisplayChanged={onDisplayChanged}\n        onPublicId={onPublicId}\n        onQueuesEnd={onQueuesEnd}\n        onQueuesStart={onQueuesStart}\n        onRetry={onRetry}\n        onShowCompleted={onShowCompleted}\n        onSourceChanged={onSourceChanged}\n        onSuccess={onSuccess}\n        onTags={onTags}\n        onUploadAdded={onUploadAdded}\n        options={options}\n        signatureEndpoint={signatureEndpoint}\n        uploadPreset={uploadPreset}\n        onAbortAction={onAbortAction}\n        onBatchCancelledAction={onBatchCancelledAction}\n        onCloseAction={onCloseAction}\n        onDisplayChangedAction={onDisplayChangedAction}\n        onPublicIdAction={onPublicIdAction}\n        onQueuesEndAction={onQueuesEndAction}\n        onQueuesStartAction={onQueuesStartAction}\n        onRetryAction={onRetryAction}\n        onShowCompletedAction={onShowCompletedAction}\n        onSourceChangedAction={onSourceChangedAction}\n        onSuccessAction={onSuccessAction}\n        onTagsAction={onTagsAction}\n        onUploadAddedAction={onUploadAddedAction}\n      >\n        {({ open, isLoading }) => {\n          function handleOnClick(e: React.MouseEvent<HTMLButtonElement, MouseEvent>) {\n            e.preventDefault();\n\n            open();\n\n            if ( typeof onClick === 'function' ) {\n              onClick(e);\n            }\n          }\n          return (\n            <button {...props} className={className || ''} onClick={handleOnClick} disabled={isLoading} >\n              {children || 'Upload'}\n            </button>\n          );\n        }}\n      </CldUploadWidget>\n    </>\n  );\n};\n\nexport default CldUploadButton;\n","import React, { useState, useEffect, useRef } from 'react';\nimport Script from 'next/script';\nimport { generateSignatureCallback, generateUploadWidgetResultCallback, getUploadWidgetOptions, UPLOAD_WIDGET_EVENTS } from '@cloudinary-util/url-loader'\nimport {\n  CloudinaryUploadWidgetResults,\n  CloudinaryUploadWidgetInstanceMethods,\n  CloudinaryUploadWidgetInstanceMethodCloseOptions,\n  CloudinaryUploadWidgetInstanceMethodDestroyOptions,\n  CloudinaryUploadWidgetInstanceMethodOpenOptions,\n  CloudinaryUploadWidgetSources,\n  CloudinaryUploadWidgetError\n} from '@cloudinary-util/types';\n\nimport { triggerOnIdle } from '../../lib/util';\n\nimport {\n  CldUploadEventAction,\n  CldUploadEventCallback,\n  CldUploadWidgetCloudinaryInstance,\n  CldUploadWidgetProps,\n  CldUploadWidgetWidgetInstance,\n} from './CldUploadWidget.types';\n\nimport { getCloudinaryConfig } from \"../../lib/cloudinary\";\n\n// Stable ID hook with React 18+ useId and React < 18 fallback\nconst useUploadWidgetId = (): string => {\n  const reactId = (React as { useId?: () => string }).useId?.() ?? null;\n\n  // Preserve the original random ID behavior for React < 18\n  const fallbackId = React.useRef(Math.floor(Math.random() * 100)).current;\n\n  // Remove colons from React useId() output (e.g., \":r1:\" -> \"r1\") to avoid issues with CSS selectors and HTML IDs\n  const sanitizedId = reactId ? reactId.replace(/:/g, '') : fallbackId;\n\n  return `cloudinary-uploadwidget-${sanitizedId}`;\n};\n\nconst CldUploadWidget = ({\n  children,\n  config,\n  onError,\n  onOpen,\n  onUpload,\n  options,\n  signatureEndpoint,\n  uploadPreset,\n  ...props\n}: CldUploadWidgetProps) => {\n  const uploadWidgetId = useUploadWidgetId();\n  const cloudinary: CldUploadWidgetCloudinaryInstance = useRef();\n  const widget: CldUploadWidgetWidgetInstance = useRef();\n\n  const [error, setError] = useState<CloudinaryUploadWidgetError | undefined>(undefined);\n  const [results, setResults] = useState<CloudinaryUploadWidgetResults | undefined>(undefined);\n  const [isScriptLoading, setIsScriptLoading] = useState(true);\n\n  // When creating a signed upload, you need to provide both your Cloudinary API Key\n  // as well as a signature generator function that will sign any paramters\n  // either on page load or during the upload process. Read more about signed uploads at:\n  // https://cloudinary.com/documentation/upload_widget#signed_uploads\n\n  const cloudinaryConfig = getCloudinaryConfig(config);\n\n  const uploadSignature = signatureEndpoint && generateSignatureCallback({\n    signatureEndpoint: String(signatureEndpoint),\n    fetch\n  });\n\n  const uploadOptions = getUploadWidgetOptions({\n    uploadPreset: uploadPreset || process.env.NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET,\n    uploadSignature,\n    ...options,\n  }, cloudinaryConfig);\n\n  const resultsCallback = generateUploadWidgetResultCallback({\n    onError: (uploadError) => {\n      setError(uploadError);\n\n      if ( typeof onError === 'function' ) {\n        onError(uploadError, {\n          widget: widget.current,\n          ...instanceMethods\n        });\n      }\n    },\n    onResult: (uploadResult) => {\n      if ( typeof uploadResult?.event !== 'string' ) return;\n\n      setResults(uploadResult);\n\n      const widgetEvent = UPLOAD_WIDGET_EVENTS[uploadResult.event] as keyof typeof props;\n\n      if ( typeof widgetEvent === 'string' && typeof props[widgetEvent] === 'function' ) {\n        const callback = props[widgetEvent] as CldUploadEventCallback;\n        callback(uploadResult, {\n          widget: widget.current,\n          ...instanceMethods\n        });\n      }\n\n      const widgetEventAction = `${widgetEvent}Action` as keyof typeof props;\n\n      if ( widgetEventAction && typeof props[widgetEventAction] === 'function' ) {\n        const action = props[widgetEventAction] as CldUploadEventAction;\n        action(uploadResult);\n      }\n    },\n  });\n\n\n  // Handle result states and callbacks\n\n  useEffect(() => {\n    if ( typeof results === 'undefined' ) return;\n\n    const isSuccess = results.event === 'success';\n\n    if ( isSuccess && typeof onUpload === 'function' ) {\n      if ( process.env.NODE_ENV === 'development' ) {\n        console.warn('The onUpload callback is deprecated. Please use onSuccess instead.');\n      }\n      onUpload(results, widget.current);\n    }\n  }, [results])\n\n  /**\n   * handleOnLoad\n   * @description Stores the Cloudinary window instance to a ref when the widget script loads\n   */\n\n  function handleOnLoad() {\n    setIsScriptLoading(false);\n\n    if ( !cloudinary.current ) {\n      cloudinary.current = (window as any).cloudinary;\n    }\n\n    // To help improve load time of the widget on first instance, use requestIdleCallback\n    // to trigger widget creation. Optional.\n\n    triggerOnIdle(() => {\n      if ( !widget.current ) {\n        widget.current = createWidget();\n      }\n    });\n  }\n\n  useEffect(() => {\n    return () => {\n      widget.current?.destroy();\n      widget.current = undefined;\n    }\n  }, [])\n\n  /**\n   * Instance Methods\n   * Gives the ability to interface directly with the Upload Widget instance methods like open and close\n   * https://cloudinary.com/documentation/upload_widget_reference#instance_methods\n   */\n\n  function invokeInstanceMethod<\n    TMethod extends keyof CloudinaryUploadWidgetInstanceMethods\n  >(\n    method: TMethod,\n    options: Parameters<\n      CloudinaryUploadWidgetInstanceMethods[TMethod]\n    > = [] as Parameters<CloudinaryUploadWidgetInstanceMethods[TMethod]>\n  ) {\n    if (!widget.current) {\n      widget.current = createWidget();\n    }\n\n    if (typeof widget?.current[method] === \"function\") {\n      return widget.current[method](...options);\n    }\n  }\n\n  function close(options?: CloudinaryUploadWidgetInstanceMethodCloseOptions) {\n    invokeInstanceMethod('close', [options]);\n  }\n\n  function destroy(options?: CloudinaryUploadWidgetInstanceMethodDestroyOptions) {\n    return invokeInstanceMethod('destroy', [options]);\n  }\n\n  function hide() {\n    invokeInstanceMethod('hide');\n  }\n\n  function isDestroyed() {\n    return invokeInstanceMethod('isDestroyed');\n  }\n\n  function isMinimized() {\n    return invokeInstanceMethod('isMinimized');\n  }\n\n  function isShowing() {\n    return invokeInstanceMethod('isShowing');\n  }\n\n  function minimize() {\n    invokeInstanceMethod('minimize');\n  }\n\n  function open(widgetSource?: CloudinaryUploadWidgetSources, options?: CloudinaryUploadWidgetInstanceMethodOpenOptions) {\n    invokeInstanceMethod('open', [widgetSource, options]);\n\n    if ( typeof onOpen === 'function' ) {\n      onOpen(widget.current);\n    }\n  }\n\n  function show() {\n    invokeInstanceMethod('show');\n  }\n\n  function update() {\n    invokeInstanceMethod('update');\n  }\n\n  const instanceMethods: CloudinaryUploadWidgetInstanceMethods = {\n    close,\n    destroy,\n    hide,\n    isDestroyed,\n    isMinimized,\n    isShowing,\n    minimize,\n    open,\n    show,\n    update,\n  }\n\n  /**\n   * createWidget\n   * @description Creates a new instance of the Cloudinary widget and stores in a ref\n   */\n\n  function createWidget() {\n    return cloudinary.current?.createUploadWidget(uploadOptions, resultsCallback);\n  }\n\n  return (\n    <>\n      {typeof children === 'function' && children({\n        cloudinary: cloudinary.current,\n        widget: widget.current,\n        results,\n        error,\n        isLoading: isScriptLoading,\n        ...instanceMethods,\n      })}\n      <Script\n        id={uploadWidgetId}\n        src=\"https://upload-widget.cloudinary.com/global/all.js\"\n        onLoad={handleOnLoad}\n        onError={(e) => console.error(`Failed to load Cloudinary Upload Widget: ${e.message}`)}\n      />\n    </>\n  );\n};\n\nexport default CldUploadWidget;","/**\n * triggerOnIdle\n * @see MDN Polyfill https://github.com/behnammodi/polyfill/blob/master/window.polyfill.js#L7-L24\n */\n\nexport function triggerOnIdle(callback: any) {\n  if ( window && 'requestIdleCallback' in window ) {\n    return requestIdleCallback(callback);\n  }\n  return setTimeout(() => callback(), 1);\n}","import React, {useRef, MutableRefObject, useEffect, useId, useState} from 'react';\nimport Script from 'next/script';\nimport Head from 'next/head';\nimport { CloudinaryVideoPlayer } from '@cloudinary-util/types';\nimport { getVideoPlayerOptions } from '@cloudinary-util/url-loader';\n\nimport { CldVideoPlayerProps } from './CldVideoPlayer.types';\n\nimport { getCloudinaryConfig } from \"../../lib/cloudinary\";\n\nlet playerInstances: string[] = [];\n\nconst PLAYER_VERSION = '1.11.1';\n\nconst CldVideoPlayer = (props: CldVideoPlayerProps) => {\n\n  const {\n    className,\n    config,\n    disableRemotePlayback,\n    height,\n    id,\n    onDataLoad,\n    onError,\n    onMetadataLoad,\n    onPause,\n    onPlay,\n    onEnded,\n    width,\n  } = props;\n\n  const uniqueId = useId();\n  const [isScriptLoaded, setIsScriptLoaded] = useState(false);\n  const [playerInitialized, setPlayerInitialized] = useState(false);\n\n  const cloudinaryConfig = getCloudinaryConfig(config);\n  const playerOptions = getVideoPlayerOptions(props, cloudinaryConfig);\n  const { publicId } = playerOptions;\n  if ( typeof publicId === 'undefined' ) {\n    throw new Error('Video Player requires a Public ID or Cloudinary URL - please specify a src prop');\n  }\n\n  // Setup the refs and allow for the caller to pass through their\n  // own ref instance\n\n  const cloudinaryRef = useRef<any>();\n  const defaultVideoRef = useRef() as MutableRefObject<HTMLVideoElement | null>;\n  const videoRef = props.videoRef || defaultVideoRef;\n  const defaultPlayerRef = useRef()as MutableRefObject<CloudinaryVideoPlayer | null>;\n  const playerRef = props.playerRef || defaultPlayerRef;\n\n  const playerId = id || `player-${uniqueId.replace(/:/g, '')}`;\n  let playerClassName = 'cld-video-player cld-fluid';\n\n  if ( className ) {\n    playerClassName = `${playerClassName} ${className}`;\n  }\n\n\n  const events: Record<string, Function|undefined> = {\n    error: onError,\n    loadeddata: onDataLoad,\n    loadedmetadata: onMetadataLoad,\n    pause: onPause,\n    play: onPlay,\n    ended: onEnded\n  };\n\n  /**\n   * handleEvent\n   * @description Event handler for all player events\n   */\n\n  function handleEvent(event: { type: 'string' }) {\n    const activeEvent = events[event.type];\n\n    if ( typeof activeEvent === 'function' ) {\n      activeEvent(getPlayerRefs());\n    }\n  }\n\n  /**\n   * disposePlayer\n   * @description Properly dispose of the player instance and clean up\n   */\n\n  const disposePlayer = () => {\n    if (playerRef.current?.videojs?.cloudinary) {\n      playerRef.current.videojs.cloudinary.dispose();\n    }\n    // remove from global instances array\n    playerInstances = playerInstances.filter((instanceId) => instanceId !== playerId);\n    playerRef.current = null;\n    setPlayerInitialized(false);\n  };\n\n  /**\n   * initializePlayer\n   * @description Initialize the Cloudinary video player\n   */\n\n  const initializePlayer = () => {\n    if (typeof window !== 'undefined' && 'cloudinary' in window && videoRef.current && !playerInitialized) {\n      cloudinaryRef.current = window.cloudinary;\n      \n      // dispose any existing player instance first to prevent conflicts\n      if (playerRef.current) {\n        disposePlayer();\n      }\n      \n      playerRef.current = cloudinaryRef.current.videoPlayer(videoRef.current, playerOptions);\n      setPlayerInitialized(true);\n\n      Object.keys(events).forEach((key) => {\n        if ( typeof events[key] === 'function' ) {\n          playerRef.current?.on(key, handleEvent);\n        }\n      });\n    }\n  };\n\n  /**\n   * handleOnLoad\n   * @description Stores the Cloudinary window instance to a ref when the widget script loads\n   */\n\n  function handleOnLoad() {\n    setIsScriptLoaded(true);\n    if ( 'cloudinary' in window ) {\n      initializePlayer();\n    }\n  }\n\n  // effect to handle component mounting and cleanup\n  useEffect(() => {\n    // initialize player if script is already loaded\n    if (isScriptLoaded && typeof window !== 'undefined' && 'cloudinary' in window) {\n      initializePlayer();\n    }\n\n    return () => {\n      disposePlayer();\n    };\n  }, []);\n\n  // effect to handle script loading after mount\n  useEffect(() => {\n    if (isScriptLoaded && !playerInitialized && typeof window !== 'undefined' && 'cloudinary' in window) {\n      initializePlayer();\n    }\n  }, [isScriptLoaded, playerInitialized]);\n\n  /**\n   *getPlayerRefs\n   */\n\n  function getPlayerRefs() {\n    return {\n      player: playerRef.current,\n      video: videoRef.current\n    }\n  }\n\n  return (\n    <>\n      <Head>\n        <link href={`https://unpkg.com/cloudinary-video-player@${PLAYER_VERSION}/dist/cld-video-player.min.css`} rel=\"stylesheet\" />\n      </Head>\n      <div style={{ width: '100%' }}>\n        <video\n          ref={videoRef}\n          id={playerId}\n          className={playerClassName}\n          width={width}\n          height={height}\n          disableRemotePlayback={disableRemotePlayback}\n        />\n        <Script\n          id={`cloudinary-videoplayer-${playerId}`}\n          src={`https://unpkg.com/cloudinary-video-player@${PLAYER_VERSION}/dist/cld-video-player.min.js`}\n          onLoad={handleOnLoad}\n          onError={(e) => console.error(`Failed to load Cloudinary Video Player: ${e.message}`)}\n        />\n      </div>\n    </>\n  );\n};\n\nexport default CldVideoPlayer;\n","import { constructCloudinaryUrl } from '@cloudinary-util/url-loader';\nimport type { VideoOptions, ConfigOptions, AnalyticsOptions } from '@cloudinary-util/url-loader';\n\nimport { getCloudinaryConfig, getCloudinaryAnalytics } from \"../lib/cloudinary\";\n\n/**\n * getCldVideoUrl\n */\n\nexport type GetCldVideoUrlOptions = VideoOptions;\nexport type GetCldVideoUrlConfig = ConfigOptions;\nexport type GetCldVideoUrlAnalytics = AnalyticsOptions;\n\nexport function getCldVideoUrl(options: GetCldVideoUrlOptions, config?: GetCldVideoUrlConfig, analytics?: GetCldVideoUrlAnalytics) {\n  return constructCloudinaryUrl({\n    options: {\n      assetType: 'video',\n      format: 'auto:video',\n      ...options\n    },\n    config: getCloudinaryConfig(config),\n    analytics: getCloudinaryAnalytics(analytics)\n  });\n}\n"],"mappings":"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","names":["React","useState","useCallback","forwardRef","Image","pollForProcessingImage","transformationPlugins","constructCloudinaryUrl","nextPkg","package_default","NEXT_CLOUDINARY_ANALYTICS_PRODUCT_ID","NEXT_CLOUDINARY_ANALYTICS_ID","NEXT_VERSION","normalizeVersion","nextPkg","NEXT_CLOUDINARY_VERSION","package_default","version","normalized","getCloudinaryConfig","config","cloudName","apiKey","secureDistribution","privateCdn","getCloudinaryAnalytics","analytics","NEXT_CLOUDINARY_ANALYTICS_PRODUCT_ID","NEXT_CLOUDINARY_ANALYTICS_ID","NEXT_CLOUDINARY_VERSION","NEXT_VERSION","getCldImageUrl","options","config","analytics","constructCloudinaryUrl","getCloudinaryConfig","getCloudinaryAnalytics","cloudinaryLoader","loaderOptions","imageProps","cldOptions","cldConfig","options","multiplier","getCldImageUrl","CldImage","forwardRef","props","ref","hasThrownError","CLD_OPTIONS","transformationPlugins","prop","imageProps","key","defaultImgKey","imgKey","setImgKey","useState","cldOptions","IMAGE_OPTIONS","getCldImageUrl","onError","options","pollForImage","onErrorResult","image","result","pollForProcessingImage","handleOnError","useCallback","ResolvedImage","Image","React","loaderOptions","cloudinaryLoader","CldImage_default","React","Head","getCldOgImageUrl","options","getCldImageUrl","TWITTER_CARD","CldOgImage","excludeTags","twitterTitle","keys","props","alt","width","height","ogImageUrl","getCldOgImageUrl","twitterImageUrl","metaKeys","React","Head","CldOgImage_default","React","React","useState","useEffect","useRef","Script","generateSignatureCallback","generateUploadWidgetResultCallback","getUploadWidgetOptions","UPLOAD_WIDGET_EVENTS","triggerOnIdle","callback","useUploadWidgetId","reactId","React","fallbackId","CldUploadWidget","children","config","onError","onOpen","onUpload","options","signatureEndpoint","uploadPreset","props","uploadWidgetId","cloudinary","useRef","widget","error","setError","useState","results","setResults","isScriptLoading","setIsScriptLoading","cloudinaryConfig","getCloudinaryConfig","uploadSignature","generateSignatureCallback","uploadOptions","getUploadWidgetOptions","resultsCallback","generateUploadWidgetResultCallback","uploadError","instanceMethods","uploadResult","widgetEvent","UPLOAD_WIDGET_EVENTS","callback","widgetEventAction","action","useEffect","handleOnLoad","triggerOnIdle","createWidget","invokeInstanceMethod","method","close","destroy","hide","isDestroyed","isMinimized","isShowing","minimize","open","widgetSource","show","update","Script","e","CldUploadWidget_default","CldUploadButton","className","children","onClick","onError","onOpen","onUpload","onAbort","onBatchCancelled","onClose","onDisplayChanged","onPublicId","onQueuesEnd","onQueuesStart","onRetry","onShowCompleted","onSourceChanged","onSuccess","onTags","onUploadAdded","options","signatureEndpoint","uploadPreset","onAbortAction","onBatchCancelledAction","onCloseAction","onDisplayChangedAction","onPublicIdAction","onQueuesEndAction","onQueuesStartAction","onRetryAction","onShowCompletedAction","onSourceChangedAction","onSuccessAction","onTagsAction","onUploadAddedAction","props","React","CldUploadWidget_default","open","isLoading","handleOnClick","e","CldUploadButton_default","React","useRef","useEffect","useId","useState","Script","Head","getVideoPlayerOptions","playerInstances","PLAYER_VERSION","CldVideoPlayer","props","className","config","disableRemotePlayback","height","id","onDataLoad","onError","onMetadataLoad","onPause","onPlay","onEnded","width","uniqueId","useId","isScriptLoaded","setIsScriptLoaded","useState","playerInitialized","setPlayerInitialized","cloudinaryConfig","getCloudinaryConfig","playerOptions","getVideoPlayerOptions","publicId","cloudinaryRef","useRef","defaultVideoRef","videoRef","defaultPlayerRef","playerRef","playerId","playerClassName","events","handleEvent","event","activeEvent","getPlayerRefs","disposePlayer","instanceId","initializePlayer","key","handleOnLoad","useEffect","React","Head","Script","e","CldVideoPlayer_default","constructCloudinaryUrl","getCldVideoUrl","options","config","analytics","constructCloudinaryUrl","getCloudinaryConfig","getCloudinaryAnalytics"]}