@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.20.1 → 0.5.0-beta.22.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.
Files changed (472) hide show
  1. package/dist/components/charts/AreaGraph/AreaGraph.cjs +2 -0
  2. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +1 -0
  3. package/dist/components/charts/AreaGraph/AreaGraph.js +209 -0
  4. package/dist/components/charts/AreaGraph/AreaGraph.js.map +1 -0
  5. package/dist/components/charts/BarGraph/BarGraph.cjs +2 -0
  6. package/dist/components/charts/BarGraph/BarGraph.cjs.map +1 -0
  7. package/dist/components/charts/BarGraph/BarGraph.js +175 -0
  8. package/dist/components/charts/BarGraph/BarGraph.js.map +1 -0
  9. package/dist/components/charts/Boxplot/Boxplot.cjs +2 -0
  10. package/dist/components/charts/Boxplot/Boxplot.cjs.map +1 -0
  11. package/dist/components/charts/Boxplot/Boxplot.js +171 -0
  12. package/dist/components/charts/Boxplot/Boxplot.js.map +1 -0
  13. package/dist/components/charts/Chromatogram/Chromatogram.cjs +2 -0
  14. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -0
  15. package/dist/components/charts/Chromatogram/Chromatogram.js +164 -0
  16. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -0
  17. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +2 -0
  18. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +1 -0
  19. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +219 -0
  20. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +1 -0
  21. package/dist/components/charts/ChromatogramChart/annotations.cjs +2 -0
  22. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +1 -0
  23. package/dist/components/charts/ChromatogramChart/annotations.js +73 -0
  24. package/dist/components/charts/ChromatogramChart/annotations.js.map +1 -0
  25. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +2 -0
  26. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +1 -0
  27. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +34 -0
  28. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +1 -0
  29. package/dist/components/charts/ChromatogramChart/constants.cjs +2 -0
  30. package/dist/components/charts/ChromatogramChart/constants.cjs.map +1 -0
  31. package/dist/components/charts/ChromatogramChart/constants.js +24 -0
  32. package/dist/components/charts/ChromatogramChart/constants.js.map +1 -0
  33. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +2 -0
  34. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +1 -0
  35. package/dist/components/charts/ChromatogramChart/dataProcessing.js +90 -0
  36. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +1 -0
  37. package/dist/components/charts/ChromatogramChart/peakDetection.cjs +2 -0
  38. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +1 -0
  39. package/dist/components/charts/ChromatogramChart/peakDetection.js +89 -0
  40. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +1 -0
  41. package/dist/components/charts/DotPlot/DotPlot.cjs +2 -0
  42. package/dist/components/charts/DotPlot/DotPlot.cjs.map +1 -0
  43. package/dist/components/charts/DotPlot/DotPlot.js +184 -0
  44. package/dist/components/charts/DotPlot/DotPlot.js.map +1 -0
  45. package/dist/components/charts/Heatmap/Heatmap.cjs +2 -0
  46. package/dist/components/charts/Heatmap/Heatmap.cjs.map +1 -0
  47. package/dist/components/charts/Heatmap/Heatmap.js +67 -0
  48. package/dist/components/charts/Heatmap/Heatmap.js.map +1 -0
  49. package/dist/components/charts/Histogram/Histogram.cjs +2 -0
  50. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -0
  51. package/dist/components/charts/Histogram/Histogram.js +209 -0
  52. package/dist/components/charts/Histogram/Histogram.js.map +1 -0
  53. package/dist/components/charts/LineGraph/LineGraph.cjs +2 -0
  54. package/dist/components/charts/LineGraph/LineGraph.cjs.map +1 -0
  55. package/dist/components/charts/LineGraph/LineGraph.js +185 -0
  56. package/dist/components/charts/LineGraph/LineGraph.js.map +1 -0
  57. package/dist/components/charts/PieChart/PieChart.cjs +2 -0
  58. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -0
  59. package/dist/components/charts/PieChart/PieChart.js +106 -0
  60. package/dist/components/charts/PieChart/PieChart.js.map +1 -0
  61. package/dist/components/charts/PlateMap/PlateMap.cjs +2 -0
  62. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -0
  63. package/dist/components/charts/PlateMap/PlateMap.js +450 -0
  64. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -0
  65. package/dist/components/charts/PlateMap/constants.cjs +2 -0
  66. package/dist/components/charts/PlateMap/constants.cjs.map +1 -0
  67. package/dist/components/charts/PlateMap/constants.js +137 -0
  68. package/dist/components/charts/PlateMap/constants.js.map +1 -0
  69. package/dist/components/charts/PlateMap/types.cjs +2 -0
  70. package/dist/components/charts/PlateMap/types.cjs.map +1 -0
  71. package/dist/components/charts/PlateMap/types.js +8 -0
  72. package/dist/components/charts/PlateMap/types.js.map +1 -0
  73. package/dist/components/charts/PlateMap/utils.cjs +2 -0
  74. package/dist/components/charts/PlateMap/utils.cjs.map +1 -0
  75. package/dist/components/charts/PlateMap/utils.js +235 -0
  76. package/dist/components/charts/PlateMap/utils.js.map +1 -0
  77. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +2 -0
  78. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +1 -0
  79. package/dist/components/charts/ScatterGraph/ScatterGraph.js +186 -0
  80. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +1 -0
  81. package/dist/components/composed/AppHeader/AppHeader.cjs +2 -0
  82. package/dist/components/composed/AppHeader/AppHeader.cjs.map +1 -0
  83. package/dist/components/composed/AppHeader/AppHeader.js +35 -0
  84. package/dist/components/composed/AppHeader/AppHeader.js.map +1 -0
  85. package/dist/components/composed/AppLayout/AppLayout.cjs +2 -0
  86. package/dist/components/composed/AppLayout/AppLayout.cjs.map +1 -0
  87. package/dist/components/composed/AppLayout/AppLayout.js +65 -0
  88. package/dist/components/composed/AppLayout/AppLayout.js.map +1 -0
  89. package/dist/components/composed/AssistantModal/AssistantModal.cjs +2 -0
  90. package/dist/components/composed/AssistantModal/AssistantModal.cjs.map +1 -0
  91. package/dist/components/composed/AssistantModal/AssistantModal.js +75 -0
  92. package/dist/components/composed/AssistantModal/AssistantModal.js.map +1 -0
  93. package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.cjs +3 -0
  94. package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.cjs.map +1 -0
  95. package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.js +74 -0
  96. package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.js.map +1 -0
  97. package/dist/components/composed/LaunchContent/LaunchContent.cjs +6 -0
  98. package/dist/components/composed/LaunchContent/LaunchContent.cjs.map +1 -0
  99. package/dist/components/composed/LaunchContent/LaunchContent.js +66 -0
  100. package/dist/components/composed/LaunchContent/LaunchContent.js.map +1 -0
  101. package/dist/components/composed/Main/LaunchContentPanel.cjs +6 -0
  102. package/dist/components/composed/Main/LaunchContentPanel.cjs.map +1 -0
  103. package/dist/components/composed/Main/LaunchContentPanel.js +63 -0
  104. package/dist/components/composed/Main/LaunchContentPanel.js.map +1 -0
  105. package/dist/components/composed/Main/Main.cjs +2 -0
  106. package/dist/components/composed/Main/Main.cjs.map +1 -0
  107. package/dist/components/composed/Main/Main.js +276 -0
  108. package/dist/components/composed/Main/Main.js.map +1 -0
  109. package/dist/components/composed/Main/MainHeader.cjs +2 -0
  110. package/dist/components/composed/Main/MainHeader.cjs.map +1 -0
  111. package/dist/components/composed/Main/MainHeader.js +36 -0
  112. package/dist/components/composed/Main/MainHeader.js.map +1 -0
  113. package/dist/components/composed/Main/MainNavbar.cjs +2 -0
  114. package/dist/components/composed/Main/MainNavbar.cjs.map +1 -0
  115. package/dist/components/composed/Main/MainNavbar.js +25 -0
  116. package/dist/components/composed/Main/MainNavbar.js.map +1 -0
  117. package/dist/components/composed/Main/MainSidebar.cjs +2 -0
  118. package/dist/components/composed/Main/MainSidebar.cjs.map +1 -0
  119. package/dist/components/composed/Main/MainSidebar.js +12 -0
  120. package/dist/components/composed/Main/MainSidebar.js.map +1 -0
  121. package/dist/components/composed/Main/MainTabBar.cjs +2 -0
  122. package/dist/components/composed/Main/MainTabBar.cjs.map +1 -0
  123. package/dist/components/composed/Main/MainTabBar.js +7 -0
  124. package/dist/components/composed/Main/MainTabBar.js.map +1 -0
  125. package/dist/components/composed/Main/ProtocolConfigurationPanel.cjs +2 -0
  126. package/dist/components/composed/Main/ProtocolConfigurationPanel.cjs.map +1 -0
  127. package/dist/components/composed/Main/ProtocolConfigurationPanel.js +30 -0
  128. package/dist/components/composed/Main/ProtocolConfigurationPanel.js.map +1 -0
  129. package/dist/components/composed/Main/TemplateSidebarCard.cjs +2 -0
  130. package/dist/components/composed/Main/TemplateSidebarCard.cjs.map +1 -0
  131. package/dist/components/composed/Main/TemplateSidebarCard.js +71 -0
  132. package/dist/components/composed/Main/TemplateSidebarCard.js.map +1 -0
  133. package/dist/components/composed/Navbar/Navbar.cjs +2 -0
  134. package/dist/components/composed/Navbar/Navbar.cjs.map +1 -0
  135. package/dist/components/composed/Navbar/Navbar.js +25 -0
  136. package/dist/components/composed/Navbar/Navbar.js.map +1 -0
  137. package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.cjs +2 -0
  138. package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.cjs.map +1 -0
  139. package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.js +44 -0
  140. package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.js.map +1 -0
  141. package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.cjs +2 -0
  142. package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.cjs.map +1 -0
  143. package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.js +53 -0
  144. package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.js.map +1 -0
  145. package/dist/components/composed/PythonEditorModal/PythonEditorModal.cjs +2 -0
  146. package/dist/components/composed/PythonEditorModal/PythonEditorModal.cjs.map +1 -0
  147. package/dist/components/composed/PythonEditorModal/PythonEditorModal.js +51 -0
  148. package/dist/components/composed/PythonEditorModal/PythonEditorModal.js.map +1 -0
  149. package/dist/components/composed/Sidebar/Sidebar.cjs +2 -0
  150. package/dist/components/composed/Sidebar/Sidebar.cjs.map +1 -0
  151. package/dist/components/composed/Sidebar/Sidebar.js +46 -0
  152. package/dist/components/composed/Sidebar/Sidebar.js.map +1 -0
  153. package/dist/components/composed/TdpSearch/TdpSearch.cjs +2 -0
  154. package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -0
  155. package/dist/components/composed/TdpSearch/TdpSearch.js +97 -0
  156. package/dist/components/composed/TdpSearch/TdpSearch.js.map +1 -0
  157. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +2 -0
  158. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -0
  159. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +31 -0
  160. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -0
  161. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +2 -0
  162. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -0
  163. package/dist/components/composed/TdpSearch/components/DefaultResults.js +107 -0
  164. package/dist/components/composed/TdpSearch/components/DefaultResults.js.map +1 -0
  165. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +2 -0
  166. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -0
  167. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +32 -0
  168. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js.map +1 -0
  169. package/dist/components/composed/TdpSearch/constants.cjs +2 -0
  170. package/dist/components/composed/TdpSearch/constants.cjs.map +1 -0
  171. package/dist/components/composed/TdpSearch/constants.js +7 -0
  172. package/dist/components/composed/TdpSearch/constants.js.map +1 -0
  173. package/dist/components/composed/TdpSearch/hooks/useSearch.cjs +2 -0
  174. package/dist/components/composed/TdpSearch/hooks/useSearch.cjs.map +1 -0
  175. package/dist/components/composed/TdpSearch/hooks/useSearch.js +52 -0
  176. package/dist/components/composed/TdpSearch/hooks/useSearch.js.map +1 -0
  177. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.cjs +2 -0
  178. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.cjs.map +1 -0
  179. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.js +29 -0
  180. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.js.map +1 -0
  181. package/dist/components/composed/TdpSearch/utils.cjs +2 -0
  182. package/dist/components/composed/TdpSearch/utils.cjs.map +1 -0
  183. package/dist/components/composed/TdpSearch/utils.js +15 -0
  184. package/dist/components/composed/TdpSearch/utils.js.map +1 -0
  185. package/dist/components/composed/tdp-link.cjs +2 -0
  186. package/dist/components/composed/tdp-link.cjs.map +1 -0
  187. package/dist/components/composed/tdp-link.js +84 -0
  188. package/dist/components/composed/tdp-link.js.map +1 -0
  189. package/dist/components/composed/tdp-url.cjs +2 -0
  190. package/dist/components/composed/tdp-url.cjs.map +1 -0
  191. package/dist/components/composed/tdp-url.js +76 -0
  192. package/dist/components/composed/tdp-url.js.map +1 -0
  193. package/dist/components/ui/accordion.cjs +2 -0
  194. package/dist/components/ui/accordion.cjs.map +1 -0
  195. package/dist/components/ui/accordion.js +83 -0
  196. package/dist/components/ui/accordion.js.map +1 -0
  197. package/dist/components/ui/alert-dialog.cjs +2 -0
  198. package/dist/components/ui/alert-dialog.cjs.map +1 -0
  199. package/dist/components/ui/alert-dialog.js +181 -0
  200. package/dist/components/ui/alert-dialog.js.map +1 -0
  201. package/dist/components/ui/alert.cjs +2 -0
  202. package/dist/components/ui/alert.cjs.map +1 -0
  203. package/dist/components/ui/alert.js +78 -0
  204. package/dist/components/ui/alert.js.map +1 -0
  205. package/dist/components/ui/aspect-ratio.cjs +2 -0
  206. package/dist/components/ui/aspect-ratio.cjs.map +1 -0
  207. package/dist/components/ui/aspect-ratio.js +11 -0
  208. package/dist/components/ui/aspect-ratio.js.map +1 -0
  209. package/dist/components/ui/avatar.cjs +2 -0
  210. package/dist/components/ui/avatar.cjs.map +1 -0
  211. package/dist/components/ui/avatar.js +107 -0
  212. package/dist/components/ui/avatar.js.map +1 -0
  213. package/dist/components/ui/badge.cjs +2 -0
  214. package/dist/components/ui/badge.cjs.map +1 -0
  215. package/dist/components/ui/badge.js +44 -0
  216. package/dist/components/ui/badge.js.map +1 -0
  217. package/dist/components/ui/breadcrumb.cjs +2 -0
  218. package/dist/components/ui/breadcrumb.cjs.map +1 -0
  219. package/dist/components/ui/breadcrumb.js +118 -0
  220. package/dist/components/ui/breadcrumb.js.map +1 -0
  221. package/dist/components/ui/button-group.cjs +2 -0
  222. package/dist/components/ui/button-group.cjs.map +1 -0
  223. package/dist/components/ui/button-group.js +77 -0
  224. package/dist/components/ui/button-group.js.map +1 -0
  225. package/dist/components/ui/button.cjs +2 -0
  226. package/dist/components/ui/button.cjs.map +1 -0
  227. package/dist/components/ui/button.js +57 -0
  228. package/dist/components/ui/button.js.map +1 -0
  229. package/dist/components/ui/calendar.cjs +2 -0
  230. package/dist/components/ui/calendar.cjs.map +1 -0
  231. package/dist/components/ui/calendar.js +174 -0
  232. package/dist/components/ui/calendar.js.map +1 -0
  233. package/dist/components/ui/card.cjs +2 -0
  234. package/dist/components/ui/card.cjs.map +1 -0
  235. package/dist/components/ui/card.js +102 -0
  236. package/dist/components/ui/card.js.map +1 -0
  237. package/dist/components/ui/carousel.cjs +2 -0
  238. package/dist/components/ui/carousel.cjs.map +1 -0
  239. package/dist/components/ui/carousel.js +179 -0
  240. package/dist/components/ui/carousel.js.map +1 -0
  241. package/dist/components/ui/checkbox.cjs +2 -0
  242. package/dist/components/ui/checkbox.cjs.map +1 -0
  243. package/dist/components/ui/checkbox.js +35 -0
  244. package/dist/components/ui/checkbox.js.map +1 -0
  245. package/dist/components/ui/code-editor.cjs +2 -0
  246. package/dist/components/ui/code-editor.cjs.map +1 -0
  247. package/dist/components/ui/code-editor.js +103 -0
  248. package/dist/components/ui/code-editor.js.map +1 -0
  249. package/dist/components/ui/collapsible.cjs +2 -0
  250. package/dist/components/ui/collapsible.cjs.map +1 -0
  251. package/dist/components/ui/collapsible.js +35 -0
  252. package/dist/components/ui/collapsible.js.map +1 -0
  253. package/dist/components/ui/combobox.cjs +2 -0
  254. package/dist/components/ui/combobox.cjs.map +1 -0
  255. package/dist/components/ui/combobox.js +278 -0
  256. package/dist/components/ui/combobox.js.map +1 -0
  257. package/dist/components/ui/command.cjs +2 -0
  258. package/dist/components/ui/command.cjs.map +1 -0
  259. package/dist/components/ui/command.js +174 -0
  260. package/dist/components/ui/command.js.map +1 -0
  261. package/dist/components/ui/context-menu.cjs +2 -0
  262. package/dist/components/ui/context-menu.cjs.map +1 -0
  263. package/dist/components/ui/context-menu.js +236 -0
  264. package/dist/components/ui/context-menu.js.map +1 -0
  265. package/dist/components/ui/dialog.cjs +2 -0
  266. package/dist/components/ui/dialog.cjs.map +1 -0
  267. package/dist/components/ui/dialog.js +154 -0
  268. package/dist/components/ui/dialog.js.map +1 -0
  269. package/dist/components/ui/drawer.cjs +2 -0
  270. package/dist/components/ui/drawer.cjs.map +1 -0
  271. package/dist/components/ui/drawer.js +125 -0
  272. package/dist/components/ui/drawer.js.map +1 -0
  273. package/dist/components/ui/dropdown-menu.cjs +2 -0
  274. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  275. package/dist/components/ui/dropdown-menu.js +252 -0
  276. package/dist/components/ui/dropdown-menu.js.map +1 -0
  277. package/dist/components/ui/field.cjs +2 -0
  278. package/dist/components/ui/field.cjs.map +1 -0
  279. package/dist/components/ui/field.js +210 -0
  280. package/dist/components/ui/field.js.map +1 -0
  281. package/dist/components/ui/hover-card.cjs +2 -0
  282. package/dist/components/ui/hover-card.cjs.map +1 -0
  283. package/dist/components/ui/hover-card.js +39 -0
  284. package/dist/components/ui/hover-card.js.map +1 -0
  285. package/dist/components/ui/input-group.cjs +2 -0
  286. package/dist/components/ui/input-group.cjs.map +1 -0
  287. package/dist/components/ui/input-group.js +145 -0
  288. package/dist/components/ui/input-group.js.map +1 -0
  289. package/dist/components/ui/input-otp.cjs +2 -0
  290. package/dist/components/ui/input-otp.cjs.map +1 -0
  291. package/dist/components/ui/input-otp.js +82 -0
  292. package/dist/components/ui/input-otp.js.map +1 -0
  293. package/dist/components/ui/input.cjs +2 -0
  294. package/dist/components/ui/input.cjs.map +1 -0
  295. package/dist/components/ui/input.js +20 -0
  296. package/dist/components/ui/input.js.map +1 -0
  297. package/dist/components/ui/item.cjs +2 -0
  298. package/dist/components/ui/item.cjs.map +1 -0
  299. package/dist/components/ui/item.js +191 -0
  300. package/dist/components/ui/item.js.map +1 -0
  301. package/dist/components/ui/kbd.cjs +2 -0
  302. package/dist/components/ui/kbd.cjs.map +1 -0
  303. package/dist/components/ui/kbd.js +30 -0
  304. package/dist/components/ui/kbd.js.map +1 -0
  305. package/dist/components/ui/label.cjs +2 -0
  306. package/dist/components/ui/label.cjs.map +1 -0
  307. package/dist/components/ui/label.js +23 -0
  308. package/dist/components/ui/label.js.map +1 -0
  309. package/dist/components/ui/menubar.cjs +2 -0
  310. package/dist/components/ui/menubar.cjs.map +1 -0
  311. package/dist/components/ui/menubar.js +256 -0
  312. package/dist/components/ui/menubar.js.map +1 -0
  313. package/dist/components/ui/navigation-menu.cjs +2 -0
  314. package/dist/components/ui/navigation-menu.cjs.map +1 -0
  315. package/dist/components/ui/navigation-menu.js +164 -0
  316. package/dist/components/ui/navigation-menu.js.map +1 -0
  317. package/dist/components/ui/radio-group.cjs +2 -0
  318. package/dist/components/ui/radio-group.cjs.map +1 -0
  319. package/dist/components/ui/radio-group.js +45 -0
  320. package/dist/components/ui/radio-group.js.map +1 -0
  321. package/dist/components/ui/resizable.cjs +2 -0
  322. package/dist/components/ui/resizable.cjs.map +1 -0
  323. package/dist/components/ui/resizable.js +46 -0
  324. package/dist/components/ui/resizable.js.map +1 -0
  325. package/dist/components/ui/scroll-area.cjs +2 -0
  326. package/dist/components/ui/scroll-area.cjs.map +1 -0
  327. package/dist/components/ui/scroll-area.js +60 -0
  328. package/dist/components/ui/scroll-area.js.map +1 -0
  329. package/dist/components/ui/select.cjs +2 -0
  330. package/dist/components/ui/select.cjs.map +1 -0
  331. package/dist/components/ui/select.js +184 -0
  332. package/dist/components/ui/select.js.map +1 -0
  333. package/dist/components/ui/separator.cjs +2 -0
  334. package/dist/components/ui/separator.cjs.map +1 -0
  335. package/dist/components/ui/separator.js +27 -0
  336. package/dist/components/ui/separator.js.map +1 -0
  337. package/dist/components/ui/sheet.cjs +2 -0
  338. package/dist/components/ui/sheet.cjs.map +1 -0
  339. package/dist/components/ui/sheet.js +137 -0
  340. package/dist/components/ui/sheet.js.map +1 -0
  341. package/dist/components/ui/sidebar.cjs +2 -0
  342. package/dist/components/ui/sidebar.cjs.map +1 -0
  343. package/dist/components/ui/sidebar.js +579 -0
  344. package/dist/components/ui/sidebar.js.map +1 -0
  345. package/dist/components/ui/skeleton.cjs +2 -0
  346. package/dist/components/ui/skeleton.cjs.map +1 -0
  347. package/dist/components/ui/skeleton.js +16 -0
  348. package/dist/components/ui/skeleton.js.map +1 -0
  349. package/dist/components/ui/slider.cjs +2 -0
  350. package/dist/components/ui/slider.cjs.map +1 -0
  351. package/dist/components/ui/slider.js +60 -0
  352. package/dist/components/ui/slider.js.map +1 -0
  353. package/dist/components/ui/sonner.cjs +2 -0
  354. package/dist/components/ui/sonner.cjs.map +1 -0
  355. package/dist/components/ui/sonner.js +37 -0
  356. package/dist/components/ui/sonner.js.map +1 -0
  357. package/dist/components/ui/spinner.cjs +2 -0
  358. package/dist/components/ui/spinner.cjs.map +1 -0
  359. package/dist/components/ui/spinner.js +10 -0
  360. package/dist/components/ui/spinner.js.map +1 -0
  361. package/dist/components/ui/switch.cjs +2 -0
  362. package/dist/components/ui/switch.cjs.map +1 -0
  363. package/dist/components/ui/switch.js +32 -0
  364. package/dist/components/ui/switch.js.map +1 -0
  365. package/dist/components/ui/table.cjs +2 -0
  366. package/dist/components/ui/table.cjs.map +1 -0
  367. package/dist/components/ui/table.js +115 -0
  368. package/dist/components/ui/table.js.map +1 -0
  369. package/dist/components/ui/tabs.cjs +2 -0
  370. package/dist/components/ui/tabs.cjs.map +1 -0
  371. package/dist/components/ui/tabs.js +91 -0
  372. package/dist/components/ui/tabs.js.map +1 -0
  373. package/dist/components/ui/tetrascience-icon.cjs +2 -0
  374. package/dist/components/ui/tetrascience-icon.cjs.map +1 -0
  375. package/dist/components/ui/tetrascience-icon.js +46 -0
  376. package/dist/components/ui/tetrascience-icon.js.map +1 -0
  377. package/dist/components/ui/textarea.cjs +2 -0
  378. package/dist/components/ui/textarea.cjs.map +1 -0
  379. package/dist/components/ui/textarea.js +19 -0
  380. package/dist/components/ui/textarea.js.map +1 -0
  381. package/dist/components/ui/toggle-group.cjs +2 -0
  382. package/dist/components/ui/toggle-group.cjs.map +1 -0
  383. package/dist/components/ui/toggle-group.js +77 -0
  384. package/dist/components/ui/toggle-group.js.map +1 -0
  385. package/dist/components/ui/toggle.cjs +2 -0
  386. package/dist/components/ui/toggle.cjs.map +1 -0
  387. package/dist/components/ui/toggle.js +44 -0
  388. package/dist/components/ui/toggle.js.map +1 -0
  389. package/dist/components/ui/tooltip.cjs +2 -0
  390. package/dist/components/ui/tooltip.cjs.map +1 -0
  391. package/dist/components/ui/tooltip.js +56 -0
  392. package/dist/components/ui/tooltip.js.map +1 -0
  393. package/dist/hooks/use-code-editor-theme.cjs +2 -0
  394. package/dist/hooks/use-code-editor-theme.cjs.map +1 -0
  395. package/dist/hooks/use-code-editor-theme.js +31 -0
  396. package/dist/hooks/use-code-editor-theme.js.map +1 -0
  397. package/dist/hooks/use-is-dark.cjs +2 -0
  398. package/dist/hooks/use-is-dark.cjs.map +1 -0
  399. package/dist/hooks/use-is-dark.js +18 -0
  400. package/dist/hooks/use-is-dark.js.map +1 -0
  401. package/dist/hooks/use-mobile.cjs +2 -0
  402. package/dist/hooks/use-mobile.cjs.map +1 -0
  403. package/dist/hooks/use-mobile.js +15 -0
  404. package/dist/hooks/use-mobile.js.map +1 -0
  405. package/dist/hooks/use-plotly-theme.cjs +2 -0
  406. package/dist/hooks/use-plotly-theme.cjs.map +1 -0
  407. package/dist/hooks/use-plotly-theme.js +33 -0
  408. package/dist/hooks/use-plotly-theme.js.map +1 -0
  409. package/dist/index.cjs +1 -10
  410. package/dist/index.cjs.map +1 -1
  411. package/dist/index.js +389 -9435
  412. package/dist/index.js.map +1 -1
  413. package/dist/lib/utils.cjs +2 -0
  414. package/dist/lib/utils.cjs.map +1 -0
  415. package/dist/lib/utils.js +9 -0
  416. package/dist/lib/utils.js.map +1 -0
  417. package/dist/providers/athena.cjs +1 -1
  418. package/dist/providers/athena.cjs.map +1 -1
  419. package/dist/providers/athena.js +9 -157
  420. package/dist/providers/athena.js.map +1 -1
  421. package/dist/providers/databricks.cjs +1 -1
  422. package/dist/providers/databricks.cjs.map +1 -1
  423. package/dist/providers/databricks.js +9 -82
  424. package/dist/providers/databricks.js.map +1 -1
  425. package/dist/providers/snowflake.cjs +1 -1
  426. package/dist/providers/snowflake.cjs.map +1 -1
  427. package/dist/providers/snowflake.js +8 -118
  428. package/dist/providers/snowflake.js.map +1 -1
  429. package/dist/server/auth/JwtTokenManager.cjs +2 -0
  430. package/dist/server/auth/JwtTokenManager.cjs.map +1 -0
  431. package/dist/server/auth/JwtTokenManager.js +134 -0
  432. package/dist/server/auth/JwtTokenManager.js.map +1 -0
  433. package/dist/server/providers/AthenaProvider.cjs +2 -0
  434. package/dist/server/providers/AthenaProvider.cjs.map +1 -0
  435. package/dist/server/providers/AthenaProvider.js +154 -0
  436. package/dist/server/providers/AthenaProvider.js.map +1 -0
  437. package/dist/server/providers/DatabricksProvider.cjs +2 -0
  438. package/dist/server/providers/DatabricksProvider.cjs.map +1 -0
  439. package/dist/server/providers/DatabricksProvider.js +79 -0
  440. package/dist/server/providers/DatabricksProvider.js.map +1 -0
  441. package/dist/server/providers/SnowflakeProvider.cjs +2 -0
  442. package/dist/server/providers/SnowflakeProvider.cjs.map +1 -0
  443. package/dist/server/providers/SnowflakeProvider.js +116 -0
  444. package/dist/server/providers/SnowflakeProvider.js.map +1 -0
  445. package/dist/server/providers/buildProvider.cjs +2 -0
  446. package/dist/server/providers/buildProvider.cjs.map +1 -0
  447. package/dist/server/providers/buildProvider.js +22 -0
  448. package/dist/server/providers/buildProvider.js.map +1 -0
  449. package/dist/server/providers/exceptions.cjs +2 -0
  450. package/dist/server/providers/exceptions.cjs.map +1 -0
  451. package/dist/{exceptions-jCQ6h5C8.js → server/providers/exceptions.js} +11 -11
  452. package/dist/server/providers/exceptions.js.map +1 -0
  453. package/dist/server/providers/getProviderConfigurations.cjs +2 -0
  454. package/dist/server/providers/getProviderConfigurations.cjs.map +1 -0
  455. package/dist/server/providers/getProviderConfigurations.js +78 -0
  456. package/dist/server/providers/getProviderConfigurations.js.map +1 -0
  457. package/dist/server/providers/providerDiscovery.cjs +2 -0
  458. package/dist/server/providers/providerDiscovery.cjs.map +1 -0
  459. package/dist/server/providers/providerDiscovery.js +28 -0
  460. package/dist/server/providers/providerDiscovery.js.map +1 -0
  461. package/dist/server.cjs +1 -1
  462. package/dist/server.cjs.map +1 -1
  463. package/dist/server.js +27 -262
  464. package/dist/server.js.map +1 -1
  465. package/dist/utils/colors.cjs +2 -0
  466. package/dist/utils/colors.cjs.map +1 -0
  467. package/dist/utils/colors.js +98 -0
  468. package/dist/utils/colors.js.map +1 -0
  469. package/package.json +4 -1
  470. package/dist/exceptions-DN25pCDi.cjs +0 -2
  471. package/dist/exceptions-DN25pCDi.cjs.map +0 -1
  472. package/dist/exceptions-jCQ6h5C8.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("clsx"),t=require("tailwind-merge");function n(...e){return t.twMerge(r.clsx(e))}exports.cn=n;
2
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs","sources":["../../src/lib/utils.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"names":["cn","inputs","twMerge","clsx"],"mappings":"oIAGO,SAASA,KAAMC,EAAsB,CAC1C,OAAOC,EAAAA,QAAQC,OAAKF,CAAM,CAAC,CAC7B"}
@@ -0,0 +1,9 @@
1
+ import { clsx as o } from "clsx";
2
+ import { twMerge as t } from "tailwind-merge";
3
+ function n(...r) {
4
+ return t(o(r));
5
+ }
6
+ export {
7
+ n as cn
8
+ };
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../src/lib/utils.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"names":["cn","inputs","twMerge","clsx"],"mappings":";;AAGO,SAASA,KAAMC,GAAsB;AAC1C,SAAOC,EAAQC,EAAKF,CAAM,CAAC;AAC7B;"}
@@ -1,2 +1,2 @@
1
- "use strict";var g=Object.create;var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var k=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of S(t))!T.call(e,n)&&n!==r&&p(e,n,{get:()=>t[n],enumerable:!(o=f(t,n))||o.enumerable});return e};var v=(e,t,r)=>(r=e!=null?g(C(e)):{},k(t||!e||!e.__esModule?p(r,"default",{value:e,enumerable:!0}):r,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../exceptions-DN25pCDi.cjs"),x=1e3;async function Q(){try{return await import("@aws-sdk/client-athena")}catch{throw new i.InvalidProviderConfigurationError("The '@aws-sdk/client-athena' package is required to use the Athena provider. Please install it: npm install @aws-sdk/client-athena")}}const _=262144;class m{client;sdk;workgroup;database;outputLocation;constructor(t,r,o,n,a){this.client=t,this.sdk=r,this.workgroup=o,this.database=n,this.outputLocation=a}async query(t,r={}){if(t.length>_)throw new Error("Query length exceeds the maximum allowed limit.");const o=new this.sdk.StartQueryExecutionCommand({QueryString:t,WorkGroup:this.workgroup,QueryExecutionContext:{Database:this.database},ResultConfiguration:this.outputLocation?{OutputLocation:this.outputLocation}:void 0}),a=(await this.client.send(o)).QueryExecutionId;if(!a)throw new i.QueryError("Failed to start query execution");return await this.waitForQueryCompletion(a,t),this.fetchAllResults(a)}async waitForQueryCompletion(t,r){const a=Date.now();for(;Date.now()-a<3e5;){const l=new this.sdk.GetQueryExecutionCommand({QueryExecutionId:t}),s=await this.client.send(l),u=s.QueryExecution?.Status?.State;if(u===this.sdk.QueryExecutionState.SUCCEEDED)return;if(u===this.sdk.QueryExecutionState.FAILED||u===this.sdk.QueryExecutionState.CANCELLED){const c=s.QueryExecution?.Status?.StateChangeReason??"Unknown error";if(c.includes("TABLE_NOT_FOUND")){const h=c.split(":").pop()?.trim()??"";throw new i.MissingTableError("Athena is unable to find the table. If the table is created by a tetraflow, make sure that the tetraflow has run successfully. "+h+".")}throw new i.QueryError(`Query failed: ${r}. Reason: ${c}`)}await new Promise(c=>setTimeout(c,1e3))}throw new i.QueryError(`Query timed out after ${3e5/x} seconds`)}async fetchAllResults(t){const r=[];let o,n=[],a=!0;do{const l=new this.sdk.GetQueryResultsCommand({QueryExecutionId:t,NextToken:o}),s=await this.client.send(l);a&&s.ResultSet?.ResultSetMetadata?.ColumnInfo&&(n=s.ResultSet.ResultSetMetadata.ColumnInfo.map((h,w)=>{const d=h.Name;return d&&d.trim()!==""?d:`column_${w}`}));const u=s.ResultSet?.Rows??[],c=a?u.slice(1):u;for(const h of c){const w={};h.Data?.forEach((d,E)=>{const y=n[E]??`column_${E}`;w[y]=d.VarCharValue??null}),r.push(w)}o=s.NextToken,a=!1}while(o);return r}async close(){this.client.destroy()}}async function A(){const e=await Q(),t=process.env.ORG_SLUG??"",r=t.replace(/-/g,"_"),o=process.env.ATHENA_S3_OUTPUT_LOCATION,n=process.env.AWS_REGION,a=`${r}__tss__default`,l=t,s=new e.AthenaClient({region:n});try{return await s.send(new e.GetWorkGroupCommand({WorkGroup:l})),new m(s,e,l,a)}catch{if(!o)throw new Error("ATHENA_S3_OUTPUT_LOCATION environment variable is required when using the 'primary' workgroup. Either set this variable or ensure the org-specific workgroup exists.");const u=`s3://${o}/${r}/`;return new m(s,e,"primary",a,u)}}exports.InvalidProviderConfigurationError=i.InvalidProviderConfigurationError;exports.MissingTableError=i.MissingTableError;exports.ProviderConnectionError=i.ProviderConnectionError;exports.ProviderError=i.ProviderError;exports.QueryError=i.QueryError;exports.AthenaProvider=m;exports.getTdpAthenaProvider=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../server/providers/AthenaProvider.cjs"),r=require("../server/providers/exceptions.cjs");exports.AthenaProvider=e.AthenaProvider;exports.getTdpAthenaProvider=e.getTdpAthenaProvider;exports.InvalidProviderConfigurationError=r.InvalidProviderConfigurationError;exports.MissingTableError=r.MissingTableError;exports.ProviderConnectionError=r.ProviderConnectionError;exports.ProviderError=r.ProviderError;exports.QueryError=r.QueryError;
2
2
  //# sourceMappingURL=athena.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"athena.cjs","sources":["../../src/server/providers/AthenaProvider.ts"],"sourcesContent":["/**\n * Athena Data Provider\n *\n * TypeScript equivalent of AthenaProvider from\n * ts-lib-ui-kit-streamlit/tetrascience/data_app_providers/provider.py\n *\n * @remarks\n * This provider requires the `@aws-sdk/client-athena` package to be installed.\n * It is an optional peer dependency - install it only if you need Athena support:\n * ```bash\n * npm install @aws-sdk/client-athena\n * # or\n * yarn add @aws-sdk/client-athena\n * ```\n */\n\nimport {\n QueryError,\n MissingTableError,\n InvalidProviderConfigurationError,\n} from \"./exceptions\";\n\n/** Milliseconds per second */\nconst MILLISECONDS_PER_SECOND = 1000;\n\n// Type imports for @aws-sdk/client-athena (these don't require the package at runtime)\ntype AthenaClient = import(\"@aws-sdk/client-athena\").AthenaClient;\ntype AthenaSDK = typeof import(\"@aws-sdk/client-athena\");\n\n/**\n * Dynamically import @aws-sdk/client-athena\n * @throws {InvalidProviderConfigurationError} If @aws-sdk/client-athena is not installed\n */\nasync function getAthenaSDK(): Promise<AthenaSDK> {\n try {\n return await import(\"@aws-sdk/client-athena\");\n } catch {\n throw new InvalidProviderConfigurationError(\n \"The '@aws-sdk/client-athena' package is required to use the Athena provider. \" +\n \"Please install it: npm install @aws-sdk/client-athena\",\n );\n }\n}\n\n/** Maximum query length allowed by Athena */\nconst MAX_QUERY_LENGTH = 262144;\n\n/**\n * Athena data provider\n */\nexport class AthenaProvider {\n private client: AthenaClient;\n private sdk: AthenaSDK;\n private workgroup: string;\n private database: string;\n private outputLocation?: string;\n\n /**\n * Initialize the Athena data provider\n *\n * @param client - AWS Athena client\n * @param sdk - AWS Athena SDK module (for accessing command classes)\n * @param workgroup - Athena workgroup to use\n * @param database - Default database/schema\n * @param outputLocation - Optional S3 output location\n */\n constructor(\n client: AthenaClient,\n sdk: AthenaSDK,\n workgroup: string,\n database: string,\n outputLocation?: string,\n ) {\n this.client = client;\n this.sdk = sdk;\n this.workgroup = workgroup;\n this.database = database;\n this.outputLocation = outputLocation;\n }\n\n /**\n * Query the Athena database\n *\n * @param sqlQuery - SQL query to execute\n * @param _params - Parameters to pass to the query (currently not used - Athena doesn't support parameterized queries)\n * @returns Promise resolving to array of row objects\n *\n * @remarks\n * **Security Note:** AWS Athena does not support parameterized queries.\n * Unlike traditional databases, there is no native way to use bind parameters\n * with Athena. Callers are responsible for properly sanitizing any user input\n * before constructing the SQL query string. This is a known limitation of the\n * Athena service, not a design flaw in this implementation.\n */\n async query(\n sqlQuery: string,\n _params: Record<string, unknown> = {},\n ): Promise<Array<Record<string, unknown>>> {\n if (sqlQuery.length > MAX_QUERY_LENGTH) {\n throw new Error(\"Query length exceeds the maximum allowed limit.\");\n }\n\n // Start query execution\n // Note: Athena does not support parameterized queries. The sqlQuery is passed\n // directly to Athena. Callers must sanitize user input before constructing queries.\n const startCommand = new this.sdk.StartQueryExecutionCommand({\n QueryString: sqlQuery,\n WorkGroup: this.workgroup,\n QueryExecutionContext: {\n Database: this.database,\n },\n ResultConfiguration: this.outputLocation\n ? { OutputLocation: this.outputLocation }\n : undefined,\n });\n\n const startResponse = await this.client.send(startCommand);\n const queryExecutionId = startResponse.QueryExecutionId;\n\n if (!queryExecutionId) {\n throw new QueryError(\"Failed to start query execution\");\n }\n\n // Wait for query to complete\n await this.waitForQueryCompletion(queryExecutionId, sqlQuery);\n\n // Fetch results\n return this.fetchAllResults(queryExecutionId);\n }\n\n /**\n * Wait for query to complete\n */\n private async waitForQueryCompletion(\n queryExecutionId: string,\n originalQuery: string,\n ): Promise<void> {\n const maxWaitTime = 300000; // 5 minutes\n const pollInterval = 1000; // 1 second\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n const command = new this.sdk.GetQueryExecutionCommand({\n QueryExecutionId: queryExecutionId,\n });\n const response = await this.client.send(command);\n const state = response.QueryExecution?.Status?.State;\n\n if (state === this.sdk.QueryExecutionState.SUCCEEDED) {\n return;\n }\n\n if (\n state === this.sdk.QueryExecutionState.FAILED ||\n state === this.sdk.QueryExecutionState.CANCELLED\n ) {\n const reason =\n response.QueryExecution?.Status?.StateChangeReason ?? \"Unknown error\";\n\n if (reason.includes(\"TABLE_NOT_FOUND\")) {\n const errorTail = reason.split(\":\").pop()?.trim() ?? \"\";\n throw new MissingTableError(\n \"Athena is unable to find the table. If the table is created by a \" +\n \"tetraflow, make sure that the tetraflow has run successfully. \" +\n errorTail +\n \".\",\n );\n }\n\n throw new QueryError(\n `Query failed: ${originalQuery}. Reason: ${reason}`,\n );\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new QueryError(\n `Query timed out after ${maxWaitTime / MILLISECONDS_PER_SECOND} seconds`,\n );\n }\n\n /**\n * Fetch all results from a completed query\n */\n private async fetchAllResults(\n queryExecutionId: string,\n ): Promise<Array<Record<string, unknown>>> {\n const results: Array<Record<string, unknown>> = [];\n let nextToken: string | undefined;\n let columnNames: string[] = [];\n let isFirstPage = true;\n\n do {\n const command = new this.sdk.GetQueryResultsCommand({\n QueryExecutionId: queryExecutionId,\n NextToken: nextToken,\n });\n\n const response = await this.client.send(command);\n\n if (isFirstPage && response.ResultSet?.ResultSetMetadata?.ColumnInfo) {\n columnNames = response.ResultSet.ResultSetMetadata.ColumnInfo.map(\n (col, idx) => {\n // Handle empty or missing column names by using a fallback\n const name = col.Name;\n return name && name.trim() !== \"\" ? name : `column_${idx}`;\n },\n );\n }\n\n const rows = response.ResultSet?.Rows ?? [];\n // Skip header row on first page\n const dataRows = isFirstPage ? rows.slice(1) : rows;\n\n for (const row of dataRows) {\n const rowData: Record<string, unknown> = {};\n row.Data?.forEach((cell, index) => {\n // columnNames already has fallback values, so we can use them directly\n const columnName = columnNames[index] ?? `column_${index}`;\n rowData[columnName] = cell.VarCharValue ?? null;\n });\n results.push(rowData);\n }\n\n nextToken = response.NextToken;\n isFirstPage = false;\n } while (nextToken);\n\n return results;\n }\n\n /**\n * Close the Athena client (no-op for AWS SDK clients)\n */\n async close(): Promise<void> {\n this.client.destroy();\n }\n}\n\n/**\n * Get the TDP Athena provider\n *\n * Creates an Athena provider using TDP environment configuration\n *\n * @returns Promise resolving to Athena data provider\n * @throws {InvalidProviderConfigurationError} If @aws-sdk/client-athena is not installed\n * @throws {Error} If ATHENA_S3_OUTPUT_LOCATION is not set when using the 'primary' workgroup\n */\nexport async function getTdpAthenaProvider(): Promise<AthenaProvider> {\n // Dynamically import @aws-sdk/client-athena\n const athenaSDK = await getAthenaSDK();\n\n const orgSlug = process.env.ORG_SLUG ?? \"\";\n const orgSlugDbFriendly = orgSlug.replace(/-/g, \"_\");\n const athenaQueryBucket = process.env.ATHENA_S3_OUTPUT_LOCATION;\n const athenaRegion = process.env.AWS_REGION;\n const athenaSchema = `${orgSlugDbFriendly}__tss__default`;\n const athenaWorkgroup = orgSlug;\n\n const client = new athenaSDK.AthenaClient({\n region: athenaRegion,\n });\n\n // Check if the org-specific workgroup exists\n try {\n await client.send(\n new athenaSDK.GetWorkGroupCommand({\n WorkGroup: athenaWorkgroup,\n }),\n );\n\n // Workgroup exists, use it\n return new AthenaProvider(client, athenaSDK, athenaWorkgroup, athenaSchema);\n } catch {\n // Workgroup doesn't exist or access denied, use 'primary' workgroup\n // The 'primary' workgroup requires an explicit output location\n if (!athenaQueryBucket) {\n throw new Error(\n \"ATHENA_S3_OUTPUT_LOCATION environment variable is required when using the 'primary' workgroup. \" +\n \"Either set this variable or ensure the org-specific workgroup exists.\",\n );\n }\n\n const athenaOutputLocation = `s3://${athenaQueryBucket}/${orgSlugDbFriendly}/`;\n return new AthenaProvider(\n client,\n athenaSDK,\n \"primary\",\n athenaSchema,\n athenaOutputLocation,\n );\n }\n}\n\n"],"names":["MILLISECONDS_PER_SECOND","getAthenaSDK","InvalidProviderConfigurationError","MAX_QUERY_LENGTH","AthenaProvider","client","sdk","workgroup","database","outputLocation","sqlQuery","_params","startCommand","queryExecutionId","QueryError","originalQuery","startTime","command","response","state","reason","errorTail","MissingTableError","resolve","results","nextToken","columnNames","isFirstPage","col","idx","name","rows","dataRows","row","rowData","cell","index","columnName","getTdpAthenaProvider","athenaSDK","orgSlug","orgSlugDbFriendly","athenaQueryBucket","athenaRegion","athenaSchema","athenaWorkgroup","athenaOutputLocation"],"mappings":"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"}
1
+ {"version":3,"file":"athena.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,160 +1,12 @@
1
- import { Q as m, M as y, I as f } from "../exceptions-jCQ6h5C8.js";
2
- import { P as Q, a as R } from "../exceptions-jCQ6h5C8.js";
3
- const S = 1e3;
4
- async function g() {
5
- try {
6
- return await import("@aws-sdk/client-athena");
7
- } catch {
8
- throw new f(
9
- "The '@aws-sdk/client-athena' package is required to use the Athena provider. Please install it: npm install @aws-sdk/client-athena"
10
- );
11
- }
12
- }
13
- const k = 262144;
14
- class p {
15
- client;
16
- sdk;
17
- workgroup;
18
- database;
19
- outputLocation;
20
- /**
21
- * Initialize the Athena data provider
22
- *
23
- * @param client - AWS Athena client
24
- * @param sdk - AWS Athena SDK module (for accessing command classes)
25
- * @param workgroup - Athena workgroup to use
26
- * @param database - Default database/schema
27
- * @param outputLocation - Optional S3 output location
28
- */
29
- constructor(e, a, o, r, t) {
30
- this.client = e, this.sdk = a, this.workgroup = o, this.database = r, this.outputLocation = t;
31
- }
32
- /**
33
- * Query the Athena database
34
- *
35
- * @param sqlQuery - SQL query to execute
36
- * @param _params - Parameters to pass to the query (currently not used - Athena doesn't support parameterized queries)
37
- * @returns Promise resolving to array of row objects
38
- *
39
- * @remarks
40
- * **Security Note:** AWS Athena does not support parameterized queries.
41
- * Unlike traditional databases, there is no native way to use bind parameters
42
- * with Athena. Callers are responsible for properly sanitizing any user input
43
- * before constructing the SQL query string. This is a known limitation of the
44
- * Athena service, not a design flaw in this implementation.
45
- */
46
- async query(e, a = {}) {
47
- if (e.length > k)
48
- throw new Error("Query length exceeds the maximum allowed limit.");
49
- const o = new this.sdk.StartQueryExecutionCommand({
50
- QueryString: e,
51
- WorkGroup: this.workgroup,
52
- QueryExecutionContext: {
53
- Database: this.database
54
- },
55
- ResultConfiguration: this.outputLocation ? { OutputLocation: this.outputLocation } : void 0
56
- }), t = (await this.client.send(o)).QueryExecutionId;
57
- if (!t)
58
- throw new m("Failed to start query execution");
59
- return await this.waitForQueryCompletion(t, e), this.fetchAllResults(t);
60
- }
61
- /**
62
- * Wait for query to complete
63
- */
64
- async waitForQueryCompletion(e, a) {
65
- const t = Date.now();
66
- for (; Date.now() - t < 3e5; ) {
67
- const u = new this.sdk.GetQueryExecutionCommand({
68
- QueryExecutionId: e
69
- }), n = await this.client.send(u), s = n.QueryExecution?.Status?.State;
70
- if (s === this.sdk.QueryExecutionState.SUCCEEDED)
71
- return;
72
- if (s === this.sdk.QueryExecutionState.FAILED || s === this.sdk.QueryExecutionState.CANCELLED) {
73
- const i = n.QueryExecution?.Status?.StateChangeReason ?? "Unknown error";
74
- if (i.includes("TABLE_NOT_FOUND")) {
75
- const l = i.split(":").pop()?.trim() ?? "";
76
- throw new y(
77
- "Athena is unable to find the table. If the table is created by a tetraflow, make sure that the tetraflow has run successfully. " + l + "."
78
- );
79
- }
80
- throw new m(
81
- `Query failed: ${a}. Reason: ${i}`
82
- );
83
- }
84
- await new Promise((i) => setTimeout(i, 1e3));
85
- }
86
- throw new m(
87
- `Query timed out after ${3e5 / S} seconds`
88
- );
89
- }
90
- /**
91
- * Fetch all results from a completed query
92
- */
93
- async fetchAllResults(e) {
94
- const a = [];
95
- let o, r = [], t = !0;
96
- do {
97
- const u = new this.sdk.GetQueryResultsCommand({
98
- QueryExecutionId: e,
99
- NextToken: o
100
- }), n = await this.client.send(u);
101
- t && n.ResultSet?.ResultSetMetadata?.ColumnInfo && (r = n.ResultSet.ResultSetMetadata.ColumnInfo.map(
102
- (l, d) => {
103
- const h = l.Name;
104
- return h && h.trim() !== "" ? h : `column_${d}`;
105
- }
106
- ));
107
- const s = n.ResultSet?.Rows ?? [], i = t ? s.slice(1) : s;
108
- for (const l of i) {
109
- const d = {};
110
- l.Data?.forEach((h, w) => {
111
- const E = r[w] ?? `column_${w}`;
112
- d[E] = h.VarCharValue ?? null;
113
- }), a.push(d);
114
- }
115
- o = n.NextToken, t = !1;
116
- } while (o);
117
- return a;
118
- }
119
- /**
120
- * Close the Athena client (no-op for AWS SDK clients)
121
- */
122
- async close() {
123
- this.client.destroy();
124
- }
125
- }
126
- async function C() {
127
- const c = await g(), e = process.env.ORG_SLUG ?? "", a = e.replace(/-/g, "_"), o = process.env.ATHENA_S3_OUTPUT_LOCATION, r = process.env.AWS_REGION, t = `${a}__tss__default`, u = e, n = new c.AthenaClient({
128
- region: r
129
- });
130
- try {
131
- return await n.send(
132
- new c.GetWorkGroupCommand({
133
- WorkGroup: u
134
- })
135
- ), new p(n, c, u, t);
136
- } catch {
137
- if (!o)
138
- throw new Error(
139
- "ATHENA_S3_OUTPUT_LOCATION environment variable is required when using the 'primary' workgroup. Either set this variable or ensure the org-specific workgroup exists."
140
- );
141
- const s = `s3://${o}/${a}/`;
142
- return new p(
143
- n,
144
- c,
145
- "primary",
146
- t,
147
- s
148
- );
149
- }
150
- }
1
+ import { AthenaProvider as e, getTdpAthenaProvider as i } from "../server/providers/AthenaProvider.js";
2
+ import { InvalidProviderConfigurationError as d, MissingTableError as t, ProviderConnectionError as v, ProviderError as a, QueryError as E } from "../server/providers/exceptions.js";
151
3
  export {
152
- p as AthenaProvider,
153
- f as InvalidProviderConfigurationError,
154
- y as MissingTableError,
155
- Q as ProviderConnectionError,
156
- R as ProviderError,
157
- m as QueryError,
158
- C as getTdpAthenaProvider
4
+ e as AthenaProvider,
5
+ d as InvalidProviderConfigurationError,
6
+ t as MissingTableError,
7
+ v as ProviderConnectionError,
8
+ a as ProviderError,
9
+ E as QueryError,
10
+ i as getTdpAthenaProvider
159
11
  };
160
12
  //# sourceMappingURL=athena.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"athena.js","sources":["../../src/server/providers/AthenaProvider.ts"],"sourcesContent":["/**\n * Athena Data Provider\n *\n * TypeScript equivalent of AthenaProvider from\n * ts-lib-ui-kit-streamlit/tetrascience/data_app_providers/provider.py\n *\n * @remarks\n * This provider requires the `@aws-sdk/client-athena` package to be installed.\n * It is an optional peer dependency - install it only if you need Athena support:\n * ```bash\n * npm install @aws-sdk/client-athena\n * # or\n * yarn add @aws-sdk/client-athena\n * ```\n */\n\nimport {\n QueryError,\n MissingTableError,\n InvalidProviderConfigurationError,\n} from \"./exceptions\";\n\n/** Milliseconds per second */\nconst MILLISECONDS_PER_SECOND = 1000;\n\n// Type imports for @aws-sdk/client-athena (these don't require the package at runtime)\ntype AthenaClient = import(\"@aws-sdk/client-athena\").AthenaClient;\ntype AthenaSDK = typeof import(\"@aws-sdk/client-athena\");\n\n/**\n * Dynamically import @aws-sdk/client-athena\n * @throws {InvalidProviderConfigurationError} If @aws-sdk/client-athena is not installed\n */\nasync function getAthenaSDK(): Promise<AthenaSDK> {\n try {\n return await import(\"@aws-sdk/client-athena\");\n } catch {\n throw new InvalidProviderConfigurationError(\n \"The '@aws-sdk/client-athena' package is required to use the Athena provider. \" +\n \"Please install it: npm install @aws-sdk/client-athena\",\n );\n }\n}\n\n/** Maximum query length allowed by Athena */\nconst MAX_QUERY_LENGTH = 262144;\n\n/**\n * Athena data provider\n */\nexport class AthenaProvider {\n private client: AthenaClient;\n private sdk: AthenaSDK;\n private workgroup: string;\n private database: string;\n private outputLocation?: string;\n\n /**\n * Initialize the Athena data provider\n *\n * @param client - AWS Athena client\n * @param sdk - AWS Athena SDK module (for accessing command classes)\n * @param workgroup - Athena workgroup to use\n * @param database - Default database/schema\n * @param outputLocation - Optional S3 output location\n */\n constructor(\n client: AthenaClient,\n sdk: AthenaSDK,\n workgroup: string,\n database: string,\n outputLocation?: string,\n ) {\n this.client = client;\n this.sdk = sdk;\n this.workgroup = workgroup;\n this.database = database;\n this.outputLocation = outputLocation;\n }\n\n /**\n * Query the Athena database\n *\n * @param sqlQuery - SQL query to execute\n * @param _params - Parameters to pass to the query (currently not used - Athena doesn't support parameterized queries)\n * @returns Promise resolving to array of row objects\n *\n * @remarks\n * **Security Note:** AWS Athena does not support parameterized queries.\n * Unlike traditional databases, there is no native way to use bind parameters\n * with Athena. Callers are responsible for properly sanitizing any user input\n * before constructing the SQL query string. This is a known limitation of the\n * Athena service, not a design flaw in this implementation.\n */\n async query(\n sqlQuery: string,\n _params: Record<string, unknown> = {},\n ): Promise<Array<Record<string, unknown>>> {\n if (sqlQuery.length > MAX_QUERY_LENGTH) {\n throw new Error(\"Query length exceeds the maximum allowed limit.\");\n }\n\n // Start query execution\n // Note: Athena does not support parameterized queries. The sqlQuery is passed\n // directly to Athena. Callers must sanitize user input before constructing queries.\n const startCommand = new this.sdk.StartQueryExecutionCommand({\n QueryString: sqlQuery,\n WorkGroup: this.workgroup,\n QueryExecutionContext: {\n Database: this.database,\n },\n ResultConfiguration: this.outputLocation\n ? { OutputLocation: this.outputLocation }\n : undefined,\n });\n\n const startResponse = await this.client.send(startCommand);\n const queryExecutionId = startResponse.QueryExecutionId;\n\n if (!queryExecutionId) {\n throw new QueryError(\"Failed to start query execution\");\n }\n\n // Wait for query to complete\n await this.waitForQueryCompletion(queryExecutionId, sqlQuery);\n\n // Fetch results\n return this.fetchAllResults(queryExecutionId);\n }\n\n /**\n * Wait for query to complete\n */\n private async waitForQueryCompletion(\n queryExecutionId: string,\n originalQuery: string,\n ): Promise<void> {\n const maxWaitTime = 300000; // 5 minutes\n const pollInterval = 1000; // 1 second\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n const command = new this.sdk.GetQueryExecutionCommand({\n QueryExecutionId: queryExecutionId,\n });\n const response = await this.client.send(command);\n const state = response.QueryExecution?.Status?.State;\n\n if (state === this.sdk.QueryExecutionState.SUCCEEDED) {\n return;\n }\n\n if (\n state === this.sdk.QueryExecutionState.FAILED ||\n state === this.sdk.QueryExecutionState.CANCELLED\n ) {\n const reason =\n response.QueryExecution?.Status?.StateChangeReason ?? \"Unknown error\";\n\n if (reason.includes(\"TABLE_NOT_FOUND\")) {\n const errorTail = reason.split(\":\").pop()?.trim() ?? \"\";\n throw new MissingTableError(\n \"Athena is unable to find the table. If the table is created by a \" +\n \"tetraflow, make sure that the tetraflow has run successfully. \" +\n errorTail +\n \".\",\n );\n }\n\n throw new QueryError(\n `Query failed: ${originalQuery}. Reason: ${reason}`,\n );\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new QueryError(\n `Query timed out after ${maxWaitTime / MILLISECONDS_PER_SECOND} seconds`,\n );\n }\n\n /**\n * Fetch all results from a completed query\n */\n private async fetchAllResults(\n queryExecutionId: string,\n ): Promise<Array<Record<string, unknown>>> {\n const results: Array<Record<string, unknown>> = [];\n let nextToken: string | undefined;\n let columnNames: string[] = [];\n let isFirstPage = true;\n\n do {\n const command = new this.sdk.GetQueryResultsCommand({\n QueryExecutionId: queryExecutionId,\n NextToken: nextToken,\n });\n\n const response = await this.client.send(command);\n\n if (isFirstPage && response.ResultSet?.ResultSetMetadata?.ColumnInfo) {\n columnNames = response.ResultSet.ResultSetMetadata.ColumnInfo.map(\n (col, idx) => {\n // Handle empty or missing column names by using a fallback\n const name = col.Name;\n return name && name.trim() !== \"\" ? name : `column_${idx}`;\n },\n );\n }\n\n const rows = response.ResultSet?.Rows ?? [];\n // Skip header row on first page\n const dataRows = isFirstPage ? rows.slice(1) : rows;\n\n for (const row of dataRows) {\n const rowData: Record<string, unknown> = {};\n row.Data?.forEach((cell, index) => {\n // columnNames already has fallback values, so we can use them directly\n const columnName = columnNames[index] ?? `column_${index}`;\n rowData[columnName] = cell.VarCharValue ?? null;\n });\n results.push(rowData);\n }\n\n nextToken = response.NextToken;\n isFirstPage = false;\n } while (nextToken);\n\n return results;\n }\n\n /**\n * Close the Athena client (no-op for AWS SDK clients)\n */\n async close(): Promise<void> {\n this.client.destroy();\n }\n}\n\n/**\n * Get the TDP Athena provider\n *\n * Creates an Athena provider using TDP environment configuration\n *\n * @returns Promise resolving to Athena data provider\n * @throws {InvalidProviderConfigurationError} If @aws-sdk/client-athena is not installed\n * @throws {Error} If ATHENA_S3_OUTPUT_LOCATION is not set when using the 'primary' workgroup\n */\nexport async function getTdpAthenaProvider(): Promise<AthenaProvider> {\n // Dynamically import @aws-sdk/client-athena\n const athenaSDK = await getAthenaSDK();\n\n const orgSlug = process.env.ORG_SLUG ?? \"\";\n const orgSlugDbFriendly = orgSlug.replace(/-/g, \"_\");\n const athenaQueryBucket = process.env.ATHENA_S3_OUTPUT_LOCATION;\n const athenaRegion = process.env.AWS_REGION;\n const athenaSchema = `${orgSlugDbFriendly}__tss__default`;\n const athenaWorkgroup = orgSlug;\n\n const client = new athenaSDK.AthenaClient({\n region: athenaRegion,\n });\n\n // Check if the org-specific workgroup exists\n try {\n await client.send(\n new athenaSDK.GetWorkGroupCommand({\n WorkGroup: athenaWorkgroup,\n }),\n );\n\n // Workgroup exists, use it\n return new AthenaProvider(client, athenaSDK, athenaWorkgroup, athenaSchema);\n } catch {\n // Workgroup doesn't exist or access denied, use 'primary' workgroup\n // The 'primary' workgroup requires an explicit output location\n if (!athenaQueryBucket) {\n throw new Error(\n \"ATHENA_S3_OUTPUT_LOCATION environment variable is required when using the 'primary' workgroup. \" +\n \"Either set this variable or ensure the org-specific workgroup exists.\",\n );\n }\n\n const athenaOutputLocation = `s3://${athenaQueryBucket}/${orgSlugDbFriendly}/`;\n return new AthenaProvider(\n client,\n athenaSDK,\n \"primary\",\n athenaSchema,\n athenaOutputLocation,\n );\n }\n}\n\n"],"names":["MILLISECONDS_PER_SECOND","getAthenaSDK","InvalidProviderConfigurationError","MAX_QUERY_LENGTH","AthenaProvider","client","sdk","workgroup","database","outputLocation","sqlQuery","_params","startCommand","queryExecutionId","QueryError","originalQuery","startTime","command","response","state","reason","errorTail","MissingTableError","resolve","results","nextToken","columnNames","isFirstPage","col","idx","name","rows","dataRows","row","rowData","cell","index","columnName","getTdpAthenaProvider","athenaSDK","orgSlug","orgSlugDbFriendly","athenaQueryBucket","athenaRegion","athenaSchema","athenaWorkgroup","athenaOutputLocation"],"mappings":"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"}
1
+ {"version":3,"file":"athena.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,2 +1,2 @@
1
- "use strict";var b=Object.create;var c=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var P=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of f(e))!y.call(t,i)&&i!==r&&c(t,i,{get:()=>e[i],enumerable:!(s=g(e,i))||s.enumerable});return t};var S=(t,e,r)=>(r=t!=null?b(w(t)):{},P(e||!t||!t.__esModule?c(r,"default",{value:t,enumerable:!0}):r,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../exceptions-DN25pCDi.cjs");async function _(){try{return await import("@databricks/sql")}catch{throw new o.InvalidProviderConfigurationError("The '@databricks/sql' package is required to use the Databricks provider. Please install it: npm install @databricks/sql")}}class l{client;session;constructor(e,r){this.client=e,this.session=r}async query(e,r={}){const s=await this.session.executeStatement(e);try{return await s.fetchAll()}finally{await s.close()}}async close(){await this.session.close(),await this.client.close()}}function m(){return`${(process.env.ORG_SLUG??"").replace(/-/g,"_")}__tss__default`}async function E(t){const{DBSQLClient:e}=await _(),r=["server_hostname","http_path","client_id","client_secret","catalog"];for(const n of r)if(!t.fields[n])throw new o.InvalidProviderConfigurationError(`Missing field '${n}' in the provider '${t.name}' to connect to Databricks.`);const s=t.fields.server_hostname,i=t.fields.http_path,d=t.fields.client_id,u=t.fields.client_secret,h=t.fields.catalog,v=t.fields.schema??m(),a=new e;await a.connect({host:s,path:i,authType:"databricks-oauth",oauthClientId:d,oauthClientSecret:u});const p=await a.openSession({initialCatalog:h,initialSchema:v});return new l(a,p)}exports.InvalidProviderConfigurationError=o.InvalidProviderConfigurationError;exports.MissingTableError=o.MissingTableError;exports.ProviderConnectionError=o.ProviderConnectionError;exports.ProviderError=o.ProviderError;exports.QueryError=o.QueryError;exports.DatabricksProvider=l;exports.buildDatabricksProvider=E;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../server/providers/DatabricksProvider.cjs"),r=require("../server/providers/exceptions.cjs");exports.DatabricksProvider=i.DatabricksProvider;exports.buildDatabricksProvider=i.buildDatabricksProvider;exports.InvalidProviderConfigurationError=r.InvalidProviderConfigurationError;exports.MissingTableError=r.MissingTableError;exports.ProviderConnectionError=r.ProviderConnectionError;exports.ProviderError=r.ProviderError;exports.QueryError=r.QueryError;
2
2
  //# sourceMappingURL=databricks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"databricks.cjs","sources":["../../src/server/providers/DatabricksProvider.ts"],"sourcesContent":["/**\n * Databricks Data Provider\n *\n * TypeScript equivalent of DatabricksProvider from\n * ts-lib-ui-kit-streamlit/tetrascience/data_app_providers/provider.py\n *\n * @remarks\n * This provider requires the `@databricks/sql` package to be installed.\n * It is an optional peer dependency - install it only if you need Databricks support:\n * ```bash\n * npm install @databricks/sql\n * # or\n * yarn add @databricks/sql\n * ```\n */\n\nimport { InvalidProviderConfigurationError } from \"./exceptions\";\n\nimport type { ProviderConfiguration } from \"./types\";\n\n// Type imports for @databricks/sql (these don't require the package at runtime)\ntype DBSQLClient = import(\"@databricks/sql\").DBSQLClient;\ntype IDBSQLSession = import(\"@databricks/sql/dist/contracts/IDBSQLSession\").default;\n\n/**\n * Dynamically import @databricks/sql\n * @throws {InvalidProviderConfigurationError} If @databricks/sql is not installed\n */\nasync function getDatabricksSQL(): Promise<typeof import(\"@databricks/sql\")> {\n try {\n return await import(\"@databricks/sql\");\n } catch {\n throw new InvalidProviderConfigurationError(\n \"The '@databricks/sql' package is required to use the Databricks provider. \" +\n \"Please install it: npm install @databricks/sql\",\n );\n }\n}\n\n/**\n * Databricks data provider\n */\nexport class DatabricksProvider {\n private client: DBSQLClient;\n private session: IDBSQLSession;\n\n /**\n * Initialize the Databricks data provider\n *\n * @param client - Databricks SQL client\n * @param session - Databricks SQL session\n */\n constructor(client: DBSQLClient, session: IDBSQLSession) {\n this.client = client;\n this.session = session;\n }\n\n /**\n * Query the Databricks database\n *\n * @param sqlQuery - SQL query to execute\n * @param _params - Parameters to pass to the query (currently not used)\n * @returns Promise resolving to array of row objects\n */\n async query(\n sqlQuery: string,\n _params: Record<string, unknown> = {},\n ): Promise<Array<Record<string, unknown>>> {\n const operation = await this.session.executeStatement(sqlQuery);\n try {\n const result = await operation.fetchAll();\n return result as Array<Record<string, unknown>>;\n } finally {\n // Always close the operation to avoid leaking server-side resources\n await operation.close();\n }\n }\n\n /**\n * Close the Databricks connection\n */\n async close(): Promise<void> {\n await this.session.close();\n await this.client.close();\n }\n}\n\n/**\n * Get the default Athena schema from environment\n */\nfunction getDefaultSchema(): string {\n const orgSlug = process.env.ORG_SLUG ?? \"\";\n const orgSlugDbFriendly = orgSlug.replace(/-/g, \"_\");\n return `${orgSlugDbFriendly}__tss__default`;\n}\n\n/**\n * Build a Databricks data provider from the configuration\n *\n * @param config - Provider configuration\n * @returns Promise resolving to Databricks data provider\n * @throws {InvalidProviderConfigurationError} If @databricks/sql is not installed or config is invalid\n */\nexport async function buildDatabricksProvider(\n config: ProviderConfiguration,\n): Promise<DatabricksProvider> {\n // Dynamically import @databricks/sql\n const { DBSQLClient } = await getDatabricksSQL();\n\n const requiredFields = [\n \"server_hostname\",\n \"http_path\",\n \"client_id\",\n \"client_secret\",\n \"catalog\",\n ] as const;\n\n for (const field of requiredFields) {\n if (!config.fields[field]) {\n throw new InvalidProviderConfigurationError(\n `Missing field '${field}' in the provider '${config.name}' to connect to Databricks.`,\n );\n }\n }\n\n const serverHostname = config.fields[\"server_hostname\"]!;\n const httpPath = config.fields[\"http_path\"]!;\n const clientId = config.fields[\"client_id\"]!;\n const clientSecret = config.fields[\"client_secret\"]!;\n const catalog = config.fields[\"catalog\"]!;\n const schema = config.fields[\"schema\"] ?? getDefaultSchema();\n\n const client = new DBSQLClient();\n\n await client.connect({\n host: serverHostname,\n path: httpPath,\n authType: \"databricks-oauth\",\n oauthClientId: clientId,\n oauthClientSecret: clientSecret,\n });\n\n const session = await client.openSession({\n initialCatalog: catalog,\n initialSchema: schema,\n });\n\n return new DatabricksProvider(client, session);\n}\n\n"],"names":["getDatabricksSQL","InvalidProviderConfigurationError","DatabricksProvider","client","session","sqlQuery","_params","operation","getDefaultSchema","buildDatabricksProvider","config","DBSQLClient","requiredFields","field","serverHostname","httpPath","clientId","clientSecret","catalog","schema"],"mappings":"ykBA4BA,eAAeA,GAA8D,CAC3E,GAAI,CACF,OAAO,KAAM,QAAO,iBAAiB,CACvC,MAAQ,CACN,MAAM,IAAIC,EAAAA,kCACR,0HAAA,CAGJ,CACF,CAKO,MAAMC,CAAmB,CACtB,OACA,QAQR,YAAYC,EAAqBC,EAAwB,CACvD,KAAK,OAASD,EACd,KAAK,QAAUC,CACjB,CASA,MAAM,MACJC,EACAC,EAAmC,GACM,CACzC,MAAMC,EAAY,MAAM,KAAK,QAAQ,iBAAiBF,CAAQ,EAC9D,GAAI,CAEF,OADe,MAAME,EAAU,SAAA,CAEjC,QAAA,CAEE,MAAMA,EAAU,MAAA,CAClB,CACF,CAKA,MAAM,OAAuB,CAC3B,MAAM,KAAK,QAAQ,MAAA,EACnB,MAAM,KAAK,OAAO,MAAA,CACpB,CACF,CAKA,SAASC,GAA2B,CAGlC,MAAO,IAFS,QAAQ,IAAI,UAAY,IACN,QAAQ,KAAM,GAAG,CACxB,gBAC7B,CASA,eAAsBC,EACpBC,EAC6B,CAE7B,KAAM,CAAE,YAAAC,GAAgB,MAAMX,EAAA,EAExBY,EAAiB,CACrB,kBACA,YACA,YACA,gBACA,SAAA,EAGF,UAAWC,KAASD,EAClB,GAAI,CAACF,EAAO,OAAOG,CAAK,EACtB,MAAM,IAAIZ,EAAAA,kCACR,kBAAkBY,CAAK,sBAAsBH,EAAO,IAAI,6BAAA,EAK9D,MAAMI,EAAiBJ,EAAO,OAAO,gBAC/BK,EAAWL,EAAO,OAAO,UACzBM,EAAWN,EAAO,OAAO,UACzBO,EAAeP,EAAO,OAAO,cAC7BQ,EAAUR,EAAO,OAAO,QACxBS,EAAST,EAAO,OAAO,QAAaF,EAAA,EAEpCL,EAAS,IAAIQ,EAEnB,MAAMR,EAAO,QAAQ,CACnB,KAAMW,EACN,KAAMC,EACN,SAAU,mBACV,cAAeC,EACf,kBAAmBC,CAAA,CACpB,EAED,MAAMb,EAAU,MAAMD,EAAO,YAAY,CACvC,eAAgBe,EAChB,cAAeC,CAAA,CAChB,EAED,OAAO,IAAIjB,EAAmBC,EAAQC,CAAO,CAC/C"}
1
+ {"version":3,"file":"databricks.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,85 +1,12 @@
1
- import { I as o } from "../exceptions-jCQ6h5C8.js";
2
- import { M as g, P as v, a as y, Q as k } from "../exceptions-jCQ6h5C8.js";
3
- async function p() {
4
- try {
5
- return await import("@databricks/sql");
6
- } catch {
7
- throw new o(
8
- "The '@databricks/sql' package is required to use the Databricks provider. Please install it: npm install @databricks/sql"
9
- );
10
- }
11
- }
12
- class f {
13
- client;
14
- session;
15
- /**
16
- * Initialize the Databricks data provider
17
- *
18
- * @param client - Databricks SQL client
19
- * @param session - Databricks SQL session
20
- */
21
- constructor(e, s) {
22
- this.client = e, this.session = s;
23
- }
24
- /**
25
- * Query the Databricks database
26
- *
27
- * @param sqlQuery - SQL query to execute
28
- * @param _params - Parameters to pass to the query (currently not used)
29
- * @returns Promise resolving to array of row objects
30
- */
31
- async query(e, s = {}) {
32
- const a = await this.session.executeStatement(e);
33
- try {
34
- return await a.fetchAll();
35
- } finally {
36
- await a.close();
37
- }
38
- }
39
- /**
40
- * Close the Databricks connection
41
- */
42
- async close() {
43
- await this.session.close(), await this.client.close();
44
- }
45
- }
46
- function m() {
47
- return `${(process.env.ORG_SLUG ?? "").replace(/-/g, "_")}__tss__default`;
48
- }
49
- async function _(t) {
50
- const { DBSQLClient: e } = await p(), s = [
51
- "server_hostname",
52
- "http_path",
53
- "client_id",
54
- "client_secret",
55
- "catalog"
56
- ];
57
- for (const n of s)
58
- if (!t.fields[n])
59
- throw new o(
60
- `Missing field '${n}' in the provider '${t.name}' to connect to Databricks.`
61
- );
62
- const a = t.fields.server_hostname, i = t.fields.http_path, c = t.fields.client_id, l = t.fields.client_secret, d = t.fields.catalog, h = t.fields.schema ?? m(), r = new e();
63
- await r.connect({
64
- host: a,
65
- path: i,
66
- authType: "databricks-oauth",
67
- oauthClientId: c,
68
- oauthClientSecret: l
69
- });
70
- const u = await r.openSession({
71
- initialCatalog: d,
72
- initialSchema: h
73
- });
74
- return new f(r, u);
75
- }
1
+ import { DatabricksProvider as i, buildDatabricksProvider as e } from "../server/providers/DatabricksProvider.js";
2
+ import { InvalidProviderConfigurationError as d, MissingTableError as n, ProviderConnectionError as t, ProviderError as v, QueryError as E } from "../server/providers/exceptions.js";
76
3
  export {
77
- f as DatabricksProvider,
78
- o as InvalidProviderConfigurationError,
79
- g as MissingTableError,
80
- v as ProviderConnectionError,
81
- y as ProviderError,
82
- k as QueryError,
83
- _ as buildDatabricksProvider
4
+ i as DatabricksProvider,
5
+ d as InvalidProviderConfigurationError,
6
+ n as MissingTableError,
7
+ t as ProviderConnectionError,
8
+ v as ProviderError,
9
+ E as QueryError,
10
+ e as buildDatabricksProvider
84
11
  };
85
12
  //# sourceMappingURL=databricks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"databricks.js","sources":["../../src/server/providers/DatabricksProvider.ts"],"sourcesContent":["/**\n * Databricks Data Provider\n *\n * TypeScript equivalent of DatabricksProvider from\n * ts-lib-ui-kit-streamlit/tetrascience/data_app_providers/provider.py\n *\n * @remarks\n * This provider requires the `@databricks/sql` package to be installed.\n * It is an optional peer dependency - install it only if you need Databricks support:\n * ```bash\n * npm install @databricks/sql\n * # or\n * yarn add @databricks/sql\n * ```\n */\n\nimport { InvalidProviderConfigurationError } from \"./exceptions\";\n\nimport type { ProviderConfiguration } from \"./types\";\n\n// Type imports for @databricks/sql (these don't require the package at runtime)\ntype DBSQLClient = import(\"@databricks/sql\").DBSQLClient;\ntype IDBSQLSession = import(\"@databricks/sql/dist/contracts/IDBSQLSession\").default;\n\n/**\n * Dynamically import @databricks/sql\n * @throws {InvalidProviderConfigurationError} If @databricks/sql is not installed\n */\nasync function getDatabricksSQL(): Promise<typeof import(\"@databricks/sql\")> {\n try {\n return await import(\"@databricks/sql\");\n } catch {\n throw new InvalidProviderConfigurationError(\n \"The '@databricks/sql' package is required to use the Databricks provider. \" +\n \"Please install it: npm install @databricks/sql\",\n );\n }\n}\n\n/**\n * Databricks data provider\n */\nexport class DatabricksProvider {\n private client: DBSQLClient;\n private session: IDBSQLSession;\n\n /**\n * Initialize the Databricks data provider\n *\n * @param client - Databricks SQL client\n * @param session - Databricks SQL session\n */\n constructor(client: DBSQLClient, session: IDBSQLSession) {\n this.client = client;\n this.session = session;\n }\n\n /**\n * Query the Databricks database\n *\n * @param sqlQuery - SQL query to execute\n * @param _params - Parameters to pass to the query (currently not used)\n * @returns Promise resolving to array of row objects\n */\n async query(\n sqlQuery: string,\n _params: Record<string, unknown> = {},\n ): Promise<Array<Record<string, unknown>>> {\n const operation = await this.session.executeStatement(sqlQuery);\n try {\n const result = await operation.fetchAll();\n return result as Array<Record<string, unknown>>;\n } finally {\n // Always close the operation to avoid leaking server-side resources\n await operation.close();\n }\n }\n\n /**\n * Close the Databricks connection\n */\n async close(): Promise<void> {\n await this.session.close();\n await this.client.close();\n }\n}\n\n/**\n * Get the default Athena schema from environment\n */\nfunction getDefaultSchema(): string {\n const orgSlug = process.env.ORG_SLUG ?? \"\";\n const orgSlugDbFriendly = orgSlug.replace(/-/g, \"_\");\n return `${orgSlugDbFriendly}__tss__default`;\n}\n\n/**\n * Build a Databricks data provider from the configuration\n *\n * @param config - Provider configuration\n * @returns Promise resolving to Databricks data provider\n * @throws {InvalidProviderConfigurationError} If @databricks/sql is not installed or config is invalid\n */\nexport async function buildDatabricksProvider(\n config: ProviderConfiguration,\n): Promise<DatabricksProvider> {\n // Dynamically import @databricks/sql\n const { DBSQLClient } = await getDatabricksSQL();\n\n const requiredFields = [\n \"server_hostname\",\n \"http_path\",\n \"client_id\",\n \"client_secret\",\n \"catalog\",\n ] as const;\n\n for (const field of requiredFields) {\n if (!config.fields[field]) {\n throw new InvalidProviderConfigurationError(\n `Missing field '${field}' in the provider '${config.name}' to connect to Databricks.`,\n );\n }\n }\n\n const serverHostname = config.fields[\"server_hostname\"]!;\n const httpPath = config.fields[\"http_path\"]!;\n const clientId = config.fields[\"client_id\"]!;\n const clientSecret = config.fields[\"client_secret\"]!;\n const catalog = config.fields[\"catalog\"]!;\n const schema = config.fields[\"schema\"] ?? getDefaultSchema();\n\n const client = new DBSQLClient();\n\n await client.connect({\n host: serverHostname,\n path: httpPath,\n authType: \"databricks-oauth\",\n oauthClientId: clientId,\n oauthClientSecret: clientSecret,\n });\n\n const session = await client.openSession({\n initialCatalog: catalog,\n initialSchema: schema,\n });\n\n return new DatabricksProvider(client, session);\n}\n\n"],"names":["getDatabricksSQL","InvalidProviderConfigurationError","DatabricksProvider","client","session","sqlQuery","_params","operation","getDefaultSchema","buildDatabricksProvider","config","DBSQLClient","requiredFields","field","serverHostname","httpPath","clientId","clientSecret","catalog","schema"],"mappings":";;AA4BA,eAAeA,IAA8D;AAC3E,MAAI;AACF,WAAO,MAAM,OAAO,iBAAiB;AAAA,EACvC,QAAQ;AACN,UAAM,IAAIC;AAAA,MACR;AAAA,IAAA;AAAA,EAGJ;AACF;AAKO,MAAMC,EAAmB;AAAA,EACtB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,YAAYC,GAAqBC,GAAwB;AACvD,SAAK,SAASD,GACd,KAAK,UAAUC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MACJC,GACAC,IAAmC,IACM;AACzC,UAAMC,IAAY,MAAM,KAAK,QAAQ,iBAAiBF,CAAQ;AAC9D,QAAI;AAEF,aADe,MAAME,EAAU,SAAA;AAAA,IAEjC,UAAA;AAEE,YAAMA,EAAU,MAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,KAAK,QAAQ,MAAA,GACnB,MAAM,KAAK,OAAO,MAAA;AAAA,EACpB;AACF;AAKA,SAASC,IAA2B;AAGlC,SAAO,IAFS,QAAQ,IAAI,YAAY,IACN,QAAQ,MAAM,GAAG,CACxB;AAC7B;AASA,eAAsBC,EACpBC,GAC6B;AAE7B,QAAM,EAAE,aAAAC,MAAgB,MAAMX,EAAA,GAExBY,IAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,aAAWC,KAASD;AAClB,QAAI,CAACF,EAAO,OAAOG,CAAK;AACtB,YAAM,IAAIZ;AAAA,QACR,kBAAkBY,CAAK,sBAAsBH,EAAO,IAAI;AAAA,MAAA;AAK9D,QAAMI,IAAiBJ,EAAO,OAAO,iBAC/BK,IAAWL,EAAO,OAAO,WACzBM,IAAWN,EAAO,OAAO,WACzBO,IAAeP,EAAO,OAAO,eAC7BQ,IAAUR,EAAO,OAAO,SACxBS,IAAST,EAAO,OAAO,UAAaF,EAAA,GAEpCL,IAAS,IAAIQ,EAAA;AAEnB,QAAMR,EAAO,QAAQ;AAAA,IACnB,MAAMW;AAAA,IACN,MAAMC;AAAA,IACN,UAAU;AAAA,IACV,eAAeC;AAAA,IACf,mBAAmBC;AAAA,EAAA,CACpB;AAED,QAAMb,IAAU,MAAMD,EAAO,YAAY;AAAA,IACvC,gBAAgBe;AAAA,IAChB,eAAeC;AAAA,EAAA,CAChB;AAED,SAAO,IAAIjB,EAAmBC,GAAQC,CAAO;AAC/C;"}
1
+ {"version":3,"file":"databricks.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.create;var u=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var k=(e,r,o,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of E(r))!h.call(e,n)&&n!==o&&u(e,n,{get:()=>r[n],enumerable:!(t=v(r,n))||t.enumerable});return e};var m=(e,r,o)=>(o=e!=null?f(P(e)):{},k(r||!e||!e.__esModule?u(o,"default",{value:e,enumerable:!0}):o,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../exceptions-DN25pCDi.cjs");async function S(){try{const e=await import("snowflake-sdk");return e.default||e}catch{throw new i.InvalidProviderConfigurationError("The 'snowflake-sdk' package is required to use the Snowflake provider. Please install it: npm install snowflake-sdk")}}class w{connection;constructor(r){this.connection=r}async query(r,o={}){const t=(Array.isArray(o),o);return new Promise((n,a)=>{this.connection.execute({sqlText:r,binds:t,complete:(c,d,s)=>{if(c){a(new i.QueryError(`Snowflake provider failed to query the database. Reason: ${c.message}`));return}n(s??[])}})})}async close(){return new Promise((r,o)=>{this.connection.destroy(t=>{if(t){o(t);return}r()})})}}async function y(e){const r=await S(),o=["user","password","account","warehouse","database","schema","role"];for(const n of o)if(!e.fields[n])throw new i.InvalidProviderConfigurationError(`Missing field '${n}' in the provider '${e.name}' to connect to Snowflake using password based authentication.`);const t={account:e.fields.account,username:e.fields.user,password:e.fields.password,warehouse:e.fields.warehouse,database:e.fields.database,schema:e.fields.schema,role:e.fields.role};return new Promise((n,a)=>{r.createConnection(t).connect((d,s)=>{if(d){a(new i.ProviderConnectionError(`Unable to connect to Snowflake. Reason: ${d.message}`));return}s.execute({sqlText:"ALTER SESSION SET TIMEZONE = 'UTC'",complete:l=>{l&&console.warn(`Warning: Failed to set timezone to UTC: ${l.message}`),n(new w(s))}})})})}exports.InvalidProviderConfigurationError=i.InvalidProviderConfigurationError;exports.MissingTableError=i.MissingTableError;exports.ProviderConnectionError=i.ProviderConnectionError;exports.ProviderError=i.ProviderError;exports.QueryError=i.QueryError;exports.SnowflakeProvider=w;exports.buildSnowflakeProvider=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../server/providers/SnowflakeProvider.cjs"),r=require("../server/providers/exceptions.cjs");exports.SnowflakeProvider=o.SnowflakeProvider;exports.buildSnowflakeProvider=o.buildSnowflakeProvider;exports.InvalidProviderConfigurationError=r.InvalidProviderConfigurationError;exports.MissingTableError=r.MissingTableError;exports.ProviderConnectionError=r.ProviderConnectionError;exports.ProviderError=r.ProviderError;exports.QueryError=r.QueryError;
2
2
  //# sourceMappingURL=snowflake.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"snowflake.cjs","sources":["../../src/server/providers/SnowflakeProvider.ts"],"sourcesContent":["/**\n * Snowflake Data Provider\n *\n * TypeScript equivalent of SnowflakeProvider from\n * ts-lib-ui-kit-streamlit/tetrascience/data_app_providers/provider.py\n *\n * @remarks\n * This provider requires the `snowflake-sdk` package to be installed.\n * It is an optional peer dependency - install it only if you need Snowflake support:\n * ```bash\n * npm install snowflake-sdk\n * # or\n * yarn add snowflake-sdk\n * ```\n */\n\nimport {\n QueryError,\n ProviderConnectionError,\n InvalidProviderConfigurationError,\n} from \"./exceptions\";\n\nimport type { ProviderConfiguration } from \"./types\";\n\n// Type imports for snowflake-sdk (these don't require the package at runtime)\ntype SnowflakeSDK = typeof import(\"snowflake-sdk\");\ntype SnowflakeConnection = import(\"snowflake-sdk\").Connection;\ntype SnowflakeBinds = import(\"snowflake-sdk\").Binds;\ntype SnowflakeError = import(\"snowflake-sdk\").SnowflakeError;\ntype SnowflakeConnectionOptions = import(\"snowflake-sdk\").ConnectionOptions;\ntype SnowflakeRowStatement = import(\"snowflake-sdk\").RowStatement;\ntype SnowflakeFileAndStageBindStatement =\n import(\"snowflake-sdk\").FileAndStageBindStatement;\n\n/**\n * Dynamically import snowflake-sdk\n * @throws {InvalidProviderConfigurationError} If snowflake-sdk is not installed\n */\nasync function getSnowflakeSDK(): Promise<SnowflakeSDK> {\n try {\n const snowflake = await import(\"snowflake-sdk\");\n return snowflake.default || snowflake;\n } catch {\n throw new InvalidProviderConfigurationError(\n \"The 'snowflake-sdk' package is required to use the Snowflake provider. \" +\n \"Please install it: npm install snowflake-sdk\",\n );\n }\n}\n\n/**\n * Snowflake data provider\n */\nexport class SnowflakeProvider {\n private connection: SnowflakeConnection;\n\n /**\n * Initialize the Snowflake data provider\n *\n * @param connection - Snowflake connection\n */\n constructor(connection: SnowflakeConnection) {\n this.connection = connection;\n }\n\n /**\n * Query the Snowflake database\n *\n * @param sqlText - SQL query to execute\n * @param params - Parameters to pass to the query. For positional binds, use an array.\n * For named binds, use an object with keys matching the bind variable names.\n * @returns Promise resolving to array of row objects\n */\n async query(\n sqlText: string,\n params: Record<string, unknown> | unknown[] = {},\n ): Promise<Array<Record<string, unknown>>> {\n // Snowflake SDK supports both positional binds (array) and named binds (object)\n // Pass params directly to preserve named bind semantics\n const binds = Array.isArray(params)\n ? (params as unknown as SnowflakeBinds)\n : (params as unknown as SnowflakeBinds);\n\n return new Promise((resolve, reject) => {\n this.connection.execute({\n sqlText,\n binds,\n complete: (\n err: SnowflakeError | undefined,\n _stmt: SnowflakeRowStatement | SnowflakeFileAndStageBindStatement,\n rows?: Array<Record<string, unknown>>,\n ) => {\n if (err) {\n reject(\n new QueryError(\n `Snowflake provider failed to query the database. Reason: ${err.message}`,\n ),\n );\n return;\n }\n resolve(rows ?? []);\n },\n });\n });\n }\n\n /**\n * Close the Snowflake connection\n */\n async close(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.connection.destroy((err: SnowflakeError | undefined) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n });\n }\n}\n\n/**\n * Build a Snowflake data provider from the configuration\n *\n * @param config - Provider configuration\n * @returns Promise resolving to Snowflake data provider\n * @throws {InvalidProviderConfigurationError} If snowflake-sdk is not installed or config is invalid\n */\nexport async function buildSnowflakeProvider(\n config: ProviderConfiguration,\n): Promise<SnowflakeProvider> {\n // Dynamically import snowflake-sdk\n const snowflake = await getSnowflakeSDK();\n\n const requiredFields = [\n \"user\",\n \"password\",\n \"account\",\n \"warehouse\",\n \"database\",\n \"schema\",\n \"role\",\n ] as const;\n\n for (const field of requiredFields) {\n if (!config.fields[field]) {\n throw new InvalidProviderConfigurationError(\n `Missing field '${field}' in the provider '${config.name}' to connect to Snowflake ` +\n \"using password based authentication.\",\n );\n }\n }\n\n const connectionOptions: SnowflakeConnectionOptions = {\n account: config.fields[\"account\"]!,\n username: config.fields[\"user\"]!,\n password: config.fields[\"password\"]!,\n warehouse: config.fields[\"warehouse\"]!,\n database: config.fields[\"database\"]!,\n schema: config.fields[\"schema\"]!,\n role: config.fields[\"role\"]!,\n };\n\n return new Promise((resolve, reject) => {\n const connection = snowflake.createConnection(connectionOptions);\n\n connection.connect(\n (err: SnowflakeError | undefined, conn: SnowflakeConnection) => {\n if (err) {\n reject(\n new ProviderConnectionError(\n `Unable to connect to Snowflake. Reason: ${err.message}`,\n ),\n );\n return;\n }\n\n // Set timezone to UTC after connection.\n // The default timezone is America/Los_Angeles. Timestamps from delta tables will be\n // returned with the timezone `timezone`. NOTE, this is not a timezone conversion.\n // The timezone is replaced without translating the clock time. `timezone` is set UTC\n // to match the timezone of delta table timestamps.\n conn.execute({\n sqlText: \"ALTER SESSION SET TIMEZONE = 'UTC'\",\n complete: (tzErr: SnowflakeError | undefined) => {\n if (tzErr) {\n // Log warning but don't fail - timezone setting is not critical\n console.warn(\n `Warning: Failed to set timezone to UTC: ${tzErr.message}`,\n );\n }\n resolve(new SnowflakeProvider(conn));\n },\n });\n },\n );\n });\n}\n\n"],"names":["getSnowflakeSDK","snowflake","InvalidProviderConfigurationError","SnowflakeProvider","connection","sqlText","params","binds","resolve","reject","err","_stmt","rows","QueryError","buildSnowflakeProvider","config","requiredFields","field","connectionOptions","conn","ProviderConnectionError","tzErr"],"mappings":"ykBAsCA,eAAeA,GAAyC,CACtD,GAAI,CACF,MAAMC,EAAY,KAAM,QAAO,eAAe,EAC9C,OAAOA,EAAU,SAAWA,CAC9B,MAAQ,CACN,MAAM,IAAIC,EAAAA,kCACR,qHAAA,CAGJ,CACF,CAKO,MAAMC,CAAkB,CACrB,WAOR,YAAYC,EAAiC,CAC3C,KAAK,WAAaA,CACpB,CAUA,MAAM,MACJC,EACAC,EAA8C,GACL,CAGzC,MAAMC,GAAQ,MAAM,QAAQD,CAAM,EAC7BA,GAGL,OAAO,IAAI,QAAQ,CAACE,EAASC,IAAW,CACtC,KAAK,WAAW,QAAQ,CACtB,QAAAJ,EACA,MAAAE,EACA,SAAU,CACRG,EACAC,EACAC,IACG,CACH,GAAIF,EAAK,CACPD,EACE,IAAII,EAAAA,WACF,4DAA4DH,EAAI,OAAO,EAAA,CACzE,EAEF,MACF,CACAF,EAAQI,GAAQ,EAAE,CACpB,CAAA,CACD,CACH,CAAC,CACH,CAKA,MAAM,OAAuB,CAC3B,OAAO,IAAI,QAAQ,CAACJ,EAASC,IAAW,CACtC,KAAK,WAAW,QAASC,GAAoC,CAC3D,GAAIA,EAAK,CACPD,EAAOC,CAAG,EACV,MACF,CACAF,EAAA,CACF,CAAC,CACH,CAAC,CACH,CACF,CASA,eAAsBM,EACpBC,EAC4B,CAE5B,MAAMd,EAAY,MAAMD,EAAA,EAElBgB,EAAiB,CACrB,OACA,WACA,UACA,YACA,WACA,SACA,MAAA,EAGF,UAAWC,KAASD,EAClB,GAAI,CAACD,EAAO,OAAOE,CAAK,EACtB,MAAM,IAAIf,EAAAA,kCACR,kBAAkBe,CAAK,sBAAsBF,EAAO,IAAI,gEAAA,EAM9D,MAAMG,EAAgD,CACpD,QAASH,EAAO,OAAO,QACvB,SAAUA,EAAO,OAAO,KACxB,SAAUA,EAAO,OAAO,SACxB,UAAWA,EAAO,OAAO,UACzB,SAAUA,EAAO,OAAO,SACxB,OAAQA,EAAO,OAAO,OACtB,KAAMA,EAAO,OAAO,IAAM,EAG5B,OAAO,IAAI,QAAQ,CAACP,EAASC,IAAW,CACnBR,EAAU,iBAAiBiB,CAAiB,EAEpD,QACT,CAACR,EAAiCS,IAA8B,CAC9D,GAAIT,EAAK,CACPD,EACE,IAAIW,EAAAA,wBACF,2CAA2CV,EAAI,OAAO,EAAA,CACxD,EAEF,MACF,CAOAS,EAAK,QAAQ,CACX,QAAS,qCACT,SAAWE,GAAsC,CAC3CA,GAEF,QAAQ,KACN,2CAA2CA,EAAM,OAAO,EAAA,EAG5Db,EAAQ,IAAIL,EAAkBgB,CAAI,CAAC,CACrC,CAAA,CACD,CACH,CAAA,CAEJ,CAAC,CACH"}
1
+ {"version":3,"file":"snowflake.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,122 +1,12 @@
1
- import { Q as u, I as d, P as w } from "../exceptions-jCQ6h5C8.js";
2
- import { M as y, a as P } from "../exceptions-jCQ6h5C8.js";
3
- async function f() {
4
- try {
5
- const e = await import("snowflake-sdk");
6
- return e.default || e;
7
- } catch {
8
- throw new d(
9
- "The 'snowflake-sdk' package is required to use the Snowflake provider. Please install it: npm install snowflake-sdk"
10
- );
11
- }
12
- }
13
- class m {
14
- connection;
15
- /**
16
- * Initialize the Snowflake data provider
17
- *
18
- * @param connection - Snowflake connection
19
- */
20
- constructor(o) {
21
- this.connection = o;
22
- }
23
- /**
24
- * Query the Snowflake database
25
- *
26
- * @param sqlText - SQL query to execute
27
- * @param params - Parameters to pass to the query. For positional binds, use an array.
28
- * For named binds, use an object with keys matching the bind variable names.
29
- * @returns Promise resolving to array of row objects
30
- */
31
- async query(o, n = {}) {
32
- const s = (Array.isArray(n), n);
33
- return new Promise((t, a) => {
34
- this.connection.execute({
35
- sqlText: o,
36
- binds: s,
37
- complete: (i, c, r) => {
38
- if (i) {
39
- a(
40
- new u(
41
- `Snowflake provider failed to query the database. Reason: ${i.message}`
42
- )
43
- );
44
- return;
45
- }
46
- t(r ?? []);
47
- }
48
- });
49
- });
50
- }
51
- /**
52
- * Close the Snowflake connection
53
- */
54
- async close() {
55
- return new Promise((o, n) => {
56
- this.connection.destroy((s) => {
57
- if (s) {
58
- n(s);
59
- return;
60
- }
61
- o();
62
- });
63
- });
64
- }
65
- }
66
- async function k(e) {
67
- const o = await f(), n = [
68
- "user",
69
- "password",
70
- "account",
71
- "warehouse",
72
- "database",
73
- "schema",
74
- "role"
75
- ];
76
- for (const t of n)
77
- if (!e.fields[t])
78
- throw new d(
79
- `Missing field '${t}' in the provider '${e.name}' to connect to Snowflake using password based authentication.`
80
- );
81
- const s = {
82
- account: e.fields.account,
83
- username: e.fields.user,
84
- password: e.fields.password,
85
- warehouse: e.fields.warehouse,
86
- database: e.fields.database,
87
- schema: e.fields.schema,
88
- role: e.fields.role
89
- };
90
- return new Promise((t, a) => {
91
- o.createConnection(s).connect(
92
- (c, r) => {
93
- if (c) {
94
- a(
95
- new w(
96
- `Unable to connect to Snowflake. Reason: ${c.message}`
97
- )
98
- );
99
- return;
100
- }
101
- r.execute({
102
- sqlText: "ALTER SESSION SET TIMEZONE = 'UTC'",
103
- complete: (l) => {
104
- l && console.warn(
105
- `Warning: Failed to set timezone to UTC: ${l.message}`
106
- ), t(new m(r));
107
- }
108
- });
109
- }
110
- );
111
- });
112
- }
1
+ import { SnowflakeProvider as e, buildSnowflakeProvider as i } from "../server/providers/SnowflakeProvider.js";
2
+ import { InvalidProviderConfigurationError as d, MissingTableError as v, ProviderConnectionError as a, ProviderError as f, QueryError as l } from "../server/providers/exceptions.js";
113
3
  export {
114
4
  d as InvalidProviderConfigurationError,
115
- y as MissingTableError,
116
- w as ProviderConnectionError,
117
- P as ProviderError,
118
- u as QueryError,
119
- m as SnowflakeProvider,
120
- k as buildSnowflakeProvider
5
+ v as MissingTableError,
6
+ a as ProviderConnectionError,
7
+ f as ProviderError,
8
+ l as QueryError,
9
+ e as SnowflakeProvider,
10
+ i as buildSnowflakeProvider
121
11
  };
122
12
  //# sourceMappingURL=snowflake.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"snowflake.js","sources":["../../src/server/providers/SnowflakeProvider.ts"],"sourcesContent":["/**\n * Snowflake Data Provider\n *\n * TypeScript equivalent of SnowflakeProvider from\n * ts-lib-ui-kit-streamlit/tetrascience/data_app_providers/provider.py\n *\n * @remarks\n * This provider requires the `snowflake-sdk` package to be installed.\n * It is an optional peer dependency - install it only if you need Snowflake support:\n * ```bash\n * npm install snowflake-sdk\n * # or\n * yarn add snowflake-sdk\n * ```\n */\n\nimport {\n QueryError,\n ProviderConnectionError,\n InvalidProviderConfigurationError,\n} from \"./exceptions\";\n\nimport type { ProviderConfiguration } from \"./types\";\n\n// Type imports for snowflake-sdk (these don't require the package at runtime)\ntype SnowflakeSDK = typeof import(\"snowflake-sdk\");\ntype SnowflakeConnection = import(\"snowflake-sdk\").Connection;\ntype SnowflakeBinds = import(\"snowflake-sdk\").Binds;\ntype SnowflakeError = import(\"snowflake-sdk\").SnowflakeError;\ntype SnowflakeConnectionOptions = import(\"snowflake-sdk\").ConnectionOptions;\ntype SnowflakeRowStatement = import(\"snowflake-sdk\").RowStatement;\ntype SnowflakeFileAndStageBindStatement =\n import(\"snowflake-sdk\").FileAndStageBindStatement;\n\n/**\n * Dynamically import snowflake-sdk\n * @throws {InvalidProviderConfigurationError} If snowflake-sdk is not installed\n */\nasync function getSnowflakeSDK(): Promise<SnowflakeSDK> {\n try {\n const snowflake = await import(\"snowflake-sdk\");\n return snowflake.default || snowflake;\n } catch {\n throw new InvalidProviderConfigurationError(\n \"The 'snowflake-sdk' package is required to use the Snowflake provider. \" +\n \"Please install it: npm install snowflake-sdk\",\n );\n }\n}\n\n/**\n * Snowflake data provider\n */\nexport class SnowflakeProvider {\n private connection: SnowflakeConnection;\n\n /**\n * Initialize the Snowflake data provider\n *\n * @param connection - Snowflake connection\n */\n constructor(connection: SnowflakeConnection) {\n this.connection = connection;\n }\n\n /**\n * Query the Snowflake database\n *\n * @param sqlText - SQL query to execute\n * @param params - Parameters to pass to the query. For positional binds, use an array.\n * For named binds, use an object with keys matching the bind variable names.\n * @returns Promise resolving to array of row objects\n */\n async query(\n sqlText: string,\n params: Record<string, unknown> | unknown[] = {},\n ): Promise<Array<Record<string, unknown>>> {\n // Snowflake SDK supports both positional binds (array) and named binds (object)\n // Pass params directly to preserve named bind semantics\n const binds = Array.isArray(params)\n ? (params as unknown as SnowflakeBinds)\n : (params as unknown as SnowflakeBinds);\n\n return new Promise((resolve, reject) => {\n this.connection.execute({\n sqlText,\n binds,\n complete: (\n err: SnowflakeError | undefined,\n _stmt: SnowflakeRowStatement | SnowflakeFileAndStageBindStatement,\n rows?: Array<Record<string, unknown>>,\n ) => {\n if (err) {\n reject(\n new QueryError(\n `Snowflake provider failed to query the database. Reason: ${err.message}`,\n ),\n );\n return;\n }\n resolve(rows ?? []);\n },\n });\n });\n }\n\n /**\n * Close the Snowflake connection\n */\n async close(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.connection.destroy((err: SnowflakeError | undefined) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n });\n }\n}\n\n/**\n * Build a Snowflake data provider from the configuration\n *\n * @param config - Provider configuration\n * @returns Promise resolving to Snowflake data provider\n * @throws {InvalidProviderConfigurationError} If snowflake-sdk is not installed or config is invalid\n */\nexport async function buildSnowflakeProvider(\n config: ProviderConfiguration,\n): Promise<SnowflakeProvider> {\n // Dynamically import snowflake-sdk\n const snowflake = await getSnowflakeSDK();\n\n const requiredFields = [\n \"user\",\n \"password\",\n \"account\",\n \"warehouse\",\n \"database\",\n \"schema\",\n \"role\",\n ] as const;\n\n for (const field of requiredFields) {\n if (!config.fields[field]) {\n throw new InvalidProviderConfigurationError(\n `Missing field '${field}' in the provider '${config.name}' to connect to Snowflake ` +\n \"using password based authentication.\",\n );\n }\n }\n\n const connectionOptions: SnowflakeConnectionOptions = {\n account: config.fields[\"account\"]!,\n username: config.fields[\"user\"]!,\n password: config.fields[\"password\"]!,\n warehouse: config.fields[\"warehouse\"]!,\n database: config.fields[\"database\"]!,\n schema: config.fields[\"schema\"]!,\n role: config.fields[\"role\"]!,\n };\n\n return new Promise((resolve, reject) => {\n const connection = snowflake.createConnection(connectionOptions);\n\n connection.connect(\n (err: SnowflakeError | undefined, conn: SnowflakeConnection) => {\n if (err) {\n reject(\n new ProviderConnectionError(\n `Unable to connect to Snowflake. Reason: ${err.message}`,\n ),\n );\n return;\n }\n\n // Set timezone to UTC after connection.\n // The default timezone is America/Los_Angeles. Timestamps from delta tables will be\n // returned with the timezone `timezone`. NOTE, this is not a timezone conversion.\n // The timezone is replaced without translating the clock time. `timezone` is set UTC\n // to match the timezone of delta table timestamps.\n conn.execute({\n sqlText: \"ALTER SESSION SET TIMEZONE = 'UTC'\",\n complete: (tzErr: SnowflakeError | undefined) => {\n if (tzErr) {\n // Log warning but don't fail - timezone setting is not critical\n console.warn(\n `Warning: Failed to set timezone to UTC: ${tzErr.message}`,\n );\n }\n resolve(new SnowflakeProvider(conn));\n },\n });\n },\n );\n });\n}\n\n"],"names":["getSnowflakeSDK","snowflake","InvalidProviderConfigurationError","SnowflakeProvider","connection","sqlText","params","binds","resolve","reject","err","_stmt","rows","QueryError","buildSnowflakeProvider","config","requiredFields","field","connectionOptions","conn","ProviderConnectionError","tzErr"],"mappings":";;AAsCA,eAAeA,IAAyC;AACtD,MAAI;AACF,UAAMC,IAAY,MAAM,OAAO,eAAe;AAC9C,WAAOA,EAAU,WAAWA;AAAA,EAC9B,QAAQ;AACN,UAAM,IAAIC;AAAA,MACR;AAAA,IAAA;AAAA,EAGJ;AACF;AAKO,MAAMC,EAAkB;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOR,YAAYC,GAAiC;AAC3C,SAAK,aAAaA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MACJC,GACAC,IAA8C,IACL;AAGzC,UAAMC,KAAQ,MAAM,QAAQD,CAAM,GAC7BA;AAGL,WAAO,IAAI,QAAQ,CAACE,GAASC,MAAW;AACtC,WAAK,WAAW,QAAQ;AAAA,QACtB,SAAAJ;AAAA,QACA,OAAAE;AAAA,QACA,UAAU,CACRG,GACAC,GACAC,MACG;AACH,cAAIF,GAAK;AACP,YAAAD;AAAA,cACE,IAAII;AAAA,gBACF,4DAA4DH,EAAI,OAAO;AAAA,cAAA;AAAA,YACzE;AAEF;AAAA,UACF;AACA,UAAAF,EAAQI,KAAQ,EAAE;AAAA,QACpB;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,WAAO,IAAI,QAAQ,CAACJ,GAASC,MAAW;AACtC,WAAK,WAAW,QAAQ,CAACC,MAAoC;AAC3D,YAAIA,GAAK;AACP,UAAAD,EAAOC,CAAG;AACV;AAAA,QACF;AACA,QAAAF,EAAA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AASA,eAAsBM,EACpBC,GAC4B;AAE5B,QAAMd,IAAY,MAAMD,EAAA,GAElBgB,IAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,aAAWC,KAASD;AAClB,QAAI,CAACD,EAAO,OAAOE,CAAK;AACtB,YAAM,IAAIf;AAAA,QACR,kBAAkBe,CAAK,sBAAsBF,EAAO,IAAI;AAAA,MAAA;AAM9D,QAAMG,IAAgD;AAAA,IACpD,SAASH,EAAO,OAAO;AAAA,IACvB,UAAUA,EAAO,OAAO;AAAA,IACxB,UAAUA,EAAO,OAAO;AAAA,IACxB,WAAWA,EAAO,OAAO;AAAA,IACzB,UAAUA,EAAO,OAAO;AAAA,IACxB,QAAQA,EAAO,OAAO;AAAA,IACtB,MAAMA,EAAO,OAAO;AAAA,EAAM;AAG5B,SAAO,IAAI,QAAQ,CAACP,GAASC,MAAW;AAGtC,IAFmBR,EAAU,iBAAiBiB,CAAiB,EAEpD;AAAA,MACT,CAACR,GAAiCS,MAA8B;AAC9D,YAAIT,GAAK;AACP,UAAAD;AAAA,YACE,IAAIW;AAAA,cACF,2CAA2CV,EAAI,OAAO;AAAA,YAAA;AAAA,UACxD;AAEF;AAAA,QACF;AAOA,QAAAS,EAAK,QAAQ;AAAA,UACX,SAAS;AAAA,UACT,UAAU,CAACE,MAAsC;AAC/C,YAAIA,KAEF,QAAQ;AAAA,cACN,2CAA2CA,EAAM,OAAO;AAAA,YAAA,GAG5Db,EAAQ,IAAIL,EAAkBgB,CAAI,CAAC;AAAA,UACrC;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;"}
1
+ {"version":3,"file":"snowflake.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("@tetrascience-npm/ts-connectors-sdk"),c=60,s=1e3,l=5*c*s;class i{baseUrlOverride;connectorId;orgSlug;tokenCache;tokenRefreshThresholdMs;tdpClient;constructor(e={}){this.baseUrlOverride=e.baseUrl,this.connectorId=process.env.CONNECTOR_ID,this.orgSlug=process.env.ORG_SLUG,this.tokenCache=new Map,this.tokenRefreshThresholdMs=e.tokenRefreshThresholdMs||l,this.tdpClient=null}getBaseUrl(){const e=this.baseUrlOverride||process.env.TDP_ENDPOINT;if(!e)throw new Error("TDP base URL not configured. Set TDP_ENDPOINT environment variable or pass baseUrl in config.");return e}decodeJwtPayload(e){try{const t=e.split(".");if(t.length!==3)return console.warn("Invalid JWT token format"),null;const n=t[1].replace(/-/g,"+").replace(/_/g,"/"),o=n.padEnd(n.length+(4-n.length%4)%4,"=");return JSON.parse(Buffer.from(o,"base64").toString("utf-8"))}catch(t){return console.warn("Error decoding JWT token:",t),null}}isPayloadExpiringSoon(e){if(!e.exp)return console.warn("JWT token has no expiration claim"),!0;const t=e.exp*s,r=Date.now()+this.tokenRefreshThresholdMs;return t<=r}getValidUserJwt(e){const t=this.tokenCache.get(e);return t&&!this.isPayloadExpiringSoon(t.payload)?t.token:(t&&this.tokenCache.delete(e),null)}async getTdpClient(){if(this.tdpClient!==null)return this.tdpClient;if(!this.connectorId||!this.orgSlug)throw new Error("Missing required configuration: CONNECTOR_ID or ORG_SLUG");const e=this.getBaseUrl();try{const t=new a.TDPClient({tdpEndpoint:e,connectorId:this.connectorId,orgSlug:this.orgSlug,artifactType:"data-app"});return await t.init(),this.tdpClient=t,this.tdpClient}catch(t){throw console.error("Failed to initialize TDP client:",t),t}}async getJwtFromTokenRefInternal(e){const t=await this.getTdpClient();try{const r=await t.getValues([e]);if(r&&r.length>0&&r[0]?.jwt){const n=r[0].jwt,o=this.decodeJwtPayload(n);return o&&this.tokenCache.set(e,{token:n,payload:o}),n}console.error(`No JWT found for key '${e}' in connector store`)}catch(r){console.error("Error retrieving JWT token:",r)}return null}async getJwtFromTokenRef(e){if(!e||!this.orgSlug)return console.warn("Missing required parameters for JWT token retrieval"),null;const t=this.getValidUserJwt(e);return t||this.getJwtFromTokenRefInternal(e)}async getUserToken(e){const t=e["ts-auth-token"]||process.env.TS_AUTH_TOKEN;if(t)return t;const r=e["ts-token-ref"];if(r&&this.connectorId){const n=await this.getJwtFromTokenRef(r);if(n)return n;console.warn("Failed to resolve ts-token-ref to JWT token")}else r&&console.error("Connector ID not configured");return console.warn("No valid authentication token found"),null}async getTokenFromExpressRequest(e){return this.getUserToken(e.cookies||{})}clearCache(){this.tokenCache.clear()}}const h=new i;exports.JwtTokenManager=i;exports.jwtManager=h;
2
+ //# sourceMappingURL=JwtTokenManager.cjs.map