drizzle-cube 0.3.21 → 0.3.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +1 -1
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +1 -1
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +1 -1
- package/dist/adapters/{mcp-transport-B37JTeww.cjs → mcp-transport-49vIZe0U.cjs} +91 -91
- package/dist/adapters/{mcp-transport-DHBUNdYg.js → mcp-transport-CxemGJYK.js} +2379 -2344
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +1 -1
- package/dist/client/charts/chartConfigs.d.ts +21 -0
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{RetentionCombinedChart-DsWhPI0q.js → RetentionCombinedChart-DpEKFYsd.js} +3 -3
- package/dist/client/chunks/RetentionCombinedChart-DpEKFYsd.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-DcZgXtPK.js → analysis-builder-BCAr4mEO.js} +9 -9
- package/dist/client/chunks/{analysis-builder-DcZgXtPK.js.map → analysis-builder-BCAr4mEO.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-ZnrPzt_d.js → analysis-builder-shared-D-5OhHaS.js} +5 -5
- package/dist/client/chunks/{analysis-builder-shared-ZnrPzt_d.js.map → analysis-builder-shared-D-5OhHaS.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-BUc21L0U.js → chart-activity-grid-CCGyWo1c.js} +116 -106
- package/dist/client/chunks/chart-activity-grid-CCGyWo1c.js.map +1 -0
- package/dist/client/chunks/chart-area-INsj4GFi.js +233 -0
- package/dist/client/chunks/chart-area-INsj4GFi.js.map +1 -0
- package/dist/client/chunks/chart-bar-BKRPTqiM.js +228 -0
- package/dist/client/chunks/chart-bar-BKRPTqiM.js.map +1 -0
- package/dist/client/chunks/{chart-bubble-CO7qvWR9.js → chart-bubble-BGGAQQUQ.js} +2 -2
- package/dist/client/chunks/{chart-bubble-CO7qvWR9.js.map → chart-bubble-BGGAQQUQ.js.map} +1 -1
- package/dist/client/chunks/{chart-config-activity-grid-BBSNCbkb.js → chart-config-activity-grid-CAlo1cHA.js} +3 -2
- package/dist/client/chunks/{chart-config-activity-grid-BBSNCbkb.js.map → chart-config-activity-grid-CAlo1cHA.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bar-BJKGnfLt.js → chart-config-bar-soxw6m2o.js} +2 -1
- package/dist/client/chunks/chart-config-bar-soxw6m2o.js.map +1 -0
- package/dist/client/chunks/{chart-config-line-DR0ThxZy.js → chart-config-line-D5ME6w0v.js} +2 -1
- package/dist/client/chunks/chart-config-line-D5ME6w0v.js.map +1 -0
- package/dist/client/chunks/{chart-config-pie-BM5lgH-w.js → chart-config-pie-DlHa2jTy.js} +2 -1
- package/dist/client/chunks/chart-config-pie-DlHa2jTy.js.map +1 -0
- package/dist/client/chunks/{chart-config-tree-map-CLmRvvMR.js → chart-config-tree-map-IRAYf9YM.js} +3 -2
- package/dist/client/chunks/{chart-config-tree-map-CLmRvvMR.js.map → chart-config-tree-map-IRAYf9YM.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-bclSKgkZ.js → chart-data-table-BcH_h6kZ.js} +3 -3
- package/dist/client/chunks/{chart-data-table-bclSKgkZ.js.map → chart-data-table-BcH_h6kZ.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-FvDvq015.js → chart-funnel-DI8RMacf.js} +3 -3
- package/dist/client/chunks/chart-funnel-DI8RMacf.js.map +1 -0
- package/dist/client/chunks/{chart-heat-map-GpFE-PFB.js → chart-heat-map-D3xNV9ep.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-GpFE-PFB.js.map → chart-heat-map-D3xNV9ep.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-jmz-CK8X.js → chart-kpi-delta-BJMQKPor.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-jmz-CK8X.js.map → chart-kpi-delta-BJMQKPor.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-DbSmomE8.js → chart-kpi-number-B8u4tWmu.js} +2 -2
- package/dist/client/chunks/{chart-kpi-number-DbSmomE8.js.map → chart-kpi-number-B8u4tWmu.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-erI9U7PZ.js → chart-kpi-text--r1d4zAz.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-erI9U7PZ.js.map → chart-kpi-text--r1d4zAz.js.map} +1 -1
- package/dist/client/chunks/chart-line-DgFmGdWW.js +414 -0
- package/dist/client/chunks/chart-line-DgFmGdWW.js.map +1 -0
- package/dist/client/chunks/chart-pie-DC7axSwd.js +137 -0
- package/dist/client/chunks/chart-pie-DC7axSwd.js.map +1 -0
- package/dist/client/chunks/{chart-radar-BE6xsFiF.js → chart-radar-BDKgpLw5.js} +33 -33
- package/dist/client/chunks/chart-radar-BDKgpLw5.js.map +1 -0
- package/dist/client/chunks/{chart-radial-bar-BEEwtFDc.js → chart-radial-bar-BYNng7Nz.js} +7 -6
- package/dist/client/chunks/chart-radial-bar-BYNng7Nz.js.map +1 -0
- package/dist/client/chunks/{chart-sankey-Dt3KaYrH.js → chart-sankey-CpsKerey.js} +2 -2
- package/dist/client/chunks/{chart-sankey-Dt3KaYrH.js.map → chart-sankey-CpsKerey.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-gAlYkQcW.js → chart-scatter-CXqFltJg.js} +11 -11
- package/dist/client/chunks/chart-scatter-CXqFltJg.js.map +1 -0
- package/dist/client/chunks/{chart-sunburst-D0Lvdjwu.js → chart-sunburst-DSsO2CzY.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-D0Lvdjwu.js.map → chart-sunburst-DSsO2CzY.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-Bv_PYe0c.js → chart-tree-map-D_SeBBD-.js} +77 -57
- package/dist/client/chunks/chart-tree-map-D_SeBBD-.js.map +1 -0
- package/dist/client/chunks/{chartConfigRegistry-BumUIPw4.js → chartConfigRegistry-DNEbwgTc.js} +6 -6
- package/dist/client/chunks/{chartConfigRegistry-BumUIPw4.js.map → chartConfigRegistry-DNEbwgTc.js.map} +1 -1
- package/dist/client/chunks/{charts-DqWRT0TE.js → charts-CsEtJy5f.js} +17 -17
- package/dist/client/chunks/charts-CsEtJy5f.js.map +1 -0
- package/dist/client/chunks/{charts-core-BfxnhMfd.js → charts-core-8jDh3mKC.js} +64 -63
- package/dist/client/chunks/charts-core-8jDh3mKC.js.map +1 -0
- package/dist/client/chunks/{charts-loader-DCGbL50r.js → charts-loader-sNk3q8UX.js} +20 -20
- package/dist/client/chunks/{charts-loader-DCGbL50r.js.map → charts-loader-sNk3q8UX.js.map} +1 -1
- package/dist/client/chunks/{components-NmBmOEqV.js → components-BsV0_0jR.js} +3579 -2880
- package/dist/client/chunks/components-BsV0_0jR.js.map +1 -0
- package/dist/client/chunks/{hooks-D7APQ8uS.js → hooks-CKYzVf_7.js} +3 -3
- package/dist/client/chunks/{hooks-D7APQ8uS.js.map → hooks-CKYzVf_7.js.map} +1 -1
- package/dist/client/chunks/{index-CBvXpG92.js → index-_2PSgbkC.js} +270 -261
- package/dist/client/chunks/index-_2PSgbkC.js.map +1 -0
- package/dist/client/chunks/{providers-Cj7PQfXn.js → providers-BBrUJB2U.js} +2 -2
- package/dist/client/chunks/{providers-Cj7PQfXn.js.map → providers-BBrUJB2U.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-ZSi3voVl.js → useDirtyStateTracking-DDQ_Lbki.js} +2 -2
- package/dist/client/chunks/{useDirtyStateTracking-ZSi3voVl.js.map → useDirtyStateTracking-DDQ_Lbki.js.map} +1 -1
- package/dist/client/components/DrillBreadcrumb.d.ts +6 -0
- package/dist/client/components/DrillMenu.d.ts +8 -0
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/useDrillInteraction.d.ts +9 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/index.js +9 -9
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types/drill.d.ts +240 -0
- package/dist/client/types.d.ts +53 -2
- package/dist/client/utils/drillQueryBuilder.d.ts +41 -0
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +25 -25
- package/dist/server/index.d.ts +78 -0
- package/dist/server/index.js +2117 -2082
- package/package.json +1 -1
- package/dist/client/chunks/RetentionCombinedChart-DsWhPI0q.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-BUc21L0U.js.map +0 -1
- package/dist/client/chunks/chart-area-B_64FScj.js +0 -190
- package/dist/client/chunks/chart-area-B_64FScj.js.map +0 -1
- package/dist/client/chunks/chart-bar-Ctiy2tpQ.js +0 -216
- package/dist/client/chunks/chart-bar-Ctiy2tpQ.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-BJKGnfLt.js.map +0 -1
- package/dist/client/chunks/chart-config-line-DR0ThxZy.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-BM5lgH-w.js.map +0 -1
- package/dist/client/chunks/chart-funnel-FvDvq015.js.map +0 -1
- package/dist/client/chunks/chart-line-B0YOZ88n.js +0 -364
- package/dist/client/chunks/chart-line-B0YOZ88n.js.map +0 -1
- package/dist/client/chunks/chart-pie-CImB6r4F.js +0 -125
- package/dist/client/chunks/chart-pie-CImB6r4F.js.map +0 -1
- package/dist/client/chunks/chart-radar-BE6xsFiF.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-BEEwtFDc.js.map +0 -1
- package/dist/client/chunks/chart-scatter-gAlYkQcW.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-Bv_PYe0c.js.map +0 -1
- package/dist/client/chunks/charts-DqWRT0TE.js.map +0 -1
- package/dist/client/chunks/charts-core-BfxnhMfd.js.map +0 -1
- package/dist/client/chunks/components-NmBmOEqV.js.map +0 -1
- package/dist/client/chunks/index-CBvXpG92.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-_2PSgbkC.js","sources":["../../../node_modules/modern-screenshot/dist/index.mjs"],"sourcesContent":["function changeJpegDpi(uint8Array, dpi) {\n uint8Array[13] = 1;\n uint8Array[14] = dpi >> 8;\n uint8Array[15] = dpi & 255;\n uint8Array[16] = dpi >> 8;\n uint8Array[17] = dpi & 255;\n return uint8Array;\n}\n\nconst _P = \"p\".charCodeAt(0);\nconst _H = \"H\".charCodeAt(0);\nconst _Y = \"Y\".charCodeAt(0);\nconst _S = \"s\".charCodeAt(0);\nlet pngDataTable;\nfunction createPngDataTable() {\n const crcTable = new Int32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\nfunction calcCrc(uint8Array) {\n let c = -1;\n if (!pngDataTable)\n pngDataTable = createPngDataTable();\n for (let n = 0; n < uint8Array.length; n++) {\n c = pngDataTable[(c ^ uint8Array[n]) & 255] ^ c >>> 8;\n }\n return c ^ -1;\n}\nfunction searchStartOfPhys(uint8Array) {\n const length = uint8Array.length - 1;\n for (let i = length; i >= 4; i--) {\n if (uint8Array[i - 4] === 9 && uint8Array[i - 3] === _P && uint8Array[i - 2] === _H && uint8Array[i - 1] === _Y && uint8Array[i] === _S) {\n return i - 3;\n }\n }\n return 0;\n}\nfunction changePngDpi(uint8Array, dpi, overwritepHYs = false) {\n const physChunk = new Uint8Array(13);\n dpi *= 39.3701;\n physChunk[0] = _P;\n physChunk[1] = _H;\n physChunk[2] = _Y;\n physChunk[3] = _S;\n physChunk[4] = dpi >>> 24;\n physChunk[5] = dpi >>> 16;\n physChunk[6] = dpi >>> 8;\n physChunk[7] = dpi & 255;\n physChunk[8] = physChunk[4];\n physChunk[9] = physChunk[5];\n physChunk[10] = physChunk[6];\n physChunk[11] = physChunk[7];\n physChunk[12] = 1;\n const crc = calcCrc(physChunk);\n const crcChunk = new Uint8Array(4);\n crcChunk[0] = crc >>> 24;\n crcChunk[1] = crc >>> 16;\n crcChunk[2] = crc >>> 8;\n crcChunk[3] = crc & 255;\n if (overwritepHYs) {\n const startingIndex = searchStartOfPhys(uint8Array);\n uint8Array.set(physChunk, startingIndex);\n uint8Array.set(crcChunk, startingIndex + 13);\n return uint8Array;\n } else {\n const chunkLength = new Uint8Array(4);\n chunkLength[0] = 0;\n chunkLength[1] = 0;\n chunkLength[2] = 0;\n chunkLength[3] = 9;\n const finalHeader = new Uint8Array(54);\n finalHeader.set(uint8Array, 0);\n finalHeader.set(chunkLength, 33);\n finalHeader.set(physChunk, 37);\n finalHeader.set(crcChunk, 50);\n return finalHeader;\n }\n}\nconst b64PhysSignature1 = \"AAlwSFlz\";\nconst b64PhysSignature2 = \"AAAJcEhZ\";\nconst b64PhysSignature3 = \"AAAACXBI\";\nfunction detectPhysChunkFromDataUrl(dataUrl) {\n let b64index = dataUrl.indexOf(b64PhysSignature1);\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature2);\n }\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature3);\n }\n return b64index;\n}\n\nconst PREFIX = \"[modern-screenshot]\";\nconst IN_BROWSER = typeof window !== \"undefined\";\nconst SUPPORT_WEB_WORKER = IN_BROWSER && \"Worker\" in window;\nconst SUPPORT_ATOB = IN_BROWSER && \"atob\" in window;\nconst SUPPORT_BTOA = IN_BROWSER && \"btoa\" in window;\nconst USER_AGENT = IN_BROWSER ? window.navigator?.userAgent : \"\";\nconst IN_CHROME = USER_AGENT.includes(\"Chrome\");\nconst IN_SAFARI = USER_AGENT.includes(\"AppleWebKit\") && !IN_CHROME;\nconst IN_FIREFOX = USER_AGENT.includes(\"Firefox\");\nconst isContext = (value) => value && \"__CONTEXT__\" in value;\nconst isCssFontFaceRule = (rule) => rule.constructor.name === \"CSSFontFaceRule\";\nconst isCSSImportRule = (rule) => rule.constructor.name === \"CSSImportRule\";\nconst isLayerBlockRule = (rule) => rule.constructor.name === \"CSSLayerBlockRule\";\nconst isElementNode = (node) => node.nodeType === 1;\nconst isSVGElementNode = (node) => typeof node.className === \"object\";\nconst isSVGImageElementNode = (node) => node.tagName === \"image\";\nconst isSVGUseElementNode = (node) => node.tagName === \"use\";\nconst isHTMLElementNode = (node) => isElementNode(node) && typeof node.style !== \"undefined\" && !isSVGElementNode(node);\nconst isCommentNode = (node) => node.nodeType === 8;\nconst isTextNode = (node) => node.nodeType === 3;\nconst isImageElement = (node) => node.tagName === \"IMG\";\nconst isVideoElement = (node) => node.tagName === \"VIDEO\";\nconst isCanvasElement = (node) => node.tagName === \"CANVAS\";\nconst isTextareaElement = (node) => node.tagName === \"TEXTAREA\";\nconst isInputElement = (node) => node.tagName === \"INPUT\";\nconst isStyleElement = (node) => node.tagName === \"STYLE\";\nconst isScriptElement = (node) => node.tagName === \"SCRIPT\";\nconst isSelectElement = (node) => node.tagName === \"SELECT\";\nconst isSlotElement = (node) => node.tagName === \"SLOT\";\nconst isIFrameElement = (node) => node.tagName === \"IFRAME\";\nconst consoleWarn = (...args) => console.warn(PREFIX, ...args);\nfunction supportWebp(ownerDocument) {\n const canvas = ownerDocument?.createElement?.(\"canvas\");\n if (canvas) {\n canvas.height = canvas.width = 1;\n }\n return Boolean(canvas) && \"toDataURL\" in canvas && Boolean(canvas.toDataURL(\"image/webp\").includes(\"image/webp\"));\n}\nconst isDataUrl = (url) => url.startsWith(\"data:\");\nfunction resolveUrl(url, baseUrl) {\n if (url.match(/^[a-z]+:\\/\\//i))\n return url;\n if (IN_BROWSER && url.match(/^\\/\\//))\n return window.location.protocol + url;\n if (url.match(/^[a-z]+:/i))\n return url;\n if (!IN_BROWSER)\n return url;\n const doc = getDocument().implementation.createHTMLDocument();\n const base = doc.createElement(\"base\");\n const a = doc.createElement(\"a\");\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl)\n base.href = baseUrl;\n a.href = url;\n return a.href;\n}\nfunction getDocument(target) {\n return (target && isElementNode(target) ? target?.ownerDocument : target) ?? window.document;\n}\nconst XMLNS = \"http://www.w3.org/2000/svg\";\nfunction createSvg(width, height, ownerDocument) {\n const svg = getDocument(ownerDocument).createElementNS(XMLNS, \"svg\");\n svg.setAttributeNS(null, \"width\", width.toString());\n svg.setAttributeNS(null, \"height\", height.toString());\n svg.setAttributeNS(null, \"viewBox\", `0 0 ${width} ${height}`);\n return svg;\n}\nfunction svgToDataUrl(svg, removeControlCharacter) {\n let xhtml = new XMLSerializer().serializeToString(svg);\n if (removeControlCharacter) {\n xhtml = xhtml.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu, \"\");\n }\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(xhtml)}`;\n}\nasync function canvasToBlob(canvas, type = \"image/png\", quality = 1) {\n try {\n return await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Blob is null\"));\n }\n }, type, quality);\n });\n } catch (error) {\n if (SUPPORT_ATOB) {\n return dataUrlToBlob(canvas.toDataURL(type, quality));\n }\n throw error;\n }\n}\nfunction dataUrlToBlob(dataUrl) {\n const [header, base64] = dataUrl.split(\",\");\n const type = header.match(/data:(.+);/)?.[1] ?? void 0;\n const decoded = window.atob(base64);\n const length = decoded.length;\n const buffer = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n buffer[i] = decoded.charCodeAt(i);\n }\n return new Blob([buffer], { type });\n}\nfunction readBlob(blob, type) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = () => reject(reader.error);\n reader.onabort = () => reject(new Error(`Failed read blob to ${type}`));\n if (type === \"dataUrl\") {\n reader.readAsDataURL(blob);\n } else if (type === \"arrayBuffer\") {\n reader.readAsArrayBuffer(blob);\n }\n });\n}\nconst blobToDataUrl = (blob) => readBlob(blob, \"dataUrl\");\nconst blobToArrayBuffer = (blob) => readBlob(blob, \"arrayBuffer\");\nfunction createImage(url, ownerDocument) {\n const img = getDocument(ownerDocument).createElement(\"img\");\n img.decoding = \"sync\";\n img.loading = \"eager\";\n img.src = url;\n return img;\n}\nfunction loadMedia(media, options) {\n return new Promise((resolve) => {\n const { timeout, ownerDocument, onError: userOnError, onWarn } = options ?? {};\n const node = typeof media === \"string\" ? createImage(media, getDocument(ownerDocument)) : media;\n let timer = null;\n let removeEventListeners = null;\n function onResolve() {\n resolve(node);\n timer && clearTimeout(timer);\n removeEventListeners?.();\n }\n if (timeout) {\n timer = setTimeout(onResolve, timeout);\n }\n if (isVideoElement(node)) {\n const currentSrc = node.currentSrc || node.src;\n if (!currentSrc) {\n if (node.poster) {\n return loadMedia(node.poster, options).then(resolve);\n }\n return onResolve();\n }\n if (node.readyState >= 2) {\n return onResolve();\n }\n const onLoadeddata = onResolve;\n const onError = (error) => {\n onWarn?.(\n \"Failed video load\",\n currentSrc,\n error\n );\n userOnError?.(error);\n onResolve();\n };\n removeEventListeners = () => {\n node.removeEventListener(\"loadeddata\", onLoadeddata);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"loadeddata\", onLoadeddata, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n } else {\n const currentSrc = isSVGImageElementNode(node) ? node.href.baseVal : node.currentSrc || node.src;\n if (!currentSrc) {\n return onResolve();\n }\n const onLoad = async () => {\n if (isImageElement(node) && \"decode\" in node) {\n try {\n await node.decode();\n } catch (error) {\n onWarn?.(\n \"Failed to decode image, trying to render anyway\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n }\n }\n onResolve();\n };\n const onError = (error) => {\n onWarn?.(\n \"Failed image load\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n onResolve();\n };\n if (isImageElement(node) && node.complete) {\n return onLoad();\n }\n removeEventListeners = () => {\n node.removeEventListener(\"load\", onLoad);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"load\", onLoad, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n }\n });\n}\nasync function waitUntilLoad(node, options) {\n if (isHTMLElementNode(node)) {\n if (isImageElement(node) || isVideoElement(node)) {\n await loadMedia(node, options);\n } else {\n await Promise.all(\n [\"img\", \"video\"].flatMap((selectors) => {\n return Array.from(node.querySelectorAll(selectors)).map((el) => loadMedia(el, options));\n })\n );\n }\n }\n}\nconst uuid = /* @__PURE__ */ function uuid2() {\n let counter = 0;\n const random = () => `0000${(Math.random() * 36 ** 4 << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n}();\nfunction splitFontFamily(fontFamily) {\n return fontFamily?.split(\",\").map((val) => val.trim().replace(/\"|'/g, \"\").toLowerCase()).filter(Boolean);\n}\n\nlet uid = 0;\nfunction createLogger(debug) {\n const prefix = `${PREFIX}[#${uid}]`;\n uid++;\n return {\n // eslint-disable-next-line no-console\n time: (label) => debug && console.time(`${prefix} ${label}`),\n // eslint-disable-next-line no-console\n timeEnd: (label) => debug && console.timeEnd(`${prefix} ${label}`),\n warn: (...args) => debug && consoleWarn(...args)\n };\n}\n\nfunction getDefaultRequestInit(bypassingCache) {\n return {\n cache: bypassingCache ? \"no-cache\" : \"force-cache\"\n };\n}\n\nasync function orCreateContext(node, options) {\n return isContext(node) ? node : createContext(node, { ...options, autoDestruct: true });\n}\nasync function createContext(node, options) {\n const { scale = 1, workerUrl, workerNumber = 1 } = options || {};\n const debug = Boolean(options?.debug);\n const features = options?.features ?? true;\n const ownerDocument = node.ownerDocument ?? (IN_BROWSER ? window.document : void 0);\n const ownerWindow = node.ownerDocument?.defaultView ?? (IN_BROWSER ? window : void 0);\n const requests = /* @__PURE__ */ new Map();\n const context = {\n // Options\n width: 0,\n height: 0,\n quality: 1,\n type: \"image/png\",\n scale,\n backgroundColor: null,\n style: null,\n filter: null,\n maximumCanvasSize: 0,\n timeout: 3e4,\n progress: null,\n debug,\n fetch: {\n requestInit: getDefaultRequestInit(options?.fetch?.bypassingCache),\n placeholderImage: \"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",\n bypassingCache: false,\n ...options?.fetch\n },\n fetchFn: null,\n font: {},\n drawImageInterval: 100,\n workerUrl: null,\n workerNumber,\n onCloneEachNode: null,\n onCloneNode: null,\n onEmbedNode: null,\n onCreateForeignObjectSvg: null,\n includeStyleProperties: null,\n autoDestruct: false,\n ...options,\n // InternalContext\n __CONTEXT__: true,\n log: createLogger(debug),\n node,\n ownerDocument,\n ownerWindow,\n dpi: scale === 1 ? null : 96 * scale,\n svgStyleElement: createStyleElement(ownerDocument),\n svgDefsElement: ownerDocument?.createElementNS(XMLNS, \"defs\"),\n svgStyles: /* @__PURE__ */ new Map(),\n defaultComputedStyles: /* @__PURE__ */ new Map(),\n workers: [\n ...Array.from({\n length: SUPPORT_WEB_WORKER && workerUrl && workerNumber ? workerNumber : 0\n })\n ].map(() => {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = async (event) => {\n const { url, result } = event.data;\n if (result) {\n requests.get(url)?.resolve?.(result);\n } else {\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n }\n };\n worker.onmessageerror = (event) => {\n const { url } = event.data;\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n };\n return worker;\n } catch (error) {\n context.log.warn(\"Failed to new Worker\", error);\n return null;\n }\n }).filter(Boolean),\n fontFamilies: /* @__PURE__ */ new Map(),\n fontCssTexts: /* @__PURE__ */ new Map(),\n acceptOfImage: `${[\n supportWebp(ownerDocument) && \"image/webp\",\n \"image/svg+xml\",\n \"image/*\",\n \"*/*\"\n ].filter(Boolean).join(\",\")};q=0.8`,\n requests,\n drawImageCount: 0,\n tasks: [],\n features,\n isEnable: (key) => {\n if (key === \"restoreScrollPosition\") {\n return typeof features === \"boolean\" ? false : features[key] ?? false;\n }\n if (typeof features === \"boolean\") {\n return features;\n }\n return features[key] ?? true;\n },\n shadowRoots: []\n };\n context.log.time(\"wait until load\");\n await waitUntilLoad(node, { timeout: context.timeout, onWarn: context.log.warn });\n context.log.timeEnd(\"wait until load\");\n const { width, height } = resolveBoundingBox(node, context);\n context.width = width;\n context.height = height;\n return context;\n}\nfunction createStyleElement(ownerDocument) {\n if (!ownerDocument)\n return void 0;\n const style = ownerDocument.createElement(\"style\");\n const cssText = style.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);\n style.appendChild(cssText);\n return style;\n}\nfunction resolveBoundingBox(node, context) {\n let { width, height } = context;\n if (isElementNode(node) && (!width || !height)) {\n const box = node.getBoundingClientRect();\n width = width || box.width || Number(node.getAttribute(\"width\")) || 0;\n height = height || box.height || Number(node.getAttribute(\"height\")) || 0;\n }\n return { width, height };\n}\n\nasync function imageToCanvas(image, context) {\n const {\n log,\n timeout,\n drawImageCount,\n drawImageInterval\n } = context;\n log.time(\"image to canvas\");\n const loaded = await loadMedia(image, { timeout, onWarn: context.log.warn });\n const { canvas, context2d } = createCanvas(image.ownerDocument, context);\n const drawImage = () => {\n try {\n context2d?.drawImage(loaded, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to drawImage\", error);\n }\n };\n drawImage();\n if (context.isEnable(\"fixSvgXmlDecode\")) {\n for (let i = 0; i < drawImageCount; i++) {\n await new Promise((resolve) => {\n setTimeout(() => {\n context2d?.clearRect(0, 0, canvas.width, canvas.height);\n drawImage();\n resolve();\n }, i + drawImageInterval);\n });\n }\n }\n context.drawImageCount = 0;\n log.timeEnd(\"image to canvas\");\n return canvas;\n}\nfunction createCanvas(ownerDocument, context) {\n const { width, height, scale, backgroundColor, maximumCanvasSize: max } = context;\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n if (max) {\n if (canvas.width > max || canvas.height > max) {\n if (canvas.width > max && canvas.height > max) {\n if (canvas.width > canvas.height) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n } else if (canvas.width > max) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n }\n }\n const context2d = canvas.getContext(\"2d\");\n if (context2d && backgroundColor) {\n context2d.fillStyle = backgroundColor;\n context2d.fillRect(0, 0, canvas.width, canvas.height);\n }\n return { canvas, context2d };\n}\n\nfunction cloneCanvas(canvas, context) {\n if (canvas.ownerDocument) {\n try {\n const dataURL = canvas.toDataURL();\n if (dataURL !== \"data:,\") {\n return createImage(dataURL, canvas.ownerDocument);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n }\n const cloned = canvas.cloneNode(false);\n const ctx = canvas.getContext(\"2d\");\n const clonedCtx = cloned.getContext(\"2d\");\n try {\n if (ctx && clonedCtx) {\n clonedCtx.putImageData(\n ctx.getImageData(0, 0, canvas.width, canvas.height),\n 0,\n 0\n );\n }\n return cloned;\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n return cloned;\n}\n\nfunction cloneIframe(iframe, context) {\n try {\n if (iframe?.contentDocument?.body) {\n return cloneNode(iframe.contentDocument.body, context);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone iframe\", error);\n }\n return iframe.cloneNode(false);\n}\n\nfunction cloneImage(image) {\n const cloned = image.cloneNode(false);\n if (image.currentSrc && image.currentSrc !== image.src) {\n cloned.src = image.currentSrc;\n cloned.srcset = \"\";\n }\n if (cloned.loading === \"lazy\") {\n cloned.loading = \"eager\";\n }\n return cloned;\n}\n\nasync function cloneVideo(video, context) {\n if (video.ownerDocument && !video.currentSrc && video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n const cloned = video.cloneNode(false);\n cloned.crossOrigin = \"anonymous\";\n if (video.currentSrc && video.currentSrc !== video.src) {\n cloned.src = video.currentSrc;\n }\n const ownerDocument = cloned.ownerDocument;\n if (ownerDocument) {\n let canPlay = true;\n await loadMedia(cloned, { onError: () => canPlay = false, onWarn: context.log.warn });\n if (!canPlay) {\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n cloned.currentTime = video.currentTime;\n await new Promise((resolve) => {\n cloned.addEventListener(\"seeked\", resolve, { once: true });\n });\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = video.offsetWidth;\n canvas.height = video.offsetHeight;\n try {\n const ctx = canvas.getContext(\"2d\");\n if (ctx)\n ctx.drawImage(cloned, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to clone video\", error);\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n return cloneCanvas(canvas, context);\n }\n return cloned;\n}\n\nfunction cloneElement(node, context) {\n if (isCanvasElement(node)) {\n return cloneCanvas(node, context);\n }\n if (isIFrameElement(node)) {\n return cloneIframe(node, context);\n }\n if (isImageElement(node)) {\n return cloneImage(node);\n }\n if (isVideoElement(node)) {\n return cloneVideo(node, context);\n }\n return node.cloneNode(false);\n}\n\nfunction getSandBox(context) {\n let sandbox = context.sandbox;\n if (!sandbox) {\n const { ownerDocument } = context;\n try {\n if (ownerDocument) {\n sandbox = ownerDocument.createElement(\"iframe\");\n sandbox.id = `__SANDBOX__${uuid()}`;\n sandbox.width = \"0\";\n sandbox.height = \"0\";\n sandbox.style.visibility = \"hidden\";\n sandbox.style.position = \"fixed\";\n ownerDocument.body.appendChild(sandbox);\n sandbox.srcdoc = '<!DOCTYPE html><meta charset=\"UTF-8\"><title></title><body>';\n context.sandbox = sandbox;\n }\n } catch (error) {\n context.log.warn(\"Failed to getSandBox\", error);\n }\n }\n return sandbox;\n}\n\nconst ignoredStyles = [\n \"width\",\n \"height\",\n \"-webkit-text-fill-color\"\n];\nconst includedAttributes = [\n \"stroke\",\n \"fill\"\n];\nfunction getDefaultStyle(node, pseudoElement, context) {\n const { defaultComputedStyles } = context;\n const nodeName = node.nodeName.toLowerCase();\n const isSvgNode = isSVGElementNode(node) && nodeName !== \"svg\";\n const attributes = isSvgNode ? includedAttributes.map((name) => [name, node.getAttribute(name)]).filter(([, value]) => value !== null) : [];\n const key = [\n isSvgNode && \"svg\",\n nodeName,\n attributes.map((name, value) => `${name}=${value}`).join(\",\"),\n pseudoElement\n ].filter(Boolean).join(\":\");\n if (defaultComputedStyles.has(key))\n return defaultComputedStyles.get(key);\n const sandbox = getSandBox(context);\n const sandboxWindow = sandbox?.contentWindow;\n if (!sandboxWindow)\n return /* @__PURE__ */ new Map();\n const sandboxDocument = sandboxWindow?.document;\n let root;\n let el;\n if (isSvgNode) {\n root = sandboxDocument.createElementNS(XMLNS, \"svg\");\n el = root.ownerDocument.createElementNS(root.namespaceURI, nodeName);\n attributes.forEach(([name, value]) => {\n el.setAttributeNS(null, name, value);\n });\n root.appendChild(el);\n } else {\n root = el = sandboxDocument.createElement(nodeName);\n }\n el.textContent = \" \";\n sandboxDocument.body.appendChild(root);\n const computedStyle = sandboxWindow.getComputedStyle(el, pseudoElement);\n const styles = /* @__PURE__ */ new Map();\n for (let len = computedStyle.length, i = 0; i < len; i++) {\n const name = computedStyle.item(i);\n if (ignoredStyles.includes(name))\n continue;\n styles.set(name, computedStyle.getPropertyValue(name));\n }\n sandboxDocument.body.removeChild(root);\n defaultComputedStyles.set(key, styles);\n return styles;\n}\n\nfunction getDiffStyle(style, defaultStyle, includeStyleProperties) {\n const diffStyle = /* @__PURE__ */ new Map();\n const prefixs = [];\n const prefixTree = /* @__PURE__ */ new Map();\n if (includeStyleProperties) {\n for (const name of includeStyleProperties) {\n applyTo(name);\n }\n } else {\n for (let len = style.length, i = 0; i < len; i++) {\n const name = style.item(i);\n applyTo(name);\n }\n }\n for (let len = prefixs.length, i = 0; i < len; i++) {\n prefixTree.get(prefixs[i])?.forEach((value, name) => diffStyle.set(name, value));\n }\n function applyTo(name) {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n const subIndex = name.lastIndexOf(\"-\");\n const prefix = subIndex > -1 ? name.substring(0, subIndex) : void 0;\n if (prefix) {\n let map = prefixTree.get(prefix);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n prefixTree.set(prefix, map);\n }\n map.set(name, [value, priority]);\n }\n if (defaultStyle.get(name) === value && !priority)\n return;\n if (prefix) {\n prefixs.push(prefix);\n } else {\n diffStyle.set(name, [value, priority]);\n }\n }\n return diffStyle;\n}\n\nfunction copyCssStyles(node, cloned, isRoot, context) {\n const { ownerWindow, includeStyleProperties, currentParentNodeStyle } = context;\n const clonedStyle = cloned.style;\n const computedStyle = ownerWindow.getComputedStyle(node);\n const defaultStyle = getDefaultStyle(node, null, context);\n currentParentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, includeStyleProperties);\n style.delete(\"transition-property\");\n style.delete(\"all\");\n style.delete(\"d\");\n style.delete(\"content\");\n if (isRoot) {\n style.delete(\"margin-top\");\n style.delete(\"margin-right\");\n style.delete(\"margin-bottom\");\n style.delete(\"margin-left\");\n style.delete(\"margin-block-start\");\n style.delete(\"margin-block-end\");\n style.delete(\"margin-inline-start\");\n style.delete(\"margin-inline-end\");\n style.set(\"box-sizing\", [\"border-box\", \"\"]);\n }\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n if (IN_CHROME) {\n if (!style.has(\"font-kerning\"))\n style.set(\"font-kerning\", [\"normal\", \"\"]);\n if ((style.get(\"overflow-x\")?.[0] === \"hidden\" || style.get(\"overflow-y\")?.[0] === \"hidden\") && style.get(\"text-overflow\")?.[0] === \"ellipsis\" && node.scrollWidth === node.clientWidth) {\n style.set(\"text-overflow\", [\"clip\", \"\"]);\n }\n }\n for (let len = clonedStyle.length, i = 0; i < len; i++) {\n clonedStyle.removeProperty(clonedStyle.item(i));\n }\n style.forEach(([value, priority], name) => {\n clonedStyle.setProperty(name, value, priority);\n });\n return style;\n}\n\nfunction copyInputValue(node, cloned) {\n if (isTextareaElement(node) || isInputElement(node) || isSelectElement(node)) {\n cloned.setAttribute(\"value\", node.value);\n }\n}\n\nconst pseudoClasses = [\n \"::before\",\n \"::after\"\n // '::placeholder', TODO\n];\nconst scrollbarPseudoClasses = [\n \"::-webkit-scrollbar\",\n \"::-webkit-scrollbar-button\",\n // '::-webkit-scrollbar:horizontal', TODO\n \"::-webkit-scrollbar-thumb\",\n \"::-webkit-scrollbar-track\",\n \"::-webkit-scrollbar-track-piece\",\n // '::-webkit-scrollbar:vertical', TODO\n \"::-webkit-scrollbar-corner\",\n \"::-webkit-resizer\"\n];\nfunction copyPseudoClass(node, cloned, copyScrollbar, context, addWordToFontFamilies) {\n const { ownerWindow, svgStyleElement, svgStyles, currentNodeStyle } = context;\n if (!svgStyleElement || !ownerWindow)\n return;\n function copyBy(pseudoClass) {\n const computedStyle = ownerWindow.getComputedStyle(node, pseudoClass);\n let content = computedStyle.getPropertyValue(\"content\");\n if (!content || content === \"none\")\n return;\n addWordToFontFamilies?.(content);\n content = content.replace(/(')|(\")|(counter\\(.+\\))/g, \"\");\n const klasses = [uuid()];\n const defaultStyle = getDefaultStyle(node, pseudoClass, context);\n currentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, context.includeStyleProperties);\n style.delete(\"content\");\n style.delete(\"-webkit-locale\");\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n const cloneStyle = [\n `content: '${content}';`\n ];\n style.forEach(([value, priority], name) => {\n cloneStyle.push(`${name}: ${value}${priority ? \" !important\" : \"\"};`);\n });\n if (cloneStyle.length === 1)\n return;\n try {\n cloned.className = [cloned.className, ...klasses].join(\" \");\n } catch (err) {\n context.log.warn(\"Failed to copyPseudoClass\", err);\n return;\n }\n const cssText = cloneStyle.join(\"\\n \");\n let allClasses = svgStyles.get(cssText);\n if (!allClasses) {\n allClasses = [];\n svgStyles.set(cssText, allClasses);\n }\n allClasses.push(`.${klasses[0]}${pseudoClass}`);\n }\n pseudoClasses.forEach(copyBy);\n if (copyScrollbar)\n scrollbarPseudoClasses.forEach(copyBy);\n}\n\nconst excludeParentNodes = /* @__PURE__ */ new Set([\n \"symbol\"\n // test/fixtures/svg.symbol.html\n]);\nasync function appendChildNode(node, cloned, child, context, addWordToFontFamilies) {\n if (isElementNode(child) && (isStyleElement(child) || isScriptElement(child)))\n return;\n if (context.filter && !context.filter(child))\n return;\n if (excludeParentNodes.has(cloned.nodeName) || excludeParentNodes.has(child.nodeName)) {\n context.currentParentNodeStyle = void 0;\n } else {\n context.currentParentNodeStyle = context.currentNodeStyle;\n }\n const childCloned = await cloneNode(child, context, false, addWordToFontFamilies);\n if (context.isEnable(\"restoreScrollPosition\")) {\n restoreScrollPosition(node, childCloned);\n }\n cloned.appendChild(childCloned);\n}\nasync function cloneChildNodes(node, cloned, context, addWordToFontFamilies) {\n let firstChild = node.firstChild;\n if (isElementNode(node)) {\n if (node.shadowRoot) {\n firstChild = node.shadowRoot?.firstChild;\n context.shadowRoots.push(node.shadowRoot);\n }\n }\n for (let child = firstChild; child; child = child.nextSibling) {\n if (isCommentNode(child))\n continue;\n if (isElementNode(child) && isSlotElement(child) && typeof child.assignedNodes === \"function\") {\n const nodes = child.assignedNodes();\n for (let i = 0; i < nodes.length; i++) {\n await appendChildNode(node, cloned, nodes[i], context, addWordToFontFamilies);\n }\n } else {\n await appendChildNode(node, cloned, child, context, addWordToFontFamilies);\n }\n }\n}\nfunction restoreScrollPosition(node, chlidCloned) {\n if (!isHTMLElementNode(node) || !isHTMLElementNode(chlidCloned))\n return;\n const { scrollTop, scrollLeft } = node;\n if (!scrollTop && !scrollLeft) {\n return;\n }\n const { transform } = chlidCloned.style;\n const matrix = new DOMMatrix(transform);\n const { a, b, c, d } = matrix;\n matrix.a = 1;\n matrix.b = 0;\n matrix.c = 0;\n matrix.d = 1;\n matrix.translateSelf(-scrollLeft, -scrollTop);\n matrix.a = a;\n matrix.b = b;\n matrix.c = c;\n matrix.d = d;\n chlidCloned.style.transform = matrix.toString();\n}\nfunction applyCssStyleWithOptions(cloned, context) {\n const { backgroundColor, width, height, style: styles } = context;\n const clonedStyle = cloned.style;\n if (backgroundColor)\n clonedStyle.setProperty(\"background-color\", backgroundColor, \"important\");\n if (width)\n clonedStyle.setProperty(\"width\", `${width}px`, \"important\");\n if (height)\n clonedStyle.setProperty(\"height\", `${height}px`, \"important\");\n if (styles) {\n for (const name in styles) clonedStyle[name] = styles[name];\n }\n}\nconst NORMAL_ATTRIBUTE_RE = /^[\\w-:]+$/;\nasync function cloneNode(node, context, isRoot = false, addWordToFontFamilies) {\n const { ownerDocument, ownerWindow, fontFamilies, onCloneEachNode } = context;\n if (ownerDocument && isTextNode(node)) {\n if (addWordToFontFamilies && /\\S/.test(node.data)) {\n addWordToFontFamilies(node.data);\n }\n return ownerDocument.createTextNode(node.data);\n }\n if (ownerDocument && ownerWindow && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {\n const cloned2 = await cloneElement(node, context);\n if (context.isEnable(\"removeAbnormalAttributes\")) {\n const names = cloned2.getAttributeNames();\n for (let len = names.length, i = 0; i < len; i++) {\n const name = names[i];\n if (!NORMAL_ATTRIBUTE_RE.test(name)) {\n cloned2.removeAttribute(name);\n }\n }\n }\n const style = context.currentNodeStyle = copyCssStyles(node, cloned2, isRoot, context);\n if (isRoot)\n applyCssStyleWithOptions(cloned2, context);\n let copyScrollbar = false;\n if (context.isEnable(\"copyScrollbar\")) {\n const overflow = [\n style.get(\"overflow-x\")?.[0],\n style.get(\"overflow-y\")?.[0]\n ];\n copyScrollbar = overflow.includes(\"scroll\") || (overflow.includes(\"auto\") || overflow.includes(\"overlay\")) && (node.scrollHeight > node.clientHeight || node.scrollWidth > node.clientWidth);\n }\n const textTransform = style.get(\"text-transform\")?.[0];\n const families = splitFontFamily(style.get(\"font-family\")?.[0]);\n const addWordToFontFamilies2 = families ? (word) => {\n if (textTransform === \"uppercase\") {\n word = word.toUpperCase();\n } else if (textTransform === \"lowercase\") {\n word = word.toLowerCase();\n } else if (textTransform === \"capitalize\") {\n word = word[0].toUpperCase() + word.substring(1);\n }\n families.forEach((family) => {\n let fontFamily = fontFamilies.get(family);\n if (!fontFamily) {\n fontFamilies.set(family, fontFamily = /* @__PURE__ */ new Set());\n }\n word.split(\"\").forEach((text) => fontFamily.add(text));\n });\n } : void 0;\n copyPseudoClass(\n node,\n cloned2,\n copyScrollbar,\n context,\n addWordToFontFamilies2\n );\n copyInputValue(node, cloned2);\n if (!isVideoElement(node)) {\n await cloneChildNodes(\n node,\n cloned2,\n context,\n addWordToFontFamilies2\n );\n }\n await onCloneEachNode?.(cloned2);\n return cloned2;\n }\n const cloned = node.cloneNode(false);\n await cloneChildNodes(node, cloned, context);\n await onCloneEachNode?.(cloned);\n return cloned;\n}\n\nfunction destroyContext(context) {\n context.ownerDocument = void 0;\n context.ownerWindow = void 0;\n context.svgStyleElement = void 0;\n context.svgDefsElement = void 0;\n context.svgStyles.clear();\n context.defaultComputedStyles.clear();\n if (context.sandbox) {\n try {\n context.sandbox.remove();\n } catch (err) {\n context.log.warn(\"Failed to destroyContext\", err);\n }\n context.sandbox = void 0;\n }\n context.workers = [];\n context.fontFamilies.clear();\n context.fontCssTexts.clear();\n context.requests.clear();\n context.tasks = [];\n context.shadowRoots = [];\n}\n\nfunction baseFetch(options) {\n const { url, timeout, responseType, ...requestInit } = options;\n const controller = new AbortController();\n const timer = timeout ? setTimeout(() => controller.abort(), timeout) : void 0;\n return fetch(url, { signal: controller.signal, ...requestInit }).then((response) => {\n if (!response.ok) {\n throw new Error(\"Failed fetch, not 2xx response\", { cause: response });\n }\n switch (responseType) {\n case \"arrayBuffer\":\n return response.arrayBuffer();\n case \"dataUrl\":\n return response.blob().then(blobToDataUrl);\n case \"text\":\n default:\n return response.text();\n }\n }).finally(() => clearTimeout(timer));\n}\nfunction contextFetch(context, options) {\n const { url: rawUrl, requestType = \"text\", responseType = \"text\", imageDom } = options;\n let url = rawUrl;\n const {\n timeout,\n acceptOfImage,\n requests,\n fetchFn,\n fetch: {\n requestInit,\n bypassingCache,\n placeholderImage\n },\n font,\n workers,\n fontFamilies\n } = context;\n if (requestType === \"image\" && (IN_SAFARI || IN_FIREFOX)) {\n context.drawImageCount++;\n }\n let request = requests.get(rawUrl);\n if (!request) {\n if (bypassingCache) {\n if (bypassingCache instanceof RegExp && bypassingCache.test(url)) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + (/* @__PURE__ */ new Date()).getTime();\n }\n }\n const canFontMinify = requestType.startsWith(\"font\") && font && font.minify;\n const fontTexts = /* @__PURE__ */ new Set();\n if (canFontMinify) {\n const families = requestType.split(\";\")[1].split(\",\");\n families.forEach((family) => {\n if (!fontFamilies.has(family))\n return;\n fontFamilies.get(family).forEach((text) => fontTexts.add(text));\n });\n }\n const needFontMinify = canFontMinify && fontTexts.size;\n const baseFetchOptions = {\n url,\n timeout,\n responseType: needFontMinify ? \"arrayBuffer\" : responseType,\n headers: requestType === \"image\" ? { accept: acceptOfImage } : void 0,\n ...requestInit\n };\n request = {\n type: requestType,\n resolve: void 0,\n reject: void 0,\n response: null\n };\n request.response = (async () => {\n if (fetchFn && requestType === \"image\") {\n const result = await fetchFn(rawUrl);\n if (result)\n return result;\n }\n if (!IN_SAFARI && rawUrl.startsWith(\"http\") && workers.length) {\n return new Promise((resolve, reject) => {\n const worker = workers[requests.size & workers.length - 1];\n worker.postMessage({ rawUrl, ...baseFetchOptions });\n request.resolve = resolve;\n request.reject = reject;\n });\n }\n return baseFetch(baseFetchOptions);\n })().catch((error) => {\n requests.delete(rawUrl);\n if (requestType === \"image\" && placeholderImage) {\n context.log.warn(\"Failed to fetch image base64, trying to use placeholder image\", url);\n return typeof placeholderImage === \"string\" ? placeholderImage : placeholderImage(imageDom);\n }\n throw error;\n });\n requests.set(rawUrl, request);\n }\n return request.response;\n}\n\nasync function replaceCssUrlToDataUrl(cssText, baseUrl, context, isImage) {\n if (!hasCssUrl(cssText))\n return cssText;\n for (const [rawUrl, url] of parseCssUrls(cssText, baseUrl)) {\n try {\n const dataUrl = await contextFetch(\n context,\n {\n url,\n requestType: isImage ? \"image\" : \"text\",\n responseType: \"dataUrl\"\n }\n );\n cssText = cssText.replace(toRE(rawUrl), `$1${dataUrl}$3`);\n } catch (error) {\n context.log.warn(\"Failed to fetch css data url\", rawUrl, error);\n }\n }\n return cssText;\n}\nfunction hasCssUrl(cssText) {\n return /url\\((['\"]?)([^'\"]+?)\\1\\)/.test(cssText);\n}\nconst URL_RE = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nfunction parseCssUrls(cssText, baseUrl) {\n const result = [];\n cssText.replace(URL_RE, (raw, quotation, url) => {\n result.push([url, resolveUrl(url, baseUrl)]);\n return raw;\n });\n return result.filter(([url]) => !isDataUrl(url));\n}\nfunction toRE(url) {\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, \"g\");\n}\n\nconst properties = [\n \"background-image\",\n \"border-image-source\",\n \"-webkit-border-image\",\n \"-webkit-mask-image\",\n \"list-style-image\"\n];\nfunction embedCssStyleImage(style, context) {\n return properties.map((property) => {\n const value = style.getPropertyValue(property);\n if (!value || value === \"none\") {\n return null;\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n return replaceCssUrlToDataUrl(value, null, context, true).then((newValue) => {\n if (!newValue || value === newValue)\n return;\n style.setProperty(\n property,\n newValue,\n style.getPropertyPriority(property)\n );\n });\n }).filter(Boolean);\n}\n\nfunction embedImageElement(cloned, context) {\n if (isImageElement(cloned)) {\n const originalSrc = cloned.currentSrc || cloned.src;\n if (!isDataUrl(originalSrc)) {\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.srcset = \"\";\n cloned.dataset.originalSrc = originalSrc;\n cloned.src = url || \"\";\n })\n ];\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n } else if (isSVGElementNode(cloned) && !isDataUrl(cloned.href.baseVal)) {\n const originalSrc = cloned.href.baseVal;\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.dataset.originalSrc = originalSrc;\n cloned.href.baseVal = url || \"\";\n })\n ];\n }\n return [];\n}\n\nfunction embedSvgUse(cloned, context) {\n const { ownerDocument, svgDefsElement } = context;\n const href = cloned.getAttribute(\"href\") ?? cloned.getAttribute(\"xlink:href\");\n if (!href)\n return [];\n const [svgUrl, id] = href.split(\"#\");\n if (id) {\n const query = `#${id}`;\n const definition = context.shadowRoots.reduce(\n (res, root) => {\n return res ?? root.querySelector(`svg ${query}`);\n },\n ownerDocument?.querySelector(`svg ${query}`)\n );\n if (svgUrl) {\n cloned.setAttribute(\"href\", query);\n }\n if (svgDefsElement?.querySelector(query))\n return [];\n if (definition) {\n svgDefsElement?.appendChild(definition.cloneNode(true));\n return [];\n } else if (svgUrl) {\n return [\n contextFetch(context, {\n url: svgUrl,\n responseType: \"text\"\n }).then((svgData) => {\n svgDefsElement?.insertAdjacentHTML(\"beforeend\", svgData);\n })\n ];\n }\n }\n return [];\n}\n\nfunction embedNode(cloned, context) {\n const { tasks } = context;\n if (isElementNode(cloned)) {\n if (isImageElement(cloned) || isSVGImageElementNode(cloned)) {\n tasks.push(...embedImageElement(cloned, context));\n }\n if (isSVGUseElementNode(cloned)) {\n tasks.push(...embedSvgUse(cloned, context));\n }\n }\n if (isHTMLElementNode(cloned)) {\n tasks.push(...embedCssStyleImage(cloned.style, context));\n }\n cloned.childNodes.forEach((child) => {\n embedNode(child, context);\n });\n}\n\nasync function embedWebFont(clone, context) {\n const {\n ownerDocument,\n svgStyleElement,\n fontFamilies,\n fontCssTexts,\n tasks,\n font\n } = context;\n if (!ownerDocument || !svgStyleElement || !fontFamilies.size) {\n return;\n }\n if (font && font.cssText) {\n const cssText = filterPreferredFormat(font.cssText, context);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n const styleSheets = Array.from(ownerDocument.styleSheets).filter((styleSheet) => {\n try {\n return \"cssRules\" in styleSheet && Boolean(styleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(`Error while reading CSS rules from ${styleSheet.href}`, error);\n return false;\n }\n });\n await Promise.all(\n styleSheets.flatMap((styleSheet) => {\n return Array.from(styleSheet.cssRules).map(async (cssRule, index) => {\n if (isCSSImportRule(cssRule)) {\n let importIndex = index + 1;\n const baseUrl = cssRule.href;\n let cssText = \"\";\n try {\n cssText = await contextFetch(context, {\n url: baseUrl,\n requestType: \"text\",\n responseType: \"text\"\n });\n } catch (error) {\n context.log.warn(`Error fetch remote css import from ${baseUrl}`, error);\n }\n const replacedCssText = cssText.replace(\n URL_RE,\n (raw, quotation, url) => raw.replace(url, resolveUrl(url, baseUrl))\n );\n for (const rule of parseCss(replacedCssText)) {\n try {\n styleSheet.insertRule(\n rule,\n rule.startsWith(\"@import\") ? importIndex += 1 : styleSheet.cssRules.length\n );\n } catch (error) {\n context.log.warn(\"Error inserting rule from remote css import\", { rule, error });\n }\n }\n }\n });\n })\n );\n const cssRules = [];\n styleSheets.forEach((sheet) => {\n unwrapCssLayers(sheet.cssRules, cssRules);\n });\n cssRules.filter((cssRule) => isCssFontFaceRule(cssRule) && hasCssUrl(cssRule.style.getPropertyValue(\"src\")) && splitFontFamily(cssRule.style.getPropertyValue(\"font-family\"))?.some((val) => fontFamilies.has(val))).forEach((value) => {\n const rule = value;\n const cssText = fontCssTexts.get(rule.cssText);\n if (cssText) {\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n tasks.push(\n replaceCssUrlToDataUrl(\n rule.cssText,\n rule.parentStyleSheet ? rule.parentStyleSheet.href : null,\n context\n ).then((cssText2) => {\n cssText2 = filterPreferredFormat(cssText2, context);\n fontCssTexts.set(rule.cssText, cssText2);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText2}\n`));\n })\n );\n }\n });\n }\n}\nconst COMMENTS_RE = /(\\/\\*[\\s\\S]*?\\*\\/)/g;\nconst KEYFRAMES_RE = /((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;\nfunction parseCss(source) {\n if (source == null)\n return [];\n const result = [];\n let cssText = source.replace(COMMENTS_RE, \"\");\n while (true) {\n const matches = KEYFRAMES_RE.exec(cssText);\n if (!matches)\n break;\n result.push(matches[0]);\n }\n cssText = cssText.replace(KEYFRAMES_RE, \"\");\n const IMPORT_RE = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n const UNIFIED_RE = new RegExp(\n // eslint-disable-next-line\n \"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\n \"gi\"\n );\n while (true) {\n let matches = IMPORT_RE.exec(cssText);\n if (!matches) {\n matches = UNIFIED_RE.exec(cssText);\n if (!matches) {\n break;\n } else {\n IMPORT_RE.lastIndex = UNIFIED_RE.lastIndex;\n }\n } else {\n UNIFIED_RE.lastIndex = IMPORT_RE.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nconst URL_WITH_FORMAT_RE = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_RE = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction filterPreferredFormat(str, context) {\n const { font } = context;\n const preferredFormat = font ? font?.preferredFormat : void 0;\n return preferredFormat ? str.replace(FONT_SRC_RE, (match) => {\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_RE.exec(match) || [];\n if (!format)\n return \"\";\n if (format === preferredFormat)\n return `src: ${src};`;\n }\n }) : str;\n}\nfunction unwrapCssLayers(rules, out = []) {\n for (const rule of Array.from(rules)) {\n if (isLayerBlockRule(rule)) {\n out.push(...unwrapCssLayers(rule.cssRules));\n } else if (\"cssRules\" in rule) {\n unwrapCssLayers(rule.cssRules, out);\n } else {\n out.push(rule);\n }\n }\n return out;\n}\n\nasync function domToForeignObjectSvg(node, options) {\n const context = await orCreateContext(node, options);\n if (isElementNode(context.node) && isSVGElementNode(context.node))\n return context.node;\n const {\n ownerDocument,\n log,\n tasks,\n svgStyleElement,\n svgDefsElement,\n svgStyles,\n font,\n progress,\n autoDestruct,\n onCloneNode,\n onEmbedNode,\n onCreateForeignObjectSvg\n } = context;\n log.time(\"clone node\");\n const clone = await cloneNode(context.node, context, true);\n if (svgStyleElement && ownerDocument) {\n let allCssText = \"\";\n svgStyles.forEach((klasses, cssText) => {\n allCssText += `${klasses.join(\",\\n\")} {\n ${cssText}\n}\n`;\n });\n svgStyleElement.appendChild(ownerDocument.createTextNode(allCssText));\n }\n log.timeEnd(\"clone node\");\n await onCloneNode?.(clone);\n if (font !== false && isElementNode(clone)) {\n log.time(\"embed web font\");\n await embedWebFont(clone, context);\n log.timeEnd(\"embed web font\");\n }\n log.time(\"embed node\");\n embedNode(clone, context);\n const count = tasks.length;\n let current = 0;\n const runTask = async () => {\n while (true) {\n const task = tasks.pop();\n if (!task)\n break;\n try {\n await task;\n } catch (error) {\n context.log.warn(\"Failed to run task\", error);\n }\n progress?.(++current, count);\n }\n };\n progress?.(current, count);\n await Promise.all([...Array.from({ length: 4 })].map(runTask));\n log.timeEnd(\"embed node\");\n await onEmbedNode?.(clone);\n const svg = createForeignObjectSvg(clone, context);\n svgDefsElement && svg.insertBefore(svgDefsElement, svg.children[0]);\n svgStyleElement && svg.insertBefore(svgStyleElement, svg.children[0]);\n autoDestruct && destroyContext(context);\n await onCreateForeignObjectSvg?.(svg);\n return svg;\n}\nfunction createForeignObjectSvg(clone, context) {\n const { width, height } = context;\n const svg = createSvg(width, height, clone.ownerDocument);\n const foreignObject = svg.ownerDocument.createElementNS(svg.namespaceURI, \"foreignObject\");\n foreignObject.setAttributeNS(null, \"x\", \"0%\");\n foreignObject.setAttributeNS(null, \"y\", \"0%\");\n foreignObject.setAttributeNS(null, \"width\", \"100%\");\n foreignObject.setAttributeNS(null, \"height\", \"100%\");\n foreignObject.append(clone);\n svg.appendChild(foreignObject);\n return svg;\n}\n\nasync function domToCanvas(node, options) {\n const context = await orCreateContext(node, options);\n const svg = await domToForeignObjectSvg(context);\n const dataUrl = svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n if (!context.autoDestruct) {\n context.svgStyleElement = createStyleElement(context.ownerDocument);\n context.svgDefsElement = context.ownerDocument?.createElementNS(XMLNS, \"defs\");\n context.svgStyles.clear();\n }\n const image = createImage(dataUrl, svg.ownerDocument);\n return await imageToCanvas(image, context);\n}\n\nasync function domToBlob(node, options) {\n const context = await orCreateContext(node, options);\n const { log, type, quality, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to blob\");\n const blob = await canvasToBlob(canvas, type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi) {\n const arrayBuffer = await blobToArrayBuffer(blob.slice(0, 33));\n let uint8Array = new Uint8Array(arrayBuffer);\n if (type === \"image/png\") {\n uint8Array = changePngDpi(uint8Array, dpi);\n } else if (type === \"image/jpeg\") {\n uint8Array = changeJpegDpi(uint8Array, dpi);\n }\n log.timeEnd(\"canvas to blob\");\n return new Blob([uint8Array, blob.slice(33)], { type });\n }\n log.timeEnd(\"canvas to blob\");\n return blob;\n}\n\nasync function domToDataUrl(node, options) {\n const context = await orCreateContext(node, options);\n const { log, quality, type, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to data url\");\n let dataUrl = canvas.toDataURL(type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi && SUPPORT_ATOB && SUPPORT_BTOA) {\n const [format, body] = dataUrl.split(\",\");\n let headerLength = 0;\n let overwritepHYs = false;\n if (type === \"image/png\") {\n const b64Index = detectPhysChunkFromDataUrl(body);\n if (b64Index >= 0) {\n headerLength = Math.ceil((b64Index + 28) / 3) * 4;\n overwritepHYs = true;\n } else {\n headerLength = 33 / 3 * 4;\n }\n } else if (type === \"image/jpeg\") {\n headerLength = 18 / 3 * 4;\n }\n const stringHeader = body.substring(0, headerLength);\n const restOfData = body.substring(headerLength);\n const headerBytes = window.atob(stringHeader);\n const uint8Array = new Uint8Array(headerBytes.length);\n for (let i = 0; i < uint8Array.length; i++) {\n uint8Array[i] = headerBytes.charCodeAt(i);\n }\n const finalArray = type === \"image/png\" ? changePngDpi(uint8Array, dpi, overwritepHYs) : changeJpegDpi(uint8Array, dpi);\n const base64Header = window.btoa(String.fromCharCode(...finalArray));\n dataUrl = [format, \",\", base64Header, restOfData].join(\"\");\n }\n log.timeEnd(\"canvas to data url\");\n return dataUrl;\n}\n\nasync function domToSvg(node, options) {\n const context = await orCreateContext(node, options);\n const { width, height, ownerDocument } = context;\n const dataUrl = await domToDataUrl(context);\n const svg = createSvg(width, height, ownerDocument);\n const svgImage = svg.ownerDocument.createElementNS(svg.namespaceURI, \"image\");\n svgImage.setAttributeNS(null, \"href\", dataUrl);\n svgImage.setAttributeNS(null, \"height\", \"100%\");\n svgImage.setAttributeNS(null, \"width\", \"100%\");\n svg.appendChild(svgImage);\n return svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n}\n\nasync function domToImage(node, options) {\n const context = await orCreateContext(node, options);\n const { ownerDocument, width, height, scale, type } = context;\n const url = type === \"image/svg+xml\" ? await domToSvg(context) : await domToDataUrl(context);\n const image = createImage(url, ownerDocument);\n image.width = Math.floor(width * scale);\n image.height = Math.floor(height * scale);\n image.style.width = `${width}px`;\n image.style.height = `${height}px`;\n return image;\n}\n\nasync function domToJpeg(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/jpeg\" })\n );\n}\n\nasync function domToPixel(node, options) {\n const context = await orCreateContext(node, options);\n const canvas = await domToCanvas(context);\n return canvas.getContext(\"2d\").getImageData(0, 0, canvas.width, canvas.height).data;\n}\n\nasync function domToPng(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/png\" })\n );\n}\n\nasync function domToWebp(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/webp\" })\n );\n}\n\nexport { createContext, destroyContext, domToBlob, domToCanvas, domToDataUrl, domToForeignObjectSvg, domToImage, domToJpeg, domToPixel, domToPng, domToSvg, domToWebp, loadMedia, waitUntilLoad };\n"],"names":["changeJpegDpi","uint8Array","dpi","_P","_H","_Y","_S","pngDataTable","createPngDataTable","crcTable","n","c","k","calcCrc","searchStartOfPhys","length","i","changePngDpi","overwritepHYs","physChunk","crc","crcChunk","startingIndex","chunkLength","finalHeader","b64PhysSignature1","b64PhysSignature2","b64PhysSignature3","detectPhysChunkFromDataUrl","dataUrl","b64index","PREFIX","IN_BROWSER","SUPPORT_WEB_WORKER","SUPPORT_ATOB","SUPPORT_BTOA","USER_AGENT","IN_CHROME","IN_SAFARI","IN_FIREFOX","isContext","value","isCssFontFaceRule","rule","isCSSImportRule","isLayerBlockRule","isElementNode","node","isSVGElementNode","isSVGImageElementNode","isSVGUseElementNode","isHTMLElementNode","isCommentNode","isTextNode","isImageElement","isVideoElement","isCanvasElement","isTextareaElement","isInputElement","isStyleElement","isScriptElement","isSelectElement","isSlotElement","isIFrameElement","consoleWarn","args","supportWebp","ownerDocument","canvas","isDataUrl","url","resolveUrl","baseUrl","doc","getDocument","base","a","target","XMLNS","createSvg","width","height","svg","svgToDataUrl","removeControlCharacter","xhtml","canvasToBlob","type","quality","resolve","reject","blob","error","dataUrlToBlob","header","base64","decoded","buffer","readBlob","reader","blobToDataUrl","blobToArrayBuffer","createImage","img","loadMedia","media","options","timeout","userOnError","onWarn","timer","removeEventListeners","onResolve","currentSrc","onLoadeddata","onError","onLoad","waitUntilLoad","selectors","el","uuid","counter","random","splitFontFamily","fontFamily","val","uid","createLogger","debug","prefix","label","getDefaultRequestInit","bypassingCache","orCreateContext","createContext","scale","workerUrl","workerNumber","features","ownerWindow","requests","context","createStyleElement","worker","event","result","key","resolveBoundingBox","style","cssText","box","imageToCanvas","image","log","drawImageCount","drawImageInterval","loaded","context2d","createCanvas","drawImage","backgroundColor","max","cloneCanvas","dataURL","cloned","ctx","clonedCtx","cloneIframe","iframe","cloneNode","cloneImage","cloneVideo","video","canPlay","cloneElement","getSandBox","sandbox","ignoredStyles","includedAttributes","getDefaultStyle","pseudoElement","defaultComputedStyles","nodeName","isSvgNode","attributes","name","sandboxWindow","sandboxDocument","root","computedStyle","styles","len","getDiffStyle","defaultStyle","includeStyleProperties","diffStyle","prefixs","prefixTree","applyTo","priority","subIndex","map","copyCssStyles","isRoot","currentParentNodeStyle","clonedStyle","_","copyInputValue","pseudoClasses","scrollbarPseudoClasses","copyPseudoClass","copyScrollbar","addWordToFontFamilies","svgStyleElement","svgStyles","currentNodeStyle","copyBy","pseudoClass","content","klasses","cloneStyle","err","allClasses","excludeParentNodes","appendChildNode","child","childCloned","restoreScrollPosition","cloneChildNodes","firstChild","nodes","chlidCloned","scrollTop","scrollLeft","transform","matrix","b","d","applyCssStyleWithOptions","NORMAL_ATTRIBUTE_RE","fontFamilies","onCloneEachNode","cloned2","names","overflow","textTransform","families","addWordToFontFamilies2","word","family","text","destroyContext","baseFetch","responseType","requestInit","controller","response","contextFetch","rawUrl","requestType","imageDom","acceptOfImage","fetchFn","placeholderImage","font","workers","request","canFontMinify","fontTexts","needFontMinify","baseFetchOptions","replaceCssUrlToDataUrl","isImage","hasCssUrl","parseCssUrls","toRE","URL_RE","raw","quotation","escaped","properties","embedCssStyleImage","property","newValue","embedImageElement","originalSrc","embedSvgUse","svgDefsElement","href","svgUrl","id","query","definition","res","svgData","embedNode","tasks","embedWebFont","clone","fontCssTexts","filterPreferredFormat","styleSheets","styleSheet","cssRule","index","importIndex","replacedCssText","parseCss","cssRules","sheet","unwrapCssLayers","cssText2","COMMENTS_RE","KEYFRAMES_RE","source","matches","IMPORT_RE","UNIFIED_RE","URL_WITH_FORMAT_RE","FONT_SRC_RE","str","preferredFormat","match","src","format","rules","out","domToForeignObjectSvg","progress","autoDestruct","onCloneNode","onEmbedNode","onCreateForeignObjectSvg","allCssText","count","current","runTask","task","createForeignObjectSvg","foreignObject","domToCanvas","domToBlob","arrayBuffer","domToDataUrl","body","headerLength","b64Index","stringHeader","restOfData","headerBytes","finalArray","base64Header","domToSvg","svgImage","domToImage","domToJpeg","domToPixel","domToPng","domToWebp"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -348,7 +348,7 @@ async function S() {
|
|
|
348
348
|
if (v)
|
|
349
349
|
return y;
|
|
350
350
|
try {
|
|
351
|
-
return y = await import("./index-
|
|
351
|
+
return y = await import("./index-_2PSgbkC.js"), v = !0, y;
|
|
352
352
|
} catch {
|
|
353
353
|
return v = !0, y = null, null;
|
|
354
354
|
}
|
|
@@ -545,4 +545,4 @@ export {
|
|
|
545
545
|
oe as j,
|
|
546
546
|
Z as u
|
|
547
547
|
};
|
|
548
|
-
//# sourceMappingURL=providers-
|
|
548
|
+
//# sourceMappingURL=providers-BBrUJB2U.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers-Cj7PQfXn.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/client/BatchCoordinator.ts","../../../src/client/providers/CubeApiProvider.tsx","../../../src/client/hooks/queries/useCubeMetaQuery.ts","../../../src/client/utils/thumbnail.ts","../../../src/client/providers/CubeFeaturesProvider.tsx","../../../src/client/providers/ScrollContainerContext.tsx","../../../src/client/providers/CubeMetaContext.tsx","../../../src/client/providers/CubeMetaProvider.tsx","../../../src/client/providers/CubeProvider.tsx"],"sourcesContent":["/**\n * Minimal Cube client implementation\n * Replaces @cubejs-client/core with lighter implementation\n */\n\nimport type { CubeQuery, CubeApiOptions, CubeResultSet, ExplainResult, ExplainOptions } from '../types'\n\nexport class CubeClient {\n private apiUrl: string\n private headers: Record<string, string>\n private credentials: 'include' | 'omit' | 'same-origin'\n\n constructor(token?: string, options: CubeApiOptions = {}) {\n this.apiUrl = options.apiUrl || '/cubejs-api/v1'\n this.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n this.credentials = options.credentials ?? 'include'\n\n if (token) {\n this.headers['Authorization'] = token\n }\n }\n\n async load(query: CubeQuery, options?: { bustCache?: boolean }): Promise<CubeResultSet> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryString = JSON.stringify(query)\n const queryParam = encodeURIComponent(queryString)\n const url = `${this.apiUrl}/load?query=${queryParam}`\n\n // Build headers, optionally adding cache bust header\n const requestHeaders: Record<string, string> = {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n }\n if (options?.bustCache) {\n requestHeaders['X-Cache-Control'] = 'no-cache'\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers: requestHeaders,\n credentials: this.credentials\n })\n\n if (!response.ok) {\n let errorMessage = `Cube query failed: ${response.status}`\n try {\n const errorText = await response.text()\n // Try to parse as JSON first to get structured error\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If not JSON, use the raw text\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return new ResultSet(result)\n }\n\n async meta(): Promise<any> {\n const url = `${this.apiUrl}/meta`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.headers,\n credentials: this.credentials\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch meta: ${response.status}`)\n }\n\n return response.json()\n }\n\n async sql(query: CubeQuery): Promise<any> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/sql?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: this.credentials\n })\n\n if (!response.ok) {\n throw new Error(`SQL generation failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async dryRun(query: CubeQuery): Promise<any> {\n const url = `${this.apiUrl}/dry-run`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: this.credentials,\n body: JSON.stringify({ query })\n })\n\n if (!response.ok) {\n let errorMessage = `Dry run failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n /**\n * Execute EXPLAIN on a query to get the execution plan\n * Returns normalized plan across PostgreSQL, MySQL, and SQLite\n * Accepts standard queries, funnel queries ({ funnel: {...} }), or flow queries ({ flow: {...} })\n */\n async explain(query: CubeQuery | unknown, options?: ExplainOptions): Promise<ExplainResult> {\n const url = `${this.apiUrl}/explain`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: this.credentials,\n body: JSON.stringify({ query, options })\n })\n\n if (!response.ok) {\n let errorMessage = `Explain failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n /**\n * Execute multiple queries in a single batch request\n * Used by BatchCoordinator to optimize network requests\n * Pass { bustCache: true } to bypass server-side cache\n */\n async batchLoad(queries: CubeQuery[], options?: { bustCache?: boolean }): Promise<CubeResultSet[]> {\n const url = `${this.apiUrl}/batch`\n\n // Build headers with optional cache bypass\n const requestHeaders: Record<string, string> = { ...this.headers }\n if (options?.bustCache) {\n requestHeaders['X-Cache-Control'] = 'no-cache'\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: requestHeaders,\n credentials: this.credentials,\n body: JSON.stringify({ queries })\n })\n\n if (!response.ok) {\n let errorMessage = `Batch query failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const batchResponse = await response.json()\n\n // batchResponse.results is an array of individual query results\n // Each result may have succeeded or failed\n return batchResponse.results.map((result: any) => {\n // If this individual query failed, create a ResultSet with error info\n if (!result.success && result.error) {\n // Create a result set that will throw when accessed\n return {\n ...new ResultSet({ data: [], annotation: {} }),\n error: result.error\n }\n }\n\n // Create ResultSet from successful result\n return new ResultSet(result)\n })\n }\n}\n\n/**\n * Simple ResultSet implementation\n */\nclass ResultSet implements CubeResultSet {\n public loadResponse: any\n\n constructor(loadResponse: any) {\n this.loadResponse = loadResponse\n }\n\n rawData(): any[] {\n // Handle new nested structure: loadResponse.results[0].data\n // Keep backward compatibility with old structure: loadResponse.data\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].data || []\n }\n return this.loadResponse.data || []\n }\n\n tablePivot(): any[] {\n // For pie charts and tables, return the raw data\n return this.rawData()\n }\n\n series(): any[] {\n // Simple series implementation\n return this.rawData()\n }\n\n annotation(): any {\n // Handle new nested structure: loadResponse.results[0].annotation\n // Keep backward compatibility with old structure: loadResponse.annotation\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].annotation || {}\n }\n return this.loadResponse.annotation || {}\n }\n\n /**\n * Get cache metadata if result was served from cache\n * Returns undefined if not a cache hit\n */\n cacheInfo(): { hit: true; cachedAt: string; ttlMs: number; ttlRemainingMs: number } | undefined {\n // Handle nested structure: loadResponse.results[0].cache\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].cache\n }\n return this.loadResponse.cache\n }\n}\n\n/**\n * Factory function to create a cube client\n */\nexport function createCubeClient(token?: string, options: CubeApiOptions = {}): CubeClient {\n return new CubeClient(token, options)\n}\n\n// Legacy compatibility export\nexport function cube(token?: string, options: CubeApiOptions = {}): CubeClient {\n return createCubeClient(token, options)\n}","import type { CubeQuery, CubeResultSet } from '../types'\n\n/**\n * Represents a queued query with its resolver/rejector\n */\ninterface QueuedQuery {\n query: CubeQuery\n resolve: (result: CubeResultSet) => void\n reject: (error: Error) => void\n}\n\n/**\n * BatchCoordinator collects queries triggered in the same render cycle\n * and sends them as a single batch request to minimize network overhead.\n *\n * Uses a configurable delay (default 100ms) to batch queries from lazy-loaded\n * portlets that become visible during the same scroll action.\n */\nexport class BatchCoordinator {\n private queue: QueuedQuery[] = []\n private flushScheduled = false\n private batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>\n private delayMs: number\n\n constructor(batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>, delayMs: number = 50) {\n this.batchExecutor = batchExecutor\n this.delayMs = delayMs\n }\n\n /**\n * Register a query to be batched. Returns a promise that resolves\n * when the batch is executed and this specific query's result is available.\n */\n public register(query: CubeQuery): Promise<CubeResultSet> {\n return new Promise<CubeResultSet>((resolve, reject) => {\n // Add query to queue\n this.queue.push({ query, resolve, reject })\n\n // Schedule flush if not already scheduled\n if (!this.flushScheduled) {\n this.scheduleFlush()\n }\n })\n }\n\n /**\n * Schedule a flush after a short delay to collect multiple queries.\n * The delay allows queries from lazy-loaded portlets that become visible\n * during the same scroll action to be batched together.\n */\n private scheduleFlush(): void {\n this.flushScheduled = true\n\n setTimeout(() => {\n this.flush()\n }, this.delayMs)\n }\n\n /**\n * Execute all queued queries as a batch and resolve individual promises\n */\n private async flush(): Promise<void> {\n // Reset state\n this.flushScheduled = false\n\n // Take current queue and clear it\n const currentQueue = this.queue.slice()\n this.queue = []\n\n if (currentQueue.length === 0) {\n return\n }\n\n try {\n // Extract queries\n const queries = currentQueue.map(item => item.query)\n\n // Execute batch\n const results = await this.batchExecutor(queries)\n\n // Resolve individual promises with their corresponding results\n currentQueue.forEach((item, index) => {\n const result = results[index]\n\n // Check if this specific query had an error\n if (result && 'error' in result && result.error) {\n item.reject(new Error(result.error as string))\n } else {\n item.resolve(result)\n }\n })\n } catch (error) {\n // If entire batch fails, reject all queries\n currentQueue.forEach(item => {\n item.reject(error instanceof Error ? error : new Error(String(error)))\n })\n }\n }\n\n /**\n * Get current queue size (useful for debugging)\n */\n public getQueueSize(): number {\n return this.queue.length\n }\n\n /**\n * Clear the queue (useful for testing/cleanup)\n */\n public clear(): void {\n this.queue = []\n this.flushScheduled = false\n }\n}\n","/**\n * CubeApiProvider - Stable API Context Layer\n *\n * Provides the CubeClient API instance that only changes on authentication updates.\n * Isolated from metadata and feature contexts to prevent unnecessary re-renders.\n */\n\nimport { createContext, useContext, useState, useMemo, useCallback, useEffect, type ReactNode } from 'react'\nimport { createCubeClient, type CubeClient } from '../client/CubeClient'\nimport type { CubeQueryOptions, CubeApiOptions } from '../types'\nimport { BatchCoordinator } from '../client/BatchCoordinator'\n\ninterface CubeApiContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n}\n\nconst CubeApiContext = createContext<CubeApiContextValue | null>(null)\n\ninterface CubeApiProviderProps {\n apiOptions: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n enableBatching?: boolean\n batchDelayMs?: number\n children: ReactNode\n}\n\nexport function CubeApiProvider({\n apiOptions: initialApiOptions,\n token: initialToken,\n options = {},\n enableBatching = true,\n batchDelayMs = 50,\n children\n}: CubeApiProviderProps) {\n const baseConfig = useMemo(\n () => ({ apiOptions: initialApiOptions, token: initialToken }),\n [initialApiOptions, initialToken]\n )\n const [overrideConfig, setOverrideConfig] = useState<{\n apiOptions: CubeApiOptions\n token?: string\n } | null>(null)\n\n useEffect(() => {\n setOverrideConfig(null)\n }, [baseConfig])\n\n const config = overrideConfig ?? baseConfig\n\n // Create CubeClient - only recreates when config changes\n const cubeApi = useMemo(() =>\n createCubeClient(config.token, config.apiOptions),\n [config.apiOptions, config.token]\n )\n\n // Create BatchCoordinator - only recreates when cubeApi or batching config changes\n const batchCoordinator = useMemo(() => {\n if (!enableBatching) return null\n return new BatchCoordinator((queries) => cubeApi.batchLoad(queries), batchDelayMs)\n }, [enableBatching, cubeApi, batchDelayMs])\n\n // Stable callback for updating config\n const updateApiConfig = useCallback((newApiOptions: CubeApiOptions, newToken?: string) => {\n setOverrideConfig({ apiOptions: newApiOptions, token: newToken })\n }, [])\n\n // Memoize context value - only changes when cubeApi/options change\n const value = useMemo(() => ({\n cubeApi,\n options,\n updateApiConfig,\n batchCoordinator,\n enableBatching\n }), [cubeApi, options, updateApiConfig, batchCoordinator, enableBatching])\n\n return (\n <CubeApiContext.Provider value={value}>\n {children}\n </CubeApiContext.Provider>\n )\n}\n\nexport function useCubeApi() {\n const context = useContext(CubeApiContext)\n if (!context) {\n throw new Error('useCubeApi must be used within CubeApiProvider')\n }\n return context\n}\n","/**\n * useCubeMetaQuery - TanStack Query hook for cube metadata\n *\n * Replaces manual caching in useCubeMeta with TanStack Query's built-in\n * cache management. Provides:\n * - Automatic caching with configurable stale time\n * - Built-in loading and error states\n * - Automatic refetch on mount (if stale)\n * - Manual refetch capability\n *\n * This hook wraps the existing CubeClient.meta() method.\n */\n\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCubeApi } from '../../providers/CubeApiProvider'\nimport type { CubeMeta, FieldLabelMap } from '../../types'\n\n// Query key for cube metadata\nexport const CUBE_META_QUERY_KEY = ['cube', 'meta'] as const\n\n/**\n * Build a field label map from cube metadata\n * Maps field names to their display titles\n */\nfunction buildLabelMap(meta: CubeMeta): FieldLabelMap {\n const labelMap: FieldLabelMap = {}\n\n meta.cubes.forEach((cube) => {\n // Add measures\n cube.measures.forEach((measure) => {\n labelMap[measure.name] = measure.title || measure.shortTitle || measure.name\n })\n\n // Add dimensions\n cube.dimensions.forEach((dimension) => {\n labelMap[dimension.name] = dimension.title || dimension.shortTitle || dimension.name\n })\n\n // Add segments\n cube.segments.forEach((segment) => {\n labelMap[segment.name] = segment.title || segment.shortTitle || segment.name\n })\n })\n\n return labelMap\n}\n\nexport interface UseCubeMetaQueryOptions {\n /**\n * Whether to skip the query (useful for conditional fetching)\n * @default false\n */\n enabled?: boolean\n /**\n * Stale time in milliseconds (how long before data is considered stale)\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseCubeMetaQueryResult {\n /** Cube metadata */\n meta: CubeMeta | null\n /** Field label map for quick lookups */\n labelMap: FieldLabelMap\n /** Whether the query is loading */\n isLoading: boolean\n /** Whether the query is fetching (includes background refetch) */\n isFetching: boolean\n /** Error if the query failed */\n error: Error | null\n /** Manually refetch the metadata */\n refetch: () => void\n /** Get a field's display label */\n getFieldLabel: (fieldName: string) => string\n}\n\n/**\n * TanStack Query hook for fetching cube metadata\n *\n * Usage:\n * ```tsx\n * const { meta, labelMap, isLoading, error, refetch } = useCubeMetaQuery()\n * ```\n */\nexport function useCubeMetaQuery(\n options: UseCubeMetaQueryOptions = {}\n): UseCubeMetaQueryResult {\n const { enabled = true, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n const queryClient = useQueryClient()\n\n const query = useQuery({\n queryKey: CUBE_META_QUERY_KEY,\n queryFn: async () => {\n const metaData = await cubeApi.meta()\n const labelMap = buildLabelMap(metaData)\n return { meta: metaData, labelMap }\n },\n enabled,\n staleTime,\n // Keep data in cache for 15 minutes after it becomes unused\n gcTime: 15 * 60 * 1000,\n })\n\n // Extract data from query result\n const meta = query.data?.meta ?? null\n const labelMap = query.data?.labelMap ?? {}\n\n // Stable refetch function\n const refetch = () => {\n queryClient.invalidateQueries({ queryKey: CUBE_META_QUERY_KEY })\n }\n\n // Stable getFieldLabel function\n const getFieldLabel = (fieldName: string): string => {\n return labelMap[fieldName] || fieldName\n }\n\n return {\n meta,\n labelMap,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n getFieldLabel,\n }\n}\n\n/**\n * Prefetch cube metadata - useful for eager loading\n *\n * Usage:\n * ```tsx\n * const queryClient = useQueryClient()\n * await prefetchCubeMeta(queryClient, cubeApi)\n * ```\n */\nexport async function prefetchCubeMeta(\n queryClient: ReturnType<typeof useQueryClient>,\n cubeApi: ReturnType<typeof useCubeApi>['cubeApi']\n): Promise<void> {\n await queryClient.prefetchQuery({\n queryKey: CUBE_META_QUERY_KEY,\n queryFn: async () => {\n const metaData = await cubeApi.meta()\n const labelMap = buildLabelMap(metaData)\n return { meta: metaData, labelMap }\n },\n })\n}\n","/**\n * Dashboard Thumbnail Capture Utility\n *\n * Provides optional screenshot functionality for dashboard thumbnails.\n * Requires modern-screenshot as an optional peer dependency.\n *\n * Usage:\n * 1. Install the optional dependency: npm install modern-screenshot\n * 2. Enable in CubeProvider: features={{ thumbnail: { enabled: true } }}\n * 3. Thumbnails are automatically captured on dashboard save\n */\n\nimport type { RefObject } from 'react'\nimport type { ThumbnailFeatureConfig } from '../types'\n\n// Type definition for modern-screenshot (optional dependency)\ntype ModernScreenshotModule = {\n domToPng: (element: HTMLElement, options?: Record<string, unknown>) => Promise<string>\n domToJpeg: (element: HTMLElement, options?: Record<string, unknown>) => Promise<string>\n}\n\n// Cache the import result to avoid repeated dynamic imports\nlet screenshotModule: ModernScreenshotModule | null = null\nlet moduleChecked = false\n\n/**\n * Resize an image to the specified dimensions while maintaining quality.\n * This takes a high-resolution source and scales it down to target dimensions,\n * which produces better results than capturing at low resolution directly.\n *\n * Uses Canvas imageSmoothingQuality for best downscaling results.\n */\nfunction resizeImage(\n dataUri: string,\n targetWidth: number,\n targetHeight: number,\n format: 'png' | 'jpeg',\n quality: number\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n const canvas = document.createElement('canvas')\n canvas.width = targetWidth\n canvas.height = targetHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n reject(new Error('Failed to get canvas context'))\n return\n }\n\n // Enable high-quality image smoothing for downscaling\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n\n // Calculate aspect-ratio-preserving dimensions\n const sourceAspect = img.width / img.height\n const targetAspect = targetWidth / targetHeight\n\n let sourceX = 0\n let sourceY = 0\n let sourceWidth = img.width\n let sourceHeight = img.height\n\n // Crop source to match target aspect ratio (center crop)\n if (sourceAspect > targetAspect) {\n // Source is wider - crop horizontally\n sourceWidth = img.height * targetAspect\n sourceX = (img.width - sourceWidth) / 2\n } else if (sourceAspect < targetAspect) {\n // Source is taller - crop vertically (take from top)\n sourceHeight = img.width / targetAspect\n // Don't center - take from top for dashboard previews\n sourceY = 0\n }\n\n // Draw the scaled and cropped image\n ctx.drawImage(\n img,\n sourceX, sourceY, sourceWidth, sourceHeight, // Source region\n 0, 0, targetWidth, targetHeight // Destination (full canvas)\n )\n\n const mimeType = format === 'jpeg' ? 'image/jpeg' : 'image/png'\n resolve(canvas.toDataURL(mimeType, quality))\n }\n img.onerror = () => reject(new Error('Failed to load image for resizing'))\n img.src = dataUri\n })\n}\n\n/**\n * Check if modern-screenshot is available (installed as peer dependency)\n */\nasync function getScreenshotModule(): Promise<ModernScreenshotModule | null> {\n if (moduleChecked) {\n return screenshotModule\n }\n\n try {\n // Dynamic import - modern-screenshot is an optional peer dependency\n // @ts-ignore - modern-screenshot may not be installed\n screenshotModule = await import('modern-screenshot') as ModernScreenshotModule\n moduleChecked = true\n return screenshotModule\n } catch {\n moduleChecked = true\n screenshotModule = null\n return null\n }\n}\n\n// Extend Window interface for our warning flag\ndeclare global {\n interface Window {\n __drizzle_cube_thumbnail_warning__?: boolean\n }\n}\n\n/**\n * Log a development-mode warning when thumbnail feature is enabled but modern-screenshot is missing\n */\nexport function warnIfScreenshotLibMissing(thumbnailConfig: ThumbnailFeatureConfig | undefined): void {\n if (typeof window === 'undefined') return\n if (!thumbnailConfig?.enabled) return\n\n // Only warn once per session\n if (window.__drizzle_cube_thumbnail_warning__) return\n\n getScreenshotModule().then((mod) => {\n if (!mod && process.env.NODE_ENV === 'development') {\n console.warn(\n '[drizzle-cube] Thumbnail feature enabled but modern-screenshot not installed. ' +\n 'Run: npm install modern-screenshot'\n )\n window.__drizzle_cube_thumbnail_warning__ = true\n }\n })\n}\n\n/**\n * Capture a thumbnail of the dashboard element\n *\n * @param elementRef - React ref to the dashboard container element\n * @param config - Thumbnail configuration (dimensions, format, quality)\n * @returns Base64 data URI of the thumbnail, or null if capture failed\n */\nexport async function captureThumbnail(\n elementRef: RefObject<HTMLElement | null>,\n config: ThumbnailFeatureConfig\n): Promise<string | null> {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') {\n return null\n }\n\n // Check if the element ref is valid\n if (!elementRef.current) {\n return null\n }\n\n // Try to load modern-screenshot\n const screenshot = await getScreenshotModule()\n if (!screenshot) {\n return null\n }\n\n try {\n // Higher default dimensions for crisp thumbnails on retina displays\n // 1600x1200 provides good quality while keeping file size reasonable\n const targetWidth = config.width ?? 1600\n const targetHeight = config.height ?? 1200\n const format = config.format ?? 'png'\n const quality = config.quality ?? 0.95 // Higher default quality\n\n const element = elementRef.current\n\n // Always capture at 2x scale for high quality (like copy-to-clipboard)\n // This produces a sharp image that we then resize down\n const captureScale = 2\n\n // Get theme-aware background color (walks DOM tree to find effective bg)\n const backgroundColor = getEffectiveBackgroundColor(element)\n\n // Capture at high resolution with proper background\n const fullDataUri = await screenshot.domToPng(element, {\n scale: captureScale,\n backgroundColor,\n })\n\n // Resize to target dimensions (high-quality downscaling)\n const resizedDataUri = await resizeImage(\n fullDataUri,\n targetWidth,\n targetHeight,\n format,\n quality\n )\n\n return resizedDataUri\n } catch (error) {\n console.error('[drizzle-cube] Failed to capture thumbnail:', error)\n return null\n }\n}\n\n/**\n * Check if thumbnail capture is available and enabled\n */\nexport async function isThumbnailCaptureAvailable(\n config: ThumbnailFeatureConfig | undefined\n): Promise<boolean> {\n if (!config?.enabled) {\n return false\n }\n\n if (typeof window === 'undefined') {\n return false\n }\n\n const screenshot = await getScreenshotModule()\n return screenshot !== null\n}\n\n/**\n * Check if portlet screenshot-to-clipboard is available.\n * Requires both modern-screenshot AND Clipboard API with image support.\n */\nexport async function isPortletCopyAvailable(): Promise<boolean> {\n // Check if we're in browser environment\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check modern-screenshot is installed\n const screenshot = await getScreenshotModule()\n if (!screenshot) {\n return false\n }\n\n // Check Clipboard API supports writing images (ClipboardItem with image/png blob)\n return (\n typeof ClipboardItem !== 'undefined' &&\n typeof navigator?.clipboard?.write === 'function'\n )\n}\n\n/**\n * Check if a background color is transparent or effectively invisible\n */\nfunction isTransparentBackground(color: string): boolean {\n if (!color || color === 'transparent' || color === 'rgba(0, 0, 0, 0)') {\n return true\n }\n // Check for rgba with 0 alpha\n const rgbaMatch = color.match(/rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*([\\d.]+)\\s*\\)/)\n if (rgbaMatch && parseFloat(rgbaMatch[1]) === 0) {\n return true\n }\n return false\n}\n\n/**\n * Find the effective background color by walking up the DOM tree\n */\nfunction getEffectiveBackgroundColor(element: HTMLElement): string {\n let current: HTMLElement | null = element\n\n while (current) {\n const bg = getComputedStyle(current).backgroundColor\n if (!isTransparentBackground(bg)) {\n return bg\n }\n current = current.parentElement\n }\n\n // Fallback to theme variable or white\n const themeColor = getComputedStyle(document.documentElement)\n .getPropertyValue('--dc-surface')\n .trim()\n\n return themeColor || '#ffffff'\n}\n\n/**\n * Capture a portlet element and copy to clipboard as PNG.\n * Returns true on success, false on failure.\n *\n * @param element - The HTML element to capture\n * @returns Promise<boolean> - true if successfully copied to clipboard\n */\nexport async function copyPortletToClipboard(element: HTMLElement): Promise<boolean> {\n try {\n const screenshot = await getScreenshotModule()\n if (!screenshot) {\n console.warn('[drizzle-cube] Cannot copy portlet: modern-screenshot not available')\n return false\n }\n\n // Get theme-aware background color by walking up the DOM tree\n const backgroundColor = getEffectiveBackgroundColor(element)\n\n // Capture as PNG data URL at 2x scale for retina quality\n const dataUrl = await screenshot.domToPng(element, {\n scale: 2,\n backgroundColor,\n })\n\n // Convert data URL to blob\n const response = await fetch(dataUrl)\n const blob = await response.blob()\n\n // Write to clipboard\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })])\n\n return true\n } catch (error) {\n console.warn('[drizzle-cube] Failed to copy portlet to clipboard:', error)\n return false\n }\n}\n","/**\n * CubeFeaturesProvider - Feature Flags Context Layer\n *\n * Provides feature configuration isolated from API and metadata layers.\n * This prevents components from re-rendering when feature flags change\n * if they don't use features.\n */\n\nimport { createContext, useContext, useState, useMemo, useCallback, useEffect, type ReactNode } from 'react'\nimport type { FeaturesConfig, DashboardLayoutMode } from '../types'\nimport { warnIfScreenshotLibMissing } from '../utils/thumbnail'\n\ninterface CubeFeaturesContextValue {\n features: FeaturesConfig\n dashboardModes: DashboardLayoutMode[]\n updateFeatures: (newFeatures: Partial<FeaturesConfig>) => void\n}\n\nconst CubeFeaturesContext = createContext<CubeFeaturesContextValue | null>(null)\n\ninterface CubeFeaturesProviderProps {\n features?: FeaturesConfig\n dashboardModes?: DashboardLayoutMode[]\n children: ReactNode\n}\n\nconst DEFAULT_FEATURES: FeaturesConfig = {\n enableAI: true,\n aiEndpoint: '/api/ai/generate',\n showSchemaDiagram: false,\n useAnalysisBuilder: false,\n editToolbar: 'both',\n floatingToolbarPosition: 'right'\n}\n\nexport function CubeFeaturesProvider({\n features: initialFeatures,\n dashboardModes = ['rows', 'grid'],\n children\n}: CubeFeaturesProviderProps) {\n // Merge passed features with defaults so new features get default values\n const [features, setFeatures] = useState<FeaturesConfig>(() => ({\n ...DEFAULT_FEATURES,\n ...initialFeatures\n }))\n\n // Warn in development if thumbnail feature is enabled but modern-screenshot is not installed\n useEffect(() => {\n warnIfScreenshotLibMissing(features.thumbnail)\n }, [features.thumbnail])\n\n const updateFeatures = useCallback((newFeatures: Partial<FeaturesConfig>) => {\n setFeatures(prev => ({ ...prev, ...newFeatures }))\n }, [])\n\n const value = useMemo(() => ({\n features,\n dashboardModes,\n updateFeatures\n }), [features, dashboardModes, updateFeatures])\n\n return (\n <CubeFeaturesContext.Provider value={value}>\n {children}\n </CubeFeaturesContext.Provider>\n )\n}\n\n// Default context value when used outside provider (safe fallback for hooks)\nconst DEFAULT_CONTEXT: CubeFeaturesContextValue = {\n features: DEFAULT_FEATURES,\n dashboardModes: ['rows', 'grid'],\n updateFeatures: () => {\n // No-op when used outside provider\n }\n}\n\n/**\n * Hook to access cube features context.\n * Returns default values if used outside CubeFeaturesProvider (graceful fallback).\n */\nexport function useCubeFeatures() {\n const context = useContext(CubeFeaturesContext)\n // Return default context if not within provider (allows hooks like useCubeLoadQuery to work in isolation)\n return context ?? DEFAULT_CONTEXT\n}\n","/**\n * ScrollContainerContext\n *\n * Provides the scroll container element for lazy loading with IntersectionObserver.\n * This allows portlets to detect visibility relative to a custom scroll container\n * (not just the viewport) when the dashboard is embedded in a scrolling div.\n */\n\nimport { createContext, useContext } from 'react'\n\nconst ScrollContainerContext = createContext<HTMLElement | null>(null)\n\n/**\n * Provider component to wrap dashboard content with a scroll container reference.\n * Used by DashboardGrid and MobileStackedLayout to pass the detected scroll container\n * to child portlets.\n */\nexport const ScrollContainerProvider = ScrollContainerContext.Provider\n\n/**\n * Hook to access the scroll container element for lazy loading.\n * Returns null if using viewport (window) scroll, or the container element\n * if the dashboard is inside a scrolling container.\n */\nexport const useScrollContainer = () => useContext(ScrollContainerContext)\n","/**\n * CubeMetaContext - Metadata context definitions.\n *\n * Split from CubeMetaProvider so consumers can access metadata context\n * without pulling in TanStack Query dependencies.\n */\n\nimport { createContext, useContext } from 'react'\nimport type { CubeMeta, FieldLabelMap } from '../types'\n\nexport interface CubeMetaContextValue {\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n}\n\nexport const CubeMetaContext = createContext<CubeMetaContextValue | null>(null)\n\nexport function useCubeMeta() {\n const context = useContext(CubeMetaContext)\n if (!context) {\n throw new Error('useCubeMeta must be used within CubeMetaProvider')\n }\n return context\n}\n","/**\n * CubeMetaProvider - Metadata Context Layer\n *\n * Provides cube metadata (meta, labelMap) isolated from API layer.\n * This prevents components from re-rendering when metadata loads\n * if they only need API access.\n *\n * Uses TanStack Query for metadata fetching with built-in caching.\n */\n\nimport { useCallback, useMemo, type ReactNode } from 'react'\nimport { useCubeMetaQuery } from '../hooks/queries/useCubeMetaQuery'\nimport { CubeMetaContext } from './CubeMetaContext'\n\ninterface CubeMetaProviderProps {\n children: ReactNode\n}\n\nexport function CubeMetaProvider({ children }: CubeMetaProviderProps) {\n // Use TanStack Query hook for metadata fetching\n const {\n meta,\n labelMap,\n isLoading: metaLoading,\n error,\n refetch,\n getFieldLabel: getFieldLabelFromQuery\n } = useCubeMetaQuery()\n\n // Convert error to string for backward compatibility\n const metaError = error ? (error instanceof Error ? error.message : String(error)) : null\n\n // Wrap refetch to match expected signature\n const refetchMeta = useCallback(() => {\n refetch()\n }, [refetch])\n\n // Create stable getFieldLabel that reads from current labelMap\n const getFieldLabel = useCallback((fieldName: string): string => {\n return getFieldLabelFromQuery(fieldName)\n }, [getFieldLabelFromQuery])\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(() => ({\n meta,\n labelMap,\n metaLoading,\n metaError,\n getFieldLabel,\n refetchMeta\n }), [meta, labelMap, metaLoading, metaError, getFieldLabel, refetchMeta])\n\n return (\n <CubeMetaContext.Provider value={value}>\n {children}\n </CubeMetaContext.Provider>\n )\n}\n","/**\n * CubeProvider - Backward Compatibility Wrapper\n *\n * This provider wraps the three specialized context providers (API, Meta, Features)\n * to maintain 100% backward compatibility with existing code using useCubeContext().\n *\n * New code should use the specialized hooks (useCubeApi, useCubeMeta, useCubeFeatures)\n * for better performance and selective re-rendering.\n *\n * Also includes TanStack Query's QueryClientProvider for data fetching in\n * AnalysisBuilder and other components that use TanStack Query hooks.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { CubeApiProvider, useCubeApi } from './CubeApiProvider'\nimport { CubeMetaProvider } from './CubeMetaProvider'\nimport { useCubeMeta } from './CubeMetaContext'\nimport { CubeFeaturesProvider, useCubeFeatures } from './CubeFeaturesProvider'\nimport type { CubeQueryOptions, CubeApiOptions, FeaturesConfig, DashboardLayoutMode, CubeMeta, FieldLabelMap } from '../types'\nimport type { CubeClient } from '../client/CubeClient'\nimport type { BatchCoordinator } from '../client/BatchCoordinator'\n\nconst DEFAULT_API_OPTIONS: CubeApiOptions = { apiUrl: '/cubejs-api/v1' }\n\nexport const createCubeQueryClient = () => new QueryClient({\n defaultOptions: {\n queries: {\n // Stale time: 5 minutes (matches existing cache duration)\n staleTime: 5 * 60 * 1000,\n // GC time: 15 minutes\n gcTime: 15 * 60 * 1000,\n // Retry failed queries up to 3 times\n retry: 3,\n // Don't refetch on window focus by default (can be overridden per-query)\n refetchOnWindowFocus: false,\n },\n },\n})\n\n// Legacy default client (useful for tests or explicit injection)\nexport const queryClient = createCubeQueryClient()\n\n// Backward compatible interface - merges all three contexts\ninterface CubeContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n features: FeaturesConfig\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n dashboardModes: DashboardLayoutMode[]\n}\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n features?: FeaturesConfig\n dashboardModes?: DashboardLayoutMode[]\n enableBatching?: boolean\n batchDelayMs?: number // Delay in ms to collect queries before batching (default: 100)\n queryClient?: QueryClient\n children: ReactNode\n}\n\n/**\n * CubeProvider - Three-layer context wrapper\n *\n * Wraps children in three isolated context providers for optimal performance:\n * 1. CubeApiProvider - Stable API layer (changes only on auth)\n * 2. CubeMetaProvider - Metadata layer (changes on metadata load)\n * 3. CubeFeaturesProvider - Feature flags layer (changes on feature updates)\n */\nexport function CubeProvider({\n cubeApi: _initialCubeApi, // Intentionally unused - for backward compatibility\n apiOptions,\n token,\n options,\n features,\n dashboardModes,\n enableBatching,\n batchDelayMs,\n queryClient: providedQueryClient,\n children\n}: CubeProviderProps) {\n const [internalQueryClient] = useState(() => createCubeQueryClient())\n const queryClient = providedQueryClient ?? internalQueryClient\n\n return (\n <QueryClientProvider client={queryClient}>\n <CubeApiProvider\n apiOptions={apiOptions || DEFAULT_API_OPTIONS}\n token={token}\n options={options}\n enableBatching={enableBatching}\n batchDelayMs={batchDelayMs}\n >\n <CubeMetaProvider>\n <CubeFeaturesProvider features={features} dashboardModes={dashboardModes}>\n {children}\n </CubeFeaturesProvider>\n </CubeMetaProvider>\n </CubeApiProvider>\n </QueryClientProvider>\n )\n}\n\n/**\n * useCubeContext - Backward compatible hook\n *\n * Merges all three contexts into a single object for backward compatibility.\n * Components using this hook will re-render when ANY context changes.\n *\n * For better performance, use specialized hooks:\n * - useCubeApi() - Only re-renders on API changes\n * - useCubeMeta() - Only re-renders on metadata changes\n * - useCubeFeatures() - Only re-renders on feature changes\n */\nexport function useCubeContext(): CubeContextValue {\n const api = useCubeApi()\n const meta = useCubeMeta()\n const featuresCtx = useCubeFeatures()\n\n return useMemo(() => ({\n ...api,\n ...meta,\n features: featuresCtx.features,\n dashboardModes: featuresCtx.dashboardModes\n }), [api, meta, featuresCtx])\n}\n\n// Re-export specialized hooks for better tree-shaking and performance\nexport { useCubeApi, useCubeMeta, useCubeFeatures }\n\n// Export factory for testing and advanced use cases\nexport { createCubeQueryClient as createQueryClient }\n"],"names":["CubeClient","token","options","query","queryString","queryParam","url","requestHeaders","key","response","errorMessage","errorText","errorData","result","ResultSet","queries","loadResponse","createCubeClient","BatchCoordinator","batchExecutor","delayMs","resolve","reject","currentQueue","item","results","index","error","CubeApiContext","createContext","CubeApiProvider","initialApiOptions","initialToken","enableBatching","batchDelayMs","children","baseConfig","useMemo","overrideConfig","setOverrideConfig","useState","useEffect","config","cubeApi","batchCoordinator","updateApiConfig","useCallback","newApiOptions","newToken","value","jsx","useCubeApi","context","useContext","CUBE_META_QUERY_KEY","buildLabelMap","meta","labelMap","cube","measure","dimension","segment","useCubeMetaQuery","enabled","staleTime","queryClient","useQueryClient","useQuery","metaData","refetch","getFieldLabel","fieldName","screenshotModule","moduleChecked","resizeImage","dataUri","targetWidth","targetHeight","format","quality","img","canvas","ctx","sourceAspect","targetAspect","sourceX","sourceY","sourceWidth","sourceHeight","mimeType","getScreenshotModule","warnIfScreenshotLibMissing","thumbnailConfig","mod","captureThumbnail","elementRef","screenshot","element","captureScale","backgroundColor","getEffectiveBackgroundColor","fullDataUri","isPortletCopyAvailable","isTransparentBackground","color","rgbaMatch","current","bg","copyPortletToClipboard","dataUrl","blob","CubeFeaturesContext","DEFAULT_FEATURES","CubeFeaturesProvider","initialFeatures","dashboardModes","features","setFeatures","updateFeatures","newFeatures","prev","DEFAULT_CONTEXT","useCubeFeatures","ScrollContainerContext","ScrollContainerProvider","useScrollContainer","CubeMetaContext","useCubeMeta","CubeMetaProvider","metaLoading","getFieldLabelFromQuery","metaError","refetchMeta","DEFAULT_API_OPTIONS","createCubeQueryClient","QueryClient","CubeProvider","_initialCubeApi","apiOptions","providedQueryClient","internalQueryClient","QueryClientProvider","useCubeContext","api","featuresCtx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"providers-BBrUJB2U.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/client/BatchCoordinator.ts","../../../src/client/providers/CubeApiProvider.tsx","../../../src/client/hooks/queries/useCubeMetaQuery.ts","../../../src/client/utils/thumbnail.ts","../../../src/client/providers/CubeFeaturesProvider.tsx","../../../src/client/providers/ScrollContainerContext.tsx","../../../src/client/providers/CubeMetaContext.tsx","../../../src/client/providers/CubeMetaProvider.tsx","../../../src/client/providers/CubeProvider.tsx"],"sourcesContent":["/**\n * Minimal Cube client implementation\n * Replaces @cubejs-client/core with lighter implementation\n */\n\nimport type { CubeQuery, CubeApiOptions, CubeResultSet, ExplainResult, ExplainOptions } from '../types'\n\nexport class CubeClient {\n private apiUrl: string\n private headers: Record<string, string>\n private credentials: 'include' | 'omit' | 'same-origin'\n\n constructor(token?: string, options: CubeApiOptions = {}) {\n this.apiUrl = options.apiUrl || '/cubejs-api/v1'\n this.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n this.credentials = options.credentials ?? 'include'\n\n if (token) {\n this.headers['Authorization'] = token\n }\n }\n\n async load(query: CubeQuery, options?: { bustCache?: boolean }): Promise<CubeResultSet> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryString = JSON.stringify(query)\n const queryParam = encodeURIComponent(queryString)\n const url = `${this.apiUrl}/load?query=${queryParam}`\n\n // Build headers, optionally adding cache bust header\n const requestHeaders: Record<string, string> = {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n }\n if (options?.bustCache) {\n requestHeaders['X-Cache-Control'] = 'no-cache'\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers: requestHeaders,\n credentials: this.credentials\n })\n\n if (!response.ok) {\n let errorMessage = `Cube query failed: ${response.status}`\n try {\n const errorText = await response.text()\n // Try to parse as JSON first to get structured error\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If not JSON, use the raw text\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return new ResultSet(result)\n }\n\n async meta(): Promise<any> {\n const url = `${this.apiUrl}/meta`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.headers,\n credentials: this.credentials\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch meta: ${response.status}`)\n }\n\n return response.json()\n }\n\n async sql(query: CubeQuery): Promise<any> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/sql?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: this.credentials\n })\n\n if (!response.ok) {\n throw new Error(`SQL generation failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async dryRun(query: CubeQuery): Promise<any> {\n const url = `${this.apiUrl}/dry-run`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: this.credentials,\n body: JSON.stringify({ query })\n })\n\n if (!response.ok) {\n let errorMessage = `Dry run failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n /**\n * Execute EXPLAIN on a query to get the execution plan\n * Returns normalized plan across PostgreSQL, MySQL, and SQLite\n * Accepts standard queries, funnel queries ({ funnel: {...} }), or flow queries ({ flow: {...} })\n */\n async explain(query: CubeQuery | unknown, options?: ExplainOptions): Promise<ExplainResult> {\n const url = `${this.apiUrl}/explain`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: this.credentials,\n body: JSON.stringify({ query, options })\n })\n\n if (!response.ok) {\n let errorMessage = `Explain failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n /**\n * Execute multiple queries in a single batch request\n * Used by BatchCoordinator to optimize network requests\n * Pass { bustCache: true } to bypass server-side cache\n */\n async batchLoad(queries: CubeQuery[], options?: { bustCache?: boolean }): Promise<CubeResultSet[]> {\n const url = `${this.apiUrl}/batch`\n\n // Build headers with optional cache bypass\n const requestHeaders: Record<string, string> = { ...this.headers }\n if (options?.bustCache) {\n requestHeaders['X-Cache-Control'] = 'no-cache'\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: requestHeaders,\n credentials: this.credentials,\n body: JSON.stringify({ queries })\n })\n\n if (!response.ok) {\n let errorMessage = `Batch query failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const batchResponse = await response.json()\n\n // batchResponse.results is an array of individual query results\n // Each result may have succeeded or failed\n return batchResponse.results.map((result: any) => {\n // If this individual query failed, create a ResultSet with error info\n if (!result.success && result.error) {\n // Create a result set that will throw when accessed\n return {\n ...new ResultSet({ data: [], annotation: {} }),\n error: result.error\n }\n }\n\n // Create ResultSet from successful result\n return new ResultSet(result)\n })\n }\n}\n\n/**\n * Simple ResultSet implementation\n */\nclass ResultSet implements CubeResultSet {\n public loadResponse: any\n\n constructor(loadResponse: any) {\n this.loadResponse = loadResponse\n }\n\n rawData(): any[] {\n // Handle new nested structure: loadResponse.results[0].data\n // Keep backward compatibility with old structure: loadResponse.data\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].data || []\n }\n return this.loadResponse.data || []\n }\n\n tablePivot(): any[] {\n // For pie charts and tables, return the raw data\n return this.rawData()\n }\n\n series(): any[] {\n // Simple series implementation\n return this.rawData()\n }\n\n annotation(): any {\n // Handle new nested structure: loadResponse.results[0].annotation\n // Keep backward compatibility with old structure: loadResponse.annotation\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].annotation || {}\n }\n return this.loadResponse.annotation || {}\n }\n\n /**\n * Get cache metadata if result was served from cache\n * Returns undefined if not a cache hit\n */\n cacheInfo(): { hit: true; cachedAt: string; ttlMs: number; ttlRemainingMs: number } | undefined {\n // Handle nested structure: loadResponse.results[0].cache\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].cache\n }\n return this.loadResponse.cache\n }\n}\n\n/**\n * Factory function to create a cube client\n */\nexport function createCubeClient(token?: string, options: CubeApiOptions = {}): CubeClient {\n return new CubeClient(token, options)\n}\n\n// Legacy compatibility export\nexport function cube(token?: string, options: CubeApiOptions = {}): CubeClient {\n return createCubeClient(token, options)\n}","import type { CubeQuery, CubeResultSet } from '../types'\n\n/**\n * Represents a queued query with its resolver/rejector\n */\ninterface QueuedQuery {\n query: CubeQuery\n resolve: (result: CubeResultSet) => void\n reject: (error: Error) => void\n}\n\n/**\n * BatchCoordinator collects queries triggered in the same render cycle\n * and sends them as a single batch request to minimize network overhead.\n *\n * Uses a configurable delay (default 100ms) to batch queries from lazy-loaded\n * portlets that become visible during the same scroll action.\n */\nexport class BatchCoordinator {\n private queue: QueuedQuery[] = []\n private flushScheduled = false\n private batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>\n private delayMs: number\n\n constructor(batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>, delayMs: number = 50) {\n this.batchExecutor = batchExecutor\n this.delayMs = delayMs\n }\n\n /**\n * Register a query to be batched. Returns a promise that resolves\n * when the batch is executed and this specific query's result is available.\n */\n public register(query: CubeQuery): Promise<CubeResultSet> {\n return new Promise<CubeResultSet>((resolve, reject) => {\n // Add query to queue\n this.queue.push({ query, resolve, reject })\n\n // Schedule flush if not already scheduled\n if (!this.flushScheduled) {\n this.scheduleFlush()\n }\n })\n }\n\n /**\n * Schedule a flush after a short delay to collect multiple queries.\n * The delay allows queries from lazy-loaded portlets that become visible\n * during the same scroll action to be batched together.\n */\n private scheduleFlush(): void {\n this.flushScheduled = true\n\n setTimeout(() => {\n this.flush()\n }, this.delayMs)\n }\n\n /**\n * Execute all queued queries as a batch and resolve individual promises\n */\n private async flush(): Promise<void> {\n // Reset state\n this.flushScheduled = false\n\n // Take current queue and clear it\n const currentQueue = this.queue.slice()\n this.queue = []\n\n if (currentQueue.length === 0) {\n return\n }\n\n try {\n // Extract queries\n const queries = currentQueue.map(item => item.query)\n\n // Execute batch\n const results = await this.batchExecutor(queries)\n\n // Resolve individual promises with their corresponding results\n currentQueue.forEach((item, index) => {\n const result = results[index]\n\n // Check if this specific query had an error\n if (result && 'error' in result && result.error) {\n item.reject(new Error(result.error as string))\n } else {\n item.resolve(result)\n }\n })\n } catch (error) {\n // If entire batch fails, reject all queries\n currentQueue.forEach(item => {\n item.reject(error instanceof Error ? error : new Error(String(error)))\n })\n }\n }\n\n /**\n * Get current queue size (useful for debugging)\n */\n public getQueueSize(): number {\n return this.queue.length\n }\n\n /**\n * Clear the queue (useful for testing/cleanup)\n */\n public clear(): void {\n this.queue = []\n this.flushScheduled = false\n }\n}\n","/**\n * CubeApiProvider - Stable API Context Layer\n *\n * Provides the CubeClient API instance that only changes on authentication updates.\n * Isolated from metadata and feature contexts to prevent unnecessary re-renders.\n */\n\nimport { createContext, useContext, useState, useMemo, useCallback, useEffect, type ReactNode } from 'react'\nimport { createCubeClient, type CubeClient } from '../client/CubeClient'\nimport type { CubeQueryOptions, CubeApiOptions } from '../types'\nimport { BatchCoordinator } from '../client/BatchCoordinator'\n\ninterface CubeApiContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n}\n\nconst CubeApiContext = createContext<CubeApiContextValue | null>(null)\n\ninterface CubeApiProviderProps {\n apiOptions: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n enableBatching?: boolean\n batchDelayMs?: number\n children: ReactNode\n}\n\nexport function CubeApiProvider({\n apiOptions: initialApiOptions,\n token: initialToken,\n options = {},\n enableBatching = true,\n batchDelayMs = 50,\n children\n}: CubeApiProviderProps) {\n const baseConfig = useMemo(\n () => ({ apiOptions: initialApiOptions, token: initialToken }),\n [initialApiOptions, initialToken]\n )\n const [overrideConfig, setOverrideConfig] = useState<{\n apiOptions: CubeApiOptions\n token?: string\n } | null>(null)\n\n useEffect(() => {\n setOverrideConfig(null)\n }, [baseConfig])\n\n const config = overrideConfig ?? baseConfig\n\n // Create CubeClient - only recreates when config changes\n const cubeApi = useMemo(() =>\n createCubeClient(config.token, config.apiOptions),\n [config.apiOptions, config.token]\n )\n\n // Create BatchCoordinator - only recreates when cubeApi or batching config changes\n const batchCoordinator = useMemo(() => {\n if (!enableBatching) return null\n return new BatchCoordinator((queries) => cubeApi.batchLoad(queries), batchDelayMs)\n }, [enableBatching, cubeApi, batchDelayMs])\n\n // Stable callback for updating config\n const updateApiConfig = useCallback((newApiOptions: CubeApiOptions, newToken?: string) => {\n setOverrideConfig({ apiOptions: newApiOptions, token: newToken })\n }, [])\n\n // Memoize context value - only changes when cubeApi/options change\n const value = useMemo(() => ({\n cubeApi,\n options,\n updateApiConfig,\n batchCoordinator,\n enableBatching\n }), [cubeApi, options, updateApiConfig, batchCoordinator, enableBatching])\n\n return (\n <CubeApiContext.Provider value={value}>\n {children}\n </CubeApiContext.Provider>\n )\n}\n\nexport function useCubeApi() {\n const context = useContext(CubeApiContext)\n if (!context) {\n throw new Error('useCubeApi must be used within CubeApiProvider')\n }\n return context\n}\n","/**\n * useCubeMetaQuery - TanStack Query hook for cube metadata\n *\n * Replaces manual caching in useCubeMeta with TanStack Query's built-in\n * cache management. Provides:\n * - Automatic caching with configurable stale time\n * - Built-in loading and error states\n * - Automatic refetch on mount (if stale)\n * - Manual refetch capability\n *\n * This hook wraps the existing CubeClient.meta() method.\n */\n\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCubeApi } from '../../providers/CubeApiProvider'\nimport type { CubeMeta, FieldLabelMap } from '../../types'\n\n// Query key for cube metadata\nexport const CUBE_META_QUERY_KEY = ['cube', 'meta'] as const\n\n/**\n * Build a field label map from cube metadata\n * Maps field names to their display titles\n */\nfunction buildLabelMap(meta: CubeMeta): FieldLabelMap {\n const labelMap: FieldLabelMap = {}\n\n meta.cubes.forEach((cube) => {\n // Add measures\n cube.measures.forEach((measure) => {\n labelMap[measure.name] = measure.title || measure.shortTitle || measure.name\n })\n\n // Add dimensions\n cube.dimensions.forEach((dimension) => {\n labelMap[dimension.name] = dimension.title || dimension.shortTitle || dimension.name\n })\n\n // Add segments\n cube.segments.forEach((segment) => {\n labelMap[segment.name] = segment.title || segment.shortTitle || segment.name\n })\n })\n\n return labelMap\n}\n\nexport interface UseCubeMetaQueryOptions {\n /**\n * Whether to skip the query (useful for conditional fetching)\n * @default false\n */\n enabled?: boolean\n /**\n * Stale time in milliseconds (how long before data is considered stale)\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseCubeMetaQueryResult {\n /** Cube metadata */\n meta: CubeMeta | null\n /** Field label map for quick lookups */\n labelMap: FieldLabelMap\n /** Whether the query is loading */\n isLoading: boolean\n /** Whether the query is fetching (includes background refetch) */\n isFetching: boolean\n /** Error if the query failed */\n error: Error | null\n /** Manually refetch the metadata */\n refetch: () => void\n /** Get a field's display label */\n getFieldLabel: (fieldName: string) => string\n}\n\n/**\n * TanStack Query hook for fetching cube metadata\n *\n * Usage:\n * ```tsx\n * const { meta, labelMap, isLoading, error, refetch } = useCubeMetaQuery()\n * ```\n */\nexport function useCubeMetaQuery(\n options: UseCubeMetaQueryOptions = {}\n): UseCubeMetaQueryResult {\n const { enabled = true, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n const queryClient = useQueryClient()\n\n const query = useQuery({\n queryKey: CUBE_META_QUERY_KEY,\n queryFn: async () => {\n const metaData = await cubeApi.meta()\n const labelMap = buildLabelMap(metaData)\n return { meta: metaData, labelMap }\n },\n enabled,\n staleTime,\n // Keep data in cache for 15 minutes after it becomes unused\n gcTime: 15 * 60 * 1000,\n })\n\n // Extract data from query result\n const meta = query.data?.meta ?? null\n const labelMap = query.data?.labelMap ?? {}\n\n // Stable refetch function\n const refetch = () => {\n queryClient.invalidateQueries({ queryKey: CUBE_META_QUERY_KEY })\n }\n\n // Stable getFieldLabel function\n const getFieldLabel = (fieldName: string): string => {\n return labelMap[fieldName] || fieldName\n }\n\n return {\n meta,\n labelMap,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n getFieldLabel,\n }\n}\n\n/**\n * Prefetch cube metadata - useful for eager loading\n *\n * Usage:\n * ```tsx\n * const queryClient = useQueryClient()\n * await prefetchCubeMeta(queryClient, cubeApi)\n * ```\n */\nexport async function prefetchCubeMeta(\n queryClient: ReturnType<typeof useQueryClient>,\n cubeApi: ReturnType<typeof useCubeApi>['cubeApi']\n): Promise<void> {\n await queryClient.prefetchQuery({\n queryKey: CUBE_META_QUERY_KEY,\n queryFn: async () => {\n const metaData = await cubeApi.meta()\n const labelMap = buildLabelMap(metaData)\n return { meta: metaData, labelMap }\n },\n })\n}\n","/**\n * Dashboard Thumbnail Capture Utility\n *\n * Provides optional screenshot functionality for dashboard thumbnails.\n * Requires modern-screenshot as an optional peer dependency.\n *\n * Usage:\n * 1. Install the optional dependency: npm install modern-screenshot\n * 2. Enable in CubeProvider: features={{ thumbnail: { enabled: true } }}\n * 3. Thumbnails are automatically captured on dashboard save\n */\n\nimport type { RefObject } from 'react'\nimport type { ThumbnailFeatureConfig } from '../types'\n\n// Type definition for modern-screenshot (optional dependency)\ntype ModernScreenshotModule = {\n domToPng: (element: HTMLElement, options?: Record<string, unknown>) => Promise<string>\n domToJpeg: (element: HTMLElement, options?: Record<string, unknown>) => Promise<string>\n}\n\n// Cache the import result to avoid repeated dynamic imports\nlet screenshotModule: ModernScreenshotModule | null = null\nlet moduleChecked = false\n\n/**\n * Resize an image to the specified dimensions while maintaining quality.\n * This takes a high-resolution source and scales it down to target dimensions,\n * which produces better results than capturing at low resolution directly.\n *\n * Uses Canvas imageSmoothingQuality for best downscaling results.\n */\nfunction resizeImage(\n dataUri: string,\n targetWidth: number,\n targetHeight: number,\n format: 'png' | 'jpeg',\n quality: number\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n const canvas = document.createElement('canvas')\n canvas.width = targetWidth\n canvas.height = targetHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n reject(new Error('Failed to get canvas context'))\n return\n }\n\n // Enable high-quality image smoothing for downscaling\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n\n // Calculate aspect-ratio-preserving dimensions\n const sourceAspect = img.width / img.height\n const targetAspect = targetWidth / targetHeight\n\n let sourceX = 0\n let sourceY = 0\n let sourceWidth = img.width\n let sourceHeight = img.height\n\n // Crop source to match target aspect ratio (center crop)\n if (sourceAspect > targetAspect) {\n // Source is wider - crop horizontally\n sourceWidth = img.height * targetAspect\n sourceX = (img.width - sourceWidth) / 2\n } else if (sourceAspect < targetAspect) {\n // Source is taller - crop vertically (take from top)\n sourceHeight = img.width / targetAspect\n // Don't center - take from top for dashboard previews\n sourceY = 0\n }\n\n // Draw the scaled and cropped image\n ctx.drawImage(\n img,\n sourceX, sourceY, sourceWidth, sourceHeight, // Source region\n 0, 0, targetWidth, targetHeight // Destination (full canvas)\n )\n\n const mimeType = format === 'jpeg' ? 'image/jpeg' : 'image/png'\n resolve(canvas.toDataURL(mimeType, quality))\n }\n img.onerror = () => reject(new Error('Failed to load image for resizing'))\n img.src = dataUri\n })\n}\n\n/**\n * Check if modern-screenshot is available (installed as peer dependency)\n */\nasync function getScreenshotModule(): Promise<ModernScreenshotModule | null> {\n if (moduleChecked) {\n return screenshotModule\n }\n\n try {\n // Dynamic import - modern-screenshot is an optional peer dependency\n // @ts-ignore - modern-screenshot may not be installed\n screenshotModule = await import('modern-screenshot') as ModernScreenshotModule\n moduleChecked = true\n return screenshotModule\n } catch {\n moduleChecked = true\n screenshotModule = null\n return null\n }\n}\n\n// Extend Window interface for our warning flag\ndeclare global {\n interface Window {\n __drizzle_cube_thumbnail_warning__?: boolean\n }\n}\n\n/**\n * Log a development-mode warning when thumbnail feature is enabled but modern-screenshot is missing\n */\nexport function warnIfScreenshotLibMissing(thumbnailConfig: ThumbnailFeatureConfig | undefined): void {\n if (typeof window === 'undefined') return\n if (!thumbnailConfig?.enabled) return\n\n // Only warn once per session\n if (window.__drizzle_cube_thumbnail_warning__) return\n\n getScreenshotModule().then((mod) => {\n if (!mod && process.env.NODE_ENV === 'development') {\n console.warn(\n '[drizzle-cube] Thumbnail feature enabled but modern-screenshot not installed. ' +\n 'Run: npm install modern-screenshot'\n )\n window.__drizzle_cube_thumbnail_warning__ = true\n }\n })\n}\n\n/**\n * Capture a thumbnail of the dashboard element\n *\n * @param elementRef - React ref to the dashboard container element\n * @param config - Thumbnail configuration (dimensions, format, quality)\n * @returns Base64 data URI of the thumbnail, or null if capture failed\n */\nexport async function captureThumbnail(\n elementRef: RefObject<HTMLElement | null>,\n config: ThumbnailFeatureConfig\n): Promise<string | null> {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') {\n return null\n }\n\n // Check if the element ref is valid\n if (!elementRef.current) {\n return null\n }\n\n // Try to load modern-screenshot\n const screenshot = await getScreenshotModule()\n if (!screenshot) {\n return null\n }\n\n try {\n // Higher default dimensions for crisp thumbnails on retina displays\n // 1600x1200 provides good quality while keeping file size reasonable\n const targetWidth = config.width ?? 1600\n const targetHeight = config.height ?? 1200\n const format = config.format ?? 'png'\n const quality = config.quality ?? 0.95 // Higher default quality\n\n const element = elementRef.current\n\n // Always capture at 2x scale for high quality (like copy-to-clipboard)\n // This produces a sharp image that we then resize down\n const captureScale = 2\n\n // Get theme-aware background color (walks DOM tree to find effective bg)\n const backgroundColor = getEffectiveBackgroundColor(element)\n\n // Capture at high resolution with proper background\n const fullDataUri = await screenshot.domToPng(element, {\n scale: captureScale,\n backgroundColor,\n })\n\n // Resize to target dimensions (high-quality downscaling)\n const resizedDataUri = await resizeImage(\n fullDataUri,\n targetWidth,\n targetHeight,\n format,\n quality\n )\n\n return resizedDataUri\n } catch (error) {\n console.error('[drizzle-cube] Failed to capture thumbnail:', error)\n return null\n }\n}\n\n/**\n * Check if thumbnail capture is available and enabled\n */\nexport async function isThumbnailCaptureAvailable(\n config: ThumbnailFeatureConfig | undefined\n): Promise<boolean> {\n if (!config?.enabled) {\n return false\n }\n\n if (typeof window === 'undefined') {\n return false\n }\n\n const screenshot = await getScreenshotModule()\n return screenshot !== null\n}\n\n/**\n * Check if portlet screenshot-to-clipboard is available.\n * Requires both modern-screenshot AND Clipboard API with image support.\n */\nexport async function isPortletCopyAvailable(): Promise<boolean> {\n // Check if we're in browser environment\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check modern-screenshot is installed\n const screenshot = await getScreenshotModule()\n if (!screenshot) {\n return false\n }\n\n // Check Clipboard API supports writing images (ClipboardItem with image/png blob)\n return (\n typeof ClipboardItem !== 'undefined' &&\n typeof navigator?.clipboard?.write === 'function'\n )\n}\n\n/**\n * Check if a background color is transparent or effectively invisible\n */\nfunction isTransparentBackground(color: string): boolean {\n if (!color || color === 'transparent' || color === 'rgba(0, 0, 0, 0)') {\n return true\n }\n // Check for rgba with 0 alpha\n const rgbaMatch = color.match(/rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*([\\d.]+)\\s*\\)/)\n if (rgbaMatch && parseFloat(rgbaMatch[1]) === 0) {\n return true\n }\n return false\n}\n\n/**\n * Find the effective background color by walking up the DOM tree\n */\nfunction getEffectiveBackgroundColor(element: HTMLElement): string {\n let current: HTMLElement | null = element\n\n while (current) {\n const bg = getComputedStyle(current).backgroundColor\n if (!isTransparentBackground(bg)) {\n return bg\n }\n current = current.parentElement\n }\n\n // Fallback to theme variable or white\n const themeColor = getComputedStyle(document.documentElement)\n .getPropertyValue('--dc-surface')\n .trim()\n\n return themeColor || '#ffffff'\n}\n\n/**\n * Capture a portlet element and copy to clipboard as PNG.\n * Returns true on success, false on failure.\n *\n * @param element - The HTML element to capture\n * @returns Promise<boolean> - true if successfully copied to clipboard\n */\nexport async function copyPortletToClipboard(element: HTMLElement): Promise<boolean> {\n try {\n const screenshot = await getScreenshotModule()\n if (!screenshot) {\n console.warn('[drizzle-cube] Cannot copy portlet: modern-screenshot not available')\n return false\n }\n\n // Get theme-aware background color by walking up the DOM tree\n const backgroundColor = getEffectiveBackgroundColor(element)\n\n // Capture as PNG data URL at 2x scale for retina quality\n const dataUrl = await screenshot.domToPng(element, {\n scale: 2,\n backgroundColor,\n })\n\n // Convert data URL to blob\n const response = await fetch(dataUrl)\n const blob = await response.blob()\n\n // Write to clipboard\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })])\n\n return true\n } catch (error) {\n console.warn('[drizzle-cube] Failed to copy portlet to clipboard:', error)\n return false\n }\n}\n","/**\n * CubeFeaturesProvider - Feature Flags Context Layer\n *\n * Provides feature configuration isolated from API and metadata layers.\n * This prevents components from re-rendering when feature flags change\n * if they don't use features.\n */\n\nimport { createContext, useContext, useState, useMemo, useCallback, useEffect, type ReactNode } from 'react'\nimport type { FeaturesConfig, DashboardLayoutMode } from '../types'\nimport { warnIfScreenshotLibMissing } from '../utils/thumbnail'\n\ninterface CubeFeaturesContextValue {\n features: FeaturesConfig\n dashboardModes: DashboardLayoutMode[]\n updateFeatures: (newFeatures: Partial<FeaturesConfig>) => void\n}\n\nconst CubeFeaturesContext = createContext<CubeFeaturesContextValue | null>(null)\n\ninterface CubeFeaturesProviderProps {\n features?: FeaturesConfig\n dashboardModes?: DashboardLayoutMode[]\n children: ReactNode\n}\n\nconst DEFAULT_FEATURES: FeaturesConfig = {\n enableAI: true,\n aiEndpoint: '/api/ai/generate',\n showSchemaDiagram: false,\n useAnalysisBuilder: false,\n editToolbar: 'both',\n floatingToolbarPosition: 'right'\n}\n\nexport function CubeFeaturesProvider({\n features: initialFeatures,\n dashboardModes = ['rows', 'grid'],\n children\n}: CubeFeaturesProviderProps) {\n // Merge passed features with defaults so new features get default values\n const [features, setFeatures] = useState<FeaturesConfig>(() => ({\n ...DEFAULT_FEATURES,\n ...initialFeatures\n }))\n\n // Warn in development if thumbnail feature is enabled but modern-screenshot is not installed\n useEffect(() => {\n warnIfScreenshotLibMissing(features.thumbnail)\n }, [features.thumbnail])\n\n const updateFeatures = useCallback((newFeatures: Partial<FeaturesConfig>) => {\n setFeatures(prev => ({ ...prev, ...newFeatures }))\n }, [])\n\n const value = useMemo(() => ({\n features,\n dashboardModes,\n updateFeatures\n }), [features, dashboardModes, updateFeatures])\n\n return (\n <CubeFeaturesContext.Provider value={value}>\n {children}\n </CubeFeaturesContext.Provider>\n )\n}\n\n// Default context value when used outside provider (safe fallback for hooks)\nconst DEFAULT_CONTEXT: CubeFeaturesContextValue = {\n features: DEFAULT_FEATURES,\n dashboardModes: ['rows', 'grid'],\n updateFeatures: () => {\n // No-op when used outside provider\n }\n}\n\n/**\n * Hook to access cube features context.\n * Returns default values if used outside CubeFeaturesProvider (graceful fallback).\n */\nexport function useCubeFeatures() {\n const context = useContext(CubeFeaturesContext)\n // Return default context if not within provider (allows hooks like useCubeLoadQuery to work in isolation)\n return context ?? DEFAULT_CONTEXT\n}\n","/**\n * ScrollContainerContext\n *\n * Provides the scroll container element for lazy loading with IntersectionObserver.\n * This allows portlets to detect visibility relative to a custom scroll container\n * (not just the viewport) when the dashboard is embedded in a scrolling div.\n */\n\nimport { createContext, useContext } from 'react'\n\nconst ScrollContainerContext = createContext<HTMLElement | null>(null)\n\n/**\n * Provider component to wrap dashboard content with a scroll container reference.\n * Used by DashboardGrid and MobileStackedLayout to pass the detected scroll container\n * to child portlets.\n */\nexport const ScrollContainerProvider = ScrollContainerContext.Provider\n\n/**\n * Hook to access the scroll container element for lazy loading.\n * Returns null if using viewport (window) scroll, or the container element\n * if the dashboard is inside a scrolling container.\n */\nexport const useScrollContainer = () => useContext(ScrollContainerContext)\n","/**\n * CubeMetaContext - Metadata context definitions.\n *\n * Split from CubeMetaProvider so consumers can access metadata context\n * without pulling in TanStack Query dependencies.\n */\n\nimport { createContext, useContext } from 'react'\nimport type { CubeMeta, FieldLabelMap } from '../types'\n\nexport interface CubeMetaContextValue {\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n}\n\nexport const CubeMetaContext = createContext<CubeMetaContextValue | null>(null)\n\nexport function useCubeMeta() {\n const context = useContext(CubeMetaContext)\n if (!context) {\n throw new Error('useCubeMeta must be used within CubeMetaProvider')\n }\n return context\n}\n","/**\n * CubeMetaProvider - Metadata Context Layer\n *\n * Provides cube metadata (meta, labelMap) isolated from API layer.\n * This prevents components from re-rendering when metadata loads\n * if they only need API access.\n *\n * Uses TanStack Query for metadata fetching with built-in caching.\n */\n\nimport { useCallback, useMemo, type ReactNode } from 'react'\nimport { useCubeMetaQuery } from '../hooks/queries/useCubeMetaQuery'\nimport { CubeMetaContext } from './CubeMetaContext'\n\ninterface CubeMetaProviderProps {\n children: ReactNode\n}\n\nexport function CubeMetaProvider({ children }: CubeMetaProviderProps) {\n // Use TanStack Query hook for metadata fetching\n const {\n meta,\n labelMap,\n isLoading: metaLoading,\n error,\n refetch,\n getFieldLabel: getFieldLabelFromQuery\n } = useCubeMetaQuery()\n\n // Convert error to string for backward compatibility\n const metaError = error ? (error instanceof Error ? error.message : String(error)) : null\n\n // Wrap refetch to match expected signature\n const refetchMeta = useCallback(() => {\n refetch()\n }, [refetch])\n\n // Create stable getFieldLabel that reads from current labelMap\n const getFieldLabel = useCallback((fieldName: string): string => {\n return getFieldLabelFromQuery(fieldName)\n }, [getFieldLabelFromQuery])\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(() => ({\n meta,\n labelMap,\n metaLoading,\n metaError,\n getFieldLabel,\n refetchMeta\n }), [meta, labelMap, metaLoading, metaError, getFieldLabel, refetchMeta])\n\n return (\n <CubeMetaContext.Provider value={value}>\n {children}\n </CubeMetaContext.Provider>\n )\n}\n","/**\n * CubeProvider - Backward Compatibility Wrapper\n *\n * This provider wraps the three specialized context providers (API, Meta, Features)\n * to maintain 100% backward compatibility with existing code using useCubeContext().\n *\n * New code should use the specialized hooks (useCubeApi, useCubeMeta, useCubeFeatures)\n * for better performance and selective re-rendering.\n *\n * Also includes TanStack Query's QueryClientProvider for data fetching in\n * AnalysisBuilder and other components that use TanStack Query hooks.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { CubeApiProvider, useCubeApi } from './CubeApiProvider'\nimport { CubeMetaProvider } from './CubeMetaProvider'\nimport { useCubeMeta } from './CubeMetaContext'\nimport { CubeFeaturesProvider, useCubeFeatures } from './CubeFeaturesProvider'\nimport type { CubeQueryOptions, CubeApiOptions, FeaturesConfig, DashboardLayoutMode, CubeMeta, FieldLabelMap } from '../types'\nimport type { CubeClient } from '../client/CubeClient'\nimport type { BatchCoordinator } from '../client/BatchCoordinator'\n\nconst DEFAULT_API_OPTIONS: CubeApiOptions = { apiUrl: '/cubejs-api/v1' }\n\nexport const createCubeQueryClient = () => new QueryClient({\n defaultOptions: {\n queries: {\n // Stale time: 5 minutes (matches existing cache duration)\n staleTime: 5 * 60 * 1000,\n // GC time: 15 minutes\n gcTime: 15 * 60 * 1000,\n // Retry failed queries up to 3 times\n retry: 3,\n // Don't refetch on window focus by default (can be overridden per-query)\n refetchOnWindowFocus: false,\n },\n },\n})\n\n// Legacy default client (useful for tests or explicit injection)\nexport const queryClient = createCubeQueryClient()\n\n// Backward compatible interface - merges all three contexts\ninterface CubeContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n features: FeaturesConfig\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n dashboardModes: DashboardLayoutMode[]\n}\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n features?: FeaturesConfig\n dashboardModes?: DashboardLayoutMode[]\n enableBatching?: boolean\n batchDelayMs?: number // Delay in ms to collect queries before batching (default: 100)\n queryClient?: QueryClient\n children: ReactNode\n}\n\n/**\n * CubeProvider - Three-layer context wrapper\n *\n * Wraps children in three isolated context providers for optimal performance:\n * 1. CubeApiProvider - Stable API layer (changes only on auth)\n * 2. CubeMetaProvider - Metadata layer (changes on metadata load)\n * 3. CubeFeaturesProvider - Feature flags layer (changes on feature updates)\n */\nexport function CubeProvider({\n cubeApi: _initialCubeApi, // Intentionally unused - for backward compatibility\n apiOptions,\n token,\n options,\n features,\n dashboardModes,\n enableBatching,\n batchDelayMs,\n queryClient: providedQueryClient,\n children\n}: CubeProviderProps) {\n const [internalQueryClient] = useState(() => createCubeQueryClient())\n const queryClient = providedQueryClient ?? internalQueryClient\n\n return (\n <QueryClientProvider client={queryClient}>\n <CubeApiProvider\n apiOptions={apiOptions || DEFAULT_API_OPTIONS}\n token={token}\n options={options}\n enableBatching={enableBatching}\n batchDelayMs={batchDelayMs}\n >\n <CubeMetaProvider>\n <CubeFeaturesProvider features={features} dashboardModes={dashboardModes}>\n {children}\n </CubeFeaturesProvider>\n </CubeMetaProvider>\n </CubeApiProvider>\n </QueryClientProvider>\n )\n}\n\n/**\n * useCubeContext - Backward compatible hook\n *\n * Merges all three contexts into a single object for backward compatibility.\n * Components using this hook will re-render when ANY context changes.\n *\n * For better performance, use specialized hooks:\n * - useCubeApi() - Only re-renders on API changes\n * - useCubeMeta() - Only re-renders on metadata changes\n * - useCubeFeatures() - Only re-renders on feature changes\n */\nexport function useCubeContext(): CubeContextValue {\n const api = useCubeApi()\n const meta = useCubeMeta()\n const featuresCtx = useCubeFeatures()\n\n return useMemo(() => ({\n ...api,\n ...meta,\n features: featuresCtx.features,\n dashboardModes: featuresCtx.dashboardModes\n }), [api, meta, featuresCtx])\n}\n\n// Re-export specialized hooks for better tree-shaking and performance\nexport { useCubeApi, useCubeMeta, useCubeFeatures }\n\n// Export factory for testing and advanced use cases\nexport { createCubeQueryClient as createQueryClient }\n"],"names":["CubeClient","token","options","query","queryString","queryParam","url","requestHeaders","key","response","errorMessage","errorText","errorData","result","ResultSet","queries","loadResponse","createCubeClient","BatchCoordinator","batchExecutor","delayMs","resolve","reject","currentQueue","item","results","index","error","CubeApiContext","createContext","CubeApiProvider","initialApiOptions","initialToken","enableBatching","batchDelayMs","children","baseConfig","useMemo","overrideConfig","setOverrideConfig","useState","useEffect","config","cubeApi","batchCoordinator","updateApiConfig","useCallback","newApiOptions","newToken","value","jsx","useCubeApi","context","useContext","CUBE_META_QUERY_KEY","buildLabelMap","meta","labelMap","cube","measure","dimension","segment","useCubeMetaQuery","enabled","staleTime","queryClient","useQueryClient","useQuery","metaData","refetch","getFieldLabel","fieldName","screenshotModule","moduleChecked","resizeImage","dataUri","targetWidth","targetHeight","format","quality","img","canvas","ctx","sourceAspect","targetAspect","sourceX","sourceY","sourceWidth","sourceHeight","mimeType","getScreenshotModule","warnIfScreenshotLibMissing","thumbnailConfig","mod","captureThumbnail","elementRef","screenshot","element","captureScale","backgroundColor","getEffectiveBackgroundColor","fullDataUri","isPortletCopyAvailable","isTransparentBackground","color","rgbaMatch","current","bg","copyPortletToClipboard","dataUrl","blob","CubeFeaturesContext","DEFAULT_FEATURES","CubeFeaturesProvider","initialFeatures","dashboardModes","features","setFeatures","updateFeatures","newFeatures","prev","DEFAULT_CONTEXT","useCubeFeatures","ScrollContainerContext","ScrollContainerProvider","useScrollContainer","CubeMetaContext","useCubeMeta","CubeMetaProvider","metaLoading","getFieldLabelFromQuery","metaError","refetchMeta","DEFAULT_API_OPTIONS","createCubeQueryClient","QueryClient","CubeProvider","_initialCubeApi","apiOptions","providedQueryClient","internalQueryClient","QueryClientProvider","useCubeContext","api","featuresCtx"],"mappings":"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"}
|
package/dist/client/chunks/{useDirtyStateTracking-ZSi3voVl.js → useDirtyStateTracking-DDQ_Lbki.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { u as W, a as B } from "./vendor-cTQhZ_G3.js";
|
|
2
2
|
import { useState as k, useRef as _, useMemo as w, useEffect as E, useCallback as D } from "react";
|
|
3
|
-
import { e as K, f as N } from "./providers-
|
|
3
|
+
import { e as K, f as N } from "./providers-BBrUJB2U.js";
|
|
4
4
|
const G = {
|
|
5
5
|
// String operators
|
|
6
6
|
equals: {
|
|
@@ -792,4 +792,4 @@ export {
|
|
|
792
792
|
O as w,
|
|
793
793
|
de as x
|
|
794
794
|
};
|
|
795
|
-
//# sourceMappingURL=useDirtyStateTracking-
|
|
795
|
+
//# sourceMappingURL=useDirtyStateTracking-DDQ_Lbki.js.map
|