@databricks/appkit-ui 0.0.2

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 (359) hide show
  1. package/CLAUDE.md +3 -0
  2. package/DCO +25 -0
  3. package/LICENSE +203 -0
  4. package/NOTICE.md +73 -0
  5. package/README.md +35 -0
  6. package/bin/setup-claude.js +190 -0
  7. package/dist/js/arrow/arrow-client.d.ts +64 -0
  8. package/dist/js/arrow/arrow-client.d.ts.map +1 -0
  9. package/dist/js/arrow/arrow-client.js +181 -0
  10. package/dist/js/arrow/arrow-client.js.map +1 -0
  11. package/dist/js/arrow/index.js +3 -0
  12. package/dist/js/arrow/lazy-arrow.d.ts +23 -0
  13. package/dist/js/arrow/lazy-arrow.d.ts.map +1 -0
  14. package/dist/js/arrow/lazy-arrow.js +86 -0
  15. package/dist/js/arrow/lazy-arrow.js.map +1 -0
  16. package/dist/js/constants.d.ts +10 -0
  17. package/dist/js/constants.d.ts.map +1 -0
  18. package/dist/js/constants.js +30 -0
  19. package/dist/js/constants.js.map +1 -0
  20. package/dist/js/index.d.ts +8 -0
  21. package/dist/js/index.js +8 -0
  22. package/dist/js/sse/connect-sse.d.ts +14 -0
  23. package/dist/js/sse/connect-sse.d.ts.map +1 -0
  24. package/dist/js/sse/connect-sse.js +128 -0
  25. package/dist/js/sse/connect-sse.js.map +1 -0
  26. package/dist/js/sse/types.d.ts +34 -0
  27. package/dist/js/sse/types.d.ts.map +1 -0
  28. package/dist/react/charts/area/index.d.ts +33 -0
  29. package/dist/react/charts/area/index.d.ts.map +1 -0
  30. package/dist/react/charts/area/index.js +29 -0
  31. package/dist/react/charts/area/index.js.map +1 -0
  32. package/dist/react/charts/bar/index.d.ts +43 -0
  33. package/dist/react/charts/bar/index.d.ts.map +1 -0
  34. package/dist/react/charts/bar/index.js +39 -0
  35. package/dist/react/charts/bar/index.js.map +1 -0
  36. package/dist/react/charts/base.d.ts +89 -0
  37. package/dist/react/charts/base.d.ts.map +1 -0
  38. package/dist/react/charts/base.js +123 -0
  39. package/dist/react/charts/base.js.map +1 -0
  40. package/dist/react/charts/chart-error-boundary.js +37 -0
  41. package/dist/react/charts/chart-error-boundary.js.map +1 -0
  42. package/dist/react/charts/constants.d.ts +22 -0
  43. package/dist/react/charts/constants.d.ts.map +1 -0
  44. package/dist/react/charts/constants.js +86 -0
  45. package/dist/react/charts/constants.js.map +1 -0
  46. package/dist/react/charts/create-chart.d.ts +26 -0
  47. package/dist/react/charts/create-chart.d.ts.map +1 -0
  48. package/dist/react/charts/create-chart.js +55 -0
  49. package/dist/react/charts/create-chart.js.map +1 -0
  50. package/dist/react/charts/empty.js +16 -0
  51. package/dist/react/charts/empty.js.map +1 -0
  52. package/dist/react/charts/error.js +16 -0
  53. package/dist/react/charts/error.js.map +1 -0
  54. package/dist/react/charts/heatmap/index.d.ts +42 -0
  55. package/dist/react/charts/heatmap/index.d.ts.map +1 -0
  56. package/dist/react/charts/heatmap/index.js +38 -0
  57. package/dist/react/charts/heatmap/index.js.map +1 -0
  58. package/dist/react/charts/index.js +18 -0
  59. package/dist/react/charts/line/index.d.ts +34 -0
  60. package/dist/react/charts/line/index.d.ts.map +1 -0
  61. package/dist/react/charts/line/index.js +30 -0
  62. package/dist/react/charts/line/index.js.map +1 -0
  63. package/dist/react/charts/loading.js +13 -0
  64. package/dist/react/charts/loading.js.map +1 -0
  65. package/dist/react/charts/normalize.d.ts +37 -0
  66. package/dist/react/charts/normalize.d.ts.map +1 -0
  67. package/dist/react/charts/normalize.js +256 -0
  68. package/dist/react/charts/normalize.js.map +1 -0
  69. package/dist/react/charts/options.d.ts +39 -0
  70. package/dist/react/charts/options.d.ts.map +1 -0
  71. package/dist/react/charts/options.js +212 -0
  72. package/dist/react/charts/options.js.map +1 -0
  73. package/dist/react/charts/pie/index.d.ts +57 -0
  74. package/dist/react/charts/pie/index.d.ts.map +1 -0
  75. package/dist/react/charts/pie/index.js +50 -0
  76. package/dist/react/charts/pie/index.js.map +1 -0
  77. package/dist/react/charts/radar/index.d.ts +32 -0
  78. package/dist/react/charts/radar/index.d.ts.map +1 -0
  79. package/dist/react/charts/radar/index.js +28 -0
  80. package/dist/react/charts/radar/index.js.map +1 -0
  81. package/dist/react/charts/scatter/index.d.ts +32 -0
  82. package/dist/react/charts/scatter/index.d.ts.map +1 -0
  83. package/dist/react/charts/scatter/index.js +28 -0
  84. package/dist/react/charts/scatter/index.js.map +1 -0
  85. package/dist/react/charts/theme.d.ts +23 -0
  86. package/dist/react/charts/theme.d.ts.map +1 -0
  87. package/dist/react/charts/theme.js +96 -0
  88. package/dist/react/charts/theme.js.map +1 -0
  89. package/dist/react/charts/types.d.ts +160 -0
  90. package/dist/react/charts/types.d.ts.map +1 -0
  91. package/dist/react/charts/types.js +17 -0
  92. package/dist/react/charts/types.js.map +1 -0
  93. package/dist/react/charts/utils.d.ts +36 -0
  94. package/dist/react/charts/utils.d.ts.map +1 -0
  95. package/dist/react/charts/utils.js +77 -0
  96. package/dist/react/charts/utils.js.map +1 -0
  97. package/dist/react/charts/wrapper.d.ts +65 -0
  98. package/dist/react/charts/wrapper.d.ts.map +1 -0
  99. package/dist/react/charts/wrapper.js +94 -0
  100. package/dist/react/charts/wrapper.js.map +1 -0
  101. package/dist/react/hooks/index.js +2 -0
  102. package/dist/react/hooks/types.d.ts +101 -0
  103. package/dist/react/hooks/types.d.ts.map +1 -0
  104. package/dist/react/hooks/use-analytics-query.d.ts +33 -0
  105. package/dist/react/hooks/use-analytics-query.d.ts.map +1 -0
  106. package/dist/react/hooks/use-analytics-query.js +146 -0
  107. package/dist/react/hooks/use-analytics-query.js.map +1 -0
  108. package/dist/react/hooks/use-chart-data.d.ts +54 -0
  109. package/dist/react/hooks/use-chart-data.d.ts.map +1 -0
  110. package/dist/react/hooks/use-chart-data.js +80 -0
  111. package/dist/react/hooks/use-chart-data.js.map +1 -0
  112. package/dist/react/hooks/use-mobile.js +21 -0
  113. package/dist/react/hooks/use-mobile.js.map +1 -0
  114. package/dist/react/hooks/use-query-hmr.js +19 -0
  115. package/dist/react/hooks/use-query-hmr.js.map +1 -0
  116. package/dist/react/index.d.ts +75 -0
  117. package/dist/react/index.js +79 -0
  118. package/dist/react/lib/format.js +42 -0
  119. package/dist/react/lib/format.js.map +1 -0
  120. package/dist/react/lib/utils.js +11 -0
  121. package/dist/react/lib/utils.js.map +1 -0
  122. package/dist/react/table/data-table.d.ts +47 -0
  123. package/dist/react/table/data-table.d.ts.map +1 -0
  124. package/dist/react/table/data-table.js +205 -0
  125. package/dist/react/table/data-table.js.map +1 -0
  126. package/dist/react/table/empty.js +16 -0
  127. package/dist/react/table/empty.js.map +1 -0
  128. package/dist/react/table/error.js +16 -0
  129. package/dist/react/table/error.js.map +1 -0
  130. package/dist/react/table/index.js +1 -0
  131. package/dist/react/table/loading.js +50 -0
  132. package/dist/react/table/loading.js.map +1 -0
  133. package/dist/react/table/table-wrapper.js +143 -0
  134. package/dist/react/table/table-wrapper.js.map +1 -0
  135. package/dist/react/table/types.d.ts +55 -0
  136. package/dist/react/table/types.d.ts.map +1 -0
  137. package/dist/react/ui/accordion.d.ts +25 -0
  138. package/dist/react/ui/accordion.d.ts.map +1 -0
  139. package/dist/react/ui/accordion.js +45 -0
  140. package/dist/react/ui/accordion.js.map +1 -0
  141. package/dist/react/ui/alert-dialog.d.ts +49 -0
  142. package/dist/react/ui/alert-dialog.d.ts.map +1 -0
  143. package/dist/react/ui/alert-dialog.js +82 -0
  144. package/dist/react/ui/alert-dialog.js.map +1 -0
  145. package/dist/react/ui/alert.d.ts +25 -0
  146. package/dist/react/ui/alert.d.ts.map +1 -0
  147. package/dist/react/ui/alert.js +38 -0
  148. package/dist/react/ui/alert.js.map +1 -0
  149. package/dist/react/ui/aspect-ratio.d.ts +10 -0
  150. package/dist/react/ui/aspect-ratio.d.ts.map +1 -0
  151. package/dist/react/ui/aspect-ratio.js +16 -0
  152. package/dist/react/ui/aspect-ratio.js.map +1 -0
  153. package/dist/react/ui/avatar.d.ts +20 -0
  154. package/dist/react/ui/avatar.d.ts.map +1 -0
  155. package/dist/react/ui/avatar.js +30 -0
  156. package/dist/react/ui/avatar.js.map +1 -0
  157. package/dist/react/ui/badge.d.ts +20 -0
  158. package/dist/react/ui/badge.d.ts.map +1 -0
  159. package/dist/react/ui/badge.js +26 -0
  160. package/dist/react/ui/badge.js.map +1 -0
  161. package/dist/react/ui/breadcrumb.d.ts +38 -0
  162. package/dist/react/ui/breadcrumb.d.ts.map +1 -0
  163. package/dist/react/ui/breadcrumb.js +71 -0
  164. package/dist/react/ui/breadcrumb.js.map +1 -0
  165. package/dist/react/ui/button-group.d.ts +29 -0
  166. package/dist/react/ui/button-group.d.ts.map +1 -0
  167. package/dist/react/ui/button-group.js +41 -0
  168. package/dist/react/ui/button-group.js.map +1 -0
  169. package/dist/react/ui/button.d.ts +22 -0
  170. package/dist/react/ui/button.d.ts.map +1 -0
  171. package/dist/react/ui/button.js +45 -0
  172. package/dist/react/ui/button.js.map +1 -0
  173. package/dist/react/ui/calendar.d.ts +27 -0
  174. package/dist/react/ui/calendar.d.ts.map +1 -0
  175. package/dist/react/ui/calendar.js +109 -0
  176. package/dist/react/ui/calendar.js.map +1 -0
  177. package/dist/react/ui/card.d.ts +35 -0
  178. package/dist/react/ui/card.d.ts.map +1 -0
  179. package/dist/react/ui/card.js +57 -0
  180. package/dist/react/ui/card.js.map +1 -0
  181. package/dist/react/ui/carousel.d.ts +48 -0
  182. package/dist/react/ui/carousel.d.ts.map +1 -0
  183. package/dist/react/ui/carousel.js +134 -0
  184. package/dist/react/ui/carousel.js.map +1 -0
  185. package/dist/react/ui/chart.d.ts +80 -0
  186. package/dist/react/ui/chart.d.ts.map +1 -0
  187. package/dist/react/ui/chart.js +143 -0
  188. package/dist/react/ui/chart.js.map +1 -0
  189. package/dist/react/ui/checkbox.d.ts +12 -0
  190. package/dist/react/ui/checkbox.d.ts.map +1 -0
  191. package/dist/react/ui/checkbox.js +24 -0
  192. package/dist/react/ui/checkbox.js.map +1 -0
  193. package/dist/react/ui/collapsible.d.ts +16 -0
  194. package/dist/react/ui/collapsible.d.ts.map +1 -0
  195. package/dist/react/ui/collapsible.js +26 -0
  196. package/dist/react/ui/collapsible.js.map +1 -0
  197. package/dist/react/ui/command.d.ts +53 -0
  198. package/dist/react/ui/command.d.ts.map +1 -0
  199. package/dist/react/ui/command.js +87 -0
  200. package/dist/react/ui/command.js.map +1 -0
  201. package/dist/react/ui/context-menu.d.ts +77 -0
  202. package/dist/react/ui/context-menu.d.ts.map +1 -0
  203. package/dist/react/ui/context-menu.js +125 -0
  204. package/dist/react/ui/context-menu.js.map +1 -0
  205. package/dist/react/ui/dialog.d.ts +48 -0
  206. package/dist/react/ui/dialog.d.ts.map +1 -0
  207. package/dist/react/ui/dialog.js +87 -0
  208. package/dist/react/ui/dialog.js.map +1 -0
  209. package/dist/react/ui/drawer.d.ts +45 -0
  210. package/dist/react/ui/drawer.d.ts.map +1 -0
  211. package/dist/react/ui/drawer.js +81 -0
  212. package/dist/react/ui/drawer.js.map +1 -0
  213. package/dist/react/ui/dropdown-menu.d.ts +78 -0
  214. package/dist/react/ui/dropdown-menu.d.ts.map +1 -0
  215. package/dist/react/ui/dropdown-menu.js +124 -0
  216. package/dist/react/ui/dropdown-menu.js.map +1 -0
  217. package/dist/react/ui/empty.d.ts +36 -0
  218. package/dist/react/ui/empty.d.ts.map +1 -0
  219. package/dist/react/ui/empty.js +62 -0
  220. package/dist/react/ui/empty.js.map +1 -0
  221. package/dist/react/ui/field.d.ts +65 -0
  222. package/dist/react/ui/field.d.ts.map +1 -0
  223. package/dist/react/ui/field.js +120 -0
  224. package/dist/react/ui/field.js.map +1 -0
  225. package/dist/react/ui/form.d.ts +46 -0
  226. package/dist/react/ui/form.d.ts.map +1 -0
  227. package/dist/react/ui/form.js +92 -0
  228. package/dist/react/ui/form.js.map +1 -0
  229. package/dist/react/ui/hover-card.d.ts +20 -0
  230. package/dist/react/ui/hover-card.d.ts.map +1 -0
  231. package/dist/react/ui/hover-card.js +35 -0
  232. package/dist/react/ui/hover-card.js.map +1 -0
  233. package/dist/react/ui/index.js +53 -0
  234. package/dist/react/ui/input-group.d.ts +44 -0
  235. package/dist/react/ui/input-group.d.ts.map +1 -0
  236. package/dist/react/ui/input-group.js +82 -0
  237. package/dist/react/ui/input-group.js.map +1 -0
  238. package/dist/react/ui/input-otp.d.ts +29 -0
  239. package/dist/react/ui/input-otp.d.ts.map +1 -0
  240. package/dist/react/ui/input-otp.js +47 -0
  241. package/dist/react/ui/input-otp.js.map +1 -0
  242. package/dist/react/ui/input.d.ts +12 -0
  243. package/dist/react/ui/input.d.ts.map +1 -0
  244. package/dist/react/ui/input.js +16 -0
  245. package/dist/react/ui/input.js.map +1 -0
  246. package/dist/react/ui/item.d.ts +63 -0
  247. package/dist/react/ui/item.d.ts.map +1 -0
  248. package/dist/react/ui/item.js +118 -0
  249. package/dist/react/ui/item.js.map +1 -0
  250. package/dist/react/ui/kbd.d.ts +14 -0
  251. package/dist/react/ui/kbd.d.ts.map +1 -0
  252. package/dist/react/ui/kbd.js +22 -0
  253. package/dist/react/ui/kbd.js.map +1 -0
  254. package/dist/react/ui/label.d.ts +12 -0
  255. package/dist/react/ui/label.d.ts.map +1 -0
  256. package/dist/react/ui/label.js +18 -0
  257. package/dist/react/ui/label.js.map +1 -0
  258. package/dist/react/ui/menubar.d.ts +85 -0
  259. package/dist/react/ui/menubar.d.ts.map +1 -0
  260. package/dist/react/ui/menubar.js +134 -0
  261. package/dist/react/ui/menubar.js.map +1 -0
  262. package/dist/react/ui/navigation-menu.d.ts +47 -0
  263. package/dist/react/ui/navigation-menu.d.ts.map +1 -0
  264. package/dist/react/ui/navigation-menu.js +82 -0
  265. package/dist/react/ui/navigation-menu.js.map +1 -0
  266. package/dist/react/ui/pagination.d.ts +40 -0
  267. package/dist/react/ui/pagination.d.ts.map +1 -0
  268. package/dist/react/ui/pagination.js +80 -0
  269. package/dist/react/ui/pagination.js.map +1 -0
  270. package/dist/react/ui/popover.d.ts +23 -0
  271. package/dist/react/ui/popover.d.ts.map +1 -0
  272. package/dist/react/ui/popover.js +38 -0
  273. package/dist/react/ui/popover.js.map +1 -0
  274. package/dist/react/ui/progress.d.ts +13 -0
  275. package/dist/react/ui/progress.d.ts.map +1 -0
  276. package/dist/react/ui/progress.js +21 -0
  277. package/dist/react/ui/progress.js.map +1 -0
  278. package/dist/react/ui/radio-group.d.ts +16 -0
  279. package/dist/react/ui/radio-group.d.ts.map +1 -0
  280. package/dist/react/ui/radio-group.js +31 -0
  281. package/dist/react/ui/radio-group.js.map +1 -0
  282. package/dist/react/ui/resizable.d.ts +22 -0
  283. package/dist/react/ui/resizable.d.ts.map +1 -0
  284. package/dist/react/ui/resizable.js +34 -0
  285. package/dist/react/ui/resizable.js.map +1 -0
  286. package/dist/react/ui/scroll-area.d.ts +18 -0
  287. package/dist/react/ui/scroll-area.d.ts.map +1 -0
  288. package/dist/react/ui/scroll-area.js +39 -0
  289. package/dist/react/ui/scroll-area.js.map +1 -0
  290. package/dist/react/ui/select.d.ts +53 -0
  291. package/dist/react/ui/select.d.ts.map +1 -0
  292. package/dist/react/ui/select.js +98 -0
  293. package/dist/react/ui/select.js.map +1 -0
  294. package/dist/react/ui/separator.d.ts +14 -0
  295. package/dist/react/ui/separator.d.ts.map +1 -0
  296. package/dist/react/ui/separator.js +20 -0
  297. package/dist/react/ui/separator.js.map +1 -0
  298. package/dist/react/ui/sheet.d.ts +41 -0
  299. package/dist/react/ui/sheet.d.ts.map +1 -0
  300. package/dist/react/ui/sheet.js +83 -0
  301. package/dist/react/ui/sheet.js.map +1 -0
  302. package/dist/react/ui/sidebar.d.ts +167 -0
  303. package/dist/react/ui/sidebar.d.ts.map +1 -0
  304. package/dist/react/ui/sidebar.js +379 -0
  305. package/dist/react/ui/sidebar.js.map +1 -0
  306. package/dist/react/ui/skeleton.d.ts +10 -0
  307. package/dist/react/ui/skeleton.d.ts.map +1 -0
  308. package/dist/react/ui/skeleton.js +15 -0
  309. package/dist/react/ui/skeleton.js.map +1 -0
  310. package/dist/react/ui/slider.d.ts +16 -0
  311. package/dist/react/ui/slider.d.ts.map +1 -0
  312. package/dist/react/ui/slider.js +40 -0
  313. package/dist/react/ui/slider.js.map +1 -0
  314. package/dist/react/ui/sonner.d.ts +10 -0
  315. package/dist/react/ui/sonner.d.ts.map +1 -0
  316. package/dist/react/ui/sonner.js +31 -0
  317. package/dist/react/ui/sonner.js.map +1 -0
  318. package/dist/react/ui/spinner.d.ts +10 -0
  319. package/dist/react/ui/spinner.d.ts.map +1 -0
  320. package/dist/react/ui/spinner.js +17 -0
  321. package/dist/react/ui/spinner.js.map +1 -0
  322. package/dist/react/ui/switch.d.ts +12 -0
  323. package/dist/react/ui/switch.d.ts.map +1 -0
  324. package/dist/react/ui/switch.js +22 -0
  325. package/dist/react/ui/switch.js.map +1 -0
  326. package/dist/react/ui/table.d.ts +39 -0
  327. package/dist/react/ui/table.d.ts.map +1 -0
  328. package/dist/react/ui/table.js +68 -0
  329. package/dist/react/ui/table.js.map +1 -0
  330. package/dist/react/ui/tabs.d.ts +24 -0
  331. package/dist/react/ui/tabs.d.ts.map +1 -0
  332. package/dist/react/ui/tabs.js +39 -0
  333. package/dist/react/ui/tabs.js.map +1 -0
  334. package/dist/react/ui/textarea.d.ts +11 -0
  335. package/dist/react/ui/textarea.d.ts.map +1 -0
  336. package/dist/react/ui/textarea.js +15 -0
  337. package/dist/react/ui/textarea.js.map +1 -0
  338. package/dist/react/ui/toggle-group.d.ts +27 -0
  339. package/dist/react/ui/toggle-group.d.ts.map +1 -0
  340. package/dist/react/ui/toggle-group.js +50 -0
  341. package/dist/react/ui/toggle-group.js.map +1 -0
  342. package/dist/react/ui/toggle.d.ts +20 -0
  343. package/dist/react/ui/toggle.d.ts.map +1 -0
  344. package/dist/react/ui/toggle.js +38 -0
  345. package/dist/react/ui/toggle.js.map +1 -0
  346. package/dist/react/ui/tooltip.d.ts +24 -0
  347. package/dist/react/ui/tooltip.d.ts.map +1 -0
  348. package/dist/react/ui/tooltip.js +39 -0
  349. package/dist/react/ui/tooltip.js.map +1 -0
  350. package/dist/shared/src/sql/helpers.d.ts +160 -0
  351. package/dist/shared/src/sql/helpers.d.ts.map +1 -0
  352. package/dist/shared/src/sql/helpers.js +103 -0
  353. package/dist/shared/src/sql/helpers.js.map +1 -0
  354. package/dist/shared/src/sql/types.d.ts +34 -0
  355. package/dist/shared/src/sql/types.d.ts.map +1 -0
  356. package/dist/styles.css +425 -0
  357. package/llms.txt +193 -0
  358. package/package.json +98 -0
  359. package/scripts/postinstall.js +6 -0
@@ -0,0 +1,160 @@
1
+ import { Table } from "apache-arrow";
2
+
3
+ //#region src/react/charts/types.d.ts
4
+ /** Supported data formats for analytics queries */
5
+ type DataFormat = "json" | "arrow" | "auto";
6
+ /** Chart orientation */
7
+ type Orientation = "vertical" | "horizontal";
8
+ /** Supported chart types */
9
+ type ChartType = "bar" | "line" | "area" | "pie" | "donut" | "scatter" | "radar" | "heatmap";
10
+ /** Data that can be passed to unified charts */
11
+ type ChartData = Table | Record<string, unknown>[];
12
+ /** Color palette types for different visualization needs */
13
+ type ChartColorPalette = "categorical" | "sequential" | "diverging";
14
+ /** Common visual and behavior props for all charts */
15
+ interface ChartBaseProps {
16
+ /** Chart title */
17
+ title?: string;
18
+ /** Show legend */
19
+ showLegend?: boolean;
20
+ /**
21
+ * Color palette to use. Auto-selected based on chart type if not specified.
22
+ * - "categorical": Distinct colors for different categories (bar, pie, line)
23
+ * - "sequential": Gradient for magnitude/intensity (heatmap)
24
+ * - "diverging": Two-tone for positive/negative values
25
+ */
26
+ colorPalette?: ChartColorPalette;
27
+ /** Custom colors for series (overrides colorPalette) */
28
+ colors?: string[];
29
+ /** Chart height in pixels @default 300 */
30
+ height?: number;
31
+ /** Additional CSS classes */
32
+ className?: string;
33
+ /** X-axis field key. Auto-detected from schema if not provided. */
34
+ xKey?: string;
35
+ /** Y-axis field key(s). Auto-detected from schema if not provided. */
36
+ yKey?: string | string[];
37
+ /** Accessibility label for screen readers */
38
+ ariaLabel?: string;
39
+ /** Test ID for automated testing */
40
+ testId?: string;
41
+ /** Additional ECharts options to merge */
42
+ options?: Record<string, unknown>;
43
+ }
44
+ /** Props for query-based data fetching */
45
+ interface QueryProps extends ChartBaseProps {
46
+ /** Analytics query key registered with analytics plugin */
47
+ queryKey: string;
48
+ /** Query parameters passed to the analytics endpoint */
49
+ parameters?: Record<string, unknown>;
50
+ /**
51
+ * Data format to use
52
+ * - "json": Use JSON format (smaller payloads, simpler)
53
+ * - "arrow": Use Arrow format (faster for large datasets)
54
+ * - "auto": Automatically select based on expected data size
55
+ * @default "auto"
56
+ */
57
+ format?: DataFormat;
58
+ /** Transform raw data before rendering */
59
+ transformer?: <T>(data: T) => T;
60
+ data?: never;
61
+ }
62
+ /** Props for direct data injection */
63
+ interface DataProps extends ChartBaseProps {
64
+ /** Arrow Table or JSON array */
65
+ data: ChartData;
66
+ queryKey?: never;
67
+ parameters?: never;
68
+ format?: never;
69
+ transformer?: never;
70
+ }
71
+ /** Base union type - either query-based or data-based */
72
+ type UnifiedChartProps = QueryProps | DataProps;
73
+ /** Props specific to bar charts */
74
+ interface BarChartSpecificProps {
75
+ /** Chart orientation @default "vertical" */
76
+ orientation?: Orientation;
77
+ /** Stack bars */
78
+ stacked?: boolean;
79
+ }
80
+ /** Props specific to line charts */
81
+ interface LineChartSpecificProps {
82
+ /** Chart orientation @default "vertical" */
83
+ orientation?: Orientation;
84
+ /** Show data point symbols @default false */
85
+ showSymbol?: boolean;
86
+ /** Smooth line curves @default true */
87
+ smooth?: boolean;
88
+ }
89
+ /** Props specific to area charts */
90
+ interface AreaChartSpecificProps {
91
+ /** Chart orientation @default "vertical" */
92
+ orientation?: Orientation;
93
+ /** Show data point symbols @default false */
94
+ showSymbol?: boolean;
95
+ /** Smooth line curves @default true */
96
+ smooth?: boolean;
97
+ /** Stack areas @default false */
98
+ stacked?: boolean;
99
+ }
100
+ /** Props specific to scatter charts */
101
+ interface ScatterChartSpecificProps {
102
+ /** Symbol size @default 8 */
103
+ symbolSize?: number;
104
+ }
105
+ /** Props specific to pie/donut charts */
106
+ interface PieChartSpecificProps {
107
+ /** Inner radius for donut charts (0-100%) @default 0 */
108
+ innerRadius?: number;
109
+ /** Show labels on slices @default true */
110
+ showLabels?: boolean;
111
+ /** Label position @default "outside" */
112
+ labelPosition?: "outside" | "inside" | "center";
113
+ }
114
+ /** Props specific to radar charts */
115
+ interface RadarChartSpecificProps {
116
+ /** Show area fill @default true */
117
+ showArea?: boolean;
118
+ }
119
+ /** Props specific to heatmap charts */
120
+ interface HeatmapChartSpecificProps {
121
+ /**
122
+ * Field key for the Y-axis categories.
123
+ * For heatmaps, data should have: xKey (column), yAxisKey (row), and yKey (value).
124
+ */
125
+ yAxisKey?: string;
126
+ /** Min value for color scale (auto-detected if not provided) */
127
+ min?: number;
128
+ /** Max value for color scale (auto-detected if not provided) */
129
+ max?: number;
130
+ /** Show value labels on cells @default false */
131
+ showLabels?: boolean;
132
+ }
133
+ type BarChartProps = (QueryProps | DataProps) & BarChartSpecificProps;
134
+ type LineChartProps = (QueryProps | DataProps) & LineChartSpecificProps;
135
+ type AreaChartProps = (QueryProps | DataProps) & AreaChartSpecificProps;
136
+ type ScatterChartProps = (QueryProps | DataProps) & ScatterChartSpecificProps;
137
+ type PieChartProps = (QueryProps | DataProps) & PieChartSpecificProps;
138
+ type DonutChartProps = (QueryProps | DataProps) & PieChartSpecificProps;
139
+ type RadarChartProps = (QueryProps | DataProps) & RadarChartSpecificProps;
140
+ type HeatmapChartProps = (QueryProps | DataProps) & HeatmapChartSpecificProps;
141
+ /** Base normalized data shared by all chart types */
142
+ interface NormalizedChartDataBase {
143
+ xData: (string | number)[];
144
+ xField: string;
145
+ yFields: string[];
146
+ chartType: "timeseries" | "categorical";
147
+ }
148
+ /** Normalized chart data for rendering (standard charts) */
149
+ interface NormalizedChartData extends NormalizedChartDataBase {
150
+ yDataMap: Record<string, (string | number)[]>;
151
+ }
152
+ /** Type guard to check if data is an Arrow Table */
153
+ declare function isArrowTable(data: ChartData): data is Table;
154
+ /** Type guard to check if props are query-based */
155
+ declare function isQueryProps(props: UnifiedChartProps): props is QueryProps;
156
+ /** Type guard to check if props are data-based */
157
+ declare function isDataProps(props: UnifiedChartProps): props is DataProps;
158
+ //#endregion
159
+ export { AreaChartProps, AreaChartSpecificProps, BarChartProps, BarChartSpecificProps, ChartBaseProps, ChartColorPalette, ChartData, ChartType, DataFormat, DataProps, DonutChartProps, HeatmapChartProps, HeatmapChartSpecificProps, LineChartProps, LineChartSpecificProps, NormalizedChartData, NormalizedChartDataBase, Orientation, PieChartProps, PieChartSpecificProps, QueryProps, RadarChartProps, RadarChartSpecificProps, ScatterChartProps, ScatterChartSpecificProps, UnifiedChartProps, isArrowTable, isDataProps, isQueryProps };
160
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/react/charts/types.ts"],"sourcesContent":[],"mappings":";;;;KAOY,UAAA;AAAZ;AAGY,KAAA,WAAA,GAAW,UAAA,GAAA,YAAA;AAGvB;AAWY,KAXA,SAAA,GAWS,KAAA,GAAA,MAAA,GAAA,MAAA,GAAA,KAAA,GAAA,OAAA,GAAA,SAAA,GAAA,OAAA,GAAA,SAAA;;AAAG,KAAZ,SAAA,GAAY,KAAA,GAAQ,MAAR,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA;;AAAc,KAO1B,iBAAA,GAP0B,aAAA,GAAA,YAAA,GAAA,WAAA;AAOtC;AAGiB,UAAA,cAAA,CAAc;EAAA;OAWd,CAAA,EAAA,MAAA;;EAmBC,UAAA,CAAA,EAAA,OAAA;EAQD;;;;;;cAAmB,CAAA,EA3BnB,iBA2BmB;EAAc;EAyBjC,MAAA,CAAA,EAAA,MAAU,EAAA;EAAA;QAEnB,CAAA,EAAA,MAAA;;EAFyC,SAAA,CAAA,EAAA,MAAA;EAgBrC;EAAiB,IAAA,CAAA,EAAA,MAAA;;MAAgB,CAAA,EAAA,MAAA,GAAA,MAAA,EAAA;EAAS;EAOrC,SAAA,CAAA,EAAA,MAAA;EAQA;EAUA,MAAA,CAAA,EAAA,MAAA;EAYA;EAMA,OAAA,CAAA,EA5FL,MA4FK,CAAA,MAAA,EAAqB,OAAA,CAAA;AAUtC;AAMA;AAkBY,UAtHK,UAAA,SAAmB,cAsHX,CAAA;EAAA;UAAI,EAAA,MAAA;;YAA0B,CAAA,EAlHxC,MAkHwC,CAAA,MAAA,EAAA,OAAA,CAAA;EAAqB;AAC5E;;;;;;EACY,MAAA,CAAA,EA5GD,UA4Ge;EAAA;aAAI,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EA1GJ,CA0GI,EAAA,GA1GE,CA0GF;MAAa,CAAA,EAAA,KAAA;;;AAC/B,UAhGK,SAAA,SAAkB,cAgGN,CAAA;EAAA;MAAI,EA9FzB,SA8FyB;UAAa,CAAA,EAAA,KAAA;YAC5C,CAAA,EAAA,KAAA;EAAyB,MAAA,CAAA,EAAA,KAAA;EACf,WAAA,CAAA,EAAA,KAAa;;;AAAiB,KAlF9B,iBAAA,GAAoB,UAkFU,GAlFG,SAkFH;;AAAkC,UA3E3D,qBAAA,CA2E2D;EAChE;EAAe,WAAA,CAAA,EA1EX,WA0EW;;SAAiB,CAAA,EAAA,OAAA;;;AAChC,UArEK,sBAAA,CAqEU;EAAA;aAAI,CAAA,EAnEf,WAmEe;;YAC7B,CAAA,EAAA,OAAA;EAAuB;EACb,MAAA,CAAA,EAAA,OAAA;;;AAAkC,UA7D7B,sBAAA,CA6D6B;;EACnB,WAAA,CAAA,EA5DX,WA4DW;EAOV;EAQA,UAAA,CAAA,EAAA,OAAA;EAAoB;QACzB,CAAA,EAAA,OAAA;;EADwD,OAAA,CAAA,EAAA,OAAA;AAKpE;;AAAmC,UAtElB,yBAAA,CAsEkB;;EAAyB,UAAA,CAAA,EAAA,MAAA;AAW5D;;AAAoC,UA3EnB,qBAAA,CA2EmB;;EAAuC,WAAA,CAAA,EAAA,MAAA;EAS3D;EAAW,UAAA,CAAA,EAAA,OAAA;;eAAqC,CAAA,EAAA,SAAA,GAAA,QAAA,GAAA,QAAA;;;UA1E/C,uBAAA;;;;;UAMA,yBAAA;;;;;;;;;;;;;KAkBL,aAAA,IAAiB,aAAa,aAAa;KAC3C,cAAA,IAAkB,aAAa,aAAa;KAC5C,cAAA,IAAkB,aAAa,aAAa;KAC5C,iBAAA,IAAqB,aAAa,aAC5C;KACU,aAAA,IAAiB,aAAa,aAAa;KAC3C,eAAA,IAAmB,aAAa,aAAa;KAC7C,eAAA,IAAmB,aAAa,aAC1C;KACU,iBAAA,IAAqB,aAAa,aAC5C;;UAOe,uBAAA;;;;;;;UAQA,mBAAA,SAA4B;YACjC;;;iBAII,YAAA,OAAmB,oBAAoB;;iBAWvC,YAAA,QAAoB,6BAA6B;;iBASjD,WAAA,QAAmB,6BAA6B"}
@@ -0,0 +1,17 @@
1
+ //#region src/react/charts/types.ts
2
+ /** Type guard to check if data is an Arrow Table */
3
+ function isArrowTable(data) {
4
+ return data !== null && typeof data === "object" && "schema" in data && "numRows" in data && typeof data.getChild === "function";
5
+ }
6
+ /** Type guard to check if props are query-based */
7
+ function isQueryProps(props) {
8
+ return "queryKey" in props && typeof props.queryKey === "string" && props.queryKey.length > 0;
9
+ }
10
+ /** Type guard to check if props are data-based */
11
+ function isDataProps(props) {
12
+ return "data" in props && props.data != null;
13
+ }
14
+
15
+ //#endregion
16
+ export { isArrowTable, isDataProps, isQueryProps };
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/react/charts/types.ts"],"sourcesContent":["import type { Table } from \"apache-arrow\";\n\n// ============================================================================\n// Data Format Types\n// ============================================================================\n\n/** Supported data formats for analytics queries */\nexport type DataFormat = \"json\" | \"arrow\" | \"auto\";\n\n/** Chart orientation */\nexport type Orientation = \"vertical\" | \"horizontal\";\n\n/** Supported chart types */\nexport type ChartType =\n | \"bar\"\n | \"line\"\n | \"area\"\n | \"pie\"\n | \"donut\"\n | \"scatter\"\n | \"radar\"\n | \"heatmap\";\n\n/** Data that can be passed to unified charts */\nexport type ChartData = Table | Record<string, unknown>[];\n\n// ============================================================================\n// Base Props (shared by all charts)\n// ============================================================================\n\n/** Color palette types for different visualization needs */\nexport type ChartColorPalette = \"categorical\" | \"sequential\" | \"diverging\";\n\n/** Common visual and behavior props for all charts */\nexport interface ChartBaseProps {\n /** Chart title */\n title?: string;\n /** Show legend */\n showLegend?: boolean;\n /**\n * Color palette to use. Auto-selected based on chart type if not specified.\n * - \"categorical\": Distinct colors for different categories (bar, pie, line)\n * - \"sequential\": Gradient for magnitude/intensity (heatmap)\n * - \"diverging\": Two-tone for positive/negative values\n */\n colorPalette?: ChartColorPalette;\n /** Custom colors for series (overrides colorPalette) */\n colors?: string[];\n /** Chart height in pixels @default 300 */\n height?: number;\n /** Additional CSS classes */\n className?: string;\n\n /** X-axis field key. Auto-detected from schema if not provided. */\n xKey?: string;\n /** Y-axis field key(s). Auto-detected from schema if not provided. */\n yKey?: string | string[];\n\n /** Accessibility label for screen readers */\n ariaLabel?: string;\n /** Test ID for automated testing */\n testId?: string;\n\n /** Additional ECharts options to merge */\n options?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Query-based Props (chart fetches data)\n// ============================================================================\n\n/** Props for query-based data fetching */\nexport interface QueryProps extends ChartBaseProps {\n /** Analytics query key registered with analytics plugin */\n queryKey: string;\n /** Query parameters passed to the analytics endpoint */\n parameters?: Record<string, unknown>;\n /**\n * Data format to use\n * - \"json\": Use JSON format (smaller payloads, simpler)\n * - \"arrow\": Use Arrow format (faster for large datasets)\n * - \"auto\": Automatically select based on expected data size\n * @default \"auto\"\n */\n format?: DataFormat;\n /** Transform raw data before rendering */\n transformer?: <T>(data: T) => T;\n\n // Discriminator: cannot use direct data with query\n data?: never;\n}\n\n// ============================================================================\n// Data-based Props (chart receives data externally)\n// ============================================================================\n\n/** Props for direct data injection */\nexport interface DataProps extends ChartBaseProps {\n /** Arrow Table or JSON array */\n data: ChartData;\n\n // Discriminator: cannot use query props with direct data\n queryKey?: never;\n parameters?: never;\n format?: never;\n transformer?: never;\n}\n\n// ============================================================================\n// Union Types for Each Chart\n// ============================================================================\n\n/** Base union type - either query-based or data-based */\nexport type UnifiedChartProps = QueryProps | DataProps;\n\n// ============================================================================\n// Chart-Specific Props\n// ============================================================================\n\n/** Props specific to bar charts */\nexport interface BarChartSpecificProps {\n /** Chart orientation @default \"vertical\" */\n orientation?: Orientation;\n /** Stack bars */\n stacked?: boolean;\n}\n\n/** Props specific to line charts */\nexport interface LineChartSpecificProps {\n /** Chart orientation @default \"vertical\" */\n orientation?: Orientation;\n /** Show data point symbols @default false */\n showSymbol?: boolean;\n /** Smooth line curves @default true */\n smooth?: boolean;\n}\n\n/** Props specific to area charts */\nexport interface AreaChartSpecificProps {\n /** Chart orientation @default \"vertical\" */\n orientation?: Orientation;\n /** Show data point symbols @default false */\n showSymbol?: boolean;\n /** Smooth line curves @default true */\n smooth?: boolean;\n /** Stack areas @default false */\n stacked?: boolean;\n}\n\n/** Props specific to scatter charts */\nexport interface ScatterChartSpecificProps {\n /** Symbol size @default 8 */\n symbolSize?: number;\n}\n\n/** Props specific to pie/donut charts */\nexport interface PieChartSpecificProps {\n /** Inner radius for donut charts (0-100%) @default 0 */\n innerRadius?: number;\n /** Show labels on slices @default true */\n showLabels?: boolean;\n /** Label position @default \"outside\" */\n labelPosition?: \"outside\" | \"inside\" | \"center\";\n}\n\n/** Props specific to radar charts */\nexport interface RadarChartSpecificProps {\n /** Show area fill @default true */\n showArea?: boolean;\n}\n\n/** Props specific to heatmap charts */\nexport interface HeatmapChartSpecificProps {\n /**\n * Field key for the Y-axis categories.\n * For heatmaps, data should have: xKey (column), yAxisKey (row), and yKey (value).\n */\n yAxisKey?: string;\n /** Min value for color scale (auto-detected if not provided) */\n min?: number;\n /** Max value for color scale (auto-detected if not provided) */\n max?: number;\n /** Show value labels on cells @default false */\n showLabels?: boolean;\n}\n\n// ============================================================================\n// Complete Chart Props (union + specific)\n// ============================================================================\n\nexport type BarChartProps = (QueryProps | DataProps) & BarChartSpecificProps;\nexport type LineChartProps = (QueryProps | DataProps) & LineChartSpecificProps;\nexport type AreaChartProps = (QueryProps | DataProps) & AreaChartSpecificProps;\nexport type ScatterChartProps = (QueryProps | DataProps) &\n ScatterChartSpecificProps;\nexport type PieChartProps = (QueryProps | DataProps) & PieChartSpecificProps;\nexport type DonutChartProps = (QueryProps | DataProps) & PieChartSpecificProps;\nexport type RadarChartProps = (QueryProps | DataProps) &\n RadarChartSpecificProps;\nexport type HeatmapChartProps = (QueryProps | DataProps) &\n HeatmapChartSpecificProps;\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\n/** Base normalized data shared by all chart types */\nexport interface NormalizedChartDataBase {\n xData: (string | number)[];\n xField: string;\n yFields: string[];\n chartType: \"timeseries\" | \"categorical\";\n}\n\n/** Normalized chart data for rendering (standard charts) */\nexport interface NormalizedChartData extends NormalizedChartDataBase {\n yDataMap: Record<string, (string | number)[]>;\n}\n\n/** Type guard to check if data is an Arrow Table */\nexport function isArrowTable(data: ChartData): data is Table {\n return (\n data !== null &&\n typeof data === \"object\" &&\n \"schema\" in data &&\n \"numRows\" in data &&\n typeof (data as Table).getChild === \"function\"\n );\n}\n\n/** Type guard to check if props are query-based */\nexport function isQueryProps(props: UnifiedChartProps): props is QueryProps {\n return (\n \"queryKey\" in props &&\n typeof props.queryKey === \"string\" &&\n props.queryKey.length > 0\n );\n}\n\n/** Type guard to check if props are data-based */\nexport function isDataProps(props: UnifiedChartProps): props is DataProps {\n return \"data\" in props && props.data != null;\n}\n"],"mappings":";;AA4NA,SAAgB,aAAa,MAAgC;AAC3D,QACE,SAAS,QACT,OAAO,SAAS,YAChB,YAAY,QACZ,aAAa,QACb,OAAQ,KAAe,aAAa;;;AAKxC,SAAgB,aAAa,OAA+C;AAC1E,QACE,cAAc,SACd,OAAO,MAAM,aAAa,YAC1B,MAAM,SAAS,SAAS;;;AAK5B,SAAgB,YAAY,OAA8C;AACxE,QAAO,UAAU,SAAS,MAAM,QAAQ"}
@@ -0,0 +1,36 @@
1
+ //#region src/react/charts/utils.d.ts
2
+ /**
3
+ * Converts a value to a chart-compatible type.
4
+ * Handles BigInt conversion (Arrow can return BigInt64Array values).
5
+ * Handles Date objects by converting to timestamps.
6
+ */
7
+ declare function toChartValue(value: unknown): string | number;
8
+ /**
9
+ * Converts an array of values to chart-compatible types.
10
+ */
11
+ declare function toChartArray(data: unknown[]): (string | number)[];
12
+ /**
13
+ * Formats a field name into a human-readable label.
14
+ * Handles camelCase, snake_case, acronyms, and ALL_CAPS.
15
+ * E.g., "totalSpend" -> "Total Spend", "user_name" -> "User Name",
16
+ * "userID" -> "User Id", "TOTAL_SPEND" -> "Total Spend"
17
+ */
18
+ declare function formatLabel(field: string): string;
19
+ /**
20
+ * Truncates a label to a maximum length with ellipsis.
21
+ */
22
+ declare function truncateLabel(value: string, maxLength?: number): string;
23
+ /**
24
+ * Creates time-series data pairs for ECharts.
25
+ */
26
+ declare function createTimeSeriesData(xData: (string | number)[], yData: (string | number)[]): [string | number, string | number][];
27
+ /**
28
+ * Sorts time-series data in ascending chronological order.
29
+ */
30
+ declare function sortTimeSeriesAscending(xData: (string | number)[], yDataMap: Record<string, (string | number)[]>, yFields: string[]): {
31
+ xData: (string | number)[];
32
+ yDataMap: Record<string, (string | number)[]>;
33
+ };
34
+ //#endregion
35
+ export { createTimeSeriesData, formatLabel, sortTimeSeriesAscending, toChartArray, toChartValue, truncateLabel };
36
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../../src/react/charts/utils.ts"],"sourcesContent":[],"mappings":";;AASA;AAmBA;AAWA;AAqBA;AAOgB,iBA1DA,YAAA,CA0DoB,KAAA,EAAA,OAAA,CAAA,EAAA,MAAA,GAAA,MAAA;AAepC;;;AAMY,iBA5DI,YAAA,CA4DJ,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,MAAA,GAAA,MAAA,CAAA,EAAA;;;;;;;iBAjDI,WAAA;;;;iBAqBA,aAAA;;;;iBAOA,oBAAA;;;;iBAeA,uBAAA,uCAEJ;;YAIA"}
@@ -0,0 +1,77 @@
1
+ //#region src/react/charts/utils.ts
2
+ /**
3
+ * Converts a value to a chart-compatible type.
4
+ * Handles BigInt conversion (Arrow can return BigInt64Array values).
5
+ * Handles Date objects by converting to timestamps.
6
+ */
7
+ function toChartValue(value) {
8
+ if (value === null || value === void 0) return 0;
9
+ if (typeof value === "bigint") return Number(value);
10
+ if (value instanceof Date) return value.getTime();
11
+ if (typeof value === "string" || typeof value === "number") return value;
12
+ return String(value);
13
+ }
14
+ /**
15
+ * Converts an array of values to chart-compatible types.
16
+ */
17
+ function toChartArray(data) {
18
+ if (data.length === 0) return [];
19
+ return data.map(toChartValue);
20
+ }
21
+ /**
22
+ * Formats a field name into a human-readable label.
23
+ * Handles camelCase, snake_case, acronyms, and ALL_CAPS.
24
+ * E.g., "totalSpend" -> "Total Spend", "user_name" -> "User Name",
25
+ * "userID" -> "User Id", "TOTAL_SPEND" -> "Total Spend"
26
+ */
27
+ function formatLabel(field) {
28
+ return field.replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/_/g, " ").replace(/\s+/g, " ").toLowerCase().replace(/\b\w/g, (l) => l.toUpperCase()).trim();
29
+ }
30
+ /**
31
+ * Truncates a label to a maximum length with ellipsis.
32
+ */
33
+ function truncateLabel(value, maxLength = 15) {
34
+ return value.length > maxLength ? `${value.slice(0, maxLength)}...` : value;
35
+ }
36
+ /**
37
+ * Creates time-series data pairs for ECharts.
38
+ */
39
+ function createTimeSeriesData(xData, yData) {
40
+ const len = xData.length;
41
+ const result = new Array(len);
42
+ for (let i = 0; i < len; i++) result[i] = [xData[i], yData[i]];
43
+ return result;
44
+ }
45
+ /**
46
+ * Sorts time-series data in ascending chronological order.
47
+ */
48
+ function sortTimeSeriesAscending(xData, yDataMap, yFields) {
49
+ if (xData.length <= 1) return {
50
+ xData,
51
+ yDataMap
52
+ };
53
+ const first = xData[0];
54
+ const last = xData[xData.length - 1];
55
+ if (typeof first === "number" && typeof last === "number" && first > last) {
56
+ const indices = xData.map((_, i) => i);
57
+ indices.sort((a, b) => xData[a] - xData[b]);
58
+ const sortedXData = indices.map((i) => xData[i]);
59
+ const sortedYDataMap = {};
60
+ for (const key of yFields) {
61
+ const original = yDataMap[key];
62
+ sortedYDataMap[key] = indices.map((i) => original[i]);
63
+ }
64
+ return {
65
+ xData: sortedXData,
66
+ yDataMap: sortedYDataMap
67
+ };
68
+ }
69
+ return {
70
+ xData,
71
+ yDataMap
72
+ };
73
+ }
74
+
75
+ //#endregion
76
+ export { createTimeSeriesData, formatLabel, sortTimeSeriesAscending, toChartArray, toChartValue, truncateLabel };
77
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":["result: [string | number, string | number][]","sortedYDataMap: Record<string, (string | number)[]>"],"sources":["../../../src/react/charts/utils.ts"],"sourcesContent":["// ============================================================================\n// Chart Utility Functions\n// ============================================================================\n\n/**\n * Converts a value to a chart-compatible type.\n * Handles BigInt conversion (Arrow can return BigInt64Array values).\n * Handles Date objects by converting to timestamps.\n */\nexport function toChartValue(value: unknown): string | number {\n if (value === null || value === undefined) {\n return 0;\n }\n if (typeof value === \"bigint\") {\n return Number(value);\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n return value;\n }\n return String(value);\n}\n\n/**\n * Converts an array of values to chart-compatible types.\n */\nexport function toChartArray(data: unknown[]): (string | number)[] {\n if (data.length === 0) return [];\n return data.map(toChartValue);\n}\n\n/**\n * Formats a field name into a human-readable label.\n * Handles camelCase, snake_case, acronyms, and ALL_CAPS.\n * E.g., \"totalSpend\" -> \"Total Spend\", \"user_name\" -> \"User Name\",\n * \"userID\" -> \"User Id\", \"TOTAL_SPEND\" -> \"Total Spend\"\n */\nexport function formatLabel(field: string): string {\n return (\n field\n // Handle consecutive uppercase followed by lowercase (e.g., HTTPUrl → HTTP Url)\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n // Handle lowercase followed by uppercase (e.g., totalSpend → total Spend)\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n // Replace underscores with spaces\n .replace(/_/g, \" \")\n // Collapse multiple spaces into one\n .replace(/\\s+/g, \" \")\n // Normalize to title case\n .toLowerCase()\n .replace(/\\b\\w/g, (l) => l.toUpperCase())\n .trim()\n );\n}\n\n/**\n * Truncates a label to a maximum length with ellipsis.\n */\nexport function truncateLabel(value: string, maxLength = 15): string {\n return value.length > maxLength ? `${value.slice(0, maxLength)}...` : value;\n}\n\n/**\n * Creates time-series data pairs for ECharts.\n */\nexport function createTimeSeriesData(\n xData: (string | number)[],\n yData: (string | number)[],\n): [string | number, string | number][] {\n const len = xData.length;\n const result: [string | number, string | number][] = new Array(len);\n for (let i = 0; i < len; i++) {\n result[i] = [xData[i], yData[i]];\n }\n return result;\n}\n\n/**\n * Sorts time-series data in ascending chronological order.\n */\nexport function sortTimeSeriesAscending(\n xData: (string | number)[],\n yDataMap: Record<string, (string | number)[]>,\n yFields: string[],\n): {\n xData: (string | number)[];\n yDataMap: Record<string, (string | number)[]>;\n} {\n if (xData.length <= 1) {\n return { xData, yDataMap };\n }\n\n const first = xData[0];\n const last = xData[xData.length - 1];\n\n if (typeof first === \"number\" && typeof last === \"number\" && first > last) {\n const indices = xData.map((_, i) => i);\n indices.sort((a, b) => (xData[a] as number) - (xData[b] as number));\n\n const sortedXData = indices.map((i) => xData[i]);\n const sortedYDataMap: Record<string, (string | number)[]> = {};\n for (const key of yFields) {\n const original = yDataMap[key];\n sortedYDataMap[key] = indices.map((i) => original[i]);\n }\n\n return { xData: sortedXData, yDataMap: sortedYDataMap };\n }\n\n return { xData, yDataMap };\n}\n"],"mappings":";;;;;;AASA,SAAgB,aAAa,OAAiC;AAC5D,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,KAAI,iBAAiB,KACnB,QAAO,MAAM,SAAS;AAExB,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAChD,QAAO;AAET,QAAO,OAAO,MAAM;;;;;AAMtB,SAAgB,aAAa,MAAsC;AACjE,KAAI,KAAK,WAAW,EAAG,QAAO,EAAE;AAChC,QAAO,KAAK,IAAI,aAAa;;;;;;;;AAS/B,SAAgB,YAAY,OAAuB;AACjD,QACE,MAEG,QAAQ,yBAAyB,QAAQ,CAEzC,QAAQ,mBAAmB,QAAQ,CAEnC,QAAQ,MAAM,IAAI,CAElB,QAAQ,QAAQ,IAAI,CAEpB,aAAa,CACb,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC,CACxC,MAAM;;;;;AAOb,SAAgB,cAAc,OAAe,YAAY,IAAY;AACnE,QAAO,MAAM,SAAS,YAAY,GAAG,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO;;;;;AAMxE,SAAgB,qBACd,OACA,OACsC;CACtC,MAAM,MAAM,MAAM;CAClB,MAAMA,SAA+C,IAAI,MAAM,IAAI;AACnE,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IACvB,QAAO,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG;AAElC,QAAO;;;;;AAMT,SAAgB,wBACd,OACA,UACA,SAIA;AACA,KAAI,MAAM,UAAU,EAClB,QAAO;EAAE;EAAO;EAAU;CAG5B,MAAM,QAAQ,MAAM;CACpB,MAAM,OAAO,MAAM,MAAM,SAAS;AAElC,KAAI,OAAO,UAAU,YAAY,OAAO,SAAS,YAAY,QAAQ,MAAM;EACzE,MAAM,UAAU,MAAM,KAAK,GAAG,MAAM,EAAE;AACtC,UAAQ,MAAM,GAAG,MAAO,MAAM,KAAiB,MAAM,GAAc;EAEnE,MAAM,cAAc,QAAQ,KAAK,MAAM,MAAM,GAAG;EAChD,MAAMC,iBAAsD,EAAE;AAC9D,OAAK,MAAM,OAAO,SAAS;GACzB,MAAM,WAAW,SAAS;AAC1B,kBAAe,OAAO,QAAQ,KAAK,MAAM,SAAS,GAAG;;AAGvD,SAAO;GAAE,OAAO;GAAa,UAAU;GAAgB;;AAGzD,QAAO;EAAE;EAAO;EAAU"}
@@ -0,0 +1,65 @@
1
+ import { ChartData, DataFormat } from "./types.js";
2
+ import { ReactNode } from "react";
3
+ import * as react_jsx_runtime284 from "react/jsx-runtime";
4
+
5
+ //#region src/react/charts/wrapper.d.ts
6
+ interface ChartWrapperQueryProps {
7
+ /** Analytics query key */
8
+ queryKey: string;
9
+ /** Query parameters */
10
+ parameters?: Record<string, unknown>;
11
+ /** Data format preference */
12
+ format?: DataFormat;
13
+ /** Transform data after fetching */
14
+ transformer?: <T>(data: T) => T;
15
+ /** Direct data - not used in query mode */
16
+ data?: never;
17
+ }
18
+ interface ChartWrapperDataProps {
19
+ /** Direct data (Arrow Table or JSON array) */
20
+ data: ChartData;
21
+ /** Not used in data mode */
22
+ queryKey?: never;
23
+ parameters?: never;
24
+ format?: never;
25
+ transformer?: never;
26
+ }
27
+ interface CommonProps {
28
+ /** Chart height in pixels */
29
+ height?: number;
30
+ /** Additional CSS classes */
31
+ className?: string;
32
+ /** Accessibility label */
33
+ ariaLabel?: string;
34
+ /** Test ID for automated testing */
35
+ testId?: string;
36
+ /** Render function receiving the chart data */
37
+ children: (data: ChartData) => ReactNode;
38
+ }
39
+ type ChartWrapperProps = CommonProps & (ChartWrapperQueryProps | ChartWrapperDataProps);
40
+ /**
41
+ * Wrapper component for charts.
42
+ * Handles data fetching (query mode) or direct data injection (data mode).
43
+ *
44
+ * @example Query mode - fetches data from analytics endpoint
45
+ * ```tsx
46
+ * <ChartWrapper
47
+ * queryKey="spend_data"
48
+ * parameters={{ limit: 100 }}
49
+ * format="auto"
50
+ * >
51
+ * {(data) => <MyChart data={data} />}
52
+ * </ChartWrapper>
53
+ * ```
54
+ *
55
+ * @example Data mode - uses provided data directly
56
+ * ```tsx
57
+ * <ChartWrapper data={myArrowTable}>
58
+ * {(data) => <MyChart data={data} />}
59
+ * </ChartWrapper>
60
+ * ```
61
+ */
62
+ declare function ChartWrapper(props: ChartWrapperProps): react_jsx_runtime284.JSX.Element;
63
+ //#endregion
64
+ export { ChartWrapper, ChartWrapperProps };
65
+ //# sourceMappingURL=wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.d.ts","names":[],"sources":["../../../src/react/charts/wrapper.tsx"],"sourcesContent":[],"mappings":";;;;;UAaU,sBAAA;;;EAAA;EAAsB,UAAA,CAAA,EAIjB,MAJiB,CAAA,MAAA,EAAA,OAAA,CAAA;;QAMrB,CAAA,EAAA,UAAA;;aAEqB,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAN,CAAM,EAAA,GAAA,CAAA;EAAC;EAKvB,IAAA,CAAA,EAAA,KAAA;AAEO;UAFP,qBAAA,CAUW;;MAUY,EAlBzB,SAkByB;EAAS;EAG9B,QAAA,CAAA,EAAA,KAAA;EAAiB,UAAA,CAAA,EAAA,KAAA;QAAG,CAAA,EAAA,KAAA;aAC7B,CAAA,EAAA,KAAA;;UAdO,WAAA,CAcuC;EA0GjC;EAAY,MAAA,CAAA,EAAA,MAAA;;WAAyB,CAAA,EAAA,MAAA;EAAA;;;;;mBA9GlC,cAAc;;KAGrB,iBAAA,GAAoB,eAC7B,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;iBA0GZ,YAAA,QAAoB,oBAAiB,oBAAA,CAAA,GAAA,CAAA"}
@@ -0,0 +1,94 @@
1
+ import { isArrowTable } from "./types.js";
2
+ import { useChartData } from "../hooks/use-chart-data.js";
3
+ import { ChartErrorBoundary } from "./chart-error-boundary.js";
4
+ import { EmptyState } from "./empty.js";
5
+ import { ErrorState } from "./error.js";
6
+ import { LoadingSkeleton } from "./loading.js";
7
+ import { jsx } from "react/jsx-runtime";
8
+
9
+ //#region src/react/charts/wrapper.tsx
10
+ function QueryModeContent({ queryKey, parameters, format, transformer, height, className, ariaLabel, testId, children }) {
11
+ const { data, loading, error, isEmpty } = useChartData({
12
+ queryKey,
13
+ parameters,
14
+ format,
15
+ transformer
16
+ });
17
+ if (loading) return /* @__PURE__ */ jsx(LoadingSkeleton, { height: height ?? 300 });
18
+ if (error) return /* @__PURE__ */ jsx(ErrorState, { error });
19
+ if (isEmpty || !data) return /* @__PURE__ */ jsx(EmptyState, {});
20
+ return /* @__PURE__ */ jsx(ChartErrorBoundary, {
21
+ fallback: /* @__PURE__ */ jsx(ErrorState, { error: "Failed to render chart" }),
22
+ children: /* @__PURE__ */ jsx("div", {
23
+ className,
24
+ style: { height },
25
+ "aria-label": ariaLabel,
26
+ "data-testid": testId,
27
+ role: "img",
28
+ children: children(data)
29
+ })
30
+ });
31
+ }
32
+ function DataModeContent({ data, height, className, ariaLabel, testId, children }) {
33
+ if (isArrowTable(data) ? data.numRows === 0 : !Array.isArray(data) || data.length === 0) return /* @__PURE__ */ jsx(EmptyState, {});
34
+ return /* @__PURE__ */ jsx(ChartErrorBoundary, {
35
+ fallback: /* @__PURE__ */ jsx(ErrorState, { error: "Failed to render chart" }),
36
+ children: /* @__PURE__ */ jsx("div", {
37
+ className,
38
+ style: { height },
39
+ "aria-label": ariaLabel,
40
+ "data-testid": testId,
41
+ role: "img",
42
+ children: children(data)
43
+ })
44
+ });
45
+ }
46
+ /**
47
+ * Wrapper component for charts.
48
+ * Handles data fetching (query mode) or direct data injection (data mode).
49
+ *
50
+ * @example Query mode - fetches data from analytics endpoint
51
+ * ```tsx
52
+ * <ChartWrapper
53
+ * queryKey="spend_data"
54
+ * parameters={{ limit: 100 }}
55
+ * format="auto"
56
+ * >
57
+ * {(data) => <MyChart data={data} />}
58
+ * </ChartWrapper>
59
+ * ```
60
+ *
61
+ * @example Data mode - uses provided data directly
62
+ * ```tsx
63
+ * <ChartWrapper data={myArrowTable}>
64
+ * {(data) => <MyChart data={data} />}
65
+ * </ChartWrapper>
66
+ * ```
67
+ */
68
+ function ChartWrapper(props) {
69
+ const { height = 300, className, ariaLabel, testId, children } = props;
70
+ if ("data" in props && props.data !== void 0) return /* @__PURE__ */ jsx(DataModeContent, {
71
+ data: props.data,
72
+ height,
73
+ className,
74
+ ariaLabel,
75
+ testId,
76
+ children
77
+ });
78
+ if ("queryKey" in props && props.queryKey !== void 0) return /* @__PURE__ */ jsx(QueryModeContent, {
79
+ queryKey: props.queryKey,
80
+ parameters: props.parameters,
81
+ format: props.format,
82
+ transformer: props.transformer,
83
+ height,
84
+ className,
85
+ ariaLabel,
86
+ testId,
87
+ children
88
+ });
89
+ return /* @__PURE__ */ jsx(ErrorState, { error: "Chart requires either 'queryKey' or 'data' prop" });
90
+ }
91
+
92
+ //#endregion
93
+ export { ChartWrapper };
94
+ //# sourceMappingURL=wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.js","names":[],"sources":["../../../src/react/charts/wrapper.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { useChartData } from \"../hooks/use-chart-data\";\nimport { ChartErrorBoundary } from \"./chart-error-boundary\";\nimport { EmptyState } from \"./empty\";\nimport { ErrorState } from \"./error\";\nimport { LoadingSkeleton } from \"./loading\";\nimport type { ChartData, DataFormat } from \"./types\";\nimport { isArrowTable } from \"./types\";\n\n// ============================================================================\n// Props Types\n// ============================================================================\n\ninterface ChartWrapperQueryProps {\n /** Analytics query key */\n queryKey: string;\n /** Query parameters */\n parameters?: Record<string, unknown>;\n /** Data format preference */\n format?: DataFormat;\n /** Transform data after fetching */\n transformer?: <T>(data: T) => T;\n /** Direct data - not used in query mode */\n data?: never;\n}\n\ninterface ChartWrapperDataProps {\n /** Direct data (Arrow Table or JSON array) */\n data: ChartData;\n /** Not used in data mode */\n queryKey?: never;\n parameters?: never;\n format?: never;\n transformer?: never;\n}\n\ninterface CommonProps {\n /** Chart height in pixels */\n height?: number;\n /** Additional CSS classes */\n className?: string;\n /** Accessibility label */\n ariaLabel?: string;\n /** Test ID for automated testing */\n testId?: string;\n /** Render function receiving the chart data */\n children: (data: ChartData) => ReactNode;\n}\n\nexport type ChartWrapperProps = CommonProps &\n (ChartWrapperQueryProps | ChartWrapperDataProps);\n\n// ============================================================================\n// Query Mode Content\n// ============================================================================\n\nfunction QueryModeContent({\n queryKey,\n parameters,\n format,\n transformer,\n height,\n className,\n ariaLabel,\n testId,\n children,\n}: CommonProps & ChartWrapperQueryProps) {\n const { data, loading, error, isEmpty } = useChartData({\n queryKey,\n parameters,\n format,\n transformer,\n });\n\n if (loading) return <LoadingSkeleton height={height ?? 300} />;\n if (error) return <ErrorState error={error} />;\n if (isEmpty || !data) return <EmptyState />;\n\n return (\n <ChartErrorBoundary\n fallback={<ErrorState error=\"Failed to render chart\" />}\n >\n <div\n className={className}\n style={{ height }}\n aria-label={ariaLabel}\n data-testid={testId}\n role=\"img\"\n >\n {children(data)}\n </div>\n </ChartErrorBoundary>\n );\n}\n\n// ============================================================================\n// Data Mode Content\n// ============================================================================\n\nfunction DataModeContent({\n data,\n height,\n className,\n ariaLabel,\n testId,\n children,\n}: CommonProps & ChartWrapperDataProps) {\n const isEmpty = isArrowTable(data)\n ? data.numRows === 0\n : !Array.isArray(data) || data.length === 0;\n\n if (isEmpty) return <EmptyState />;\n\n return (\n <ChartErrorBoundary\n fallback={<ErrorState error=\"Failed to render chart\" />}\n >\n <div\n className={className}\n style={{ height }}\n aria-label={ariaLabel}\n data-testid={testId}\n role=\"img\"\n >\n {children(data)}\n </div>\n </ChartErrorBoundary>\n );\n}\n\n// ============================================================================\n// Main Wrapper Component\n// ============================================================================\n\n/**\n * Wrapper component for charts.\n * Handles data fetching (query mode) or direct data injection (data mode).\n *\n * @example Query mode - fetches data from analytics endpoint\n * ```tsx\n * <ChartWrapper\n * queryKey=\"spend_data\"\n * parameters={{ limit: 100 }}\n * format=\"auto\"\n * >\n * {(data) => <MyChart data={data} />}\n * </ChartWrapper>\n * ```\n *\n * @example Data mode - uses provided data directly\n * ```tsx\n * <ChartWrapper data={myArrowTable}>\n * {(data) => <MyChart data={data} />}\n * </ChartWrapper>\n * ```\n */\nexport function ChartWrapper(props: ChartWrapperProps) {\n const { height = 300, className, ariaLabel, testId, children } = props;\n\n // Data mode: use provided data directly\n if (\"data\" in props && props.data !== undefined) {\n return (\n <DataModeContent\n data={props.data}\n height={height}\n className={className}\n ariaLabel={ariaLabel}\n testId={testId}\n >\n {children}\n </DataModeContent>\n );\n }\n\n // Query mode: fetch data from analytics endpoint\n if (\"queryKey\" in props && props.queryKey !== undefined) {\n return (\n <QueryModeContent\n queryKey={props.queryKey}\n parameters={props.parameters}\n format={props.format}\n transformer={props.transformer}\n height={height}\n className={className}\n ariaLabel={ariaLabel}\n testId={testId}\n >\n {children}\n </QueryModeContent>\n );\n }\n\n // Should never reach here due to TypeScript, but safety fallback\n return <ErrorState error=\"Chart requires either 'queryKey' or 'data' prop\" />;\n}\n"],"mappings":";;;;;;;;;AAwDA,SAAS,iBAAiB,EACxB,UACA,YACA,QACA,aACA,QACA,WACA,WACA,QACA,YACuC;CACvC,MAAM,EAAE,MAAM,SAAS,OAAO,YAAY,aAAa;EACrD;EACA;EACA;EACA;EACD,CAAC;AAEF,KAAI,QAAS,QAAO,oBAAC,mBAAgB,QAAQ,UAAU,MAAO;AAC9D,KAAI,MAAO,QAAO,oBAAC,cAAkB,QAAS;AAC9C,KAAI,WAAW,CAAC,KAAM,QAAO,oBAAC,eAAa;AAE3C,QACE,oBAAC;EACC,UAAU,oBAAC,cAAW,OAAM,2BAA2B;YAEvD,oBAAC;GACY;GACX,OAAO,EAAE,QAAQ;GACjB,cAAY;GACZ,eAAa;GACb,MAAK;aAEJ,SAAS,KAAK;IACX;GACa;;AAQzB,SAAS,gBAAgB,EACvB,MACA,QACA,WACA,WACA,QACA,YACsC;AAKtC,KAJgB,aAAa,KAAK,GAC9B,KAAK,YAAY,IACjB,CAAC,MAAM,QAAQ,KAAK,IAAI,KAAK,WAAW,EAE/B,QAAO,oBAAC,eAAa;AAElC,QACE,oBAAC;EACC,UAAU,oBAAC,cAAW,OAAM,2BAA2B;YAEvD,oBAAC;GACY;GACX,OAAO,EAAE,QAAQ;GACjB,cAAY;GACZ,eAAa;GACb,MAAK;aAEJ,SAAS,KAAK;IACX;GACa;;;;;;;;;;;;;;;;;;;;;;;;AA8BzB,SAAgB,aAAa,OAA0B;CACrD,MAAM,EAAE,SAAS,KAAK,WAAW,WAAW,QAAQ,aAAa;AAGjE,KAAI,UAAU,SAAS,MAAM,SAAS,OACpC,QACE,oBAAC;EACC,MAAM,MAAM;EACJ;EACG;EACA;EACH;EAEP;GACe;AAKtB,KAAI,cAAc,SAAS,MAAM,aAAa,OAC5C,QACE,oBAAC;EACC,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,QAAQ,MAAM;EACd,aAAa,MAAM;EACX;EACG;EACA;EACH;EAEP;GACgB;AAKvB,QAAO,oBAAC,cAAW,OAAM,oDAAoD"}
@@ -0,0 +1,2 @@
1
+ import { useAnalyticsQuery } from "./use-analytics-query.js";
2
+ import { useChartData } from "./use-chart-data.js";
@@ -0,0 +1,101 @@
1
+ import { Table } from "apache-arrow";
2
+
3
+ //#region src/react/hooks/types.d.ts
4
+ /** Supported response formats for analytics queries */
5
+ type AnalyticsFormat = "JSON" | "ARROW";
6
+ /**
7
+ * Typed Arrow Table - preserves row type information for type inference.
8
+ * At runtime this is just a regular Arrow Table, but TypeScript knows the row schema.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * type MyTable = TypedArrowTable<{ id: string; value: number }>;
13
+ * // Can access table.getChild("id") knowing it exists
14
+ * ```
15
+ */
16
+ interface TypedArrowTable<TRow extends Record<string, unknown> = Record<string, unknown>> extends Table {
17
+ /**
18
+ * Phantom type marker for row schema.
19
+ * Not used at runtime - only for TypeScript type inference.
20
+ */
21
+ readonly __rowType?: TRow;
22
+ }
23
+ /** Options for configuring an analytics SSE query */
24
+ interface UseAnalyticsQueryOptions<F extends AnalyticsFormat = "JSON"> {
25
+ /** Response format - "JSON" returns typed arrays, "ARROW" returns TypedArrowTable */
26
+ format?: F;
27
+ /** Maximum size of serialized parameters in bytes */
28
+ maxParametersSize?: number;
29
+ /** Whether to automatically start the query when the hook is mounted. Default is true. */
30
+ autoStart?: boolean;
31
+ }
32
+ /** Result state returned by useAnalyticsQuery */
33
+ interface UseAnalyticsQueryResult<T> {
34
+ /** Latest query result data */
35
+ data: T | null;
36
+ /** Loading state of the query */
37
+ loading: boolean;
38
+ /** Error state of the query */
39
+ error: string | null;
40
+ }
41
+ /**
42
+ * Query Registry for type-safe analytics queries.
43
+ * Extend this interface via module augmentation to get full type inference:
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * // config/appKitTypes.d.ts
48
+ * declare module "@databricks/appkit-ui/react" {
49
+ * interface QueryRegistry {
50
+ * apps_list: {
51
+ * name: "apps_list";
52
+ * parameters: { startDate: string; endDate: string; aggregationLevel: string };
53
+ * result: Array<{ id: string; name: string }>;
54
+ * };
55
+ * }
56
+ * }
57
+ * ```
58
+ */
59
+ interface QueryRegistry {
60
+ [key: string]: {
61
+ name: string;
62
+ parameters: Record<string, unknown>;
63
+ result: unknown[];
64
+ };
65
+ }
66
+ /** Gets only literal keys from a registry (excludes index signature) */
67
+ type AugmentedRegistry<T> = keyof { [K in keyof T as string extends K ? never : K]: T[K] };
68
+ /** Resolves to registry keys if defined, otherwise string */
69
+ type QueryKey = AugmentedRegistry<QueryRegistry> extends never ? string : AugmentedRegistry<QueryRegistry>;
70
+ /**
71
+ * Infers result type from QueryRegistry[K]["result"]
72
+ * Returns the JSON array type for the query.
73
+ */
74
+ type InferResult<T, K> = K extends AugmentedRegistry<QueryRegistry> ? QueryRegistry[K] extends {
75
+ result: infer R;
76
+ } ? R : T : T;
77
+ /**
78
+ * Infers the row type from a query result array.
79
+ * Used for TypedArrowTable row typing.
80
+ */
81
+ type InferRowType<K> = K extends AugmentedRegistry<QueryRegistry> ? QueryRegistry[K] extends {
82
+ result: Array<infer R>;
83
+ } ? R extends Record<string, unknown> ? R : Record<string, unknown> : Record<string, unknown> : Record<string, unknown>;
84
+ /**
85
+ * Conditionally infers result type based on format.
86
+ * - JSON format: Returns the typed array from QueryRegistry
87
+ * - ARROW format: Returns TypedArrowTable with row type preserved
88
+ */
89
+ type InferResultByFormat<T, K, F extends AnalyticsFormat> = F extends "ARROW" ? TypedArrowTable<InferRowType<K>> : InferResult<T, K>;
90
+ /**
91
+ * Infers parameters type from QueryRegistry[K]["parameters"]
92
+ */
93
+ type InferParams<K> = K extends AugmentedRegistry<QueryRegistry> ? QueryRegistry[K] extends {
94
+ parameters: infer P;
95
+ } ? P : Record<string, unknown> : Record<string, unknown>;
96
+ interface PluginRegistry {
97
+ [key: string]: Record<string, any>;
98
+ }
99
+ //#endregion
100
+ export { AnalyticsFormat, InferParams, InferResultByFormat, InferRowType, PluginRegistry, QueryKey, QueryRegistry, TypedArrowTable, UseAnalyticsQueryOptions, UseAnalyticsQueryResult };
101
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/react/hooks/types.ts"],"sourcesContent":[],"mappings":";;;;KAOY,eAAA;AAAZ;AAYA;;;;;;;AAeA;;AAAoD,UAfnC,eAemC,CAAA,aAdrC,MAcqC,CAAA,MAAA,EAAA,OAAA,CAAA,GAdX,MAcW,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,SAb1C,KAa0C,CAAA;;;AAYpD;AA2BA;EASY,SAAA,SAAA,CAAA,EAxDW,IAwDM;;;AACK,UAjDjB,wBAiDiB,CAAA,UAjDkB,eAiDlB,GAAA,MAAA,CAAA,CAAA;;QAAgB,CAAA,EA/CvC,CA+CuC;;EAAG,iBAAA,CAAA,EAAA,MAAA;EAIzC;EAAQ,SAAA,CAAA,EAAA,OAAA;;;AAEE,UA3CL,uBA2CK,CAAA,CAAA,CAAA,CAAA;;EAAD,IAAA,EAzCb,CAyCa,GAAA,IAAA;EAMT;EAAW,OAAA,EAAA,OAAA;;OAAqC,EAAA,MAAA,GAAA,IAAA;;;;;;;;AAU5D;;;;;;;;;;;;AAKM,UArCW,aAAA,CAqCX;MACF,EAAA,MAAA,CAAA,EAAA;IAAM,IAAA,EAAA,MAAA;IAOE,UAAA,EA1CI,MA0Ce,CAAA,MAAA,EAAA,OAAA,CAAA;IAAA,MAAA,EAAA,OAAA,EAAA;;;;AAIS,KAxC5B,iBAwC4B,CAAA,CAAA,CAAA,GAAA,MAAA,QAAhB,MAvCV,CAuCU,IAAA,MAAA,SAvCU,CAuCV,GAAA,KAAA,GAvCsB,CAuCtB,GAvC0B,CAuC1B,CAvC4B,CAuC5B,CAAA;;AAAmC,KAnC/C,QAAA,GAAW,iBAmCoC,CAnClB,aAmCkB,CAAA,SAAA,KAAA,GAAA,MAAA,GAjCvD,iBAiCuD,CAjCrC,aAiCqC,CAAA;;AAK3D;;;AAAyD,KAhC7C,WAgC6C,CAAA,CAAA,EAAA,CAAA,CAAA,GAhCzB,CAgCyB,SAhCf,iBAgCe,CAhCG,aAgCH,CAAA,GA/BrD,aA+BqD,CA/BvC,CA+BuC,CAAA,SAAA;QAAlB,EAAA,KAAA,EAAA;IA9BjC,IACA,CA8BF,GA7BA,CA6BA;;;;;AAGM,KA1BE,YA0BF,CAAA,CAAA,CAAA,GA1BoB,CA0BpB,SA1B8B,iBA0B9B,CA1BgD,aA0BhD,CAAA,GAzBN,aAyBM,CAzBQ,CAyBR,CAAA,SAAA;EAEO,MAAA,EA3BsB,KA2BtB,CAAA,KAAc,EAAA,CAAA;IA1BzB,UAAU,0BACR,IACA,0BACF,0BACF;;;;;;KAOQ,oCAGA,mBACR,oBAAoB,gBAAgB,aAAa,MAAM,YAAY,GAAG;;;;KAK9D,iBAAiB,UAAU,kBAAkB,iBACrD,cAAc;;IACZ,IACA,0BACF;UAEa,cAAA;iBACA"}