drizzle-cube 0.3.13 → 0.3.15

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 (182) hide show
  1. package/dist/adapters/{compiler-DTOU8IsK.js → compiler-DdcGVWIl.js} +7429 -4165
  2. package/dist/adapters/compiler-mAJDpIQx.cjs +214 -0
  3. package/dist/adapters/express/index.cjs +1 -1
  4. package/dist/adapters/express/index.d.ts +1 -1
  5. package/dist/adapters/express/index.js +1 -1
  6. package/dist/adapters/fastify/index.cjs +1 -1
  7. package/dist/adapters/fastify/index.d.ts +1 -1
  8. package/dist/adapters/fastify/index.js +1 -1
  9. package/dist/adapters/hono/index.cjs +1 -1
  10. package/dist/adapters/hono/index.d.ts +1 -1
  11. package/dist/adapters/hono/index.js +1 -1
  12. package/dist/adapters/nextjs/index.cjs +1 -1
  13. package/dist/adapters/nextjs/index.d.ts +1 -1
  14. package/dist/adapters/nextjs/index.js +1 -1
  15. package/dist/adapters/utils.d.ts +29 -0
  16. package/dist/client/adapters/index.d.ts +2 -0
  17. package/dist/client/adapters/retentionModeAdapter.d.ts +3 -0
  18. package/dist/client/charts.js +12 -12
  19. package/dist/client/chunks/RetentionCombinedChart-CqMAkdcR.js +256 -0
  20. package/dist/client/chunks/RetentionCombinedChart-CqMAkdcR.js.map +1 -0
  21. package/dist/client/chunks/RetentionCombinedChart.config-C-ILIaEb.js +47 -0
  22. package/dist/client/chunks/RetentionCombinedChart.config-C-ILIaEb.js.map +1 -0
  23. package/dist/client/chunks/RetentionHeatmap-Bofadstm.js +178 -0
  24. package/dist/client/chunks/RetentionHeatmap-Bofadstm.js.map +1 -0
  25. package/dist/client/chunks/RetentionHeatmap.config-CIvhc-GT.js +28 -0
  26. package/dist/client/chunks/RetentionHeatmap.config-CIvhc-GT.js.map +1 -0
  27. package/dist/client/chunks/analysis-builder-D0MIKiKS.js +6939 -0
  28. package/dist/client/chunks/analysis-builder-D0MIKiKS.js.map +1 -0
  29. package/dist/client/chunks/analysis-builder-shared-gS0TDC6Y.js +2779 -0
  30. package/dist/client/chunks/analysis-builder-shared-gS0TDC6Y.js.map +1 -0
  31. package/dist/client/chunks/{chart-activity-grid-CuPARsr1.js → chart-activity-grid-B37W8fcE.js} +11 -11
  32. package/dist/client/chunks/{chart-activity-grid-CuPARsr1.js.map → chart-activity-grid-B37W8fcE.js.map} +1 -1
  33. package/dist/client/chunks/{chart-area-cPrJnhLj.js → chart-area-DZcxSVB1.js} +2 -2
  34. package/dist/client/chunks/{chart-area-cPrJnhLj.js.map → chart-area-DZcxSVB1.js.map} +1 -1
  35. package/dist/client/chunks/{chart-bar-D68HFPpa.js → chart-bar-BFAdRj-E.js} +2 -2
  36. package/dist/client/chunks/{chart-bar-D68HFPpa.js.map → chart-bar-BFAdRj-E.js.map} +1 -1
  37. package/dist/client/chunks/{chart-bubble-CquyYfNO.js → chart-bubble-eoCCbl3h.js} +2 -2
  38. package/dist/client/chunks/{chart-bubble-CquyYfNO.js.map → chart-bubble-eoCCbl3h.js.map} +1 -1
  39. package/dist/client/chunks/{chart-config-activity-grid-Bkvx0F-G.js → chart-config-activity-grid-BBSNCbkb.js} +2 -2
  40. package/dist/client/chunks/{chart-config-activity-grid-Bkvx0F-G.js.map → chart-config-activity-grid-BBSNCbkb.js.map} +1 -1
  41. package/dist/client/chunks/{chart-config-area-OApsRaYC.js → chart-config-area-CyyJOO2T.js} +2 -2
  42. package/dist/client/chunks/{chart-config-area-OApsRaYC.js.map → chart-config-area-CyyJOO2T.js.map} +1 -1
  43. package/dist/client/chunks/{chart-config-bar-Dy21oaIA.js → chart-config-bar-BJKGnfLt.js} +2 -2
  44. package/dist/client/chunks/{chart-config-bar-Dy21oaIA.js.map → chart-config-bar-BJKGnfLt.js.map} +1 -1
  45. package/dist/client/chunks/{chart-config-bubble-Chv0SoFm.js → chart-config-bubble-CuSsCHZ4.js} +2 -2
  46. package/dist/client/chunks/{chart-config-bubble-Chv0SoFm.js.map → chart-config-bubble-CuSsCHZ4.js.map} +1 -1
  47. package/dist/client/chunks/{chart-config-data-table-DTIdC35a.js → chart-config-data-table-BhgqwoqT.js} +2 -2
  48. package/dist/client/chunks/{chart-config-data-table-DTIdC35a.js.map → chart-config-data-table-BhgqwoqT.js.map} +1 -1
  49. package/dist/client/chunks/{chart-config-funnel-f17Livgr.js → chart-config-funnel-BlSQYng0.js} +4 -4
  50. package/dist/client/chunks/{chart-config-funnel-f17Livgr.js.map → chart-config-funnel-BlSQYng0.js.map} +1 -1
  51. package/dist/client/chunks/{chart-config-heat-map-DPhNICha.js → chart-config-heat-map-DHQGFZhX.js} +2 -2
  52. package/dist/client/chunks/{chart-config-heat-map-DPhNICha.js.map → chart-config-heat-map-DHQGFZhX.js.map} +1 -1
  53. package/dist/client/chunks/{chart-config-kpi-delta-CCl1d-St.js → chart-config-kpi-delta-yTA5ug_l.js} +2 -2
  54. package/dist/client/chunks/{chart-config-kpi-delta-CCl1d-St.js.map → chart-config-kpi-delta-yTA5ug_l.js.map} +1 -1
  55. package/dist/client/chunks/{chart-config-kpi-number-DkE3eSwH.js → chart-config-kpi-number-nVAwDXzq.js} +2 -2
  56. package/dist/client/chunks/{chart-config-kpi-number-DkE3eSwH.js.map → chart-config-kpi-number-nVAwDXzq.js.map} +1 -1
  57. package/dist/client/chunks/{chart-config-kpi-text-BMbgdxZm.js → chart-config-kpi-text-DZjqsx-b.js} +2 -2
  58. package/dist/client/chunks/{chart-config-kpi-text-BMbgdxZm.js.map → chart-config-kpi-text-DZjqsx-b.js.map} +1 -1
  59. package/dist/client/chunks/{chart-config-line-BnLlRUQE.js → chart-config-line-DR0ThxZy.js} +2 -2
  60. package/dist/client/chunks/{chart-config-line-BnLlRUQE.js.map → chart-config-line-DR0ThxZy.js.map} +1 -1
  61. package/dist/client/chunks/{chart-config-markdown-DIaMFC0Z.js → chart-config-markdown-DZxdGNVQ.js} +2 -2
  62. package/dist/client/chunks/{chart-config-markdown-DIaMFC0Z.js.map → chart-config-markdown-DZxdGNVQ.js.map} +1 -1
  63. package/dist/client/chunks/{chart-config-pie-O9y_T0BQ.js → chart-config-pie-BM5lgH-w.js} +2 -2
  64. package/dist/client/chunks/{chart-config-pie-O9y_T0BQ.js.map → chart-config-pie-BM5lgH-w.js.map} +1 -1
  65. package/dist/client/chunks/{chart-config-radar-CXa0354h.js → chart-config-radar-BBAVIF0S.js} +2 -2
  66. package/dist/client/chunks/{chart-config-radar-CXa0354h.js.map → chart-config-radar-BBAVIF0S.js.map} +1 -1
  67. package/dist/client/chunks/{chart-config-radial-bar-BppJU8-Q.js → chart-config-radial-bar-CTwjDRnB.js} +2 -2
  68. package/dist/client/chunks/{chart-config-radial-bar-BppJU8-Q.js.map → chart-config-radial-bar-CTwjDRnB.js.map} +1 -1
  69. package/dist/client/chunks/{chart-config-sankey-BfBHgL4x.js → chart-config-sankey-CNAgsMQ4.js} +2 -2
  70. package/dist/client/chunks/{chart-config-sankey-BfBHgL4x.js.map → chart-config-sankey-CNAgsMQ4.js.map} +1 -1
  71. package/dist/client/chunks/{chart-config-scatter-BTt8a10R.js → chart-config-scatter-CWvN2E-X.js} +2 -2
  72. package/dist/client/chunks/{chart-config-scatter-BTt8a10R.js.map → chart-config-scatter-CWvN2E-X.js.map} +1 -1
  73. package/dist/client/chunks/{chart-config-sunburst-DNmQpIIx.js → chart-config-sunburst-W_SKwaj0.js} +4 -4
  74. package/dist/client/chunks/{chart-config-sunburst-DNmQpIIx.js.map → chart-config-sunburst-W_SKwaj0.js.map} +1 -1
  75. package/dist/client/chunks/{chart-config-tree-map-HVgG4oa0.js → chart-config-tree-map-CLmRvvMR.js} +2 -2
  76. package/dist/client/chunks/{chart-config-tree-map-HVgG4oa0.js.map → chart-config-tree-map-CLmRvvMR.js.map} +1 -1
  77. package/dist/client/chunks/{chart-data-table-D4WDqbM0.js → chart-data-table-kudRwZxJ.js} +4 -4
  78. package/dist/client/chunks/{chart-data-table-D4WDqbM0.js.map → chart-data-table-kudRwZxJ.js.map} +1 -1
  79. package/dist/client/chunks/{chart-funnel-Csdn4FbN.js → chart-funnel-CA0XJkfh.js} +2 -2
  80. package/dist/client/chunks/{chart-funnel-Csdn4FbN.js.map → chart-funnel-CA0XJkfh.js.map} +1 -1
  81. package/dist/client/chunks/{chart-heat-map-v1afxnjq.js → chart-heat-map-DUy9_pWM.js} +2 -2
  82. package/dist/client/chunks/{chart-heat-map-v1afxnjq.js.map → chart-heat-map-DUy9_pWM.js.map} +1 -1
  83. package/dist/client/chunks/chart-kpi-delta-MIGGCpkG.js +351 -0
  84. package/dist/client/chunks/chart-kpi-delta-MIGGCpkG.js.map +1 -0
  85. package/dist/client/chunks/chart-kpi-number-DM0Brd91.js +473 -0
  86. package/dist/client/chunks/chart-kpi-number-DM0Brd91.js.map +1 -0
  87. package/dist/client/chunks/{chart-kpi-text-CRp8QWYG.js → chart-kpi-text-BAb28V4X.js} +3 -3
  88. package/dist/client/chunks/{chart-kpi-text-CRp8QWYG.js.map → chart-kpi-text-BAb28V4X.js.map} +1 -1
  89. package/dist/client/chunks/{chart-line-DqqE7ky9.js → chart-line-e3h8sa1R.js} +5 -5
  90. package/dist/client/chunks/{chart-line-DqqE7ky9.js.map → chart-line-e3h8sa1R.js.map} +1 -1
  91. package/dist/client/chunks/{chart-pie-B5WBzIRH.js → chart-pie-CFoHYqDB.js} +2 -2
  92. package/dist/client/chunks/{chart-pie-B5WBzIRH.js.map → chart-pie-CFoHYqDB.js.map} +1 -1
  93. package/dist/client/chunks/{chart-radar-DL_dvhA-.js → chart-radar-CPPwkfxj.js} +2 -2
  94. package/dist/client/chunks/{chart-radar-DL_dvhA-.js.map → chart-radar-CPPwkfxj.js.map} +1 -1
  95. package/dist/client/chunks/{chart-radial-bar-DDRo6nz-.js → chart-radial-bar-BdEOM-P1.js} +2 -2
  96. package/dist/client/chunks/{chart-radial-bar-DDRo6nz-.js.map → chart-radial-bar-BdEOM-P1.js.map} +1 -1
  97. package/dist/client/chunks/{chart-sankey-C_bgIfg-.js → chart-sankey-Bbady-8g.js} +2 -2
  98. package/dist/client/chunks/{chart-sankey-C_bgIfg-.js.map → chart-sankey-Bbady-8g.js.map} +1 -1
  99. package/dist/client/chunks/{chart-scatter-DjmJRlK0.js → chart-scatter-JFu0Pv3a.js} +15 -15
  100. package/dist/client/chunks/{chart-scatter-DjmJRlK0.js.map → chart-scatter-JFu0Pv3a.js.map} +1 -1
  101. package/dist/client/chunks/{chart-sunburst-CbMEnaes.js → chart-sunburst-sayxze15.js} +2 -2
  102. package/dist/client/chunks/{chart-sunburst-CbMEnaes.js.map → chart-sunburst-sayxze15.js.map} +1 -1
  103. package/dist/client/chunks/{chart-tree-map-DEfJtJVC.js → chart-tree-map-Ks2xev8b.js} +30 -30
  104. package/dist/client/chunks/{chart-tree-map-DEfJtJVC.js.map → chart-tree-map-Ks2xev8b.js.map} +1 -1
  105. package/dist/client/chunks/chartConfigRegistry-BumUIPw4.js +44 -0
  106. package/dist/client/chunks/{chartConfigRegistry-CiOq-PqX.js.map → chartConfigRegistry-BumUIPw4.js.map} +1 -1
  107. package/dist/client/chunks/charts-_yZ9gBJU.js +230 -0
  108. package/dist/client/chunks/charts-_yZ9gBJU.js.map +1 -0
  109. package/dist/client/chunks/{charts-core-CXrhEEVF.js → charts-core-Bzu9PzMd.js} +10 -10
  110. package/dist/client/chunks/{charts-core-CXrhEEVF.js.map → charts-core-Bzu9PzMd.js.map} +1 -1
  111. package/dist/client/chunks/{charts-loader-BtsnUO4Q.js → charts-loader-cMtx4zHx.js} +30 -28
  112. package/dist/client/chunks/charts-loader-cMtx4zHx.js.map +1 -0
  113. package/dist/client/chunks/{components-BDrlf9Er.js → components-DQuPThfA.js} +3575 -3208
  114. package/dist/client/chunks/components-DQuPThfA.js.map +1 -0
  115. package/dist/client/chunks/{core-B8zw0qRf.js → core-DwOXVb87.js} +2 -2
  116. package/dist/client/chunks/{core-B8zw0qRf.js.map → core-DwOXVb87.js.map} +1 -1
  117. package/dist/client/chunks/hooks-DPRv1Xhb.js +150 -0
  118. package/dist/client/chunks/{hooks-B8Zw5PfL.js.map → hooks-DPRv1Xhb.js.map} +1 -1
  119. package/dist/client/chunks/{icons-NzFHtqeM.js → icons-DRreo6m8.js} +128 -112
  120. package/dist/client/chunks/{icons-NzFHtqeM.js.map → icons-DRreo6m8.js.map} +1 -1
  121. package/dist/client/chunks/{providers-CqCiJTEj.js → providers-BW8D7Wso.js} +2 -2
  122. package/dist/client/chunks/{providers-CqCiJTEj.js.map → providers-BW8D7Wso.js.map} +1 -1
  123. package/dist/client/chunks/retention-CzCo8262.js +120 -0
  124. package/dist/client/chunks/retention-CzCo8262.js.map +1 -0
  125. package/dist/client/chunks/{useDirtyStateTracking-C_mitVwh.js → useDirtyStateTracking-Yu_qQXb-.js} +101 -99
  126. package/dist/client/chunks/useDirtyStateTracking-Yu_qQXb-.js.map +1 -0
  127. package/dist/client/chunks/{vendor-DzzxS7Ay.js → vendor-BSkQZgtm.js} +548 -540
  128. package/dist/client/chunks/vendor-BSkQZgtm.js.map +1 -0
  129. package/dist/client/components/AnalysisBuilder/AnalysisTypeSelector.d.ts +3 -1
  130. package/dist/client/components/AnalysisBuilder/RetentionConfigPanel.d.ts +36 -0
  131. package/dist/client/components/AnalysisBuilder/RetentionModeContent.d.ts +71 -0
  132. package/dist/client/components/AnalysisBuilder/types.d.ts +99 -0
  133. package/dist/client/components/DebugModal.d.ts +2 -1
  134. package/dist/client/components/charts/RetentionCombinedChart.config.d.ts +2 -0
  135. package/dist/client/components/charts/RetentionCombinedChart.d.ts +14 -0
  136. package/dist/client/components/charts/RetentionHeatmap.config.d.ts +2 -0
  137. package/dist/client/components/charts/RetentionHeatmap.d.ts +7 -0
  138. package/dist/client/components.js +2 -2
  139. package/dist/client/hooks/queries/index.d.ts +2 -1
  140. package/dist/client/hooks/queries/useDryRunQuery.d.ts +26 -0
  141. package/dist/client/hooks/queries/useExplainQuery.d.ts +3 -1
  142. package/dist/client/hooks/queries/useFlowQuery.d.ts +5 -0
  143. package/dist/client/hooks/queries/useRetentionQuery.d.ts +67 -0
  144. package/dist/client/hooks/useAnalysisBuilderHook.d.ts +61 -0
  145. package/dist/client/hooks/useAnalysisQueryExecution.d.ts +42 -1
  146. package/dist/client/hooks.js +3 -3
  147. package/dist/client/icons/customIcons.d.ts +7 -0
  148. package/dist/client/icons/types.d.ts +1 -0
  149. package/dist/client/icons.js +1 -1
  150. package/dist/client/index.js +11 -11
  151. package/dist/client/providers.js +1 -1
  152. package/dist/client/stores/analysisBuilderStore.d.ts +86 -1
  153. package/dist/client/stores/dashboardStore.d.ts +2 -1
  154. package/dist/client/stores/slices/index.d.ts +2 -0
  155. package/dist/client/stores/slices/retentionSlice.d.ts +66 -0
  156. package/dist/client/styles.css +1 -1
  157. package/dist/client/types/analysisConfig.d.ts +29 -4
  158. package/dist/client/types/funnel.d.ts +5 -0
  159. package/dist/client/types/retention.d.ts +301 -0
  160. package/dist/client/types.d.ts +6 -3
  161. package/dist/client-bundle-stats.html +1 -1
  162. package/dist/server/index.cjs +76 -54
  163. package/dist/server/index.d.ts +217 -0
  164. package/dist/server/index.js +7363 -4152
  165. package/package.json +5 -2
  166. package/dist/adapters/compiler-CO13DaEb.cjs +0 -192
  167. package/dist/client/chunks/analysis-builder-Dc9NrG_N.js +0 -6013
  168. package/dist/client/chunks/analysis-builder-Dc9NrG_N.js.map +0 -1
  169. package/dist/client/chunks/analysis-builder-shared-B3-UWqQ2.js +0 -2540
  170. package/dist/client/chunks/analysis-builder-shared-B3-UWqQ2.js.map +0 -1
  171. package/dist/client/chunks/chart-kpi-delta-Bs5R5xr4.js +0 -435
  172. package/dist/client/chunks/chart-kpi-delta-Bs5R5xr4.js.map +0 -1
  173. package/dist/client/chunks/chart-kpi-number-Cf4Pgkm9.js +0 -392
  174. package/dist/client/chunks/chart-kpi-number-Cf4Pgkm9.js.map +0 -1
  175. package/dist/client/chunks/chartConfigRegistry-CiOq-PqX.js +0 -44
  176. package/dist/client/chunks/charts-loader-BtsnUO4Q.js.map +0 -1
  177. package/dist/client/chunks/charts-xNubY0vm.js +0 -226
  178. package/dist/client/chunks/charts-xNubY0vm.js.map +0 -1
  179. package/dist/client/chunks/components-BDrlf9Er.js.map +0 -1
  180. package/dist/client/chunks/hooks-B8Zw5PfL.js +0 -123
  181. package/dist/client/chunks/useDirtyStateTracking-C_mitVwh.js.map +0 -1
  182. package/dist/client/chunks/vendor-DzzxS7Ay.js.map +0 -1
@@ -0,0 +1,2779 @@
1
+ import { useContext as it, createContext as vn, useRef as me, useMemo as F, useCallback as E, useEffect as fe, useState as bn } from "react";
2
+ import { u as Dn, f as Tn } from "./providers-BW8D7Wso.js";
3
+ import { jsx as Fn } from "react/jsx-runtime";
4
+ import { c as Qn, d as Ge, e as Oe, s as He, p as An, f as Rn, l as rt } from "./vendor-BSkQZgtm.js";
5
+ import { d as Mn, R as xn, a as qn, g as kn, D as Bn } from "./retention-CzCo8262.js";
6
+ import { H as K, I as ye, J as O, K as H, L as j, N as In, O as st, u as Vn, f as En, R as Un, S as Pn } from "./components-DQuPThfA.js";
7
+ import { F as je, b as We } from "./flow-utils-CjQZG5qq.js";
8
+ import { h as _n, u as Kn, a as Ln } from "./useDirtyStateTracking-Yu_qQXb-.js";
9
+ import { c as $n, a as at } from "./funnel-utils-CyonoNeC.js";
10
+ import { b as Nn, c as Gn, d as On, e as Hn } from "./hooks-DPRv1Xhb.js";
11
+ function jn(n) {
12
+ const r = /* @__PURE__ */ new Date(), e = n.toLowerCase().trim(), t = r.getUTCFullYear(), i = r.getUTCMonth(), s = r.getUTCDate(), o = r.getUTCDay();
13
+ if (e === "today") {
14
+ const g = new Date(r);
15
+ g.setUTCHours(0, 0, 0, 0);
16
+ const c = new Date(r);
17
+ return c.setUTCHours(23, 59, 59, 999), { start: g, end: c };
18
+ }
19
+ if (e === "yesterday") {
20
+ const g = new Date(r);
21
+ g.setUTCDate(s - 1), g.setUTCHours(0, 0, 0, 0);
22
+ const c = new Date(r);
23
+ return c.setUTCDate(s - 1), c.setUTCHours(23, 59, 59, 999), { start: g, end: c };
24
+ }
25
+ if (e === "this week") {
26
+ const g = o === 0 ? -6 : 1 - o, c = new Date(r);
27
+ c.setUTCDate(s + g), c.setUTCHours(0, 0, 0, 0);
28
+ const p = new Date(c);
29
+ return p.setUTCDate(c.getUTCDate() + 6), p.setUTCHours(23, 59, 59, 999), { start: c, end: p };
30
+ }
31
+ if (e === "this month") {
32
+ const g = new Date(Date.UTC(t, i, 1, 0, 0, 0, 0)), c = new Date(Date.UTC(t, i + 1, 0, 23, 59, 59, 999));
33
+ return { start: g, end: c };
34
+ }
35
+ if (e === "this quarter") {
36
+ const g = Math.floor(i / 3), c = new Date(Date.UTC(t, g * 3, 1, 0, 0, 0, 0)), p = new Date(Date.UTC(t, g * 3 + 3, 0, 23, 59, 59, 999));
37
+ return { start: c, end: p };
38
+ }
39
+ if (e === "this year") {
40
+ const g = new Date(Date.UTC(t, 0, 1, 0, 0, 0, 0)), c = new Date(Date.UTC(t, 11, 31, 23, 59, 59, 999));
41
+ return { start: g, end: c };
42
+ }
43
+ const l = e.match(/^last\s+(\d+)\s+days?$/);
44
+ if (l) {
45
+ const g = parseInt(l[1], 10), c = new Date(r);
46
+ c.setUTCDate(s - g + 1), c.setUTCHours(0, 0, 0, 0);
47
+ const p = new Date(r);
48
+ return p.setUTCHours(23, 59, 59, 999), { start: c, end: p };
49
+ }
50
+ const d = e.match(/^last\s+(\d+)\s+weeks?$/);
51
+ if (d) {
52
+ const c = parseInt(d[1], 10) * 7, p = new Date(r);
53
+ p.setUTCDate(s - c + 1), p.setUTCHours(0, 0, 0, 0);
54
+ const S = new Date(r);
55
+ return S.setUTCHours(23, 59, 59, 999), { start: p, end: S };
56
+ }
57
+ if (e === "last week") {
58
+ const g = o === 0 ? -13 : -6 - o, c = new Date(r);
59
+ c.setUTCDate(s + g), c.setUTCHours(0, 0, 0, 0);
60
+ const p = new Date(c);
61
+ return p.setUTCDate(c.getUTCDate() + 6), p.setUTCHours(23, 59, 59, 999), { start: c, end: p };
62
+ }
63
+ if (e === "last month") {
64
+ const g = new Date(Date.UTC(t, i - 1, 1, 0, 0, 0, 0)), c = new Date(Date.UTC(t, i, 0, 23, 59, 59, 999));
65
+ return { start: g, end: c };
66
+ }
67
+ if (e === "last quarter") {
68
+ const g = Math.floor(i / 3), c = g === 0 ? 3 : g - 1, p = g === 0 ? t - 1 : t, S = new Date(Date.UTC(p, c * 3, 1, 0, 0, 0, 0)), C = new Date(Date.UTC(p, c * 3 + 3, 0, 23, 59, 59, 999));
69
+ return { start: S, end: C };
70
+ }
71
+ if (e === "last year") {
72
+ const g = new Date(Date.UTC(t - 1, 0, 1, 0, 0, 0, 0)), c = new Date(Date.UTC(t - 1, 11, 31, 23, 59, 59, 999));
73
+ return { start: g, end: c };
74
+ }
75
+ if (e === "last 12 months") {
76
+ const g = new Date(Date.UTC(t, i - 11, 1, 0, 0, 0, 0)), c = new Date(r);
77
+ return c.setUTCHours(23, 59, 59, 999), { start: g, end: c };
78
+ }
79
+ const f = e.match(/^last\s+(\d+)\s+months?$/);
80
+ if (f) {
81
+ const g = parseInt(f[1], 10), c = new Date(Date.UTC(t, i - g + 1, 1, 0, 0, 0, 0)), p = new Date(r);
82
+ return p.setUTCHours(23, 59, 59, 999), { start: c, end: p };
83
+ }
84
+ const y = e.match(/^last\s+(\d+)\s+years?$/);
85
+ if (y) {
86
+ const g = parseInt(y[1], 10), c = new Date(Date.UTC(t - g, 0, 1, 0, 0, 0, 0)), p = new Date(r);
87
+ return p.setUTCHours(23, 59, 59, 999), { start: c, end: p };
88
+ }
89
+ return null;
90
+ }
91
+ function Wn(n) {
92
+ if (Array.isArray(n)) {
93
+ if (n.length < 2) return null;
94
+ const r = new Date(n[0]), e = new Date(n[1]);
95
+ return isNaN(r.getTime()) || isNaN(e.getTime()) ? null : (e.setUTCHours(23, 59, 59, 999), { start: r, end: e });
96
+ }
97
+ return jn(n);
98
+ }
99
+ function de(n) {
100
+ return n.toISOString().split("T")[0];
101
+ }
102
+ function zn(n, r) {
103
+ const e = r.getTime() - n.getTime(), t = Math.ceil(e / (1e3 * 60 * 60 * 24)), i = new Date(n);
104
+ i.setUTCDate(i.getUTCDate() - 1), i.setUTCHours(23, 59, 59, 999);
105
+ const s = new Date(i);
106
+ return s.setUTCDate(s.getUTCDate() - t + 1), s.setUTCHours(0, 0, 0, 0), { start: s, end: i };
107
+ }
108
+ function ot(n, r) {
109
+ for (const e of n)
110
+ if ("type" in e && "filters" in e) {
111
+ const i = ot(e.filters, r);
112
+ if (i) return i;
113
+ } else if ("member" in e) {
114
+ const t = e;
115
+ if (t.member === r && t.operator === "inDateRange" && t.dateRange)
116
+ return { dateRange: t.dateRange };
117
+ }
118
+ }
119
+ function lt(n, r) {
120
+ const e = ot(r, n);
121
+ if (!e?.dateRange) return;
122
+ const t = Wn(e.dateRange);
123
+ if (!t) return;
124
+ const i = zn(t.start, t.end);
125
+ return [
126
+ [de(t.start), de(t.end)],
127
+ [de(i.start), de(i.end)]
128
+ ];
129
+ }
130
+ function ut(n, r) {
131
+ return n.reduce((e, t) => {
132
+ if ("type" in t && "filters" in t) {
133
+ const i = t, s = ut(i.filters, r);
134
+ s.length > 0 && e.push({ type: i.type, filters: s });
135
+ } else if ("member" in t) {
136
+ const i = t;
137
+ i.member === r && i.operator === "inDateRange" || e.push(t);
138
+ } else
139
+ e.push(t);
140
+ return e;
141
+ }, []);
142
+ }
143
+ function ge(n, r, e, t, i = !1) {
144
+ const s = r.filter((d) => d.isTimeDimension && d.enableComparison).map((d) => d.field);
145
+ let o = e;
146
+ if (!i)
147
+ for (const d of s)
148
+ o = ut(o, d);
149
+ const l = {
150
+ measures: n.map((d) => d.field),
151
+ dimensions: r.filter((d) => !d.isTimeDimension).map((d) => d.field),
152
+ timeDimensions: r.filter((d) => d.isTimeDimension).map((d) => {
153
+ const f = {
154
+ dimension: d.field,
155
+ granularity: d.granularity || "day"
156
+ };
157
+ if (d.enableComparison) {
158
+ const y = lt(d.field, e);
159
+ y && (f.compareDateRange = y);
160
+ }
161
+ return f;
162
+ }),
163
+ filters: o.length > 0 ? o : void 0,
164
+ order: t && Object.keys(t).length > 0 ? t : void 0
165
+ };
166
+ return l.measures?.length === 0 && delete l.measures, l.dimensions?.length === 0 && delete l.dimensions, l.timeDimensions?.length === 0 && delete l.timeDimensions, l;
167
+ }
168
+ const Jn = "drizzle-cube-analysis-builder-v3";
169
+ function Q() {
170
+ return {
171
+ metrics: [],
172
+ breakdowns: [],
173
+ filters: [],
174
+ order: void 0,
175
+ validationStatus: "idle",
176
+ validationError: null
177
+ };
178
+ }
179
+ function ze() {
180
+ return {
181
+ metrics: [],
182
+ breakdowns: [],
183
+ filters: [],
184
+ order: void 0,
185
+ validationStatus: "idle",
186
+ validationError: null
187
+ };
188
+ }
189
+ function Yn(n) {
190
+ return n.map((r) => r.field);
191
+ }
192
+ function Xn(n, r) {
193
+ const e = [], t = [];
194
+ for (const i of n)
195
+ if (i.isTimeDimension) {
196
+ const s = {
197
+ dimension: i.field,
198
+ granularity: i.granularity || "day"
199
+ };
200
+ if (i.enableComparison) {
201
+ const o = lt(i.field, r);
202
+ o && (s.compareDateRange = o);
203
+ }
204
+ t.push(s);
205
+ } else
206
+ e.push(i.field);
207
+ return { dimensions: e, timeDimensions: t };
208
+ }
209
+ function Zn(n) {
210
+ const { dimensions: r, timeDimensions: e } = Xn(
211
+ n.breakdowns,
212
+ n.filters
213
+ ), t = {
214
+ measures: Yn(n.metrics),
215
+ dimensions: r
216
+ };
217
+ return e.length > 0 && (t.timeDimensions = e), n.filters.length > 0 && (t.filters = n.filters), n.order && Object.keys(n.order).length > 0 && (t.order = n.order), t;
218
+ }
219
+ function ei(n) {
220
+ return n.map((r, e) => ({
221
+ id: K(),
222
+ field: r,
223
+ label: ye(e)
224
+ }));
225
+ }
226
+ function ti(n) {
227
+ const r = [];
228
+ if (n.dimensions)
229
+ for (const e of n.dimensions)
230
+ r.push({
231
+ id: K(),
232
+ field: e,
233
+ isTimeDimension: !1
234
+ });
235
+ if (n.timeDimensions)
236
+ for (const e of n.timeDimensions) {
237
+ const t = !!(e.compareDateRange && e.compareDateRange.length > 0);
238
+ r.push({
239
+ id: K(),
240
+ field: e.dimension,
241
+ granularity: e.granularity,
242
+ isTimeDimension: !0,
243
+ enableComparison: t
244
+ });
245
+ }
246
+ return r;
247
+ }
248
+ function Je(n) {
249
+ return {
250
+ metrics: ei(n.measures || []),
251
+ breakdowns: ti(n),
252
+ filters: n.filters || [],
253
+ order: n.order,
254
+ validationStatus: "idle",
255
+ validationError: null
256
+ };
257
+ }
258
+ function ni(n) {
259
+ return typeof n == "object" && n !== null && "queries" in n && Array.isArray(n.queries);
260
+ }
261
+ const _ = {
262
+ type: "query",
263
+ createInitial() {
264
+ return {
265
+ queryStates: [ze()],
266
+ activeQueryIndex: 0,
267
+ mergeStrategy: "concat"
268
+ };
269
+ },
270
+ extractState(n) {
271
+ return {
272
+ queryStates: n.queryStates,
273
+ activeQueryIndex: n.activeQueryIndex,
274
+ mergeStrategy: n.mergeStrategy
275
+ };
276
+ },
277
+ canLoad(n) {
278
+ if (!n || typeof n != "object") return !1;
279
+ const r = n;
280
+ return !(r.version !== 1 || r.analysisType !== "query" || !r.query || typeof r.query != "object");
281
+ },
282
+ load(n) {
283
+ if (n.analysisType !== "query")
284
+ throw new Error(
285
+ `Cannot load ${n.analysisType} config with query adapter`
286
+ );
287
+ const r = n;
288
+ if (ni(r.query)) {
289
+ const e = r.query, t = e.queries.map(Je);
290
+ return t.length === 0 && t.push(ze()), {
291
+ queryStates: t,
292
+ activeQueryIndex: 0,
293
+ mergeStrategy: e.mergeStrategy || "concat"
294
+ };
295
+ }
296
+ return {
297
+ queryStates: [Je(r.query)],
298
+ activeQueryIndex: 0,
299
+ mergeStrategy: "concat"
300
+ };
301
+ },
302
+ save(n, r, e) {
303
+ const t = n.queryStates.map(Zn), s = t.length === 1 && n.mergeStrategy === "concat" ? t[0] : {
304
+ queries: t,
305
+ mergeStrategy: n.mergeStrategy
306
+ };
307
+ return {
308
+ version: 1,
309
+ analysisType: "query",
310
+ activeView: e,
311
+ charts: {
312
+ query: r.query || this.getDefaultChartConfig()
313
+ },
314
+ query: s
315
+ };
316
+ },
317
+ validate(n) {
318
+ const r = [], e = [];
319
+ if (n.queryStates.some((i) => i.metrics.length > 0) || r.push("At least one metric is required"), n.queryStates.forEach((i, s) => {
320
+ const o = n.queryStates.length > 1 ? `Query ${s + 1}: ` : "";
321
+ i.metrics.length === 0 && i.breakdowns.length === 0 && e.push(`${o}Query is empty`);
322
+ }), n.queryStates.length > 1 && n.mergeStrategy === "merge") {
323
+ const i = n.queryStates[0].breakdowns.map(
324
+ (o) => o.field
325
+ );
326
+ n.queryStates.every((o) => {
327
+ const l = o.breakdowns.map((d) => d.field);
328
+ return l.length === i.length && l.every((d) => i.includes(d));
329
+ }) || e.push(
330
+ "Queries have different breakdowns - merge results may be unexpected"
331
+ );
332
+ }
333
+ return {
334
+ isValid: r.length === 0,
335
+ errors: r,
336
+ warnings: e
337
+ };
338
+ },
339
+ clear(n) {
340
+ return this.createInitial();
341
+ },
342
+ getDefaultChartConfig() {
343
+ return {
344
+ chartType: "bar",
345
+ chartConfig: {},
346
+ displayConfig: { showLegend: !0, showGrid: !0, showTooltip: !0 }
347
+ };
348
+ }
349
+ }, V = /* @__PURE__ */ new Map();
350
+ let xe = !1;
351
+ function Re() {
352
+ xe || (V.has("query") || V.set("query", _), V.has("funnel") || V.set("funnel", O), V.has("flow") || V.set("flow", H), V.has("retention") || V.set("retention", j), xe = !0);
353
+ }
354
+ const P = {
355
+ /**
356
+ * Register an adapter for a specific analysis type.
357
+ * Should be called once at app initialization.
358
+ *
359
+ * @param adapter - The adapter to register
360
+ */
361
+ register(n) {
362
+ V.has(n.type) && console.warn(
363
+ `[adapterRegistry] Overwriting existing adapter for type: ${n.type}`
364
+ ), V.set(n.type, n);
365
+ },
366
+ /**
367
+ * Get the adapter for a specific analysis type.
368
+ * Built-in adapters (query, funnel) are initialized automatically.
369
+ *
370
+ * @param type - The analysis type to get adapter for
371
+ * @returns The registered adapter
372
+ * @throws Error if no adapter is registered for the type
373
+ */
374
+ get(n) {
375
+ Re();
376
+ const r = V.get(n);
377
+ if (!r)
378
+ throw new Error(
379
+ `[adapterRegistry] No adapter registered for type: ${n}. Available types: ${Array.from(V.keys()).join(", ") || "none"}`
380
+ );
381
+ return r;
382
+ },
383
+ /**
384
+ * Check if an adapter is registered for a specific type.
385
+ * Built-in adapters (query, funnel) are initialized automatically.
386
+ *
387
+ * @param type - The analysis type to check
388
+ * @returns True if an adapter is registered
389
+ */
390
+ has(n) {
391
+ return Re(), V.has(n);
392
+ },
393
+ /**
394
+ * Get all registered analysis types.
395
+ * Built-in adapters (query, funnel) are initialized automatically.
396
+ *
397
+ * @returns Array of registered types
398
+ */
399
+ getRegisteredTypes() {
400
+ return Re(), Array.from(V.keys());
401
+ },
402
+ /**
403
+ * Clear all registered adapters.
404
+ * Primarily useful for testing.
405
+ * Note: Built-in adapters will be re-initialized on next access.
406
+ */
407
+ clear() {
408
+ V.clear(), xe = !1;
409
+ }
410
+ }, ct = () => ({
411
+ analysisType: "query",
412
+ // Use adapter defaults as single source of truth for chart configuration
413
+ charts: {
414
+ query: _.getDefaultChartConfig(),
415
+ funnel: O.getDefaultChartConfig(),
416
+ flow: H.getDefaultChartConfig(),
417
+ retention: j.getDefaultChartConfig()
418
+ },
419
+ // Per-mode active view preference
420
+ activeViews: {
421
+ query: "chart",
422
+ funnel: "chart",
423
+ flow: "chart",
424
+ retention: "chart"
425
+ },
426
+ userManuallySelectedChart: !1,
427
+ localPaletteName: "default"
428
+ }), ii = (n, r) => ({
429
+ ...ct(),
430
+ setAnalysisType: (e) => {
431
+ n((t) => {
432
+ const i = { ...t.charts };
433
+ if (!i[e]) {
434
+ const o = P.get(e);
435
+ i[e] = o.getDefaultChartConfig();
436
+ }
437
+ const s = { ...t.activeViews };
438
+ return s[e] || (s[e] = "chart"), {
439
+ analysisType: e,
440
+ charts: i,
441
+ activeViews: s,
442
+ activeView: s[e] ?? "chart"
443
+ };
444
+ });
445
+ },
446
+ setChartType: (e) => {
447
+ n((t) => {
448
+ const i = t.analysisType, s = t.charts[i] || {
449
+ chartType: e,
450
+ chartConfig: {},
451
+ displayConfig: {}
452
+ };
453
+ return {
454
+ charts: {
455
+ ...t.charts,
456
+ [i]: { ...s, chartType: e }
457
+ }
458
+ };
459
+ });
460
+ },
461
+ setChartTypeManual: (e) => {
462
+ n((t) => {
463
+ const i = t.analysisType, s = t.charts[i] || {
464
+ chartType: e,
465
+ chartConfig: {},
466
+ displayConfig: {}
467
+ };
468
+ return {
469
+ charts: {
470
+ ...t.charts,
471
+ [i]: { ...s, chartType: e }
472
+ },
473
+ userManuallySelectedChart: !0,
474
+ activeView: "chart",
475
+ activeViews: {
476
+ ...t.activeViews,
477
+ [i]: "chart"
478
+ }
479
+ };
480
+ });
481
+ },
482
+ setChartConfig: (e) => {
483
+ n((t) => {
484
+ const i = t.analysisType, s = t.charts[i] || {
485
+ chartType: "bar",
486
+ chartConfig: e,
487
+ displayConfig: {}
488
+ };
489
+ return {
490
+ charts: {
491
+ ...t.charts,
492
+ [i]: { ...s, chartConfig: e }
493
+ },
494
+ activeView: "chart",
495
+ activeViews: {
496
+ ...t.activeViews,
497
+ [i]: "chart"
498
+ }
499
+ };
500
+ });
501
+ },
502
+ setDisplayConfig: (e) => {
503
+ n((t) => {
504
+ const i = t.analysisType, s = t.charts[i] || {
505
+ chartType: "bar",
506
+ chartConfig: {},
507
+ displayConfig: e
508
+ };
509
+ return {
510
+ charts: {
511
+ ...t.charts,
512
+ [i]: { ...s, displayConfig: e }
513
+ },
514
+ activeView: "chart",
515
+ activeViews: {
516
+ ...t.activeViews,
517
+ [i]: "chart"
518
+ }
519
+ };
520
+ });
521
+ },
522
+ setLocalPaletteName: (e) => n({ localPaletteName: e }),
523
+ setUserManuallySelectedChart: (e) => n({ userManuallySelectedChart: e }),
524
+ // @deprecated - Use setChartType() instead
525
+ // Kept for backward compatibility
526
+ setFunnelChartType: (e) => {
527
+ n((t) => {
528
+ const i = t.charts.funnel || {
529
+ chartType: e,
530
+ chartConfig: {},
531
+ displayConfig: {}
532
+ };
533
+ return {
534
+ charts: {
535
+ ...t.charts,
536
+ funnel: { ...i, chartType: e }
537
+ }
538
+ };
539
+ });
540
+ },
541
+ // @deprecated - Use setChartConfig() instead
542
+ // Kept for backward compatibility
543
+ setFunnelChartConfig: (e) => {
544
+ n((t) => {
545
+ const i = t.charts.funnel || {
546
+ chartType: "funnel",
547
+ chartConfig: e,
548
+ displayConfig: {}
549
+ };
550
+ return {
551
+ charts: {
552
+ ...t.charts,
553
+ funnel: { ...i, chartConfig: e }
554
+ }
555
+ };
556
+ });
557
+ },
558
+ // @deprecated - Use setDisplayConfig() instead
559
+ // Kept for backward compatibility
560
+ setFunnelDisplayConfig: (e) => {
561
+ n((t) => {
562
+ const i = t.charts.funnel || {
563
+ chartType: "funnel",
564
+ chartConfig: {},
565
+ displayConfig: e
566
+ };
567
+ return {
568
+ charts: {
569
+ ...t.charts,
570
+ funnel: { ...i, displayConfig: e }
571
+ }
572
+ };
573
+ });
574
+ },
575
+ save: () => {
576
+ const e = r(), t = P.get(e.analysisType), i = t.extractState(e), s = e.activeViews[e.analysisType] ?? e.activeView ?? "chart";
577
+ return t.save(i, e.charts, s);
578
+ },
579
+ load: (e) => {
580
+ const t = P.get(e.analysisType);
581
+ if (!t.canLoad(e)) {
582
+ console.warn("[coreSlice] Invalid config, cannot load");
583
+ return;
584
+ }
585
+ const i = t.load(e), s = r(), o = {
586
+ ...s.charts,
587
+ ...e.charts
588
+ };
589
+ o[e.analysisType] || (o[e.analysisType] = t.getDefaultChartConfig());
590
+ const l = {
591
+ ...s.activeViews,
592
+ [e.analysisType]: e.activeView
593
+ };
594
+ n({
595
+ analysisType: e.analysisType,
596
+ charts: o,
597
+ activeView: e.activeView,
598
+ activeViews: l,
599
+ // Mode-specific state from adapter
600
+ ...i
601
+ });
602
+ },
603
+ saveWorkspace: () => {
604
+ const e = r(), t = e, i = P.get("query"), s = i.extractState(t), o = e.activeViews.query ?? e.activeView ?? "chart", l = i.save(
605
+ s,
606
+ e.charts,
607
+ o
608
+ ), d = P.get("funnel"), f = d.extractState(t), y = e.activeViews.funnel ?? e.activeView ?? "chart", g = d.save(
609
+ f,
610
+ e.charts,
611
+ y
612
+ ), c = P.get("flow"), p = c.extractState(t), S = e.activeViews.flow ?? e.activeView ?? "chart", C = c.save(
613
+ p,
614
+ e.charts,
615
+ S
616
+ ), b = P.get("retention"), w = b.extractState(t), m = e.activeViews.retention ?? e.activeView ?? "chart", D = b.save(
617
+ w,
618
+ e.charts,
619
+ m
620
+ );
621
+ return {
622
+ version: 1,
623
+ activeType: e.analysisType,
624
+ modes: {
625
+ query: l,
626
+ funnel: g,
627
+ flow: C,
628
+ retention: D
629
+ }
630
+ };
631
+ },
632
+ loadWorkspace: (e) => {
633
+ const t = P.get("query"), i = P.get("funnel"), s = P.get("flow"), o = P.get("retention");
634
+ let l = {}, d = {}, f = {}, y = {}, g = { ...r().charts }, c = { ...r().activeViews };
635
+ e.modes.query && t.canLoad(e.modes.query) && (l = t.load(e.modes.query), g = { ...g, ...e.modes.query.charts }, c.query = e.modes.query.activeView ?? "chart"), e.modes.funnel && i.canLoad(e.modes.funnel) && (d = i.load(e.modes.funnel), g = { ...g, ...e.modes.funnel.charts }, c.funnel = e.modes.funnel.activeView ?? "chart"), e.modes.flow && s.canLoad(e.modes.flow) && (f = s.load(e.modes.flow), g = { ...g, ...e.modes.flow.charts }, c.flow = e.modes.flow.activeView ?? "chart"), e.modes.retention && o.canLoad(e.modes.retention) && (y = o.load(e.modes.retention), g = { ...g, ...e.modes.retention.charts }, c.retention = e.modes.retention.activeView ?? "chart");
636
+ const S = e.modes[e.activeType]?.activeView ?? "chart";
637
+ n({
638
+ analysisType: e.activeType,
639
+ charts: g,
640
+ activeViews: c,
641
+ activeView: S,
642
+ ...l,
643
+ ...d,
644
+ ...f,
645
+ ...y
646
+ });
647
+ }
648
+ }), qe = () => ({
649
+ queryStates: [Q()],
650
+ activeQueryIndex: 0,
651
+ mergeStrategy: "concat"
652
+ }), ri = (n, r) => ({
653
+ ...qe(),
654
+ // ==========================================================================
655
+ // Query State Management
656
+ // ==========================================================================
657
+ setQueryStates: (e) => n({ queryStates: e }),
658
+ updateQueryState: (e, t) => n((i) => {
659
+ const s = [...i.queryStates];
660
+ return s[e] = t(s[e] || Q()), { queryStates: s };
661
+ }),
662
+ setActiveQueryIndex: (e) => n({ activeQueryIndex: e }),
663
+ setMergeStrategy: (e) => n({ mergeStrategy: e }),
664
+ // ==========================================================================
665
+ // Multi-Query Actions
666
+ // ==========================================================================
667
+ addQuery: () => n((e) => {
668
+ const t = e.queryStates[e.activeQueryIndex] || Q(), i = {
669
+ ...Q(),
670
+ metrics: [...t.metrics],
671
+ breakdowns: [...t.breakdowns],
672
+ filters: [...t.filters]
673
+ };
674
+ return {
675
+ queryStates: [...e.queryStates, i],
676
+ activeQueryIndex: e.queryStates.length
677
+ };
678
+ }),
679
+ removeQuery: (e) => n((t) => {
680
+ if (t.queryStates.length <= 1) return t;
681
+ const i = t.queryStates.filter((o, l) => l !== e);
682
+ let s = t.activeQueryIndex;
683
+ return e === t.activeQueryIndex ? s = Math.max(0, t.activeQueryIndex - 1) : e < t.activeQueryIndex && (s = t.activeQueryIndex - 1), { queryStates: i, activeQueryIndex: s };
684
+ }),
685
+ // ==========================================================================
686
+ // Metrics Actions
687
+ // ==========================================================================
688
+ addMetric: (e, t) => n((i) => {
689
+ const s = i.activeQueryIndex, o = [...i.queryStates], l = o[s] || Q(), d = {
690
+ id: K(),
691
+ field: e,
692
+ label: t || ye(l.metrics.length)
693
+ };
694
+ return o[s] = {
695
+ ...l,
696
+ metrics: [...l.metrics, d]
697
+ }, { queryStates: o };
698
+ }),
699
+ removeMetric: (e) => n((t) => {
700
+ const i = t.activeQueryIndex, s = [...t.queryStates], o = s[i] || Q(), l = o.metrics.find((y) => y.id === e)?.field, d = o.metrics.filter((y) => y.id !== e);
701
+ let f = o.order;
702
+ return l && f && f[l] && (f = { ...f }, delete f[l], Object.keys(f).length === 0 && (f = void 0)), s[i] = {
703
+ ...o,
704
+ metrics: d,
705
+ order: f
706
+ }, { queryStates: s };
707
+ }),
708
+ toggleMetric: (e) => n((t) => {
709
+ const i = t.activeQueryIndex, s = [...t.queryStates], o = s[i] || Q(), l = o.metrics.findIndex((d) => d.field === e);
710
+ if (l >= 0)
711
+ s[i] = {
712
+ ...o,
713
+ metrics: o.metrics.filter((d, f) => f !== l)
714
+ };
715
+ else {
716
+ const d = {
717
+ id: K(),
718
+ field: e,
719
+ label: ye(o.metrics.length)
720
+ };
721
+ s[i] = {
722
+ ...o,
723
+ metrics: [...o.metrics, d]
724
+ };
725
+ }
726
+ return { queryStates: s };
727
+ }),
728
+ reorderMetrics: (e, t) => n((i) => {
729
+ const s = i.activeQueryIndex, o = [...i.queryStates], l = o[s] || Q(), d = [...l.metrics], [f] = d.splice(e, 1);
730
+ return d.splice(t, 0, f), o[s] = {
731
+ ...l,
732
+ metrics: d
733
+ }, { queryStates: o };
734
+ }),
735
+ // ==========================================================================
736
+ // Breakdowns Actions
737
+ // ==========================================================================
738
+ addBreakdown: (e, t, i) => n((s) => {
739
+ const o = s.activeQueryIndex, l = [...s.queryStates], d = l[o] || Q();
740
+ if (t && d.breakdowns.some((g) => g.isTimeDimension))
741
+ return s;
742
+ const f = {
743
+ id: K(),
744
+ field: e,
745
+ isTimeDimension: t,
746
+ granularity: t ? i || "month" : void 0
747
+ };
748
+ return l[o] = {
749
+ ...d,
750
+ breakdowns: [...d.breakdowns, f]
751
+ }, { queryStates: l };
752
+ }),
753
+ removeBreakdown: (e) => n((t) => {
754
+ const i = t.activeQueryIndex, s = [...t.queryStates], o = s[i] || Q(), l = o.breakdowns.find((y) => y.id === e)?.field, d = o.breakdowns.filter((y) => y.id !== e);
755
+ let f = o.order;
756
+ return l && f && f[l] && (f = { ...f }, delete f[l], Object.keys(f).length === 0 && (f = void 0)), s[i] = {
757
+ ...o,
758
+ breakdowns: d,
759
+ order: f
760
+ }, { queryStates: s };
761
+ }),
762
+ toggleBreakdown: (e, t, i) => n((s) => {
763
+ const o = s.activeQueryIndex, l = [...s.queryStates], d = l[o] || Q(), f = d.breakdowns.findIndex((y) => y.field === e);
764
+ if (f >= 0)
765
+ l[o] = {
766
+ ...d,
767
+ breakdowns: d.breakdowns.filter((y, g) => g !== f)
768
+ };
769
+ else {
770
+ if (t && d.breakdowns.some((c) => c.isTimeDimension))
771
+ return s;
772
+ const y = {
773
+ id: K(),
774
+ field: e,
775
+ isTimeDimension: t,
776
+ granularity: t ? i || "month" : void 0
777
+ };
778
+ l[o] = {
779
+ ...d,
780
+ breakdowns: [...d.breakdowns, y]
781
+ };
782
+ }
783
+ return { queryStates: l };
784
+ }),
785
+ setBreakdownGranularity: (e, t) => n((i) => {
786
+ const { mergeStrategy: s, activeQueryIndex: o, queryStates: l } = i, d = [...l], f = s === "merge" && o > 0 ? 0 : o;
787
+ return d[f] = {
788
+ ...d[f],
789
+ breakdowns: d[f].breakdowns.map(
790
+ (y) => y.id === e ? { ...y, granularity: t } : y
791
+ )
792
+ }, { queryStates: d };
793
+ }),
794
+ toggleBreakdownComparison: (e) => n((t) => {
795
+ const { mergeStrategy: i, activeQueryIndex: s, queryStates: o, charts: l, analysisType: d } = t, f = [...o], y = i === "merge" && s > 0 ? 0 : s, g = f[y].breakdowns.find((C) => C.id === e), c = g && !g.enableComparison, p = f[y].breakdowns.map((C) => C.id === e ? { ...C, enableComparison: !C.enableComparison } : C.isTimeDimension && C.enableComparison ? { ...C, enableComparison: !1 } : C);
796
+ f[y] = {
797
+ ...f[y],
798
+ breakdowns: p
799
+ };
800
+ const S = { queryStates: f };
801
+ if (c && g?.isTimeDimension && g.field) {
802
+ const C = f[y].filters || [];
803
+ if (!C.some((m) => {
804
+ if ("member" in m) {
805
+ const D = m;
806
+ return D.member === g.field && D.operator === "inDateRange";
807
+ }
808
+ return !1;
809
+ })) {
810
+ const m = {
811
+ member: g.field,
812
+ operator: "inDateRange",
813
+ values: [],
814
+ dateRange: _n("last_n_months", 3)
815
+ };
816
+ f[y] = {
817
+ ...f[y],
818
+ filters: [...C, m]
819
+ }, S.queryStates = f;
820
+ }
821
+ const w = l[d];
822
+ w && w.chartType !== "line" && (S.charts = {
823
+ ...l,
824
+ [d]: {
825
+ ...w,
826
+ chartType: "line"
827
+ }
828
+ }, S.userManuallySelectedChart = !1, S.activeView = "chart", S.activeViews = {
829
+ ...t.activeViews,
830
+ [d]: "chart"
831
+ });
832
+ }
833
+ return S;
834
+ }),
835
+ reorderBreakdowns: (e, t) => n((i) => {
836
+ const s = i.activeQueryIndex, o = [...i.queryStates], l = o[s] || Q(), d = [...l.breakdowns], [f] = d.splice(e, 1);
837
+ return d.splice(t, 0, f), o[s] = {
838
+ ...l,
839
+ breakdowns: d
840
+ }, { queryStates: o };
841
+ }),
842
+ // ==========================================================================
843
+ // Filters Actions
844
+ // ==========================================================================
845
+ setFilters: (e) => n((t) => {
846
+ const i = t.activeQueryIndex, s = [...t.queryStates];
847
+ return s[i] = {
848
+ ...s[i],
849
+ filters: e
850
+ }, { queryStates: s };
851
+ }),
852
+ dropFieldToFilter: (e) => n((t) => {
853
+ const i = t.activeQueryIndex, s = [...t.queryStates], o = s[i] || Q(), l = o.filters || [];
854
+ if (l.some((g) => "member" in g && g.member === e)) return t;
855
+ const f = {
856
+ member: e,
857
+ operator: "set",
858
+ values: []
859
+ };
860
+ let y;
861
+ if (l.length === 0)
862
+ y = [f];
863
+ else if (l.length === 1 && "type" in l[0]) {
864
+ const g = l[0];
865
+ y = [{ ...g, filters: [...g.filters, f] }];
866
+ } else
867
+ y = [{ type: "and", filters: [...l, f] }];
868
+ return s[i] = {
869
+ ...o,
870
+ filters: y
871
+ }, { queryStates: s };
872
+ }),
873
+ setOrder: (e, t) => n((i) => {
874
+ const s = i.activeQueryIndex, o = [...i.queryStates], l = o[s] || Q(), d = { ...l.order || {} };
875
+ return t === null ? delete d[e] : d[e] = t, o[s] = {
876
+ ...l,
877
+ order: Object.keys(d).length > 0 ? d : void 0
878
+ }, { queryStates: o };
879
+ }),
880
+ // ==========================================================================
881
+ // Utility Actions
882
+ // ==========================================================================
883
+ getCurrentState: () => {
884
+ const e = r();
885
+ return e.queryStates[e.activeQueryIndex] || Q();
886
+ },
887
+ getMergeKeys: () => {
888
+ const e = r();
889
+ if (e.mergeStrategy !== "merge" || e.queryStates.length === 0)
890
+ return;
891
+ const t = e.queryStates[0].breakdowns;
892
+ if (t.length !== 0)
893
+ return t.map((i) => i.field);
894
+ },
895
+ isMultiQueryMode: () => {
896
+ const e = r();
897
+ return e.queryStates.length <= 1 ? !1 : e.queryStates.filter(
898
+ (i) => i.metrics.length > 0 || i.breakdowns.length > 0
899
+ ).length > 1;
900
+ },
901
+ buildCurrentQuery: () => {
902
+ const e = r(), t = e.queryStates[e.activeQueryIndex] || Q();
903
+ return ge(t.metrics, t.breakdowns, t.filters, t.order);
904
+ },
905
+ buildAllQueries: () => {
906
+ const e = r(), t = e.queryStates[0]?.breakdowns || [];
907
+ return e.queryStates.map((i, s) => {
908
+ const o = e.mergeStrategy === "merge" && s > 0 ? t : i.breakdowns;
909
+ return ge(i.metrics, o, i.filters, i.order);
910
+ });
911
+ },
912
+ buildMultiQueryConfig: () => {
913
+ const e = r();
914
+ if (!r().isMultiQueryMode()) return null;
915
+ const i = r().buildAllQueries().filter((s) => s.measures && s.measures.length > 0 || s.dimensions && s.dimensions.length > 0 || s.timeDimensions && s.timeDimensions.length > 0);
916
+ return i.length < 2 ? null : {
917
+ queries: i,
918
+ mergeStrategy: e.mergeStrategy,
919
+ mergeKeys: r().getMergeKeys(),
920
+ queryLabels: i.map((s, o) => `Q${o + 1}`)
921
+ };
922
+ }
923
+ }), ke = () => ({
924
+ funnelCube: null,
925
+ funnelSteps: [],
926
+ activeFunnelStepIndex: 0,
927
+ funnelTimeDimension: null,
928
+ funnelBindingKey: null,
929
+ stepTimeToConvert: []
930
+ // Deprecated - kept for backward compat
931
+ }), si = (n, r) => ({
932
+ ...ke(),
933
+ addFunnelStep: () => n((e) => {
934
+ const t = e.funnelSteps[e.funnelSteps.length - 1], i = {
935
+ id: K(),
936
+ name: `Step ${e.funnelSteps.length + 1}`,
937
+ cube: e.funnelCube || "",
938
+ // Deep copy filters from previous step, or empty array if first step
939
+ filters: t?.filters ? JSON.parse(JSON.stringify(t.filters)) : [],
940
+ // Copy timeToConvert from previous step
941
+ timeToConvert: t?.timeToConvert
942
+ };
943
+ return {
944
+ funnelSteps: [...e.funnelSteps, i],
945
+ activeFunnelStepIndex: e.funnelSteps.length
946
+ };
947
+ }),
948
+ removeFunnelStep: (e) => n((t) => {
949
+ if (t.funnelSteps.length <= 1) return t;
950
+ const i = t.funnelSteps.filter((o, l) => l !== e), s = Math.min(t.activeFunnelStepIndex, i.length - 1);
951
+ return {
952
+ funnelSteps: i,
953
+ activeFunnelStepIndex: s
954
+ };
955
+ }),
956
+ updateFunnelStep: (e, t) => n((i) => {
957
+ const s = [...i.funnelSteps];
958
+ return s[e] && (s[e] = { ...s[e], ...t }), { funnelSteps: s };
959
+ }),
960
+ setActiveFunnelStepIndex: (e) => n({ activeFunnelStepIndex: e }),
961
+ reorderFunnelSteps: (e, t) => n((i) => {
962
+ const s = [...i.funnelSteps], [o] = s.splice(e, 1);
963
+ return s.splice(t, 0, o), { funnelSteps: s };
964
+ }),
965
+ setFunnelTimeDimension: (e) => n({ funnelTimeDimension: e }),
966
+ setFunnelBindingKey: (e) => n({ funnelBindingKey: e }),
967
+ setFunnelCube: (e) => n((t) => {
968
+ const i = t.funnelSteps.map((s) => ({
969
+ ...s,
970
+ cube: e || ""
971
+ }));
972
+ return {
973
+ funnelCube: e,
974
+ // Clear binding key and time dimension since they may not exist in new cube
975
+ funnelBindingKey: null,
976
+ funnelTimeDimension: null,
977
+ funnelSteps: i
978
+ };
979
+ }),
980
+ // Deprecated: no-op - legacy queryStates-based funnels are no longer supported
981
+ // Use updateFunnelStep with timeToConvert instead
982
+ setStepTimeToConvert: () => {
983
+ },
984
+ // Deprecated: always returns null - legacy queryStates-based funnels are no longer supported
985
+ // Use buildFunnelQueryFromSteps instead
986
+ buildFunnelConfig: () => null,
987
+ // New: Build ServerFunnelQuery from dedicated funnelSteps
988
+ buildFunnelQueryFromSteps: () => {
989
+ const e = r();
990
+ if (e.analysisType !== "funnel" || !e.funnelBindingKey || !e.funnelTimeDimension || e.funnelSteps.length < 2) return null;
991
+ const t = e.funnelSteps.filter((i) => i.cube && i.name);
992
+ return t.length < 2 ? null : {
993
+ funnel: {
994
+ bindingKey: e.funnelBindingKey.dimension,
995
+ timeDimension: e.funnelTimeDimension,
996
+ steps: t.map((i) => ({
997
+ name: i.name,
998
+ cube: i.cube,
999
+ filter: i.filters.length > 0 ? i.filters : void 0,
1000
+ timeToConvert: i.timeToConvert
1001
+ })),
1002
+ includeTimeMetrics: !0
1003
+ }
1004
+ };
1005
+ },
1006
+ isFunnelMode: () => r().analysisType === "funnel",
1007
+ isFunnelModeEnabled: () => {
1008
+ const e = r();
1009
+ return e.analysisType !== "funnel" || !e.funnelBindingKey || !e.funnelTimeDimension || e.funnelSteps.length < 2 ? !1 : e.funnelSteps.filter((i) => i.cube && i.name).length >= 2;
1010
+ }
1011
+ }), Be = () => ({
1012
+ flowCube: null,
1013
+ flowBindingKey: null,
1014
+ flowTimeDimension: null,
1015
+ startingStep: {
1016
+ name: "",
1017
+ filters: []
1018
+ },
1019
+ stepsBefore: 3,
1020
+ stepsAfter: 3,
1021
+ eventDimension: null,
1022
+ joinStrategy: "auto"
1023
+ }), ai = (n, r) => ({
1024
+ ...Be(),
1025
+ setFlowCube: (e) => n(() => ({
1026
+ flowCube: e,
1027
+ // Clear binding key and time dimension since they may not exist in new cube
1028
+ flowBindingKey: null,
1029
+ flowTimeDimension: null,
1030
+ eventDimension: null,
1031
+ // Reset starting step filters when cube changes
1032
+ startingStep: {
1033
+ name: "",
1034
+ filters: []
1035
+ }
1036
+ })),
1037
+ setFlowBindingKey: (e) => n({ flowBindingKey: e }),
1038
+ setFlowTimeDimension: (e) => n({ flowTimeDimension: e }),
1039
+ setEventDimension: (e) => n({ eventDimension: e }),
1040
+ setStartingStepName: (e) => n((t) => ({
1041
+ startingStep: {
1042
+ ...t.startingStep,
1043
+ name: e
1044
+ }
1045
+ })),
1046
+ setStartingStepFilters: (e) => n((t) => ({
1047
+ startingStep: {
1048
+ ...t.startingStep,
1049
+ filters: e
1050
+ }
1051
+ })),
1052
+ addStartingStepFilter: (e) => n((t) => ({
1053
+ startingStep: {
1054
+ ...t.startingStep,
1055
+ filters: [...t.startingStep.filters, e]
1056
+ }
1057
+ })),
1058
+ removeStartingStepFilter: (e) => n((t) => ({
1059
+ startingStep: {
1060
+ ...t.startingStep,
1061
+ filters: t.startingStep.filters.filter((i, s) => s !== e)
1062
+ }
1063
+ })),
1064
+ updateStartingStepFilter: (e, t) => n((i) => {
1065
+ const s = [...i.startingStep.filters];
1066
+ return s[e] && (s[e] = t), {
1067
+ startingStep: {
1068
+ ...i.startingStep,
1069
+ filters: s
1070
+ }
1071
+ };
1072
+ }),
1073
+ setStepsBefore: (e) => n({
1074
+ stepsBefore: Math.max(je, Math.min(We, e))
1075
+ }),
1076
+ setStepsAfter: (e) => n({
1077
+ stepsAfter: Math.max(je, Math.min(We, e))
1078
+ }),
1079
+ setJoinStrategy: (e) => n(() => ({
1080
+ joinStrategy: e
1081
+ })),
1082
+ isFlowMode: () => r().analysisType === "flow",
1083
+ isFlowModeEnabled: () => {
1084
+ const e = r();
1085
+ return !(e.analysisType !== "flow" || !e.flowCube || !e.flowBindingKey?.dimension || !e.flowTimeDimension || !e.eventDimension || e.startingStep.filters.length === 0);
1086
+ },
1087
+ buildFlowQuery: () => {
1088
+ const e = r();
1089
+ if (e.analysisType !== "flow" || !e.flowBindingKey?.dimension || !e.flowTimeDimension || !e.eventDimension || e.startingStep.filters.length === 0) return null;
1090
+ let t;
1091
+ if (typeof e.flowBindingKey.dimension == "string")
1092
+ t = e.flowBindingKey.dimension;
1093
+ else if (Array.isArray(e.flowBindingKey.dimension))
1094
+ t = e.flowBindingKey.dimension.map((d) => ({
1095
+ cube: d.cube,
1096
+ dimension: d.dimension
1097
+ }));
1098
+ else
1099
+ return null;
1100
+ const i = 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;
1101
+ return {
1102
+ flow: {
1103
+ bindingKey: t,
1104
+ timeDimension: e.flowTimeDimension,
1105
+ startingStep: {
1106
+ name: e.startingStep.name || "Starting Step",
1107
+ filter: i
1108
+ },
1109
+ stepsBefore: l,
1110
+ stepsAfter: e.stepsAfter,
1111
+ eventDimension: e.eventDimension,
1112
+ outputMode: o,
1113
+ joinStrategy: e.joinStrategy
1114
+ }
1115
+ };
1116
+ }
1117
+ }), Ie = () => ({
1118
+ ...Mn
1119
+ }), oi = (n, r) => ({
1120
+ ...Ie(),
1121
+ setRetentionCube: (e) => n(() => ({
1122
+ retentionCube: e,
1123
+ // Clear related fields when cube changes
1124
+ retentionTimeDimension: null,
1125
+ retentionBindingKey: null,
1126
+ retentionCohortFilters: [],
1127
+ retentionActivityFilters: [],
1128
+ retentionBreakdowns: []
1129
+ })),
1130
+ setRetentionBindingKey: (e) => n({ retentionBindingKey: e }),
1131
+ setRetentionTimeDimension: (e) => n({ retentionTimeDimension: e }),
1132
+ setRetentionDateRange: (e) => n({ retentionDateRange: e }),
1133
+ setRetentionCohortFilters: (e) => n({ retentionCohortFilters: e }),
1134
+ addRetentionCohortFilter: (e) => n((t) => ({
1135
+ retentionCohortFilters: [...t.retentionCohortFilters, e]
1136
+ })),
1137
+ removeRetentionCohortFilter: (e) => n((t) => ({
1138
+ retentionCohortFilters: t.retentionCohortFilters.filter(
1139
+ (i, s) => s !== e
1140
+ )
1141
+ })),
1142
+ updateRetentionCohortFilter: (e, t) => n((i) => {
1143
+ const s = [...i.retentionCohortFilters];
1144
+ return s[e] && (s[e] = t), { retentionCohortFilters: s };
1145
+ }),
1146
+ setRetentionActivityFilters: (e) => n({ retentionActivityFilters: e }),
1147
+ addRetentionActivityFilter: (e) => n((t) => ({
1148
+ retentionActivityFilters: [...t.retentionActivityFilters, e]
1149
+ })),
1150
+ removeRetentionActivityFilter: (e) => n((t) => ({
1151
+ retentionActivityFilters: t.retentionActivityFilters.filter(
1152
+ (i, s) => s !== e
1153
+ )
1154
+ })),
1155
+ updateRetentionActivityFilter: (e, t) => n((i) => {
1156
+ const s = [...i.retentionActivityFilters];
1157
+ return s[e] && (s[e] = t), { retentionActivityFilters: s };
1158
+ }),
1159
+ setRetentionBreakdowns: (e) => n({ retentionBreakdowns: e }),
1160
+ addRetentionBreakdown: (e) => n((t) => ({
1161
+ retentionBreakdowns: [...t.retentionBreakdowns, e]
1162
+ })),
1163
+ removeRetentionBreakdown: (e) => n((t) => ({
1164
+ retentionBreakdowns: t.retentionBreakdowns.filter((i) => i.field !== e)
1165
+ })),
1166
+ setRetentionViewGranularity: (e) => n({ retentionViewGranularity: e }),
1167
+ setRetentionPeriods: (e) => n({
1168
+ retentionPeriods: Math.max(
1169
+ xn,
1170
+ Math.min(qn, e)
1171
+ )
1172
+ }),
1173
+ setRetentionType: (e) => n({ retentionType: e }),
1174
+ isRetentionMode: () => r().analysisType === "retention",
1175
+ isRetentionModeEnabled: () => {
1176
+ const e = r();
1177
+ return !(e.analysisType !== "retention" || !e.retentionBindingKey?.dimension || !e.retentionTimeDimension);
1178
+ },
1179
+ buildRetentionQuery: () => {
1180
+ const e = r();
1181
+ if (e.analysisType !== "retention" || !e.retentionBindingKey?.dimension || !e.retentionTimeDimension) return null;
1182
+ let t;
1183
+ if (typeof e.retentionBindingKey.dimension == "string")
1184
+ t = e.retentionBindingKey.dimension;
1185
+ else if (Array.isArray(e.retentionBindingKey.dimension))
1186
+ t = e.retentionBindingKey.dimension.map((s) => ({
1187
+ cube: s.cube,
1188
+ dimension: s.dimension
1189
+ }));
1190
+ else
1191
+ return null;
1192
+ const i = {
1193
+ retention: {
1194
+ timeDimension: e.retentionTimeDimension,
1195
+ bindingKey: t,
1196
+ dateRange: e.retentionDateRange,
1197
+ granularity: e.retentionViewGranularity,
1198
+ periods: e.retentionPeriods,
1199
+ retentionType: e.retentionType
1200
+ }
1201
+ };
1202
+ return e.retentionCohortFilters.length > 0 && (i.retention.cohortFilters = e.retentionCohortFilters.length === 1 ? e.retentionCohortFilters[0] : e.retentionCohortFilters), e.retentionActivityFilters.length > 0 && (i.retention.activityFilters = e.retentionActivityFilters.length === 1 ? e.retentionActivityFilters[0] : e.retentionActivityFilters), e.retentionBreakdowns.length > 0 && (i.retention.breakdownDimensions = e.retentionBreakdowns.map((s) => s.field)), i;
1203
+ },
1204
+ getRetentionValidation: () => {
1205
+ const e = r(), t = [], i = [];
1206
+ if (e.analysisType !== "retention")
1207
+ return { isValid: !0, errors: [], warnings: [] };
1208
+ if (e.retentionCube || t.push("Select a cube for retention analysis"), e.retentionBindingKey?.dimension || t.push("Select a user identifier (binding key) to track retention"), e.retentionTimeDimension || t.push("Select a timestamp dimension for the analysis"), !e.retentionDateRange?.start || !e.retentionDateRange?.end)
1209
+ t.push("Date range is required for retention analysis");
1210
+ else {
1211
+ const s = new Date(e.retentionDateRange.start), o = new Date(e.retentionDateRange.end);
1212
+ isNaN(s.getTime()) && t.push("Invalid start date format"), isNaN(o.getTime()) && t.push("Invalid end date format"), s > o && t.push("Start date must be before or equal to end date");
1213
+ }
1214
+ return e.retentionPeriods < 1 && t.push("At least 1 retention period is required"), e.retentionPeriods > 52 && i.push("More than 52 periods may impact performance"), {
1215
+ isValid: t.length === 0,
1216
+ errors: t,
1217
+ warnings: i
1218
+ };
1219
+ }
1220
+ }), dt = {
1221
+ isOpen: !1,
1222
+ userPrompt: "",
1223
+ isGenerating: !1,
1224
+ error: null,
1225
+ hasGeneratedQuery: !1,
1226
+ previousState: null
1227
+ }, li = () => ({
1228
+ activeTab: "query",
1229
+ activeView: "chart",
1230
+ displayLimit: 100,
1231
+ showFieldModal: !1,
1232
+ fieldModalMode: "metrics",
1233
+ aiState: dt
1234
+ }), ui = (n, r) => ({
1235
+ ...li(),
1236
+ // ==========================================================================
1237
+ // Tab/View Actions
1238
+ // ==========================================================================
1239
+ setActiveTab: (e) => n({ activeTab: e }),
1240
+ setActiveView: (e) => n((t) => ({
1241
+ activeView: e,
1242
+ activeViews: {
1243
+ ...t.activeViews,
1244
+ [t.analysisType]: e
1245
+ }
1246
+ })),
1247
+ setDisplayLimit: (e) => n({ displayLimit: e }),
1248
+ // ==========================================================================
1249
+ // Field Modal Actions
1250
+ // ==========================================================================
1251
+ openMetricsModal: () => n({ showFieldModal: !0, fieldModalMode: "metrics" }),
1252
+ openBreakdownsModal: () => n({ showFieldModal: !0, fieldModalMode: "breakdown" }),
1253
+ closeFieldModal: () => n({ showFieldModal: !1 }),
1254
+ // ==========================================================================
1255
+ // AI Actions
1256
+ // ==========================================================================
1257
+ openAI: () => n((e) => ({
1258
+ aiState: { ...e.aiState, isOpen: !0 }
1259
+ })),
1260
+ closeAI: () => n((e) => ({
1261
+ aiState: { ...e.aiState, isOpen: !1 }
1262
+ })),
1263
+ setAIPrompt: (e) => n((t) => ({
1264
+ aiState: { ...t.aiState, userPrompt: e }
1265
+ })),
1266
+ setAIGenerating: (e) => n((t) => ({
1267
+ aiState: { ...t.aiState, isGenerating: e }
1268
+ })),
1269
+ setAIError: (e) => n((t) => ({
1270
+ aiState: { ...t.aiState, error: e }
1271
+ })),
1272
+ setAIHasGeneratedQuery: (e) => n((t) => ({
1273
+ aiState: { ...t.aiState, hasGeneratedQuery: e }
1274
+ })),
1275
+ saveAIPreviousState: () => n((e) => {
1276
+ const t = e.queryStates[e.activeQueryIndex], i = e.charts[e.analysisType] || {
1277
+ chartType: "bar",
1278
+ chartConfig: {},
1279
+ displayConfig: { showLegend: !0, showGrid: !0, showTooltip: !0 }
1280
+ };
1281
+ return {
1282
+ aiState: {
1283
+ ...e.aiState,
1284
+ previousState: t ? {
1285
+ metrics: [...t.metrics],
1286
+ breakdowns: [...t.breakdowns],
1287
+ filters: [...t.filters],
1288
+ chartType: i.chartType,
1289
+ chartConfig: { ...i.chartConfig },
1290
+ displayConfig: { ...i.displayConfig }
1291
+ } : null
1292
+ }
1293
+ };
1294
+ }),
1295
+ restoreAIPreviousState: () => n((e) => {
1296
+ const t = e.aiState.previousState;
1297
+ if (!t) return e;
1298
+ const i = e.activeQueryIndex, s = [...e.queryStates];
1299
+ return s[i] = {
1300
+ ...s[i] || Q(),
1301
+ metrics: t.metrics,
1302
+ breakdowns: t.breakdowns,
1303
+ filters: t.filters
1304
+ }, {
1305
+ queryStates: s,
1306
+ charts: {
1307
+ ...e.charts,
1308
+ [e.analysisType]: {
1309
+ chartType: t.chartType,
1310
+ chartConfig: t.chartConfig,
1311
+ displayConfig: t.displayConfig
1312
+ }
1313
+ },
1314
+ aiState: { ...dt }
1315
+ };
1316
+ })
1317
+ });
1318
+ function Ye(n) {
1319
+ const r = n.filters ? [...n.filters] : [], e = n.timeDimensions || [], t = [
1320
+ ...(n.dimensions || []).map((s) => ({
1321
+ id: K(),
1322
+ field: s,
1323
+ isTimeDimension: !1
1324
+ })),
1325
+ ...e.map((s) => ({
1326
+ id: K(),
1327
+ field: s.dimension,
1328
+ granularity: s.granularity,
1329
+ isTimeDimension: !0,
1330
+ enableComparison: !!(s.compareDateRange && s.compareDateRange.length > 0)
1331
+ }))
1332
+ ];
1333
+ let i = r;
1334
+ for (const s of e) {
1335
+ if (!s.compareDateRange || s.compareDateRange.length === 0) continue;
1336
+ const o = i.some(
1337
+ (f) => "member" in f && f.member === s.dimension && f.operator === "inDateRange"
1338
+ ), l = s.compareDateRange[0], d = Array.isArray(l) || typeof l == "string" ? l : void 0;
1339
+ if (d) {
1340
+ if (!o) {
1341
+ i = [
1342
+ ...i,
1343
+ {
1344
+ member: s.dimension,
1345
+ operator: "inDateRange",
1346
+ values: [],
1347
+ dateRange: d
1348
+ }
1349
+ ];
1350
+ continue;
1351
+ }
1352
+ i = i.map((f) => "member" in f && f.member === s.dimension && f.operator === "inDateRange" && !f.dateRange ? { ...f, dateRange: d } : f);
1353
+ }
1354
+ }
1355
+ return {
1356
+ ...Q(),
1357
+ metrics: (n.measures || []).map((s, o) => ({
1358
+ id: K(),
1359
+ field: s,
1360
+ label: ye(o)
1361
+ })),
1362
+ breakdowns: t,
1363
+ filters: i,
1364
+ order: n.order
1365
+ };
1366
+ }
1367
+ function ci(n) {
1368
+ return "queries" in n && Array.isArray(n.queries);
1369
+ }
1370
+ function di(n) {
1371
+ if (n.initialAnalysisType === "funnel" && n.initialFunnelState) {
1372
+ const r = O.getDefaultChartConfig(), e = {
1373
+ chartType: n.initialChartConfig?.chartType || r.chartType,
1374
+ chartConfig: n.initialChartConfig?.chartConfig || r.chartConfig,
1375
+ displayConfig: n.initialChartConfig?.displayConfig || r.displayConfig
1376
+ }, t = {
1377
+ funnelCube: n.initialFunnelState.funnelCube ?? null,
1378
+ funnelSteps: n.initialFunnelState.funnelSteps || [],
1379
+ activeFunnelStepIndex: 0,
1380
+ funnelTimeDimension: n.initialFunnelState.funnelTimeDimension ?? null,
1381
+ funnelBindingKey: n.initialFunnelState.funnelBindingKey ?? null
1382
+ };
1383
+ return O.save(
1384
+ t,
1385
+ { funnel: e },
1386
+ n.initialActiveView || "chart"
1387
+ );
1388
+ }
1389
+ if (n.initialAnalysisType === "flow" && n.initialFlowState) {
1390
+ const r = H.getDefaultChartConfig(), e = {
1391
+ chartType: n.initialChartConfig?.chartType || r.chartType,
1392
+ chartConfig: n.initialChartConfig?.chartConfig || r.chartConfig,
1393
+ displayConfig: n.initialChartConfig?.displayConfig || r.displayConfig
1394
+ }, t = {
1395
+ flowCube: n.initialFlowState.flowCube ?? null,
1396
+ flowBindingKey: n.initialFlowState.flowBindingKey ?? null,
1397
+ flowTimeDimension: n.initialFlowState.flowTimeDimension ?? null,
1398
+ startingStep: n.initialFlowState.startingStep || { name: "", filters: [] },
1399
+ stepsBefore: n.initialFlowState.stepsBefore ?? 3,
1400
+ stepsAfter: n.initialFlowState.stepsAfter ?? 3,
1401
+ eventDimension: n.initialFlowState.eventDimension ?? null,
1402
+ joinStrategy: n.initialFlowState.joinStrategy ?? "auto"
1403
+ };
1404
+ return H.save(
1405
+ t,
1406
+ { flow: e },
1407
+ n.initialActiveView || "chart"
1408
+ );
1409
+ }
1410
+ if (n.initialAnalysisType === "retention" && n.initialRetentionState) {
1411
+ const r = j.getDefaultChartConfig(), e = {
1412
+ chartType: n.initialChartConfig?.chartType || r.chartType,
1413
+ chartConfig: n.initialChartConfig?.chartConfig || r.chartConfig,
1414
+ displayConfig: n.initialChartConfig?.displayConfig || r.displayConfig
1415
+ }, t = kn(Bn), i = {
1416
+ retentionCube: n.initialRetentionState.retentionCube ?? null,
1417
+ retentionBindingKey: n.initialRetentionState.retentionBindingKey ?? null,
1418
+ retentionTimeDimension: n.initialRetentionState.retentionTimeDimension ?? null,
1419
+ retentionDateRange: n.initialRetentionState.retentionDateRange ?? t,
1420
+ retentionCohortFilters: n.initialRetentionState.retentionCohortFilters || [],
1421
+ retentionActivityFilters: n.initialRetentionState.retentionActivityFilters || [],
1422
+ retentionBreakdowns: n.initialRetentionState.retentionBreakdowns || [],
1423
+ retentionViewGranularity: n.initialRetentionState.retentionViewGranularity ?? "week",
1424
+ retentionPeriods: n.initialRetentionState.retentionPeriods ?? 12,
1425
+ retentionType: n.initialRetentionState.retentionType ?? "classic"
1426
+ };
1427
+ return j.save(
1428
+ i,
1429
+ { retention: e },
1430
+ n.initialActiveView || "chart"
1431
+ );
1432
+ }
1433
+ if (n.initialQuery) {
1434
+ const r = n.initialQuery;
1435
+ let e, t = "concat";
1436
+ ci(r) ? (e = r.queries.map(Ye), r.mergeStrategy && (t = r.mergeStrategy)) : e = [Ye(r)];
1437
+ const i = _.getDefaultChartConfig(), s = {
1438
+ chartType: n.initialChartConfig?.chartType || i.chartType,
1439
+ chartConfig: n.initialChartConfig?.chartConfig || i.chartConfig,
1440
+ displayConfig: n.initialChartConfig?.displayConfig || i.displayConfig
1441
+ };
1442
+ return _.save(
1443
+ { queryStates: e, activeQueryIndex: 0, mergeStrategy: t },
1444
+ { query: s },
1445
+ n.initialActiveView || "chart"
1446
+ );
1447
+ }
1448
+ if (n.initialChartConfig) {
1449
+ const r = _.getDefaultChartConfig(), e = {
1450
+ chartType: n.initialChartConfig.chartType || r.chartType,
1451
+ chartConfig: n.initialChartConfig.chartConfig || r.chartConfig,
1452
+ displayConfig: n.initialChartConfig.displayConfig || r.displayConfig
1453
+ };
1454
+ return _.save(
1455
+ { queryStates: [Q()], activeQueryIndex: 0, mergeStrategy: "concat" },
1456
+ { query: e },
1457
+ n.initialActiveView || "chart"
1458
+ );
1459
+ }
1460
+ return n.initialActiveView ? _.save(
1461
+ { queryStates: [Q()], activeQueryIndex: 0, mergeStrategy: "concat" },
1462
+ { query: _.getDefaultChartConfig() },
1463
+ n.initialActiveView
1464
+ ) : null;
1465
+ }
1466
+ function fi(n, r) {
1467
+ return {
1468
+ reset: () => {
1469
+ n({
1470
+ ...ct(),
1471
+ ...qe(),
1472
+ ...ke(),
1473
+ ...Be(),
1474
+ ...Ie(),
1475
+ // Apply adapter defaults for charts (may differ from slice defaults)
1476
+ charts: {
1477
+ query: _.getDefaultChartConfig(),
1478
+ funnel: O.getDefaultChartConfig(),
1479
+ flow: H.getDefaultChartConfig(),
1480
+ retention: j.getDefaultChartConfig()
1481
+ },
1482
+ activeViews: {
1483
+ query: "chart",
1484
+ funnel: "chart",
1485
+ flow: "chart",
1486
+ retention: "chart"
1487
+ }
1488
+ });
1489
+ },
1490
+ clearCurrentMode: () => n((e) => {
1491
+ switch (e.analysisType) {
1492
+ case "funnel":
1493
+ return {
1494
+ ...ke(),
1495
+ charts: {
1496
+ ...e.charts,
1497
+ funnel: O.getDefaultChartConfig()
1498
+ }
1499
+ };
1500
+ case "flow":
1501
+ return {
1502
+ ...Be(),
1503
+ charts: {
1504
+ ...e.charts,
1505
+ flow: H.getDefaultChartConfig()
1506
+ }
1507
+ };
1508
+ case "retention":
1509
+ return {
1510
+ ...Ie(),
1511
+ charts: {
1512
+ ...e.charts,
1513
+ retention: j.getDefaultChartConfig()
1514
+ }
1515
+ };
1516
+ default:
1517
+ return {
1518
+ ...qe(),
1519
+ userManuallySelectedChart: !1,
1520
+ charts: {
1521
+ ...e.charts,
1522
+ query: _.getDefaultChartConfig()
1523
+ }
1524
+ };
1525
+ }
1526
+ }),
1527
+ clearQuery: () => n((e) => {
1528
+ const t = [...e.queryStates];
1529
+ return t[e.activeQueryIndex] = Q(), {
1530
+ queryStates: t,
1531
+ userManuallySelectedChart: !1,
1532
+ charts: {
1533
+ ...e.charts,
1534
+ query: _.getDefaultChartConfig()
1535
+ }
1536
+ };
1537
+ }),
1538
+ getValidation: () => {
1539
+ const e = r(), t = P.get(e.analysisType), i = t.extractState(e);
1540
+ return t.validate(i);
1541
+ }
1542
+ };
1543
+ }
1544
+ function yi(n = {}) {
1545
+ const r = di(n), e = (t, i, s) => ({
1546
+ // Compose slices - they provide default state and actions
1547
+ ...ii(t, i),
1548
+ ...ri(t, i),
1549
+ ...si(t, i),
1550
+ ...ai(t, i),
1551
+ ...oi(t, i),
1552
+ ...ui(t),
1553
+ // Cross-slice actions
1554
+ ...fi(t, i)
1555
+ });
1556
+ if (n.disableLocalStorage) {
1557
+ const t = Ge()(
1558
+ Oe(He(e), {
1559
+ name: "AnalysisBuilderStore (no-persist)"
1560
+ })
1561
+ );
1562
+ return r && t.getState().load(r), t;
1563
+ }
1564
+ return Ge()(
1565
+ Oe(
1566
+ He(
1567
+ An(e, {
1568
+ name: Jn,
1569
+ // Use workspace format to preserve ALL modes' state
1570
+ partialize: (t) => t.saveWorkspace(),
1571
+ merge: (t, i) => t && In(t) ? {
1572
+ ...i,
1573
+ _persistedWorkspace: t
1574
+ } : t && st(t) ? {
1575
+ ...i,
1576
+ _persistedConfig: t
1577
+ } : r ? {
1578
+ ...i,
1579
+ _initialConfig: r
1580
+ } : i,
1581
+ onRehydrateStorage: () => (t) => {
1582
+ if (t) {
1583
+ if (t._persistedWorkspace) {
1584
+ const i = t._persistedWorkspace;
1585
+ delete t._persistedWorkspace, delete t._persistedConfig, delete t._initialConfig, t.loadWorkspace(i);
1586
+ } else if (t._persistedConfig) {
1587
+ const i = t._persistedConfig;
1588
+ delete t._persistedConfig, delete t._initialConfig, t.load(i);
1589
+ } else if (t._initialConfig) {
1590
+ const i = t._initialConfig;
1591
+ delete t._initialConfig, t.load(i);
1592
+ }
1593
+ }
1594
+ }
1595
+ })
1596
+ ),
1597
+ { name: "AnalysisBuilderStore" }
1598
+ )
1599
+ );
1600
+ }
1601
+ const Ve = vn(null);
1602
+ function Ji({
1603
+ children: n,
1604
+ initialQuery: r,
1605
+ initialChartConfig: e,
1606
+ disableLocalStorage: t,
1607
+ initialAnalysisType: i,
1608
+ initialFunnelState: s,
1609
+ initialFlowState: o,
1610
+ initialRetentionState: l,
1611
+ initialActiveView: d
1612
+ }) {
1613
+ const f = me(null);
1614
+ return f.current || (f.current = yi({
1615
+ initialQuery: r,
1616
+ initialChartConfig: e,
1617
+ disableLocalStorage: t,
1618
+ initialAnalysisType: i,
1619
+ initialFunnelState: s,
1620
+ initialFlowState: o,
1621
+ initialRetentionState: l,
1622
+ initialActiveView: d
1623
+ })), /* @__PURE__ */ Fn(Ve.Provider, { value: f.current, children: n });
1624
+ }
1625
+ function u(n) {
1626
+ const r = it(Ve);
1627
+ if (!r)
1628
+ throw new Error("useAnalysisBuilderStore must be used within AnalysisBuilderStoreProvider");
1629
+ return Qn(r, n);
1630
+ }
1631
+ function gi() {
1632
+ const n = it(Ve);
1633
+ if (!n)
1634
+ throw new Error("useAnalysisBuilderStoreApi must be used within AnalysisBuilderStoreProvider");
1635
+ return n;
1636
+ }
1637
+ const Ee = (n) => n.queryStates[n.activeQueryIndex] || Q(), Yi = (n) => Ee(n).metrics, Xi = (n) => Ee(n).breakdowns, Zi = (n) => Ee(n).filters, mi = (n) => {
1638
+ const r = n.charts[n.analysisType];
1639
+ return r ? {
1640
+ chartType: r.chartType,
1641
+ chartConfig: r.chartConfig,
1642
+ displayConfig: r.displayConfig
1643
+ } : {
1644
+ chartType: "bar",
1645
+ chartConfig: {},
1646
+ displayConfig: { showLegend: !0, showGrid: !0, showTooltip: !0 }
1647
+ };
1648
+ }, er = (n) => ({
1649
+ activeTab: n.activeTab,
1650
+ activeView: n.activeView,
1651
+ displayLimit: n.displayLimit,
1652
+ showFieldModal: n.showFieldModal,
1653
+ fieldModalMode: n.fieldModalMode
1654
+ }), tr = (n) => ({
1655
+ queryStates: n.queryStates,
1656
+ activeQueryIndex: n.activeQueryIndex,
1657
+ mergeStrategy: n.mergeStrategy,
1658
+ // Multi-query mode is when we have more than one query in 'query' analysis type
1659
+ isMultiQueryMode: n.analysisType === "query" && n.queryStates.length > 1
1660
+ }), nr = (n) => ({
1661
+ funnelCube: n.funnelCube,
1662
+ funnelSteps: n.funnelSteps,
1663
+ activeFunnelStepIndex: n.activeFunnelStepIndex,
1664
+ funnelTimeDimension: n.funnelTimeDimension,
1665
+ funnelBindingKey: n.funnelBindingKey,
1666
+ isFunnelMode: n.analysisType === "funnel",
1667
+ // Deprecated field kept for backward compat
1668
+ stepTimeToConvert: n.stepTimeToConvert
1669
+ });
1670
+ function Xe(n) {
1671
+ return n.timeDimensions || [];
1672
+ }
1673
+ function hi(n) {
1674
+ const r = [];
1675
+ if (n.length < 2) return r;
1676
+ const e = Xe(n[0]);
1677
+ if (e.length === 0) return r;
1678
+ for (let t = 1; t < n.length; t++) {
1679
+ const i = Xe(n[t]);
1680
+ if (i.length === 0 && e.length > 0) {
1681
+ r.push({
1682
+ type: "missing_time_dimension",
1683
+ queryIndex: t,
1684
+ message: `Query ${t + 1} is missing time dimension "${e[0].dimension}"`,
1685
+ details: { field: e[0].dimension }
1686
+ });
1687
+ continue;
1688
+ }
1689
+ for (const s of e) {
1690
+ const o = i.find((l) => l.dimension === s.dimension);
1691
+ o && o.granularity !== s.granularity && r.push({
1692
+ type: "granularity_mismatch",
1693
+ queryIndex: t,
1694
+ message: `Query ${t + 1} uses "${o.granularity}" granularity but Query 1 uses "${s.granularity}"`,
1695
+ details: {
1696
+ field: s.dimension,
1697
+ expectedGranularity: s.granularity,
1698
+ actualGranularity: o.granularity
1699
+ }
1700
+ });
1701
+ }
1702
+ }
1703
+ return r;
1704
+ }
1705
+ function pi(n, r) {
1706
+ const e = [];
1707
+ if (n.length < 2 || r.length === 0) return e;
1708
+ for (let t = 0; t < n.length; t++) {
1709
+ const i = n[t], s = /* @__PURE__ */ new Set([
1710
+ ...i.dimensions || [],
1711
+ ...i.timeDimensions?.map((o) => o.dimension) || []
1712
+ ]);
1713
+ for (const o of r)
1714
+ s.has(o) || e.push({
1715
+ type: "missing_merge_key",
1716
+ queryIndex: t,
1717
+ message: `Query ${t + 1} is missing merge dimension "${o}"`,
1718
+ details: { field: o }
1719
+ });
1720
+ }
1721
+ return e;
1722
+ }
1723
+ function Ci(n) {
1724
+ const r = [];
1725
+ if (n.length < 2) return r;
1726
+ const e = /* @__PURE__ */ new Map();
1727
+ n.forEach((s, o) => {
1728
+ s.measures?.forEach((l) => {
1729
+ e.has(l) || e.set(l, []), e.get(l).push(o);
1730
+ });
1731
+ });
1732
+ const t = [], i = /* @__PURE__ */ new Set();
1733
+ return e.forEach((s, o) => {
1734
+ s.length > 1 && (t.push(o), s.forEach((l) => i.add(l)));
1735
+ }), t.length > 0 && r.push({
1736
+ type: "measure_collision",
1737
+ queryIndices: Array.from(i).sort(),
1738
+ message: `Measure${t.length > 1 ? "s" : ""} "${t.join('", "')}" appear${t.length === 1 ? "s" : ""} in multiple queries - first value will be used`,
1739
+ affectedMeasures: t
1740
+ }), r;
1741
+ }
1742
+ function Si(n) {
1743
+ const r = [];
1744
+ if (n.length < 2) return r;
1745
+ const e = n.map((i) => i.timeDimensions?.[0]?.dateRange);
1746
+ return new Set(e.map((i) => JSON.stringify(i))).size > 1 && r.push({
1747
+ type: "asymmetric_date_range",
1748
+ queryIndices: n.map((i, s) => s),
1749
+ message: "Queries have different date ranges - some data points may be missing in merged results"
1750
+ }), r;
1751
+ }
1752
+ function wi(n, r, e = []) {
1753
+ const t = [], i = [];
1754
+ return n.length < 2 ? { isValid: !0, errors: t, warnings: i } : (i.push(...Ci(n)), i.push(...Si(n)), r === "merge" && (t.push(...hi(n)), e.length > 0 && t.push(...pi(n, e))), {
1755
+ isValid: t.length === 0,
1756
+ errors: t,
1757
+ warnings: i
1758
+ });
1759
+ }
1760
+ function ir(n) {
1761
+ return n.filter(
1762
+ (r) => (r.measures?.length || 0) + (r.dimensions?.length || 0) + (r.timeDimensions?.length || 0) > 0
1763
+ ).length >= 2;
1764
+ }
1765
+ function rr(n) {
1766
+ if (n.isValid && n.warnings.length === 0)
1767
+ return "Configuration is valid";
1768
+ const r = [];
1769
+ return n.errors.length > 0 && r.push(`${n.errors.length} error${n.errors.length > 1 ? "s" : ""}`), n.warnings.length > 0 && r.push(`${n.warnings.length} warning${n.warnings.length > 1 ? "s" : ""}`), r.join(", ");
1770
+ }
1771
+ function vi() {
1772
+ const n = u((m) => m.queryStates), r = u((m) => m.activeQueryIndex), e = u((m) => m.mergeStrategy), t = u((m) => m.setActiveQueryIndex), i = u((m) => m.setMergeStrategy), s = u((m) => m.addQuery), o = u((m) => m.removeQuery), l = u((m) => m.getCurrentState), d = u((m) => m.getMergeKeys), f = u((m) => m.isMultiQueryMode), y = l(), g = f(), c = d(), p = F(() => {
1773
+ const m = n[r] || y;
1774
+ return ge(m.metrics, m.breakdowns, m.filters, m.order);
1775
+ }, [n, r, y]), S = F(() => {
1776
+ const m = n[0]?.breakdowns || [];
1777
+ return n.map((D, B) => {
1778
+ const L = e === "merge" && B > 0 ? m : D.breakdowns;
1779
+ return ge(D.metrics, L, D.filters, D.order);
1780
+ });
1781
+ }, [n, e]), C = F(() => {
1782
+ if (n.length <= 1) return null;
1783
+ const m = S.filter((D) => D.measures && D.measures.length > 0 || D.dimensions && D.dimensions.length > 0 || D.timeDimensions && D.timeDimensions.length > 0);
1784
+ return m.length < 2 ? null : {
1785
+ queries: m,
1786
+ mergeStrategy: e,
1787
+ mergeKeys: c,
1788
+ queryLabels: m.map((D, B) => `Q${B + 1}`)
1789
+ };
1790
+ }, [S, n.length, e, c]), b = F(() => g ? wi(S, e, c || []) : null, [g, S, e, c]), w = F(() => p.measures && p.measures.length > 0 || p.dimensions && p.dimensions.length > 0 || p.timeDimensions && p.timeDimensions.length > 0, [p]);
1791
+ return {
1792
+ queryState: y,
1793
+ queryStates: n,
1794
+ activeQueryIndex: r,
1795
+ mergeStrategy: e,
1796
+ isMultiQueryMode: g,
1797
+ mergeKeys: c,
1798
+ currentQuery: p,
1799
+ allQueries: S,
1800
+ multiQueryConfig: C,
1801
+ multiQueryValidation: b,
1802
+ isValidQuery: w,
1803
+ // Actions
1804
+ setActiveQueryIndex: t,
1805
+ setMergeStrategy: i,
1806
+ addQuery: s,
1807
+ removeQuery: o
1808
+ };
1809
+ }
1810
+ function bi(n) {
1811
+ const { queryState: r, queryStates: e, isMultiQueryMode: t, mergeStrategy: i, activeQueryIndex: s } = n, o = F(() => {
1812
+ if (!t) return r.metrics;
1813
+ const f = /* @__PURE__ */ new Set(), y = [];
1814
+ for (let g = 0; g < e.length; g++) {
1815
+ const c = e[g];
1816
+ for (const p of c.metrics) {
1817
+ const S = `Q${g + 1}:${p.field}`;
1818
+ f.has(S) || (f.add(S), y.push({
1819
+ ...p,
1820
+ label: `${p.label} (Q${g + 1})`
1821
+ }));
1822
+ }
1823
+ }
1824
+ return y;
1825
+ }, [t, e, r.metrics]), l = F(() => {
1826
+ if (!t) return r.breakdowns;
1827
+ const f = /* @__PURE__ */ new Set(), y = [];
1828
+ for (const g of e)
1829
+ for (const c of g.breakdowns)
1830
+ f.has(c.field) || (f.add(c.field), y.push(c));
1831
+ return y;
1832
+ }, [t, e, r.breakdowns]), d = F(() => i === "merge" && s > 0 ? e[0]?.breakdowns || [] : r.breakdowns, [i, s, e, r.breakdowns]);
1833
+ return {
1834
+ combinedMetrics: o,
1835
+ combinedBreakdowns: l,
1836
+ effectiveBreakdowns: d
1837
+ };
1838
+ }
1839
+ function Di(n) {
1840
+ const {
1841
+ currentQuery: r,
1842
+ allQueries: e,
1843
+ multiQueryConfig: t,
1844
+ isMultiQueryMode: i,
1845
+ isValidQuery: s,
1846
+ initialData: o,
1847
+ // Unused - legacy mergeStrategy === 'funnel' is no longer supported
1848
+ funnelBindingKey: l,
1849
+ isFunnelModeEnabled: d,
1850
+ analysisType: f,
1851
+ serverFunnelQuery: y,
1852
+ serverFlowQuery: g,
1853
+ serverRetentionQuery: c,
1854
+ retentionValidation: p
1855
+ } = n, { getFieldLabel: S } = Dn(), C = f === "funnel" || d, b = f === "flow", w = f === "retention", m = f === "query" && i, D = f === "query" && !i, B = f === "funnel" && !!y, L = F(() => B || !C || !l || e.length < 2 ? null : $n(e, l), [B, C, l, e]), M = Kn(r, {
1856
+ skip: !s || !D,
1857
+ debounceMs: 300
1858
+ }), A = Ln(t, {
1859
+ skip: !t || !m,
1860
+ debounceMs: 300
1861
+ }), v = Vn(L, {
1862
+ skip: !C || !L && !y,
1863
+ debounceMs: 300,
1864
+ prebuiltServerQuery: B ? y : void 0
1865
+ }), h = En(g ?? null, {
1866
+ skip: !b || !g,
1867
+ debounceMs: 300
1868
+ }), T = Un(c ?? null, {
1869
+ skip: !w || !c,
1870
+ debounceMs: 300,
1871
+ getFieldLabel: S
1872
+ // Pass label resolver for human-readable binding key display
1873
+ }), U = Nn({
1874
+ queries: i ? e : [r],
1875
+ isMultiQueryMode: i,
1876
+ skip: !s || C || b || w
1877
+ }), W = Gn(
1878
+ v.serverQuery,
1879
+ { skip: !C || !v.serverQuery }
1880
+ ), he = On(
1881
+ h.serverQuery,
1882
+ { skip: !b || !h.serverQuery }
1883
+ ), te = Hn(
1884
+ c,
1885
+ { skip: !w || !c }
1886
+ ), $ = w ? T.isLoading || T.isDebouncing : b ? h.isLoading || h.isDebouncing : C ? v.isExecuting || v.isDebouncing : m ? A.isLoading : M.isLoading, G = w ? T.isFetching : b ? h.isFetching : C ? v.isExecuting : m ? A.isFetching : M.isFetching, N = w ? T.error : b ? h.error : C ? v.error : m ? A.error : M.error, z = !!(M.debouncedQuery || A.debouncedConfig || !v.isDebouncing || // Funnel has debounced when not debouncing
1887
+ !h.isDebouncing || // Flow has debounced when not debouncing
1888
+ !T.isDebouncing), J = E((R) => {
1889
+ w ? T.execute(R) : b ? h.refetch(R) : C ? v.execute(R) : m ? A.refetch(R) : M.refetch(R);
1890
+ }, [w, b, C, m, T, h, v, A, M]), Y = F(() => {
1891
+ const R = w ? T.chartData : b ? h.data : C ? v.chartData : m ? A.data : M.rawData;
1892
+ return o && o.length > 0 && !R ? "success" : s ? $ && !R ? "loading" : G && R ? "refreshing" : N ? "error" : R ? "success" : "idle" : "idle";
1893
+ }, [s, $, G, N, M.rawData, A.data, v.chartData, h.data, T.chartData, o, m, C, b, w]), X = F(() => w && T.chartData ? T.chartData.rows.map((R) => ({
1894
+ "Retention.period": `P${R.period}`,
1895
+ "Retention.rate": R.retentionRate,
1896
+ "Retention.retained": R.retainedUsers,
1897
+ "Retention.cohortSize": R.cohortSize,
1898
+ "Retention.segment": R.breakdownValue || "All Users"
1899
+ })) : b && h.data ? [h.data] : C && v.chartData ? v.chartData : m && A.data ? A.data : M.rawData ? M.rawData : o && o.length > 0 ? o : null, [M.rawData, A.data, v.chartData, h.data, T.chartData, o, m, C, b, w]), ne = F(() => C && v.stepResults ? v.stepResults.map((R) => R.data) : !m || !A.perQueryData ? null : A.perQueryData, [m, C, A.perQueryData, v.stepResults]), ie = C && v.executedQueries?.length > 0 ? v.executedQueries : null, re = C ? v.serverQuery : null, se = C ? W.debugData : null, ae = b ? h.serverQuery : null, oe = b ? h.data : null, le = b ? he.debugData : null, ue = w ? c ?? null : null, pe = w ? T.chartData : null, Ce = w ? te.debugData : null, Se = F(() => w ? T.needsRefresh : b ? h.needsRefresh : C ? v.needsRefresh : m ? !1 : M.needsRefresh, [w, b, C, m, T.needsRefresh, h.needsRefresh, v.needsRefresh, M.needsRefresh]);
1900
+ return {
1901
+ executionStatus: Y,
1902
+ executionResults: X,
1903
+ perQueryResults: ne,
1904
+ isLoading: $,
1905
+ isFetching: G,
1906
+ error: N,
1907
+ debugDataPerQuery: U.debugDataPerQuery,
1908
+ hasDebounced: z,
1909
+ refetch: J,
1910
+ funnelExecutedQueries: ie,
1911
+ funnelServerQuery: re,
1912
+ funnelDebugData: se,
1913
+ flowServerQuery: ae,
1914
+ flowChartData: oe,
1915
+ flowDebugData: le,
1916
+ retentionServerQuery: ue,
1917
+ retentionChartData: pe,
1918
+ retentionDebugData: Ce,
1919
+ retentionValidation: p ?? null,
1920
+ needsRefresh: Se
1921
+ };
1922
+ }
1923
+ function ft(n) {
1924
+ return n.isTimeDimension;
1925
+ }
1926
+ function Ti(n) {
1927
+ return n.find(ft);
1928
+ }
1929
+ function Fi(n) {
1930
+ return n.find((r) => !r.isTimeDimension);
1931
+ }
1932
+ function Ue(n) {
1933
+ return n.filter((r) => !r.isTimeDimension);
1934
+ }
1935
+ function yt(n) {
1936
+ return n.filter(ft);
1937
+ }
1938
+ function Pe(n, r, e) {
1939
+ const t = r.length, i = Ue(e).length, s = yt(e).length, o = e.length;
1940
+ switch (n) {
1941
+ // Always available charts
1942
+ case "table":
1943
+ case "markdown":
1944
+ return { available: !0 };
1945
+ // Measure-only charts (KPI Number, KPI Text)
1946
+ case "kpiNumber":
1947
+ case "kpiText":
1948
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : { available: !0 };
1949
+ // Bar chart - needs dimension for categories + measure for values
1950
+ case "bar":
1951
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : o < 1 ? { available: !1, reason: "Requires at least 1 breakdown for categories" } : { available: !0 };
1952
+ // KPI Delta - needs dimension for ordering + measure for values
1953
+ case "kpiDelta":
1954
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : o < 1 ? { available: !1, reason: "Requires at least 1 breakdown for ordering" } : { available: !0 };
1955
+ // Line and area charts - need dimension/time + measure
1956
+ case "line":
1957
+ case "area":
1958
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : o < 1 ? { available: !1, reason: "Requires a breakdown (dimension or time)" } : { available: !0 };
1959
+ // Pie chart - needs dimension (not time) + measure
1960
+ case "pie":
1961
+ return t < 1 ? { available: !1, reason: "Requires 1 measure" } : i < 1 ? { available: !1, reason: "Requires 1 dimension (not time dimension)" } : { available: !0 };
1962
+ // Scatter - needs measure + any breakdown
1963
+ case "scatter":
1964
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : t < 2 && o < 1 ? { available: !1, reason: "Requires 2 measures or 1 measure + 1 breakdown" } : { available: !0 };
1965
+ // Bubble - needs 2+ measures and 1+ breakdown (dimension or time dimension for series)
1966
+ case "bubble":
1967
+ return t < 2 ? { available: !1, reason: "Requires at least 2 measures" } : o < 1 ? { available: !1, reason: "Requires at least 1 breakdown for series grouping" } : { available: !0 };
1968
+ // Radar - needs dimension + measure
1969
+ case "radar":
1970
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : i < 1 ? { available: !1, reason: "Requires at least 1 dimension" } : { available: !0 };
1971
+ // Radial Bar - needs dimension + measure
1972
+ case "radialBar":
1973
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : i < 1 ? { available: !1, reason: "Requires at least 1 dimension" } : { available: !0 };
1974
+ // Treemap - needs dimension + measure
1975
+ case "treemap":
1976
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : i < 1 ? { available: !1, reason: "Requires at least 1 dimension" } : { available: !0 };
1977
+ // Activity Grid - needs time dimension + measure
1978
+ case "activityGrid":
1979
+ return t < 1 ? { available: !1, reason: "Requires at least 1 measure" } : s < 1 ? { available: !1, reason: "Requires a time dimension" } : { available: !0 };
1980
+ default:
1981
+ return { available: !0 };
1982
+ }
1983
+ }
1984
+ function Qi(n, r) {
1985
+ const e = [
1986
+ "activityGrid",
1987
+ "area",
1988
+ "bar",
1989
+ "bubble",
1990
+ "kpiDelta",
1991
+ "kpiNumber",
1992
+ "kpiText",
1993
+ "line",
1994
+ "markdown",
1995
+ "pie",
1996
+ "radar",
1997
+ "radialBar",
1998
+ "scatter",
1999
+ "table",
2000
+ "treemap"
2001
+ ], t = {};
2002
+ for (const i of e)
2003
+ t[i] = Pe(i, n, r);
2004
+ return t;
2005
+ }
2006
+ function gt(n, r, e) {
2007
+ if (Pe(e, n, r).available || n.length === 0 && r.length === 0)
2008
+ return e;
2009
+ const i = yt(r).length > 0, s = Ue(r).length > 0, o = n.length > 0;
2010
+ return i && o ? "line" : s && o ? "bar" : o && !s && !i ? "kpiNumber" : "table";
2011
+ }
2012
+ function Me(n, r, e) {
2013
+ const t = gt(n, r, e), i = Ai(t, n, r);
2014
+ return { chartType: t, chartConfig: i };
2015
+ }
2016
+ function Ai(n, r, e) {
2017
+ const t = Ti(e), i = Fi(e), s = Ue(e), o = e;
2018
+ switch (n) {
2019
+ case "line":
2020
+ case "area":
2021
+ return {
2022
+ xAxis: t ? [t.field] : i ? [i.field] : [],
2023
+ yAxis: r.map((l) => l.field),
2024
+ series: s.length > 1 ? [s[1].field] : i && t ? [i.field] : []
2025
+ };
2026
+ case "bar":
2027
+ return {
2028
+ xAxis: i ? [i.field] : t ? [t.field] : [],
2029
+ yAxis: r.map((l) => l.field),
2030
+ series: s.length > 1 ? [s[1].field] : t && i ? [t.field] : []
2031
+ };
2032
+ case "pie":
2033
+ return {
2034
+ xAxis: i ? [i.field] : [],
2035
+ yAxis: r.length > 0 ? [r[0].field] : []
2036
+ };
2037
+ case "scatter":
2038
+ return r.length >= 2 ? {
2039
+ xAxis: [r[0].field],
2040
+ yAxis: [r[1].field],
2041
+ series: i ? [i.field] : []
2042
+ } : {
2043
+ xAxis: o.length > 0 ? [o[0].field] : [],
2044
+ yAxis: r.length > 0 ? [r[0].field] : [],
2045
+ series: s.length > 1 ? [s[1].field] : []
2046
+ };
2047
+ case "bubble":
2048
+ return {
2049
+ xAxis: r.length > 0 ? [r[0].field] : [],
2050
+ yAxis: r.length > 1 ? [r[1].field] : [],
2051
+ sizeField: r.length > 2 ? r[2].field : r.length > 1 ? r[1].field : void 0,
2052
+ series: i ? [i.field] : t ? [t.field] : []
2053
+ };
2054
+ case "radar":
2055
+ case "radialBar":
2056
+ case "treemap":
2057
+ return {
2058
+ xAxis: i ? [i.field] : [],
2059
+ yAxis: r.length > 0 ? [r[0].field] : []
2060
+ };
2061
+ case "activityGrid":
2062
+ return {
2063
+ dateField: t ? [t.field] : [],
2064
+ valueField: r.length > 0 ? [r[0].field] : []
2065
+ };
2066
+ case "kpiNumber":
2067
+ case "kpiDelta":
2068
+ case "kpiText":
2069
+ return {
2070
+ yAxis: r.length > 0 ? [r[0].field] : []
2071
+ };
2072
+ case "table":
2073
+ return {
2074
+ xAxis: [
2075
+ ...e.map((l) => l.field),
2076
+ ...r.map((l) => l.field)
2077
+ ]
2078
+ };
2079
+ case "markdown":
2080
+ return {};
2081
+ default:
2082
+ return {
2083
+ xAxis: o.length > 0 ? [o[0].field] : [],
2084
+ yAxis: r.map((l) => l.field)
2085
+ };
2086
+ }
2087
+ }
2088
+ function Ri(n, r, e, t) {
2089
+ if (t && Pe(e, n, r).available)
2090
+ return null;
2091
+ const i = gt(n, r, e);
2092
+ return i !== e ? i : null;
2093
+ }
2094
+ function Mi(n) {
2095
+ const { externalColorPalette: r, combinedMetrics: e, combinedBreakdowns: t, hasDebounced: i } = n, s = u((h) => h.analysisType), { chartType: o, chartConfig: l, displayConfig: d } = u(Rn(mi)), f = u((h) => h.userManuallySelectedChart), y = u((h) => h.localPaletteName), g = u((h) => h.setChartTypeManual), c = u((h) => h.setChartConfig), p = u((h) => h.setDisplayConfig), S = u((h) => h.setFunnelChartType), C = u((h) => h.setFunnelChartConfig), b = u((h) => h.setFunnelDisplayConfig), w = u((h) => h.setLocalPaletteName), m = u((h) => h.setUserManuallySelectedChart), D = E(
2096
+ (h) => {
2097
+ if (s === "funnel")
2098
+ S(h);
2099
+ else {
2100
+ g(h);
2101
+ const { chartConfig: T } = Me(
2102
+ e,
2103
+ t,
2104
+ h
2105
+ );
2106
+ c(T);
2107
+ }
2108
+ },
2109
+ [
2110
+ s,
2111
+ e,
2112
+ t,
2113
+ S,
2114
+ g,
2115
+ c
2116
+ ]
2117
+ ), B = E(
2118
+ (h) => {
2119
+ s === "funnel" ? C(h) : c(h);
2120
+ },
2121
+ [s, C, c]
2122
+ ), L = E(
2123
+ (h) => {
2124
+ s === "funnel" ? b(h) : p(h);
2125
+ },
2126
+ [s, b, p]
2127
+ ), M = F(
2128
+ () => Qi(e, t),
2129
+ [e, t]
2130
+ ), A = F(() => r ? Array.isArray(r) && typeof r[0] == "string" ? {
2131
+ name: "custom",
2132
+ label: "Custom",
2133
+ colors: r,
2134
+ gradient: r
2135
+ } : r : Pn(y), [r, y]), v = me("");
2136
+ return fe(() => {
2137
+ if (!i || e.length === 0 && t.length === 0) return;
2138
+ const h = JSON.stringify({
2139
+ metrics: e.map((U) => U.field),
2140
+ breakdowns: t.map((U) => ({ field: U.field, isTime: U.isTimeDimension }))
2141
+ });
2142
+ if (h === v.current) return;
2143
+ v.current = h;
2144
+ const T = Ri(
2145
+ e,
2146
+ t,
2147
+ o,
2148
+ f
2149
+ );
2150
+ if (T) {
2151
+ const { chartConfig: U } = Me(
2152
+ e,
2153
+ t,
2154
+ T
2155
+ );
2156
+ D(T), B(U), m(!1);
2157
+ } else if ((e.length > 0 || t.length > 0) && !l.xAxis?.length && !l.yAxis?.length && !l.series?.length) {
2158
+ const { chartConfig: W } = Me(
2159
+ e,
2160
+ t,
2161
+ o
2162
+ );
2163
+ B(W);
2164
+ }
2165
+ }, [
2166
+ i,
2167
+ e,
2168
+ t,
2169
+ o,
2170
+ f,
2171
+ l,
2172
+ D,
2173
+ B,
2174
+ m
2175
+ ]), {
2176
+ chartType: o,
2177
+ chartConfig: l,
2178
+ displayConfig: d,
2179
+ colorPalette: A,
2180
+ localPaletteName: y,
2181
+ chartAvailability: M,
2182
+ userManuallySelectedChart: f,
2183
+ // Actions - mode-aware setters route to appropriate store fields
2184
+ setChartType: D,
2185
+ setChartConfig: B,
2186
+ setDisplayConfig: L,
2187
+ setLocalPaletteName: w
2188
+ };
2189
+ }
2190
+ function xi() {
2191
+ const n = u((c) => c.activeTab), r = u((c) => c.activeView), e = u((c) => c.displayLimit), t = u((c) => c.showFieldModal), i = u((c) => c.fieldModalMode), s = u((c) => c.userManuallySelectedChart), o = u((c) => c.setActiveTab), l = u((c) => c.setActiveView), d = u((c) => c.setDisplayLimit), f = u((c) => c.closeFieldModal), [y, g] = bn(0);
2192
+ return {
2193
+ // State
2194
+ activeTab: n,
2195
+ activeView: r,
2196
+ displayLimit: e,
2197
+ showFieldModal: t,
2198
+ fieldModalMode: i,
2199
+ activeTableIndex: y,
2200
+ userManuallySelectedChart: s,
2201
+ // Actions
2202
+ setActiveTab: o,
2203
+ setActiveView: l,
2204
+ setDisplayLimit: d,
2205
+ closeFieldModal: f,
2206
+ setActiveTableIndex: g
2207
+ };
2208
+ }
2209
+ const Ze = 1800, et = "share=";
2210
+ function tt(n) {
2211
+ const r = JSON.stringify(n);
2212
+ return rt.compressToEncodedURIComponent(r);
2213
+ }
2214
+ function qi(n) {
2215
+ try {
2216
+ const r = rt.decompressFromEncodedURIComponent(n);
2217
+ if (!r) return null;
2218
+ const e = JSON.parse(r);
2219
+ return st(e) ? e : (console.warn("[shareUtils] Invalid AnalysisConfig in share URL"), null);
2220
+ } catch {
2221
+ return null;
2222
+ }
2223
+ }
2224
+ function sr(n) {
2225
+ const r = tt(n);
2226
+ if (r.length <= Ze)
2227
+ return { encoded: r, queryOnly: !1 };
2228
+ const e = {
2229
+ version: n.version,
2230
+ analysisType: n.analysisType,
2231
+ activeView: n.activeView,
2232
+ charts: {},
2233
+ // Drop chart config to save space
2234
+ query: n.query
2235
+ }, t = tt(e);
2236
+ return t.length <= Ze ? { encoded: t, queryOnly: !0 } : { encoded: null, queryOnly: !0 };
2237
+ }
2238
+ function ki() {
2239
+ if (typeof window > "u") return null;
2240
+ const n = window.location.hash;
2241
+ return !n || !n.startsWith(`#${et}`) ? null : n.slice(et.length + 1);
2242
+ }
2243
+ function Bi() {
2244
+ if (typeof window > "u") return;
2245
+ const n = new URL(window.location.href);
2246
+ n.hash = "", window.history.replaceState(null, "", n.toString());
2247
+ }
2248
+ function Ii() {
2249
+ const n = ki();
2250
+ return n ? qi(n) : null;
2251
+ }
2252
+ function Vi(n) {
2253
+ const {
2254
+ currentQuery: r,
2255
+ isValidQuery: e,
2256
+ chartType: t,
2257
+ chartConfig: i,
2258
+ displayConfig: s,
2259
+ onQueryChange: o,
2260
+ onChartConfigChange: l
2261
+ } = n, d = u((y) => y.load), f = me(!1);
2262
+ fe(() => {
2263
+ if (f.current) return;
2264
+ f.current = !0;
2265
+ const y = Ii();
2266
+ y && (d(y), Bi());
2267
+ }, [d]), fe(() => {
2268
+ o && e && o(r);
2269
+ }, [r, e, o]), fe(() => {
2270
+ l && l({
2271
+ chartType: t,
2272
+ chartConfig: i,
2273
+ displayConfig: s
2274
+ });
2275
+ }, [t, i, s, l]);
2276
+ }
2277
+ function ar(n = {}) {
2278
+ const { initialData: r, externalColorPalette: e, onQueryChange: t, onChartConfigChange: i } = n, { features: s } = Tn(), o = gi(), l = vi(), d = bi({
2279
+ queryState: l.queryState,
2280
+ queryStates: l.queryStates,
2281
+ isMultiQueryMode: l.isMultiQueryMode,
2282
+ mergeStrategy: l.mergeStrategy,
2283
+ activeQueryIndex: l.activeQueryIndex
2284
+ }), f = u((a) => a.funnelBindingKey), y = u((a) => a.analysisType), g = u((a) => a.funnelCube), c = u((a) => a.funnelSteps), p = u((a) => a.activeFunnelStepIndex), S = u((a) => a.funnelTimeDimension), C = F(() => y !== "funnel" || !f?.dimension || !S || !c || c.length < 2 ? !1 : c.every((a) => a.filters.length > 0), [y, f, S, c]), b = u((a) => a.charts.funnel?.chartType) || "funnel", w = u((a) => a.charts.funnel?.chartConfig), m = F(() => w || {}, [w]), D = u((a) => a.flowCube), B = u((a) => a.flowBindingKey), L = u((a) => a.flowTimeDimension), M = u((a) => a.eventDimension), A = u((a) => a.startingStep), v = u((a) => a.stepsBefore), h = u((a) => a.stepsAfter), T = u((a) => a.joinStrategy), U = u((a) => a.charts.flow?.displayConfig), W = F(
2285
+ () => U || { showLegend: !0, showGrid: !0, showTooltip: !0 },
2286
+ [U]
2287
+ ), he = u((a) => a.charts.flow?.chartType) || "sankey", te = u((a) => a.buildFunnelQueryFromSteps), $ = F(() => y !== "funnel" ? null : te(), [y, te, c]), G = u((a) => a.buildFlowQuery), N = F(() => y !== "flow" ? null : G(), [y, G, D, B, L, M, A, v, h, he, T]), z = u((a) => a.retentionCube), J = u((a) => a.retentionBindingKey), Y = u((a) => a.retentionTimeDimension), X = u((a) => a.retentionDateRange), ne = u((a) => a.retentionCohortFilters), ie = u((a) => a.retentionActivityFilters), re = u((a) => a.retentionBreakdowns), se = u((a) => a.retentionViewGranularity), ae = u((a) => a.retentionPeriods), oe = u((a) => a.retentionType), le = u((a) => a.buildRetentionQuery), ue = u((a) => a.getRetentionValidation), pe = u((a) => a.charts.retention?.displayConfig), Ce = u((a) => a.setRetentionCube), Se = u((a) => a.setRetentionBindingKey), R = u((a) => a.setRetentionTimeDimension), mt = u((a) => a.setRetentionDateRange), ht = u((a) => a.setRetentionCohortFilters), pt = u((a) => a.setRetentionActivityFilters), Ct = u((a) => a.setRetentionBreakdowns), we = u((a) => a.addRetentionBreakdown), St = u((a) => a.removeRetentionBreakdown), wt = u((a) => a.setRetentionViewGranularity), vt = u((a) => a.setRetentionPeriods), bt = u((a) => a.setRetentionType), ve = F(() => y !== "retention" ? null : le(), [
2288
+ y,
2289
+ le,
2290
+ z,
2291
+ J,
2292
+ Y,
2293
+ X,
2294
+ re,
2295
+ se,
2296
+ ae,
2297
+ oe,
2298
+ ne,
2299
+ ie
2300
+ ]), Dt = F(() => y !== "retention" ? null : ue(), [
2301
+ y,
2302
+ ue,
2303
+ z,
2304
+ J,
2305
+ Y,
2306
+ X
2307
+ ]), be = F(() => y === "retention" ? ve !== null : y === "flow" ? N !== null : y === "funnel" ? $ !== null : l.isValidQuery ?? !1, [y, ve, N, $, l.isValidQuery]), x = Di({
2308
+ currentQuery: l.currentQuery,
2309
+ allQueries: l.allQueries,
2310
+ multiQueryConfig: l.multiQueryConfig,
2311
+ isMultiQueryMode: l.isMultiQueryMode,
2312
+ isValidQuery: be,
2313
+ initialData: r,
2314
+ funnelBindingKey: f,
2315
+ isFunnelModeEnabled: C,
2316
+ // New: pass analysisType and serverFunnelQuery for explicit mode routing
2317
+ analysisType: y,
2318
+ serverFunnelQuery: $,
2319
+ // Flow mode: pass serverFlowQuery
2320
+ serverFlowQuery: N,
2321
+ // Retention mode: pass serverRetentionQuery
2322
+ serverRetentionQuery: ve,
2323
+ // Retention mode: pass validation for debug panel
2324
+ retentionValidation: Dt
2325
+ }), q = Mi({
2326
+ externalColorPalette: e,
2327
+ combinedMetrics: d.combinedMetrics,
2328
+ combinedBreakdowns: d.combinedBreakdowns,
2329
+ hasDebounced: x.hasDebounced
2330
+ }), I = xi();
2331
+ Vi({
2332
+ currentQuery: l.currentQuery,
2333
+ isValidQuery: l.isValidQuery ?? !1,
2334
+ chartType: q.chartType,
2335
+ chartConfig: q.chartConfig,
2336
+ displayConfig: q.displayConfig,
2337
+ onQueryChange: t,
2338
+ onChartConfigChange: i
2339
+ });
2340
+ const Tt = u((a) => a.openMetricsModal), Ft = u((a) => a.addMetric), Qt = u((a) => a.removeMetric), De = u((a) => a.toggleMetric), At = u((a) => a.reorderMetrics), Rt = u((a) => a.openBreakdownsModal), Mt = u((a) => a.addBreakdown), xt = u((a) => a.removeBreakdown), Te = u((a) => a.toggleBreakdown), qt = u((a) => a.setBreakdownGranularity), kt = u((a) => a.toggleBreakdownComparison), Bt = u((a) => a.reorderBreakdowns), It = u((a) => a.setFilters), Vt = u((a) => a.dropFieldToFilter), Et = u((a) => a.setOrder), Ut = u((a) => a.clearQuery), Pt = u((a) => a.clearCurrentMode), _t = u((a) => a.setFunnelBindingKey), Kt = u((a) => a.setAnalysisType), Lt = u((a) => a.setFunnelCube), $t = u((a) => a.addFunnelStep), Nt = u((a) => a.removeFunnelStep), Gt = u((a) => a.updateFunnelStep), Ot = u((a) => a.setActiveFunnelStepIndex), Ht = u((a) => a.reorderFunnelSteps), jt = u((a) => a.setFunnelTimeDimension), _e = u((a) => a.charts.funnel?.displayConfig), Wt = F(
2341
+ () => _e || { showLegend: !0, showGrid: !0, showTooltip: !0 },
2342
+ [_e]
2343
+ ), zt = u((a) => a.setFunnelDisplayConfig), Jt = u((a) => a.setFlowCube), Yt = u((a) => a.setFlowBindingKey), Xt = u((a) => a.setFlowTimeDimension), Zt = u((a) => a.setEventDimension), en = u((a) => a.setStartingStepName), tn = u((a) => a.setStartingStepFilters), nn = u((a) => a.setStepsBefore), rn = u((a) => a.setStepsAfter), sn = u((a) => a.setJoinStrategy), an = E(
2344
+ (a) => {
2345
+ o.setState((k) => ({
2346
+ charts: {
2347
+ ...k.charts,
2348
+ flow: {
2349
+ ...k.charts.flow || { chartType: "sankey", chartConfig: {}, displayConfig: {} },
2350
+ displayConfig: a
2351
+ }
2352
+ }
2353
+ }));
2354
+ },
2355
+ [o]
2356
+ ), on = E(
2357
+ (a) => {
2358
+ o.setState((k) => ({
2359
+ charts: {
2360
+ ...k.charts,
2361
+ retention: {
2362
+ ...k.charts.retention || { chartType: "retentionCombined", chartConfig: {}, displayConfig: {} },
2363
+ displayConfig: a
2364
+ }
2365
+ }
2366
+ }));
2367
+ },
2368
+ [o]
2369
+ ), Z = u((a) => a.aiState), ln = u((a) => a.openAI), ee = u((a) => a.closeAI), un = u((a) => a.setAIPrompt), Fe = u((a) => a.setAIGenerating), Qe = u((a) => a.setAIError), ce = u((a) => a.setAIHasGeneratedQuery), Ke = u((a) => a.saveAIPreviousState), Le = u((a) => a.restoreAIPreviousState), Ae = me("idle"), cn = be, $e = u((a) => a.getValidation), dn = F(
2370
+ () => $e(),
2371
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2372
+ [
2373
+ $e,
2374
+ l.queryStates,
2375
+ y,
2376
+ // Funnel deps
2377
+ c,
2378
+ f,
2379
+ S,
2380
+ // Flow deps
2381
+ D,
2382
+ B,
2383
+ L,
2384
+ M,
2385
+ A,
2386
+ v,
2387
+ h,
2388
+ T
2389
+ ]
2390
+ ), fn = E(
2391
+ (a, k, Ne, wn) => {
2392
+ I.fieldModalMode === "metrics" && k === "measure" ? De(a.name) : I.fieldModalMode === "breakdown" && (y === "retention" && k === "dimension" ? we({ field: a.name }) : Te(a.name, k === "timeDimension")), wn || I.closeFieldModal();
2393
+ },
2394
+ [I, De, Te, we, y]
2395
+ ), yn = E(async () => {
2396
+ if (s?.aiEndpoint) {
2397
+ Ke(), Fe(!0), Qe(null);
2398
+ try {
2399
+ await new Promise((a) => setTimeout(a, 1e3)), ce(!0);
2400
+ } catch (a) {
2401
+ Qe(a instanceof Error ? a.message : "Failed to generate query");
2402
+ } finally {
2403
+ Fe(!1);
2404
+ }
2405
+ }
2406
+ }, [s?.aiEndpoint, Ke, Fe, Qe, ce]), gn = E(() => {
2407
+ ee(), ce(!1);
2408
+ }, [ee, ce]), mn = E(() => {
2409
+ Le(), ee();
2410
+ }, [Le, ee]), hn = E(async () => {
2411
+ Ae.current = "copied", setTimeout(() => {
2412
+ Ae.current = "idle";
2413
+ }, 2e3);
2414
+ }, []), pn = E(() => {
2415
+ const a = o.getState();
2416
+ if (a.analysisType === "funnel") {
2417
+ const k = a.buildFunnelQueryFromSteps();
2418
+ return k || a.buildCurrentQuery();
2419
+ }
2420
+ return a.queryStates.length > 1 ? {
2421
+ queries: a.buildAllQueries(),
2422
+ mergeStrategy: a.mergeStrategy,
2423
+ mergeKeys: a.getMergeKeys(),
2424
+ queryLabels: a.queryStates.map((k, Ne) => `Q${Ne + 1}`),
2425
+ // Include funnel-specific config when in funnel mode
2426
+ funnelBindingKey: a.funnelBindingKey,
2427
+ stepTimeToConvert: a.stepTimeToConvert
2428
+ } : a.buildCurrentQuery();
2429
+ }, [o]), Cn = E(() => {
2430
+ const a = o.getState(), k = a.charts[a.analysisType];
2431
+ return k ? {
2432
+ chartType: k.chartType,
2433
+ chartConfig: k.chartConfig,
2434
+ displayConfig: k.displayConfig
2435
+ } : {
2436
+ chartType: q.chartType,
2437
+ chartConfig: q.chartConfig,
2438
+ displayConfig: q.displayConfig
2439
+ };
2440
+ }, [o, q.chartType, q.chartConfig, q.displayConfig]), Sn = E(() => o.getState().analysisType, [o]);
2441
+ return {
2442
+ // Query state (from queryBuilder)
2443
+ queryState: l.queryState,
2444
+ queryStates: l.queryStates,
2445
+ activeQueryIndex: l.activeQueryIndex,
2446
+ mergeStrategy: l.mergeStrategy,
2447
+ isMultiQueryMode: l.isMultiQueryMode,
2448
+ mergeKeys: l.mergeKeys,
2449
+ currentQuery: l.currentQuery,
2450
+ allQueries: l.allQueries,
2451
+ multiQueryConfig: l.multiQueryConfig,
2452
+ multiQueryValidation: l.multiQueryValidation,
2453
+ // Funnel state (legacy)
2454
+ funnelBindingKey: f,
2455
+ isFunnelModeEnabled: C,
2456
+ // Analysis Type state (new)
2457
+ analysisType: y,
2458
+ funnelCube: g,
2459
+ funnelSteps: c,
2460
+ activeFunnelStepIndex: p,
2461
+ funnelTimeDimension: S,
2462
+ funnelChartType: b,
2463
+ funnelChartConfig: m,
2464
+ funnelDisplayConfig: Wt,
2465
+ // Flow state (new)
2466
+ flowCube: D,
2467
+ flowBindingKey: B,
2468
+ flowTimeDimension: L,
2469
+ eventDimension: M,
2470
+ startingStep: A,
2471
+ stepsBefore: v,
2472
+ stepsAfter: h,
2473
+ joinStrategy: T,
2474
+ flowDisplayConfig: W,
2475
+ // Retention state (simplified Mixpanel-style)
2476
+ retentionCube: z,
2477
+ retentionBindingKey: J,
2478
+ retentionTimeDimension: Y,
2479
+ retentionDateRange: X,
2480
+ retentionCohortFilters: ne,
2481
+ retentionActivityFilters: ie,
2482
+ retentionBreakdowns: re,
2483
+ retentionViewGranularity: se,
2484
+ retentionPeriods: ae,
2485
+ retentionType: oe,
2486
+ retentionDisplayConfig: pe,
2487
+ // Data fetching (from queryExecution)
2488
+ executionStatus: x.executionStatus,
2489
+ executionResults: x.executionResults,
2490
+ perQueryResults: x.perQueryResults,
2491
+ isLoading: x.isLoading,
2492
+ isFetching: x.isFetching,
2493
+ error: x.error,
2494
+ isValidQuery: be,
2495
+ debugDataPerQuery: x.debugDataPerQuery,
2496
+ needsRefresh: x.needsRefresh,
2497
+ funnelExecutedQueries: x.funnelExecutedQueries,
2498
+ funnelServerQuery: x.funnelServerQuery,
2499
+ funnelDebugData: x.funnelDebugData,
2500
+ flowServerQuery: x.flowServerQuery,
2501
+ flowDebugData: x.flowDebugData,
2502
+ retentionServerQuery: x.retentionServerQuery,
2503
+ retentionDebugData: x.retentionDebugData,
2504
+ retentionChartData: x.retentionChartData,
2505
+ retentionValidation: x.retentionValidation,
2506
+ // Chart configuration (from chartDefaults)
2507
+ // Note: Funnel chart type is determined by analysisType === 'funnel', not mergeStrategy
2508
+ chartType: q.chartType,
2509
+ chartConfig: q.chartConfig,
2510
+ displayConfig: q.displayConfig,
2511
+ colorPalette: q.colorPalette,
2512
+ localPaletteName: q.localPaletteName,
2513
+ chartAvailability: q.chartAvailability,
2514
+ combinedMetrics: d.combinedMetrics,
2515
+ combinedBreakdowns: d.combinedBreakdowns,
2516
+ effectiveBreakdowns: d.effectiveBreakdowns,
2517
+ // UI state (from uiState)
2518
+ activeTab: I.activeTab,
2519
+ activeView: I.activeView,
2520
+ displayLimit: I.displayLimit,
2521
+ showFieldModal: I.showFieldModal,
2522
+ fieldModalMode: I.fieldModalMode,
2523
+ activeTableIndex: I.activeTableIndex,
2524
+ userManuallySelectedChart: I.userManuallySelectedChart,
2525
+ // AI state
2526
+ aiState: {
2527
+ isOpen: Z.isOpen,
2528
+ userPrompt: Z.userPrompt,
2529
+ isGenerating: Z.isGenerating,
2530
+ error: Z.error,
2531
+ hasGeneratedQuery: Z.hasGeneratedQuery
2532
+ },
2533
+ // Share state
2534
+ shareButtonState: Ae.current,
2535
+ canShare: cn,
2536
+ // Adapter validation (NEW - Phase 5)
2537
+ adapterValidation: dn,
2538
+ // Actions
2539
+ actions: {
2540
+ // Query state (from queryBuilder)
2541
+ setActiveQueryIndex: l.setActiveQueryIndex,
2542
+ setMergeStrategy: l.setMergeStrategy,
2543
+ // Metrics
2544
+ openMetricsModal: Tt,
2545
+ addMetric: Ft,
2546
+ removeMetric: Qt,
2547
+ toggleMetric: De,
2548
+ reorderMetrics: At,
2549
+ // Breakdowns
2550
+ openBreakdownsModal: Rt,
2551
+ addBreakdown: Mt,
2552
+ removeBreakdown: xt,
2553
+ toggleBreakdown: Te,
2554
+ setBreakdownGranularity: qt,
2555
+ toggleBreakdownComparison: kt,
2556
+ reorderBreakdowns: Bt,
2557
+ // Filters
2558
+ setFilters: It,
2559
+ dropFieldToFilter: Vt,
2560
+ setOrder: Et,
2561
+ // Multi-query (from queryBuilder)
2562
+ addQuery: l.addQuery,
2563
+ removeQuery: l.removeQuery,
2564
+ // Funnel (legacy)
2565
+ setFunnelBindingKey: _t,
2566
+ // Analysis Type (new)
2567
+ setAnalysisType: Kt,
2568
+ // Funnel Mode (new dedicated state)
2569
+ setFunnelCube: Lt,
2570
+ addFunnelStep: $t,
2571
+ removeFunnelStep: Nt,
2572
+ updateFunnelStep: Gt,
2573
+ setActiveFunnelStepIndex: Ot,
2574
+ reorderFunnelSteps: Ht,
2575
+ setFunnelTimeDimension: jt,
2576
+ setFunnelDisplayConfig: zt,
2577
+ // Flow Mode actions
2578
+ setFlowCube: Jt,
2579
+ setFlowBindingKey: Yt,
2580
+ setFlowTimeDimension: Xt,
2581
+ setEventDimension: Zt,
2582
+ setStartingStepName: en,
2583
+ setStartingStepFilters: tn,
2584
+ setStepsBefore: nn,
2585
+ setStepsAfter: rn,
2586
+ setJoinStrategy: sn,
2587
+ setFlowDisplayConfig: an,
2588
+ // Retention Mode actions (simplified Mixpanel-style)
2589
+ setRetentionCube: Ce,
2590
+ setRetentionBindingKey: Se,
2591
+ setRetentionTimeDimension: R,
2592
+ setRetentionDateRange: mt,
2593
+ setRetentionCohortFilters: ht,
2594
+ setRetentionActivityFilters: pt,
2595
+ setRetentionBreakdowns: Ct,
2596
+ addRetentionBreakdown: we,
2597
+ removeRetentionBreakdown: St,
2598
+ setRetentionViewGranularity: wt,
2599
+ setRetentionPeriods: vt,
2600
+ setRetentionType: bt,
2601
+ setRetentionDisplayConfig: on,
2602
+ // Chart (from chartDefaults)
2603
+ setChartType: q.setChartType,
2604
+ setChartConfig: q.setChartConfig,
2605
+ setDisplayConfig: q.setDisplayConfig,
2606
+ setLocalPaletteName: q.setLocalPaletteName,
2607
+ // UI (from uiState)
2608
+ setActiveTab: I.setActiveTab,
2609
+ setActiveView: I.setActiveView,
2610
+ setDisplayLimit: I.setDisplayLimit,
2611
+ closeFieldModal: I.closeFieldModal,
2612
+ setActiveTableIndex: I.setActiveTableIndex,
2613
+ // AI
2614
+ openAI: ln,
2615
+ closeAI: ee,
2616
+ setAIPrompt: un,
2617
+ generateAI: yn,
2618
+ acceptAI: gn,
2619
+ cancelAI: mn,
2620
+ // Share
2621
+ share: hn,
2622
+ // Utility
2623
+ clearQuery: Ut,
2624
+ clearCurrentMode: Pt,
2625
+ refetch: x.refetch,
2626
+ handleFieldSelected: fn
2627
+ },
2628
+ // Refs
2629
+ getQueryConfig: pn,
2630
+ getChartConfig: Cn,
2631
+ getAnalysisType: Sn
2632
+ };
2633
+ }
2634
+ function Ei(n, r) {
2635
+ const e = [];
2636
+ if (!r?.cubes)
2637
+ return e;
2638
+ if (typeof n.dimension == "string") {
2639
+ const [t, i] = n.dimension.split("."), s = r.cubes.find((o) => o.name === t);
2640
+ s ? s.dimensions?.find((l) => l.name === n.dimension) || e.push({
2641
+ type: "binding_key",
2642
+ message: `Dimension "${i}" not found in cube "${t}"`
2643
+ }) : e.push({
2644
+ type: "binding_key",
2645
+ message: `Cube "${t}" not found for binding key`
2646
+ });
2647
+ } else
2648
+ for (const t of n.dimension) {
2649
+ const i = r.cubes.find((s) => s.name === t.cube);
2650
+ i ? i.dimensions?.find((o) => o.name === t.dimension) || e.push({
2651
+ type: "cross_cube",
2652
+ message: `Dimension "${t.dimension}" not found in cube "${t.cube}"`
2653
+ }) : e.push({
2654
+ type: "cross_cube",
2655
+ message: `Cube "${t.cube}" not found for binding key mapping`
2656
+ });
2657
+ }
2658
+ return e;
2659
+ }
2660
+ function Ui(n) {
2661
+ const r = [];
2662
+ for (let e = 0; e < n.length; e++) {
2663
+ const t = n[e], i = t.query;
2664
+ i.measures && i.measures.length > 0 || i.dimensions && i.dimensions.length > 0 || i.timeDimensions && i.timeDimensions.length > 0 || r.push({
2665
+ type: "step_query",
2666
+ message: `Step ${e + 1} "${t.name}" has no measures, dimensions, or time dimensions`,
2667
+ stepIndex: e
2668
+ });
2669
+ }
2670
+ return r;
2671
+ }
2672
+ function Pi(n, r) {
2673
+ if (typeof n.dimension == "string")
2674
+ return !0;
2675
+ const e = at(r);
2676
+ return e ? n.dimension.some((t) => t.cube === e) : !1;
2677
+ }
2678
+ function _i(n, r) {
2679
+ const e = [];
2680
+ for (let t = 0; t < r.length; t++) {
2681
+ const i = r[t];
2682
+ if (!Pi(n, i.query)) {
2683
+ const s = at(i.query) || "unknown";
2684
+ e.push({
2685
+ type: "cross_cube",
2686
+ message: `Step ${t + 1} uses cube "${s}" but no binding key mapping exists for it`,
2687
+ stepIndex: t
2688
+ });
2689
+ }
2690
+ }
2691
+ return e;
2692
+ }
2693
+ function nt(n) {
2694
+ return n ? /^P(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$/.test(n) ? null : {
2695
+ type: "time_window",
2696
+ message: `Invalid time window format "${n}". Expected ISO 8601 duration (e.g., P7D, PT1H)`
2697
+ } : null;
2698
+ }
2699
+ function or(n, r) {
2700
+ const e = [], t = [];
2701
+ n.steps.length < 2 && e.push({
2702
+ type: "general",
2703
+ message: "Funnel requires at least 2 steps"
2704
+ }), n.bindingKey?.dimension ? (e.push(...Ei(n.bindingKey, r)), e.push(..._i(n.bindingKey, n.steps))) : e.push({
2705
+ type: "binding_key",
2706
+ message: "Binding key dimension is required"
2707
+ }), e.push(...Ui(n.steps));
2708
+ for (let s = 0; s < n.steps.length; s++) {
2709
+ const o = n.steps[s], l = nt(o.timeToConvert);
2710
+ l && (l.stepIndex = s, e.push(l));
2711
+ }
2712
+ const i = nt(n.globalTimeWindow);
2713
+ return i && e.push(i), n.steps.length > 5 && t.push({
2714
+ type: "general",
2715
+ message: "Funnels with more than 5 steps may have reduced performance"
2716
+ }), {
2717
+ isValid: e.length === 0,
2718
+ errors: e,
2719
+ warnings: t
2720
+ };
2721
+ }
2722
+ function lr(n, r) {
2723
+ return r < 2 ? { isValid: !1, message: "Add at least 2 steps for funnel" } : n?.dimension ? typeof n.dimension == "string" && !n.dimension ? { isValid: !1, message: "Select a binding key dimension" } : Array.isArray(n.dimension) && n.dimension.length === 0 ? { isValid: !1, message: "Select a binding key dimension" } : { isValid: !0 } : { isValid: !1, message: "Select a binding key dimension" };
2724
+ }
2725
+ function ur(n) {
2726
+ if (!n?.cubes) return [];
2727
+ const r = [];
2728
+ for (const e of n.cubes)
2729
+ if (e.dimensions)
2730
+ for (const t of e.dimensions)
2731
+ (t.type === "string" || t.type === "number") && r.push({
2732
+ cube: e.name,
2733
+ dimension: t.name,
2734
+ label: t.title || t.shortTitle || t.name.split(".")[1] || t.name
2735
+ });
2736
+ return r;
2737
+ }
2738
+ function cr(n) {
2739
+ if (!n?.dimension) return "Select binding key...";
2740
+ if (typeof n.dimension == "string")
2741
+ return n.dimension.split(".")[1] || n.dimension;
2742
+ if (n.dimension.length > 0) {
2743
+ const r = n.dimension[0];
2744
+ return `${r.dimension.split(".")[1] || r.dimension} (${n.dimension.length} cubes)`;
2745
+ }
2746
+ return "Select binding key...";
2747
+ }
2748
+ export {
2749
+ qi as A,
2750
+ Ji as B,
2751
+ gi as C,
2752
+ u as a,
2753
+ Yi as b,
2754
+ Xi as c,
2755
+ Zi as d,
2756
+ mi as e,
2757
+ er as f,
2758
+ tr as g,
2759
+ nr as h,
2760
+ hi as i,
2761
+ pi as j,
2762
+ Ci as k,
2763
+ Si as l,
2764
+ ir as m,
2765
+ rr as n,
2766
+ or as o,
2767
+ Ei as p,
2768
+ Ui as q,
2769
+ _i as r,
2770
+ Ee as s,
2771
+ lr as t,
2772
+ ar as u,
2773
+ wi as v,
2774
+ ur as w,
2775
+ cr as x,
2776
+ sr as y,
2777
+ ki as z
2778
+ };
2779
+ //# sourceMappingURL=analysis-builder-shared-gS0TDC6Y.js.map