{"version":3,"file":"index.js","names":[],"sources":["esm/platform/clipboard/index.js"],"sourcesContent":["import {\n  assertGetImageOptions,\n  assertGetStringOptions,\n  assertListener,\n  assertSetImage,\n  assertSetStringOptions,\n  assertSetStringText,\n  assertSetUrl\n} from \"./validate\";\nfunction webClipboard() {\n  if (typeof navigator === \"undefined\") return void 0;\n  return navigator.clipboard ?? void 0;\n}\nfunction getString(options) {\n  assertGetStringOptions(options, \"getString\");\n  return readString(options);\n}\nasync function readString(options) {\n  const clipboard = webClipboard();\n  if (!clipboard) return \"\";\n  if (options?.preferredFormat === \"html\" && typeof clipboard.read === \"function\") {\n    try {\n      for (const item of await clipboard.read()) {\n        if (item.types.includes(\"text/html\")) {\n          const blob = await item.getType(\"text/html\");\n          return await blob.text();\n        }\n      }\n    } catch {\n    }\n  }\n  if (!clipboard.readText) return \"\";\n  try {\n    return await clipboard.readText();\n  } catch {\n    return \"\";\n  }\n}\nfunction setString(text, options) {\n  assertSetStringText(text);\n  assertSetStringOptions(options, \"setString\");\n  return writeText(text, options?.inputFormat === \"html\");\n}\nasync function writeText(text, html) {\n  const clipboard = webClipboard();\n  if (!clipboard) return false;\n  if (html && typeof clipboard.write === \"function\" && typeof ClipboardItem !== \"undefined\") {\n    try {\n      await clipboard.write([\n        new ClipboardItem({\n          \"text/html\": new Blob([text], { type: \"text/html\" }),\n          \"text/plain\": new Blob([text], { type: \"text/plain\" })\n        })\n      ]);\n      return true;\n    } catch {\n    }\n  }\n  if (!clipboard.writeText) return false;\n  try {\n    await clipboard.writeText(text);\n    return true;\n  } catch {\n    return false;\n  }\n}\nasync function hasString() {\n  return (await getString()).length > 0;\n}\nfunction stripDataUriPrefix(base64Image) {\n  const comma = base64Image.indexOf(\",\");\n  if (base64Image.startsWith(\"data:\") && comma !== -1) {\n    return base64Image.slice(comma + 1);\n  }\n  return base64Image;\n}\nfunction sniffMimeType(bytes) {\n  if (bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255) {\n    return \"image/jpeg\";\n  }\n  return \"image/png\";\n}\nfunction decodeBase64(base64Image) {\n  try {\n    const binary = atob(stripDataUriPrefix(base64Image));\n    const bytes = new Uint8Array(binary.length);\n    for (let index = 0; index < binary.length; index++) {\n      bytes[index] = binary.charCodeAt(index);\n    }\n    return bytes;\n  } catch {\n    return null;\n  }\n}\nasync function convertImage(blob, format, jpegQuality) {\n  try {\n    const bitmap = await createImageBitmap(blob);\n    const width = bitmap.width;\n    const height = bitmap.height;\n    const mime = format === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\n    if (format === \"png\" && blob.type === \"image/png\" || format === \"jpeg\" && blob.type === \"image/jpeg\") {\n      bitmap.close();\n      const buffer = await blob.arrayBuffer();\n      let binary = \"\";\n      const bytes = new Uint8Array(buffer);\n      for (let index = 0; index < bytes.length; index++) {\n        binary += String.fromCharCode(bytes[index]);\n      }\n      return { dataUrl: `data:${mime};base64,${btoa(binary)}`, width, height };\n    }\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    const context = canvas.getContext(\"2d\");\n    if (!context) {\n      bitmap.close();\n      return null;\n    }\n    context.drawImage(bitmap, 0, 0);\n    bitmap.close();\n    const dataUrl = canvas.toDataURL(mime, jpegQuality);\n    return { dataUrl, width, height };\n  } catch {\n    return null;\n  }\n}\nfunction getImage(options) {\n  assertGetImageOptions(options);\n  return readImage(options);\n}\nasync function readImage(options) {\n  const clipboard = webClipboard();\n  if (!clipboard || typeof clipboard.read !== \"function\") return null;\n  try {\n    for (const item of await clipboard.read()) {\n      const type = item.types.find((entry) => entry.startsWith(\"image/\"));\n      if (!type) continue;\n      const blob = await item.getType(type);\n      const converted = await convertImage(blob, options.format, options.jpegQuality ?? 1);\n      if (converted) {\n        return { data: converted.dataUrl, size: { width: converted.width, height: converted.height } };\n      }\n    }\n  } catch {\n    return null;\n  }\n  return null;\n}\nfunction setImage(base64Image) {\n  assertSetImage(base64Image);\n  return writeImage(base64Image);\n}\nasync function writeImage(base64Image) {\n  const clipboard = webClipboard();\n  if (!clipboard || typeof clipboard.write !== \"function\" || typeof ClipboardItem === \"undefined\") {\n    return;\n  }\n  const bytes = decodeBase64(base64Image);\n  if (!bytes) return;\n  const mime = sniffMimeType(bytes);\n  const copy = new Uint8Array(bytes.length);\n  copy.set(bytes);\n  try {\n    await clipboard.write([\n      new ClipboardItem({ [mime]: new Blob([copy.buffer], { type: mime }) })\n    ]);\n  } catch {\n  }\n}\nasync function hasImage() {\n  const clipboard = webClipboard();\n  if (!clipboard || typeof clipboard.read !== \"function\") return false;\n  try {\n    for (const item of await clipboard.read()) {\n      if (item.types.some((entry) => entry.startsWith(\"image/\"))) return true;\n    }\n  } catch {\n    return false;\n  }\n  return false;\n}\nfunction getUrl() {\n  return Promise.resolve(null);\n}\nfunction setUrl(url) {\n  assertSetUrl(url);\n  return Promise.resolve();\n}\nasync function hasUrl() {\n  return false;\n}\nconst inert = { remove: () => {\n} };\nfunction addListener(_listener) {\n  assertListener(_listener);\n  return inert;\n}\nconst Clipboard = Object.freeze({\n  getString,\n  setString,\n  hasString,\n  getImage,\n  setImage,\n  hasImage,\n  getUrl,\n  setUrl,\n  hasUrl,\n  addListener\n});\nexport {\n  Clipboard\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}