@finos/legend-cube-builder 0.0.0-stage → 0.0.3

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 (379) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +64 -2
  3. package/docs/adding-an-operation.md +92 -0
  4. package/docs/hosting.md +79 -0
  5. package/docs/testing.md +83 -0
  6. package/lib/__lib__/LegendCubeCommand.d.ts +26 -0
  7. package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -0
  8. package/lib/__lib__/LegendCubeCommand.js +40 -0
  9. package/lib/__lib__/LegendCubeCommand.js.map +1 -0
  10. package/lib/__lib__/LegendCubeHelpText.d.ts +19 -0
  11. package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -0
  12. package/lib/__lib__/LegendCubeHelpText.js +35 -0
  13. package/lib/__lib__/LegendCubeHelpText.js.map +1 -0
  14. package/lib/__lib__/LegendCubeLabels.d.ts +87 -0
  15. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -0
  16. package/lib/__lib__/LegendCubeLabels.js +128 -0
  17. package/lib/__lib__/LegendCubeLabels.js.map +1 -0
  18. package/lib/__lib__/LegendCubeTesting.d.ts +33 -0
  19. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -0
  20. package/lib/__lib__/LegendCubeTesting.js +34 -0
  21. package/lib/__lib__/LegendCubeTesting.js.map +1 -0
  22. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts +24 -0
  23. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -0
  24. package/lib/__test-utils__/CubeCanvasTestUtils.js +37 -0
  25. package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -0
  26. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +47 -0
  27. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -0
  28. package/lib/__test-utils__/CubeEngineTestSupport.js +106 -0
  29. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -0
  30. package/lib/__test-utils__/CubeNorthwindTestQueries.d.ts +31 -0
  31. package/lib/__test-utils__/CubeNorthwindTestQueries.d.ts.map +1 -0
  32. package/lib/__test-utils__/CubeNorthwindTestQueries.js +102 -0
  33. package/lib/__test-utils__/CubeNorthwindTestQueries.js.map +1 -0
  34. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts +42 -0
  35. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts.map +1 -0
  36. package/lib/__test-utils__/CubeOperationsTestUtils.js +92 -0
  37. package/lib/__test-utils__/CubeOperationsTestUtils.js.map +1 -0
  38. package/lib/__test-utils__/CubePageTestUtils.d.ts +33 -0
  39. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -0
  40. package/lib/__test-utils__/CubePageTestUtils.js +68 -0
  41. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -0
  42. package/lib/__test-utils__/CubeTestApplication.d.ts +30 -0
  43. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -0
  44. package/lib/__test-utils__/CubeTestApplication.js +57 -0
  45. package/lib/__test-utils__/CubeTestApplication.js.map +1 -0
  46. package/lib/__test-utils__/FakeCubeEngine.d.ts +41 -0
  47. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -0
  48. package/lib/__test-utils__/FakeCubeEngine.js +91 -0
  49. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -0
  50. package/lib/components/CubeButton.d.ts +20 -0
  51. package/lib/components/CubeButton.d.ts.map +1 -0
  52. package/lib/components/CubeButton.js +24 -0
  53. package/lib/components/CubeButton.js.map +1 -0
  54. package/lib/components/CubeEditor.d.ts +31 -0
  55. package/lib/components/CubeEditor.d.ts.map +1 -0
  56. package/lib/components/CubeEditor.js +90 -0
  57. package/lib/components/CubeEditor.js.map +1 -0
  58. package/lib/components/CubeNodeIcon.d.ts +23 -0
  59. package/lib/components/CubeNodeIcon.d.ts.map +1 -0
  60. package/lib/components/CubeNodeIcon.js +42 -0
  61. package/lib/components/CubeNodeIcon.js.map +1 -0
  62. package/lib/components/canvas/CubeCanvas.d.ts +37 -0
  63. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -0
  64. package/lib/components/canvas/CubeCanvas.js +137 -0
  65. package/lib/components/canvas/CubeCanvas.js.map +1 -0
  66. package/lib/components/canvas/CubeCanvasContext.d.ts +19 -0
  67. package/lib/components/canvas/CubeCanvasContext.d.ts.map +1 -0
  68. package/lib/components/canvas/CubeCanvasContext.js +22 -0
  69. package/lib/components/canvas/CubeCanvasContext.js.map +1 -0
  70. package/lib/components/canvas/CubeCanvasContextMenu.d.ts +28 -0
  71. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -0
  72. package/lib/components/canvas/CubeCanvasContextMenu.js +35 -0
  73. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -0
  74. package/lib/components/canvas/CubeCanvasDnd.d.ts +43 -0
  75. package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -0
  76. package/lib/components/canvas/CubeCanvasDnd.js +51 -0
  77. package/lib/components/canvas/CubeCanvasDnd.js.map +1 -0
  78. package/lib/components/canvas/CubeCanvasEdge.d.ts +24 -0
  79. package/lib/components/canvas/CubeCanvasEdge.d.ts.map +1 -0
  80. package/lib/components/canvas/CubeCanvasEdge.js +33 -0
  81. package/lib/components/canvas/CubeCanvasEdge.js.map +1 -0
  82. package/lib/components/canvas/CubeCanvasElements.d.ts +66 -0
  83. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -0
  84. package/lib/components/canvas/CubeCanvasElements.js +97 -0
  85. package/lib/components/canvas/CubeCanvasElements.js.map +1 -0
  86. package/lib/components/canvas/CubeCanvasLayout.d.ts +32 -0
  87. package/lib/components/canvas/CubeCanvasLayout.d.ts.map +1 -0
  88. package/lib/components/canvas/CubeCanvasLayout.js +63 -0
  89. package/lib/components/canvas/CubeCanvasLayout.js.map +1 -0
  90. package/lib/components/canvas/CubeCanvasNode.d.ts +29 -0
  91. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -0
  92. package/lib/components/canvas/CubeCanvasNode.js +75 -0
  93. package/lib/components/canvas/CubeCanvasNode.js.map +1 -0
  94. package/lib/components/editors/CubeColumnPicker.d.ts +47 -0
  95. package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -0
  96. package/lib/components/editors/CubeColumnPicker.js +56 -0
  97. package/lib/components/editors/CubeColumnPicker.js.map +1 -0
  98. package/lib/components/editors/CubeDistinctEditor.d.ts +23 -0
  99. package/lib/components/editors/CubeDistinctEditor.d.ts.map +1 -0
  100. package/lib/components/editors/CubeDistinctEditor.js +24 -0
  101. package/lib/components/editors/CubeDistinctEditor.js.map +1 -0
  102. package/lib/components/editors/CubeFilterEditor.d.ts +26 -0
  103. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -0
  104. package/lib/components/editors/CubeFilterEditor.js +90 -0
  105. package/lib/components/editors/CubeFilterEditor.js.map +1 -0
  106. package/lib/components/editors/CubeIntegerField.d.ts +29 -0
  107. package/lib/components/editors/CubeIntegerField.d.ts.map +1 -0
  108. package/lib/components/editors/CubeIntegerField.js +30 -0
  109. package/lib/components/editors/CubeIntegerField.js.map +1 -0
  110. package/lib/components/editors/CubeJoinEditor.d.ts +26 -0
  111. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -0
  112. package/lib/components/editors/CubeJoinEditor.js +84 -0
  113. package/lib/components/editors/CubeJoinEditor.js.map +1 -0
  114. package/lib/components/editors/CubeNodeEditorPanel.d.ts +29 -0
  115. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -0
  116. package/lib/components/editors/CubeNodeEditorPanel.js +72 -0
  117. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -0
  118. package/lib/components/editors/CubeNodeEditorRegistry.d.ts +44 -0
  119. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -0
  120. package/lib/components/editors/CubeNodeEditorRegistry.js +43 -0
  121. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -0
  122. package/lib/components/editors/CubeRenameEditor.d.ts +26 -0
  123. package/lib/components/editors/CubeRenameEditor.d.ts.map +1 -0
  124. package/lib/components/editors/CubeRenameEditor.js +58 -0
  125. package/lib/components/editors/CubeRenameEditor.js.map +1 -0
  126. package/lib/components/editors/CubeRestrictEditor.d.ts +26 -0
  127. package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -0
  128. package/lib/components/editors/CubeRestrictEditor.js +23 -0
  129. package/lib/components/editors/CubeRestrictEditor.js.map +1 -0
  130. package/lib/components/editors/CubeRowCountEditor.d.ts +25 -0
  131. package/lib/components/editors/CubeRowCountEditor.d.ts.map +1 -0
  132. package/lib/components/editors/CubeRowCountEditor.js +38 -0
  133. package/lib/components/editors/CubeRowCountEditor.js.map +1 -0
  134. package/lib/components/editors/CubeSliceEditor.d.ts +25 -0
  135. package/lib/components/editors/CubeSliceEditor.d.ts.map +1 -0
  136. package/lib/components/editors/CubeSliceEditor.js +40 -0
  137. package/lib/components/editors/CubeSliceEditor.js.map +1 -0
  138. package/lib/components/editors/CubeSortEditor.d.ts +27 -0
  139. package/lib/components/editors/CubeSortEditor.d.ts.map +1 -0
  140. package/lib/components/editors/CubeSortEditor.js +72 -0
  141. package/lib/components/editors/CubeSortEditor.js.map +1 -0
  142. package/lib/components/editors/CubeSourceEditor.d.ts +25 -0
  143. package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -0
  144. package/lib/components/editors/CubeSourceEditor.js +41 -0
  145. package/lib/components/editors/CubeSourceEditor.js.map +1 -0
  146. package/lib/components/editors/CubeValueEditor.d.ts +40 -0
  147. package/lib/components/editors/CubeValueEditor.d.ts.map +1 -0
  148. package/lib/components/editors/CubeValueEditor.js +178 -0
  149. package/lib/components/editors/CubeValueEditor.js.map +1 -0
  150. package/lib/components/grid/CubeGridRegion.d.ts +23 -0
  151. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -0
  152. package/lib/components/grid/CubeGridRegion.js +94 -0
  153. package/lib/components/grid/CubeGridRegion.js.map +1 -0
  154. package/lib/components/grid/CubeGridValues.d.ts +25 -0
  155. package/lib/components/grid/CubeGridValues.d.ts.map +1 -0
  156. package/lib/components/grid/CubeGridValues.js +95 -0
  157. package/lib/components/grid/CubeGridValues.js.map +1 -0
  158. package/lib/components/grid/CubeResultGrid.d.ts +39 -0
  159. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -0
  160. package/lib/components/grid/CubeResultGrid.js +86 -0
  161. package/lib/components/grid/CubeResultGrid.js.map +1 -0
  162. package/lib/components/palette/CubePalette.d.ts +29 -0
  163. package/lib/components/palette/CubePalette.d.ts.map +1 -0
  164. package/lib/components/palette/CubePalette.js +73 -0
  165. package/lib/components/palette/CubePalette.js.map +1 -0
  166. package/lib/components/show-pure/CubeShowPureDialog.d.ts +23 -0
  167. package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -0
  168. package/lib/components/show-pure/CubeShowPureDialog.js +37 -0
  169. package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -0
  170. package/lib/components/source-picker/CubeSourcePicker.d.ts +22 -0
  171. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -0
  172. package/lib/components/source-picker/CubeSourcePicker.js +89 -0
  173. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -0
  174. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts +26 -0
  175. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -0
  176. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +45 -0
  177. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -0
  178. package/lib/graph-manager/CubeEngine.d.ts +128 -0
  179. package/lib/graph-manager/CubeEngine.d.ts.map +1 -0
  180. package/lib/graph-manager/CubeEngine.js +61 -0
  181. package/lib/graph-manager/CubeEngine.js.map +1 -0
  182. package/lib/graph-manager/CubeModelOutlineHelper.d.ts +33 -0
  183. package/lib/graph-manager/CubeModelOutlineHelper.d.ts.map +1 -0
  184. package/lib/graph-manager/CubeModelOutlineHelper.js +45 -0
  185. package/lib/graph-manager/CubeModelOutlineHelper.js.map +1 -0
  186. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +26 -0
  187. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -0
  188. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +22 -0
  189. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -0
  190. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts +27 -0
  191. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -0
  192. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +76 -0
  193. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -0
  194. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.d.ts +27 -0
  195. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.d.ts.map +1 -0
  196. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.js +82 -0
  197. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.js.map +1 -0
  198. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts +32 -0
  199. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -0
  200. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +195 -0
  201. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -0
  202. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +20 -0
  203. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -0
  204. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +174 -0
  205. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -0
  206. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.d.ts +24 -0
  207. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.d.ts.map +1 -0
  208. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.js +43 -0
  209. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.js.map +1 -0
  210. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +45 -0
  211. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -0
  212. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +171 -0
  213. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -0
  214. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +22 -0
  215. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -0
  216. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +79 -0
  217. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -0
  218. package/lib/index.css +17 -0
  219. package/lib/index.css.map +1 -0
  220. package/lib/index.d.ts +25 -0
  221. package/lib/index.d.ts.map +1 -0
  222. package/lib/index.js +24 -0
  223. package/lib/index.js.map +1 -0
  224. package/lib/stores/CubeEditorState.d.ts +236 -0
  225. package/lib/stores/CubeEditorState.d.ts.map +1 -0
  226. package/lib/stores/CubeEditorState.js +632 -0
  227. package/lib/stores/CubeEditorState.js.map +1 -0
  228. package/lib/stores/CubeExecutionState.d.ts +67 -0
  229. package/lib/stores/CubeExecutionState.d.ts.map +1 -0
  230. package/lib/stores/CubeExecutionState.js +212 -0
  231. package/lib/stores/CubeExecutionState.js.map +1 -0
  232. package/lib/stores/CubeGridQuickActions.d.ts +40 -0
  233. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -0
  234. package/lib/stores/CubeGridQuickActions.js +86 -0
  235. package/lib/stores/CubeGridQuickActions.js.map +1 -0
  236. package/lib/stores/CubeHost.d.ts +31 -0
  237. package/lib/stores/CubeHost.d.ts.map +1 -0
  238. package/lib/stores/CubeHost.js +17 -0
  239. package/lib/stores/CubeHost.js.map +1 -0
  240. package/lib/stores/CubeNodeEditorState.d.ts +103 -0
  241. package/lib/stores/CubeNodeEditorState.d.ts.map +1 -0
  242. package/lib/stores/CubeNodeEditorState.js +262 -0
  243. package/lib/stores/CubeNodeEditorState.js.map +1 -0
  244. package/lib/stores/CubeShowPureState.d.ts +41 -0
  245. package/lib/stores/CubeShowPureState.d.ts.map +1 -0
  246. package/lib/stores/CubeShowPureState.js +100 -0
  247. package/lib/stores/CubeShowPureState.js.map +1 -0
  248. package/lib/stores/CubeSourcePickerState.d.ts +98 -0
  249. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -0
  250. package/lib/stores/CubeSourcePickerState.js +334 -0
  251. package/lib/stores/CubeSourcePickerState.js.map +1 -0
  252. package/lib/stores/CubeSpecTransferState.d.ts +60 -0
  253. package/lib/stores/CubeSpecTransferState.d.ts.map +1 -0
  254. package/lib/stores/CubeSpecTransferState.js +167 -0
  255. package/lib/stores/CubeSpecTransferState.js.map +1 -0
  256. package/lib/stores/LocalModelCatalog.d.ts +37 -0
  257. package/lib/stores/LocalModelCatalog.d.ts.map +1 -0
  258. package/lib/stores/LocalModelCatalog.js +49 -0
  259. package/lib/stores/LocalModelCatalog.js.map +1 -0
  260. package/lib/stores/editors/CubeFilterDraft.d.ts +61 -0
  261. package/lib/stores/editors/CubeFilterDraft.d.ts.map +1 -0
  262. package/lib/stores/editors/CubeFilterDraft.js +186 -0
  263. package/lib/stores/editors/CubeFilterDraft.js.map +1 -0
  264. package/lib/stores/editors/CubeIntegerText.d.ts +24 -0
  265. package/lib/stores/editors/CubeIntegerText.d.ts.map +1 -0
  266. package/lib/stores/editors/CubeIntegerText.js +33 -0
  267. package/lib/stores/editors/CubeIntegerText.js.map +1 -0
  268. package/lib/stores/editors/CubeJoinDraft.d.ts +71 -0
  269. package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -0
  270. package/lib/stores/editors/CubeJoinDraft.js +145 -0
  271. package/lib/stores/editors/CubeJoinDraft.js.map +1 -0
  272. package/lib/stores/editors/CubeNodeDraft.d.ts +38 -0
  273. package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -0
  274. package/lib/stores/editors/CubeNodeDraft.js +35 -0
  275. package/lib/stores/editors/CubeNodeDraft.js.map +1 -0
  276. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +35 -0
  277. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -0
  278. package/lib/stores/editors/CubeNodeDraftRegistry.js +55 -0
  279. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -0
  280. package/lib/stores/editors/CubeRenameDraft.d.ts +44 -0
  281. package/lib/stores/editors/CubeRenameDraft.d.ts.map +1 -0
  282. package/lib/stores/editors/CubeRenameDraft.js +79 -0
  283. package/lib/stores/editors/CubeRenameDraft.js.map +1 -0
  284. package/lib/stores/editors/CubeRestrictDraft.d.ts +37 -0
  285. package/lib/stores/editors/CubeRestrictDraft.d.ts.map +1 -0
  286. package/lib/stores/editors/CubeRestrictDraft.js +73 -0
  287. package/lib/stores/editors/CubeRestrictDraft.js.map +1 -0
  288. package/lib/stores/editors/CubeRowCountDraft.d.ts +42 -0
  289. package/lib/stores/editors/CubeRowCountDraft.d.ts.map +1 -0
  290. package/lib/stores/editors/CubeRowCountDraft.js +55 -0
  291. package/lib/stores/editors/CubeRowCountDraft.js.map +1 -0
  292. package/lib/stores/editors/CubeSliceDraft.d.ts +42 -0
  293. package/lib/stores/editors/CubeSliceDraft.d.ts.map +1 -0
  294. package/lib/stores/editors/CubeSliceDraft.js +72 -0
  295. package/lib/stores/editors/CubeSliceDraft.js.map +1 -0
  296. package/lib/stores/editors/CubeSortDraft.d.ts +49 -0
  297. package/lib/stores/editors/CubeSortDraft.d.ts.map +1 -0
  298. package/lib/stores/editors/CubeSortDraft.js +99 -0
  299. package/lib/stores/editors/CubeSortDraft.js.map +1 -0
  300. package/lib/stores/fixtures/CubeNorthwindModel.d.ts +23 -0
  301. package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -0
  302. package/lib/stores/fixtures/CubeNorthwindModel.js +338 -0
  303. package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -0
  304. package/package.json +81 -3
  305. package/src/__lib__/LegendCubeCommand.ts +44 -0
  306. package/src/__lib__/LegendCubeHelpText.ts +58 -0
  307. package/src/__lib__/LegendCubeLabels.ts +171 -0
  308. package/src/__lib__/LegendCubeTesting.ts +33 -0
  309. package/src/__test-utils__/CubeCanvasTestUtils.ts +53 -0
  310. package/src/__test-utils__/CubeEngineTestSupport.ts +172 -0
  311. package/src/__test-utils__/CubeNorthwindTestQueries.ts +165 -0
  312. package/src/__test-utils__/CubeOperationsTestUtils.ts +177 -0
  313. package/src/__test-utils__/CubePageTestUtils.tsx +96 -0
  314. package/src/__test-utils__/CubeTestApplication.ts +82 -0
  315. package/src/__test-utils__/FakeCubeEngine.ts +145 -0
  316. package/src/components/CubeButton.tsx +35 -0
  317. package/src/components/CubeEditor.tsx +239 -0
  318. package/src/components/CubeNodeIcon.tsx +64 -0
  319. package/src/components/canvas/CubeCanvas.tsx +262 -0
  320. package/src/components/canvas/CubeCanvasContext.ts +31 -0
  321. package/src/components/canvas/CubeCanvasContextMenu.tsx +89 -0
  322. package/src/components/canvas/CubeCanvasDnd.ts +82 -0
  323. package/src/components/canvas/CubeCanvasEdge.tsx +57 -0
  324. package/src/components/canvas/CubeCanvasElements.ts +153 -0
  325. package/src/components/canvas/CubeCanvasLayout.ts +88 -0
  326. package/src/components/canvas/CubeCanvasNode.tsx +149 -0
  327. package/src/components/editors/CubeColumnPicker.tsx +138 -0
  328. package/src/components/editors/CubeDistinctEditor.tsx +28 -0
  329. package/src/components/editors/CubeFilterEditor.tsx +309 -0
  330. package/src/components/editors/CubeIntegerField.tsx +51 -0
  331. package/src/components/editors/CubeJoinEditor.tsx +247 -0
  332. package/src/components/editors/CubeNodeEditorPanel.tsx +215 -0
  333. package/src/components/editors/CubeNodeEditorRegistry.ts +81 -0
  334. package/src/components/editors/CubeRenameEditor.tsx +143 -0
  335. package/src/components/editors/CubeRestrictEditor.tsx +103 -0
  336. package/src/components/editors/CubeRowCountEditor.tsx +53 -0
  337. package/src/components/editors/CubeSliceEditor.tsx +69 -0
  338. package/src/components/editors/CubeSortEditor.tsx +206 -0
  339. package/src/components/editors/CubeSourceEditor.tsx +106 -0
  340. package/src/components/editors/CubeValueEditor.tsx +333 -0
  341. package/src/components/grid/CubeGridRegion.tsx +275 -0
  342. package/src/components/grid/CubeGridValues.ts +125 -0
  343. package/src/components/grid/CubeResultGrid.tsx +138 -0
  344. package/src/components/palette/CubePalette.tsx +177 -0
  345. package/src/components/show-pure/CubeShowPureDialog.tsx +101 -0
  346. package/src/components/source-picker/CubeSourcePicker.tsx +304 -0
  347. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +157 -0
  348. package/src/graph-manager/CubeEngine.ts +169 -0
  349. package/src/graph-manager/CubeModelOutlineHelper.ts +58 -0
  350. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +34 -0
  351. package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +109 -0
  352. package/src/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.ts +115 -0
  353. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +257 -0
  354. package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +243 -0
  355. package/src/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.ts +58 -0
  356. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +278 -0
  357. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +127 -0
  358. package/src/index.ts +41 -0
  359. package/src/stores/CubeEditorState.ts +807 -0
  360. package/src/stores/CubeExecutionState.ts +288 -0
  361. package/src/stores/CubeGridQuickActions.ts +129 -0
  362. package/src/stores/CubeHost.ts +32 -0
  363. package/src/stores/CubeNodeEditorState.ts +324 -0
  364. package/src/stores/CubeShowPureState.ts +118 -0
  365. package/src/stores/CubeSourcePickerState.ts +426 -0
  366. package/src/stores/CubeSpecTransferState.ts +198 -0
  367. package/src/stores/LocalModelCatalog.ts +70 -0
  368. package/src/stores/editors/CubeFilterDraft.ts +241 -0
  369. package/src/stores/editors/CubeIntegerText.ts +34 -0
  370. package/src/stores/editors/CubeJoinDraft.ts +224 -0
  371. package/src/stores/editors/CubeNodeDraft.ts +46 -0
  372. package/src/stores/editors/CubeNodeDraftRegistry.ts +83 -0
  373. package/src/stores/editors/CubeRenameDraft.ts +110 -0
  374. package/src/stores/editors/CubeRestrictDraft.ts +83 -0
  375. package/src/stores/editors/CubeRowCountDraft.ts +69 -0
  376. package/src/stores/editors/CubeSliceDraft.ts +87 -0
  377. package/src/stores/editors/CubeSortDraft.ts +135 -0
  378. package/src/stores/fixtures/CubeNorthwindModel.ts +355 -0
  379. package/tsconfig.json +133 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ Dialog,
19
+ Modal,
20
+ ModalBody,
21
+ ModalFooter,
22
+ ModalFooterButton,
23
+ ModalHeader,
24
+ PanelLoadingIndicator,
25
+ } from '@finos/legend-art';
26
+ import { flowResult } from 'mobx';
27
+ import { observer } from 'mobx-react-lite';
28
+ import type { CubeEditorState } from '../../stores/CubeEditorState.js';
29
+ import { CUBE_SPEC_TRANSFER_MODE } from '../../stores/CubeSpecTransferState.js';
30
+
31
+ const TEXT_AREA_CLASS_NAME =
32
+ 'h-80 w-full resize-none rounded-sm border border-[var(--color-border-default)] bg-[var(--color-bg-input)] p-1 font-mono text-sm text-[var(--color-text-primary)]';
33
+
34
+ /**
35
+ * Export and Import of the cube's saved spec, as text to copy, download,
36
+ * paste or read from a file (PLAN §10.3; developer tools until M8).
37
+ */
38
+ export const CubeSpecTransferDialog = observer(
39
+ (props: { editorState: CubeEditorState }) => {
40
+ const { editorState } = props;
41
+ const transfer = editorState.specTransfer;
42
+ const { applicationStore } = editorState.host;
43
+ const darkMode =
44
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled;
45
+ const isExport = transfer.mode === CUBE_SPEC_TRANSFER_MODE.EXPORT;
46
+
47
+ return (
48
+ <Dialog
49
+ open={transfer.mode !== undefined}
50
+ onClose={() => transfer.close()}
51
+ >
52
+ <Modal darkMode={darkMode} className="w-[720px] max-w-full">
53
+ <ModalHeader>
54
+ <div className="modal__title">
55
+ {isExport ? 'Export spec (dev)' : 'Import spec (dev)'}
56
+ </div>
57
+ </ModalHeader>
58
+ <PanelLoadingIndicator isLoading={transfer.isReadingFile} />
59
+ <ModalBody>
60
+ <div className="flex flex-col gap-2">
61
+ {isExport ? (
62
+ transfer.exportText !== undefined && (
63
+ <textarea
64
+ className={TEXT_AREA_CLASS_NAME}
65
+ aria-label="Cube spec"
66
+ readOnly={true}
67
+ value={transfer.exportText}
68
+ />
69
+ )
70
+ ) : (
71
+ <>
72
+ <div className="text-base text-[var(--color-text-secondary)]">
73
+ Paste a cube spec, or choose a .cube.json file. The spec
74
+ replaces this cube; Undo brings it back.
75
+ </div>
76
+ <input
77
+ className="text-base"
78
+ type="file"
79
+ accept=".json,application/json"
80
+ aria-label="Spec file"
81
+ onChange={(event) => {
82
+ const file = event.target.files?.[0];
83
+ // the same file can be chosen again
84
+ event.target.value = '';
85
+ if (file) {
86
+ flowResult(transfer.readImportFile(file)).catch(
87
+ applicationStore.alertUnhandledError,
88
+ );
89
+ }
90
+ }}
91
+ />
92
+ <textarea
93
+ className={TEXT_AREA_CLASS_NAME}
94
+ aria-label="Cube spec"
95
+ placeholder="Cube spec"
96
+ spellCheck={false}
97
+ value={transfer.importText}
98
+ onChange={(event) =>
99
+ transfer.setImportText(event.target.value)
100
+ }
101
+ />
102
+ </>
103
+ )}
104
+ {transfer.error !== undefined && (
105
+ <div
106
+ className="break-words text-base text-[var(--color-status-error)]"
107
+ role="alert"
108
+ >
109
+ {transfer.error}
110
+ </div>
111
+ )}
112
+ </div>
113
+ </ModalBody>
114
+ <ModalFooter>
115
+ {isExport ? (
116
+ <>
117
+ <ModalFooterButton
118
+ darkMode={darkMode}
119
+ formatText={false}
120
+ text="Copy"
121
+ disabled={transfer.exportText === undefined}
122
+ onClick={() => {
123
+ transfer
124
+ .copyExport()
125
+ .catch(applicationStore.alertUnhandledError);
126
+ }}
127
+ />
128
+ <ModalFooterButton
129
+ darkMode={darkMode}
130
+ formatText={false}
131
+ text="Download"
132
+ disabled={transfer.exportText === undefined}
133
+ onClick={() => transfer.downloadExport()}
134
+ />
135
+ </>
136
+ ) : (
137
+ <ModalFooterButton
138
+ darkMode={darkMode}
139
+ formatText={false}
140
+ text="Import"
141
+ disabled={!transfer.importText.trim() || transfer.isReadingFile}
142
+ onClick={() => transfer.importSpec()}
143
+ />
144
+ )}
145
+ <ModalFooterButton
146
+ darkMode={darkMode}
147
+ formatText={false}
148
+ type="secondary"
149
+ text={isExport ? 'Close' : 'Cancel'}
150
+ onClick={() => transfer.close()}
151
+ />
152
+ </ModalFooter>
153
+ </Modal>
154
+ </Dialog>
155
+ );
156
+ },
157
+ );
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import type { IR, ModelContext, Schema } from '@finos/legend-cube';
18
+
19
+ // The engine port (PLAN §8.7): what Cube asks of an engine, in Cube's own
20
+ // terms. Only its Legend implementation, under `protocol/pure/v1/`, knows the
21
+ // protocol; nothing here names a V1_* type
22
+
23
+ /** A query node's id */
24
+ export type NodeId = string;
25
+
26
+ /** A table's Database element path, schema name and table name, names as stored (quotes included) */
27
+ export type AccessorPath = readonly [
28
+ database: string,
29
+ schema: string,
30
+ table: string,
31
+ ];
32
+
33
+ /** Why a table can't be picked as it is, read from its definition (PLAN §6.2.6) */
34
+ export enum CubeTableFlag {
35
+ /** a binary column: the engine can't type the table */
36
+ UNAVAILABLE = 'unavailable',
37
+ /** a CHAR(n) column: typed with a length of 1 */
38
+ LENGTH_UNKNOWN = 'lengthUnknown',
39
+ /** an OTHER or ARRAY column: typed as a bare String */
40
+ TYPE_UNKNOWN = 'typeUnknown',
41
+ }
42
+
43
+ export interface CubeOutlineTable {
44
+ /** As stored, quotes included */
45
+ readonly name: string;
46
+ /** Views are typed as text of length 0, so the picker hides them in v1 */
47
+ readonly isView: boolean;
48
+ readonly columnCount: number;
49
+ readonly flags: readonly CubeTableFlag[];
50
+ /**
51
+ * The columns typed as a bare String because Cube can't read their type
52
+ * (OTHER or ARRAY), unquoted as in the table's schema
53
+ */
54
+ readonly untypedColumns: readonly string[];
55
+ }
56
+
57
+ export interface CubeOutlineSchema {
58
+ readonly name: string;
59
+ readonly tables: readonly CubeOutlineTable[];
60
+ }
61
+
62
+ export interface CubeOutlineDatabase {
63
+ readonly path: string;
64
+ readonly schemas: readonly CubeOutlineSchema[];
65
+ }
66
+
67
+ /** A relational connection of a runtime, for the operations some databases take another way (PLAN §11.4) */
68
+ export interface CubeOutlineConnection {
69
+ /** The store it is keyed by */
70
+ readonly storePath: string;
71
+ /** The engine's name for its database type, e.g. `H2` or `SqlServer` */
72
+ readonly databaseType: string;
73
+ }
74
+
75
+ export interface CubeOutlineRuntime {
76
+ readonly path: string;
77
+ /** The stores its connections are keyed by, exactly; includes are not followed (PLAN §6.2.5) */
78
+ readonly storePaths: readonly string[];
79
+ /**
80
+ * Its relational connections that name a database type, a list rather
81
+ * than a record keyed by a store path from the model; optional, as an
82
+ * outline from before M2 has none
83
+ */
84
+ readonly connections?: readonly CubeOutlineConnection[];
85
+ }
86
+
87
+ /** What a model offers the source picker: its databases and runtimes, as plain data */
88
+ export interface CubeModelOutline {
89
+ readonly databases: readonly CubeOutlineDatabase[];
90
+ readonly runtimes: readonly CubeOutlineRuntime[];
91
+ }
92
+
93
+ export enum CubeEngineErrorKind {
94
+ /** the model or a lambda doesn't compile, or a table can't be typed */
95
+ COMPILE = 'compile',
96
+ /** the query failed while running, or its result can't be read */
97
+ EXECUTION = 'execution',
98
+ /** the cube's model is of a kind this version can't run */
99
+ UNSUPPORTED_MODEL = 'unsupportedModel',
100
+ /** the engine couldn't be reached, or answered with no readable error */
101
+ NETWORK = 'network',
102
+ }
103
+
104
+ /**
105
+ * An engine failure, placed on the node it concerns: the node a stamp in the
106
+ * error points to, else the source being typed or the node being run.
107
+ */
108
+ export class CubeEngineError extends Error {
109
+ readonly kind: CubeEngineErrorKind;
110
+ readonly nodeId: NodeId | undefined;
111
+ /** The part of the node the error points to (an `EmitRole`), when it is located */
112
+ readonly role: string | undefined;
113
+ /** The first line of the engine's message, shown on the node */
114
+ readonly firstLine: string;
115
+ /** The engine's whole message, without its Java trace, shown in the panel */
116
+ readonly detail: string;
117
+
118
+ constructor(
119
+ kind: CubeEngineErrorKind,
120
+ detail: string,
121
+ nodeId?: NodeId,
122
+ role?: string,
123
+ ) {
124
+ const firstLine = detail.split('\n', 1)[0]?.trim() ?? '';
125
+ super(firstLine);
126
+ this.name = 'CubeEngineError';
127
+ this.kind = kind;
128
+ this.detail = detail;
129
+ this.firstLine = firstLine;
130
+ this.nodeId = nodeId;
131
+ this.role = role;
132
+ }
133
+ }
134
+
135
+ /** A value of a result cell: Integer and Decimal values as their exact text, Float values as numbers (PLAN §8.7) */
136
+ export type CubeResultValue = string | number | boolean | null;
137
+
138
+ export interface CubeResult {
139
+ /** Column names, in order; rows match them by position */
140
+ readonly columns: readonly string[];
141
+ /** As many rows as the engine sent, up to the row limit + 1 */
142
+ readonly rows: readonly (readonly CubeResultValue[])[];
143
+ /** The SQL statements the engine ran */
144
+ readonly sql: readonly string[];
145
+ readonly durationMs: number;
146
+ }
147
+
148
+ export interface CubeEngine {
149
+ /** The databases and runtimes of a model, parsed once */
150
+ loadModel(model: ModelContext): Promise<CubeModelOutline>;
151
+ /** The schema of each table, in one engine call: one entry per key, failures included */
152
+ resolveSchemas(
153
+ model: ModelContext,
154
+ accessors: ReadonlyMap<NodeId, AccessorPath>,
155
+ ): Promise<Map<NodeId, Schema | CubeEngineError>>;
156
+ /** The schema of each lambda, in one engine call: one entry per key, failures included */
157
+ typeLambdas(
158
+ model: ModelContext,
159
+ lambdas: ReadonlyMap<NodeId, IR>,
160
+ ): Promise<Map<NodeId, Schema | CubeEngineError>>;
161
+ /** Runs an execution lambda; rejects with a `CubeEngineError` */
162
+ execute(
163
+ model: ModelContext,
164
+ lambda: IR,
165
+ options?: { abortController?: AbortController | undefined },
166
+ ): Promise<CubeResult>;
167
+ /** The Pure text of a lambda, for display only: never parsed back */
168
+ renderPure(lambda: IR): Promise<string>;
169
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import type { CubeModelOutline, CubeOutlineRuntime } from './CubeEngine.js';
18
+
19
+ /**
20
+ * The runtimes a query on the database can run with: those with a connection
21
+ * keyed by exactly that database. The engine matches stores by exact element
22
+ * and silently falls back to the first connection otherwise, so a runtime
23
+ * that only reaches the database through an include is not offered (PLAN
24
+ * §6.2.5).
25
+ */
26
+ export const getRuntimesForDatabase = (
27
+ outline: CubeModelOutline,
28
+ databasePath: string,
29
+ ): CubeOutlineRuntime[] =>
30
+ outline.runtimes.filter((runtime) =>
31
+ runtime.storePaths.includes(databasePath),
32
+ );
33
+
34
+ /**
35
+ * The database type a query on these databases runs on with the runtime, for
36
+ * the operations some databases take another way (PLAN §11.4): the type of
37
+ * the runtime's connections to them. None when the runtime isn't in the
38
+ * outline, a database has no typed connection, or the databases' types
39
+ * differ: the native forms are written then.
40
+ */
41
+ export const getDatabaseType = (
42
+ outline: CubeModelOutline,
43
+ runtimePath: string,
44
+ databasePaths: readonly string[],
45
+ ): string | undefined => {
46
+ const runtime = outline.runtimes.find(({ path }) => path === runtimePath);
47
+ const types = new Set<string>();
48
+ for (const databasePath of new Set(databasePaths)) {
49
+ const databaseTypes = (runtime?.connections ?? [])
50
+ .filter(({ storePath }) => storePath === databasePath)
51
+ .map(({ databaseType }) => databaseType);
52
+ if (!databaseTypes.length) {
53
+ return undefined;
54
+ }
55
+ databaseTypes.forEach((databaseType) => types.add(databaseType));
56
+ }
57
+ return types.size === 1 ? [...types][0] : undefined;
58
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import type { TracerService } from '@finos/legend-shared';
18
+ import type { CubeEngine } from '../../CubeEngine.js';
19
+ import {
20
+ type V1_CubeEngineConfig,
21
+ V1_LegendCubeEngine,
22
+ } from './v1/V1_LegendCubeEngine.js';
23
+
24
+ /** The engine client's configuration, as the host gives it (e.g. Legend Query's engine server URL) */
25
+ export type CubeEngineConfig = V1_CubeEngineConfig;
26
+
27
+ /**
28
+ * The Cube engine of a host (PLAN §3.2): the only place that builds the
29
+ * Legend implementation, so hosts never name a V1_* symbol
30
+ */
31
+ export const buildCubeEngine = (
32
+ config: CubeEngineConfig,
33
+ tracerService: TracerService,
34
+ ): CubeEngine => new V1_LegendCubeEngine(config, tracerService);
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { NetworkClientError, type PlainObject } from '@finos/legend-shared';
18
+ import {
19
+ CubeEngineError,
20
+ CubeEngineErrorKind,
21
+ type NodeId,
22
+ } from '../../../CubeEngine.js';
23
+ import { V1_parseCubeSourceId } from './V1_CubeLambdaSerializer.js';
24
+
25
+ // Engine errors → `CubeEngineError`s on canvas nodes (PLAN §8.7). A compile
26
+ // error echoes the stamp of the innermost failing protocol node, so it goes on
27
+ // that node; plan-time, database and network errors carry no stamp, so they
28
+ // go on the node being typed or run.
29
+
30
+ const COMPILATION_ERROR_TYPES = new Set(['COMPILATION', 'PARSER']);
31
+
32
+ /** The engine's error payload: `{message, errorType?, sourceInformation?, trace?}` */
33
+ const readPayload = (
34
+ payload: unknown,
35
+ ): { message: string; errorType?: string; sourceId?: string } | undefined => {
36
+ if (!payload || typeof payload !== 'object') {
37
+ return undefined;
38
+ }
39
+ const { message, errorType, sourceInformation } = payload as PlainObject;
40
+ if (typeof message !== 'string' || !message.trim()) {
41
+ return undefined;
42
+ }
43
+ const sourceId =
44
+ sourceInformation && typeof sourceInformation === 'object'
45
+ ? (sourceInformation as PlainObject).sourceId
46
+ : undefined;
47
+ return {
48
+ message,
49
+ ...(typeof errorType === 'string' ? { errorType } : {}),
50
+ ...(typeof sourceId === 'string' ? { sourceId } : {}),
51
+ };
52
+ };
53
+
54
+ /**
55
+ * The error of an engine payload (a failed call's, or a batch key's), placed
56
+ * on the stamped node, or else on the fallback node. Its Java trace is dropped.
57
+ */
58
+ export const V1_buildCubeEngineError = (
59
+ payload: unknown,
60
+ fallbackNodeId: NodeId | undefined,
61
+ kind: CubeEngineErrorKind,
62
+ ): CubeEngineError | undefined => {
63
+ const read = readPayload(payload);
64
+ if (!read) {
65
+ return undefined;
66
+ }
67
+ const origin = V1_parseCubeSourceId(read.sourceId);
68
+ return new CubeEngineError(
69
+ read.errorType && COMPILATION_ERROR_TYPES.has(read.errorType)
70
+ ? CubeEngineErrorKind.COMPILE
71
+ : kind,
72
+ read.message,
73
+ origin?.nodeId ?? fallbackNodeId,
74
+ origin?.role,
75
+ );
76
+ };
77
+
78
+ /**
79
+ * The error of a failed engine call: the engine's own message when it sent
80
+ * one, else a network error
81
+ */
82
+ export const V1_toCubeEngineError = (
83
+ error: unknown,
84
+ fallbackNodeId: NodeId | undefined,
85
+ kind: CubeEngineErrorKind,
86
+ ): CubeEngineError => {
87
+ if (error instanceof CubeEngineError) {
88
+ return error.nodeId !== undefined || fallbackNodeId === undefined
89
+ ? error
90
+ : new CubeEngineError(error.kind, error.detail, fallbackNodeId);
91
+ }
92
+ if (error instanceof NetworkClientError) {
93
+ const fromPayload = V1_buildCubeEngineError(
94
+ error.payload,
95
+ fallbackNodeId,
96
+ kind,
97
+ );
98
+ if (fromPayload) {
99
+ return fromPayload;
100
+ }
101
+ }
102
+ return new CubeEngineError(
103
+ CubeEngineErrorKind.NETWORK,
104
+ error instanceof Error && error.message
105
+ ? error.message
106
+ : `The engine couldn't be reached`,
107
+ fallbackNodeId,
108
+ );
109
+ };
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { resolveCubeType, TypeFamily } from '@finos/legend-cube';
18
+ import { parseLosslessJSON, type PlainObject } from '@finos/legend-shared';
19
+ import type { CubeResultValue } from '../../../CubeEngine.js';
20
+
21
+ // An execution response (DEFAULT format, relation result) read losslessly
22
+ // (PLAN §8.7). Each column's values keep one JS type, decided by the type the
23
+ // result builder gives it: Float values are numbers; any other number, an
24
+ // Integer or Decimal value above all, is its exact text ("9007199254740993",
25
+ // "12.30"). Nothing is inferred from the kind of JSON token, since a Float
26
+ // column may hold 5124 and a String column 32.38.
27
+
28
+ const RELATIONAL_ACTIVITY_TYPE = 'relational';
29
+
30
+ export interface V1_CubeExecutionResult {
31
+ readonly columns: readonly string[];
32
+ readonly rows: readonly (readonly CubeResultValue[])[];
33
+ readonly sql: readonly string[];
34
+ }
35
+
36
+ /** Thrown when the body can't be read, e.g. a stack trace streamed into a 200 */
37
+ export class V1_CubeUnreadableResultError extends Error {}
38
+
39
+ const isLosslessNumber = (
40
+ value: unknown,
41
+ ): value is { isLosslessNumber: true; value: string } =>
42
+ typeof value === 'object' &&
43
+ value !== null &&
44
+ (value as { isLosslessNumber?: unknown }).isLosslessNumber === true;
45
+
46
+ const asObject = (value: unknown): PlainObject =>
47
+ value && typeof value === 'object' && !Array.isArray(value)
48
+ ? (value as PlainObject)
49
+ : {};
50
+
51
+ const readCell = (value: unknown, asNumber: boolean): CubeResultValue => {
52
+ if (isLosslessNumber(value)) {
53
+ return asNumber ? Number(value.value) : value.value;
54
+ }
55
+ if (
56
+ value === null ||
57
+ typeof value === 'string' ||
58
+ typeof value === 'boolean'
59
+ ) {
60
+ return value;
61
+ }
62
+ throw new V1_CubeUnreadableResultError(
63
+ `A result value is not a scalar: ${JSON.stringify(value)}`,
64
+ );
65
+ };
66
+
67
+ /** The columns, rows and SQL of an execution response's text */
68
+ export const V1_readCubeExecutionResult = (
69
+ text: string,
70
+ ): V1_CubeExecutionResult => {
71
+ let json: PlainObject;
72
+ try {
73
+ json = asObject(parseLosslessJSON(text));
74
+ } catch (error) {
75
+ throw new V1_CubeUnreadableResultError(
76
+ `The engine's response can't be read: ${(error as Error).message}`,
77
+ );
78
+ }
79
+ const result = asObject(json.result);
80
+ if (!Array.isArray(result.columns) || !Array.isArray(result.rows)) {
81
+ throw new V1_CubeUnreadableResultError(
82
+ `The engine's response has no relation result`,
83
+ );
84
+ }
85
+ const columns = result.columns.map((name) => String(name));
86
+ const builderTypes = new Map(
87
+ (Array.isArray(asObject(json.builder).columns)
88
+ ? (asObject(json.builder).columns as unknown[])
89
+ : []
90
+ ).map((column) => [
91
+ String(asObject(column).name),
92
+ String(asObject(column).type ?? ''),
93
+ ]),
94
+ );
95
+ const asNumber = columns.map((name) => {
96
+ const type = builderTypes.get(name);
97
+ return type ? resolveCubeType(type).family === TypeFamily.FLOAT : false;
98
+ });
99
+ const rows = result.rows.map((row) => {
100
+ const values = asObject(row).values;
101
+ if (!Array.isArray(values) || values.length !== columns.length) {
102
+ throw new V1_CubeUnreadableResultError(
103
+ `A result row doesn't have one value per column`,
104
+ );
105
+ }
106
+ return values.map((value, index) =>
107
+ readCell(value, asNumber[index] ?? false),
108
+ );
109
+ });
110
+ const sql = (Array.isArray(json.activities) ? json.activities : [])
111
+ .map(asObject)
112
+ .filter((activity) => activity._type === RELATIONAL_ACTIVITY_TYPE)
113
+ .map((activity) => String(activity.sql));
114
+ return { columns, rows, sql };
115
+ };