@finos/legend-cube-builder 0.0.3 → 0.0.4

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 (691) hide show
  1. package/README.md +52 -19
  2. package/docs/adding-an-operation.md +102 -13
  3. package/docs/hosting.md +82 -4
  4. package/docs/testing.md +114 -9
  5. package/lib/__lib__/LegendCubeCommand.d.ts +2 -1
  6. package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
  7. package/lib/__lib__/LegendCubeCommand.js +5 -0
  8. package/lib/__lib__/LegendCubeCommand.js.map +1 -1
  9. package/lib/__lib__/LegendCubeDataProductLabels.d.ts +45 -0
  10. package/lib/__lib__/LegendCubeDataProductLabels.d.ts.map +1 -0
  11. package/lib/__lib__/LegendCubeDataProductLabels.js +60 -0
  12. package/lib/__lib__/LegendCubeDataProductLabels.js.map +1 -0
  13. package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts +56 -0
  14. package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts.map +1 -0
  15. package/lib/__lib__/LegendCubeDirectConnectionLabels.js +76 -0
  16. package/lib/__lib__/LegendCubeDirectConnectionLabels.js.map +1 -0
  17. package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -1
  18. package/lib/__lib__/LegendCubeHelpText.js +12 -2
  19. package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
  20. package/lib/__lib__/LegendCubeIngestLabels.d.ts +25 -0
  21. package/lib/__lib__/LegendCubeIngestLabels.d.ts.map +1 -0
  22. package/lib/__lib__/LegendCubeIngestLabels.js +29 -0
  23. package/lib/__lib__/LegendCubeIngestLabels.js.map +1 -0
  24. package/lib/__lib__/LegendCubeLabels.d.ts +76 -3
  25. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
  26. package/lib/__lib__/LegendCubeLabels.js +102 -4
  27. package/lib/__lib__/LegendCubeLabels.js.map +1 -1
  28. package/lib/__lib__/LegendCubeProjectLabels.d.ts +22 -0
  29. package/lib/__lib__/LegendCubeProjectLabels.d.ts.map +1 -0
  30. package/lib/__lib__/LegendCubeProjectLabels.js +23 -0
  31. package/lib/__lib__/LegendCubeProjectLabels.js.map +1 -0
  32. package/lib/__lib__/LegendCubeTesting.d.ts +1 -0
  33. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
  34. package/lib/__lib__/LegendCubeTesting.js +1 -0
  35. package/lib/__lib__/LegendCubeTesting.js.map +1 -1
  36. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -1
  37. package/lib/__test-utils__/CubeCanvasTestUtils.js +1 -1
  38. package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -1
  39. package/lib/__test-utils__/CubeConnectionTestSupport.d.ts +22 -0
  40. package/lib/__test-utils__/CubeConnectionTestSupport.d.ts.map +1 -0
  41. package/lib/__test-utils__/CubeConnectionTestSupport.js +30 -0
  42. package/lib/__test-utils__/CubeConnectionTestSupport.js.map +1 -0
  43. package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts +31 -0
  44. package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts.map +1 -0
  45. package/lib/__test-utils__/CubeDirectConnectionFixtures.js +63 -0
  46. package/lib/__test-utils__/CubeDirectConnectionFixtures.js.map +1 -0
  47. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +12 -0
  48. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
  49. package/lib/__test-utils__/CubeEngineTestSupport.js +21 -0
  50. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
  51. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +37 -0
  52. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -0
  53. package/lib/__test-utils__/CubeExpressionTestUtils.js +83 -0
  54. package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -0
  55. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts +25 -0
  56. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts.map +1 -1
  57. package/lib/__test-utils__/CubeOperationsTestUtils.js +56 -10
  58. package/lib/__test-utils__/CubeOperationsTestUtils.js.map +1 -1
  59. package/lib/__test-utils__/CubePageTestUtils.d.ts +12 -0
  60. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
  61. package/lib/__test-utils__/CubePageTestUtils.js +25 -1
  62. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
  63. package/lib/__test-utils__/CubeTestApplication.d.ts +5 -1
  64. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
  65. package/lib/__test-utils__/CubeTestApplication.js +9 -1
  66. package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
  67. package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts +33 -0
  68. package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts.map +1 -0
  69. package/lib/__test-utils__/FakeCubeConnectionExplorer.js +67 -0
  70. package/lib/__test-utils__/FakeCubeConnectionExplorer.js.map +1 -0
  71. package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts +45 -0
  72. package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts.map +1 -0
  73. package/lib/__test-utils__/FakeCubeDataProductCatalog.js +137 -0
  74. package/lib/__test-utils__/FakeCubeDataProductCatalog.js.map +1 -0
  75. package/lib/__test-utils__/FakeCubeEngine.d.ts +2 -0
  76. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
  77. package/lib/__test-utils__/FakeCubeEngine.js +14 -1
  78. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
  79. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +35 -0
  80. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -0
  81. package/lib/__test-utils__/FakeCubeIngestCatalog.js +107 -0
  82. package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -0
  83. package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts +30 -0
  84. package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts.map +1 -0
  85. package/lib/__test-utils__/FakeCubeProjectCatalog.js +64 -0
  86. package/lib/__test-utils__/FakeCubeProjectCatalog.js.map +1 -0
  87. package/lib/components/CubeAddItems.d.ts +35 -0
  88. package/lib/components/CubeAddItems.d.ts.map +1 -0
  89. package/lib/components/CubeAddItems.js +82 -0
  90. package/lib/components/CubeAddItems.js.map +1 -0
  91. package/lib/components/CubeEditor.d.ts +5 -1
  92. package/lib/components/CubeEditor.d.ts.map +1 -1
  93. package/lib/components/CubeEditor.js +33 -13
  94. package/lib/components/CubeEditor.js.map +1 -1
  95. package/lib/components/CubeEntrySourceBanner.d.ts +23 -0
  96. package/lib/components/CubeEntrySourceBanner.d.ts.map +1 -0
  97. package/lib/components/CubeEntrySourceBanner.js +32 -0
  98. package/lib/components/CubeEntrySourceBanner.js.map +1 -0
  99. package/lib/components/CubeNodeIcon.d.ts.map +1 -1
  100. package/lib/components/CubeNodeIcon.js +8 -1
  101. package/lib/components/CubeNodeIcon.js.map +1 -1
  102. package/lib/components/CubeSchemaColumnsTable.d.ts +21 -0
  103. package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -0
  104. package/lib/components/CubeSchemaColumnsTable.js +6 -0
  105. package/lib/components/CubeSchemaColumnsTable.js.map +1 -0
  106. package/lib/components/canvas/CubeCanvas.d.ts +4 -3
  107. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
  108. package/lib/components/canvas/CubeCanvas.js +31 -12
  109. package/lib/components/canvas/CubeCanvas.js.map +1 -1
  110. package/lib/components/canvas/CubeCanvasContextMenu.d.ts +8 -4
  111. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
  112. package/lib/components/canvas/CubeCanvasContextMenu.js +19 -9
  113. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
  114. package/lib/components/canvas/CubeCanvasDnd.d.ts +7 -5
  115. package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -1
  116. package/lib/components/canvas/CubeCanvasDnd.js +14 -9
  117. package/lib/components/canvas/CubeCanvasDnd.js.map +1 -1
  118. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
  119. package/lib/components/canvas/CubeCanvasElements.js +6 -3
  120. package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
  121. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
  122. package/lib/components/canvas/CubeCanvasNode.js +30 -20
  123. package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
  124. package/lib/components/canvas/CubeCanvasNodeFocus.d.ts +22 -0
  125. package/lib/components/canvas/CubeCanvasNodeFocus.d.ts.map +1 -0
  126. package/lib/components/canvas/CubeCanvasNodeFocus.js +31 -0
  127. package/lib/components/canvas/CubeCanvasNodeFocus.js.map +1 -0
  128. package/lib/components/canvas/CubeNodeEditorAnchor.d.ts +44 -0
  129. package/lib/components/canvas/CubeNodeEditorAnchor.d.ts.map +1 -0
  130. package/lib/components/canvas/CubeNodeEditorAnchor.js +51 -0
  131. package/lib/components/canvas/CubeNodeEditorAnchor.js.map +1 -0
  132. package/lib/components/editors/CubeAggregationRowEditor.d.ts +48 -0
  133. package/lib/components/editors/CubeAggregationRowEditor.d.ts.map +1 -0
  134. package/lib/components/editors/CubeAggregationRowEditor.js +72 -0
  135. package/lib/components/editors/CubeAggregationRowEditor.js.map +1 -0
  136. package/lib/components/editors/CubeColumnChecklist.d.ts +42 -0
  137. package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -0
  138. package/lib/components/editors/CubeColumnChecklist.js +41 -0
  139. package/lib/components/editors/CubeColumnChecklist.js.map +1 -0
  140. package/lib/components/editors/CubeConcatEditor.d.ts +33 -0
  141. package/lib/components/editors/CubeConcatEditor.d.ts.map +1 -0
  142. package/lib/components/editors/CubeConcatEditor.js +147 -0
  143. package/lib/components/editors/CubeConcatEditor.js.map +1 -0
  144. package/lib/components/editors/CubeDataProductSourceEditor.d.ts +25 -0
  145. package/lib/components/editors/CubeDataProductSourceEditor.d.ts.map +1 -0
  146. package/lib/components/editors/CubeDataProductSourceEditor.js +53 -0
  147. package/lib/components/editors/CubeDataProductSourceEditor.js.map +1 -0
  148. package/lib/components/editors/CubeDifferenceEditor.d.ts +25 -0
  149. package/lib/components/editors/CubeDifferenceEditor.d.ts.map +1 -0
  150. package/lib/components/editors/CubeDifferenceEditor.js +29 -0
  151. package/lib/components/editors/CubeDifferenceEditor.js.map +1 -0
  152. package/lib/components/editors/CubeExtendEditor.d.ts +25 -0
  153. package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -0
  154. package/lib/components/editors/CubeExtendEditor.js +86 -0
  155. package/lib/components/editors/CubeExtendEditor.js.map +1 -0
  156. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
  157. package/lib/components/editors/CubeFilterEditor.js +3 -3
  158. package/lib/components/editors/CubeFilterEditor.js.map +1 -1
  159. package/lib/components/editors/CubeGroupEditor.d.ts +28 -0
  160. package/lib/components/editors/CubeGroupEditor.d.ts.map +1 -0
  161. package/lib/components/editors/CubeGroupEditor.js +70 -0
  162. package/lib/components/editors/CubeGroupEditor.js.map +1 -0
  163. package/lib/components/editors/CubeIngestSourceEditor.d.ts +26 -0
  164. package/lib/components/editors/CubeIngestSourceEditor.d.ts.map +1 -0
  165. package/lib/components/editors/CubeIngestSourceEditor.js +47 -0
  166. package/lib/components/editors/CubeIngestSourceEditor.js.map +1 -0
  167. package/lib/components/editors/CubeJoinEditor.d.ts +2 -4
  168. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
  169. package/lib/components/editors/CubeJoinEditor.js +7 -37
  170. package/lib/components/editors/CubeJoinEditor.js.map +1 -1
  171. package/lib/components/editors/CubeJoinKeyRows.d.ts +34 -0
  172. package/lib/components/editors/CubeJoinKeyRows.d.ts.map +1 -0
  173. package/lib/components/editors/CubeJoinKeyRows.js +65 -0
  174. package/lib/components/editors/CubeJoinKeyRows.js.map +1 -0
  175. package/lib/components/editors/CubeNodeEditorPanel.d.ts +7 -5
  176. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
  177. package/lib/components/editors/CubeNodeEditorPanel.js +51 -13
  178. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
  179. package/lib/components/editors/CubeNodeEditorPopper.d.ts +40 -0
  180. package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -0
  181. package/lib/components/editors/CubeNodeEditorPopper.js +125 -0
  182. package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -0
  183. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
  184. package/lib/components/editors/CubeNodeEditorRegistry.js +15 -1
  185. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
  186. package/lib/components/editors/CubePartitionEditor.d.ts +30 -0
  187. package/lib/components/editors/CubePartitionEditor.d.ts.map +1 -0
  188. package/lib/components/editors/CubePartitionEditor.js +93 -0
  189. package/lib/components/editors/CubePartitionEditor.js.map +1 -0
  190. package/lib/components/editors/CubeRenameEditor.d.ts.map +1 -1
  191. package/lib/components/editors/CubeRenameEditor.js +6 -4
  192. package/lib/components/editors/CubeRenameEditor.js.map +1 -1
  193. package/lib/components/editors/CubeRestrictEditor.js +1 -1
  194. package/lib/components/editors/CubeRestrictEditor.js.map +1 -1
  195. package/lib/components/editors/CubeSortEditor.d.ts.map +1 -1
  196. package/lib/components/editors/CubeSortEditor.js +10 -37
  197. package/lib/components/editors/CubeSortEditor.js.map +1 -1
  198. package/lib/components/editors/CubeSortRowEditor.d.ts +47 -0
  199. package/lib/components/editors/CubeSortRowEditor.d.ts.map +1 -0
  200. package/lib/components/editors/CubeSortRowEditor.js +62 -0
  201. package/lib/components/editors/CubeSortRowEditor.js.map +1 -0
  202. package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -1
  203. package/lib/components/editors/CubeSourceEditor.js +18 -5
  204. package/lib/components/editors/CubeSourceEditor.js.map +1 -1
  205. package/lib/components/editors/CubeWarehouseControl.d.ts +30 -0
  206. package/lib/components/editors/CubeWarehouseControl.d.ts.map +1 -0
  207. package/lib/components/editors/CubeWarehouseControl.js +44 -0
  208. package/lib/components/editors/CubeWarehouseControl.js.map +1 -0
  209. package/lib/components/editors/useCubeNodeEditorDismiss.d.ts +31 -0
  210. package/lib/components/editors/useCubeNodeEditorDismiss.d.ts.map +1 -0
  211. package/lib/components/editors/useCubeNodeEditorDismiss.js +83 -0
  212. package/lib/components/editors/useCubeNodeEditorDismiss.js.map +1 -0
  213. package/lib/components/examples/CubeExamplesDialog.d.ts +26 -0
  214. package/lib/components/examples/CubeExamplesDialog.d.ts.map +1 -0
  215. package/lib/components/examples/CubeExamplesDialog.js +68 -0
  216. package/lib/components/examples/CubeExamplesDialog.js.map +1 -0
  217. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
  218. package/lib/components/grid/CubeGridRegion.js +19 -8
  219. package/lib/components/grid/CubeGridRegion.js.map +1 -1
  220. package/lib/components/grid/CubeGridValues.d.ts +16 -0
  221. package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
  222. package/lib/components/grid/CubeGridValues.js +44 -0
  223. package/lib/components/grid/CubeGridValues.js.map +1 -1
  224. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
  225. package/lib/components/grid/CubeResultGrid.js +14 -2
  226. package/lib/components/grid/CubeResultGrid.js.map +1 -1
  227. package/lib/components/palette/CubePalette.d.ts.map +1 -1
  228. package/lib/components/palette/CubePalette.js +23 -12
  229. package/lib/components/palette/CubePalette.js.map +1 -1
  230. package/lib/components/source-picker/CubeDataProductTab.d.ts +27 -0
  231. package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -0
  232. package/lib/components/source-picker/CubeDataProductTab.js +102 -0
  233. package/lib/components/source-picker/CubeDataProductTab.js.map +1 -0
  234. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts +27 -0
  235. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -0
  236. package/lib/components/source-picker/CubeDirectConnectionTab.js +87 -0
  237. package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -0
  238. package/lib/components/source-picker/CubeIngestTab.d.ts +28 -0
  239. package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -0
  240. package/lib/components/source-picker/CubeIngestTab.js +66 -0
  241. package/lib/components/source-picker/CubeIngestTab.js.map +1 -0
  242. package/lib/components/source-picker/CubeInlineModelTab.d.ts +37 -0
  243. package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -0
  244. package/lib/components/source-picker/CubeInlineModelTab.js +71 -0
  245. package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -0
  246. package/lib/components/source-picker/CubePickerStep.d.ts +27 -0
  247. package/lib/components/source-picker/CubePickerStep.d.ts.map +1 -0
  248. package/lib/components/source-picker/CubePickerStep.js +23 -0
  249. package/lib/components/source-picker/CubePickerStep.js.map +1 -0
  250. package/lib/components/source-picker/CubeProjectTab.d.ts +27 -0
  251. package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -0
  252. package/lib/components/source-picker/CubeProjectTab.js +50 -0
  253. package/lib/components/source-picker/CubeProjectTab.js.map +1 -0
  254. package/lib/components/source-picker/CubeSourcePicker.d.ts +6 -0
  255. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
  256. package/lib/components/source-picker/CubeSourcePicker.js +20 -58
  257. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
  258. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +1 -1
  259. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
  260. package/lib/graph-manager/CubeConnectionExplorer.d.ts +90 -0
  261. package/lib/graph-manager/CubeConnectionExplorer.d.ts.map +1 -0
  262. package/lib/graph-manager/CubeConnectionExplorer.js +34 -0
  263. package/lib/graph-manager/CubeConnectionExplorer.js.map +1 -0
  264. package/lib/graph-manager/CubeDataProduct.d.ts +66 -0
  265. package/lib/graph-manager/CubeDataProduct.d.ts.map +1 -0
  266. package/lib/graph-manager/CubeDataProduct.js +102 -0
  267. package/lib/graph-manager/CubeDataProduct.js.map +1 -0
  268. package/lib/graph-manager/CubeDataProductCatalog.d.ts +167 -0
  269. package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -0
  270. package/lib/graph-manager/CubeDataProductCatalog.js +116 -0
  271. package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -0
  272. package/lib/graph-manager/CubeDirectConnection.d.ts +38 -0
  273. package/lib/graph-manager/CubeDirectConnection.d.ts.map +1 -0
  274. package/lib/graph-manager/CubeDirectConnection.js +48 -0
  275. package/lib/graph-manager/CubeDirectConnection.js.map +1 -0
  276. package/lib/graph-manager/CubeEngine.d.ts +37 -2
  277. package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
  278. package/lib/graph-manager/CubeEngine.js +4 -1
  279. package/lib/graph-manager/CubeEngine.js.map +1 -1
  280. package/lib/graph-manager/CubeIngest.d.ts +50 -0
  281. package/lib/graph-manager/CubeIngest.d.ts.map +1 -0
  282. package/lib/graph-manager/CubeIngest.js +88 -0
  283. package/lib/graph-manager/CubeIngest.js.map +1 -0
  284. package/lib/graph-manager/CubeIngestCatalog.d.ts +116 -0
  285. package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -0
  286. package/lib/graph-manager/CubeIngestCatalog.js +80 -0
  287. package/lib/graph-manager/CubeIngestCatalog.js.map +1 -0
  288. package/lib/graph-manager/CubeLakehouseEnvironment.d.ts +26 -0
  289. package/lib/graph-manager/CubeLakehouseEnvironment.d.ts.map +1 -0
  290. package/lib/graph-manager/CubeLakehouseEnvironment.js +17 -0
  291. package/lib/graph-manager/CubeLakehouseEnvironment.js.map +1 -0
  292. package/lib/graph-manager/CubeProject.d.ts +41 -0
  293. package/lib/graph-manager/CubeProject.d.ts.map +1 -0
  294. package/lib/graph-manager/CubeProject.js +84 -0
  295. package/lib/graph-manager/CubeProject.js.map +1 -0
  296. package/lib/graph-manager/CubeProjectCatalog.d.ts +35 -0
  297. package/lib/graph-manager/CubeProjectCatalog.d.ts.map +1 -0
  298. package/lib/graph-manager/CubeProjectCatalog.js +17 -0
  299. package/lib/graph-manager/CubeProjectCatalog.js.map +1 -0
  300. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +63 -1
  301. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
  302. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +50 -1
  303. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
  304. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts +44 -0
  305. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts.map +1 -0
  306. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js +192 -0
  307. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js.map +1 -0
  308. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +29 -0
  309. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -0
  310. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +84 -0
  311. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -0
  312. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts +41 -0
  313. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts.map +1 -0
  314. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js +246 -0
  315. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js.map +1 -0
  316. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts +43 -0
  317. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts.map +1 -0
  318. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js +112 -0
  319. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js.map +1 -0
  320. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -1
  321. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +30 -4
  322. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -1
  323. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts +23 -0
  324. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts.map +1 -0
  325. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js +68 -0
  326. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js.map +1 -0
  327. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts +30 -0
  328. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -0
  329. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +140 -0
  330. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -0
  331. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +62 -0
  332. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -0
  333. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +119 -0
  334. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -0
  335. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts +33 -0
  336. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts.map +1 -0
  337. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js +94 -0
  338. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js.map +1 -0
  339. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
  340. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +63 -4
  341. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
  342. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts +67 -0
  343. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts.map +1 -0
  344. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js +238 -0
  345. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js.map +1 -0
  346. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +34 -0
  347. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -0
  348. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +64 -0
  349. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -0
  350. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts +104 -0
  351. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts.map +1 -0
  352. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js +484 -0
  353. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js.map +1 -0
  354. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +97 -3
  355. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
  356. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +585 -20
  357. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
  358. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts +69 -0
  359. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts.map +1 -0
  360. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js +270 -0
  361. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js.map +1 -0
  362. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts +35 -0
  363. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -0
  364. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +91 -0
  365. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -0
  366. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts +25 -0
  367. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts.map +1 -0
  368. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js +47 -0
  369. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js.map +1 -0
  370. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts +28 -0
  371. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts.map +1 -0
  372. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js +310 -0
  373. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js.map +1 -0
  374. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts +33 -0
  375. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts.map +1 -0
  376. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js +188 -0
  377. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js.map +1 -0
  378. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +1 -1
  379. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
  380. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +27 -1
  381. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
  382. package/lib/index.css +2 -2
  383. package/lib/index.css.map +1 -1
  384. package/lib/index.d.ts +11 -1
  385. package/lib/index.d.ts.map +1 -1
  386. package/lib/index.js +10 -1
  387. package/lib/index.js.map +1 -1
  388. package/lib/stores/CubeAddPlacement.d.ts +32 -0
  389. package/lib/stores/CubeAddPlacement.d.ts.map +1 -0
  390. package/lib/stores/CubeAddPlacement.js +40 -0
  391. package/lib/stores/CubeAddPlacement.js.map +1 -0
  392. package/lib/stores/CubeDataProductRecheck.d.ts +27 -0
  393. package/lib/stores/CubeDataProductRecheck.d.ts.map +1 -0
  394. package/lib/stores/CubeDataProductRecheck.js +54 -0
  395. package/lib/stores/CubeDataProductRecheck.js.map +1 -0
  396. package/lib/stores/CubeDataProductRuntimeState.d.ts +88 -0
  397. package/lib/stores/CubeDataProductRuntimeState.d.ts.map +1 -0
  398. package/lib/stores/CubeDataProductRuntimeState.js +190 -0
  399. package/lib/stores/CubeDataProductRuntimeState.js.map +1 -0
  400. package/lib/stores/CubeDataProductWarehouse.d.ts +19 -0
  401. package/lib/stores/CubeDataProductWarehouse.d.ts.map +1 -0
  402. package/lib/stores/CubeDataProductWarehouse.js +25 -0
  403. package/lib/stores/CubeDataProductWarehouse.js.map +1 -0
  404. package/lib/stores/CubeEditorState.d.ts +100 -16
  405. package/lib/stores/CubeEditorState.d.ts.map +1 -1
  406. package/lib/stores/CubeEditorState.js +347 -47
  407. package/lib/stores/CubeEditorState.js.map +1 -1
  408. package/lib/stores/CubeEntrySource.d.ts +78 -0
  409. package/lib/stores/CubeEntrySource.d.ts.map +1 -0
  410. package/lib/stores/CubeEntrySource.js +200 -0
  411. package/lib/stores/CubeEntrySource.js.map +1 -0
  412. package/lib/stores/CubeExamples.d.ts +43 -0
  413. package/lib/stores/CubeExamples.d.ts.map +1 -0
  414. package/lib/stores/CubeExamples.js +296 -0
  415. package/lib/stores/CubeExamples.js.map +1 -0
  416. package/lib/stores/CubeExamplesState.d.ts +45 -0
  417. package/lib/stores/CubeExamplesState.d.ts.map +1 -0
  418. package/lib/stores/CubeExamplesState.js +81 -0
  419. package/lib/stores/CubeExamplesState.js.map +1 -0
  420. package/lib/stores/CubeExecutionState.d.ts +6 -2
  421. package/lib/stores/CubeExecutionState.d.ts.map +1 -1
  422. package/lib/stores/CubeExecutionState.js +15 -5
  423. package/lib/stores/CubeExecutionState.js.map +1 -1
  424. package/lib/stores/CubeExtendTyping.d.ts +72 -0
  425. package/lib/stores/CubeExtendTyping.d.ts.map +1 -0
  426. package/lib/stores/CubeExtendTyping.js +176 -0
  427. package/lib/stores/CubeExtendTyping.js.map +1 -0
  428. package/lib/stores/CubeGridQuickActions.d.ts +14 -6
  429. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -1
  430. package/lib/stores/CubeGridQuickActions.js +53 -15
  431. package/lib/stores/CubeGridQuickActions.js.map +1 -1
  432. package/lib/stores/CubeHost.d.ts +32 -1
  433. package/lib/stores/CubeHost.d.ts.map +1 -1
  434. package/lib/stores/CubeHost.js +21 -1
  435. package/lib/stores/CubeHost.js.map +1 -1
  436. package/lib/stores/CubeIngestRecheck.d.ts +26 -0
  437. package/lib/stores/CubeIngestRecheck.d.ts.map +1 -0
  438. package/lib/stores/CubeIngestRecheck.js +53 -0
  439. package/lib/stores/CubeIngestRecheck.js.map +1 -0
  440. package/lib/stores/CubeNodeEditorState.d.ts +101 -5
  441. package/lib/stores/CubeNodeEditorState.d.ts.map +1 -1
  442. package/lib/stores/CubeNodeEditorState.js +221 -10
  443. package/lib/stores/CubeNodeEditorState.js.map +1 -1
  444. package/lib/stores/CubeShowPureState.d.ts +5 -2
  445. package/lib/stores/CubeShowPureState.d.ts.map +1 -1
  446. package/lib/stores/CubeShowPureState.js +7 -4
  447. package/lib/stores/CubeShowPureState.js.map +1 -1
  448. package/lib/stores/CubeSourcePickerState.d.ts +54 -65
  449. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
  450. package/lib/stores/CubeSourcePickerState.js +155 -276
  451. package/lib/stores/CubeSourcePickerState.js.map +1 -1
  452. package/lib/stores/CubeSpecTransferState.d.ts +2 -2
  453. package/lib/stores/CubeSpecTransferState.js +2 -2
  454. package/lib/stores/LocalModelCatalog.d.ts +2 -0
  455. package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
  456. package/lib/stores/LocalModelCatalog.js +17 -3
  457. package/lib/stores/LocalModelCatalog.js.map +1 -1
  458. package/lib/stores/editors/CubeAggregationRows.d.ts +80 -0
  459. package/lib/stores/editors/CubeAggregationRows.d.ts.map +1 -0
  460. package/lib/stores/editors/CubeAggregationRows.js +164 -0
  461. package/lib/stores/editors/CubeAggregationRows.js.map +1 -0
  462. package/lib/stores/editors/CubeConcatDraft.d.ts +30 -0
  463. package/lib/stores/editors/CubeConcatDraft.d.ts.map +1 -0
  464. package/lib/stores/editors/CubeConcatDraft.js +44 -0
  465. package/lib/stores/editors/CubeConcatDraft.js.map +1 -0
  466. package/lib/stores/editors/CubeDifferenceDraft.d.ts +49 -0
  467. package/lib/stores/editors/CubeDifferenceDraft.d.ts.map +1 -0
  468. package/lib/stores/editors/CubeDifferenceDraft.js +111 -0
  469. package/lib/stores/editors/CubeDifferenceDraft.js.map +1 -0
  470. package/lib/stores/editors/CubeExtendDraft.d.ts +110 -0
  471. package/lib/stores/editors/CubeExtendDraft.d.ts.map +1 -0
  472. package/lib/stores/editors/CubeExtendDraft.js +359 -0
  473. package/lib/stores/editors/CubeExtendDraft.js.map +1 -0
  474. package/lib/stores/editors/CubeGroupDraft.d.ts +61 -0
  475. package/lib/stores/editors/CubeGroupDraft.d.ts.map +1 -0
  476. package/lib/stores/editors/CubeGroupDraft.js +106 -0
  477. package/lib/stores/editors/CubeGroupDraft.js.map +1 -0
  478. package/lib/stores/editors/CubeJoinDraft.d.ts +9 -10
  479. package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -1
  480. package/lib/stores/editors/CubeJoinDraft.js +92 -21
  481. package/lib/stores/editors/CubeJoinDraft.js.map +1 -1
  482. package/lib/stores/editors/CubeJoinKeyPairs.d.ts +38 -0
  483. package/lib/stores/editors/CubeJoinKeyPairs.d.ts.map +1 -0
  484. package/lib/stores/editors/CubeJoinKeyPairs.js +33 -0
  485. package/lib/stores/editors/CubeJoinKeyPairs.js.map +1 -0
  486. package/lib/stores/editors/CubeNodeDraft.d.ts +20 -6
  487. package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -1
  488. package/lib/stores/editors/CubeNodeDraft.js +23 -5
  489. package/lib/stores/editors/CubeNodeDraft.js.map +1 -1
  490. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
  491. package/lib/stores/editors/CubeNodeDraftRegistry.js +20 -1
  492. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
  493. package/lib/stores/editors/CubePartitionDraft.d.ts +70 -0
  494. package/lib/stores/editors/CubePartitionDraft.d.ts.map +1 -0
  495. package/lib/stores/editors/CubePartitionDraft.js +154 -0
  496. package/lib/stores/editors/CubePartitionDraft.js.map +1 -0
  497. package/lib/stores/editors/CubeSortDraft.d.ts +2 -10
  498. package/lib/stores/editors/CubeSortDraft.d.ts.map +1 -1
  499. package/lib/stores/editors/CubeSortDraft.js +9 -35
  500. package/lib/stores/editors/CubeSortDraft.js.map +1 -1
  501. package/lib/stores/editors/CubeSortRows.d.ts +34 -0
  502. package/lib/stores/editors/CubeSortRows.d.ts.map +1 -0
  503. package/lib/stores/editors/CubeSortRows.js +50 -0
  504. package/lib/stores/editors/CubeSortRows.js.map +1 -0
  505. package/lib/stores/fixtures/CubeNorthwindModel.d.ts +7 -0
  506. package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -1
  507. package/lib/stores/fixtures/CubeNorthwindModel.js +99 -87
  508. package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -1
  509. package/lib/stores/fixtures/CubeSampleSql.d.ts +34 -0
  510. package/lib/stores/fixtures/CubeSampleSql.d.ts.map +1 -0
  511. package/lib/stores/fixtures/CubeSampleSql.js +64 -0
  512. package/lib/stores/fixtures/CubeSampleSql.js.map +1 -0
  513. package/lib/stores/fixtures/CubeSportsModel.d.ts +27 -0
  514. package/lib/stores/fixtures/CubeSportsModel.d.ts.map +1 -0
  515. package/lib/stores/fixtures/CubeSportsModel.js +158 -0
  516. package/lib/stores/fixtures/CubeSportsModel.js.map +1 -0
  517. package/lib/stores/fixtures/CubeTradesModel.d.ts +29 -0
  518. package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -0
  519. package/lib/stores/fixtures/CubeTradesModel.js +197 -0
  520. package/lib/stores/fixtures/CubeTradesModel.js.map +1 -0
  521. package/lib/stores/source-picker/CubeCsvSetupSql.d.ts +71 -0
  522. package/lib/stores/source-picker/CubeCsvSetupSql.d.ts.map +1 -0
  523. package/lib/stores/source-picker/CubeCsvSetupSql.js +392 -0
  524. package/lib/stores/source-picker/CubeCsvSetupSql.js.map +1 -0
  525. package/lib/stores/source-picker/CubeDataProductTabState.d.ts +186 -0
  526. package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -0
  527. package/lib/stores/source-picker/CubeDataProductTabState.js +681 -0
  528. package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -0
  529. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +140 -0
  530. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -0
  531. package/lib/stores/source-picker/CubeDirectConnectionTabState.js +516 -0
  532. package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -0
  533. package/lib/stores/source-picker/CubeIngestTabState.d.ts +114 -0
  534. package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -0
  535. package/lib/stores/source-picker/CubeIngestTabState.js +455 -0
  536. package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -0
  537. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +107 -0
  538. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -0
  539. package/lib/stores/source-picker/CubeInlineModelTabState.js +347 -0
  540. package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -0
  541. package/lib/stores/source-picker/CubeProjectTabState.d.ts +62 -0
  542. package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -0
  543. package/lib/stores/source-picker/CubeProjectTabState.js +181 -0
  544. package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -0
  545. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +48 -0
  546. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -0
  547. package/lib/stores/source-picker/CubeSourcePickerTab.js +24 -0
  548. package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -0
  549. package/package.json +10 -6
  550. package/src/__lib__/LegendCubeCommand.ts +5 -0
  551. package/src/__lib__/LegendCubeDataProductLabels.ts +91 -0
  552. package/src/__lib__/LegendCubeDirectConnectionLabels.ts +111 -0
  553. package/src/__lib__/LegendCubeHelpText.ts +25 -1
  554. package/src/__lib__/LegendCubeIngestLabels.ts +40 -0
  555. package/src/__lib__/LegendCubeLabels.ts +162 -4
  556. package/src/__lib__/LegendCubeProjectLabels.ts +25 -0
  557. package/src/__lib__/LegendCubeTesting.ts +1 -0
  558. package/src/__test-utils__/CubeCanvasTestUtils.ts +1 -1
  559. package/src/__test-utils__/CubeConnectionTestSupport.ts +45 -0
  560. package/src/__test-utils__/CubeDirectConnectionFixtures.ts +70 -0
  561. package/src/__test-utils__/CubeEngineTestSupport.ts +38 -0
  562. package/src/__test-utils__/CubeExpressionTestUtils.ts +119 -0
  563. package/src/__test-utils__/CubeOperationsTestUtils.ts +93 -18
  564. package/src/__test-utils__/CubePageTestUtils.tsx +35 -0
  565. package/src/__test-utils__/CubeTestApplication.ts +21 -2
  566. package/src/__test-utils__/FakeCubeConnectionExplorer.ts +111 -0
  567. package/src/__test-utils__/FakeCubeDataProductCatalog.ts +227 -0
  568. package/src/__test-utils__/FakeCubeEngine.ts +25 -1
  569. package/src/__test-utils__/FakeCubeIngestCatalog.ts +180 -0
  570. package/src/__test-utils__/FakeCubeProjectCatalog.ts +89 -0
  571. package/src/components/CubeAddItems.tsx +179 -0
  572. package/src/components/CubeEditor.tsx +73 -44
  573. package/src/components/CubeEntrySourceBanner.tsx +64 -0
  574. package/src/components/CubeNodeIcon.tsx +13 -0
  575. package/src/components/CubeSchemaColumnsTable.tsx +49 -0
  576. package/src/components/canvas/CubeCanvas.tsx +49 -14
  577. package/src/components/canvas/CubeCanvasContextMenu.tsx +31 -30
  578. package/src/components/canvas/CubeCanvasDnd.ts +16 -9
  579. package/src/components/canvas/CubeCanvasElements.ts +8 -2
  580. package/src/components/canvas/CubeCanvasNode.tsx +61 -43
  581. package/src/components/canvas/CubeCanvasNodeFocus.ts +37 -0
  582. package/src/components/canvas/CubeNodeEditorAnchor.ts +82 -0
  583. package/src/components/editors/CubeAggregationRowEditor.tsx +224 -0
  584. package/src/components/editors/CubeColumnChecklist.tsx +130 -0
  585. package/src/components/editors/CubeConcatEditor.tsx +374 -0
  586. package/src/components/editors/CubeDataProductSourceEditor.tsx +134 -0
  587. package/src/components/editors/CubeDifferenceEditor.tsx +87 -0
  588. package/src/components/editors/CubeExtendEditor.tsx +271 -0
  589. package/src/components/editors/CubeFilterEditor.tsx +7 -0
  590. package/src/components/editors/CubeGroupEditor.tsx +135 -0
  591. package/src/components/editors/CubeIngestSourceEditor.tsx +104 -0
  592. package/src/components/editors/CubeJoinEditor.tsx +12 -132
  593. package/src/components/editors/CubeJoinKeyRows.tsx +183 -0
  594. package/src/components/editors/CubeNodeEditorPanel.tsx +91 -28
  595. package/src/components/editors/CubeNodeEditorPopper.tsx +183 -0
  596. package/src/components/editors/CubeNodeEditorRegistry.ts +21 -0
  597. package/src/components/editors/CubePartitionEditor.tsx +208 -0
  598. package/src/components/editors/CubeRenameEditor.tsx +10 -5
  599. package/src/components/editors/CubeRestrictEditor.tsx +1 -1
  600. package/src/components/editors/CubeSortEditor.tsx +20 -142
  601. package/src/components/editors/CubeSortRowEditor.tsx +176 -0
  602. package/src/components/editors/CubeSourceEditor.tsx +42 -30
  603. package/src/components/editors/CubeWarehouseControl.tsx +113 -0
  604. package/src/components/editors/useCubeNodeEditorDismiss.ts +103 -0
  605. package/src/components/examples/CubeExamplesDialog.tsx +199 -0
  606. package/src/components/grid/CubeGridRegion.tsx +48 -10
  607. package/src/components/grid/CubeGridValues.ts +55 -0
  608. package/src/components/grid/CubeResultGrid.tsx +24 -8
  609. package/src/components/palette/CubePalette.tsx +33 -15
  610. package/src/components/source-picker/CubeDataProductTab.tsx +392 -0
  611. package/src/components/source-picker/CubeDirectConnectionTab.tsx +340 -0
  612. package/src/components/source-picker/CubeIngestTab.tsx +232 -0
  613. package/src/components/source-picker/CubeInlineModelTab.tsx +191 -0
  614. package/src/components/source-picker/CubePickerStep.tsx +49 -0
  615. package/src/components/source-picker/CubeProjectTab.tsx +114 -0
  616. package/src/components/source-picker/CubeSourcePicker.tsx +62 -227
  617. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +1 -1
  618. package/src/graph-manager/CubeConnectionExplorer.ts +106 -0
  619. package/src/graph-manager/CubeDataProduct.ts +150 -0
  620. package/src/graph-manager/CubeDataProductCatalog.ts +245 -0
  621. package/src/graph-manager/CubeDirectConnection.ts +67 -0
  622. package/src/graph-manager/CubeEngine.ts +43 -1
  623. package/src/graph-manager/CubeIngest.ts +144 -0
  624. package/src/graph-manager/CubeIngestCatalog.ts +169 -0
  625. package/src/graph-manager/CubeLakehouseEnvironment.ts +27 -0
  626. package/src/graph-manager/CubeProject.ts +117 -0
  627. package/src/graph-manager/CubeProjectCatalog.ts +40 -0
  628. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +145 -1
  629. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.ts +251 -0
  630. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +101 -0
  631. package/src/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.ts +339 -0
  632. package/src/graph-manager/protocol/pure/v1/V1_CubeDirectModel.ts +151 -0
  633. package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +45 -4
  634. package/src/graph-manager/protocol/pure/v1/V1_CubeExpression.ts +89 -0
  635. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +201 -0
  636. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +183 -0
  637. package/src/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.ts +141 -0
  638. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +84 -4
  639. package/src/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.ts +361 -0
  640. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +116 -0
  641. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.ts +744 -0
  642. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +967 -24
  643. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.ts +459 -0
  644. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +147 -0
  645. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.ts +61 -0
  646. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.ts +337 -0
  647. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.ts +206 -0
  648. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +42 -1
  649. package/src/index.ts +20 -0
  650. package/src/stores/CubeAddPlacement.ts +67 -0
  651. package/src/stores/CubeDataProductRecheck.ts +93 -0
  652. package/src/stores/CubeDataProductRuntimeState.ts +256 -0
  653. package/src/stores/CubeDataProductWarehouse.ts +40 -0
  654. package/src/stores/CubeEditorState.ts +511 -63
  655. package/src/stores/CubeEntrySource.ts +278 -0
  656. package/src/stores/CubeExamples.ts +457 -0
  657. package/src/stores/CubeExamplesState.ts +108 -0
  658. package/src/stores/CubeExecutionState.ts +24 -5
  659. package/src/stores/CubeExtendTyping.ts +291 -0
  660. package/src/stores/CubeGridQuickActions.ts +69 -14
  661. package/src/stores/CubeHost.ts +71 -1
  662. package/src/stores/CubeIngestRecheck.ts +92 -0
  663. package/src/stores/CubeNodeEditorState.ts +278 -9
  664. package/src/stores/CubeShowPureState.ts +7 -4
  665. package/src/stores/CubeSourcePickerState.ts +160 -330
  666. package/src/stores/CubeSpecTransferState.ts +2 -2
  667. package/src/stores/LocalModelCatalog.ts +22 -3
  668. package/src/stores/editors/CubeAggregationRows.ts +299 -0
  669. package/src/stores/editors/CubeConcatDraft.ts +49 -0
  670. package/src/stores/editors/CubeDifferenceDraft.ts +147 -0
  671. package/src/stores/editors/CubeExtendDraft.ts +532 -0
  672. package/src/stores/editors/CubeGroupDraft.ts +145 -0
  673. package/src/stores/editors/CubeJoinDraft.ts +130 -41
  674. package/src/stores/editors/CubeJoinKeyPairs.ts +68 -0
  675. package/src/stores/editors/CubeNodeDraft.ts +26 -6
  676. package/src/stores/editors/CubeNodeDraftRegistry.ts +25 -0
  677. package/src/stores/editors/CubePartitionDraft.ts +214 -0
  678. package/src/stores/editors/CubeSortDraft.ts +17 -54
  679. package/src/stores/editors/CubeSortRows.ts +84 -0
  680. package/src/stores/fixtures/CubeNorthwindModel.ts +103 -88
  681. package/src/stores/fixtures/CubeSampleSql.ts +85 -0
  682. package/src/stores/fixtures/CubeSportsModel.ts +182 -0
  683. package/src/stores/fixtures/CubeTradesModel.ts +241 -0
  684. package/src/stores/source-picker/CubeCsvSetupSql.ts +444 -0
  685. package/src/stores/source-picker/CubeDataProductTabState.ts +839 -0
  686. package/src/stores/source-picker/CubeDirectConnectionTabState.ts +647 -0
  687. package/src/stores/source-picker/CubeIngestTabState.ts +551 -0
  688. package/src/stores/source-picker/CubeInlineModelTabState.ts +448 -0
  689. package/src/stores/source-picker/CubeProjectTabState.ts +218 -0
  690. package/src/stores/source-picker/CubeSourcePickerTab.ts +50 -0
  691. package/tsconfig.json +89 -0
@@ -15,11 +15,16 @@
15
15
  */
16
16
 
17
17
  import {
18
+ DataProductAccessPointSource,
19
+ IngestDatasetSource,
18
20
  buildSchemasAndValidity,
19
21
  createNodeRegistry,
20
22
  CubeDocument,
21
23
  diffSchemas,
24
+ Extend,
22
25
  findLostSortOrders,
26
+ isTypingError,
27
+ type JsonObject,
23
28
  MESSAGE_SORT_COLUMNS_CUT,
24
29
  MESSAGE_SORT_COLUMNS_DROPPED,
25
30
  MESSAGE_SORT_ORDER_LOST,
@@ -28,10 +33,12 @@ import {
28
33
  type Query,
29
34
  QueryEmitter,
30
35
  type QueryNode,
36
+ type QueryRule,
31
37
  RelationalTableSource,
32
38
  rereadQueryFilterValues,
33
39
  type Schema,
34
40
  type SchemaInferenceResult,
41
+ type SourceDefinition,
35
42
  } from '@finos/legend-cube';
36
43
  import type { CommandRegistrar } from '@finos/legend-application';
37
44
  import type { GeneratorFn } from '@finos/legend-shared';
@@ -40,26 +47,57 @@ import {
40
47
  computed,
41
48
  flow,
42
49
  flowResult,
50
+ type IReactionDisposer,
43
51
  makeObservable,
44
52
  observable,
53
+ reaction,
45
54
  } from 'mobx';
46
55
  import { LEGEND_CUBE_COMMAND_KEY } from '../__lib__/LegendCubeCommand.js';
56
+ import { LEGEND_CUBE_TEST_ID } from '../__lib__/LegendCubeTesting.js';
47
57
  import {
48
58
  CUBE_EDITOR_CLOSED_REASON,
49
59
  DEFAULT_ROW_LIMIT,
50
60
  getSchemaDriftWarning,
61
+ getExtendRetypeWarning,
51
62
  getSourceRecheckWarning,
52
63
  LEGEND_CUBE_USER_DATA_KEY,
53
64
  MAX_UNDO_STEPS,
54
65
  } from '../__lib__/LegendCubeLabels.js';
66
+ import {
67
+ CUBE_DATA_PRODUCT_RECHECK_MESSAGE,
68
+ getAccessPointDriftWarning,
69
+ getAccessPointRecheckWarning,
70
+ } from '../__lib__/LegendCubeDataProductLabels.js';
71
+ import {
72
+ CUBE_INGEST_RECHECK_MESSAGE,
73
+ getDataSetDriftWarning,
74
+ getDataSetRecheckWarning,
75
+ } from '../__lib__/LegendCubeIngestLabels.js';
76
+ import { isCubeDataProductModel } from '../graph-manager/CubeDataProduct.js';
77
+ import { isCubeIngestModel } from '../graph-manager/CubeIngest.js';
55
78
  import {
56
79
  CubeEngineError,
57
80
  CubeEngineErrorKind,
58
81
  type CubeModelOutline,
82
+ type NodeId,
59
83
  } from '../graph-manager/CubeEngine.js';
60
84
  import { getDatabaseType } from '../graph-manager/CubeModelOutlineHelper.js';
85
+ import { recheckCubeDataProductSources } from './CubeDataProductRecheck.js';
86
+ import { recheckCubeIngestSources } from './CubeIngestRecheck.js';
87
+ import { CubeDataProductRuntimeState } from './CubeDataProductRuntimeState.js';
88
+ import { CubeExamplesState } from './CubeExamplesState.js';
61
89
  import { CubeExecutionState } from './CubeExecutionState.js';
62
- import type { CubeHost } from './CubeHost.js';
90
+ import { CubeExtendDraft } from './editors/CubeExtendDraft.js';
91
+ import {
92
+ buildCubeExtendTypingLambdas,
93
+ createStaleCubeExtendTypingRule,
94
+ getCubeExtendTypingUpstream,
95
+ getCubeExtendUpstream,
96
+ isCubeExtendTypingCurrent,
97
+ isSameCubeExtendTyping,
98
+ readCubeExtendTyping,
99
+ } from './CubeExtendTyping.js';
100
+ import { type CubeHost, loadCubeModelOutline } from './CubeHost.js';
63
101
  import { CubeNodeEditorState } from './CubeNodeEditorState.js';
64
102
  import { CubeShowPureState } from './CubeShowPureState.js';
65
103
  import { CubeSourcePickerState } from './CubeSourcePickerState.js';
@@ -84,6 +122,18 @@ const isTypingText = (): boolean => {
84
122
  );
85
123
  };
86
124
 
125
+ /** Focus is in the node editor, whose shortcuts give it back to the node (PLAN §11.8) */
126
+ const isFocusInNodeEditor = (): boolean =>
127
+ document.activeElement?.closest(
128
+ `[data-testid="${LEGEND_CUBE_TEST_ID.NODE_EDITOR}"]`,
129
+ ) !== null && document.activeElement !== null;
130
+
131
+ /** A source Cube types again to see drift: a table, or a data product's access point */
132
+ type RecheckedSource =
133
+ | RelationalTableSource
134
+ | DataProductAccessPointSource
135
+ | IngestDatasetSource;
136
+
87
137
  /**
88
138
  * The state of one Cube page (PLAN §7.8). The document is immutable: every
89
139
  * edit makes a new one through `applyDocument`, which keeps the previous one
@@ -94,9 +144,14 @@ export class CubeEditorState implements CommandRegistrar {
94
144
  readonly host: CubeHost;
95
145
  /** One registry for inference, emission and the saved spec */
96
146
  readonly registry: NodeRegistry;
147
+ /** The editor's own query rule: an Extend typed for another input than its own waits to be typed again (PLAN §11.7) */
148
+ private readonly staleExtendTyping: QueryRule;
97
149
  readonly execution: CubeExecutionState;
150
+ /** Where a lakehouse cube runs, a data product's or an ingest one's: its class and warehouse */
151
+ readonly dataProductRuntime: CubeDataProductRuntimeState;
98
152
  readonly sourcePicker: CubeSourcePickerState;
99
153
  readonly specTransfer: CubeSpecTransferState;
154
+ readonly examples: CubeExamplesState;
100
155
  readonly showPure: CubeShowPureState;
101
156
  readonly nodeEditor: CubeNodeEditorState;
102
157
 
@@ -119,6 +174,10 @@ export class CubeEditorState implements CommandRegistrar {
119
174
  new Map();
120
175
  /** Sources sent to the engine to be typed again, until it answers */
121
176
  private pendingSources: ReadonlySet<QueryNode> = new Set();
177
+ /** Extends sent to the engine to be typed, until it answers (PLAN §11.7) */
178
+ private typingExtends: ReadonlySet<QueryNode> = new Set();
179
+ /** Types the Extends that wait for it, whenever one does (PLAN §11.7 Q4) */
180
+ private readonly retyping: IReactionDisposer;
122
181
  /** The rows a run returns; kept per user, never in the cube */
123
182
  rowLimit: number;
124
183
  /** The palette shows icons only; kept per user, never in the cube */
@@ -134,8 +193,15 @@ export class CubeEditorState implements CommandRegistrar {
134
193
  private readonly importedOver = new WeakSet<CubeDocument>();
135
194
 
136
195
  constructor(host: CubeHost, document = new CubeDocument()) {
137
- makeObservable<CubeEditorState, 'pendingSources' | 'modelOutlines'>(this, {
196
+ makeObservable<
197
+ CubeEditorState,
198
+ 'pendingSources' | 'modelOutlines' | 'typingExtends'
199
+ >(this, {
138
200
  pendingSources: observable.ref,
201
+ typingExtends: observable.ref,
202
+ extendsToType: computed,
203
+ isTypingExtends: computed,
204
+ retypeExtends: flow,
139
205
  modelOutlines: observable.ref,
140
206
  modelOutline: computed,
141
207
  loadModelOutline: flow,
@@ -151,6 +217,9 @@ export class CubeEditorState implements CommandRegistrar {
151
217
  analysis: computed,
152
218
  emitter: computed,
153
219
  canUndo: computed,
220
+ hasEditsToApply: computed,
221
+ executeEdited: action,
222
+ undoEdited: action,
154
223
  isDialogOpen: computed,
155
224
  applyDocument: action,
156
225
  undo: action,
@@ -173,6 +242,10 @@ export class CubeEditorState implements CommandRegistrar {
173
242
  });
174
243
  this.host = host;
175
244
  this.registry = createNodeRegistry();
245
+ this.staleExtendTyping = createStaleCubeExtendTypingRule(
246
+ this.registry,
247
+ () => this.document.context?.model,
248
+ );
176
249
  this.document = document;
177
250
  const storedLimit = host.applicationStore.userDataService.getNumericValue(
178
251
  LEGEND_CUBE_USER_DATA_KEY.ROW_LIMIT,
@@ -185,18 +258,35 @@ export class CubeEditorState implements CommandRegistrar {
185
258
  LEGEND_CUBE_USER_DATA_KEY.PALETTE_COLLAPSED,
186
259
  ) ?? false;
187
260
  this.execution = new CubeExecutionState(this);
261
+ this.dataProductRuntime = new CubeDataProductRuntimeState(this);
188
262
  this.sourcePicker = new CubeSourcePickerState(this);
189
263
  this.specTransfer = new CubeSpecTransferState(this);
264
+ this.examples = new CubeExamplesState(this);
190
265
  this.showPure = new CubeShowPureState(this);
191
266
  this.nodeEditor = new CubeNodeEditorState(this);
267
+ this.retyping = reaction(
268
+ () => this.extendsToType,
269
+ (waiting) => {
270
+ if (waiting.length) {
271
+ flowResult(this.retypeExtends(waiting)).catch(
272
+ this.host.applicationStore.alertUnhandledError,
273
+ );
274
+ }
275
+ },
276
+ { fireImmediately: true },
277
+ );
192
278
  }
193
279
 
194
- /** Each node's schema and errors, query-level rules included, as the emitter sees them */
280
+ /**
281
+ * Each node's schema and errors, query-level rules included, as the
282
+ * emitter sees them, and an Extend typed for another input than its own
283
+ * waiting (`ERR_TYPING`), which only the editor can tell
284
+ */
195
285
  get analysis(): SchemaInferenceResult {
196
- return buildSchemasAndValidity(
197
- this.document.query,
198
- this.registry.queryRules,
199
- );
286
+ return buildSchemasAndValidity(this.document.query, [
287
+ ...this.registry.queryRules,
288
+ this.staleExtendTyping,
289
+ ]);
200
290
  }
201
291
 
202
292
  get emitter(): QueryEmitter {
@@ -215,6 +305,160 @@ export class CubeEditorState implements CommandRegistrar {
215
305
  return this.pendingSources.has(node);
216
306
  }
217
307
 
308
+ /**
309
+ * The Extends of the cube shown that wait for the engine to type their
310
+ * columns, their input valid, and that aren't being typed (PLAN §11.7):
311
+ * new expressions, or an input that changed
312
+ */
313
+ get extendsToType(): readonly Extend[] {
314
+ const { validity } = this.analysis;
315
+ return this.document.query.nodes.filter(
316
+ (node): node is Extend =>
317
+ node instanceof Extend &&
318
+ !this.typingExtends.has(node) &&
319
+ (validity.get(node.id) ?? []).some(isTypingError),
320
+ );
321
+ }
322
+
323
+ /** The cube shown has Extends the engine is typing */
324
+ get isTypingExtends(): boolean {
325
+ return this.document.query.nodes.some((node) =>
326
+ this.typingExtends.has(node),
327
+ );
328
+ }
329
+
330
+ /** The node waits for the engine to type it, or is being typed: an Extend (PLAN §11.7) */
331
+ isTypingNode(node: QueryNode): boolean {
332
+ return (
333
+ this.typingExtends.has(node) ||
334
+ (this.analysis.validity.get(node.id) ?? []).some(isTypingError)
335
+ );
336
+ }
337
+
338
+ /**
339
+ * Types Extends' columns with the engine, in one call, outside the undo
340
+ * history (PLAN §11.7 Q4): each for the input it has now, its columns
341
+ * after its input's relation, as typing types any node. The typing goes in
342
+ * place of the very nodes sent, in the cube shown and the undo snapshots
343
+ * that give the engine the same input; one the user changed meanwhile is
344
+ * left to type again. Each typing records the input as the engine was given
345
+ * it (`upstream`). A typing the engine couldn't give names the column it
346
+ * failed on; when the engine can't be reached, a typing still current for
347
+ * the input is kept, with a warning, as a source's saved columns are.
348
+ */
349
+ *retypeExtends(nodes: readonly Extend[]): GeneratorFn<void> {
350
+ const { context, query } = this.document;
351
+ if (!context) {
352
+ return;
353
+ }
354
+ const { schemas } = this.analysis;
355
+ const emitter = new QueryEmitter(query, this.registry);
356
+ const requests = nodes.flatMap((node) => {
357
+ const [inputId] = query.getInputIds(node.id);
358
+ const input = inputId === undefined ? undefined : schemas.get(inputId);
359
+ if (
360
+ query.getNode(node.id) !== node ||
361
+ this.typingExtends.has(node) ||
362
+ !input ||
363
+ node.columns.some(({ lambda }) => lambda === undefined)
364
+ ) {
365
+ return [];
366
+ }
367
+ const columns = node.columns.map(({ name, lambda }) => ({
368
+ name,
369
+ lambda: lambda as JsonObject,
370
+ }));
371
+ return [
372
+ {
373
+ node,
374
+ input,
375
+ columns,
376
+ upstream: getCubeExtendUpstream(emitter, node.id, context.model),
377
+ lambdas: buildCubeExtendTypingLambdas(
378
+ query,
379
+ node,
380
+ columns,
381
+ this.registry,
382
+ false,
383
+ ),
384
+ },
385
+ ];
386
+ });
387
+ if (!requests.length) {
388
+ return;
389
+ }
390
+ const sent = requests.map(({ node }) => node);
391
+ this.typingExtends = new Set([...this.typingExtends, ...sent]);
392
+ let answers: ReadonlyMap<NodeId, Schema | CubeEngineError>;
393
+ try {
394
+ answers = (yield this.host.engine.typeLambdas(
395
+ context.model,
396
+ new Map(requests.flatMap(({ lambdas }) => [...lambdas])),
397
+ )) as ReadonlyMap<NodeId, Schema | CubeEngineError>;
398
+ } catch (error) {
399
+ const failure =
400
+ error instanceof CubeEngineError
401
+ ? error
402
+ : new CubeEngineError(
403
+ CubeEngineErrorKind.NETWORK,
404
+ error instanceof Error ? error.message : String(error),
405
+ );
406
+ answers = new Map(
407
+ requests.flatMap(({ lambdas }) =>
408
+ [...lambdas.keys()].map((key) => [key, failure] as const),
409
+ ),
410
+ );
411
+ } finally {
412
+ this.typingExtends = new Set(
413
+ [...this.typingExtends].filter(
414
+ (node) => !sent.includes(node as Extend),
415
+ ),
416
+ );
417
+ }
418
+ // a typing that comes back the same leaves its node, and the query, alone
419
+ const warnings = new Map(this.warnings);
420
+ const replacements = new Map<QueryNode, QueryNode>(
421
+ requests.flatMap(({ node, input, columns, upstream }) => {
422
+ const { typing, error } = readCubeExtendTyping(
423
+ answers,
424
+ node,
425
+ input,
426
+ columns,
427
+ upstream,
428
+ );
429
+ if (
430
+ error?.kind === CubeEngineErrorKind.NETWORK &&
431
+ isCubeExtendTypingCurrent(node, input, upstream)
432
+ ) {
433
+ warnings.set(node.key, [getExtendRetypeWarning(error.firstLine)]);
434
+ return [];
435
+ }
436
+ warnings.delete(node.key);
437
+ return isSameCubeExtendTyping(typing, node.typing)
438
+ ? []
439
+ : [[node, node.withTyping(typing)] as const];
440
+ }),
441
+ );
442
+ this.warnings = warnings;
443
+ // an undo snapshot whose input differs keeps the typing it had
444
+ const emitters = new Map<Query, QueryEmitter>([[query, emitter]]);
445
+ this.replaceOutsideHistory(replacements, (snapshot, resolved) => {
446
+ const upstream = getCubeExtendTypingUpstream((resolved as Extend).typing);
447
+ if (upstream === undefined) {
448
+ return true;
449
+ }
450
+ let snapshotEmitter = emitters.get(snapshot);
451
+ if (!snapshotEmitter) {
452
+ snapshotEmitter = new QueryEmitter(snapshot, this.registry);
453
+ emitters.set(snapshot, snapshotEmitter);
454
+ }
455
+ return (
456
+ getCubeExtendUpstream(snapshotEmitter, resolved.id, context.model) ===
457
+ upstream
458
+ );
459
+ });
460
+ }
461
+
218
462
  /**
219
463
  * Warnings worked out from the query, by node id: a Sort whose order is
220
464
  * lost before it is used (PLAN §11.4). Never stored and never errors, so
@@ -329,7 +573,8 @@ export class CubeEditorState implements CommandRegistrar {
329
573
  return;
330
574
  }
331
575
  try {
332
- const outline = (yield this.host.modelCatalog.loadOutline(
576
+ const outline = (yield loadCubeModelOutline(
577
+ this.host,
333
578
  model,
334
579
  )) as CubeModelOutline;
335
580
  this.modelOutlines = new Map([...this.modelOutlines, [model, outline]]);
@@ -342,6 +587,7 @@ export class CubeEditorState implements CommandRegistrar {
342
587
  get isDialogOpen(): boolean {
343
588
  return (
344
589
  this.sourcePicker.isOpen ||
590
+ this.examples.isOpen ||
345
591
  this.specTransfer.mode !== undefined ||
346
592
  this.showPure.isOpen
347
593
  );
@@ -351,27 +597,93 @@ export class CubeEditorState implements CommandRegistrar {
351
597
  * The page's keyboard shortcuts, while it is open (spec §17.12). Each does
352
598
  * nothing when its button can't be used, and nothing while a Cube dialog
353
599
  * is open, since a dialog doesn't stop the app's shortcuts (user's choice,
354
- * 2026-10-07). Undo leaves Ctrl+Z to a text field that has the focus.
600
+ * 2026-10-07), or while something opened from the node editor holds it
601
+ * open. Like their buttons, they finish the node editor first (PLAN §11.8):
602
+ * F9 runs the edited query, and Ctrl+Z undoes what finishing applied. Undo
603
+ * leaves Ctrl+Z to a text field that has the focus.
355
604
  */
356
605
  registerCommands(): void {
357
- const { commandService, alertUnhandledError } = this.host.applicationStore;
606
+ const { commandService } = this.host.applicationStore;
358
607
  commandService.registerCommand({
359
608
  key: LEGEND_CUBE_COMMAND_KEY.EXECUTE,
360
609
  trigger: () =>
361
610
  !this.isDialogOpen &&
362
- this.execution.canExecute &&
363
- !this.execution.isRunning,
611
+ !this.nodeEditor.isHeld &&
612
+ !this.execution.isRunning &&
613
+ (this.execution.canExecute || this.hasEditsToApply),
614
+ action: () =>
615
+ this.nodeEditor.runFromKeyboard(
616
+ () => this.executeEdited(),
617
+ isFocusInNodeEditor(),
618
+ ),
619
+ });
620
+ // F10 in the Extend editor (PLAN §11.7)
621
+ commandService.registerCommand({
622
+ key: LEGEND_CUBE_COMMAND_KEY.VALIDATE_EXPRESSIONS,
623
+ trigger: () => {
624
+ const { draft } = this.nodeEditor;
625
+ return (
626
+ !this.isDialogOpen &&
627
+ !this.readOnly &&
628
+ draft instanceof CubeExtendDraft &&
629
+ !draft.validating
630
+ );
631
+ },
364
632
  action: () => {
365
- flowResult(this.execution.execute()).catch(alertUnhandledError);
633
+ const { draft } = this.nodeEditor;
634
+ if (draft instanceof CubeExtendDraft) {
635
+ flowResult(draft.validate()).catch(
636
+ this.host.applicationStore.alertUnhandledError,
637
+ );
638
+ }
366
639
  },
367
640
  });
368
641
  commandService.registerCommand({
369
642
  key: LEGEND_CUBE_COMMAND_KEY.UNDO,
370
- trigger: () => !this.isDialogOpen && this.canUndo && !isTypingText(),
371
- action: () => this.undo(),
643
+ trigger: () =>
644
+ !this.isDialogOpen &&
645
+ !this.nodeEditor.isHeld &&
646
+ (this.canUndo || this.hasEditsToApply) &&
647
+ !isTypingText(),
648
+ action: () =>
649
+ this.nodeEditor.runFromKeyboard(
650
+ () => this.undoEdited(),
651
+ isFocusInNodeEditor(),
652
+ ),
372
653
  });
373
654
  }
374
655
 
656
+ /** The node editor has edits that closing it would apply */
657
+ get hasEditsToApply(): boolean {
658
+ return this.nodeEditor.hasChanges && !this.readOnly;
659
+ }
660
+
661
+ /**
662
+ * Execute, as its button and F9 do (spec §17.5): finishes the node editor
663
+ * first, so the edits run, then runs the query if it can; runs nothing
664
+ * when the edits had to be dropped, since the run would not be what the
665
+ * user edited
666
+ */
667
+ executeEdited(): void {
668
+ if (!this.nodeEditor.finishApplied() || !this.execution.canExecute) {
669
+ return;
670
+ }
671
+ flowResult(this.execution.execute()).catch(
672
+ this.host.applicationStore.alertUnhandledError,
673
+ );
674
+ }
675
+
676
+ /**
677
+ * Undo, as its button and Ctrl+Z do: finishes the node editor first, then
678
+ * undoes the last change, which drops the edits it just applied; when the
679
+ * edits had to be dropped instead, that was the undo
680
+ */
681
+ undoEdited(): void {
682
+ if (this.nodeEditor.finishApplied()) {
683
+ this.undo();
684
+ }
685
+ }
686
+
375
687
  deregisterCommands(): void {
376
688
  Object.values(LEGEND_CUBE_COMMAND_KEY).forEach((key) =>
377
689
  this.host.applicationStore.commandService.deregisterCommand(key),
@@ -411,11 +723,22 @@ export class CubeEditorState implements CommandRegistrar {
411
723
  flowResult(this.reresolveSources()).catch(
412
724
  this.host.applicationStore.alertUnhandledError,
413
725
  );
726
+ // typed once on load too, as sources are checked again: the model may
727
+ // have changed the types of its functions (PLAN §11.7)
728
+ flowResult(
729
+ this.retypeExtends(
730
+ next.query.nodes.filter(
731
+ (node): node is Extend => node instanceof Extend,
732
+ ),
733
+ ),
734
+ ).catch(this.host.applicationStore.alertUnhandledError);
414
735
  }
415
736
 
416
737
  /**
417
- * Types the cube's tables again, in one engine call, outside the undo
418
- * history (PLAN §10.3, Settled before M1.8):
738
+ * Types the cube's sources again, outside the undo history (PLAN §10.3,
739
+ * Settled before M1.8): its tables in one engine call, a data product
740
+ * cube's access points through the catalog, from the deployed artifact at
741
+ * the cube's version (PLAN §6.8). Warnings name the kind of source:
419
742
  * - a table whose columns are the saved ones is left as it is;
420
743
  * - a table that changed takes its new columns, with a warning listing the
421
744
  * changes;
@@ -430,60 +753,118 @@ export class CubeEditorState implements CommandRegistrar {
430
753
  * left alone.
431
754
  *
432
755
  * `only` types just these sources of the cube shown, e.g. one Refresh. A
433
- * table found unchanged loses any earlier warning.
756
+ * table found unchanged loses any earlier warning. `fresh` reads a data
757
+ * product's artifact again rather than what this page visit read.
434
758
  */
435
759
  *reresolveSources(
436
- only?: readonly RelationalTableSource[],
760
+ only?: readonly RecheckedSource[],
761
+ fresh = false,
437
762
  ): GeneratorFn<void> {
438
763
  const { context, query } = this.document;
439
- const sources = (only ?? query.nodes).filter(
764
+ if (!context) {
765
+ return;
766
+ }
767
+ const kept = (only ?? query.nodes).filter(
768
+ (node) => query.getNode(node.id) === node,
769
+ );
770
+ const tables = kept.filter(
440
771
  (node): node is RelationalTableSource =>
441
- node instanceof RelationalTableSource &&
442
- query.getNode(node.id) === node,
772
+ node instanceof RelationalTableSource,
443
773
  );
444
- if (!context || !sources.length) {
774
+ // an access point on a cube of tables is the no-mix rule's to flag
775
+ const accessPoints = isCubeDataProductModel(context.model)
776
+ ? kept.filter(
777
+ (node): node is DataProductAccessPointSource =>
778
+ node instanceof DataProductAccessPointSource,
779
+ )
780
+ : [];
781
+ const dataSets = isCubeIngestModel(context.model)
782
+ ? kept.filter(
783
+ (node): node is IngestDatasetSource =>
784
+ node instanceof IngestDatasetSource,
785
+ )
786
+ : [];
787
+ const sources: readonly RecheckedSource[] = [
788
+ ...tables,
789
+ ...accessPoints,
790
+ ...dataSets,
791
+ ];
792
+ if (!sources.length) {
445
793
  return;
446
794
  }
447
795
  this.pendingSources = new Set([...this.pendingSources, ...sources]);
448
796
  let answers: ReadonlyMap<string, Schema | CubeEngineError>;
449
797
  try {
450
- answers = (yield this.host.engine.resolveSchemas(
451
- context.model,
452
- new Map(
453
- sources.map((source) => [
454
- source.id,
455
- [source.database, source.schema, source.table],
456
- ]),
457
- ),
458
- )) as Map<string, Schema | CubeEngineError>;
459
- } catch (error) {
460
- const failure =
461
- error instanceof CubeEngineError
462
- ? error
463
- : new CubeEngineError(
464
- CubeEngineErrorKind.NETWORK,
465
- error instanceof Error ? error.message : String(error),
466
- );
467
- answers = new Map(sources.map((source) => [source.id, failure]));
798
+ const [tableAnswers, accessPointAnswers, dataSetAnswers] =
799
+ (yield Promise.all([
800
+ tables.length
801
+ ? this.host.engine
802
+ .resolveSchemas(
803
+ context.model,
804
+ new Map(
805
+ tables.map((source) => [
806
+ source.id,
807
+ [source.database, source.schema, source.table],
808
+ ]),
809
+ ),
810
+ )
811
+ .catch((error: unknown) => {
812
+ const failure =
813
+ error instanceof CubeEngineError
814
+ ? error
815
+ : new CubeEngineError(
816
+ CubeEngineErrorKind.NETWORK,
817
+ error instanceof Error
818
+ ? error.message
819
+ : String(error),
820
+ );
821
+ return new Map(tables.map((source) => [source.id, failure]));
822
+ })
823
+ : new Map(),
824
+ accessPoints.length
825
+ ? recheckCubeDataProductSources(
826
+ this.host.dataProductCatalog,
827
+ context.model,
828
+ accessPoints,
829
+ fresh,
830
+ )
831
+ : new Map(),
832
+ dataSets.length
833
+ ? recheckCubeIngestSources(
834
+ this.host.ingestCatalog,
835
+ context.model,
836
+ dataSets,
837
+ fresh,
838
+ )
839
+ : new Map(),
840
+ ])) as ReadonlyMap<string, Schema | CubeEngineError>[];
841
+ answers = new Map([
842
+ ...(tableAnswers ?? []),
843
+ ...(accessPointAnswers ?? []),
844
+ ...(dataSetAnswers ?? []),
845
+ ]);
468
846
  } finally {
469
847
  this.pendingSources = new Set(
470
848
  [...this.pendingSources].filter(
471
- (node) => !sources.includes(node as RelationalTableSource),
849
+ (node) => !sources.includes(node as RecheckedSource),
472
850
  ),
473
851
  );
474
852
  }
475
853
  const warnings = new Map(this.warnings);
476
854
  /** Each typed source, by the object that was sent, and what replaces it */
477
- const replacements = new Map<
478
- RelationalTableSource,
479
- RelationalTableSource
480
- >();
855
+ const replacements = new Map<RecheckedSource, RecheckedSource>();
481
856
  sources.forEach((source) => {
857
+ const isAccessPoint = source instanceof DataProductAccessPointSource;
858
+ const isDataSet = source instanceof IngestDatasetSource;
482
859
  const answer =
483
860
  answers.get(source.id) ??
484
861
  new CubeEngineError(
485
862
  CubeEngineErrorKind.COMPILE,
486
- 'The engine gave no schema for this table',
863
+ isAccessPoint
864
+ ? CUBE_DATA_PRODUCT_RECHECK_MESSAGE.NO_ANSWER
865
+ : isDataSet
866
+ ? CUBE_INGEST_RECHECK_MESSAGE.NO_ANSWER
867
+ : 'The engine gave no schema for this table',
487
868
  source.id,
488
869
  );
489
870
  const saved =
@@ -492,7 +873,13 @@ export class CubeEditorState implements CommandRegistrar {
492
873
  : undefined;
493
874
  if (answer instanceof CubeEngineError) {
494
875
  if (saved) {
495
- warnings.set(source.key, [getSourceRecheckWarning(answer.firstLine)]);
876
+ warnings.set(source.key, [
877
+ isAccessPoint
878
+ ? getAccessPointRecheckWarning(answer.firstLine)
879
+ : isDataSet
880
+ ? getDataSetRecheckWarning(answer.firstLine)
881
+ : getSourceRecheckWarning(answer.firstLine),
882
+ ]);
496
883
  } else if (
497
884
  source.resolution.kind !== 'failed' ||
498
885
  source.resolution.message !== answer.detail
@@ -514,13 +901,32 @@ export class CubeEditorState implements CommandRegistrar {
514
901
  schema: answer,
515
902
  });
516
903
  if (saved) {
904
+ const diff = diffSchemas(saved, answer);
517
905
  warnings.set(resolved.key, [
518
- getSchemaDriftWarning(diffSchemas(saved, answer)),
906
+ isAccessPoint
907
+ ? getAccessPointDriftWarning(diff)
908
+ : isDataSet
909
+ ? getDataSetDriftWarning(diff)
910
+ : getSchemaDriftWarning(diff),
519
911
  ]);
520
912
  }
521
913
  replacements.set(source, resolved);
522
914
  });
523
915
  this.warnings = warnings;
916
+ this.replaceOutsideHistory(replacements);
917
+ }
918
+
919
+ /**
920
+ * Puts nodes the engine checked in place of the very objects that were
921
+ * sent, outside the undo history: in the cube shown and in the undo
922
+ * snapshots taken meanwhile, so undoing an edit made meanwhile keeps them.
923
+ * A node the user changed meanwhile is a new object, and is left alone.
924
+ * Filter values saved as invalid text are read again against the columns.
925
+ */
926
+ private replaceOutsideHistory(
927
+ replacements: ReadonlyMap<QueryNode, QueryNode>,
928
+ accepts?: (query: Query, resolved: QueryNode) => boolean,
929
+ ): void {
524
930
  if (!replacements.size) {
525
931
  return;
526
932
  }
@@ -532,7 +938,10 @@ export class CubeEditorState implements CommandRegistrar {
532
938
  if (checked === undefined) {
533
939
  let replaced = document.query;
534
940
  replacements.forEach((resolved, source) => {
535
- if (replaced.getNode(source.id) === source) {
941
+ if (
942
+ replaced.getNode(source.id) === source &&
943
+ (accepts?.(document.query, resolved) ?? true)
944
+ ) {
536
945
  replaced = replaced.replace(resolved);
537
946
  }
538
947
  });
@@ -562,22 +971,30 @@ export class CubeEditorState implements CommandRegistrar {
562
971
  }
563
972
 
564
973
  /**
565
- * Types a table again with the engine, from its Source panel (spec §17.6),
566
- * as a re-check after an import does: no undo step, nothing changes when
567
- * its columns are the same, and a warning lists any change.
974
+ * Types a source again, from its Source panel (spec §17.6), as a re-check
975
+ * after an import does: a table with the engine, an access point through
976
+ * the catalog. No undo step, nothing changes when its columns are the
977
+ * same, and a warning lists any change.
568
978
  */
569
979
  *refreshSource(nodeId: string): GeneratorFn<void> {
570
980
  const source = this.document.query.getNode(nodeId);
571
- if (source instanceof RelationalTableSource) {
572
- yield flowResult(this.reresolveSources([source]));
981
+ if (
982
+ source instanceof RelationalTableSource ||
983
+ source instanceof DataProductAccessPointSource ||
984
+ source instanceof IngestDatasetSource
985
+ ) {
986
+ // a Refresh reads the deployed artifact or definition again
987
+ yield flowResult(this.reresolveSources([source], true));
573
988
  }
574
989
  }
575
990
 
576
991
  /**
577
992
  * Restores the document before the last edit; does nothing when there is
578
993
  * no history. A restored query is a new object (PLAN §4.3), so rows that
579
- * ran before the edit show as stale. An edit that left the query alone,
580
- * such as a rename, keeps it, with its rows and engine errors. Undoing an
994
+ * ran before the edit show as stale. An edit that left the query and the
995
+ * context alone, such as a rename, keeps them, with the rows and engine
996
+ * errors; undoing a warehouse edit brings back the context the rows ran
997
+ * with. Undoing an
581
998
  * import closes the node editor and the picker, as the import did.
582
999
  */
583
1000
  undo(): void {
@@ -607,9 +1024,16 @@ export class CubeEditorState implements CommandRegistrar {
607
1024
  this.history = [...this.history, this.document].slice(-MAX_UNDO_STEPS);
608
1025
  }
609
1026
 
610
- /** Engine errors belong to the query they came from, so they are dropped when the query changes */
1027
+ /**
1028
+ * Engine errors belong to the query and the context they came from, so
1029
+ * they are dropped when either changes, e.g. a data product cube's
1030
+ * warehouse
1031
+ */
611
1032
  private replaceDocument(next: CubeDocument): void {
612
- if (next.query !== this.document.query) {
1033
+ if (
1034
+ next.query !== this.document.query ||
1035
+ next.context !== this.document.context
1036
+ ) {
613
1037
  this.hostIssues = new Map();
614
1038
  this.execution.clearError();
615
1039
  }
@@ -638,10 +1062,27 @@ export class CubeEditorState implements CommandRegistrar {
638
1062
  }
639
1063
  }
640
1064
 
1065
+ /**
1066
+ * The kinds of source the host serves: data products and ingest data sets
1067
+ * only with their catalogs. The cube's kind may still disable one
1068
+ * (`canAddNode`)
1069
+ */
1070
+ get offeredSources(): readonly SourceDefinition[] {
1071
+ return this.registry.sources.filter(
1072
+ (definition) =>
1073
+ (definition.type !== DataProductAccessPointSource.TYPE ||
1074
+ this.sourcePicker.dataProductTab.isAvailable) &&
1075
+ (definition.type !== IngestDatasetSource.TYPE ||
1076
+ this.sourcePicker.ingestTab.isAvailable),
1077
+ );
1078
+ }
1079
+
641
1080
  /**
642
1081
  * Whether a node of the type can be added: a transform, unconnected or
643
1082
  * spliced in after `afterId`, when the query allows it; a source only
644
1083
  * unconnected, through the source picker. Never while the cube is read-only.
1084
+ * The low-level rule: the palette, drops and menus place nodes through
1085
+ * `CubeAddPlacement` (PLAN §11.8).
645
1086
  */
646
1087
  canAddNode(type: string, afterId?: string): boolean {
647
1088
  const definition = this.registry.get(type);
@@ -649,15 +1090,21 @@ export class CubeEditorState implements CommandRegistrar {
649
1090
  return false;
650
1091
  }
651
1092
  if (definition.kind === 'source') {
652
- return afterId === undefined;
1093
+ // through its tab, which the cube's kind may disable (PLAN §6.8)
1094
+ const tab = this.sourcePicker.tabForSourceType(type);
1095
+ return (
1096
+ afterId === undefined &&
1097
+ tab !== undefined &&
1098
+ this.sourcePicker.isTabEnabled(tab)
1099
+ );
653
1100
  }
654
1101
  const { query } = this.document;
655
1102
  return query.canAdd(definition.create(query.generateId(type)), afterId);
656
1103
  }
657
1104
 
658
1105
  /**
659
- * Adds a node of the type, as the palette and the context menu do (spec
660
- * §17.4): a transform with its default settings, unconnected or spliced in
1106
+ * Adds a node of the type (spec §17.4), the low-level add that
1107
+ * `CubeAddPlacement` places for the palette, drops and menus: a transform with its default settings, unconnected or spliced in
661
1108
  * after `afterId`; a source opens the source picker, which adds it once
662
1109
  * the engine has typed it. Does nothing `canAddNode` refuses.
663
1110
  */
@@ -667,7 +1114,7 @@ export class CubeEditorState implements CommandRegistrar {
667
1114
  return;
668
1115
  }
669
1116
  if (definition.kind === 'source') {
670
- this.sourcePicker.open();
1117
+ this.sourcePicker.open(this.sourcePicker.tabForSourceType(type)?.key);
671
1118
  return;
672
1119
  }
673
1120
  const { query } = this.document;
@@ -801,6 +1248,7 @@ export class CubeEditorState implements CommandRegistrar {
801
1248
 
802
1249
  /** Stops any run; call when the page closes */
803
1250
  dispose(): void {
1251
+ this.retyping();
804
1252
  this.execution.stop();
805
1253
  this.nodeEditor.dispose();
806
1254
  }