drizzle-cube 0.4.29 → 0.4.30

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.
Files changed (381) hide show
  1. package/dist/adapters/anthropic-BIva8k1r.cjs +1 -0
  2. package/dist/adapters/anthropic-B_rg0BhK.js +140 -0
  3. package/dist/adapters/dist-Boc63-1q.cjs +2 -0
  4. package/dist/adapters/dist-De5fzUEM.js +581 -0
  5. package/dist/adapters/express/index.cjs +2 -10
  6. package/dist/adapters/express/index.js +232 -342
  7. package/dist/adapters/fastify/index.cjs +2 -10
  8. package/dist/adapters/fastify/index.js +275 -424
  9. package/dist/adapters/google-CT4kgmBf.js +154 -0
  10. package/dist/adapters/google-Dgo9-Kb5.cjs +2 -0
  11. package/dist/adapters/handler-B8vuFQYP.cjs +25 -0
  12. package/dist/adapters/handler-D-2-6uLM.js +2951 -0
  13. package/dist/adapters/hono/index.cjs +2 -10
  14. package/dist/adapters/hono/index.js +307 -402
  15. package/dist/adapters/mcp-prompts-BAutSQYA.js +344 -0
  16. package/dist/adapters/mcp-prompts-DsAkafVn.cjs +5 -0
  17. package/dist/adapters/mcp-transport-CuugoG8t.js +7821 -0
  18. package/dist/adapters/mcp-transport-Dpp6hdZe.cjs +253 -0
  19. package/dist/adapters/nextjs/index.cjs +1 -9
  20. package/dist/adapters/nextjs/index.js +377 -600
  21. package/dist/adapters/openai-CjBvA6mK.js +4114 -0
  22. package/dist/adapters/openai-DhLE0A9Z.cjs +1 -0
  23. package/dist/adapters/openai-Zjw4Zo4R.js +153 -0
  24. package/dist/adapters/openai-eJBw3LfQ.cjs +16 -0
  25. package/dist/adapters/types.cjs +0 -1
  26. package/dist/adapters/types.js +0 -1
  27. package/dist/adapters/utils-ChhNGUOF.js +5396 -0
  28. package/dist/adapters/utils-CwJplXR5.cjs +15 -0
  29. package/dist/adapters/utils.cjs +1 -19
  30. package/dist/adapters/utils.js +2 -21333
  31. package/dist/client/charts.js +15 -186
  32. package/dist/client/chunks/DashboardEditModal-C076pscL.js +6678 -0
  33. package/dist/client/chunks/DashboardEditModal-C076pscL.js.map +1 -0
  34. package/dist/client/chunks/FieldSearchModal-C0DjSWk3.js +2631 -0
  35. package/dist/client/chunks/FieldSearchModal-C0DjSWk3.js.map +1 -0
  36. package/dist/client/chunks/RetentionCombinedChart-DuGXc-AP.js +270 -0
  37. package/dist/client/chunks/RetentionCombinedChart-DuGXc-AP.js.map +1 -0
  38. package/dist/client/chunks/RetentionCombinedChart.config-DprbXd1N.js +56 -0
  39. package/dist/client/chunks/RetentionCombinedChart.config-DprbXd1N.js.map +1 -0
  40. package/dist/client/chunks/RetentionHeatmap-BoGY6mlZ.js +193 -0
  41. package/dist/client/chunks/RetentionHeatmap-BoGY6mlZ.js.map +1 -0
  42. package/dist/client/chunks/RetentionHeatmap.config-cbaNExVy.js +25 -0
  43. package/dist/client/chunks/RetentionHeatmap.config-cbaNExVy.js.map +1 -0
  44. package/dist/client/chunks/analysis-builder-DF0XntqC.js +6111 -0
  45. package/dist/client/chunks/analysis-builder-DF0XntqC.js.map +1 -0
  46. package/dist/client/chunks/analysis-builder-shared-2QhKYbs6.js +3114 -0
  47. package/dist/client/chunks/analysis-builder-shared-2QhKYbs6.js.map +1 -0
  48. package/dist/client/chunks/chart-activity-grid-CNES9VBk.js +803 -0
  49. package/dist/client/chunks/chart-activity-grid-CNES9VBk.js.map +1 -0
  50. package/dist/client/chunks/chart-area-CRJc3KOu.js +449 -0
  51. package/dist/client/chunks/chart-area-CRJc3KOu.js.map +1 -0
  52. package/dist/client/chunks/chart-bar-DD2PjJ5n.js +270 -0
  53. package/dist/client/chunks/chart-bar-DD2PjJ5n.js.map +1 -0
  54. package/dist/client/chunks/chart-box-plot-BcqleldJ.js +377 -0
  55. package/dist/client/chunks/chart-box-plot-BcqleldJ.js.map +1 -0
  56. package/dist/client/chunks/chart-bubble-BmQkVk4K.js +273 -0
  57. package/dist/client/chunks/chart-bubble-BmQkVk4K.js.map +1 -0
  58. package/dist/client/chunks/chart-candlestick-C3Rep469.js +306 -0
  59. package/dist/client/chunks/chart-candlestick-C3Rep469.js.map +1 -0
  60. package/dist/client/chunks/chart-config-activity-grid-USo7JrPh.js +51 -0
  61. package/dist/client/chunks/chart-config-activity-grid-USo7JrPh.js.map +1 -0
  62. package/dist/client/chunks/chart-config-area-D_ZufYzg.js +93 -0
  63. package/dist/client/chunks/chart-config-area-D_ZufYzg.js.map +1 -0
  64. package/dist/client/chunks/chart-config-bar-BCi2Wmd6.js +87 -0
  65. package/dist/client/chunks/chart-config-bar-BCi2Wmd6.js.map +1 -0
  66. package/dist/client/chunks/chart-config-box-plot-afKLzJSp.js +35 -0
  67. package/dist/client/chunks/chart-config-box-plot-afKLzJSp.js.map +1 -0
  68. package/dist/client/chunks/chart-config-bubble-CgbBjPv8.js +82 -0
  69. package/dist/client/chunks/chart-config-bubble-CgbBjPv8.js.map +1 -0
  70. package/dist/client/chunks/chart-config-candlestick-7boGjZ-A.js +72 -0
  71. package/dist/client/chunks/chart-config-candlestick-7boGjZ-A.js.map +1 -0
  72. package/dist/client/chunks/chart-config-data-table-Cl7sBasW.js +30 -0
  73. package/dist/client/chunks/chart-config-data-table-Cl7sBasW.js.map +1 -0
  74. package/dist/client/chunks/chart-config-funnel-CXPYQtTl.js +93 -0
  75. package/dist/client/chunks/chart-config-funnel-CXPYQtTl.js.map +1 -0
  76. package/dist/client/chunks/chart-config-gauge-DUNEUCvh.js +64 -0
  77. package/dist/client/chunks/chart-config-gauge-DUNEUCvh.js.map +1 -0
  78. package/dist/client/chunks/chart-config-heat-map-BFf1tO11.js +91 -0
  79. package/dist/client/chunks/chart-config-heat-map-BFf1tO11.js.map +1 -0
  80. package/dist/client/chunks/chart-config-kpi-delta-C5k2waIJ.js +94 -0
  81. package/dist/client/chunks/chart-config-kpi-delta-C5k2waIJ.js.map +1 -0
  82. package/dist/client/chunks/chart-config-kpi-number-DptOyhk0.js +75 -0
  83. package/dist/client/chunks/chart-config-kpi-number-DptOyhk0.js.map +1 -0
  84. package/dist/client/chunks/chart-config-kpi-text-D9DdVWqd.js +47 -0
  85. package/dist/client/chunks/chart-config-kpi-text-D9DdVWqd.js.map +1 -0
  86. package/dist/client/chunks/chart-config-line-B3NgLF7K.js +104 -0
  87. package/dist/client/chunks/chart-config-line-B3NgLF7K.js.map +1 -0
  88. package/dist/client/chunks/chart-config-markdown-tlfivQTt.js +117 -0
  89. package/dist/client/chunks/chart-config-markdown-tlfivQTt.js.map +1 -0
  90. package/dist/client/chunks/chart-config-measure-profile-D7XDwrU2.js +82 -0
  91. package/dist/client/chunks/chart-config-measure-profile-D7XDwrU2.js.map +1 -0
  92. package/dist/client/chunks/chart-config-pie-wY0B52PC.js +68 -0
  93. package/dist/client/chunks/chart-config-pie-wY0B52PC.js.map +1 -0
  94. package/dist/client/chunks/chart-config-radar-DRpJBy1M.js +49 -0
  95. package/dist/client/chunks/chart-config-radar-DRpJBy1M.js.map +1 -0
  96. package/dist/client/chunks/chart-config-radial-bar-DCUpXv9G.js +38 -0
  97. package/dist/client/chunks/chart-config-radial-bar-DCUpXv9G.js.map +1 -0
  98. package/dist/client/chunks/chart-config-sankey-CdOhlm4h.js +66 -0
  99. package/dist/client/chunks/chart-config-sankey-CdOhlm4h.js.map +1 -0
  100. package/dist/client/chunks/chart-config-scatter-B2su_x8f.js +61 -0
  101. package/dist/client/chunks/chart-config-scatter-B2su_x8f.js.map +1 -0
  102. package/dist/client/chunks/chart-config-sunburst-BPdjbk18.js +45 -0
  103. package/dist/client/chunks/chart-config-sunburst-BPdjbk18.js.map +1 -0
  104. package/dist/client/chunks/chart-config-tree-map-Cbsh2fe2.js +51 -0
  105. package/dist/client/chunks/chart-config-tree-map-Cbsh2fe2.js.map +1 -0
  106. package/dist/client/chunks/chart-config-waterfall-DGmuZfQF.js +59 -0
  107. package/dist/client/chunks/chart-config-waterfall-DGmuZfQF.js.map +1 -0
  108. package/dist/client/chunks/chart-data-table-DehW1C1G.js +4088 -0
  109. package/dist/client/chunks/chart-data-table-DehW1C1G.js.map +1 -0
  110. package/dist/client/chunks/chart-funnel-BjkpnG5g.js +447 -0
  111. package/dist/client/chunks/chart-funnel-BjkpnG5g.js.map +1 -0
  112. package/dist/client/chunks/chart-gauge-BWW_HEfg.js +424 -0
  113. package/dist/client/chunks/chart-gauge-BWW_HEfg.js.map +1 -0
  114. package/dist/client/chunks/chart-heat-map-BWuOuDcm.js +236 -0
  115. package/dist/client/chunks/chart-heat-map-BWuOuDcm.js.map +1 -0
  116. package/dist/client/chunks/chart-kpi-delta-D5OHtDJx.js +343 -0
  117. package/dist/client/chunks/chart-kpi-delta-D5OHtDJx.js.map +1 -0
  118. package/dist/client/chunks/chart-kpi-number-C9zH-aKC.js +326 -0
  119. package/dist/client/chunks/chart-kpi-number-C9zH-aKC.js.map +1 -0
  120. package/dist/client/chunks/chart-kpi-text-ChVn3S7j.js +149 -0
  121. package/dist/client/chunks/chart-kpi-text-ChVn3S7j.js.map +1 -0
  122. package/dist/client/chunks/chart-line-DOIMkP0b.js +431 -0
  123. package/dist/client/chunks/chart-line-DOIMkP0b.js.map +1 -0
  124. package/dist/client/chunks/chart-markdown-DXxc43w1.js +3457 -0
  125. package/dist/client/chunks/chart-markdown-DXxc43w1.js.map +1 -0
  126. package/dist/client/chunks/chart-measure-profile-C6wrr9il.js +179 -0
  127. package/dist/client/chunks/chart-measure-profile-C6wrr9il.js.map +1 -0
  128. package/dist/client/chunks/chart-pie-BU_FgwDc.js +172 -0
  129. package/dist/client/chunks/chart-pie-BU_FgwDc.js.map +1 -0
  130. package/dist/client/chunks/chart-radar-DlufwnAX.js +154 -0
  131. package/dist/client/chunks/chart-radar-DlufwnAX.js.map +1 -0
  132. package/dist/client/chunks/chart-radial-bar-B5vS_Aw5.js +148 -0
  133. package/dist/client/chunks/chart-radial-bar-B5vS_Aw5.js.map +1 -0
  134. package/dist/client/chunks/chart-sankey-FChb26UX.js +222 -0
  135. package/dist/client/chunks/chart-sankey-FChb26UX.js.map +1 -0
  136. package/dist/client/chunks/chart-scatter-DW0cAZ2H.js +255 -0
  137. package/dist/client/chunks/chart-scatter-DW0cAZ2H.js.map +1 -0
  138. package/dist/client/chunks/chart-sunburst-Clf-6WxW.js +221 -0
  139. package/dist/client/chunks/chart-sunburst-Clf-6WxW.js.map +1 -0
  140. package/dist/client/chunks/chart-tree-map-p_VwUJPF.js +298 -0
  141. package/dist/client/chunks/chart-tree-map-p_VwUJPF.js.map +1 -0
  142. package/dist/client/chunks/chart-waterfall-jt44IQ-w.js +237 -0
  143. package/dist/client/chunks/chart-waterfall-jt44IQ-w.js.map +1 -0
  144. package/dist/client/chunks/charts-core-CUVzf4cV.js +215 -0
  145. package/dist/client/chunks/charts-core-CUVzf4cV.js.map +1 -0
  146. package/dist/client/chunks/charts-loader-AGpph8_I.js +259 -0
  147. package/dist/client/chunks/charts-loader-AGpph8_I.js.map +1 -0
  148. package/dist/client/chunks/core-D1TOj17W.js +845 -0
  149. package/dist/client/chunks/core-D1TOj17W.js.map +1 -0
  150. package/dist/client/chunks/dist-DDBeV_JI.js +847 -0
  151. package/dist/client/chunks/dist-DDBeV_JI.js.map +1 -0
  152. package/dist/client/chunks/javascript-BBwTSo6e.js +438 -0
  153. package/dist/client/chunks/javascript-BBwTSo6e.js.map +1 -0
  154. package/dist/client/chunks/json-BpTrLZSh.js +38 -0
  155. package/dist/client/chunks/json-BpTrLZSh.js.map +1 -0
  156. package/dist/client/chunks/lazyChartConfigRegistry-BjhxDaSf.js +149 -0
  157. package/dist/client/chunks/lazyChartConfigRegistry-BjhxDaSf.js.map +1 -0
  158. package/dist/client/chunks/providers-DX3Vw5kc.js +7 -0
  159. package/dist/client/chunks/providers-DX3Vw5kc.js.map +1 -0
  160. package/dist/client/chunks/retention-UEXlSdZ-.js +132 -0
  161. package/dist/client/chunks/retention-UEXlSdZ-.js.map +1 -0
  162. package/dist/client/chunks/rolldown-runtime-lc2dmIiU.js +20 -0
  163. package/dist/client/chunks/schema-visualization-ZugB4Io9.js +1073 -0
  164. package/dist/client/chunks/schema-visualization-ZugB4Io9.js.map +1 -0
  165. package/dist/client/chunks/sql-B0chxcEK.js +120 -0
  166. package/dist/client/chunks/sql-B0chxcEK.js.map +1 -0
  167. package/dist/client/chunks/syntaxHighlighting-87bOwTxj.js +30 -0
  168. package/dist/client/chunks/syntaxHighlighting-87bOwTxj.js.map +1 -0
  169. package/dist/client/chunks/useDebounce-BQjNWndQ.js +1394 -0
  170. package/dist/client/chunks/useDebounce-BQjNWndQ.js.map +1 -0
  171. package/dist/client/chunks/useDirtyStateTracking-CgKZWkel.js +66 -0
  172. package/dist/client/chunks/useDirtyStateTracking-CgKZWkel.js.map +1 -0
  173. package/dist/client/chunks/useExplainAI-c_bHxZe5.js +203 -0
  174. package/dist/client/chunks/useExplainAI-c_bHxZe5.js.map +1 -0
  175. package/dist/client/chunks/useNotebookLayout-BFZ_33Kb.js +37 -0
  176. package/dist/client/chunks/useNotebookLayout-BFZ_33Kb.js.map +1 -0
  177. package/dist/client/chunks/utils-A54Ny29G.js +128 -0
  178. package/dist/client/chunks/utils-A54Ny29G.js.map +1 -0
  179. package/dist/client/chunks/vendor-CoPBRumI.js +828 -0
  180. package/dist/client/chunks/vendor-CoPBRumI.js.map +1 -0
  181. package/dist/client/components.js +4 -18
  182. package/dist/client/hooks.js +6 -58
  183. package/dist/client/icons.js +2 -15
  184. package/dist/client/index.js +1061 -1295
  185. package/dist/client/index.js.map +1 -1
  186. package/dist/client/providers.js +3 -9
  187. package/dist/client/styles.css +2 -1
  188. package/dist/client/types.d.ts +1 -0
  189. package/dist/client/utils.js +7 -74
  190. package/dist/client-bundle-stats.html +1 -1
  191. package/dist/server/anthropic-BsNspi1r.js +140 -0
  192. package/dist/server/anthropic-DsCEX6Fm.cjs +1 -0
  193. package/dist/server/dist-CMWZC51B.js +581 -0
  194. package/dist/server/dist-DxegvyZF.cjs +2 -0
  195. package/dist/server/google-BXwMolCu.js +154 -0
  196. package/dist/server/google-DzQWXFwF.cjs +2 -0
  197. package/dist/server/index.cjs +109 -129
  198. package/dist/server/index.js +15089 -34394
  199. package/dist/server/openai-BPhmb8mi.js +4114 -0
  200. package/dist/server/openai-CLsoLaue.cjs +1 -0
  201. package/dist/server/openai-D1kZ5sdM.js +153 -0
  202. package/dist/server/openai-DkOKbVLC.cjs +16 -0
  203. package/package.json +5 -5
  204. package/dist/adapters/anthropic-BTkjgFpT.cjs +0 -1
  205. package/dist/adapters/anthropic-CTu9E801.js +0 -126
  206. package/dist/adapters/google-BAK9pnQf.cjs +0 -2
  207. package/dist/adapters/google-DficVAsJ.js +0 -146
  208. package/dist/adapters/handler-BHguLZOY.js +0 -2713
  209. package/dist/adapters/handler-DOIyiFPg.cjs +0 -39
  210. package/dist/adapters/index-BgCeQBuN.cjs +0 -2
  211. package/dist/adapters/index-C3PskWTr.js +0 -5353
  212. package/dist/adapters/index-C45_meK_.js +0 -719
  213. package/dist/adapters/index-ht4NPca9.cjs +0 -23
  214. package/dist/adapters/mcp-transport-CWGqDQSI.cjs +0 -259
  215. package/dist/adapters/mcp-transport-CyeHMDPl.js +0 -11055
  216. package/dist/adapters/openai-BvA6eLs8.cjs +0 -1
  217. package/dist/adapters/openai-mcE24du8.js +0 -131
  218. package/dist/client/charts.js.map +0 -1
  219. package/dist/client/chunks/RetentionCombinedChart--SnU4Y_I.js +0 -256
  220. package/dist/client/chunks/RetentionCombinedChart--SnU4Y_I.js.map +0 -1
  221. package/dist/client/chunks/RetentionCombinedChart.config-Bbp2ghim.js +0 -48
  222. package/dist/client/chunks/RetentionCombinedChart.config-Bbp2ghim.js.map +0 -1
  223. package/dist/client/chunks/RetentionHeatmap-BHYU8MXY.js +0 -178
  224. package/dist/client/chunks/RetentionHeatmap-BHYU8MXY.js.map +0 -1
  225. package/dist/client/chunks/RetentionHeatmap.config-BWf_-vdj.js +0 -29
  226. package/dist/client/chunks/RetentionHeatmap.config-BWf_-vdj.js.map +0 -1
  227. package/dist/client/chunks/analysis-builder-DMFoAkjT.js +0 -6203
  228. package/dist/client/chunks/analysis-builder-DMFoAkjT.js.map +0 -1
  229. package/dist/client/chunks/analysis-builder-shared-CunrT3gi.js +0 -3140
  230. package/dist/client/chunks/analysis-builder-shared-CunrT3gi.js.map +0 -1
  231. package/dist/client/chunks/chart-activity-grid-DCznpK6N.js +0 -347
  232. package/dist/client/chunks/chart-activity-grid-DCznpK6N.js.map +0 -1
  233. package/dist/client/chunks/chart-area-CqKRIUpj.js +0 -234
  234. package/dist/client/chunks/chart-area-CqKRIUpj.js.map +0 -1
  235. package/dist/client/chunks/chart-bar-Bl5jvrU_.js +0 -267
  236. package/dist/client/chunks/chart-bar-Bl5jvrU_.js.map +0 -1
  237. package/dist/client/chunks/chart-box-plot-CzMb00z_.js +0 -322
  238. package/dist/client/chunks/chart-box-plot-CzMb00z_.js.map +0 -1
  239. package/dist/client/chunks/chart-bubble-BF8Z52eW.js +0 -249
  240. package/dist/client/chunks/chart-bubble-BF8Z52eW.js.map +0 -1
  241. package/dist/client/chunks/chart-candlestick-ByWS945g.js +0 -269
  242. package/dist/client/chunks/chart-candlestick-ByWS945g.js.map +0 -1
  243. package/dist/client/chunks/chart-config-activity-grid-CmOqDuOT.js +0 -50
  244. package/dist/client/chunks/chart-config-activity-grid-CmOqDuOT.js.map +0 -1
  245. package/dist/client/chunks/chart-config-area-CK_GVApT.js +0 -77
  246. package/dist/client/chunks/chart-config-area-CK_GVApT.js.map +0 -1
  247. package/dist/client/chunks/chart-config-bar-C8uzktxl.js +0 -71
  248. package/dist/client/chunks/chart-config-bar-C8uzktxl.js.map +0 -1
  249. package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js +0 -38
  250. package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js.map +0 -1
  251. package/dist/client/chunks/chart-config-bubble-q3DoQX5F.js +0 -71
  252. package/dist/client/chunks/chart-config-bubble-q3DoQX5F.js.map +0 -1
  253. package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js +0 -70
  254. package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js.map +0 -1
  255. package/dist/client/chunks/chart-config-data-table-B20Y5JCm.js +0 -28
  256. package/dist/client/chunks/chart-config-data-table-B20Y5JCm.js.map +0 -1
  257. package/dist/client/chunks/chart-config-funnel-3eYnGg8M.js +0 -92
  258. package/dist/client/chunks/chart-config-funnel-3eYnGg8M.js.map +0 -1
  259. package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js +0 -64
  260. package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js.map +0 -1
  261. package/dist/client/chunks/chart-config-heat-map-_wEnTnRA.js +0 -77
  262. package/dist/client/chunks/chart-config-heat-map-_wEnTnRA.js.map +0 -1
  263. package/dist/client/chunks/chart-config-kpi-delta-DLGZ2A3X.js +0 -97
  264. package/dist/client/chunks/chart-config-kpi-delta-DLGZ2A3X.js.map +0 -1
  265. package/dist/client/chunks/chart-config-kpi-number-K-wzviXF.js +0 -75
  266. package/dist/client/chunks/chart-config-kpi-number-K-wzviXF.js.map +0 -1
  267. package/dist/client/chunks/chart-config-kpi-text-BjYqwqaJ.js +0 -47
  268. package/dist/client/chunks/chart-config-kpi-text-BjYqwqaJ.js.map +0 -1
  269. package/dist/client/chunks/chart-config-line-JNagi9tf.js +0 -88
  270. package/dist/client/chunks/chart-config-line-JNagi9tf.js.map +0 -1
  271. package/dist/client/chunks/chart-config-markdown-BWQSjJpy.js +0 -97
  272. package/dist/client/chunks/chart-config-markdown-BWQSjJpy.js.map +0 -1
  273. package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js +0 -70
  274. package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js.map +0 -1
  275. package/dist/client/chunks/chart-config-pie-CNLXb-fr.js +0 -39
  276. package/dist/client/chunks/chart-config-pie-CNLXb-fr.js.map +0 -1
  277. package/dist/client/chunks/chart-config-radar-oxHfRAa3.js +0 -44
  278. package/dist/client/chunks/chart-config-radar-oxHfRAa3.js.map +0 -1
  279. package/dist/client/chunks/chart-config-radial-bar-_Aw3jAEm.js +0 -37
  280. package/dist/client/chunks/chart-config-radial-bar-_Aw3jAEm.js.map +0 -1
  281. package/dist/client/chunks/chart-config-sankey-C8FX9hGF.js +0 -61
  282. package/dist/client/chunks/chart-config-sankey-C8FX9hGF.js.map +0 -1
  283. package/dist/client/chunks/chart-config-scatter-DFKM80eO.js +0 -53
  284. package/dist/client/chunks/chart-config-scatter-DFKM80eO.js.map +0 -1
  285. package/dist/client/chunks/chart-config-sunburst-BmC0NLTU.js +0 -50
  286. package/dist/client/chunks/chart-config-sunburst-BmC0NLTU.js.map +0 -1
  287. package/dist/client/chunks/chart-config-tree-map-DGMbNTaa.js +0 -47
  288. package/dist/client/chunks/chart-config-tree-map-DGMbNTaa.js.map +0 -1
  289. package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js +0 -60
  290. package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js.map +0 -1
  291. package/dist/client/chunks/chart-data-table-HwfF-Ujv.js +0 -293
  292. package/dist/client/chunks/chart-data-table-HwfF-Ujv.js.map +0 -1
  293. package/dist/client/chunks/chart-funnel-WmuoWlCq.js +0 -259
  294. package/dist/client/chunks/chart-funnel-WmuoWlCq.js.map +0 -1
  295. package/dist/client/chunks/chart-gauge-Cot4By-w.js +0 -374
  296. package/dist/client/chunks/chart-gauge-Cot4By-w.js.map +0 -1
  297. package/dist/client/chunks/chart-heat-map-bGNtsZMr.js +0 -231
  298. package/dist/client/chunks/chart-heat-map-bGNtsZMr.js.map +0 -1
  299. package/dist/client/chunks/chart-kpi-delta-DeyKMxgq.js +0 -351
  300. package/dist/client/chunks/chart-kpi-delta-DeyKMxgq.js.map +0 -1
  301. package/dist/client/chunks/chart-kpi-number-D1z1gxXO.js +0 -476
  302. package/dist/client/chunks/chart-kpi-number-D1z1gxXO.js.map +0 -1
  303. package/dist/client/chunks/chart-kpi-text-b7q6KWc0.js +0 -165
  304. package/dist/client/chunks/chart-kpi-text-b7q6KWc0.js.map +0 -1
  305. package/dist/client/chunks/chart-line-3Nf-EPqJ.js +0 -450
  306. package/dist/client/chunks/chart-line-3Nf-EPqJ.js.map +0 -1
  307. package/dist/client/chunks/chart-markdown-BT_-MBq1.js +0 -2721
  308. package/dist/client/chunks/chart-markdown-BT_-MBq1.js.map +0 -1
  309. package/dist/client/chunks/chart-measure-profile-BVjUonqU.js +0 -114
  310. package/dist/client/chunks/chart-measure-profile-BVjUonqU.js.map +0 -1
  311. package/dist/client/chunks/chart-pie-DblG6w7g.js +0 -137
  312. package/dist/client/chunks/chart-pie-DblG6w7g.js.map +0 -1
  313. package/dist/client/chunks/chart-radar-BHZbeeTg.js +0 -129
  314. package/dist/client/chunks/chart-radar-BHZbeeTg.js.map +0 -1
  315. package/dist/client/chunks/chart-radial-bar-AlEJC1Jo.js +0 -119
  316. package/dist/client/chunks/chart-radial-bar-AlEJC1Jo.js.map +0 -1
  317. package/dist/client/chunks/chart-sankey-E8vYKjQF.js +0 -189
  318. package/dist/client/chunks/chart-sankey-E8vYKjQF.js.map +0 -1
  319. package/dist/client/chunks/chart-scatter-Bbxqi0iw.js +0 -202
  320. package/dist/client/chunks/chart-scatter-Bbxqi0iw.js.map +0 -1
  321. package/dist/client/chunks/chart-sunburst-BgnTKolT.js +0 -188
  322. package/dist/client/chunks/chart-sunburst-BgnTKolT.js.map +0 -1
  323. package/dist/client/chunks/chart-tree-map-i9LGCLwl.js +0 -284
  324. package/dist/client/chunks/chart-tree-map-i9LGCLwl.js.map +0 -1
  325. package/dist/client/chunks/chart-waterfall-BeIhCm83.js +0 -191
  326. package/dist/client/chunks/chart-waterfall-BeIhCm83.js.map +0 -1
  327. package/dist/client/chunks/charts-core-BUUO36OM.js +0 -692
  328. package/dist/client/chunks/charts-core-BUUO36OM.js.map +0 -1
  329. package/dist/client/chunks/charts-loader-goTYnavu.js +0 -258
  330. package/dist/client/chunks/charts-loader-goTYnavu.js.map +0 -1
  331. package/dist/client/chunks/components-BFgYvFq6.js +0 -10066
  332. package/dist/client/chunks/components-BFgYvFq6.js.map +0 -1
  333. package/dist/client/chunks/core-Y9e-sNfb.js +0 -1068
  334. package/dist/client/chunks/core-Y9e-sNfb.js.map +0 -1
  335. package/dist/client/chunks/flow-utils-CjQZG5qq.js +0 -16
  336. package/dist/client/chunks/flow-utils-CjQZG5qq.js.map +0 -1
  337. package/dist/client/chunks/funnel-utils-CyonoNeC.js +0 -135
  338. package/dist/client/chunks/funnel-utils-CyonoNeC.js.map +0 -1
  339. package/dist/client/chunks/icons-CwvgmdIP.js +0 -1636
  340. package/dist/client/chunks/icons-CwvgmdIP.js.map +0 -1
  341. package/dist/client/chunks/index-CApFCBF9.js +0 -81
  342. package/dist/client/chunks/index-CApFCBF9.js.map +0 -1
  343. package/dist/client/chunks/index-_2PSgbkC.js +0 -1046
  344. package/dist/client/chunks/index-_2PSgbkC.js.map +0 -1
  345. package/dist/client/chunks/javascript-DII1YQGr.js +0 -659
  346. package/dist/client/chunks/javascript-DII1YQGr.js.map +0 -1
  347. package/dist/client/chunks/json-C_6Prymp.js +0 -39
  348. package/dist/client/chunks/json-C_6Prymp.js.map +0 -1
  349. package/dist/client/chunks/providers-Ds7DRmnO.js +0 -554
  350. package/dist/client/chunks/providers-Ds7DRmnO.js.map +0 -1
  351. package/dist/client/chunks/retention-CzCo8262.js +0 -120
  352. package/dist/client/chunks/retention-CzCo8262.js.map +0 -1
  353. package/dist/client/chunks/schema-visualization-B97a1Ybu.js +0 -772
  354. package/dist/client/chunks/schema-visualization-B97a1Ybu.js.map +0 -1
  355. package/dist/client/chunks/sql-IeKX8fQ8.js +0 -616
  356. package/dist/client/chunks/sql-IeKX8fQ8.js.map +0 -1
  357. package/dist/client/chunks/syntaxHighlighting-DAMSW_A6.js +0 -34
  358. package/dist/client/chunks/syntaxHighlighting-DAMSW_A6.js.map +0 -1
  359. package/dist/client/chunks/theme-Dp3hFed1.js +0 -112
  360. package/dist/client/chunks/theme-Dp3hFed1.js.map +0 -1
  361. package/dist/client/chunks/useDirtyStateTracking-CyAXd07d.js +0 -1231
  362. package/dist/client/chunks/useDirtyStateTracking-CyAXd07d.js.map +0 -1
  363. package/dist/client/chunks/useExplainAI-CfQ_JmF1.js +0 -182
  364. package/dist/client/chunks/useExplainAI-CfQ_JmF1.js.map +0 -1
  365. package/dist/client/chunks/vendor-B2EH3V58.js +0 -2892
  366. package/dist/client/chunks/vendor-B2EH3V58.js.map +0 -1
  367. package/dist/client/components.js.map +0 -1
  368. package/dist/client/hooks.js.map +0 -1
  369. package/dist/client/icons.js.map +0 -1
  370. package/dist/client/providers.js.map +0 -1
  371. package/dist/client/utils.js.map +0 -1
  372. package/dist/server/anthropic-BTkjgFpT.cjs +0 -1
  373. package/dist/server/anthropic-CTu9E801.js +0 -126
  374. package/dist/server/google-BAK9pnQf.cjs +0 -2
  375. package/dist/server/google-DficVAsJ.js +0 -146
  376. package/dist/server/index-BgCeQBuN.cjs +0 -2
  377. package/dist/server/index-C3PskWTr.js +0 -5353
  378. package/dist/server/index-C45_meK_.js +0 -719
  379. package/dist/server/index-ht4NPca9.cjs +0 -23
  380. package/dist/server/openai-BvA6eLs8.cjs +0 -1
  381. package/dist/server/openai-mcE24du8.js +0 -131
@@ -1,3140 +0,0 @@
1
- import { jsxs as S, jsx as C, Fragment as z } from "react/jsx-runtime";
2
- import Ee, { memo as Rn, useState as Pe, useContext as mt, createContext as kn, useRef as Se, useMemo as A, useCallback as U, useEffect as he } from "react";
3
- import { $ as In, a0 as Ue, a1 as $, a2 as pe, a3 as W, a4 as J, a5 as X, V as qn, O as yt, g as Bn } from "./components-BFgYvFq6.js";
4
- import { a as Vn, g as Nn } from "./providers-Ds7DRmnO.js";
5
- import { e as En, f as nt, h as rt, s as it, p as Pn, i as Un, l as gt } from "./vendor-B2EH3V58.js";
6
- import { d as _n, R as Ln, a as Kn, g as $n, D as Gn } from "./retention-CzCo8262.js";
7
- import { F as st, b as at } from "./flow-utils-CjQZG5qq.js";
8
- import { o as On, u as Hn, a as jn, b as zn, e as Wn, p as Jn } from "./useDirtyStateTracking-CyAXd07d.js";
9
- import { c as Xn, a as ht } from "./funnel-utils-CyonoNeC.js";
10
- import { b as Yn, u as Be } from "./useExplainAI-CfQ_JmF1.js";
11
- function Zn(t) {
12
- const i = /* @__PURE__ */ new Date(), e = t.toLowerCase().trim(), n = i.getUTCFullYear(), r = i.getUTCMonth(), s = i.getUTCDate(), o = i.getUTCDay();
13
- if (e === "today") {
14
- const y = new Date(i);
15
- y.setUTCHours(0, 0, 0, 0);
16
- const d = new Date(i);
17
- return d.setUTCHours(23, 59, 59, 999), { start: y, end: d };
18
- }
19
- if (e === "yesterday") {
20
- const y = new Date(i);
21
- y.setUTCDate(s - 1), y.setUTCHours(0, 0, 0, 0);
22
- const d = new Date(i);
23
- return d.setUTCDate(s - 1), d.setUTCHours(23, 59, 59, 999), { start: y, end: d };
24
- }
25
- if (e === "this week") {
26
- const y = o === 0 ? -6 : 1 - o, d = new Date(i);
27
- d.setUTCDate(s + y), d.setUTCHours(0, 0, 0, 0);
28
- const p = new Date(d);
29
- return p.setUTCDate(d.getUTCDate() + 6), p.setUTCHours(23, 59, 59, 999), { start: d, end: p };
30
- }
31
- if (e === "this month") {
32
- const y = new Date(Date.UTC(n, r, 1, 0, 0, 0, 0)), d = new Date(Date.UTC(n, r + 1, 0, 23, 59, 59, 999));
33
- return { start: y, end: d };
34
- }
35
- if (e === "this quarter") {
36
- const y = Math.floor(r / 3), d = new Date(Date.UTC(n, y * 3, 1, 0, 0, 0, 0)), p = new Date(Date.UTC(n, y * 3 + 3, 0, 23, 59, 59, 999));
37
- return { start: d, end: p };
38
- }
39
- if (e === "this year") {
40
- const y = new Date(Date.UTC(n, 0, 1, 0, 0, 0, 0)), d = new Date(Date.UTC(n, 11, 31, 23, 59, 59, 999));
41
- return { start: y, end: d };
42
- }
43
- const l = e.match(/^last\s+(\d+)\s+days?$/);
44
- if (l) {
45
- const y = parseInt(l[1], 10), d = new Date(i);
46
- d.setUTCDate(s - y + 1), d.setUTCHours(0, 0, 0, 0);
47
- const p = new Date(i);
48
- return p.setUTCHours(23, 59, 59, 999), { start: d, end: p };
49
- }
50
- const u = e.match(/^last\s+(\d+)\s+weeks?$/);
51
- if (u) {
52
- const d = parseInt(u[1], 10) * 7, p = new Date(i);
53
- p.setUTCDate(s - d + 1), p.setUTCHours(0, 0, 0, 0);
54
- const b = new Date(i);
55
- return b.setUTCHours(23, 59, 59, 999), { start: p, end: b };
56
- }
57
- if (e === "last week") {
58
- const y = o === 0 ? -13 : -6 - o, d = new Date(i);
59
- d.setUTCDate(s + y), d.setUTCHours(0, 0, 0, 0);
60
- const p = new Date(d);
61
- return p.setUTCDate(d.getUTCDate() + 6), p.setUTCHours(23, 59, 59, 999), { start: d, end: p };
62
- }
63
- if (e === "last month") {
64
- const y = new Date(Date.UTC(n, r - 1, 1, 0, 0, 0, 0)), d = new Date(Date.UTC(n, r, 0, 23, 59, 59, 999));
65
- return { start: y, end: d };
66
- }
67
- if (e === "last quarter") {
68
- const y = Math.floor(r / 3), d = y === 0 ? 3 : y - 1, p = y === 0 ? n - 1 : n, b = new Date(Date.UTC(p, d * 3, 1, 0, 0, 0, 0)), w = new Date(Date.UTC(p, d * 3 + 3, 0, 23, 59, 59, 999));
69
- return { start: b, end: w };
70
- }
71
- if (e === "last year") {
72
- const y = new Date(Date.UTC(n - 1, 0, 1, 0, 0, 0, 0)), d = new Date(Date.UTC(n - 1, 11, 31, 23, 59, 59, 999));
73
- return { start: y, end: d };
74
- }
75
- if (e === "last 12 months") {
76
- const y = new Date(Date.UTC(n, r - 11, 1, 0, 0, 0, 0)), d = new Date(i);
77
- return d.setUTCHours(23, 59, 59, 999), { start: y, end: d };
78
- }
79
- const f = e.match(/^last\s+(\d+)\s+months?$/);
80
- if (f) {
81
- const y = parseInt(f[1], 10), d = new Date(Date.UTC(n, r - y + 1, 1, 0, 0, 0, 0)), p = new Date(i);
82
- return p.setUTCHours(23, 59, 59, 999), { start: d, end: p };
83
- }
84
- const m = e.match(/^last\s+(\d+)\s+years?$/);
85
- if (m) {
86
- const y = parseInt(m[1], 10), d = new Date(Date.UTC(n - y, 0, 1, 0, 0, 0, 0)), p = new Date(i);
87
- return p.setUTCHours(23, 59, 59, 999), { start: d, end: p };
88
- }
89
- return null;
90
- }
91
- function er(t) {
92
- if (Array.isArray(t)) {
93
- if (t.length < 2) return null;
94
- const i = new Date(t[0]), e = new Date(t[1]);
95
- return isNaN(i.getTime()) || isNaN(e.getTime()) ? null : (e.setUTCHours(23, 59, 59, 999), { start: i, end: e });
96
- }
97
- return Zn(t);
98
- }
99
- function ge(t) {
100
- return t.toISOString().split("T")[0];
101
- }
102
- function tr(t, i) {
103
- const e = i.getTime() - t.getTime(), n = Math.ceil(e / (1e3 * 60 * 60 * 24)), r = new Date(t);
104
- r.setUTCDate(r.getUTCDate() - 1), r.setUTCHours(23, 59, 59, 999);
105
- const s = new Date(r);
106
- return s.setUTCDate(s.getUTCDate() - n + 1), s.setUTCHours(0, 0, 0, 0), { start: s, end: r };
107
- }
108
- function pt(t, i) {
109
- for (const e of t)
110
- if ("type" in e && "filters" in e) {
111
- const r = pt(e.filters, i);
112
- if (r) return r;
113
- } else if ("member" in e) {
114
- const n = e;
115
- if (n.member === i && n.operator === "inDateRange" && n.dateRange)
116
- return { dateRange: n.dateRange };
117
- }
118
- }
119
- function Ct(t, i) {
120
- const e = pt(i, t);
121
- if (!e?.dateRange) return;
122
- const n = er(e.dateRange);
123
- if (!n) return;
124
- const r = tr(n.start, n.end);
125
- return [
126
- [ge(n.start), ge(n.end)],
127
- [ge(r.start), ge(r.end)]
128
- ];
129
- }
130
- function wt(t, i) {
131
- return t.reduce((e, n) => {
132
- if ("type" in n && "filters" in n) {
133
- const r = n, s = wt(r.filters, i);
134
- s.length > 0 && e.push({ type: r.type, filters: s });
135
- } else if ("member" in n) {
136
- const r = n;
137
- r.member === i && r.operator === "inDateRange" || e.push(n);
138
- } else
139
- e.push(n);
140
- return e;
141
- }, []);
142
- }
143
- function Ce(t, i, e, n, r = !1) {
144
- const s = i.filter((u) => u.isTimeDimension && u.enableComparison).map((u) => u.field);
145
- let o = e;
146
- if (!r)
147
- for (const u of s)
148
- o = wt(o, u);
149
- o = o.filter((u) => In(u));
150
- const l = {
151
- measures: t.map((u) => u.field),
152
- dimensions: i.filter((u) => !u.isTimeDimension).map((u) => u.field),
153
- timeDimensions: i.filter((u) => u.isTimeDimension).map((u) => {
154
- const f = {
155
- dimension: u.field,
156
- granularity: u.granularity || "day"
157
- };
158
- if (u.enableComparison) {
159
- const m = Ct(u.field, e);
160
- m && (f.compareDateRange = m);
161
- }
162
- return f;
163
- }),
164
- filters: o.length > 0 ? o : void 0,
165
- order: n && Object.keys(n).length > 0 ? n : void 0
166
- };
167
- return l.measures?.length === 0 && delete l.measures, l.dimensions?.length === 0 && delete l.dimensions, l.timeDimensions?.length === 0 && delete l.timeDimensions, l;
168
- }
169
- const nr = "drizzle-cube-analysis-builder-v3";
170
- function R() {
171
- return {
172
- metrics: [],
173
- breakdowns: [],
174
- filters: [],
175
- order: void 0,
176
- validationStatus: "idle",
177
- validationError: null
178
- };
179
- }
180
- function St(t) {
181
- return t.isTimeDimension;
182
- }
183
- function rr(t) {
184
- return t.find(St);
185
- }
186
- function ir(t) {
187
- return t.find((i) => !i.isTimeDimension);
188
- }
189
- function je(t) {
190
- return t.filter((i) => !i.isTimeDimension);
191
- }
192
- function bt(t) {
193
- return t.filter(St);
194
- }
195
- function ze(t, i, e) {
196
- const n = i.length, r = je(e).length, s = bt(e).length, o = e.length;
197
- switch (t) {
198
- // Always available charts
199
- case "table":
200
- case "markdown":
201
- return { available: !0 };
202
- // Measure-only charts (KPI Number, KPI Text)
203
- case "kpiNumber":
204
- case "kpiText":
205
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : { available: !0 };
206
- // Bar chart - needs dimension for categories + measure for values
207
- case "bar":
208
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : o < 1 ? { available: !1, reason: "Requires at least 1 breakdown for categories" } : { available: !0 };
209
- // KPI Delta - needs dimension for ordering + measure for values
210
- case "kpiDelta":
211
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : o < 1 ? { available: !1, reason: "Requires at least 1 breakdown for ordering" } : { available: !0 };
212
- // Line and area charts - need dimension/time + measure
213
- case "line":
214
- case "area":
215
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : o < 1 ? { available: !1, reason: "Requires a breakdown (dimension or time)" } : { available: !0 };
216
- // Pie chart - needs dimension (not time) + measure
217
- case "pie":
218
- return n < 1 ? { available: !1, reason: "Requires 1 measure" } : r < 1 ? { available: !1, reason: "Requires 1 dimension (not time dimension)" } : { available: !0 };
219
- // Scatter - needs measure + any breakdown
220
- case "scatter":
221
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : n < 2 && o < 1 ? { available: !1, reason: "Requires 2 measures or 1 measure + 1 breakdown" } : { available: !0 };
222
- // Bubble - needs 2+ measures and 1+ breakdown (dimension or time dimension for series)
223
- case "bubble":
224
- return n < 2 ? { available: !1, reason: "Requires at least 2 measures" } : o < 1 ? { available: !1, reason: "Requires at least 1 breakdown for series grouping" } : { available: !0 };
225
- // Radar - needs dimension + measure
226
- case "radar":
227
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : r < 1 ? { available: !1, reason: "Requires at least 1 dimension" } : { available: !0 };
228
- // Radial Bar - needs dimension + measure
229
- case "radialBar":
230
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : r < 1 ? { available: !1, reason: "Requires at least 1 dimension" } : { available: !0 };
231
- // Treemap - needs dimension + measure
232
- case "treemap":
233
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : r < 1 ? { available: !1, reason: "Requires at least 1 dimension" } : { available: !0 };
234
- // Activity Grid - needs time dimension + measure
235
- case "activityGrid":
236
- return n < 1 ? { available: !1, reason: "Requires at least 1 measure" } : s < 1 ? { available: !1, reason: "Requires a time dimension" } : { available: !0 };
237
- default:
238
- return { available: !0 };
239
- }
240
- }
241
- function sr(t, i) {
242
- const e = [
243
- "activityGrid",
244
- "area",
245
- "bar",
246
- "bubble",
247
- "kpiDelta",
248
- "kpiNumber",
249
- "kpiText",
250
- "line",
251
- "markdown",
252
- "pie",
253
- "radar",
254
- "radialBar",
255
- "scatter",
256
- "table",
257
- "treemap"
258
- ], n = {};
259
- for (const r of e)
260
- n[r] = ze(r, t, i);
261
- return n;
262
- }
263
- function vt(t, i, e) {
264
- if (ze(e, t, i).available || t.length === 0 && i.length === 0)
265
- return e;
266
- const r = bt(i).length > 0, s = je(i).length > 0, o = t.length > 0;
267
- return r && o ? "line" : s && o ? "bar" : o && !s && !r ? "kpiNumber" : "table";
268
- }
269
- function Ve(t, i, e) {
270
- const n = vt(t, i, e), r = ar(n, t, i);
271
- return { chartType: n, chartConfig: r };
272
- }
273
- function ar(t, i, e) {
274
- const n = rr(e), r = ir(e), s = je(e), o = e;
275
- switch (t) {
276
- case "line":
277
- case "area":
278
- return {
279
- xAxis: n ? [n.field] : r ? [r.field] : [],
280
- yAxis: i.map((l) => l.field),
281
- series: s.length > 1 ? [s[1].field] : r && n ? [r.field] : []
282
- };
283
- case "bar":
284
- return {
285
- xAxis: r ? [r.field] : n ? [n.field] : [],
286
- yAxis: i.map((l) => l.field),
287
- series: s.length > 1 ? [s[1].field] : n && r ? [n.field] : []
288
- };
289
- case "pie":
290
- return {
291
- xAxis: r ? [r.field] : [],
292
- yAxis: i.length > 0 ? [i[0].field] : []
293
- };
294
- case "scatter":
295
- return i.length >= 2 ? {
296
- xAxis: [i[0].field],
297
- yAxis: [i[1].field],
298
- series: r ? [r.field] : []
299
- } : {
300
- xAxis: o.length > 0 ? [o[0].field] : [],
301
- yAxis: i.length > 0 ? [i[0].field] : [],
302
- series: s.length > 1 ? [s[1].field] : []
303
- };
304
- case "bubble":
305
- return {
306
- xAxis: i.length > 0 ? [i[0].field] : [],
307
- yAxis: i.length > 1 ? [i[1].field] : [],
308
- sizeField: i.length > 2 ? i[2].field : i.length > 1 ? i[1].field : void 0,
309
- series: r ? [r.field] : n ? [n.field] : []
310
- };
311
- case "radar":
312
- case "radialBar":
313
- case "treemap":
314
- return {
315
- xAxis: r ? [r.field] : [],
316
- yAxis: i.length > 0 ? [i[0].field] : []
317
- };
318
- case "activityGrid":
319
- return {
320
- dateField: n ? [n.field] : [],
321
- valueField: i.length > 0 ? [i[0].field] : []
322
- };
323
- case "kpiNumber":
324
- case "kpiDelta":
325
- case "kpiText":
326
- return {
327
- yAxis: i.length > 0 ? [i[0].field] : []
328
- };
329
- case "table":
330
- return {
331
- xAxis: [
332
- ...e.map((l) => l.field),
333
- ...i.map((l) => l.field)
334
- ]
335
- };
336
- case "markdown":
337
- return {};
338
- default:
339
- return {
340
- xAxis: o.length > 0 ? [o[0].field] : [],
341
- yAxis: i.map((l) => l.field)
342
- };
343
- }
344
- }
345
- function or(t, i, e, n) {
346
- if (n && ze(e, t, i).available)
347
- return null;
348
- const r = vt(t, i, e);
349
- return r !== e ? r : null;
350
- }
351
- function H(t) {
352
- return typeof t == "string" ? t : typeof t == "object" && t !== null ? JSON.stringify(t) : String(t ?? "");
353
- }
354
- const lr = {
355
- good: "bg-dc-success-bg text-dc-success border-dc-success",
356
- warning: "bg-dc-warning-bg text-dc-warning border-dc-warning",
357
- critical: "bg-dc-danger-bg text-dc-error border-dc-error"
358
- }, cr = {
359
- critical: "bg-dc-danger-bg text-dc-error",
360
- warning: "bg-dc-warning-bg text-dc-warning",
361
- suggestion: "bg-dc-accent-bg text-dc-accent"
362
- }, dr = {
363
- high: "text-dc-error",
364
- medium: "text-dc-warning",
365
- low: "text-dc-text-muted"
366
- };
367
- function ur({ assessment: t, reason: i }) {
368
- const e = {
369
- good: "Good",
370
- warning: "Warning",
371
- critical: "Critical"
372
- };
373
- return /* @__PURE__ */ S("div", { className: `dc:p-4 dc:rounded-lg dc:border ${lr[t]}`, children: [
374
- /* @__PURE__ */ C("div", { className: "dc:flex dc:items-center dc:gap-2 dc:mb-1", children: /* @__PURE__ */ S("span", { className: "dc:font-semibold dc:uppercase dc:text-base", children: [
375
- t === "good" && "✓ ",
376
- t === "warning" && "⚠ ",
377
- t === "critical" && "✕ ",
378
- e[t]
379
- ] }) }),
380
- /* @__PURE__ */ C("p", { className: "dc:text-sm", children: H(i) })
381
- ] });
382
- }
383
- function fr({ issue: t }) {
384
- return /* @__PURE__ */ S("div", { className: "dc:flex dc:items-start dc:gap-2 dc:py-2", children: [
385
- /* @__PURE__ */ S("span", { className: `dc:text-sm ${dr[t.severity]}`, children: [
386
- t.severity === "high" && "●",
387
- t.severity === "medium" && "○",
388
- t.severity === "low" && "○"
389
- ] }),
390
- /* @__PURE__ */ C("span", { className: "dc:text-sm text-dc-text-secondary", children: H(t.description) })
391
- ] });
392
- }
393
- function ot({ text: t }) {
394
- const [i, e] = Ee.useState(!1);
395
- return /* @__PURE__ */ C(
396
- "button",
397
- {
398
- onClick: async () => {
399
- try {
400
- await navigator.clipboard.writeText(t), e(!0), setTimeout(() => e(!1), 2e3);
401
- } catch (r) {
402
- console.error("Failed to copy:", r);
403
- }
404
- },
405
- className: "dc:px-2 dc:py-1 dc:text-xs dc:rounded bg-dc-surface hover:bg-dc-surface-hover text-dc-text-muted",
406
- title: "Copy to clipboard",
407
- children: i ? "Copied!" : "Copy"
408
- }
409
- );
410
- }
411
- function mr({ rec: t }) {
412
- const i = {
413
- index: "INDEX",
414
- table: "TABLE",
415
- cube: "CUBE",
416
- general: "TIP"
417
- };
418
- return /* @__PURE__ */ S("div", { className: "dc:p-4 dc:border border-dc-border dc:rounded-lg bg-dc-surface", children: [
419
- /* @__PURE__ */ S("div", { className: "dc:flex dc:items-center dc:gap-2 dc:mb-2", children: [
420
- /* @__PURE__ */ C(
421
- "span",
422
- {
423
- className: `dc:px-2 dc:py-0.5 dc:text-xs dc:font-medium dc:rounded ${cr[t.severity]}`,
424
- children: i[t.type]
425
- }
426
- ),
427
- /* @__PURE__ */ C("h5", { className: "dc:font-medium text-dc-text", children: H(t.title) })
428
- ] }),
429
- /* @__PURE__ */ C("p", { className: "dc:text-sm text-dc-text-secondary dc:mb-3", children: H(t.description) }),
430
- t.sql && /* @__PURE__ */ C("div", { className: "dc:mt-2", children: /* @__PURE__ */ C(
431
- Ue,
432
- {
433
- code: t.sql,
434
- language: "sql",
435
- headerRight: /* @__PURE__ */ C(ot, { text: t.sql })
436
- }
437
- ) }),
438
- t.cubeCode && /* @__PURE__ */ S("div", { className: "dc:mt-2", children: [
439
- t.cubeName && /* @__PURE__ */ S("p", { className: "dc:text-xs text-dc-text-muted dc:mb-1", children: [
440
- "Add to ",
441
- /* @__PURE__ */ C("code", { className: "bg-dc-surface-secondary dc:px-1 dc:rounded", children: t.cubeName }),
442
- " cube:"
443
- ] }),
444
- /* @__PURE__ */ S("div", { className: "dc:relative", children: [
445
- /* @__PURE__ */ C("pre", { className: "dc:p-3 dc:text-xs bg-dc-surface-secondary dc:rounded dc:overflow-x-auto dc:font-mono text-dc-text", children: t.cubeCode }),
446
- /* @__PURE__ */ C("div", { className: "dc:absolute dc:top-1 dc:right-1", children: /* @__PURE__ */ C(ot, { text: t.cubeCode }) })
447
- ] })
448
- ] }),
449
- t.estimatedImpact && /* @__PURE__ */ S("p", { className: "dc:text-xs text-dc-text-muted dc:mt-2", children: [
450
- /* @__PURE__ */ C("strong", { children: "Expected impact:" }),
451
- " ",
452
- H(t.estimatedImpact)
453
- ] })
454
- ] });
455
- }
456
- function yr({ analysis: t, onClose: i, onClear: e }) {
457
- const n = i || e;
458
- return Ee.useEffect(() => {
459
- const r = (s) => {
460
- s.key === "Escape" && n && n();
461
- };
462
- return window.addEventListener("keydown", r), () => window.removeEventListener("keydown", r);
463
- }, [n]), Ee.useEffect(() => (document.body.style.overflow = "hidden", () => {
464
- document.body.style.overflow = "";
465
- }), []), /* @__PURE__ */ S("div", { className: "dc:fixed dc:inset-0 dc:z-50 dc:flex dc:items-center dc:justify-center dc:p-4 bg-black/50", children: [
466
- /* @__PURE__ */ C(
467
- "div",
468
- {
469
- className: "dc:absolute dc:inset-0",
470
- onClick: n,
471
- "aria-hidden": "true"
472
- }
473
- ),
474
- /* @__PURE__ */ S("div", { className: "dc:relative dc:w-full dc:max-w-4xl dc:max-h-[90vh] bg-dc-surface dc:rounded-lg dc:shadow-xl dc:flex dc:flex-col", children: [
475
- /* @__PURE__ */ S("div", { className: "dc:flex dc:items-center dc:justify-between dc:px-6 dc:py-4 dc:border-b border-dc-border dc:flex-shrink-0", children: [
476
- /* @__PURE__ */ S("div", { className: "dc:flex dc:items-center dc:gap-3", children: [
477
- /* @__PURE__ */ C("span", { className: "dc:text-lg", children: "✨" }),
478
- /* @__PURE__ */ C("h3", { className: "dc:text-lg dc:font-semibold text-dc-text", children: "AI Performance Analysis" })
479
- ] }),
480
- /* @__PURE__ */ C(
481
- "button",
482
- {
483
- onClick: n,
484
- className: "dc:p-2 dc:rounded-lg hover:bg-dc-surface-hover text-dc-text-secondary hover:text-dc-text dc:transition-colors",
485
- "aria-label": "Close",
486
- children: /* @__PURE__ */ C("svg", { className: "dc:w-5 dc:h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ C("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
487
- }
488
- )
489
- ] }),
490
- /* @__PURE__ */ S("div", { className: "dc:flex-1 dc:overflow-y-auto dc:px-6 dc:py-4 dc:space-y-6", children: [
491
- /* @__PURE__ */ C(
492
- ur,
493
- {
494
- assessment: t.assessment,
495
- reason: t.assessmentReason
496
- }
497
- ),
498
- /* @__PURE__ */ S("div", { children: [
499
- /* @__PURE__ */ C("h4", { className: "dc:text-sm dc:font-semibold text-dc-text-muted dc:uppercase dc:mb-2", children: "Summary" }),
500
- /* @__PURE__ */ C("p", { className: "text-dc-text", children: H(t.summary) })
501
- ] }),
502
- t.queryUnderstanding && /* @__PURE__ */ S("div", { children: [
503
- /* @__PURE__ */ C("h4", { className: "dc:text-sm dc:font-semibold text-dc-text-muted dc:uppercase dc:mb-2", children: "Query Analysis" }),
504
- /* @__PURE__ */ C("p", { className: "text-dc-text-secondary", children: H(t.queryUnderstanding) })
505
- ] }),
506
- t.issues && t.issues.length > 0 && /* @__PURE__ */ S("div", { children: [
507
- /* @__PURE__ */ S("h4", { className: "dc:text-sm dc:font-semibold text-dc-text-muted dc:uppercase dc:mb-2", children: [
508
- "Issues Found (",
509
- t.issues.length,
510
- ")"
511
- ] }),
512
- /* @__PURE__ */ C("div", { className: "dc:space-y-1 bg-dc-surface-secondary dc:rounded-lg dc:p-3", children: t.issues.map((r, s) => /* @__PURE__ */ C(fr, { issue: r }, s)) })
513
- ] }),
514
- t.recommendations && t.recommendations.length > 0 && /* @__PURE__ */ S("div", { children: [
515
- /* @__PURE__ */ S("h4", { className: "dc:text-sm dc:font-semibold text-dc-text-muted dc:uppercase dc:mb-3", children: [
516
- "Recommendations (",
517
- t.recommendations.length,
518
- ")"
519
- ] }),
520
- /* @__PURE__ */ C("div", { className: "dc:space-y-4", children: t.recommendations.map((r, s) => /* @__PURE__ */ C(mr, { rec: r }, s)) })
521
- ] }),
522
- (!t.recommendations || t.recommendations.length === 0) && /* @__PURE__ */ C("div", { className: "text-dc-text-muted dc:italic dc:p-4 bg-dc-surface-secondary dc:rounded-lg", children: "No specific recommendations. The query appears to be well-optimized." })
523
- ] }),
524
- /* @__PURE__ */ S("div", { className: "dc:flex dc:items-center dc:justify-between dc:px-6 dc:py-3 dc:border-t border-dc-border dc:flex-shrink-0 bg-dc-surface-secondary", children: [
525
- t._meta && /* @__PURE__ */ S("div", { className: "dc:text-xs text-dc-text-muted", children: [
526
- "Model: ",
527
- t._meta.model,
528
- t._meta.usingUserKey && " (using your API key)"
529
- ] }),
530
- /* @__PURE__ */ C(
531
- "button",
532
- {
533
- onClick: n,
534
- className: "dc:px-4 dc:py-2 dc:text-sm dc:font-medium dc:rounded-lg bg-dc-primary text-white hover:bg-dc-primary-hover dc:transition-colors",
535
- children: "Close"
536
- }
537
- )
538
- ] })
539
- ] })
540
- ] });
541
- }
542
- const di = Rn(function({
543
- sql: i,
544
- sqlLoading: e = !1,
545
- sqlError: n,
546
- sqlPlaceholder: r = "Add metrics to generate SQL",
547
- explainResult: s,
548
- explainLoading: o = !1,
549
- explainHasRun: l = !1,
550
- explainError: u,
551
- runExplain: f,
552
- aiAnalysis: m,
553
- aiAnalysisLoading: y = !1,
554
- aiAnalysisError: d,
555
- runAIAnalysis: p,
556
- clearAIAnalysis: b,
557
- enableAI: w = !1,
558
- query: x,
559
- title: v = "Generated SQL",
560
- height: g = "16rem"
561
- }) {
562
- const [D, B] = Pe(!1), [_, Q] = Pe(!1), M = i ? i.sql + (i.params && i.params.length > 0 ? `
563
-
564
- -- Parameters:
565
- ` + JSON.stringify(i.params, null, 2) : "") : "", T = () => {
566
- p && s && x && (p(s, x), Q(!0));
567
- }, h = () => {
568
- Q(!1);
569
- }, F = w && s ? /* @__PURE__ */ C(
570
- "button",
571
- {
572
- onClick: T,
573
- disabled: y,
574
- className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium dc:rounded bg-dc-accent text-white hover:bg-dc-accent-hover dc:disabled:opacity-50 dc:disabled:cursor-not-allowed dc:flex dc:items-center dc:gap-1",
575
- children: y ? /* @__PURE__ */ S(z, { children: [
576
- /* @__PURE__ */ C("span", { className: "dc:animate-spin", children: "⟳" }),
577
- "Analyzing..."
578
- ] }) : /* @__PURE__ */ C(z, { children: "✨ AI Analysis" })
579
- }
580
- ) : null;
581
- return /* @__PURE__ */ S("div", { className: "dc:space-y-3", children: [
582
- e ? /* @__PURE__ */ S(z, { children: [
583
- /* @__PURE__ */ C("h4", { className: "dc:text-sm dc:font-semibold text-dc-text dc:mb-2", children: v }),
584
- /* @__PURE__ */ C("div", { className: "bg-dc-surface-secondary dc:border border-dc-border dc:rounded dc:p-3 text-dc-text-muted dc:text-sm dc:animate-pulse", style: { height: g }, children: "Loading SQL..." })
585
- ] }) : n ? /* @__PURE__ */ S(z, { children: [
586
- /* @__PURE__ */ C("h4", { className: "dc:text-sm dc:font-semibold text-dc-text dc:mb-2", children: v }),
587
- /* @__PURE__ */ C("div", { className: "text-dc-error dc:text-sm bg-dc-danger-bg dc:p-3 dc:rounded dc:border border-dc-error", style: { height: g }, children: n.message })
588
- ] }) : i ? /* @__PURE__ */ C(
589
- Ue,
590
- {
591
- code: M,
592
- language: "sql",
593
- title: v,
594
- height: g,
595
- headerRight: /* @__PURE__ */ S(z, { children: [
596
- /* @__PURE__ */ S("label", { className: "dc:flex dc:items-center dc:gap-1 dc:text-xs text-dc-text-secondary dc:cursor-pointer", children: [
597
- /* @__PURE__ */ C(
598
- "input",
599
- {
600
- type: "checkbox",
601
- checked: D,
602
- onChange: (P) => B(P.target.checked),
603
- className: "dc:w-3 dc:h-3 dc:rounded border-dc-border text-dc-accent focus:ring-dc-accent"
604
- }
605
- ),
606
- "Include timing"
607
- ] }),
608
- /* @__PURE__ */ C(
609
- "button",
610
- {
611
- onClick: () => f({ analyze: D }),
612
- disabled: o,
613
- className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium dc:rounded dc:border border-dc-border bg-dc-surface hover:bg-dc-surface-hover text-dc-text-secondary hover:text-dc-text dc:transition-colors dc:disabled:opacity-50 dc:disabled:cursor-not-allowed",
614
- children: o ? "Running..." : "Explain Plan"
615
- }
616
- )
617
- ] })
618
- }
619
- ) : /* @__PURE__ */ S(z, { children: [
620
- /* @__PURE__ */ C("h4", { className: "dc:text-sm dc:font-semibold text-dc-text dc:mb-2", children: v }),
621
- /* @__PURE__ */ C("div", { className: "bg-dc-surface-secondary dc:border border-dc-border dc:rounded dc:p-3 text-dc-text-muted dc:text-sm", style: { height: g }, children: r })
622
- ] }),
623
- l && /* @__PURE__ */ C("div", { children: o ? /* @__PURE__ */ S("div", { className: "bg-dc-surface-secondary dc:border border-dc-border dc:rounded dc:p-3 text-dc-text-muted dc:text-sm dc:animate-pulse", children: [
624
- "Running EXPLAIN",
625
- D ? " ANALYZE" : "",
626
- "..."
627
- ] }) : u ? /* @__PURE__ */ S("div", { className: "text-dc-error dc:text-sm bg-dc-danger-bg dc:p-3 dc:rounded dc:border border-dc-error", children: [
628
- /* @__PURE__ */ C("strong", { children: "Explain Error:" }),
629
- " ",
630
- u.message
631
- ] }) : s ? /* @__PURE__ */ S("div", { className: "dc:space-y-3", children: [
632
- /* @__PURE__ */ S("div", { className: "dc:flex dc:flex-wrap dc:items-center dc:gap-2", children: [
633
- /* @__PURE__ */ C("span", { className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium bg-dc-accent text-white dc:rounded", children: s.summary.database.toUpperCase() }),
634
- s.summary.hasSequentialScans && /* @__PURE__ */ C("span", { className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium bg-dc-warning-bg text-dc-warning dc:border border-dc-warning dc:rounded", children: "Sequential Scans Detected" }),
635
- s.summary.usedIndexes.length > 0 && /* @__PURE__ */ S("span", { className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium bg-dc-success-bg text-dc-success dc:border border-dc-success dc:rounded", children: [
636
- s.summary.usedIndexes.length,
637
- " Index",
638
- s.summary.usedIndexes.length !== 1 ? "es" : "",
639
- " Used"
640
- ] }),
641
- s.summary.executionTime !== void 0 && /* @__PURE__ */ S("span", { className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium bg-dc-surface-secondary text-dc-text-secondary dc:border border-dc-border dc:rounded", children: [
642
- "Execution: ",
643
- s.summary.executionTime.toFixed(2),
644
- "ms"
645
- ] }),
646
- s.summary.planningTime !== void 0 && /* @__PURE__ */ S("span", { className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium bg-dc-surface-secondary text-dc-text-secondary dc:border border-dc-border dc:rounded", children: [
647
- "Planning: ",
648
- s.summary.planningTime.toFixed(2),
649
- "ms"
650
- ] }),
651
- s.summary.totalCost !== void 0 && /* @__PURE__ */ S("span", { className: "dc:px-2 dc:py-1 dc:text-xs dc:font-medium bg-dc-surface-secondary text-dc-text-secondary dc:border border-dc-border dc:rounded", children: [
652
- "Cost: ",
653
- s.summary.totalCost.toFixed(2)
654
- ] })
655
- ] }),
656
- s.summary.usedIndexes.length > 0 && /* @__PURE__ */ S("div", { className: "dc:text-xs text-dc-text-muted", children: [
657
- /* @__PURE__ */ C("strong", { children: "Indexes:" }),
658
- " ",
659
- s.summary.usedIndexes.join(", ")
660
- ] }),
661
- /* @__PURE__ */ C(
662
- Ue,
663
- {
664
- code: s.raw,
665
- language: "sql",
666
- title: `Execution Plan (${s.summary.database})`,
667
- height: "16rem",
668
- headerRight: F
669
- }
670
- )
671
- ] }) : null }),
672
- d && /* @__PURE__ */ S("div", { className: "text-dc-error dc:text-sm bg-dc-danger-bg dc:p-3 dc:rounded dc:border border-dc-error", children: [
673
- /* @__PURE__ */ C("strong", { children: "AI Analysis Error:" }),
674
- " ",
675
- d.message
676
- ] }),
677
- _ && m && /* @__PURE__ */ C(
678
- yr,
679
- {
680
- analysis: m,
681
- onClose: h
682
- }
683
- )
684
- ] });
685
- });
686
- function lt() {
687
- return {
688
- metrics: [],
689
- breakdowns: [],
690
- filters: [],
691
- order: void 0,
692
- validationStatus: "idle",
693
- validationError: null
694
- };
695
- }
696
- function gr(t) {
697
- return t.map((i) => i.field);
698
- }
699
- function hr(t, i) {
700
- const e = [], n = [];
701
- for (const r of t)
702
- if (r.isTimeDimension) {
703
- const s = {
704
- dimension: r.field,
705
- granularity: r.granularity || "day"
706
- };
707
- if (r.enableComparison) {
708
- const o = Ct(r.field, i);
709
- o && (s.compareDateRange = o);
710
- }
711
- n.push(s);
712
- } else
713
- e.push(r.field);
714
- return { dimensions: e, timeDimensions: n };
715
- }
716
- function pr(t) {
717
- const { dimensions: i, timeDimensions: e } = hr(
718
- t.breakdowns,
719
- t.filters
720
- ), n = {
721
- measures: gr(t.metrics),
722
- dimensions: i
723
- };
724
- return e.length > 0 && (n.timeDimensions = e), t.filters.length > 0 && (n.filters = t.filters), t.order && Object.keys(t.order).length > 0 && (n.order = t.order), n;
725
- }
726
- function Cr(t) {
727
- return t.map((i, e) => ({
728
- id: $(),
729
- field: i,
730
- label: pe(e)
731
- }));
732
- }
733
- function wr(t) {
734
- const i = [];
735
- if (t.dimensions)
736
- for (const e of t.dimensions)
737
- i.push({
738
- id: $(),
739
- field: e,
740
- isTimeDimension: !1
741
- });
742
- if (t.timeDimensions)
743
- for (const e of t.timeDimensions) {
744
- const n = !!(e.compareDateRange && e.compareDateRange.length > 0);
745
- i.push({
746
- id: $(),
747
- field: e.dimension,
748
- granularity: e.granularity,
749
- isTimeDimension: !0,
750
- enableComparison: n
751
- });
752
- }
753
- return i;
754
- }
755
- function ct(t) {
756
- return {
757
- metrics: Cr(t.measures || []),
758
- breakdowns: wr(t),
759
- filters: t.filters || [],
760
- order: t.order,
761
- validationStatus: "idle",
762
- validationError: null
763
- };
764
- }
765
- function Sr(t) {
766
- return typeof t == "object" && t !== null && "queries" in t && Array.isArray(t.queries);
767
- }
768
- const K = {
769
- type: "query",
770
- createInitial() {
771
- return {
772
- queryStates: [lt()],
773
- activeQueryIndex: 0,
774
- mergeStrategy: "concat"
775
- };
776
- },
777
- extractState(t) {
778
- return {
779
- queryStates: t.queryStates,
780
- activeQueryIndex: t.activeQueryIndex,
781
- mergeStrategy: t.mergeStrategy
782
- };
783
- },
784
- canLoad(t) {
785
- if (!t || typeof t != "object") return !1;
786
- const i = t;
787
- return !(i.version !== 1 || i.analysisType !== "query" || !i.query || typeof i.query != "object");
788
- },
789
- load(t) {
790
- if (t.analysisType !== "query")
791
- throw new Error(
792
- `Cannot load ${t.analysisType} config with query adapter`
793
- );
794
- const i = t;
795
- if (Sr(i.query)) {
796
- const e = i.query, n = e.queries.map(ct);
797
- return n.length === 0 && n.push(lt()), {
798
- queryStates: n,
799
- activeQueryIndex: 0,
800
- mergeStrategy: e.mergeStrategy || "concat"
801
- };
802
- }
803
- return {
804
- queryStates: [ct(i.query)],
805
- activeQueryIndex: 0,
806
- mergeStrategy: "concat"
807
- };
808
- },
809
- save(t, i, e) {
810
- const n = t.queryStates.map(pr), s = n.length === 1 && t.mergeStrategy === "concat" ? n[0] : {
811
- queries: n,
812
- mergeStrategy: t.mergeStrategy
813
- };
814
- return {
815
- version: 1,
816
- analysisType: "query",
817
- activeView: e,
818
- charts: {
819
- query: i.query || this.getDefaultChartConfig()
820
- },
821
- query: s
822
- };
823
- },
824
- validate(t) {
825
- const i = [], e = [];
826
- if (t.queryStates.some((r) => r.metrics.length > 0) || i.push("At least one metric is required"), t.queryStates.forEach((r, s) => {
827
- const o = t.queryStates.length > 1 ? `Query ${s + 1}: ` : "";
828
- r.metrics.length === 0 && r.breakdowns.length === 0 && e.push(`${o}Query is empty`);
829
- }), t.queryStates.length > 1 && t.mergeStrategy === "merge") {
830
- const r = t.queryStates[0].breakdowns.map(
831
- (o) => o.field
832
- );
833
- t.queryStates.every((o) => {
834
- const l = o.breakdowns.map((u) => u.field);
835
- return l.length === r.length && l.every((u) => r.includes(u));
836
- }) || e.push(
837
- "Queries have different breakdowns - merge results may be unexpected"
838
- );
839
- }
840
- return {
841
- isValid: i.length === 0,
842
- errors: i,
843
- warnings: e
844
- };
845
- },
846
- clear(t) {
847
- return this.createInitial();
848
- },
849
- getDefaultChartConfig() {
850
- return {
851
- chartType: "bar",
852
- chartConfig: {},
853
- displayConfig: { showLegend: !0, showGrid: !0, showTooltip: !0 }
854
- };
855
- }
856
- }, E = /* @__PURE__ */ new Map();
857
- let _e = !1;
858
- function Ne() {
859
- _e || (E.has("query") || E.set("query", K), E.has("funnel") || E.set("funnel", W), E.has("flow") || E.set("flow", J), E.has("retention") || E.set("retention", X), _e = !0);
860
- }
861
- const L = {
862
- /**
863
- * Register an adapter for a specific analysis type.
864
- * Should be called once at app initialization.
865
- *
866
- * @param adapter - The adapter to register
867
- */
868
- register(t) {
869
- E.has(t.type) && console.warn(
870
- `[adapterRegistry] Overwriting existing adapter for type: ${t.type}`
871
- ), E.set(t.type, t);
872
- },
873
- /**
874
- * Get the adapter for a specific analysis type.
875
- * Built-in adapters (query, funnel) are initialized automatically.
876
- *
877
- * @param type - The analysis type to get adapter for
878
- * @returns The registered adapter
879
- * @throws Error if no adapter is registered for the type
880
- */
881
- get(t) {
882
- Ne();
883
- const i = E.get(t);
884
- if (!i)
885
- throw new Error(
886
- `[adapterRegistry] No adapter registered for type: ${t}. Available types: ${Array.from(E.keys()).join(", ") || "none"}`
887
- );
888
- return i;
889
- },
890
- /**
891
- * Check if an adapter is registered for a specific type.
892
- * Built-in adapters (query, funnel) are initialized automatically.
893
- *
894
- * @param type - The analysis type to check
895
- * @returns True if an adapter is registered
896
- */
897
- has(t) {
898
- return Ne(), E.has(t);
899
- },
900
- /**
901
- * Get all registered analysis types.
902
- * Built-in adapters (query, funnel) are initialized automatically.
903
- *
904
- * @returns Array of registered types
905
- */
906
- getRegisteredTypes() {
907
- return Ne(), Array.from(E.keys());
908
- },
909
- /**
910
- * Clear all registered adapters.
911
- * Primarily useful for testing.
912
- * Note: Built-in adapters will be re-initialized on next access.
913
- */
914
- clear() {
915
- E.clear(), _e = !1;
916
- }
917
- }, Dt = () => ({
918
- analysisType: "query",
919
- // Use adapter defaults as single source of truth for chart configuration
920
- charts: {
921
- query: K.getDefaultChartConfig(),
922
- funnel: W.getDefaultChartConfig(),
923
- flow: J.getDefaultChartConfig(),
924
- retention: X.getDefaultChartConfig()
925
- },
926
- // Per-mode active view preference
927
- activeViews: {
928
- query: "chart",
929
- funnel: "chart",
930
- flow: "chart",
931
- retention: "chart"
932
- },
933
- userManuallySelectedChart: !1,
934
- localPaletteName: "default"
935
- }), br = (t, i) => ({
936
- ...Dt(),
937
- setAnalysisType: (e) => {
938
- t((n) => {
939
- const r = { ...n.charts };
940
- if (!r[e]) {
941
- const o = L.get(e);
942
- r[e] = o.getDefaultChartConfig();
943
- }
944
- const s = { ...n.activeViews };
945
- return s[e] || (s[e] = "chart"), {
946
- analysisType: e,
947
- charts: r,
948
- activeViews: s,
949
- activeView: s[e] ?? "chart"
950
- };
951
- });
952
- },
953
- setChartType: (e) => {
954
- t((n) => {
955
- const r = n.analysisType, s = n.charts[r] || {
956
- chartType: e,
957
- chartConfig: {},
958
- displayConfig: {}
959
- };
960
- return {
961
- charts: {
962
- ...n.charts,
963
- [r]: { ...s, chartType: e }
964
- }
965
- };
966
- });
967
- },
968
- setChartTypeManual: (e) => {
969
- t((n) => {
970
- const r = n.analysisType, s = n.charts[r] || {
971
- chartType: e,
972
- chartConfig: {},
973
- displayConfig: {}
974
- };
975
- return {
976
- charts: {
977
- ...n.charts,
978
- [r]: { ...s, chartType: e }
979
- },
980
- userManuallySelectedChart: !0,
981
- activeView: "chart",
982
- activeViews: {
983
- ...n.activeViews,
984
- [r]: "chart"
985
- }
986
- };
987
- });
988
- },
989
- setChartConfig: (e) => {
990
- t((n) => {
991
- const r = n.analysisType, s = n.charts[r] || {
992
- chartType: "bar",
993
- chartConfig: e,
994
- displayConfig: {}
995
- };
996
- return {
997
- charts: {
998
- ...n.charts,
999
- [r]: { ...s, chartConfig: e }
1000
- },
1001
- activeView: "chart",
1002
- activeViews: {
1003
- ...n.activeViews,
1004
- [r]: "chart"
1005
- }
1006
- };
1007
- });
1008
- },
1009
- setDisplayConfig: (e) => {
1010
- t((n) => {
1011
- const r = n.analysisType, s = n.charts[r] || {
1012
- chartType: "bar",
1013
- chartConfig: {},
1014
- displayConfig: e
1015
- };
1016
- return {
1017
- charts: {
1018
- ...n.charts,
1019
- [r]: { ...s, displayConfig: e }
1020
- },
1021
- activeView: "chart",
1022
- activeViews: {
1023
- ...n.activeViews,
1024
- [r]: "chart"
1025
- }
1026
- };
1027
- });
1028
- },
1029
- setLocalPaletteName: (e) => t({ localPaletteName: e }),
1030
- setUserManuallySelectedChart: (e) => t({ userManuallySelectedChart: e }),
1031
- // @deprecated - Use setChartType() instead
1032
- // Kept for backward compatibility
1033
- setFunnelChartType: (e) => {
1034
- t((n) => {
1035
- const r = n.charts.funnel || {
1036
- chartType: e,
1037
- chartConfig: {},
1038
- displayConfig: {}
1039
- };
1040
- return {
1041
- charts: {
1042
- ...n.charts,
1043
- funnel: { ...r, chartType: e }
1044
- }
1045
- };
1046
- });
1047
- },
1048
- // @deprecated - Use setChartConfig() instead
1049
- // Kept for backward compatibility
1050
- setFunnelChartConfig: (e) => {
1051
- t((n) => {
1052
- const r = n.charts.funnel || {
1053
- chartType: "funnel",
1054
- chartConfig: e,
1055
- displayConfig: {}
1056
- };
1057
- return {
1058
- charts: {
1059
- ...n.charts,
1060
- funnel: { ...r, chartConfig: e }
1061
- }
1062
- };
1063
- });
1064
- },
1065
- // @deprecated - Use setDisplayConfig() instead
1066
- // Kept for backward compatibility
1067
- setFunnelDisplayConfig: (e) => {
1068
- t((n) => {
1069
- const r = n.charts.funnel || {
1070
- chartType: "funnel",
1071
- chartConfig: {},
1072
- displayConfig: e
1073
- };
1074
- return {
1075
- charts: {
1076
- ...n.charts,
1077
- funnel: { ...r, displayConfig: e }
1078
- }
1079
- };
1080
- });
1081
- },
1082
- save: () => {
1083
- const e = i(), n = L.get(e.analysisType), r = n.extractState(e), s = e.activeViews[e.analysisType] ?? e.activeView ?? "chart";
1084
- return n.save(r, e.charts, s);
1085
- },
1086
- load: (e) => {
1087
- const n = L.get(e.analysisType);
1088
- if (!n.canLoad(e)) {
1089
- console.warn("[coreSlice] Invalid config, cannot load");
1090
- return;
1091
- }
1092
- const r = n.load(e), s = i(), o = {
1093
- ...s.charts,
1094
- ...e.charts
1095
- };
1096
- o[e.analysisType] || (o[e.analysisType] = n.getDefaultChartConfig());
1097
- const l = {
1098
- ...s.activeViews,
1099
- [e.analysisType]: e.activeView
1100
- };
1101
- t({
1102
- analysisType: e.analysisType,
1103
- charts: o,
1104
- activeView: e.activeView,
1105
- activeViews: l,
1106
- // Mode-specific state from adapter
1107
- ...r
1108
- });
1109
- },
1110
- saveWorkspace: () => {
1111
- const e = i(), n = e, r = L.get("query"), s = r.extractState(n), o = e.activeViews.query ?? e.activeView ?? "chart", l = r.save(
1112
- s,
1113
- e.charts,
1114
- o
1115
- ), u = L.get("funnel"), f = u.extractState(n), m = e.activeViews.funnel ?? e.activeView ?? "chart", y = u.save(
1116
- f,
1117
- e.charts,
1118
- m
1119
- ), d = L.get("flow"), p = d.extractState(n), b = e.activeViews.flow ?? e.activeView ?? "chart", w = d.save(
1120
- p,
1121
- e.charts,
1122
- b
1123
- ), x = L.get("retention"), v = x.extractState(n), g = e.activeViews.retention ?? e.activeView ?? "chart", D = x.save(
1124
- v,
1125
- e.charts,
1126
- g
1127
- );
1128
- return {
1129
- version: 1,
1130
- activeType: e.analysisType,
1131
- modes: {
1132
- query: l,
1133
- funnel: y,
1134
- flow: w,
1135
- retention: D
1136
- }
1137
- };
1138
- },
1139
- loadWorkspace: (e) => {
1140
- const n = L.get("query"), r = L.get("funnel"), s = L.get("flow"), o = L.get("retention");
1141
- let l = {}, u = {}, f = {}, m = {}, y = { ...i().charts }, d = { ...i().activeViews };
1142
- e.modes.query && n.canLoad(e.modes.query) && (l = n.load(e.modes.query), y = { ...y, ...e.modes.query.charts }, d.query = e.modes.query.activeView ?? "chart"), e.modes.funnel && r.canLoad(e.modes.funnel) && (u = r.load(e.modes.funnel), y = { ...y, ...e.modes.funnel.charts }, d.funnel = e.modes.funnel.activeView ?? "chart"), e.modes.flow && s.canLoad(e.modes.flow) && (f = s.load(e.modes.flow), y = { ...y, ...e.modes.flow.charts }, d.flow = e.modes.flow.activeView ?? "chart"), e.modes.retention && o.canLoad(e.modes.retention) && (m = o.load(e.modes.retention), y = { ...y, ...e.modes.retention.charts }, d.retention = e.modes.retention.activeView ?? "chart");
1143
- const b = e.modes[e.activeType]?.activeView ?? "chart";
1144
- t({
1145
- analysisType: e.activeType,
1146
- charts: y,
1147
- activeViews: d,
1148
- activeView: b,
1149
- ...l,
1150
- ...u,
1151
- ...f,
1152
- ...m
1153
- });
1154
- }
1155
- }), Le = () => ({
1156
- queryStates: [R()],
1157
- activeQueryIndex: 0,
1158
- mergeStrategy: "concat"
1159
- }), vr = (t, i) => ({
1160
- ...Le(),
1161
- // ==========================================================================
1162
- // Query State Management
1163
- // ==========================================================================
1164
- setQueryStates: (e) => t({ queryStates: e }),
1165
- updateQueryState: (e, n) => t((r) => {
1166
- const s = [...r.queryStates];
1167
- return s[e] = n(s[e] || R()), { queryStates: s };
1168
- }),
1169
- setActiveQueryIndex: (e) => t({ activeQueryIndex: e }),
1170
- setMergeStrategy: (e) => t({ mergeStrategy: e }),
1171
- // ==========================================================================
1172
- // Multi-Query Actions
1173
- // ==========================================================================
1174
- addQuery: () => t((e) => {
1175
- const n = e.queryStates[e.activeQueryIndex] || R(), r = {
1176
- ...R(),
1177
- metrics: [...n.metrics],
1178
- breakdowns: [...n.breakdowns],
1179
- filters: [...n.filters]
1180
- };
1181
- return {
1182
- queryStates: [...e.queryStates, r],
1183
- activeQueryIndex: e.queryStates.length
1184
- };
1185
- }),
1186
- removeQuery: (e) => t((n) => {
1187
- if (n.queryStates.length <= 1) return n;
1188
- const r = n.queryStates.filter((o, l) => l !== e);
1189
- let s = n.activeQueryIndex;
1190
- return e === n.activeQueryIndex ? s = Math.max(0, n.activeQueryIndex - 1) : e < n.activeQueryIndex && (s = n.activeQueryIndex - 1), { queryStates: r, activeQueryIndex: s };
1191
- }),
1192
- // ==========================================================================
1193
- // Metrics Actions
1194
- // ==========================================================================
1195
- addMetric: (e, n) => t((r) => {
1196
- const s = r.activeQueryIndex, o = [...r.queryStates], l = o[s] || R(), u = {
1197
- id: $(),
1198
- field: e,
1199
- label: n || pe(l.metrics.length)
1200
- };
1201
- return o[s] = {
1202
- ...l,
1203
- metrics: [...l.metrics, u]
1204
- }, { queryStates: o };
1205
- }),
1206
- removeMetric: (e) => t((n) => {
1207
- const r = n.activeQueryIndex, s = [...n.queryStates], o = s[r] || R(), l = o.metrics.find((m) => m.id === e)?.field, u = o.metrics.filter((m) => m.id !== e);
1208
- let f = o.order;
1209
- return l && f && f[l] && (f = { ...f }, delete f[l], Object.keys(f).length === 0 && (f = void 0)), s[r] = {
1210
- ...o,
1211
- metrics: u,
1212
- order: f
1213
- }, { queryStates: s };
1214
- }),
1215
- toggleMetric: (e) => t((n) => {
1216
- const r = n.activeQueryIndex, s = [...n.queryStates], o = s[r] || R(), l = o.metrics.findIndex((u) => u.field === e);
1217
- if (l >= 0)
1218
- s[r] = {
1219
- ...o,
1220
- metrics: o.metrics.filter((u, f) => f !== l)
1221
- };
1222
- else {
1223
- const u = {
1224
- id: $(),
1225
- field: e,
1226
- label: pe(o.metrics.length)
1227
- };
1228
- s[r] = {
1229
- ...o,
1230
- metrics: [...o.metrics, u]
1231
- };
1232
- }
1233
- return { queryStates: s };
1234
- }),
1235
- reorderMetrics: (e, n) => t((r) => {
1236
- const s = r.activeQueryIndex, o = [...r.queryStates], l = o[s] || R(), u = [...l.metrics], [f] = u.splice(e, 1);
1237
- return u.splice(n, 0, f), o[s] = {
1238
- ...l,
1239
- metrics: u
1240
- }, { queryStates: o };
1241
- }),
1242
- // ==========================================================================
1243
- // Breakdowns Actions
1244
- // ==========================================================================
1245
- addBreakdown: (e, n, r) => t((s) => {
1246
- const o = s.activeQueryIndex, l = [...s.queryStates], u = l[o] || R();
1247
- if (n && u.breakdowns.some((y) => y.isTimeDimension))
1248
- return s;
1249
- const f = {
1250
- id: $(),
1251
- field: e,
1252
- isTimeDimension: n,
1253
- granularity: n ? r || "month" : void 0
1254
- };
1255
- return l[o] = {
1256
- ...u,
1257
- breakdowns: [...u.breakdowns, f]
1258
- }, { queryStates: l };
1259
- }),
1260
- removeBreakdown: (e) => t((n) => {
1261
- const r = n.activeQueryIndex, s = [...n.queryStates], o = s[r] || R(), l = o.breakdowns.find((m) => m.id === e)?.field, u = o.breakdowns.filter((m) => m.id !== e);
1262
- let f = o.order;
1263
- return l && f && f[l] && (f = { ...f }, delete f[l], Object.keys(f).length === 0 && (f = void 0)), s[r] = {
1264
- ...o,
1265
- breakdowns: u,
1266
- order: f
1267
- }, { queryStates: s };
1268
- }),
1269
- toggleBreakdown: (e, n, r) => t((s) => {
1270
- const o = s.activeQueryIndex, l = [...s.queryStates], u = l[o] || R(), f = u.breakdowns.findIndex((m) => m.field === e);
1271
- if (f >= 0)
1272
- l[o] = {
1273
- ...u,
1274
- breakdowns: u.breakdowns.filter((m, y) => y !== f)
1275
- };
1276
- else {
1277
- if (n && u.breakdowns.some((d) => d.isTimeDimension))
1278
- return s;
1279
- const m = {
1280
- id: $(),
1281
- field: e,
1282
- isTimeDimension: n,
1283
- granularity: n ? r || "month" : void 0
1284
- };
1285
- l[o] = {
1286
- ...u,
1287
- breakdowns: [...u.breakdowns, m]
1288
- };
1289
- }
1290
- return { queryStates: l };
1291
- }),
1292
- setBreakdownGranularity: (e, n) => t((r) => {
1293
- const { mergeStrategy: s, activeQueryIndex: o, queryStates: l } = r, u = [...l], f = s === "merge" && o > 0 ? 0 : o;
1294
- return u[f] = {
1295
- ...u[f],
1296
- breakdowns: u[f].breakdowns.map(
1297
- (m) => m.id === e ? { ...m, granularity: n } : m
1298
- )
1299
- }, { queryStates: u };
1300
- }),
1301
- toggleBreakdownComparison: (e) => t((n) => {
1302
- const { mergeStrategy: r, activeQueryIndex: s, queryStates: o, charts: l, analysisType: u } = n, f = [...o], m = r === "merge" && s > 0 ? 0 : s, y = f[m].breakdowns.find((w) => w.id === e), d = y && !y.enableComparison, p = f[m].breakdowns.map((w) => w.id === e ? { ...w, enableComparison: !w.enableComparison } : w.isTimeDimension && w.enableComparison ? { ...w, enableComparison: !1 } : w);
1303
- f[m] = {
1304
- ...f[m],
1305
- breakdowns: p
1306
- };
1307
- const b = { queryStates: f };
1308
- if (d && y?.isTimeDimension && y.field) {
1309
- const w = f[m].filters || [];
1310
- if (!w.some((g) => {
1311
- if ("member" in g) {
1312
- const D = g;
1313
- return D.member === y.field && D.operator === "inDateRange";
1314
- }
1315
- return !1;
1316
- })) {
1317
- const g = {
1318
- member: y.field,
1319
- operator: "inDateRange",
1320
- values: [],
1321
- dateRange: On("last_n_months", 3)
1322
- };
1323
- f[m] = {
1324
- ...f[m],
1325
- filters: [...w, g]
1326
- }, b.queryStates = f;
1327
- }
1328
- const v = l[u];
1329
- v && v.chartType !== "line" && (b.charts = {
1330
- ...l,
1331
- [u]: {
1332
- ...v,
1333
- chartType: "line"
1334
- }
1335
- }, b.userManuallySelectedChart = !1, b.activeView = "chart", b.activeViews = {
1336
- ...n.activeViews,
1337
- [u]: "chart"
1338
- });
1339
- }
1340
- return b;
1341
- }),
1342
- reorderBreakdowns: (e, n) => t((r) => {
1343
- const s = r.activeQueryIndex, o = [...r.queryStates], l = o[s] || R(), u = [...l.breakdowns], [f] = u.splice(e, 1);
1344
- return u.splice(n, 0, f), o[s] = {
1345
- ...l,
1346
- breakdowns: u
1347
- }, { queryStates: o };
1348
- }),
1349
- // ==========================================================================
1350
- // Filters Actions
1351
- // ==========================================================================
1352
- setFilters: (e) => t((n) => {
1353
- const r = n.activeQueryIndex, s = [...n.queryStates];
1354
- return s[r] = {
1355
- ...s[r],
1356
- filters: e
1357
- }, { queryStates: s };
1358
- }),
1359
- dropFieldToFilter: (e) => t((n) => {
1360
- const r = n.activeQueryIndex, s = [...n.queryStates], o = s[r] || R(), l = o.filters || [];
1361
- if (l.some((y) => "member" in y && y.member === e)) return n;
1362
- const f = {
1363
- member: e,
1364
- operator: "set",
1365
- values: []
1366
- };
1367
- let m;
1368
- if (l.length === 0)
1369
- m = [f];
1370
- else if (l.length === 1 && "type" in l[0]) {
1371
- const y = l[0];
1372
- m = [{ ...y, filters: [...y.filters, f] }];
1373
- } else
1374
- m = [{ type: "and", filters: [...l, f] }];
1375
- return s[r] = {
1376
- ...o,
1377
- filters: m
1378
- }, { queryStates: s };
1379
- }),
1380
- setOrder: (e, n) => t((r) => {
1381
- const s = r.activeQueryIndex, o = [...r.queryStates], l = o[s] || R(), u = { ...l.order || {} };
1382
- return n === null ? delete u[e] : u[e] = n, o[s] = {
1383
- ...l,
1384
- order: Object.keys(u).length > 0 ? u : void 0
1385
- }, { queryStates: o };
1386
- }),
1387
- // ==========================================================================
1388
- // Utility Actions
1389
- // ==========================================================================
1390
- getCurrentState: () => {
1391
- const e = i();
1392
- return e.queryStates[e.activeQueryIndex] || R();
1393
- },
1394
- getMergeKeys: () => {
1395
- const e = i();
1396
- if (e.mergeStrategy !== "merge" || e.queryStates.length === 0)
1397
- return;
1398
- const n = e.queryStates[0].breakdowns;
1399
- if (n.length !== 0)
1400
- return n.map((r) => r.field);
1401
- },
1402
- isMultiQueryMode: () => {
1403
- const e = i();
1404
- return e.queryStates.length <= 1 ? !1 : e.queryStates.filter(
1405
- (r) => r.metrics.length > 0 || r.breakdowns.length > 0
1406
- ).length > 1;
1407
- },
1408
- buildCurrentQuery: () => {
1409
- const e = i(), n = e.queryStates[e.activeQueryIndex] || R();
1410
- return Ce(n.metrics, n.breakdowns, n.filters, n.order);
1411
- },
1412
- buildAllQueries: () => {
1413
- const e = i(), n = e.queryStates[0]?.breakdowns || [];
1414
- return e.queryStates.map((r, s) => {
1415
- const o = e.mergeStrategy === "merge" && s > 0 ? n : r.breakdowns;
1416
- return Ce(r.metrics, o, r.filters, r.order);
1417
- });
1418
- },
1419
- buildMultiQueryConfig: () => {
1420
- const e = i();
1421
- if (!i().isMultiQueryMode()) return null;
1422
- const r = i().buildAllQueries().filter((s) => s.measures && s.measures.length > 0 || s.dimensions && s.dimensions.length > 0 || s.timeDimensions && s.timeDimensions.length > 0);
1423
- return r.length < 2 ? null : {
1424
- queries: r,
1425
- mergeStrategy: e.mergeStrategy,
1426
- mergeKeys: i().getMergeKeys(),
1427
- queryLabels: r.map((s, o) => `Q${o + 1}`)
1428
- };
1429
- }
1430
- }), Ke = () => ({
1431
- funnelCube: null,
1432
- funnelSteps: [],
1433
- activeFunnelStepIndex: 0,
1434
- funnelTimeDimension: null,
1435
- funnelBindingKey: null,
1436
- stepTimeToConvert: []
1437
- // Deprecated - kept for backward compat
1438
- }), Dr = (t, i) => ({
1439
- ...Ke(),
1440
- addFunnelStep: () => t((e) => {
1441
- const n = e.funnelSteps[e.funnelSteps.length - 1], r = {
1442
- id: $(),
1443
- name: `Step ${e.funnelSteps.length + 1}`,
1444
- cube: e.funnelCube || "",
1445
- // Deep copy filters from previous step, or empty array if first step
1446
- filters: n?.filters ? JSON.parse(JSON.stringify(n.filters)) : [],
1447
- // Copy timeToConvert from previous step
1448
- timeToConvert: n?.timeToConvert
1449
- };
1450
- return {
1451
- funnelSteps: [...e.funnelSteps, r],
1452
- activeFunnelStepIndex: e.funnelSteps.length
1453
- };
1454
- }),
1455
- removeFunnelStep: (e) => t((n) => {
1456
- if (n.funnelSteps.length <= 1) return n;
1457
- const r = n.funnelSteps.filter((o, l) => l !== e), s = Math.min(n.activeFunnelStepIndex, r.length - 1);
1458
- return {
1459
- funnelSteps: r,
1460
- activeFunnelStepIndex: s
1461
- };
1462
- }),
1463
- updateFunnelStep: (e, n) => t((r) => {
1464
- const s = [...r.funnelSteps];
1465
- return s[e] && (s[e] = { ...s[e], ...n }), { funnelSteps: s };
1466
- }),
1467
- setActiveFunnelStepIndex: (e) => t({ activeFunnelStepIndex: e }),
1468
- reorderFunnelSteps: (e, n) => t((r) => {
1469
- const s = [...r.funnelSteps], [o] = s.splice(e, 1);
1470
- return s.splice(n, 0, o), { funnelSteps: s };
1471
- }),
1472
- setFunnelTimeDimension: (e) => t({ funnelTimeDimension: e }),
1473
- setFunnelBindingKey: (e) => t({ funnelBindingKey: e }),
1474
- setFunnelCube: (e) => t((n) => {
1475
- const r = n.funnelSteps.map((s) => ({
1476
- ...s,
1477
- cube: e || ""
1478
- }));
1479
- return {
1480
- funnelCube: e,
1481
- // Clear binding key and time dimension since they may not exist in new cube
1482
- funnelBindingKey: null,
1483
- funnelTimeDimension: null,
1484
- funnelSteps: r
1485
- };
1486
- }),
1487
- // Deprecated: no-op - legacy queryStates-based funnels are no longer supported
1488
- // Use updateFunnelStep with timeToConvert instead
1489
- setStepTimeToConvert: () => {
1490
- },
1491
- // Deprecated: always returns null - legacy queryStates-based funnels are no longer supported
1492
- // Use buildFunnelQueryFromSteps instead
1493
- buildFunnelConfig: () => null,
1494
- // New: Build ServerFunnelQuery from dedicated funnelSteps
1495
- buildFunnelQueryFromSteps: () => {
1496
- const e = i();
1497
- if (e.analysisType !== "funnel" || !e.funnelBindingKey || !e.funnelTimeDimension || e.funnelSteps.length < 2) return null;
1498
- const n = e.funnelSteps.filter((r) => r.cube && r.name);
1499
- return n.length < 2 ? null : {
1500
- funnel: {
1501
- bindingKey: e.funnelBindingKey.dimension,
1502
- timeDimension: e.funnelTimeDimension,
1503
- steps: n.map((r) => ({
1504
- name: r.name,
1505
- cube: r.cube,
1506
- filter: r.filters.length > 0 ? r.filters : void 0,
1507
- timeToConvert: r.timeToConvert
1508
- })),
1509
- includeTimeMetrics: !0
1510
- }
1511
- };
1512
- },
1513
- isFunnelMode: () => i().analysisType === "funnel",
1514
- isFunnelModeEnabled: () => {
1515
- const e = i();
1516
- return e.analysisType !== "funnel" || !e.funnelBindingKey || !e.funnelTimeDimension || e.funnelSteps.length < 2 ? !1 : e.funnelSteps.filter((r) => r.cube && r.name).length >= 2;
1517
- }
1518
- }), $e = () => ({
1519
- flowCube: null,
1520
- flowBindingKey: null,
1521
- flowTimeDimension: null,
1522
- startingStep: {
1523
- name: "",
1524
- filters: []
1525
- },
1526
- stepsBefore: 3,
1527
- stepsAfter: 3,
1528
- eventDimension: null,
1529
- joinStrategy: "auto"
1530
- }), xr = (t, i) => ({
1531
- ...$e(),
1532
- setFlowCube: (e) => t(() => ({
1533
- flowCube: e,
1534
- // Clear binding key and time dimension since they may not exist in new cube
1535
- flowBindingKey: null,
1536
- flowTimeDimension: null,
1537
- eventDimension: null,
1538
- // Reset starting step filters when cube changes
1539
- startingStep: {
1540
- name: "",
1541
- filters: []
1542
- }
1543
- })),
1544
- setFlowBindingKey: (e) => t({ flowBindingKey: e }),
1545
- setFlowTimeDimension: (e) => t({ flowTimeDimension: e }),
1546
- setEventDimension: (e) => t({ eventDimension: e }),
1547
- setStartingStepName: (e) => t((n) => ({
1548
- startingStep: {
1549
- ...n.startingStep,
1550
- name: e
1551
- }
1552
- })),
1553
- setStartingStepFilters: (e) => t((n) => ({
1554
- startingStep: {
1555
- ...n.startingStep,
1556
- filters: e
1557
- }
1558
- })),
1559
- addStartingStepFilter: (e) => t((n) => ({
1560
- startingStep: {
1561
- ...n.startingStep,
1562
- filters: [...n.startingStep.filters, e]
1563
- }
1564
- })),
1565
- removeStartingStepFilter: (e) => t((n) => ({
1566
- startingStep: {
1567
- ...n.startingStep,
1568
- filters: n.startingStep.filters.filter((r, s) => s !== e)
1569
- }
1570
- })),
1571
- updateStartingStepFilter: (e, n) => t((r) => {
1572
- const s = [...r.startingStep.filters];
1573
- return s[e] && (s[e] = n), {
1574
- startingStep: {
1575
- ...r.startingStep,
1576
- filters: s
1577
- }
1578
- };
1579
- }),
1580
- setStepsBefore: (e) => t({
1581
- stepsBefore: Math.max(st, Math.min(at, e))
1582
- }),
1583
- setStepsAfter: (e) => t({
1584
- stepsAfter: Math.max(st, Math.min(at, e))
1585
- }),
1586
- setJoinStrategy: (e) => t(() => ({
1587
- joinStrategy: e
1588
- })),
1589
- isFlowMode: () => i().analysisType === "flow",
1590
- isFlowModeEnabled: () => {
1591
- const e = i();
1592
- return !(e.analysisType !== "flow" || !e.flowCube || !e.flowBindingKey?.dimension || !e.flowTimeDimension || !e.eventDimension || e.startingStep.filters.length === 0);
1593
- },
1594
- buildFlowQuery: () => {
1595
- const e = i();
1596
- if (e.analysisType !== "flow" || !e.flowBindingKey?.dimension || !e.flowTimeDimension || !e.eventDimension || e.startingStep.filters.length === 0) return null;
1597
- let n;
1598
- if (typeof e.flowBindingKey.dimension == "string")
1599
- n = e.flowBindingKey.dimension;
1600
- else if (Array.isArray(e.flowBindingKey.dimension))
1601
- n = e.flowBindingKey.dimension.map((u) => ({
1602
- cube: u.cube,
1603
- dimension: u.dimension
1604
- }));
1605
- else
1606
- return null;
1607
- const r = e.startingStep.filters.length === 1 ? e.startingStep.filters[0] : e.startingStep.filters, o = e.charts?.flow?.chartType === "sunburst" ? "sunburst" : "sankey", l = o === "sunburst" ? 0 : e.stepsBefore;
1608
- return {
1609
- flow: {
1610
- bindingKey: n,
1611
- timeDimension: e.flowTimeDimension,
1612
- startingStep: {
1613
- name: e.startingStep.name || "Starting Step",
1614
- filter: r
1615
- },
1616
- stepsBefore: l,
1617
- stepsAfter: e.stepsAfter,
1618
- eventDimension: e.eventDimension,
1619
- outputMode: o,
1620
- joinStrategy: e.joinStrategy
1621
- }
1622
- };
1623
- }
1624
- }), Ge = () => ({
1625
- ..._n
1626
- }), Tr = (t, i) => ({
1627
- ...Ge(),
1628
- setRetentionCube: (e) => t(() => ({
1629
- retentionCube: e,
1630
- // Clear related fields when cube changes
1631
- retentionTimeDimension: null,
1632
- retentionBindingKey: null,
1633
- retentionCohortFilters: [],
1634
- retentionActivityFilters: [],
1635
- retentionBreakdowns: []
1636
- })),
1637
- setRetentionBindingKey: (e) => t({ retentionBindingKey: e }),
1638
- setRetentionTimeDimension: (e) => t({ retentionTimeDimension: e }),
1639
- setRetentionDateRange: (e) => t({ retentionDateRange: e }),
1640
- setRetentionCohortFilters: (e) => t({ retentionCohortFilters: e }),
1641
- addRetentionCohortFilter: (e) => t((n) => ({
1642
- retentionCohortFilters: [...n.retentionCohortFilters, e]
1643
- })),
1644
- removeRetentionCohortFilter: (e) => t((n) => ({
1645
- retentionCohortFilters: n.retentionCohortFilters.filter(
1646
- (r, s) => s !== e
1647
- )
1648
- })),
1649
- updateRetentionCohortFilter: (e, n) => t((r) => {
1650
- const s = [...r.retentionCohortFilters];
1651
- return s[e] && (s[e] = n), { retentionCohortFilters: s };
1652
- }),
1653
- setRetentionActivityFilters: (e) => t({ retentionActivityFilters: e }),
1654
- addRetentionActivityFilter: (e) => t((n) => ({
1655
- retentionActivityFilters: [...n.retentionActivityFilters, e]
1656
- })),
1657
- removeRetentionActivityFilter: (e) => t((n) => ({
1658
- retentionActivityFilters: n.retentionActivityFilters.filter(
1659
- (r, s) => s !== e
1660
- )
1661
- })),
1662
- updateRetentionActivityFilter: (e, n) => t((r) => {
1663
- const s = [...r.retentionActivityFilters];
1664
- return s[e] && (s[e] = n), { retentionActivityFilters: s };
1665
- }),
1666
- setRetentionBreakdowns: (e) => t({ retentionBreakdowns: e }),
1667
- addRetentionBreakdown: (e) => t((n) => ({
1668
- retentionBreakdowns: [...n.retentionBreakdowns, e]
1669
- })),
1670
- removeRetentionBreakdown: (e) => t((n) => ({
1671
- retentionBreakdowns: n.retentionBreakdowns.filter((r) => r.field !== e)
1672
- })),
1673
- setRetentionViewGranularity: (e) => t({ retentionViewGranularity: e }),
1674
- setRetentionPeriods: (e) => t({
1675
- retentionPeriods: Math.max(
1676
- Ln,
1677
- Math.min(Kn, e)
1678
- )
1679
- }),
1680
- setRetentionType: (e) => t({ retentionType: e }),
1681
- isRetentionMode: () => i().analysisType === "retention",
1682
- isRetentionModeEnabled: () => {
1683
- const e = i();
1684
- return !(e.analysisType !== "retention" || !e.retentionBindingKey?.dimension || !e.retentionTimeDimension);
1685
- },
1686
- buildRetentionQuery: () => {
1687
- const e = i();
1688
- if (e.analysisType !== "retention" || !e.retentionBindingKey?.dimension || !e.retentionTimeDimension) return null;
1689
- let n;
1690
- if (typeof e.retentionBindingKey.dimension == "string")
1691
- n = e.retentionBindingKey.dimension;
1692
- else if (Array.isArray(e.retentionBindingKey.dimension))
1693
- n = e.retentionBindingKey.dimension.map((s) => ({
1694
- cube: s.cube,
1695
- dimension: s.dimension
1696
- }));
1697
- else
1698
- return null;
1699
- const r = {
1700
- retention: {
1701
- timeDimension: e.retentionTimeDimension,
1702
- bindingKey: n,
1703
- dateRange: e.retentionDateRange,
1704
- granularity: e.retentionViewGranularity,
1705
- periods: e.retentionPeriods,
1706
- retentionType: e.retentionType
1707
- }
1708
- };
1709
- return e.retentionCohortFilters.length > 0 && (r.retention.cohortFilters = e.retentionCohortFilters.length === 1 ? e.retentionCohortFilters[0] : e.retentionCohortFilters), e.retentionActivityFilters.length > 0 && (r.retention.activityFilters = e.retentionActivityFilters.length === 1 ? e.retentionActivityFilters[0] : e.retentionActivityFilters), e.retentionBreakdowns.length > 0 && (r.retention.breakdownDimensions = e.retentionBreakdowns.map((s) => s.field)), r;
1710
- },
1711
- getRetentionValidation: () => {
1712
- const e = i(), n = [], r = [];
1713
- if (e.analysisType !== "retention")
1714
- return { isValid: !0, errors: [], warnings: [] };
1715
- if (e.retentionCube || n.push("Select a cube for retention analysis"), e.retentionBindingKey?.dimension || n.push("Select a user identifier (binding key) to track retention"), e.retentionTimeDimension || n.push("Select a timestamp dimension for the analysis"), !e.retentionDateRange?.start || !e.retentionDateRange?.end)
1716
- n.push("Date range is required for retention analysis");
1717
- else {
1718
- const s = new Date(e.retentionDateRange.start), o = new Date(e.retentionDateRange.end);
1719
- isNaN(s.getTime()) && n.push("Invalid start date format"), isNaN(o.getTime()) && n.push("Invalid end date format"), s > o && n.push("Start date must be before or equal to end date");
1720
- }
1721
- return e.retentionPeriods < 1 && n.push("At least 1 retention period is required"), e.retentionPeriods > 52 && r.push("More than 52 periods may impact performance"), {
1722
- isValid: n.length === 0,
1723
- errors: n,
1724
- warnings: r
1725
- };
1726
- }
1727
- }), xt = {
1728
- isOpen: !1,
1729
- userPrompt: "",
1730
- isGenerating: !1,
1731
- error: null,
1732
- hasGeneratedQuery: !1,
1733
- previousState: null
1734
- }, Fr = () => ({
1735
- activeTab: "query",
1736
- activeView: "chart",
1737
- displayLimit: 100,
1738
- showFieldModal: !1,
1739
- fieldModalMode: "metrics",
1740
- aiState: xt
1741
- }), Ar = (t, i) => ({
1742
- ...Fr(),
1743
- // ==========================================================================
1744
- // Tab/View Actions
1745
- // ==========================================================================
1746
- setActiveTab: (e) => t({ activeTab: e }),
1747
- setActiveView: (e) => t((n) => ({
1748
- activeView: e,
1749
- activeViews: {
1750
- ...n.activeViews,
1751
- [n.analysisType]: e
1752
- }
1753
- })),
1754
- setDisplayLimit: (e) => t({ displayLimit: e }),
1755
- // ==========================================================================
1756
- // Field Modal Actions
1757
- // ==========================================================================
1758
- openMetricsModal: () => t({ showFieldModal: !0, fieldModalMode: "metrics" }),
1759
- openBreakdownsModal: () => t({ showFieldModal: !0, fieldModalMode: "breakdown" }),
1760
- closeFieldModal: () => t({ showFieldModal: !1 }),
1761
- // ==========================================================================
1762
- // AI Actions
1763
- // ==========================================================================
1764
- openAI: () => t((e) => ({
1765
- aiState: { ...e.aiState, isOpen: !0 }
1766
- })),
1767
- closeAI: () => t((e) => ({
1768
- aiState: { ...e.aiState, isOpen: !1 }
1769
- })),
1770
- setAIPrompt: (e) => t((n) => ({
1771
- aiState: { ...n.aiState, userPrompt: e }
1772
- })),
1773
- setAIGenerating: (e) => t((n) => ({
1774
- aiState: { ...n.aiState, isGenerating: e }
1775
- })),
1776
- setAIError: (e) => t((n) => ({
1777
- aiState: { ...n.aiState, error: e }
1778
- })),
1779
- setAIHasGeneratedQuery: (e) => t((n) => ({
1780
- aiState: { ...n.aiState, hasGeneratedQuery: e }
1781
- })),
1782
- saveAIPreviousState: () => t((e) => {
1783
- const n = e.queryStates[e.activeQueryIndex], r = e.charts[e.analysisType] || {
1784
- chartType: "bar",
1785
- chartConfig: {},
1786
- displayConfig: { showLegend: !0, showGrid: !0, showTooltip: !0 }
1787
- };
1788
- return {
1789
- aiState: {
1790
- ...e.aiState,
1791
- previousState: n ? {
1792
- metrics: [...n.metrics],
1793
- breakdowns: [...n.breakdowns],
1794
- filters: [...n.filters],
1795
- chartType: r.chartType,
1796
- chartConfig: { ...r.chartConfig },
1797
- displayConfig: { ...r.displayConfig }
1798
- } : null
1799
- }
1800
- };
1801
- }),
1802
- restoreAIPreviousState: () => t((e) => {
1803
- const n = e.aiState.previousState;
1804
- if (!n) return e;
1805
- const r = e.activeQueryIndex, s = [...e.queryStates];
1806
- return s[r] = {
1807
- ...s[r] || R(),
1808
- metrics: n.metrics,
1809
- breakdowns: n.breakdowns,
1810
- filters: n.filters
1811
- }, {
1812
- queryStates: s,
1813
- charts: {
1814
- ...e.charts,
1815
- [e.analysisType]: {
1816
- chartType: n.chartType,
1817
- chartConfig: n.chartConfig,
1818
- displayConfig: n.displayConfig
1819
- }
1820
- },
1821
- aiState: { ...xt }
1822
- };
1823
- })
1824
- });
1825
- function dt(t) {
1826
- const i = t.filters ? [...t.filters] : [], e = t.timeDimensions || [], n = [
1827
- ...(t.dimensions || []).map((s) => ({
1828
- id: $(),
1829
- field: s,
1830
- isTimeDimension: !1
1831
- })),
1832
- ...e.map((s) => ({
1833
- id: $(),
1834
- field: s.dimension,
1835
- granularity: s.granularity,
1836
- isTimeDimension: !0,
1837
- enableComparison: !!(s.compareDateRange && s.compareDateRange.length > 0)
1838
- }))
1839
- ];
1840
- let r = i;
1841
- for (const s of e) {
1842
- if (!s.compareDateRange || s.compareDateRange.length === 0) continue;
1843
- const o = r.some(
1844
- (f) => "member" in f && f.member === s.dimension && f.operator === "inDateRange"
1845
- ), l = s.compareDateRange[0], u = Array.isArray(l) || typeof l == "string" ? l : void 0;
1846
- if (u) {
1847
- if (!o) {
1848
- r = [
1849
- ...r,
1850
- {
1851
- member: s.dimension,
1852
- operator: "inDateRange",
1853
- values: [],
1854
- dateRange: u
1855
- }
1856
- ];
1857
- continue;
1858
- }
1859
- r = r.map((f) => "member" in f && f.member === s.dimension && f.operator === "inDateRange" && !f.dateRange ? { ...f, dateRange: u } : f);
1860
- }
1861
- }
1862
- return {
1863
- ...R(),
1864
- metrics: (t.measures || []).map((s, o) => ({
1865
- id: $(),
1866
- field: s,
1867
- label: pe(o)
1868
- })),
1869
- breakdowns: n,
1870
- filters: r,
1871
- order: t.order
1872
- };
1873
- }
1874
- function Qr(t) {
1875
- return "queries" in t && Array.isArray(t.queries);
1876
- }
1877
- function Mr(t) {
1878
- if (t.initialAnalysisType === "funnel" && t.initialFunnelState) {
1879
- const i = W.getDefaultChartConfig(), e = {
1880
- chartType: t.initialChartConfig?.chartType || i.chartType,
1881
- chartConfig: t.initialChartConfig?.chartConfig || i.chartConfig,
1882
- displayConfig: t.initialChartConfig?.displayConfig || i.displayConfig
1883
- }, n = {
1884
- funnelCube: t.initialFunnelState.funnelCube ?? null,
1885
- funnelSteps: t.initialFunnelState.funnelSteps || [],
1886
- activeFunnelStepIndex: 0,
1887
- funnelTimeDimension: t.initialFunnelState.funnelTimeDimension ?? null,
1888
- funnelBindingKey: t.initialFunnelState.funnelBindingKey ?? null
1889
- };
1890
- return W.save(
1891
- n,
1892
- { funnel: e },
1893
- t.initialActiveView || "chart"
1894
- );
1895
- }
1896
- if (t.initialAnalysisType === "flow" && t.initialFlowState) {
1897
- const i = J.getDefaultChartConfig(), e = {
1898
- chartType: t.initialChartConfig?.chartType || i.chartType,
1899
- chartConfig: t.initialChartConfig?.chartConfig || i.chartConfig,
1900
- displayConfig: t.initialChartConfig?.displayConfig || i.displayConfig
1901
- }, n = {
1902
- flowCube: t.initialFlowState.flowCube ?? null,
1903
- flowBindingKey: t.initialFlowState.flowBindingKey ?? null,
1904
- flowTimeDimension: t.initialFlowState.flowTimeDimension ?? null,
1905
- startingStep: t.initialFlowState.startingStep || { name: "", filters: [] },
1906
- stepsBefore: t.initialFlowState.stepsBefore ?? 3,
1907
- stepsAfter: t.initialFlowState.stepsAfter ?? 3,
1908
- eventDimension: t.initialFlowState.eventDimension ?? null,
1909
- joinStrategy: t.initialFlowState.joinStrategy ?? "auto"
1910
- };
1911
- return J.save(
1912
- n,
1913
- { flow: e },
1914
- t.initialActiveView || "chart"
1915
- );
1916
- }
1917
- if (t.initialAnalysisType === "retention" && t.initialRetentionState) {
1918
- const i = X.getDefaultChartConfig(), e = {
1919
- chartType: t.initialChartConfig?.chartType || i.chartType,
1920
- chartConfig: t.initialChartConfig?.chartConfig || i.chartConfig,
1921
- displayConfig: t.initialChartConfig?.displayConfig || i.displayConfig
1922
- }, n = $n(Gn), r = {
1923
- retentionCube: t.initialRetentionState.retentionCube ?? null,
1924
- retentionBindingKey: t.initialRetentionState.retentionBindingKey ?? null,
1925
- retentionTimeDimension: t.initialRetentionState.retentionTimeDimension ?? null,
1926
- retentionDateRange: t.initialRetentionState.retentionDateRange ?? n,
1927
- retentionCohortFilters: t.initialRetentionState.retentionCohortFilters || [],
1928
- retentionActivityFilters: t.initialRetentionState.retentionActivityFilters || [],
1929
- retentionBreakdowns: t.initialRetentionState.retentionBreakdowns || [],
1930
- retentionViewGranularity: t.initialRetentionState.retentionViewGranularity ?? "week",
1931
- retentionPeriods: t.initialRetentionState.retentionPeriods ?? 12,
1932
- retentionType: t.initialRetentionState.retentionType ?? "classic"
1933
- };
1934
- return X.save(
1935
- r,
1936
- { retention: e },
1937
- t.initialActiveView || "chart"
1938
- );
1939
- }
1940
- if (t.initialQuery) {
1941
- const i = t.initialQuery;
1942
- let e, n = "concat";
1943
- Qr(i) ? (e = i.queries.map(dt), i.mergeStrategy && (n = i.mergeStrategy)) : e = [dt(i)];
1944
- const r = K.getDefaultChartConfig(), s = {
1945
- chartType: t.initialChartConfig?.chartType || r.chartType,
1946
- chartConfig: t.initialChartConfig?.chartConfig || r.chartConfig,
1947
- displayConfig: t.initialChartConfig?.displayConfig || r.displayConfig
1948
- };
1949
- return K.save(
1950
- { queryStates: e, activeQueryIndex: 0, mergeStrategy: n },
1951
- { query: s },
1952
- t.initialActiveView || "chart"
1953
- );
1954
- }
1955
- if (t.initialChartConfig) {
1956
- const i = K.getDefaultChartConfig(), e = {
1957
- chartType: t.initialChartConfig.chartType || i.chartType,
1958
- chartConfig: t.initialChartConfig.chartConfig || i.chartConfig,
1959
- displayConfig: t.initialChartConfig.displayConfig || i.displayConfig
1960
- };
1961
- return K.save(
1962
- { queryStates: [R()], activeQueryIndex: 0, mergeStrategy: "concat" },
1963
- { query: e },
1964
- t.initialActiveView || "chart"
1965
- );
1966
- }
1967
- return t.initialActiveView ? K.save(
1968
- { queryStates: [R()], activeQueryIndex: 0, mergeStrategy: "concat" },
1969
- { query: K.getDefaultChartConfig() },
1970
- t.initialActiveView
1971
- ) : null;
1972
- }
1973
- function Rr(t, i) {
1974
- return {
1975
- reset: () => {
1976
- t({
1977
- ...Dt(),
1978
- ...Le(),
1979
- ...Ke(),
1980
- ...$e(),
1981
- ...Ge(),
1982
- // Apply adapter defaults for charts (may differ from slice defaults)
1983
- charts: {
1984
- query: K.getDefaultChartConfig(),
1985
- funnel: W.getDefaultChartConfig(),
1986
- flow: J.getDefaultChartConfig(),
1987
- retention: X.getDefaultChartConfig()
1988
- },
1989
- activeViews: {
1990
- query: "chart",
1991
- funnel: "chart",
1992
- flow: "chart",
1993
- retention: "chart"
1994
- }
1995
- });
1996
- },
1997
- clearCurrentMode: () => t((e) => {
1998
- switch (e.analysisType) {
1999
- case "funnel":
2000
- return {
2001
- ...Ke(),
2002
- charts: {
2003
- ...e.charts,
2004
- funnel: W.getDefaultChartConfig()
2005
- }
2006
- };
2007
- case "flow":
2008
- return {
2009
- ...$e(),
2010
- charts: {
2011
- ...e.charts,
2012
- flow: J.getDefaultChartConfig()
2013
- }
2014
- };
2015
- case "retention":
2016
- return {
2017
- ...Ge(),
2018
- charts: {
2019
- ...e.charts,
2020
- retention: X.getDefaultChartConfig()
2021
- }
2022
- };
2023
- default:
2024
- return {
2025
- ...Le(),
2026
- userManuallySelectedChart: !1,
2027
- charts: {
2028
- ...e.charts,
2029
- query: K.getDefaultChartConfig()
2030
- }
2031
- };
2032
- }
2033
- }),
2034
- clearQuery: () => t((e) => {
2035
- const n = [...e.queryStates];
2036
- return n[e.activeQueryIndex] = R(), {
2037
- queryStates: n,
2038
- userManuallySelectedChart: !1,
2039
- charts: {
2040
- ...e.charts,
2041
- query: K.getDefaultChartConfig()
2042
- }
2043
- };
2044
- }),
2045
- getValidation: () => {
2046
- const e = i(), n = L.get(e.analysisType), r = n.extractState(e);
2047
- return n.validate(r);
2048
- }
2049
- };
2050
- }
2051
- function kr(t = {}) {
2052
- const i = Mr(t), e = (n, r, s) => ({
2053
- // Compose slices - they provide default state and actions
2054
- ...br(n, r),
2055
- ...vr(n, r),
2056
- ...Dr(n, r),
2057
- ...xr(n, r),
2058
- ...Tr(n, r),
2059
- ...Ar(n),
2060
- // Cross-slice actions
2061
- ...Rr(n, r)
2062
- });
2063
- if (t.disableLocalStorage) {
2064
- const n = nt()(
2065
- rt(it(e), {
2066
- name: "AnalysisBuilderStore (no-persist)"
2067
- })
2068
- );
2069
- return i && n.getState().load(i), n;
2070
- }
2071
- return nt()(
2072
- rt(
2073
- it(
2074
- Pn(e, {
2075
- name: t.storageKey || nr,
2076
- // Use workspace format to preserve ALL modes' state
2077
- partialize: (n) => n.saveWorkspace(),
2078
- merge: (n, r) => n && qn(n) ? {
2079
- ...r,
2080
- _persistedWorkspace: n
2081
- } : n && yt(n) ? {
2082
- ...r,
2083
- _persistedConfig: n
2084
- } : i ? {
2085
- ...r,
2086
- _initialConfig: i
2087
- } : r,
2088
- onRehydrateStorage: () => (n) => {
2089
- if (n) {
2090
- if (n._persistedWorkspace) {
2091
- const r = n._persistedWorkspace;
2092
- delete n._persistedWorkspace, delete n._persistedConfig, delete n._initialConfig, n.loadWorkspace(r);
2093
- } else if (n._persistedConfig) {
2094
- const r = n._persistedConfig;
2095
- delete n._persistedConfig, delete n._initialConfig, n.load(r);
2096
- } else if (n._initialConfig) {
2097
- const r = n._initialConfig;
2098
- delete n._initialConfig, n.load(r);
2099
- }
2100
- }
2101
- }
2102
- })
2103
- ),
2104
- { name: "AnalysisBuilderStore" }
2105
- )
2106
- );
2107
- }
2108
- const We = kn(null);
2109
- function ui({
2110
- children: t,
2111
- initialQuery: i,
2112
- initialChartConfig: e,
2113
- disableLocalStorage: n,
2114
- storageKey: r,
2115
- initialAnalysisType: s,
2116
- initialFunnelState: o,
2117
- initialFlowState: l,
2118
- initialRetentionState: u,
2119
- initialActiveView: f
2120
- }) {
2121
- const m = Se(null);
2122
- return m.current || (m.current = kr({
2123
- initialQuery: i,
2124
- initialChartConfig: e,
2125
- disableLocalStorage: n,
2126
- storageKey: r,
2127
- initialAnalysisType: s,
2128
- initialFunnelState: o,
2129
- initialFlowState: l,
2130
- initialRetentionState: u,
2131
- initialActiveView: f
2132
- })), /* @__PURE__ */ C(We.Provider, { value: m.current, children: t });
2133
- }
2134
- function c(t) {
2135
- const i = mt(We);
2136
- if (!i)
2137
- throw new Error("useAnalysisBuilderStore must be used within AnalysisBuilderStoreProvider");
2138
- return En(i, t);
2139
- }
2140
- function Ir() {
2141
- const t = mt(We);
2142
- if (!t)
2143
- throw new Error("useAnalysisBuilderStoreApi must be used within AnalysisBuilderStoreProvider");
2144
- return t;
2145
- }
2146
- const Je = (t) => t.queryStates[t.activeQueryIndex] || R(), fi = (t) => Je(t).metrics, mi = (t) => Je(t).breakdowns, yi = (t) => Je(t).filters, qr = (t) => {
2147
- const i = t.charts[t.analysisType];
2148
- return i ? {
2149
- chartType: i.chartType,
2150
- chartConfig: i.chartConfig,
2151
- displayConfig: i.displayConfig
2152
- } : {
2153
- chartType: "bar",
2154
- chartConfig: {},
2155
- displayConfig: { showLegend: !0, showGrid: !0, showTooltip: !0 }
2156
- };
2157
- }, gi = (t) => ({
2158
- activeTab: t.activeTab,
2159
- activeView: t.activeView,
2160
- displayLimit: t.displayLimit,
2161
- showFieldModal: t.showFieldModal,
2162
- fieldModalMode: t.fieldModalMode
2163
- }), hi = (t) => ({
2164
- queryStates: t.queryStates,
2165
- activeQueryIndex: t.activeQueryIndex,
2166
- mergeStrategy: t.mergeStrategy,
2167
- // Multi-query mode is when we have more than one query in 'query' analysis type
2168
- isMultiQueryMode: t.analysisType === "query" && t.queryStates.length > 1
2169
- }), pi = (t) => ({
2170
- funnelCube: t.funnelCube,
2171
- funnelSteps: t.funnelSteps,
2172
- activeFunnelStepIndex: t.activeFunnelStepIndex,
2173
- funnelTimeDimension: t.funnelTimeDimension,
2174
- funnelBindingKey: t.funnelBindingKey,
2175
- isFunnelMode: t.analysisType === "funnel",
2176
- // Deprecated field kept for backward compat
2177
- stepTimeToConvert: t.stepTimeToConvert
2178
- });
2179
- function ut(t) {
2180
- return t.timeDimensions || [];
2181
- }
2182
- function Br(t) {
2183
- const i = [];
2184
- if (t.length < 2) return i;
2185
- const e = ut(t[0]);
2186
- if (e.length === 0) return i;
2187
- for (let n = 1; n < t.length; n++) {
2188
- const r = ut(t[n]);
2189
- if (r.length === 0 && e.length > 0) {
2190
- i.push({
2191
- type: "missing_time_dimension",
2192
- queryIndex: n,
2193
- message: `Query ${n + 1} is missing time dimension "${e[0].dimension}"`,
2194
- details: { field: e[0].dimension }
2195
- });
2196
- continue;
2197
- }
2198
- for (const s of e) {
2199
- const o = r.find((l) => l.dimension === s.dimension);
2200
- o && o.granularity !== s.granularity && i.push({
2201
- type: "granularity_mismatch",
2202
- queryIndex: n,
2203
- message: `Query ${n + 1} uses "${o.granularity}" granularity but Query 1 uses "${s.granularity}"`,
2204
- details: {
2205
- field: s.dimension,
2206
- expectedGranularity: s.granularity,
2207
- actualGranularity: o.granularity
2208
- }
2209
- });
2210
- }
2211
- }
2212
- return i;
2213
- }
2214
- function Vr(t, i) {
2215
- const e = [];
2216
- if (t.length < 2 || i.length === 0) return e;
2217
- for (let n = 0; n < t.length; n++) {
2218
- const r = t[n], s = /* @__PURE__ */ new Set([
2219
- ...r.dimensions || [],
2220
- ...r.timeDimensions?.map((o) => o.dimension) || []
2221
- ]);
2222
- for (const o of i)
2223
- s.has(o) || e.push({
2224
- type: "missing_merge_key",
2225
- queryIndex: n,
2226
- message: `Query ${n + 1} is missing merge dimension "${o}"`,
2227
- details: { field: o }
2228
- });
2229
- }
2230
- return e;
2231
- }
2232
- function Nr(t) {
2233
- const i = [];
2234
- if (t.length < 2) return i;
2235
- const e = /* @__PURE__ */ new Map();
2236
- t.forEach((s, o) => {
2237
- s.measures?.forEach((l) => {
2238
- e.has(l) || e.set(l, []), e.get(l).push(o);
2239
- });
2240
- });
2241
- const n = [], r = /* @__PURE__ */ new Set();
2242
- return e.forEach((s, o) => {
2243
- s.length > 1 && (n.push(o), s.forEach((l) => r.add(l)));
2244
- }), n.length > 0 && i.push({
2245
- type: "measure_collision",
2246
- queryIndices: Array.from(r).sort(),
2247
- message: `Measure${n.length > 1 ? "s" : ""} "${n.join('", "')}" appear${n.length === 1 ? "s" : ""} in multiple queries - first value will be used`,
2248
- affectedMeasures: n
2249
- }), i;
2250
- }
2251
- function Er(t) {
2252
- const i = [];
2253
- if (t.length < 2) return i;
2254
- const e = t.map((r) => r.timeDimensions?.[0]?.dateRange);
2255
- return new Set(e.map((r) => JSON.stringify(r))).size > 1 && i.push({
2256
- type: "asymmetric_date_range",
2257
- queryIndices: t.map((r, s) => s),
2258
- message: "Queries have different date ranges - some data points may be missing in merged results"
2259
- }), i;
2260
- }
2261
- function Pr(t, i, e = []) {
2262
- const n = [], r = [];
2263
- return t.length < 2 ? { isValid: !0, errors: n, warnings: r } : (r.push(...Nr(t)), r.push(...Er(t)), i === "merge" && (n.push(...Br(t)), e.length > 0 && n.push(...Vr(t, e))), {
2264
- isValid: n.length === 0,
2265
- errors: n,
2266
- warnings: r
2267
- });
2268
- }
2269
- function Ci(t) {
2270
- return t.filter(
2271
- (i) => (i.measures?.length || 0) + (i.dimensions?.length || 0) + (i.timeDimensions?.length || 0) > 0
2272
- ).length >= 2;
2273
- }
2274
- function wi(t) {
2275
- if (t.isValid && t.warnings.length === 0)
2276
- return "Configuration is valid";
2277
- const i = [];
2278
- return t.errors.length > 0 && i.push(`${t.errors.length} error${t.errors.length > 1 ? "s" : ""}`), t.warnings.length > 0 && i.push(`${t.warnings.length} warning${t.warnings.length > 1 ? "s" : ""}`), i.join(", ");
2279
- }
2280
- function Ur() {
2281
- const t = c((g) => g.queryStates), i = c((g) => g.activeQueryIndex), e = c((g) => g.mergeStrategy), n = c((g) => g.setActiveQueryIndex), r = c((g) => g.setMergeStrategy), s = c((g) => g.addQuery), o = c((g) => g.removeQuery), l = c((g) => g.getCurrentState), u = c((g) => g.getMergeKeys), f = c((g) => g.isMultiQueryMode), m = l(), y = f(), d = u(), p = A(() => {
2282
- const g = t[i] || m;
2283
- return Ce(g.metrics, g.breakdowns, g.filters, g.order);
2284
- }, [t, i, m]), b = A(() => {
2285
- const g = t[0]?.breakdowns || [];
2286
- return t.map((D, B) => {
2287
- const _ = e === "merge" && B > 0 ? g : D.breakdowns;
2288
- return Ce(D.metrics, _, D.filters, D.order);
2289
- });
2290
- }, [t, e]), w = A(() => {
2291
- if (t.length <= 1) return null;
2292
- const g = b.filter((D) => D.measures && D.measures.length > 0 || D.dimensions && D.dimensions.length > 0 || D.timeDimensions && D.timeDimensions.length > 0);
2293
- return g.length < 2 ? null : {
2294
- queries: g,
2295
- mergeStrategy: e,
2296
- mergeKeys: d,
2297
- queryLabels: g.map((D, B) => `Q${B + 1}`)
2298
- };
2299
- }, [b, t.length, e, d]), x = A(() => y ? Pr(b, e, d || []) : null, [y, b, e, d]), v = A(() => p.measures && p.measures.length > 0 || p.dimensions && p.dimensions.length > 0 || p.timeDimensions && p.timeDimensions.length > 0, [p]);
2300
- return {
2301
- queryState: m,
2302
- queryStates: t,
2303
- activeQueryIndex: i,
2304
- mergeStrategy: e,
2305
- isMultiQueryMode: y,
2306
- mergeKeys: d,
2307
- currentQuery: p,
2308
- allQueries: b,
2309
- multiQueryConfig: w,
2310
- multiQueryValidation: x,
2311
- isValidQuery: v,
2312
- // Actions
2313
- setActiveQueryIndex: n,
2314
- setMergeStrategy: r,
2315
- addQuery: s,
2316
- removeQuery: o
2317
- };
2318
- }
2319
- function _r(t) {
2320
- const { queryState: i, queryStates: e, isMultiQueryMode: n, mergeStrategy: r, activeQueryIndex: s } = t, o = A(() => {
2321
- if (!n) return i.metrics;
2322
- const f = /* @__PURE__ */ new Set(), m = [];
2323
- for (let y = 0; y < e.length; y++) {
2324
- const d = e[y];
2325
- for (const p of d.metrics) {
2326
- const b = `Q${y + 1}:${p.field}`;
2327
- f.has(b) || (f.add(b), m.push({
2328
- ...p,
2329
- label: `${p.label} (Q${y + 1})`
2330
- }));
2331
- }
2332
- }
2333
- return m;
2334
- }, [n, e, i.metrics]), l = A(() => {
2335
- if (!n) return i.breakdowns;
2336
- const f = /* @__PURE__ */ new Set(), m = [];
2337
- for (const y of e)
2338
- for (const d of y.breakdowns)
2339
- f.has(d.field) || (f.add(d.field), m.push(d));
2340
- return m;
2341
- }, [n, e, i.breakdowns]), u = A(() => r === "merge" && s > 0 ? e[0]?.breakdowns || [] : i.breakdowns, [r, s, e, i.breakdowns]);
2342
- return {
2343
- combinedMetrics: o,
2344
- combinedBreakdowns: l,
2345
- effectiveBreakdowns: u
2346
- };
2347
- }
2348
- function Lr(t) {
2349
- const {
2350
- currentQuery: i,
2351
- allQueries: e,
2352
- multiQueryConfig: n,
2353
- isMultiQueryMode: r,
2354
- isValidQuery: s,
2355
- initialData: o,
2356
- // Unused - legacy mergeStrategy === 'funnel' is no longer supported
2357
- funnelBindingKey: l,
2358
- isFunnelModeEnabled: u,
2359
- analysisType: f,
2360
- serverFunnelQuery: m,
2361
- serverFlowQuery: y,
2362
- serverRetentionQuery: d,
2363
- retentionValidation: p
2364
- } = t, { getFieldLabel: b } = Vn(), w = f === "funnel" || u, x = f === "flow", v = f === "retention", g = f === "query" && r, D = f === "query" && !r, B = f === "funnel" && !!m, _ = A(() => B || !w || !l || e.length < 2 ? null : Xn(e, l), [B, w, l, e]), Q = Hn(i, {
2365
- skip: !s || !D,
2366
- debounceMs: 300
2367
- }), M = jn(n, {
2368
- skip: !n || !g,
2369
- debounceMs: 300
2370
- }), T = zn(_, {
2371
- skip: !w || !_ && !m,
2372
- debounceMs: 300,
2373
- prebuiltServerQuery: B ? m : void 0
2374
- }), h = Wn(y ?? null, {
2375
- skip: !x || !y,
2376
- debounceMs: 300
2377
- }), F = Jn(d ?? null, {
2378
- skip: !v || !d,
2379
- debounceMs: 300,
2380
- getFieldLabel: b
2381
- // Pass label resolver for human-readable binding key display
2382
- }), P = Yn({
2383
- queries: r ? e : [i],
2384
- isMultiQueryMode: r,
2385
- skip: !s || w || x || v
2386
- }), Y = Be(
2387
- T.serverQuery,
2388
- { skip: !w || !T.serverQuery }
2389
- ), be = Be(
2390
- h.serverQuery,
2391
- { skip: !x || !h.serverQuery }
2392
- ), se = Be(
2393
- d,
2394
- { skip: !v || !d }
2395
- ), G = v ? F.isLoading || F.isDebouncing : x ? h.isLoading || h.isDebouncing : w ? T.isExecuting || T.isDebouncing : g ? M.isLoading : Q.isLoading, j = v ? F.isFetching : x ? h.isFetching : w ? T.isExecuting : g ? M.isFetching : Q.isFetching, O = v ? F.error : x ? h.error : w ? T.error : g ? M.error : Q.error, Z = !!(Q.debouncedQuery || M.debouncedConfig || !T.isDebouncing || // Funnel has debounced when not debouncing
2396
- !h.isDebouncing || // Flow has debounced when not debouncing
2397
- !F.isDebouncing), ee = U((k) => {
2398
- v ? F.execute(k) : x ? h.refetch(k) : w ? T.execute(k) : g ? M.refetch(k) : Q.refetch(k);
2399
- }, [v, x, w, g, F, h, T, M, Q]), te = A(() => {
2400
- const k = v ? F.chartData : x ? h.data : w ? T.chartData : g ? M.data : Q.rawData;
2401
- return o && o.length > 0 && !k ? "success" : s ? G && !k ? "loading" : j && k ? "refreshing" : O ? "error" : k ? "success" : "idle" : "idle";
2402
- }, [s, G, j, O, Q.rawData, M.data, T.chartData, h.data, F.chartData, o, g, w, x, v]), ne = A(() => v && F.chartData ? F.chartData.rows.map((k) => ({
2403
- "Retention.period": `P${k.period}`,
2404
- "Retention.rate": k.retentionRate,
2405
- "Retention.retained": k.retainedUsers,
2406
- "Retention.cohortSize": k.cohortSize,
2407
- "Retention.segment": k.breakdownValue || "All Users"
2408
- })) : x && h.data ? [h.data] : w && T.chartData ? T.chartData : g && M.data ? M.data : Q.rawData ? Q.rawData : o && o.length > 0 ? o : null, [Q.rawData, M.data, T.chartData, h.data, F.chartData, o, g, w, x, v]), ae = A(() => w && T.stepResults ? T.stepResults.map((k) => k.data) : !g || !M.perQueryData ? null : M.perQueryData, [g, w, M.perQueryData, T.stepResults]), oe = w && T.executedQueries?.length > 0 ? T.executedQueries : null, le = w ? T.serverQuery : null, ce = w ? Y.debugData : null, de = x ? h.serverQuery : null, ue = x ? h.data : null, fe = x ? be.debugData : null, me = v ? d ?? null : null, ve = v ? F.chartData : null, De = v ? se.debugData : null, xe = A(() => v ? F.needsRefresh : x ? h.needsRefresh : w ? T.needsRefresh : g ? !1 : Q.needsRefresh, [v, x, w, g, F.needsRefresh, h.needsRefresh, T.needsRefresh, Q.needsRefresh]), Te = A(() => {
2409
- if (D && Q.warnings)
2410
- return Q.warnings;
2411
- }, [D, Q.warnings]);
2412
- return {
2413
- executionStatus: te,
2414
- executionResults: ne,
2415
- perQueryResults: ae,
2416
- isLoading: G,
2417
- isFetching: j,
2418
- error: O,
2419
- debugDataPerQuery: P.debugDataPerQuery,
2420
- hasDebounced: Z,
2421
- refetch: ee,
2422
- funnelExecutedQueries: oe,
2423
- funnelServerQuery: le,
2424
- funnelDebugData: ce,
2425
- flowServerQuery: de,
2426
- flowChartData: ue,
2427
- flowDebugData: fe,
2428
- retentionServerQuery: me,
2429
- retentionChartData: ve,
2430
- retentionDebugData: De,
2431
- retentionValidation: p ?? null,
2432
- needsRefresh: xe,
2433
- warnings: Te
2434
- };
2435
- }
2436
- function Kr(t) {
2437
- const { externalColorPalette: i, combinedMetrics: e, combinedBreakdowns: n, hasDebounced: r } = t, s = c((h) => h.analysisType), { chartType: o, chartConfig: l, displayConfig: u } = c(Un(qr)), f = c((h) => h.userManuallySelectedChart), m = c((h) => h.localPaletteName), y = c((h) => h.setChartTypeManual), d = c((h) => h.setChartConfig), p = c((h) => h.setDisplayConfig), b = c((h) => h.setFunnelChartType), w = c((h) => h.setFunnelChartConfig), x = c((h) => h.setFunnelDisplayConfig), v = c((h) => h.setLocalPaletteName), g = c((h) => h.setUserManuallySelectedChart), D = U(
2438
- (h) => {
2439
- if (s === "funnel")
2440
- b(h);
2441
- else {
2442
- y(h);
2443
- const { chartConfig: F } = Ve(
2444
- e,
2445
- n,
2446
- h
2447
- );
2448
- d(F);
2449
- }
2450
- },
2451
- [
2452
- s,
2453
- e,
2454
- n,
2455
- b,
2456
- y,
2457
- d
2458
- ]
2459
- ), B = U(
2460
- (h) => {
2461
- s === "funnel" ? w(h) : d(h);
2462
- },
2463
- [s, w, d]
2464
- ), _ = U(
2465
- (h) => {
2466
- s === "funnel" ? x(h) : p(h);
2467
- },
2468
- [s, x, p]
2469
- ), Q = A(
2470
- () => sr(e, n),
2471
- [e, n]
2472
- ), M = A(() => i ? Array.isArray(i) && typeof i[0] == "string" ? {
2473
- name: "custom",
2474
- label: "Custom",
2475
- colors: i,
2476
- gradient: i
2477
- } : i : Bn(m), [i, m]), T = Se("");
2478
- return he(() => {
2479
- if (!r || e.length === 0 && n.length === 0) return;
2480
- const h = JSON.stringify({
2481
- metrics: e.map((P) => P.field),
2482
- breakdowns: n.map((P) => ({ field: P.field, isTime: P.isTimeDimension }))
2483
- });
2484
- if (h === T.current) return;
2485
- T.current = h;
2486
- const F = or(
2487
- e,
2488
- n,
2489
- o,
2490
- f
2491
- );
2492
- if (F) {
2493
- const { chartConfig: P } = Ve(
2494
- e,
2495
- n,
2496
- F
2497
- );
2498
- D(F), B(P), g(!1);
2499
- } else if ((e.length > 0 || n.length > 0) && !l.xAxis?.length && !l.yAxis?.length && !l.series?.length) {
2500
- const { chartConfig: Y } = Ve(
2501
- e,
2502
- n,
2503
- o
2504
- );
2505
- B(Y);
2506
- }
2507
- }, [
2508
- r,
2509
- e,
2510
- n,
2511
- o,
2512
- f,
2513
- l,
2514
- D,
2515
- B,
2516
- g
2517
- ]), {
2518
- chartType: o,
2519
- chartConfig: l,
2520
- displayConfig: u,
2521
- colorPalette: M,
2522
- localPaletteName: m,
2523
- chartAvailability: Q,
2524
- userManuallySelectedChart: f,
2525
- // Actions - mode-aware setters route to appropriate store fields
2526
- setChartType: D,
2527
- setChartConfig: B,
2528
- setDisplayConfig: _,
2529
- setLocalPaletteName: v
2530
- };
2531
- }
2532
- function $r() {
2533
- const t = c((d) => d.activeTab), i = c((d) => d.activeView), e = c((d) => d.displayLimit), n = c((d) => d.showFieldModal), r = c((d) => d.fieldModalMode), s = c((d) => d.userManuallySelectedChart), o = c((d) => d.setActiveTab), l = c((d) => d.setActiveView), u = c((d) => d.setDisplayLimit), f = c((d) => d.closeFieldModal), [m, y] = Pe(0);
2534
- return {
2535
- // State
2536
- activeTab: t,
2537
- activeView: i,
2538
- displayLimit: e,
2539
- showFieldModal: n,
2540
- fieldModalMode: r,
2541
- activeTableIndex: m,
2542
- userManuallySelectedChart: s,
2543
- // Actions
2544
- setActiveTab: o,
2545
- setActiveView: l,
2546
- setDisplayLimit: u,
2547
- closeFieldModal: f,
2548
- setActiveTableIndex: y
2549
- };
2550
- }
2551
- const we = 1800, Oe = "share=";
2552
- function He(t) {
2553
- const i = JSON.stringify(t);
2554
- return gt.compressToEncodedURIComponent(i);
2555
- }
2556
- function Gr(t) {
2557
- try {
2558
- const i = gt.decompressFromEncodedURIComponent(t);
2559
- if (!i) return null;
2560
- const e = JSON.parse(i);
2561
- return yt(e) ? e : (console.warn("[shareUtils] Invalid AnalysisConfig in share URL"), null);
2562
- } catch {
2563
- return null;
2564
- }
2565
- }
2566
- function Si(t) {
2567
- const i = He(t);
2568
- return {
2569
- ok: i.length <= we,
2570
- size: i.length,
2571
- maxSize: we
2572
- };
2573
- }
2574
- function Or(t) {
2575
- const i = He(t);
2576
- if (i.length <= we)
2577
- return { encoded: i, queryOnly: !1 };
2578
- const e = {
2579
- version: t.version,
2580
- analysisType: t.analysisType,
2581
- activeView: t.activeView,
2582
- charts: {},
2583
- // Drop chart config to save space
2584
- query: t.query
2585
- }, n = He(e);
2586
- return n.length <= we ? { encoded: n, queryOnly: !0 } : { encoded: null, queryOnly: !0 };
2587
- }
2588
- function bi(t) {
2589
- const { encoded: i } = Or(t);
2590
- return i ? `${window.location.origin}${window.location.pathname}#${Oe}${i}` : null;
2591
- }
2592
- function Hr() {
2593
- if (typeof window > "u") return null;
2594
- const t = window.location.hash;
2595
- return !t || !t.startsWith(`#${Oe}`) ? null : t.slice(Oe.length + 1);
2596
- }
2597
- function jr() {
2598
- if (typeof window > "u") return;
2599
- const t = new URL(window.location.href);
2600
- t.hash = "", window.history.replaceState(null, "", t.toString());
2601
- }
2602
- function zr() {
2603
- const t = Hr();
2604
- return t ? Gr(t) : null;
2605
- }
2606
- function Wr(t) {
2607
- const {
2608
- currentQuery: i,
2609
- isValidQuery: e,
2610
- chartType: n,
2611
- chartConfig: r,
2612
- displayConfig: s,
2613
- onQueryChange: o,
2614
- onChartConfigChange: l
2615
- } = t, u = c((m) => m.load), f = Se(!1);
2616
- he(() => {
2617
- if (f.current) return;
2618
- f.current = !0;
2619
- const m = zr();
2620
- m && (u(m), jr());
2621
- }, [u]), he(() => {
2622
- o && e && o(i);
2623
- }, [i, e, o]), he(() => {
2624
- l && l({
2625
- chartType: n,
2626
- chartConfig: r,
2627
- displayConfig: s
2628
- });
2629
- }, [n, r, s, l]);
2630
- }
2631
- function vi(t = {}) {
2632
- const { initialData: i, externalColorPalette: e, onQueryChange: n, onChartConfigChange: r } = t, { features: s } = Nn(), o = Ir(), l = Ur(), u = _r({
2633
- queryState: l.queryState,
2634
- queryStates: l.queryStates,
2635
- isMultiQueryMode: l.isMultiQueryMode,
2636
- mergeStrategy: l.mergeStrategy,
2637
- activeQueryIndex: l.activeQueryIndex
2638
- }), f = c((a) => a.funnelBindingKey), m = c((a) => a.analysisType), y = c((a) => a.funnelCube), d = c((a) => a.funnelSteps), p = c((a) => a.activeFunnelStepIndex), b = c((a) => a.funnelTimeDimension), w = A(() => m !== "funnel" || !f?.dimension || !b || !d || d.length < 2 ? !1 : d.every((a) => a.filters.length > 0), [m, f, b, d]), x = c((a) => a.charts.funnel?.chartType) || "funnel", v = c((a) => a.charts.funnel?.chartConfig), g = A(() => v || {}, [v]), D = c((a) => a.flowCube), B = c((a) => a.flowBindingKey), _ = c((a) => a.flowTimeDimension), Q = c((a) => a.eventDimension), M = c((a) => a.startingStep), T = c((a) => a.stepsBefore), h = c((a) => a.stepsAfter), F = c((a) => a.joinStrategy), P = c((a) => a.charts.flow?.displayConfig), Y = A(
2639
- () => P || { showLegend: !0, showGrid: !0, showTooltip: !0 },
2640
- [P]
2641
- ), be = c((a) => a.charts.flow?.chartType) || "sankey", se = c((a) => a.buildFunnelQueryFromSteps), G = A(() => m !== "funnel" ? null : se(), [m, se, d]), j = c((a) => a.buildFlowQuery), O = A(() => m !== "flow" ? null : j(), [m, j, D, B, _, Q, M, T, h, be, F]), Z = c((a) => a.retentionCube), ee = c((a) => a.retentionBindingKey), te = c((a) => a.retentionTimeDimension), ne = c((a) => a.retentionDateRange), ae = c((a) => a.retentionCohortFilters), oe = c((a) => a.retentionActivityFilters), le = c((a) => a.retentionBreakdowns), ce = c((a) => a.retentionViewGranularity), de = c((a) => a.retentionPeriods), ue = c((a) => a.retentionType), fe = c((a) => a.buildRetentionQuery), me = c((a) => a.getRetentionValidation), ve = c((a) => a.charts.retention?.displayConfig), De = c((a) => a.setRetentionCube), xe = c((a) => a.setRetentionBindingKey), Te = c((a) => a.setRetentionTimeDimension), k = c((a) => a.setRetentionDateRange), Tt = c((a) => a.setRetentionCohortFilters), Ft = c((a) => a.setRetentionActivityFilters), At = c((a) => a.setRetentionBreakdowns), Fe = c((a) => a.addRetentionBreakdown), Qt = c((a) => a.removeRetentionBreakdown), Mt = c((a) => a.setRetentionViewGranularity), Rt = c((a) => a.setRetentionPeriods), kt = c((a) => a.setRetentionType), Ae = A(() => m !== "retention" ? null : fe(), [
2642
- m,
2643
- fe,
2644
- Z,
2645
- ee,
2646
- te,
2647
- ne,
2648
- le,
2649
- ce,
2650
- de,
2651
- ue,
2652
- ae,
2653
- oe
2654
- ]), It = A(() => m !== "retention" ? null : me(), [
2655
- m,
2656
- me,
2657
- Z,
2658
- ee,
2659
- te,
2660
- ne
2661
- ]), Qe = A(() => m === "retention" ? Ae !== null : m === "flow" ? O !== null : m === "funnel" ? G !== null : l.isValidQuery ?? !1, [m, Ae, O, G, l.isValidQuery]), I = Lr({
2662
- currentQuery: l.currentQuery,
2663
- allQueries: l.allQueries,
2664
- multiQueryConfig: l.multiQueryConfig,
2665
- isMultiQueryMode: l.isMultiQueryMode,
2666
- isValidQuery: Qe,
2667
- initialData: i,
2668
- funnelBindingKey: f,
2669
- isFunnelModeEnabled: w,
2670
- // New: pass analysisType and serverFunnelQuery for explicit mode routing
2671
- analysisType: m,
2672
- serverFunnelQuery: G,
2673
- // Flow mode: pass serverFlowQuery
2674
- serverFlowQuery: O,
2675
- // Retention mode: pass serverRetentionQuery
2676
- serverRetentionQuery: Ae,
2677
- // Retention mode: pass validation for debug panel
2678
- retentionValidation: It
2679
- }), q = Kr({
2680
- externalColorPalette: e,
2681
- combinedMetrics: u.combinedMetrics,
2682
- combinedBreakdowns: u.combinedBreakdowns,
2683
- hasDebounced: I.hasDebounced
2684
- }), N = $r();
2685
- Wr({
2686
- currentQuery: l.currentQuery,
2687
- isValidQuery: l.isValidQuery ?? !1,
2688
- chartType: q.chartType,
2689
- chartConfig: q.chartConfig,
2690
- displayConfig: q.displayConfig,
2691
- onQueryChange: n,
2692
- onChartConfigChange: r
2693
- });
2694
- const qt = c((a) => a.openMetricsModal), Bt = c((a) => a.addMetric), Vt = c((a) => a.removeMetric), Me = c((a) => a.toggleMetric), Nt = c((a) => a.reorderMetrics), Et = c((a) => a.openBreakdownsModal), Pt = c((a) => a.addBreakdown), Ut = c((a) => a.removeBreakdown), Re = c((a) => a.toggleBreakdown), _t = c((a) => a.setBreakdownGranularity), Lt = c((a) => a.toggleBreakdownComparison), Kt = c((a) => a.reorderBreakdowns), $t = c((a) => a.setFilters), Gt = c((a) => a.dropFieldToFilter), Ot = c((a) => a.setOrder), Ht = c((a) => a.clearQuery), jt = c((a) => a.clearCurrentMode), zt = c((a) => a.setFunnelBindingKey), Wt = c((a) => a.setAnalysisType), Jt = c((a) => a.setFunnelCube), Xt = c((a) => a.addFunnelStep), Yt = c((a) => a.removeFunnelStep), Zt = c((a) => a.updateFunnelStep), en = c((a) => a.setActiveFunnelStepIndex), tn = c((a) => a.reorderFunnelSteps), nn = c((a) => a.setFunnelTimeDimension), Xe = c((a) => a.charts.funnel?.displayConfig), rn = A(
2695
- () => Xe || { showLegend: !0, showGrid: !0, showTooltip: !0 },
2696
- [Xe]
2697
- ), sn = c((a) => a.setFunnelDisplayConfig), an = c((a) => a.setFlowCube), on = c((a) => a.setFlowBindingKey), ln = c((a) => a.setFlowTimeDimension), cn = c((a) => a.setEventDimension), dn = c((a) => a.setStartingStepName), un = c((a) => a.setStartingStepFilters), fn = c((a) => a.setStepsBefore), mn = c((a) => a.setStepsAfter), yn = c((a) => a.setJoinStrategy), gn = U(
2698
- (a) => {
2699
- o.setState((V) => ({
2700
- charts: {
2701
- ...V.charts,
2702
- flow: {
2703
- ...V.charts.flow || { chartType: "sankey", chartConfig: {}, displayConfig: {} },
2704
- displayConfig: a
2705
- }
2706
- }
2707
- }));
2708
- },
2709
- [o]
2710
- ), hn = U(
2711
- (a) => {
2712
- o.setState((V) => ({
2713
- charts: {
2714
- ...V.charts,
2715
- retention: {
2716
- ...V.charts.retention || { chartType: "retentionCombined", chartConfig: {}, displayConfig: {} },
2717
- displayConfig: a
2718
- }
2719
- }
2720
- }));
2721
- },
2722
- [o]
2723
- ), re = c((a) => a.aiState), pn = c((a) => a.openAI), ie = c((a) => a.closeAI), Cn = c((a) => a.setAIPrompt), ke = c((a) => a.setAIGenerating), Ie = c((a) => a.setAIError), ye = c((a) => a.setAIHasGeneratedQuery), Ye = c((a) => a.saveAIPreviousState), Ze = c((a) => a.restoreAIPreviousState), qe = Se("idle"), wn = Qe, et = c((a) => a.getValidation), Sn = A(
2724
- () => et(),
2725
- // eslint-disable-next-line react-hooks/exhaustive-deps
2726
- [
2727
- et,
2728
- l.queryStates,
2729
- m,
2730
- // Funnel deps
2731
- d,
2732
- f,
2733
- b,
2734
- // Flow deps
2735
- D,
2736
- B,
2737
- _,
2738
- Q,
2739
- M,
2740
- T,
2741
- h,
2742
- F
2743
- ]
2744
- ), bn = U(
2745
- (a, V, tt, Mn) => {
2746
- N.fieldModalMode === "metrics" && V === "measure" ? Me(a.name) : N.fieldModalMode === "breakdown" && (m === "retention" && V === "dimension" ? Fe({ field: a.name }) : Re(a.name, V === "timeDimension")), Mn || N.closeFieldModal();
2747
- },
2748
- [N, Me, Re, Fe, m]
2749
- ), vn = U(async () => {
2750
- if (s?.aiEndpoint) {
2751
- Ye(), ke(!0), Ie(null);
2752
- try {
2753
- await new Promise((a) => setTimeout(a, 1e3)), ye(!0);
2754
- } catch (a) {
2755
- Ie(a instanceof Error ? a.message : "Failed to generate query");
2756
- } finally {
2757
- ke(!1);
2758
- }
2759
- }
2760
- }, [s?.aiEndpoint, Ye, ke, Ie, ye]), Dn = U(() => {
2761
- ie(), ye(!1);
2762
- }, [ie, ye]), xn = U(() => {
2763
- Ze(), ie();
2764
- }, [Ze, ie]), Tn = U(async () => {
2765
- qe.current = "copied", setTimeout(() => {
2766
- qe.current = "idle";
2767
- }, 2e3);
2768
- }, []), Fn = U(() => {
2769
- const a = o.getState();
2770
- if (a.analysisType === "funnel") {
2771
- const V = a.buildFunnelQueryFromSteps();
2772
- return V || a.buildCurrentQuery();
2773
- }
2774
- return a.queryStates.length > 1 ? {
2775
- queries: a.buildAllQueries(),
2776
- mergeStrategy: a.mergeStrategy,
2777
- mergeKeys: a.getMergeKeys(),
2778
- queryLabels: a.queryStates.map((V, tt) => `Q${tt + 1}`),
2779
- // Include funnel-specific config when in funnel mode
2780
- funnelBindingKey: a.funnelBindingKey,
2781
- stepTimeToConvert: a.stepTimeToConvert
2782
- } : a.buildCurrentQuery();
2783
- }, [o]), An = U(() => {
2784
- const a = o.getState(), V = a.charts[a.analysisType];
2785
- return V ? {
2786
- chartType: V.chartType,
2787
- chartConfig: V.chartConfig,
2788
- displayConfig: V.displayConfig
2789
- } : {
2790
- chartType: q.chartType,
2791
- chartConfig: q.chartConfig,
2792
- displayConfig: q.displayConfig
2793
- };
2794
- }, [o, q.chartType, q.chartConfig, q.displayConfig]), Qn = U(() => o.getState().analysisType, [o]);
2795
- return {
2796
- // Query state (from queryBuilder)
2797
- queryState: l.queryState,
2798
- queryStates: l.queryStates,
2799
- activeQueryIndex: l.activeQueryIndex,
2800
- mergeStrategy: l.mergeStrategy,
2801
- isMultiQueryMode: l.isMultiQueryMode,
2802
- mergeKeys: l.mergeKeys,
2803
- currentQuery: l.currentQuery,
2804
- allQueries: l.allQueries,
2805
- multiQueryConfig: l.multiQueryConfig,
2806
- multiQueryValidation: l.multiQueryValidation,
2807
- // Funnel state (legacy)
2808
- funnelBindingKey: f,
2809
- isFunnelModeEnabled: w,
2810
- // Analysis Type state (new)
2811
- analysisType: m,
2812
- funnelCube: y,
2813
- funnelSteps: d,
2814
- activeFunnelStepIndex: p,
2815
- funnelTimeDimension: b,
2816
- funnelChartType: x,
2817
- funnelChartConfig: g,
2818
- funnelDisplayConfig: rn,
2819
- // Flow state (new)
2820
- flowCube: D,
2821
- flowBindingKey: B,
2822
- flowTimeDimension: _,
2823
- eventDimension: Q,
2824
- startingStep: M,
2825
- stepsBefore: T,
2826
- stepsAfter: h,
2827
- joinStrategy: F,
2828
- flowDisplayConfig: Y,
2829
- // Retention state (simplified Mixpanel-style)
2830
- retentionCube: Z,
2831
- retentionBindingKey: ee,
2832
- retentionTimeDimension: te,
2833
- retentionDateRange: ne,
2834
- retentionCohortFilters: ae,
2835
- retentionActivityFilters: oe,
2836
- retentionBreakdowns: le,
2837
- retentionViewGranularity: ce,
2838
- retentionPeriods: de,
2839
- retentionType: ue,
2840
- retentionDisplayConfig: ve,
2841
- // Data fetching (from queryExecution)
2842
- executionStatus: I.executionStatus,
2843
- executionResults: I.executionResults,
2844
- perQueryResults: I.perQueryResults,
2845
- isLoading: I.isLoading,
2846
- isFetching: I.isFetching,
2847
- error: I.error,
2848
- isValidQuery: Qe,
2849
- debugDataPerQuery: I.debugDataPerQuery,
2850
- needsRefresh: I.needsRefresh,
2851
- warnings: I.warnings,
2852
- funnelExecutedQueries: I.funnelExecutedQueries,
2853
- funnelServerQuery: I.funnelServerQuery,
2854
- funnelDebugData: I.funnelDebugData,
2855
- flowServerQuery: I.flowServerQuery,
2856
- flowDebugData: I.flowDebugData,
2857
- retentionServerQuery: I.retentionServerQuery,
2858
- retentionDebugData: I.retentionDebugData,
2859
- retentionChartData: I.retentionChartData,
2860
- retentionValidation: I.retentionValidation,
2861
- // Chart configuration (from chartDefaults)
2862
- // Note: Funnel chart type is determined by analysisType === 'funnel', not mergeStrategy
2863
- chartType: q.chartType,
2864
- chartConfig: q.chartConfig,
2865
- displayConfig: q.displayConfig,
2866
- colorPalette: q.colorPalette,
2867
- localPaletteName: q.localPaletteName,
2868
- chartAvailability: q.chartAvailability,
2869
- combinedMetrics: u.combinedMetrics,
2870
- combinedBreakdowns: u.combinedBreakdowns,
2871
- effectiveBreakdowns: u.effectiveBreakdowns,
2872
- // UI state (from uiState)
2873
- activeTab: N.activeTab,
2874
- activeView: N.activeView,
2875
- displayLimit: N.displayLimit,
2876
- showFieldModal: N.showFieldModal,
2877
- fieldModalMode: N.fieldModalMode,
2878
- activeTableIndex: N.activeTableIndex,
2879
- userManuallySelectedChart: N.userManuallySelectedChart,
2880
- // AI state
2881
- aiState: {
2882
- isOpen: re.isOpen,
2883
- userPrompt: re.userPrompt,
2884
- isGenerating: re.isGenerating,
2885
- error: re.error,
2886
- hasGeneratedQuery: re.hasGeneratedQuery
2887
- },
2888
- // Share state
2889
- shareButtonState: qe.current,
2890
- canShare: wn,
2891
- // Adapter validation (NEW - Phase 5)
2892
- adapterValidation: Sn,
2893
- // Actions
2894
- actions: {
2895
- // Query state (from queryBuilder)
2896
- setActiveQueryIndex: l.setActiveQueryIndex,
2897
- setMergeStrategy: l.setMergeStrategy,
2898
- // Metrics
2899
- openMetricsModal: qt,
2900
- addMetric: Bt,
2901
- removeMetric: Vt,
2902
- toggleMetric: Me,
2903
- reorderMetrics: Nt,
2904
- // Breakdowns
2905
- openBreakdownsModal: Et,
2906
- addBreakdown: Pt,
2907
- removeBreakdown: Ut,
2908
- toggleBreakdown: Re,
2909
- setBreakdownGranularity: _t,
2910
- toggleBreakdownComparison: Lt,
2911
- reorderBreakdowns: Kt,
2912
- // Filters
2913
- setFilters: $t,
2914
- dropFieldToFilter: Gt,
2915
- setOrder: Ot,
2916
- // Multi-query (from queryBuilder)
2917
- addQuery: l.addQuery,
2918
- removeQuery: l.removeQuery,
2919
- // Funnel (legacy)
2920
- setFunnelBindingKey: zt,
2921
- // Analysis Type (new)
2922
- setAnalysisType: Wt,
2923
- // Funnel Mode (new dedicated state)
2924
- setFunnelCube: Jt,
2925
- addFunnelStep: Xt,
2926
- removeFunnelStep: Yt,
2927
- updateFunnelStep: Zt,
2928
- setActiveFunnelStepIndex: en,
2929
- reorderFunnelSteps: tn,
2930
- setFunnelTimeDimension: nn,
2931
- setFunnelDisplayConfig: sn,
2932
- // Flow Mode actions
2933
- setFlowCube: an,
2934
- setFlowBindingKey: on,
2935
- setFlowTimeDimension: ln,
2936
- setEventDimension: cn,
2937
- setStartingStepName: dn,
2938
- setStartingStepFilters: un,
2939
- setStepsBefore: fn,
2940
- setStepsAfter: mn,
2941
- setJoinStrategy: yn,
2942
- setFlowDisplayConfig: gn,
2943
- // Retention Mode actions (simplified Mixpanel-style)
2944
- setRetentionCube: De,
2945
- setRetentionBindingKey: xe,
2946
- setRetentionTimeDimension: Te,
2947
- setRetentionDateRange: k,
2948
- setRetentionCohortFilters: Tt,
2949
- setRetentionActivityFilters: Ft,
2950
- setRetentionBreakdowns: At,
2951
- addRetentionBreakdown: Fe,
2952
- removeRetentionBreakdown: Qt,
2953
- setRetentionViewGranularity: Mt,
2954
- setRetentionPeriods: Rt,
2955
- setRetentionType: kt,
2956
- setRetentionDisplayConfig: hn,
2957
- // Chart (from chartDefaults)
2958
- setChartType: q.setChartType,
2959
- setChartConfig: q.setChartConfig,
2960
- setDisplayConfig: q.setDisplayConfig,
2961
- setLocalPaletteName: q.setLocalPaletteName,
2962
- // UI (from uiState)
2963
- setActiveTab: N.setActiveTab,
2964
- setActiveView: N.setActiveView,
2965
- setDisplayLimit: N.setDisplayLimit,
2966
- closeFieldModal: N.closeFieldModal,
2967
- setActiveTableIndex: N.setActiveTableIndex,
2968
- // AI
2969
- openAI: pn,
2970
- closeAI: ie,
2971
- setAIPrompt: Cn,
2972
- generateAI: vn,
2973
- acceptAI: Dn,
2974
- cancelAI: xn,
2975
- // Share
2976
- share: Tn,
2977
- // Utility
2978
- clearQuery: Ht,
2979
- clearCurrentMode: jt,
2980
- refetch: I.refetch,
2981
- handleFieldSelected: bn
2982
- },
2983
- // Refs
2984
- getQueryConfig: Fn,
2985
- getChartConfig: An,
2986
- getAnalysisType: Qn
2987
- };
2988
- }
2989
- function Jr(t, i) {
2990
- const e = [];
2991
- if (!i?.cubes)
2992
- return e;
2993
- if (typeof t.dimension == "string") {
2994
- const [n, r] = t.dimension.split("."), s = i.cubes.find((o) => o.name === n);
2995
- s ? s.dimensions?.find((l) => l.name === t.dimension) || e.push({
2996
- type: "binding_key",
2997
- message: `Dimension "${r}" not found in cube "${n}"`
2998
- }) : e.push({
2999
- type: "binding_key",
3000
- message: `Cube "${n}" not found for binding key`
3001
- });
3002
- } else
3003
- for (const n of t.dimension) {
3004
- const r = i.cubes.find((s) => s.name === n.cube);
3005
- r ? r.dimensions?.find((o) => o.name === n.dimension) || e.push({
3006
- type: "cross_cube",
3007
- message: `Dimension "${n.dimension}" not found in cube "${n.cube}"`
3008
- }) : e.push({
3009
- type: "cross_cube",
3010
- message: `Cube "${n.cube}" not found for binding key mapping`
3011
- });
3012
- }
3013
- return e;
3014
- }
3015
- function Xr(t) {
3016
- const i = [];
3017
- for (let e = 0; e < t.length; e++) {
3018
- const n = t[e], r = n.query;
3019
- r.measures && r.measures.length > 0 || r.dimensions && r.dimensions.length > 0 || r.timeDimensions && r.timeDimensions.length > 0 || i.push({
3020
- type: "step_query",
3021
- message: `Step ${e + 1} "${n.name}" has no measures, dimensions, or time dimensions`,
3022
- stepIndex: e
3023
- });
3024
- }
3025
- return i;
3026
- }
3027
- function Yr(t, i) {
3028
- if (typeof t.dimension == "string")
3029
- return !0;
3030
- const e = ht(i);
3031
- return e ? t.dimension.some((n) => n.cube === e) : !1;
3032
- }
3033
- function Zr(t, i) {
3034
- const e = [];
3035
- for (let n = 0; n < i.length; n++) {
3036
- const r = i[n];
3037
- if (!Yr(t, r.query)) {
3038
- const s = ht(r.query) || "unknown";
3039
- e.push({
3040
- type: "cross_cube",
3041
- message: `Step ${n + 1} uses cube "${s}" but no binding key mapping exists for it`,
3042
- stepIndex: n
3043
- });
3044
- }
3045
- }
3046
- return e;
3047
- }
3048
- function ft(t) {
3049
- return t ? /^P(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$/.test(t) ? null : {
3050
- type: "time_window",
3051
- message: `Invalid time window format "${t}". Expected ISO 8601 duration (e.g., P7D, PT1H)`
3052
- } : null;
3053
- }
3054
- function Di(t, i) {
3055
- const e = [], n = [];
3056
- t.steps.length < 2 && e.push({
3057
- type: "general",
3058
- message: "Funnel requires at least 2 steps"
3059
- }), t.bindingKey?.dimension ? (e.push(...Jr(t.bindingKey, i)), e.push(...Zr(t.bindingKey, t.steps))) : e.push({
3060
- type: "binding_key",
3061
- message: "Binding key dimension is required"
3062
- }), e.push(...Xr(t.steps));
3063
- for (let s = 0; s < t.steps.length; s++) {
3064
- const o = t.steps[s], l = ft(o.timeToConvert);
3065
- l && (l.stepIndex = s, e.push(l));
3066
- }
3067
- const r = ft(t.globalTimeWindow);
3068
- return r && e.push(r), t.steps.length > 5 && n.push({
3069
- type: "general",
3070
- message: "Funnels with more than 5 steps may have reduced performance"
3071
- }), {
3072
- isValid: e.length === 0,
3073
- errors: e,
3074
- warnings: n
3075
- };
3076
- }
3077
- function xi(t, i) {
3078
- return i < 2 ? { isValid: !1, message: "Add at least 2 steps for funnel" } : t?.dimension ? typeof t.dimension == "string" && !t.dimension ? { isValid: !1, message: "Select a binding key dimension" } : Array.isArray(t.dimension) && t.dimension.length === 0 ? { isValid: !1, message: "Select a binding key dimension" } : { isValid: !0 } : { isValid: !1, message: "Select a binding key dimension" };
3079
- }
3080
- function Ti(t) {
3081
- if (!t?.cubes) return [];
3082
- const i = [];
3083
- for (const e of t.cubes)
3084
- if (e.dimensions)
3085
- for (const n of e.dimensions)
3086
- (n.type === "string" || n.type === "number") && i.push({
3087
- cube: e.name,
3088
- dimension: n.name,
3089
- label: n.title || n.shortTitle || n.name.split(".")[1] || n.name
3090
- });
3091
- return i;
3092
- }
3093
- function Fi(t) {
3094
- if (!t?.dimension) return "Select binding key...";
3095
- if (typeof t.dimension == "string")
3096
- return t.dimension.split(".")[1] || t.dimension;
3097
- if (t.dimension.length > 0) {
3098
- const i = t.dimension[0];
3099
- return `${i.dimension.split(".")[1] || i.dimension} (${t.dimension.length} cubes)`;
3100
- }
3101
- return "Select binding key...";
3102
- }
3103
- export {
3104
- Zr as A,
3105
- xi as B,
3106
- Ti as C,
3107
- Fi as D,
3108
- di as E,
3109
- Or as F,
3110
- Hr as G,
3111
- ui as H,
3112
- Ir as I,
3113
- yr as a,
3114
- c as b,
3115
- fi as c,
3116
- mi as d,
3117
- yi as e,
3118
- qr as f,
3119
- gi as g,
3120
- hi as h,
3121
- pi as i,
3122
- Br as j,
3123
- Vr as k,
3124
- Nr as l,
3125
- Er as m,
3126
- Ci as n,
3127
- wi as o,
3128
- He as p,
3129
- Gr as q,
3130
- bi as r,
3131
- Je as s,
3132
- zr as t,
3133
- vi as u,
3134
- Pr as v,
3135
- Si as w,
3136
- Di as x,
3137
- Jr as y,
3138
- Xr as z
3139
- };
3140
- //# sourceMappingURL=analysis-builder-shared-CunrT3gi.js.map