drizzle-cube 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/ActivityGridChart.config-DXUUgx0N.cjs +1 -0
- package/dist/adapters/ActivityGridChart.config-Dyozu3VW.js +2 -0
- package/dist/adapters/AreaChart.config-Di5odBXp.cjs +1 -0
- package/dist/adapters/AreaChart.config-KEaXP_4K.js +2 -0
- package/dist/adapters/BarChart.config-B-hBHykR.cjs +1 -0
- package/dist/adapters/BarChart.config-C5sqbn0A.js +2 -0
- package/dist/adapters/BoxPlotChart.config-B1R4Br7L.js +2 -0
- package/dist/adapters/BoxPlotChart.config-C82Fhd3c.cjs +1 -0
- package/dist/adapters/BubbleChart.config-CoBxmmfp.js +2 -0
- package/dist/adapters/BubbleChart.config-DfOnNjL-.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-C5ggV_3j.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-ZaJpWVuL.js +2 -0
- package/dist/adapters/DataTable.config-Cx2_ACdY.cjs +1 -0
- package/dist/adapters/DataTable.config-DkAgD-iz.js +2 -0
- package/dist/adapters/FunnelChart.config-CvzcECUB.js +2 -0
- package/dist/adapters/FunnelChart.config-DVH7IFnb.cjs +1 -0
- package/dist/adapters/GaugeChart.config-Csx8rt8o.cjs +1 -0
- package/dist/adapters/GaugeChart.config-DEmrNgMa.js +2 -0
- package/dist/adapters/HeatMapChart.config-BfD_dpP7.js +2 -0
- package/dist/adapters/HeatMapChart.config-D_jlyPJL.cjs +1 -0
- package/dist/adapters/KpiDelta.config-CVBdUL_n.cjs +1 -0
- package/dist/adapters/KpiDelta.config-D4dCXOxl.js +2 -0
- package/dist/adapters/KpiNumber.config-BK5pgIKz.cjs +1 -0
- package/dist/adapters/KpiNumber.config-D6XqjZrm.js +2 -0
- package/dist/adapters/KpiText.config-ChphMwG5.js +2 -0
- package/dist/adapters/KpiText.config-fO1wc6FH.cjs +1 -0
- package/dist/adapters/LineChart.config-CXJrgz1s.js +2 -0
- package/dist/adapters/LineChart.config-Cg_h-SiJ.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-ByPjX-4O.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-Df2yY9AT.js +2 -0
- package/dist/adapters/MeasureProfileChart.config-BBWGIteF.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-C9OFbN9Z.js +2 -0
- package/dist/adapters/PieChart.config-C6jJj6xm.js +2 -0
- package/dist/adapters/PieChart.config-CmCw_8eN.cjs +1 -0
- package/dist/adapters/ProportionBarChart.config-B9NEyFEe.js +2 -0
- package/dist/adapters/ProportionBarChart.config-C3GAVPWn.cjs +1 -0
- package/dist/adapters/RadarChart.config-5AMwEqUJ.cjs +1 -0
- package/dist/adapters/RadarChart.config-Ct_b7IM5.js +2 -0
- package/dist/adapters/RadialBarChart.config-Bp-Sl0cm.js +2 -0
- package/dist/adapters/RadialBarChart.config-D14yoexI.cjs +1 -0
- package/dist/adapters/RecordsTable.config-D2-qmG06.cjs +1 -0
- package/dist/adapters/RecordsTable.config-DIwoqZCU.js +2 -0
- package/dist/adapters/RetentionCombinedChart.config-BWHipi5M.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-D40UgTcl.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-GlnSLrjn.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-MlhZf26c.cjs +1 -0
- package/dist/adapters/SankeyChart.config-Bf1_NHiv.js +2 -0
- package/dist/adapters/SankeyChart.config-BoYf6BFE.cjs +1 -0
- package/dist/adapters/ScatterChart.config-CV2rdGJp.js +2 -0
- package/dist/adapters/ScatterChart.config-DywduGF3.cjs +1 -0
- package/dist/adapters/SunburstChart.config-CrqiE1UZ.js +2 -0
- package/dist/adapters/SunburstChart.config-D5tbF_GJ.cjs +1 -0
- package/dist/adapters/TreeMapChart.config-BJ8HnZU0.cjs +1 -0
- package/dist/adapters/TreeMapChart.config-DxgIqIIj.js +2 -0
- package/dist/adapters/WaterfallChart.config-Cns8fLFu.js +2 -0
- package/dist/adapters/WaterfallChart.config-D_kdL9SN.cjs +1 -0
- package/dist/adapters/compiler-BxZHh0UD.cjs +166 -0
- package/dist/adapters/{compiler-DiYxWAKg.js → compiler-CBGD_4Et.js} +1389 -1923
- package/dist/adapters/core/http-port.d.ts +34 -7
- package/dist/adapters/core/index.cjs +1 -1
- package/dist/adapters/core/index.d.ts +1 -0
- package/dist/adapters/core/index.js +2 -2
- package/dist/adapters/core/rest-handlers.d.ts +1 -1
- package/dist/adapters/core-CIGuwGuI.cjs +1 -0
- package/dist/adapters/{core-BOPRmxPc.js → core-DAAnqPyN.js} +81 -65
- package/dist/adapters/express/index.cjs +2 -2
- package/dist/adapters/express/index.d.ts +11 -2
- package/dist/adapters/express/index.js +14 -14
- package/dist/adapters/fastify/index.cjs +2 -2
- package/dist/adapters/fastify/index.d.ts +11 -2
- package/dist/adapters/fastify/index.js +29 -29
- package/dist/{server/google-eKAc20al.js → adapters/google-DRY7jnOh.js} +46 -28
- package/dist/adapters/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
- package/dist/adapters/handler-BcYTw6zB.cjs +25 -0
- package/dist/adapters/{handler-DGud-C-w.js → handler-eA0VJDHj.js} +363 -266
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +9 -9
- package/dist/adapters/mcp-tools-handlers.d.ts +10 -3
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +18 -20
- package/dist/adapters/mcp-transport-BpG44Fvn.js +730 -0
- package/dist/adapters/mcp-transport-CDxZXpc-.cjs +42 -0
- package/dist/adapters/mcp-transport.d.ts +13 -2
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.d.ts +5 -2
- package/dist/adapters/nextjs/index.js +32 -32
- package/dist/adapters/{openai-Crp3X_zg.js → openai-BZ48ioYp.js} +1 -1
- package/dist/adapters/{openai-CmdN7Sj1.cjs → openai-Bw1j-OiP.cjs} +1 -1
- package/dist/adapters/{openai-Dwt9bxOE.cjs → openai-CLjyL5_J.cjs} +2 -2
- package/dist/adapters/{openai-CGJM6Qun.js → openai-CYYjUG_3.js} +4 -4
- package/dist/adapters/{utils-DboNUT3A.js → utils-BagURNRb.js} +1963 -1135
- package/dist/adapters/utils-BiKIg2tk.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.d.ts +19 -5
- package/dist/adapters/utils.js +1 -1
- package/dist/cjs/adapters/core/http-port.d.ts +34 -7
- package/dist/cjs/adapters/core/index.d.ts +1 -0
- package/dist/cjs/adapters/core/rest-handlers.d.ts +1 -1
- package/dist/cjs/adapters/express/index.d.ts +11 -2
- package/dist/cjs/adapters/fastify/index.d.ts +11 -2
- package/dist/cjs/adapters/mcp-tools-handlers.d.ts +10 -3
- package/dist/cjs/adapters/mcp-transport.d.ts +13 -2
- package/dist/cjs/adapters/nextjs/index.d.ts +5 -2
- package/dist/cjs/adapters/utils.d.ts +19 -5
- package/dist/cjs/client/charts/chartConfigRegistry.d.ts +7 -0
- package/dist/cjs/client/charts/chartConfigs.d.ts +17 -1
- package/dist/cjs/client/client/CubeClient.d.ts +11 -1
- package/dist/cjs/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
- package/dist/cjs/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
- package/dist/cjs/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
- package/dist/cjs/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
- package/dist/cjs/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
- package/dist/cjs/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
- package/dist/cjs/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
- package/dist/cjs/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
- package/dist/cjs/client/components/charts/RecordsTable.config.d.ts +10 -0
- package/dist/cjs/client/components/charts/RecordsTable.d.ts +4 -0
- package/dist/cjs/client/components/charts/recordsTableHooks.d.ts +68 -0
- package/dist/cjs/client/icons/types.d.ts +1 -0
- package/dist/cjs/client/index.d.ts +2 -2
- package/dist/cjs/client/types.d.ts +92 -1
- package/dist/cjs/client/utils/recordsTableUtils.d.ts +71 -0
- package/dist/cjs/client/utils/rowLinkUtils.d.ts +35 -0
- package/dist/cjs/server/adapters/base-adapter.d.ts +46 -0
- package/dist/cjs/server/adapters/databend-adapter.d.ts +5 -0
- package/dist/cjs/server/adapters/duckdb-adapter.d.ts +5 -0
- package/dist/cjs/server/adapters/mysql-adapter.d.ts +14 -0
- package/dist/cjs/server/adapters/postgres-adapter.d.ts +15 -0
- package/dist/cjs/server/adapters/snowflake-adapter.d.ts +6 -0
- package/dist/cjs/server/adapters/sqlite-adapter.d.ts +21 -0
- package/dist/cjs/server/agent/chart-validation.d.ts +1 -1
- package/dist/cjs/server/ai/chart-schema.d.ts +117 -0
- package/dist/cjs/server/ai/discovery-helpers.d.ts +14 -0
- package/dist/cjs/server/ai/discovery.d.ts +6 -0
- package/dist/cjs/server/ai/query-schema.d.ts +1 -1
- package/dist/cjs/server/attribute-dimensions.d.ts +102 -0
- package/dist/cjs/server/builders/group-by-builder.d.ts +15 -0
- package/dist/cjs/server/cache-utils.d.ts +5 -1
- package/dist/cjs/server/compiler-metadata.d.ts +24 -3
- package/dist/cjs/server/compiler.d.ts +159 -13
- package/dist/cjs/server/execution/query-result-cache.d.ts +1 -1
- package/dist/cjs/server/executor.d.ts +15 -0
- package/dist/cjs/server/index.d.ts +13 -3
- package/dist/cjs/server/query-handlers.d.ts +2 -1
- package/dist/cjs/server/query-validator.d.ts +36 -4
- package/dist/cjs/server/types/core.d.ts +13 -0
- package/dist/cjs/server/types/cube.d.ts +39 -2
- package/dist/cjs/server/types/query.d.ts +8 -0
- package/dist/cli/index.cjs +130 -52
- package/dist/client/charts/chartConfigRegistry.d.ts +7 -0
- package/dist/client/charts/chartConfigs.d.ts +17 -1
- package/dist/client/charts.js +13 -13
- package/dist/client/chunks/{DashboardEditModal-BOfLdTgV.js → DashboardEditModal-_ZDMwaGX.js} +1653 -1188
- package/dist/client/chunks/DashboardEditModal-_ZDMwaGX.js.map +1 -0
- package/dist/client/chunks/{ProportionBarChart-DwoXU5VP.js → ProportionBarChart-qfpAWhIg.js} +3 -3
- package/dist/client/chunks/{ProportionBarChart-DwoXU5VP.js.map → ProportionBarChart-qfpAWhIg.js.map} +1 -1
- package/dist/client/chunks/RecordsTable-KmJy94xN.js +556 -0
- package/dist/client/chunks/RecordsTable-KmJy94xN.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-BqlSV7yF.js → RetentionCombinedChart-C7X6aj97.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-BqlSV7yF.js.map → RetentionCombinedChart-C7X6aj97.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-VdVkBg8Q.js → RetentionHeatmap-PpRpiqR_.js} +2 -2
- package/dist/client/chunks/{RetentionHeatmap-VdVkBg8Q.js.map → RetentionHeatmap-PpRpiqR_.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-DXw60SEs.js → analysis-builder-DaqyOjLX.js} +169 -168
- package/dist/client/chunks/{analysis-builder-DXw60SEs.js.map → analysis-builder-DaqyOjLX.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-CEvHIlmk.js → analysis-builder-shared-ow9KAHDP.js} +965 -954
- package/dist/client/chunks/analysis-builder-shared-ow9KAHDP.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-4jfS8khG.js → chart-activity-grid-DO82rrbW.js} +140 -84
- package/dist/client/chunks/chart-activity-grid-DO82rrbW.js.map +1 -0
- package/dist/client/chunks/{chart-area-Dol6s9no.js → chart-area-9SBeG0GM.js} +21 -21
- package/dist/client/chunks/{chart-area-Dol6s9no.js.map → chart-area-9SBeG0GM.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-5_niozi2.js → chart-bar-tfgmLK2D.js} +5 -5
- package/dist/client/chunks/{chart-bar-5_niozi2.js.map → chart-bar-tfgmLK2D.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-Dhp-VwhD.js → chart-box-plot-BuYW6j6g.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-Dhp-VwhD.js.map → chart-box-plot-BuYW6j6g.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-BM2BAMSo.js → chart-bubble-BNmonWqW.js} +2 -2
- package/dist/client/chunks/{chart-bubble-BM2BAMSo.js.map → chart-bubble-BNmonWqW.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-BNwLIBfm.js → chart-candlestick-BYeWNkKl.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-BNwLIBfm.js.map → chart-candlestick-BYeWNkKl.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-DoDHQRe7.js → chart-data-table-C_oHiK6N.js} +1094 -1029
- package/dist/client/chunks/chart-data-table-C_oHiK6N.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-Cd7da_sa.js → chart-funnel-B_CWC3cL.js} +2 -2
- package/dist/client/chunks/{chart-funnel-Cd7da_sa.js.map → chart-funnel-B_CWC3cL.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-DOpul-Oz.js → chart-gauge-D7VxwPnx.js} +3 -3
- package/dist/client/chunks/{chart-gauge-DOpul-Oz.js.map → chart-gauge-D7VxwPnx.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-CeKbK655.js → chart-heat-map-q7Vf_dog.js} +3 -3
- package/dist/client/chunks/{chart-heat-map-CeKbK655.js.map → chart-heat-map-q7Vf_dog.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-Dq8qUOOT.js → chart-kpi-delta-PEuA3iGs.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-Dq8qUOOT.js.map → chart-kpi-delta-PEuA3iGs.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-DgiqTi9g.js → chart-kpi-number-DlxrO6Pq.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-DgiqTi9g.js.map → chart-kpi-number-DlxrO6Pq.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-CsZMVEnM.js → chart-kpi-text-Cx6cJu2s.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-CsZMVEnM.js.map → chart-kpi-text-Cx6cJu2s.js.map} +1 -1
- package/dist/client/chunks/{chart-line-DlwOB7C7.js → chart-line-pDe25JzB.js} +3 -3
- package/dist/client/chunks/{chart-line-DlwOB7C7.js.map → chart-line-pDe25JzB.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-DPE34SjC.js → chart-markdown-CRY15yp0.js} +2 -2
- package/dist/client/chunks/{chart-markdown-DPE34SjC.js.map → chart-markdown-CRY15yp0.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-BpTz1fce.js → chart-measure-profile-DyQ-vvuC.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-BpTz1fce.js.map → chart-measure-profile-DyQ-vvuC.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-FGw66XAH.js → chart-pie-ZrnBycy1.js} +15 -15
- package/dist/client/chunks/{chart-pie-FGw66XAH.js.map → chart-pie-ZrnBycy1.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-D-eRDoiA.js → chart-radar-BXbnYMUJ.js} +13 -13
- package/dist/client/chunks/{chart-radar-D-eRDoiA.js.map → chart-radar-BXbnYMUJ.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-DgtkNTs3.js → chart-radial-bar-CYxH3ryh.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar-DgtkNTs3.js.map → chart-radial-bar-CYxH3ryh.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-D0hhb_EQ.js → chart-sankey-C9R_TDDh.js} +2 -2
- package/dist/client/chunks/{chart-sankey-D0hhb_EQ.js.map → chart-sankey-C9R_TDDh.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-D9EcAiMQ.js → chart-scatter-DrwRkzzl.js} +3 -3
- package/dist/client/chunks/{chart-scatter-D9EcAiMQ.js.map → chart-scatter-DrwRkzzl.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-DCYmJ5DU.js → chart-sunburst-Bs1yqIPp.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-DCYmJ5DU.js.map → chart-sunburst-Bs1yqIPp.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-D_ACSSiB.js → chart-tree-map-BNjHhhVq.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-D_ACSSiB.js.map → chart-tree-map-BNjHhhVq.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-CVUVNa1R.js → chart-waterfall-CyoC0uLT.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-CVUVNa1R.js.map → chart-waterfall-CyoC0uLT.js.map} +1 -1
- package/dist/client/chunks/charts-core-DCQ7od_L.js +190 -0
- package/dist/client/chunks/charts-core-DCQ7od_L.js.map +1 -0
- package/dist/client/chunks/charts-loader-Bya_zDIA.js +86 -0
- package/dist/client/chunks/charts-loader-Bya_zDIA.js.map +1 -0
- package/dist/client/chunks/{en-US-BE6VoG0o.js → en-US-HP6FHuNy.js} +3 -1
- package/dist/client/chunks/{en-US-BE6VoG0o.js.map → en-US-HP6FHuNy.js.map} +1 -1
- package/dist/client/chunks/{exceljs.min-DWC_b8G9.js → exceljs.min-CiByP8VQ.js} +2 -3
- package/dist/client/chunks/{exceljs.min-DWC_b8G9.js.map → exceljs.min-CiByP8VQ.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-DFLVORiD.js → nl-NL-CEdoCz6Q.js} +54 -1
- package/dist/client/chunks/nl-NL-CEdoCz6Q.js.map +1 -0
- package/dist/client/chunks/{schema-visualization-C6g_LCiA.js → schema-visualization-DfXxFBIY.js} +3 -3
- package/dist/client/chunks/{schema-visualization-C6g_LCiA.js.map → schema-visualization-DfXxFBIY.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-ZfChDEd3.js → useDirtyStateTracking-BFJHiiVK.js} +15 -15
- package/dist/client/chunks/{useDirtyStateTracking-ZfChDEd3.js.map → useDirtyStateTracking-BFJHiiVK.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-im9e1rVb.js → useExplainAI-_C4WQE5I.js} +16 -16
- package/dist/client/chunks/{useExplainAI-im9e1rVb.js.map → useExplainAI-_C4WQE5I.js.map} +1 -1
- package/dist/client/chunks/{vendor-Qa1s8oSX.js → vendor-Gb3lH0cc.js} +49 -49
- package/dist/client/chunks/vendor-Gb3lH0cc.js.map +1 -0
- package/dist/client/client/CubeClient.d.ts +11 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
- package/dist/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
- package/dist/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
- package/dist/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
- package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
- package/dist/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
- package/dist/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
- package/dist/client/components/charts/RecordsTable.config.d.ts +10 -0
- package/dist/client/components/charts/RecordsTable.d.ts +4 -0
- package/dist/client/components/charts/recordsTableHooks.d.ts +68 -0
- package/dist/client/components.js +1 -1
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons/types.d.ts +1 -0
- package/dist/client/icons.js +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +213 -213
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +92 -1
- package/dist/client/utils/recordsTableUtils.d.ts +71 -0
- package/dist/client/utils/rowLinkUtils.d.ts +35 -0
- package/dist/client/utils.js +14 -14
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +109 -109
- package/dist/server/adapters/base-adapter.d.ts +46 -0
- package/dist/server/adapters/databend-adapter.d.ts +5 -0
- package/dist/server/adapters/duckdb-adapter.d.ts +5 -0
- package/dist/server/adapters/mysql-adapter.d.ts +14 -0
- package/dist/server/adapters/postgres-adapter.d.ts +15 -0
- package/dist/server/adapters/snowflake-adapter.d.ts +6 -0
- package/dist/server/adapters/sqlite-adapter.d.ts +21 -0
- package/dist/server/agent/chart-validation.d.ts +1 -1
- package/dist/server/ai/chart-schema.d.ts +117 -0
- package/dist/server/ai/discovery-helpers.d.ts +14 -0
- package/dist/server/ai/discovery.d.ts +6 -0
- package/dist/server/ai/query-schema.d.ts +1 -1
- package/dist/server/attribute-dimensions.d.ts +102 -0
- package/dist/server/builders/group-by-builder.d.ts +15 -0
- package/dist/server/cache-utils.d.ts +5 -1
- package/dist/server/compiler-metadata.d.ts +24 -3
- package/dist/server/compiler.d.ts +159 -13
- package/dist/server/execution/query-result-cache.d.ts +1 -1
- package/dist/server/executor.d.ts +15 -0
- package/dist/{adapters/google-eKAc20al.js → server/google-DRY7jnOh.js} +46 -28
- package/dist/server/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
- package/dist/server/index.cjs +42 -38
- package/dist/server/index.d.ts +13 -3
- package/dist/server/index.js +2079 -1573
- package/dist/server/{openai-Czk1BdHa.js → openai-6uUf7h-5.js} +1 -1
- package/dist/server/{openai-DBwI1OSu.cjs → openai-BBe1XbZd.cjs} +1 -1
- package/dist/server/{openai-Cu4TXXjl.cjs → openai-BmADmD1e.cjs} +1 -1
- package/dist/server/{openai-CUf4vc3Q.js → openai-C1gLuR-0.js} +1 -1
- package/dist/server/query-handlers.d.ts +2 -1
- package/dist/server/query-validator.d.ts +36 -4
- package/dist/server/types/core.d.ts +13 -0
- package/dist/server/types/cube.d.ts +39 -2
- package/dist/server/types/query.d.ts +8 -0
- package/package.json +2 -2
- package/dist/adapters/ActivityGridChart.config-D6hhj345.cjs +0 -1
- package/dist/adapters/ActivityGridChart.config-QZKs_NYg.js +0 -2
- package/dist/adapters/AreaChart.config-B5XM6G22.js +0 -2
- package/dist/adapters/AreaChart.config-NP34BH5y.cjs +0 -1
- package/dist/adapters/BarChart.config-Bqlmr81N.js +0 -2
- package/dist/adapters/BarChart.config-C3bw-cAP.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-BOAvoj6x.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-CTXiycYY.js +0 -2
- package/dist/adapters/BubbleChart.config-CGFIkl4H.cjs +0 -1
- package/dist/adapters/BubbleChart.config-Njxx4Eq1.js +0 -2
- package/dist/adapters/CandlestickChart.config-BZ_yWaSo.cjs +0 -1
- package/dist/adapters/CandlestickChart.config-D4Svhmef.js +0 -2
- package/dist/adapters/DataTable.config-B-bT9puT.js +0 -2
- package/dist/adapters/DataTable.config-BHtt1cPM.cjs +0 -1
- package/dist/adapters/FunnelChart.config-C1e07O7B.cjs +0 -1
- package/dist/adapters/FunnelChart.config-CVEy0tV9.js +0 -2
- package/dist/adapters/GaugeChart.config-5PLNlQlu.js +0 -2
- package/dist/adapters/GaugeChart.config-Cdv6knjZ.cjs +0 -1
- package/dist/adapters/HeatMapChart.config-MGTfYpWJ.js +0 -2
- package/dist/adapters/HeatMapChart.config-jfBEi1ZI.cjs +0 -1
- package/dist/adapters/KpiDelta.config-D2IUsEYz.cjs +0 -1
- package/dist/adapters/KpiDelta.config-DT_MmAHw.js +0 -2
- package/dist/adapters/KpiNumber.config-ChgbKmx8.cjs +0 -1
- package/dist/adapters/KpiNumber.config-CvZ_FhyL.js +0 -2
- package/dist/adapters/KpiText.config-Bgkw8gr2.js +0 -2
- package/dist/adapters/KpiText.config-Bz9orqt6.cjs +0 -1
- package/dist/adapters/LineChart.config-BVew35dI.cjs +0 -1
- package/dist/adapters/LineChart.config-DSCCKXNg.js +0 -2
- package/dist/adapters/MarkdownChart.config-Bu6XUuhI.js +0 -2
- package/dist/adapters/MarkdownChart.config-E4aSVTf3.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-BF249hc_.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-lERVe38G.js +0 -2
- package/dist/adapters/PieChart.config-7Ujwp8R5.cjs +0 -1
- package/dist/adapters/PieChart.config-jQl2HIcA.js +0 -2
- package/dist/adapters/ProportionBarChart.config-o0w_Pnlt.js +0 -2
- package/dist/adapters/ProportionBarChart.config-phNohhhY.cjs +0 -1
- package/dist/adapters/RadarChart.config-BmrYBd9x.js +0 -2
- package/dist/adapters/RadarChart.config-Dlt3UflG.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-CeEm8xRb.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-Dishh6bC.js +0 -2
- package/dist/adapters/RetentionCombinedChart.config-BaD4ev85.cjs +0 -1
- package/dist/adapters/RetentionCombinedChart.config-m2FjBUi9.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-DiMplGdk.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-Dp6oYwQZ.cjs +0 -1
- package/dist/adapters/SankeyChart.config-C4Y6qzCS.cjs +0 -1
- package/dist/adapters/SankeyChart.config-CJHqgjQ1.js +0 -2
- package/dist/adapters/ScatterChart.config-C0QqvDrN.cjs +0 -1
- package/dist/adapters/ScatterChart.config-DywOsWPW.js +0 -2
- package/dist/adapters/SunburstChart.config-DE8RxpDR.cjs +0 -1
- package/dist/adapters/SunburstChart.config-DohowrO3.js +0 -2
- package/dist/adapters/TreeMapChart.config-D2gXz-zC.cjs +0 -1
- package/dist/adapters/TreeMapChart.config-HMlI29GG.js +0 -2
- package/dist/adapters/WaterfallChart.config-BO2WV2VB.js +0 -2
- package/dist/adapters/WaterfallChart.config-CzwGiheB.cjs +0 -1
- package/dist/adapters/compiler-BNjqYdmc.cjs +0 -166
- package/dist/adapters/core-CzFfrJzu.cjs +0 -1
- package/dist/adapters/handler-m6WgA9xu.cjs +0 -25
- package/dist/adapters/mcp-transport-B0b27YUB.cjs +0 -40
- package/dist/adapters/mcp-transport-BXyA4dTk.js +0 -603
- package/dist/adapters/utils-BoOeig94.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-BOfLdTgV.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-CEvHIlmk.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-4jfS8khG.js.map +0 -1
- package/dist/client/chunks/chart-data-table-DoDHQRe7.js.map +0 -1
- package/dist/client/chunks/charts-core-BPD_hLaL.js +0 -215
- package/dist/client/chunks/charts-core-BPD_hLaL.js.map +0 -1
- package/dist/client/chunks/charts-loader-CwMcOfwT.js +0 -85
- package/dist/client/chunks/charts-loader-CwMcOfwT.js.map +0 -1
- package/dist/client/chunks/nl-NL-DFLVORiD.js.map +0 -1
- package/dist/client/chunks/vendor-Qa1s8oSX.js.map +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { ChartAxisConfig, ChartPagination, CubeQuery } from '../../types.js';
|
|
3
|
+
export declare const DEFAULT_PAGE_SIZE = 25;
|
|
4
|
+
/**
|
|
5
|
+
* Which columns to render, in which order.
|
|
6
|
+
*
|
|
7
|
+
* The author's arrangement comes from the Columns drop zone; a viewer can drag
|
|
8
|
+
* a header on top of it, and that order is remembered per column set. It is
|
|
9
|
+
* *reconciled* rather than substituted, so a column the author adds later still
|
|
10
|
+
* appears instead of being swallowed by a stale local order.
|
|
11
|
+
*/
|
|
12
|
+
export declare function useRecordsColumns(params: {
|
|
13
|
+
rows: Record<string, unknown>[];
|
|
14
|
+
chartConfig?: ChartAxisConfig;
|
|
15
|
+
queryObject?: CubeQuery;
|
|
16
|
+
}): {
|
|
17
|
+
columns: string[];
|
|
18
|
+
storageKey: string;
|
|
19
|
+
draggedColumn: string | null;
|
|
20
|
+
didDragRef: React.MutableRefObject<boolean>;
|
|
21
|
+
startColumnDrag: (column: string) => void;
|
|
22
|
+
endColumnDrag: () => void;
|
|
23
|
+
dropColumn: (target: string) => void;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Drag-resizable column widths, remembered per column set.
|
|
27
|
+
*
|
|
28
|
+
* A chart has no portlet id and no write path back to `displayConfig`, so an
|
|
29
|
+
* authored `columnWidths` acts as the default a viewer's own drags layer over —
|
|
30
|
+
* the same arrangement the data browser uses.
|
|
31
|
+
*/
|
|
32
|
+
export declare function useColumnWidths(params: {
|
|
33
|
+
columns: string[];
|
|
34
|
+
storageKey: string;
|
|
35
|
+
authored?: Record<string, number>;
|
|
36
|
+
}): {
|
|
37
|
+
columnWidths: Record<string, number>;
|
|
38
|
+
totalWidth: number | undefined;
|
|
39
|
+
tableRef: React.RefObject<HTMLTableElement>;
|
|
40
|
+
didResizeRef: React.MutableRefObject<boolean>;
|
|
41
|
+
startResize: (event: React.MouseEvent, column: string) => void;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Sorting and paging, server-side when the host offers it.
|
|
45
|
+
*
|
|
46
|
+
* With a `pagination` prop the host re-queries, so both must go through it:
|
|
47
|
+
* sorting only the loaded page would put the wrong rows on page 1. Without one
|
|
48
|
+
* — the AnalysisBuilder preview, the notebook, plugin hosts — the table sorts
|
|
49
|
+
* and pages over the rows it already has.
|
|
50
|
+
*/
|
|
51
|
+
export declare function useRecordsPaging(params: {
|
|
52
|
+
rows: Record<string, unknown>[];
|
|
53
|
+
pagination?: ChartPagination;
|
|
54
|
+
authoredPageSize?: number;
|
|
55
|
+
}): {
|
|
56
|
+
sort: {
|
|
57
|
+
column: string;
|
|
58
|
+
direction: "asc" | "desc";
|
|
59
|
+
} | null;
|
|
60
|
+
toggleSort: (column: string) => void;
|
|
61
|
+
visibleRows: Record<string, unknown>[];
|
|
62
|
+
page: number;
|
|
63
|
+
pageSize: number;
|
|
64
|
+
pageCount: number;
|
|
65
|
+
rowCount: number;
|
|
66
|
+
goToPage: (next: number) => void;
|
|
67
|
+
showPager: boolean;
|
|
68
|
+
};
|
|
@@ -80,6 +80,7 @@ export interface IconRegistry {
|
|
|
80
80
|
chartRadialBar: IconDefinition;
|
|
81
81
|
chartTreemap: IconDefinition;
|
|
82
82
|
chartTable: IconDefinition;
|
|
83
|
+
chartRecordsTable: IconDefinition;
|
|
83
84
|
chartActivityGrid: IconDefinition;
|
|
84
85
|
chartKpiNumber: IconDefinition;
|
|
85
86
|
chartKpiDelta: IconDefinition;
|
|
@@ -33,7 +33,7 @@ useCubeFeatures } from './providers/CubeProvider.js';
|
|
|
33
33
|
export { ScrollContainerProvider, useScrollContainer } from './providers/ScrollContainerContext.js';
|
|
34
34
|
export { useCubeFieldLabel } from './hooks/useCubeFieldLabel.js';
|
|
35
35
|
export { createCubeClient } from './client/CubeClient.js';
|
|
36
|
-
export { CubeClient } from './client/CubeClient.js';
|
|
36
|
+
export { CubeClient, CubeQueryError } from './client/CubeClient.js';
|
|
37
37
|
export { useCubeMetaQuery, useCubeLoadQuery, useCubeQuery, useMultiCubeLoadQuery, useDryRunQuery, useMultiDryRunQueries, useDryRunQueries, useExplainQuery, createExplainQueryKey, useExplainAI, useFunnelQuery, createFunnelQueryKey, useFlowQuery, createFlowQueryKey, } from './hooks/queries/index.js';
|
|
38
38
|
export type { UseCubeMetaQueryOptions, UseCubeMetaQueryResult, UseCubeLoadQueryOptions, UseCubeLoadQueryResult, UseMultiCubeLoadQueryOptions, UseMultiCubeLoadQueryResult, DebugDataEntry, UseExplainQueryOptions, UseExplainQueryResult, UseExplainAIOptions, UseExplainAIResult, UseFlowQueryOptions, UseFlowQueryResult, } from './hooks/queries/index.js';
|
|
39
39
|
export { useAnalysisBuilder } from './hooks/useAnalysisBuilderHook.js';
|
|
@@ -55,7 +55,7 @@ export { useTheme } from './hooks/useTheme.js';
|
|
|
55
55
|
export { useScrollDetection } from './hooks/useScrollDetection.js';
|
|
56
56
|
export { useElementVisibility } from './hooks/useElementVisibility.js';
|
|
57
57
|
export { useDrillInteraction } from './hooks/useDrillInteraction.js';
|
|
58
|
-
export type { PortletConfig, ChartType, BuiltInChartType, ChartAxisConfig, ChartDisplayConfig, ChartProps, ColorPalette, CubeQuery, CubeQueryOptions, CubeApiOptions, DashboardConfig, PortletGroup, PortletGroupCell, FeaturesConfig, XlsExportFeatureConfig, ThumbnailFeatureConfig, MultiQueryConfig, QueryMergeStrategy, FunnelBindingKey, FunnelBindingKeyMapping, FunnelStep, FunnelConfig, FunnelStepResult, FunnelExecutionResult, FunnelChartData, FunnelValidationError, FunnelValidationResult, UseFunnelQueryOptions, UseFunnelQueryResult, ServerFlowQuery, FlowQueryConfig, FlowChartData, FlowSliceState, SankeyNode, SankeyLink, FlowStartingStep, FlowResultRow, } from './types.js';
|
|
58
|
+
export type { PortletConfig, ChartType, BuiltInChartType, ChartAxisConfig, ChartDisplayConfig, ChartProps, ColorPalette, CubeQuery, CubeQueryOptions, CubeApiOptions, CubeValidationIssue, ChartPagination, ColumnFormatConfig, ColumnFormatKind, RowLinkConfig, DashboardConfig, PortletGroup, PortletGroupCell, FeaturesConfig, XlsExportFeatureConfig, ThumbnailFeatureConfig, MultiQueryConfig, QueryMergeStrategy, FunnelBindingKey, FunnelBindingKeyMapping, FunnelStep, FunnelConfig, FunnelStepResult, FunnelExecutionResult, FunnelChartData, FunnelValidationError, FunnelValidationResult, UseFunnelQueryOptions, UseFunnelQueryResult, ServerFlowQuery, FlowQueryConfig, FlowChartData, FlowSliceState, SankeyNode, SankeyLink, FlowStartingStep, FlowResultRow, } from './types.js';
|
|
59
59
|
export { isQueryConfig, isFunnelConfig, isFlowConfig, isRetentionConfig, isMultiQuery, isSingleQuery, isValidAnalysisConfig, createDefaultQueryConfig, createDefaultFunnelConfig, createDefaultFlowConfig, createDefaultRetentionConfig, createDefaultConfig, isValidAnalysisWorkspace, createDefaultWorkspace } from './types/analysisConfig.js';
|
|
60
60
|
export type { AnalysisConfig, QueryAnalysisConfig, FunnelAnalysisConfig, FlowAnalysisConfig, RetentionAnalysisConfig, AnalysisWorkspace } from './types/analysisConfig.js';
|
|
61
61
|
export { isMultiQueryConfig, isServerFunnelQuery, isServerFlowQuery, isSankeyData } from './types.js';
|
|
@@ -71,7 +71,7 @@ export interface CubeMeta {
|
|
|
71
71
|
}
|
|
72
72
|
export type FieldLabelMap = Record<string, string>;
|
|
73
73
|
export type { ColorPalette } from './utils/colorPalettes.js';
|
|
74
|
-
export type BuiltInChartType = 'line' | 'bar' | 'pie' | 'table' | 'area' | 'scatter' | 'radar' | 'radialBar' | 'treemap' | 'bubble' | 'activityGrid' | 'kpiNumber' | 'kpiDelta' | 'kpiText' | 'markdown' | 'funnel' | 'sankey' | 'sunburst' | 'heatmap' | 'retentionHeatmap' | 'retentionCombined' | 'boxPlot' | 'waterfall' | 'candlestick' | 'proportionBar' | 'measureProfile' | 'gauge';
|
|
74
|
+
export type BuiltInChartType = 'line' | 'bar' | 'pie' | 'table' | 'area' | 'scatter' | 'radar' | 'radialBar' | 'treemap' | 'bubble' | 'activityGrid' | 'kpiNumber' | 'kpiDelta' | 'kpiText' | 'markdown' | 'funnel' | 'sankey' | 'sunburst' | 'heatmap' | 'retentionHeatmap' | 'retentionCombined' | 'boxPlot' | 'waterfall' | 'candlestick' | 'proportionBar' | 'measureProfile' | 'gauge' | 'recordsTable';
|
|
75
75
|
export type ChartType = BuiltInChartType | (string & {});
|
|
76
76
|
export interface AxisFormatConfig {
|
|
77
77
|
label?: string;
|
|
@@ -80,6 +80,7 @@ export interface AxisFormatConfig {
|
|
|
80
80
|
decimals?: number;
|
|
81
81
|
customPrefix?: string;
|
|
82
82
|
customSuffix?: string;
|
|
83
|
+
currencyCode?: string;
|
|
83
84
|
}
|
|
84
85
|
export interface ChartAxisConfig {
|
|
85
86
|
xAxis?: string[];
|
|
@@ -89,10 +90,49 @@ export interface ChartAxisConfig {
|
|
|
89
90
|
colorField?: string;
|
|
90
91
|
dateField?: string[];
|
|
91
92
|
valueField?: string[];
|
|
93
|
+
columns?: string[];
|
|
94
|
+
hiddenColumns?: string[];
|
|
92
95
|
x?: string;
|
|
93
96
|
y?: string[];
|
|
94
97
|
yAxisAssignment?: Record<string, 'left' | 'right'>;
|
|
95
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* How a records-table column renders its value. Chosen per column in the chart
|
|
101
|
+
* editor — never inferred from the data, so the same field can be a badge in one
|
|
102
|
+
* dashboard and plain text in another.
|
|
103
|
+
*/
|
|
104
|
+
export type ColumnFormatKind = 'text' | 'number' | 'date' | 'badge' | 'progress';
|
|
105
|
+
export interface ColumnFormatConfig {
|
|
106
|
+
kind: ColumnFormatKind;
|
|
107
|
+
/** Numeric formatting for `kind: 'number'` — reuses the shared axis formatter. */
|
|
108
|
+
numberFormat?: AxisFormatConfig;
|
|
109
|
+
/** Granularity for `kind: 'date'`. */
|
|
110
|
+
dateGranularity?: TimeGranularity;
|
|
111
|
+
/**
|
|
112
|
+
* Value → palette colour index for `kind: 'badge'`. Values with no mapping
|
|
113
|
+
* render neutral rather than being assigned a guessed colour.
|
|
114
|
+
*/
|
|
115
|
+
badgeColors?: Array<{
|
|
116
|
+
value: string;
|
|
117
|
+
colorIndex: number;
|
|
118
|
+
}>;
|
|
119
|
+
/** Bounds for `kind: 'progress'` (default 0-100). Values are clamped. */
|
|
120
|
+
progressMin?: number;
|
|
121
|
+
progressMax?: number;
|
|
122
|
+
/** How a `kind: 'progress'` cell draws: a full-width bar, or a compact ring for narrow columns. */
|
|
123
|
+
progressStyle?: 'bar' | 'circle';
|
|
124
|
+
/** Header override; falls back to the field's metadata title. */
|
|
125
|
+
label?: string;
|
|
126
|
+
align?: 'left' | 'right';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Row-level click-through for the records table. Tokens of the form
|
|
130
|
+
* `{Cube.field}` are substituted from the row, including hidden columns.
|
|
131
|
+
*/
|
|
132
|
+
export interface RowLinkConfig {
|
|
133
|
+
urlTemplate: string;
|
|
134
|
+
target?: 'self' | 'blank';
|
|
135
|
+
}
|
|
96
136
|
export interface ThresholdBand {
|
|
97
137
|
value: number;
|
|
98
138
|
color: string;
|
|
@@ -119,6 +159,10 @@ export interface ChartDisplayConfig {
|
|
|
119
159
|
sortSegments?: boolean;
|
|
120
160
|
fitToWidth?: boolean;
|
|
121
161
|
pivotTimeDimension?: boolean;
|
|
162
|
+
columnFormats?: Record<string, ColumnFormatConfig>;
|
|
163
|
+
columnWidths?: Record<string, number>;
|
|
164
|
+
rowLink?: RowLinkConfig;
|
|
165
|
+
pageSize?: number;
|
|
122
166
|
target?: string;
|
|
123
167
|
template?: string;
|
|
124
168
|
prefix?: string;
|
|
@@ -353,6 +397,12 @@ export interface CubeQuery {
|
|
|
353
397
|
segments?: string[];
|
|
354
398
|
/** When true, returns raw row-level data without GROUP BY or aggregation */
|
|
355
399
|
ungrouped?: boolean;
|
|
400
|
+
/**
|
|
401
|
+
* Ask the server for the number of rows the query would return with no
|
|
402
|
+
* limit/offset, read back via `CubeResultSet.totalCount()`. Costs a second
|
|
403
|
+
* round trip, so only paginated views set it.
|
|
404
|
+
*/
|
|
405
|
+
total?: boolean;
|
|
356
406
|
}
|
|
357
407
|
/**
|
|
358
408
|
* Merge strategy for combining multiple query results
|
|
@@ -389,6 +439,17 @@ export interface CubeApiOptions {
|
|
|
389
439
|
headers?: Record<string, string>;
|
|
390
440
|
credentials?: 'include' | 'omit' | 'same-origin';
|
|
391
441
|
}
|
|
442
|
+
/**
|
|
443
|
+
* An unknown member the server rejected, mirroring the server's
|
|
444
|
+
* `QueryValidationIssue`. `source` is what decides the response: a projected
|
|
445
|
+
* member can be dropped and the query re-run, whereas dropping a filter would
|
|
446
|
+
* widen the result set and must stay an error.
|
|
447
|
+
*/
|
|
448
|
+
export interface CubeValidationIssue {
|
|
449
|
+
source: 'measure' | 'dimension' | 'timeDimension' | 'filter';
|
|
450
|
+
member: string;
|
|
451
|
+
message: string;
|
|
452
|
+
}
|
|
392
453
|
export interface CubeResultSet {
|
|
393
454
|
rawData(): any[];
|
|
394
455
|
tablePivot(): any[];
|
|
@@ -401,6 +462,8 @@ export interface CubeResultSet {
|
|
|
401
462
|
ttlMs: number;
|
|
402
463
|
ttlRemainingMs: number;
|
|
403
464
|
} | undefined;
|
|
465
|
+
/** Rows the query would return without limit/offset — only when `total: true` was asked for. */
|
|
466
|
+
totalCount?(): number | undefined;
|
|
404
467
|
}
|
|
405
468
|
export interface AnalyticsPortletProps {
|
|
406
469
|
query: string;
|
|
@@ -464,6 +527,34 @@ export interface ChartProps {
|
|
|
464
527
|
onDataPointClick?: (event: import('./types/drill.js').ChartDataPointClickEvent) => void;
|
|
465
528
|
/** Whether drill-down is enabled (shows pointer cursor on clickable elements) */
|
|
466
529
|
drillEnabled?: boolean;
|
|
530
|
+
/**
|
|
531
|
+
* Server-side pagination, supplied by hosts that can re-query (the dashboard
|
|
532
|
+
* portlet). Absent in the AnalysisBuilder preview, the notebook and plugin
|
|
533
|
+
* hosts, where a chart pages and sorts over the rows it already has.
|
|
534
|
+
*/
|
|
535
|
+
pagination?: ChartPagination;
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Paging and sorting state a host drives on the chart's behalf.
|
|
539
|
+
*
|
|
540
|
+
* Sort lives here rather than in the chart because with server-side paging a
|
|
541
|
+
* header click has to re-order the whole result set: sorting only the loaded
|
|
542
|
+
* page would put the wrong rows on page 1.
|
|
543
|
+
*/
|
|
544
|
+
export interface ChartPagination {
|
|
545
|
+
page: number;
|
|
546
|
+
pageSize: number;
|
|
547
|
+
pageSizeOptions: number[];
|
|
548
|
+
/** Total matching rows, once the server has reported one. */
|
|
549
|
+
total?: number;
|
|
550
|
+
sort?: {
|
|
551
|
+
column: string;
|
|
552
|
+
direction: 'asc' | 'desc';
|
|
553
|
+
};
|
|
554
|
+
setPage: (page: number) => void;
|
|
555
|
+
setPageSize: (pageSize: number) => void;
|
|
556
|
+
/** Cycles the column asc → desc → unsorted, resetting to the first page. */
|
|
557
|
+
toggleSort: (column: string) => void;
|
|
467
558
|
}
|
|
468
559
|
export interface ThumbnailFeatureConfig {
|
|
469
560
|
enabled: boolean;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ColumnFormatConfig } from '../types.js';
|
|
2
|
+
/** Fallback when an author has not sized a column. */
|
|
3
|
+
export declare const DEFAULT_COLUMN_WIDTH = 160;
|
|
4
|
+
/** Narrower than this and the resize handle overlaps the header text. */
|
|
5
|
+
export declare const MIN_COLUMN_WIDTH = 60;
|
|
6
|
+
/**
|
|
7
|
+
* Identity under which a viewer's column widths are remembered.
|
|
8
|
+
*
|
|
9
|
+
* A chart component has no portlet id, so widths key on the columns themselves:
|
|
10
|
+
* two records tables showing the same fields share widths, which is the
|
|
11
|
+
* behaviour an author would expect from two views of the same records.
|
|
12
|
+
*/
|
|
13
|
+
export declare function columnWidthStorageKey(columns: string[]): string;
|
|
14
|
+
export declare function loadColumnWidths(key: string): Record<string, number>;
|
|
15
|
+
export declare function saveColumnWidths(key: string, widths: Record<string, number>): void;
|
|
16
|
+
/**
|
|
17
|
+
* A viewer's own column order, remembered under the same identity as widths.
|
|
18
|
+
*
|
|
19
|
+
* Stored as a list rather than a map so it survives the author adding or
|
|
20
|
+
* removing a column: {@link applyColumnOrder} reconciles it against the
|
|
21
|
+
* columns that actually exist.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadColumnOrder(key: string): string[];
|
|
24
|
+
export declare function saveColumnOrder(key: string, order: string[]): void;
|
|
25
|
+
/**
|
|
26
|
+
* Lay a remembered order over the columns the chart actually has.
|
|
27
|
+
*
|
|
28
|
+
* Columns the order does not mention keep their authored position relative to
|
|
29
|
+
* the end, so an author adding a column still sees it rather than having it
|
|
30
|
+
* silently swallowed by a stale local order.
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyColumnOrder(columns: string[], order: string[]): string[];
|
|
33
|
+
/** Move one column to another's position, returning a new order. */
|
|
34
|
+
export declare function moveColumn(columns: string[], from: string, to: string): string[];
|
|
35
|
+
/**
|
|
36
|
+
* A cell resolved to something renderable. `progress` carries its own shape
|
|
37
|
+
* because the component draws a bar or a ring rather than a string; every
|
|
38
|
+
* other kind reduces to text plus, for badges, a colour.
|
|
39
|
+
*
|
|
40
|
+
* The component only ever sees a `RenderedCell`, so the progress `style` is
|
|
41
|
+
* resolved here rather than being read back out of the column's config.
|
|
42
|
+
*/
|
|
43
|
+
export type RenderedCell = {
|
|
44
|
+
kind: 'text';
|
|
45
|
+
text: string;
|
|
46
|
+
} | {
|
|
47
|
+
kind: 'badge';
|
|
48
|
+
text: string;
|
|
49
|
+
colorIndex?: number;
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'progress';
|
|
52
|
+
text: string;
|
|
53
|
+
fraction: number;
|
|
54
|
+
style: 'bar' | 'circle';
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Turn a raw cell value into its display form under the column's format.
|
|
58
|
+
*
|
|
59
|
+
* Every kind degrades to text rather than erroring: a non-numeric value under
|
|
60
|
+
* `number`/`progress` renders as-is (EAV columns legitimately contain 'n/a'),
|
|
61
|
+
* and a badge value with no colour mapping renders neutral rather than being
|
|
62
|
+
* given a guessed colour.
|
|
63
|
+
*/
|
|
64
|
+
export declare function renderCellValue(value: unknown, format: ColumnFormatConfig | undefined): RenderedCell;
|
|
65
|
+
/**
|
|
66
|
+
* Sort rows by one column, client-side.
|
|
67
|
+
*
|
|
68
|
+
* Only used when the host provides no server-side pagination — with paging on,
|
|
69
|
+
* sorting the loaded page alone would put the wrong rows on page 1.
|
|
70
|
+
*/
|
|
71
|
+
export declare function sortRows(rows: Record<string, unknown>[], column: string, direction: 'asc' | 'desc'): Record<string, unknown>[];
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row click-through URLs for the records table.
|
|
3
|
+
*
|
|
4
|
+
* A dashboard author writes a template such as `/employees/{Employees.id}`,
|
|
5
|
+
* and each row fills its own tokens. The template is author-controlled but the
|
|
6
|
+
* *values* are data, so they are percent-encoded before substitution — an
|
|
7
|
+
* encoded value cannot introduce a scheme, a path segment or a query separator.
|
|
8
|
+
*
|
|
9
|
+
* The resulting URL is then checked rather than trusted: only same-origin
|
|
10
|
+
* relative paths and absolute http(s) URLs are allowed through.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a row link template against one row.
|
|
14
|
+
*
|
|
15
|
+
* Returns `null` — meaning "render no link" — when the template references a
|
|
16
|
+
* field the row does not carry, or when the result is not a URL we are willing
|
|
17
|
+
* to navigate to. Never throws: a malformed template must not take the table
|
|
18
|
+
* down with it.
|
|
19
|
+
*
|
|
20
|
+
* @param template - e.g. `/employees/{Employees.id}?tab=profile`
|
|
21
|
+
* @param row - the row's values, including hidden columns
|
|
22
|
+
* @param origin - the origin relative URLs are resolved against
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildRowUrl(template: string | undefined, row: Record<string, unknown>, origin?: string): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Whether a URL is one we will navigate to: an absolute `http(s)` URL, or a
|
|
27
|
+
* path that stays on this origin.
|
|
28
|
+
*
|
|
29
|
+
* Rejected, deliberately: `javascript:`, `data:`, `vbscript:` and every other
|
|
30
|
+
* scheme; protocol-relative `//evil.example`, which inherits the current scheme
|
|
31
|
+
* and silently leaves the origin; and backslash forms such as `\\evil.example`
|
|
32
|
+
* or `/\evil.example`, which several browsers normalise into that same
|
|
33
|
+
* protocol-relative shape.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isSafeUrl(url: string, origin?: string): boolean;
|
|
@@ -111,6 +111,17 @@ export interface DatabaseAdapter {
|
|
|
111
111
|
* @returns SQL expression with type casting
|
|
112
112
|
*/
|
|
113
113
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
114
|
+
/**
|
|
115
|
+
* Cast expression to specific database type, tolerantly: unparseable input yields NULL
|
|
116
|
+
* instead of raising an error (PostgreSQL's `::`/`CAST` on bad input) or silently producing
|
|
117
|
+
* 0 (MySQL/SQLite `CAST` on non-numeric text). Intended for EAV-style schemas where a text
|
|
118
|
+
* column holds numbers/timestamps for some attributes and free text for others, so one dirty
|
|
119
|
+
* value doesn't fail the whole query or masquerade as a real 0.
|
|
120
|
+
* @param fieldExpr - The field expression to cast
|
|
121
|
+
* @param targetType - Target database type
|
|
122
|
+
* @returns SQL expression with tolerant type casting; unparseable/NULL input yields NULL
|
|
123
|
+
*/
|
|
124
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
114
125
|
/**
|
|
115
126
|
* Build AVG aggregation expression with database-specific null handling
|
|
116
127
|
* @param fieldExpr - The field expression to average
|
|
@@ -216,6 +227,7 @@ export declare abstract class BaseDatabaseAdapter implements DatabaseAdapter {
|
|
|
216
227
|
abstract buildPeriodSeriesSubquery(maxPeriod: number): SQL;
|
|
217
228
|
abstract buildTimeDimension(granularity: TimeGranularity, fieldExpr: AnyColumn | SQL): SQL;
|
|
218
229
|
abstract castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
230
|
+
abstract tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
219
231
|
abstract getCapabilities(): DatabaseCapabilities;
|
|
220
232
|
abstract buildPercentile(fieldExpr: AnyColumn | SQL, percentile: number): SQL | null;
|
|
221
233
|
/**
|
|
@@ -303,6 +315,40 @@ export declare abstract class BaseDatabaseAdapter implements DatabaseAdapter {
|
|
|
303
315
|
field: AnyColumn | SQL;
|
|
304
316
|
direction: 'asc' | 'desc';
|
|
305
317
|
}>, config?: WindowFunctionConfig): SQL | null;
|
|
318
|
+
/**
|
|
319
|
+
* Regex pattern for tryCastToType's decimal guard: optional leading sign, digits with an
|
|
320
|
+
* optional fractional part (or a bare fractional part like `.5`), surrounded by optional
|
|
321
|
+
* spaces; rejects everything else. Shared by PostgreSQL (`~`) and MySQL/SingleStore
|
|
322
|
+
* (`REGEXP`).
|
|
323
|
+
*
|
|
324
|
+
* Deliberately written using only POSIX ERE syntax (`[0-9]` instead of `\d`, a literal
|
|
325
|
+
* space instead of `\s`) rather than Perl/ICU shorthands. PostgreSQL's `~` always
|
|
326
|
+
* understands `\d`/`\s`, and MySQL 8.0.4+'s default ICU regex engine does too — but
|
|
327
|
+
* SingleStore's `REGEXP` is dialect-switchable via the `regexp_format` session variable
|
|
328
|
+
* ('extended' = POSIX ERE, 'advanced' = ICU/PCRE-style), and SingleStore's own docs
|
|
329
|
+
* recommend explicitly opting into 'advanced' for new regex logic, implying 'extended'
|
|
330
|
+
* (POSIX, no `\d`/`\s`) is the default. Since SingleStoreAdapter inherits this pattern
|
|
331
|
+
* unchanged from MySQLAdapter and this repo doesn't control session variables for
|
|
332
|
+
* consumers, the pattern is written as the POSIX-ERE/ICU/ARE intersection so it matches
|
|
333
|
+
* correctly regardless of which dialect is active.
|
|
334
|
+
*/
|
|
335
|
+
protected decimalTryCastPattern(): string;
|
|
336
|
+
/**
|
|
337
|
+
* Regex pattern for tryCastToType's integer guard: optional leading sign, digits only,
|
|
338
|
+
* surrounded by optional spaces. Same POSIX-ERE/ICU/ARE-portable rationale as
|
|
339
|
+
* decimalTryCastPattern().
|
|
340
|
+
*/
|
|
341
|
+
protected integerTryCastPattern(): string;
|
|
342
|
+
/**
|
|
343
|
+
* Regex pattern for tryCastToType's timestamp guard: an ISO 8601-shaped date, optionally
|
|
344
|
+
* followed by a time component (with optional seconds, fractional seconds and a UTC/offset
|
|
345
|
+
* suffix), surrounded by optional spaces. This only validates the *shape* of the input —
|
|
346
|
+
* it does not catch calendar-invalid dates (e.g. 2024-02-30) or reject strings that "look"
|
|
347
|
+
* like a timestamp but aren't (that would need engine-side parsing, which is exactly what
|
|
348
|
+
* tryCastToType is avoiding relying on for error-safety). Same POSIX-ERE/ICU/ARE-portable
|
|
349
|
+
* rationale as decimalTryCastPattern().
|
|
350
|
+
*/
|
|
351
|
+
protected timestampTryCastPattern(): string;
|
|
306
352
|
/**
|
|
307
353
|
* Helper method to build pattern for string matching
|
|
308
354
|
* Can be overridden by specific adapters if needed
|
|
@@ -45,6 +45,11 @@ export declare class DatabendAdapter extends BaseDatabaseAdapter {
|
|
|
45
45
|
* Databend supports both :: syntax and CAST() function
|
|
46
46
|
*/
|
|
47
47
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
48
|
+
/**
|
|
49
|
+
* Build Databend tolerant type casting using the native TRY_CAST function, which returns
|
|
50
|
+
* NULL on conversion failure instead of raising an error (unlike `::`/CAST).
|
|
51
|
+
*/
|
|
52
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
48
53
|
/**
|
|
49
54
|
* Databend capabilities - start conservative
|
|
50
55
|
*/
|
|
@@ -52,6 +52,11 @@ export declare class DuckDBAdapter extends BaseDatabaseAdapter {
|
|
|
52
52
|
* DuckDB supports both :: syntax and CAST() function
|
|
53
53
|
*/
|
|
54
54
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
55
|
+
/**
|
|
56
|
+
* Build DuckDB tolerant type casting using the native TRY_CAST function, which returns
|
|
57
|
+
* NULL on conversion failure instead of raising an error (unlike `::`/CAST).
|
|
58
|
+
*/
|
|
59
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
55
60
|
/**
|
|
56
61
|
* DuckDB has full support for statistical and window functions
|
|
57
62
|
* Note: supportsPercentileSubqueries is false because DuckDB's QUANTILE_CONT
|
|
@@ -47,6 +47,20 @@ export declare class MySQLAdapter extends BaseDatabaseAdapter {
|
|
|
47
47
|
* MySQL equivalent to PostgreSQL's :: casting syntax
|
|
48
48
|
*/
|
|
49
49
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
50
|
+
/**
|
|
51
|
+
* Build MySQL tolerant type casting: NULL on unparseable input instead of MySQL's usual
|
|
52
|
+
* lenient-but-wrong behaviour. `CAST(x AS DECIMAL/SIGNED)` parses a leading numeric prefix
|
|
53
|
+
* (or returns 0 with a warning if there's no numeric prefix at all) rather than erroring —
|
|
54
|
+
* so a dirty value like 'n/a' silently becomes 0. `CAST(x AS DATETIME)` on a string that
|
|
55
|
+
* merely looks date-shaped but is calendar-invalid can, depending on sql_mode, raise an
|
|
56
|
+
* error (strict mode, the MySQL 8 default) rather than returning NULL. Guard all three with
|
|
57
|
+
* REGEXP so we only ever attempt the cast on input that already looks like the target type;
|
|
58
|
+
* anything else short-circuits to NULL first.
|
|
59
|
+
*
|
|
60
|
+
* The timestamp guard only validates ISO 8601 *shape* — it will not catch calendar-invalid
|
|
61
|
+
* dates like 2024-02-30, which could still error under strict SQL mode.
|
|
62
|
+
*/
|
|
63
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
50
64
|
/**
|
|
51
65
|
* MySQL AVG/STDDEV/VARIANCE use IFNULL (no COALESCE-for-zero idiom mismatch,
|
|
52
66
|
* but IFNULL is the MySQL-idiomatic null guard).
|
|
@@ -43,6 +43,21 @@ export declare class PostgresAdapter extends BaseDatabaseAdapter {
|
|
|
43
43
|
* Extracted from various locations where ::timestamp was used
|
|
44
44
|
*/
|
|
45
45
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
46
|
+
/**
|
|
47
|
+
* Build PostgreSQL tolerant type casting: NULL on unparseable input instead of an error.
|
|
48
|
+
* PostgreSQL has no TRY_CAST, and `CAST(x AS type DEFAULT NULL ON ERROR)` (added in a
|
|
49
|
+
* recent PostgreSQL release) requires a minimum server version. This repo pins no minimum
|
|
50
|
+
* PostgreSQL version anywhere (CI/dev docker-compose both run `postgres:18`, but nothing
|
|
51
|
+
* documents that as a floor for consumers), so we don't assume newer syntax is available.
|
|
52
|
+
* Instead, guard the cast with a POSIX regex (`~`) so we only ever attempt to cast values
|
|
53
|
+
* that already look like the target type; anything else short-circuits to NULL before the
|
|
54
|
+
* cast runs, so PostgreSQL never gets a chance to raise.
|
|
55
|
+
*
|
|
56
|
+
* The timestamp guard only validates ISO 8601 *shape* (see timestampTryCastPattern) — it
|
|
57
|
+
* will not catch calendar-invalid dates like 2024-02-30, which would still error. A full
|
|
58
|
+
* guarantee would need a helper SQL function (out of scope here).
|
|
59
|
+
*/
|
|
60
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
46
61
|
/**
|
|
47
62
|
* PostgreSQL has full support for statistical and window functions
|
|
48
63
|
*/
|
|
@@ -41,6 +41,12 @@ export declare class SnowflakeAdapter extends BaseDatabaseAdapter {
|
|
|
41
41
|
* Snowflake supports both :: syntax and CAST() function
|
|
42
42
|
*/
|
|
43
43
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
44
|
+
/**
|
|
45
|
+
* Build Snowflake tolerant type casting using the native TRY_CAST function, which returns
|
|
46
|
+
* NULL on conversion failure instead of raising an error (unlike `::`/CAST). Snowflake's
|
|
47
|
+
* TRY_CAST supports VARCHAR, NUMBER-family types (including DECIMAL) and TIMESTAMP.
|
|
48
|
+
*/
|
|
49
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
44
50
|
/**
|
|
45
51
|
* Snowflake capabilities - full SQL support
|
|
46
52
|
*/
|
|
@@ -51,6 +51,27 @@ export declare class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
51
51
|
* SQLite has dynamic typing but supports CAST for consistency
|
|
52
52
|
*/
|
|
53
53
|
castToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
54
|
+
/**
|
|
55
|
+
* Build SQLite tolerant type casting: NULL on unparseable input instead of SQLite's usual
|
|
56
|
+
* dynamic-typing behaviour. SQLite's CAST-to-numeric applies "prefix" conversion — the
|
|
57
|
+
* longest numeric prefix of the string is used, or 0 if there is none — so `CAST('n/a' AS
|
|
58
|
+
* REAL)` silently yields 0.0 rather than erroring or returning NULL.
|
|
59
|
+
*
|
|
60
|
+
* SQLite has no REGEXP operator by default (it requires loading an extension, same
|
|
61
|
+
* limitation regexCondition() works around with GLOB). GLOB's `*`/`?`/`[...]` syntax can't
|
|
62
|
+
* express "one or more digits" directly, but the standard SQLite idiom for "string contains
|
|
63
|
+
* only characters from a set" is `NOT x GLOB '*[^set]*'` — true only if no character outside
|
|
64
|
+
* the set appears anywhere. That's what's used below to validate the trimmed value contains
|
|
65
|
+
* only the characters a valid decimal/integer/epoch-ms value could use, before attempting
|
|
66
|
+
* the cast; empty/whitespace-only strings are excluded separately.
|
|
67
|
+
*
|
|
68
|
+
* Known limitation: this is a character-set check, not a full grammar check, so a malformed
|
|
69
|
+
* value that still only uses allowed characters (e.g. '1.2.3' or '+-5') passes the guard and
|
|
70
|
+
* is then handled by SQLite's own prefix-based numeric parsing (never an error, but not
|
|
71
|
+
* necessarily NULL either). Clearly non-numeric input (letters, 'n/a', punctuation outside
|
|
72
|
+
* the allowed set) is reliably rejected to NULL, which is the case this method exists for.
|
|
73
|
+
*/
|
|
74
|
+
tryCastToType(fieldExpr: AnyColumn | SQL, targetType: 'timestamp' | 'decimal' | 'integer'): SQL;
|
|
54
75
|
/**
|
|
55
76
|
* SQLite AVG uses IFNULL rather than COALESCE for null-to-zero handling.
|
|
56
77
|
*/
|
|
@@ -12,7 +12,7 @@ interface ValidationResult {
|
|
|
12
12
|
/**
|
|
13
13
|
* Validate chartConfig against the chart type's drop zone requirements.
|
|
14
14
|
*/
|
|
15
|
-
export declare function validateChartConfig(chartType: string, chartConfig: Record<string, unknown> | undefined,
|
|
15
|
+
export declare function validateChartConfig(chartType: string, chartConfig: Record<string, unknown> | undefined, query: Record<string, unknown>): ValidationResult;
|
|
16
16
|
export declare function inferChartConfig(chartType: string, chartConfig: Record<string, unknown> | undefined, query: Record<string, unknown>): Record<string, unknown>;
|
|
17
17
|
/**
|
|
18
18
|
* Build per-chart-type requirements text for the agent tool description.
|