@platforma-sdk/model 1.79.27 → 1.80.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/block_model.d.ts +2 -0
  2. package/dist/block_model.d.ts.map +1 -1
  3. package/dist/columns/column.cjs +28 -0
  4. package/dist/columns/column.cjs.map +1 -0
  5. package/dist/columns/column.d.ts +30 -0
  6. package/dist/columns/column.d.ts.map +1 -0
  7. package/dist/columns/column.js +27 -0
  8. package/dist/columns/column.js.map +1 -0
  9. package/dist/columns/column_lazy.cjs +248 -0
  10. package/dist/columns/column_lazy.cjs.map +1 -0
  11. package/dist/columns/column_lazy.d.ts +137 -0
  12. package/dist/columns/column_lazy.d.ts.map +1 -0
  13. package/dist/columns/column_lazy.js +245 -0
  14. package/dist/columns/column_lazy.js.map +1 -0
  15. package/dist/columns/column_providers/index.cjs +62 -0
  16. package/dist/columns/column_providers/index.cjs.map +1 -0
  17. package/dist/columns/column_providers/index.d.ts +30 -0
  18. package/dist/columns/column_providers/index.d.ts.map +1 -0
  19. package/dist/columns/column_providers/index.js +53 -0
  20. package/dist/columns/column_providers/index.js.map +1 -0
  21. package/dist/columns/column_providers/providers.cjs +123 -0
  22. package/dist/columns/column_providers/providers.cjs.map +1 -0
  23. package/dist/columns/column_providers/providers.d.ts +75 -0
  24. package/dist/columns/column_providers/providers.d.ts.map +1 -0
  25. package/dist/columns/column_providers/providers.js +118 -0
  26. package/dist/columns/column_providers/providers.js.map +1 -0
  27. package/dist/columns/column_providers/types.d.ts +23 -0
  28. package/dist/columns/column_providers/types.d.ts.map +1 -0
  29. package/dist/columns/column_recipes/column_discovered_recipe.cjs +180 -0
  30. package/dist/columns/column_recipes/column_discovered_recipe.cjs.map +1 -0
  31. package/dist/columns/column_recipes/column_discovered_recipe.d.ts +120 -0
  32. package/dist/columns/column_recipes/column_discovered_recipe.d.ts.map +1 -0
  33. package/dist/columns/column_recipes/column_discovered_recipe.js +180 -0
  34. package/dist/columns/column_recipes/column_discovered_recipe.js.map +1 -0
  35. package/dist/columns/column_recipes/column_filtered_recipe.cjs +133 -0
  36. package/dist/columns/column_recipes/column_filtered_recipe.cjs.map +1 -0
  37. package/dist/columns/column_recipes/column_filtered_recipe.d.ts +75 -0
  38. package/dist/columns/column_recipes/column_filtered_recipe.d.ts.map +1 -0
  39. package/dist/columns/column_recipes/column_filtered_recipe.js +133 -0
  40. package/dist/columns/column_recipes/column_filtered_recipe.js.map +1 -0
  41. package/dist/columns/column_recipes/column_overrided_recipe.cjs +101 -0
  42. package/dist/columns/column_recipes/column_overrided_recipe.cjs.map +1 -0
  43. package/dist/columns/column_recipes/column_overrided_recipe.d.ts +73 -0
  44. package/dist/columns/column_recipes/column_overrided_recipe.d.ts.map +1 -0
  45. package/dist/columns/column_recipes/column_overrided_recipe.js +101 -0
  46. package/dist/columns/column_recipes/column_overrided_recipe.js.map +1 -0
  47. package/dist/columns/column_recipes/index.cjs +72 -0
  48. package/dist/columns/column_recipes/index.cjs.map +1 -0
  49. package/dist/columns/column_recipes/index.d.ts +52 -0
  50. package/dist/columns/column_recipes/index.d.ts.map +1 -0
  51. package/dist/columns/column_recipes/index.js +68 -0
  52. package/dist/columns/column_recipes/index.js.map +1 -0
  53. package/dist/columns/column_recipes/leaf_rebrand.cjs +22 -0
  54. package/dist/columns/column_recipes/leaf_rebrand.cjs.map +1 -0
  55. package/dist/columns/column_recipes/leaf_rebrand.js +22 -0
  56. package/dist/columns/column_recipes/leaf_rebrand.js.map +1 -0
  57. package/dist/columns/column_recipes/types.d.ts +101 -0
  58. package/dist/columns/column_recipes/types.d.ts.map +1 -0
  59. package/dist/columns/columns_collection.cjs +124 -0
  60. package/dist/columns/columns_collection.cjs.map +1 -0
  61. package/dist/columns/columns_collection.d.ts +64 -0
  62. package/dist/columns/columns_collection.d.ts.map +1 -0
  63. package/dist/columns/columns_collection.js +122 -0
  64. package/dist/columns/columns_collection.js.map +1 -0
  65. package/dist/columns/derive_axis_values_labels.cjs +76 -0
  66. package/dist/columns/derive_axis_values_labels.cjs.map +1 -0
  67. package/dist/columns/derive_axis_values_labels.d.ts +30 -0
  68. package/dist/columns/derive_axis_values_labels.d.ts.map +1 -0
  69. package/dist/columns/derive_axis_values_labels.js +76 -0
  70. package/dist/columns/derive_axis_values_labels.js.map +1 -0
  71. package/dist/columns/expand_by_partition.cjs +53 -56
  72. package/dist/columns/expand_by_partition.cjs.map +1 -1
  73. package/dist/columns/expand_by_partition.d.ts +22 -18
  74. package/dist/columns/expand_by_partition.d.ts.map +1 -1
  75. package/dist/columns/expand_by_partition.js +55 -58
  76. package/dist/columns/expand_by_partition.js.map +1 -1
  77. package/dist/columns/index.cjs +44 -18
  78. package/dist/columns/index.d.ts +15 -7
  79. package/dist/columns/index.js +12 -6
  80. package/dist/columns/utils.cjs +186 -0
  81. package/dist/columns/utils.cjs.map +1 -0
  82. package/dist/columns/utils.d.ts +96 -0
  83. package/dist/columns/utils.d.ts.map +1 -0
  84. package/dist/columns/utils.js +179 -0
  85. package/dist/columns/utils.js.map +1 -0
  86. package/dist/components/PFrameForGraphs.cjs +1 -0
  87. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  88. package/dist/components/PFrameForGraphs.d.ts +1 -1
  89. package/dist/components/PFrameForGraphs.d.ts.map +1 -1
  90. package/dist/components/PFrameForGraphs.js +1 -0
  91. package/dist/components/PFrameForGraphs.js.map +1 -1
  92. package/dist/components/PlDataTable/columnResolver.cjs +28 -0
  93. package/dist/components/PlDataTable/columnResolver.cjs.map +1 -0
  94. package/dist/components/PlDataTable/columnResolver.js +28 -0
  95. package/dist/components/PlDataTable/columnResolver.js.map +1 -0
  96. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +4 -2
  97. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
  98. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +4 -2
  99. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
  100. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +20 -25
  101. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
  102. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +20 -25
  103. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
  104. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +58 -26
  105. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  106. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
  107. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
  108. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +60 -28
  109. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  110. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +224 -194
  111. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  112. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +13 -16
  113. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
  114. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +228 -198
  115. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  116. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +40 -98
  117. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
  118. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -8
  119. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
  120. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +40 -98
  121. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
  122. package/dist/components/PlDataTable/createPlDataTable/index.cjs +1 -1
  123. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  124. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
  125. package/dist/components/PlDataTable/createPlDataTable/index.js +2 -2
  126. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  127. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +51 -169
  128. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
  129. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +1 -1
  130. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
  131. package/dist/components/PlDataTable/createPlDataTable/utils.js +52 -166
  132. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
  133. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  134. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
  135. package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
  136. package/dist/components/PlDataTable/index.cjs +1 -1
  137. package/dist/components/PlDataTable/index.d.ts +4 -4
  138. package/dist/components/PlDataTable/index.js +2 -2
  139. package/dist/components/PlDataTable/labels.cjs +0 -1
  140. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  141. package/dist/components/PlDataTable/labels.js +0 -1
  142. package/dist/components/PlDataTable/labels.js.map +1 -1
  143. package/dist/components/PlDataTable/state-migration.cjs +107 -10
  144. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  145. package/dist/components/PlDataTable/state-migration.d.ts +5 -4
  146. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
  147. package/dist/components/PlDataTable/state-migration.js +107 -10
  148. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  149. package/dist/components/PlDataTable/typesV7.d.ts +1 -36
  150. package/dist/components/PlDataTable/typesV7.d.ts.map +1 -1
  151. package/dist/components/PlDataTable/typesV8.d.ts +123 -0
  152. package/dist/components/PlDataTable/typesV8.d.ts.map +1 -0
  153. package/dist/components/PlDatasetSelector/build_dataset_options.cjs +27 -34
  154. package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -1
  155. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -1
  156. package/dist/components/PlDatasetSelector/build_dataset_options.js +27 -34
  157. package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -1
  158. package/dist/components/PlDatasetSelector/enrichment_discovery.cjs +28 -33
  159. package/dist/components/PlDatasetSelector/enrichment_discovery.cjs.map +1 -1
  160. package/dist/components/PlDatasetSelector/enrichment_discovery.js +29 -34
  161. package/dist/components/PlDatasetSelector/enrichment_discovery.js.map +1 -1
  162. package/dist/components/PlDatasetSelector/filter_discovery.cjs +27 -17
  163. package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -1
  164. package/dist/components/PlDatasetSelector/filter_discovery.d.ts +24 -10
  165. package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -1
  166. package/dist/components/PlDatasetSelector/filter_discovery.js +28 -18
  167. package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -1
  168. package/dist/components/PlDatasetSelector/index.d.ts +2 -2
  169. package/dist/components/index.cjs +1 -1
  170. package/dist/components/index.d.ts +5 -5
  171. package/dist/components/index.js +2 -2
  172. package/dist/filters/converters/filterToQuery.cjs +5 -6
  173. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  174. package/dist/filters/converters/filterToQuery.d.ts +12 -3
  175. package/dist/filters/converters/filterToQuery.d.ts.map +1 -1
  176. package/dist/filters/converters/filterToQuery.js +5 -6
  177. package/dist/filters/converters/filterToQuery.js.map +1 -1
  178. package/dist/filters/converters/index.d.ts +2 -2
  179. package/dist/filters/index.d.ts +2 -2
  180. package/dist/index.cjs +64 -35
  181. package/dist/index.d.ts +23 -15
  182. package/dist/index.js +15 -9
  183. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  184. package/dist/labels/derive_distinct_labels.d.ts +1 -2
  185. package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
  186. package/dist/labels/derive_distinct_labels.js.map +1 -1
  187. package/dist/labels/derive_distinct_tooltips.cjs +1 -1
  188. package/dist/labels/derive_distinct_tooltips.cjs.map +1 -1
  189. package/dist/labels/derive_distinct_tooltips.d.ts +6 -3
  190. package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -1
  191. package/dist/labels/derive_distinct_tooltips.js +1 -1
  192. package/dist/labels/derive_distinct_tooltips.js.map +1 -1
  193. package/dist/package.cjs +1 -1
  194. package/dist/package.js +1 -1
  195. package/dist/pframe_utils/axes.cjs.map +1 -1
  196. package/dist/pframe_utils/axes.d.ts +2 -2
  197. package/dist/pframe_utils/axes.d.ts.map +1 -1
  198. package/dist/pframe_utils/axes.js.map +1 -1
  199. package/dist/pframe_utils/columns.cjs +6 -10
  200. package/dist/pframe_utils/columns.cjs.map +1 -1
  201. package/dist/pframe_utils/columns.d.ts +4 -4
  202. package/dist/pframe_utils/columns.d.ts.map +1 -1
  203. package/dist/pframe_utils/columns.js +7 -11
  204. package/dist/pframe_utils/columns.js.map +1 -1
  205. package/dist/pframe_utils/index.cjs.map +1 -1
  206. package/dist/pframe_utils/index.d.ts +1 -1
  207. package/dist/pframe_utils/index.d.ts.map +1 -1
  208. package/dist/pframe_utils/index.js.map +1 -1
  209. package/dist/render/accessor.cjs +15 -16
  210. package/dist/render/accessor.cjs.map +1 -1
  211. package/dist/render/accessor.d.ts +7 -10
  212. package/dist/render/accessor.d.ts.map +1 -1
  213. package/dist/render/accessor.js +15 -16
  214. package/dist/render/accessor.js.map +1 -1
  215. package/dist/render/api.cjs +34 -36
  216. package/dist/render/api.cjs.map +1 -1
  217. package/dist/render/api.d.ts +30 -20
  218. package/dist/render/api.d.ts.map +1 -1
  219. package/dist/render/api.js +35 -38
  220. package/dist/render/api.js.map +1 -1
  221. package/dist/render/index.cjs +4 -0
  222. package/dist/render/index.d.ts +4 -4
  223. package/dist/render/index.js +3 -2
  224. package/dist/render/internal.cjs +3 -2
  225. package/dist/render/internal.cjs.map +1 -1
  226. package/dist/render/internal.d.ts +17 -9
  227. package/dist/render/internal.d.ts.map +1 -1
  228. package/dist/render/internal.js +3 -2
  229. package/dist/render/internal.js.map +1 -1
  230. package/dist/render/util/axis_filtering.cjs.map +1 -1
  231. package/dist/render/util/axis_filtering.js.map +1 -1
  232. package/dist/render/util/column_collection.cjs +6 -4
  233. package/dist/render/util/column_collection.cjs.map +1 -1
  234. package/dist/render/util/column_collection.d.ts +9 -9
  235. package/dist/render/util/column_collection.d.ts.map +1 -1
  236. package/dist/render/util/column_collection.js +6 -4
  237. package/dist/render/util/column_collection.js.map +1 -1
  238. package/dist/render/util/index.d.ts +2 -2
  239. package/dist/render/util/pcolumn_data.cjs +1 -1
  240. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  241. package/dist/render/util/pcolumn_data.d.ts +3 -3
  242. package/dist/render/util/pcolumn_data.d.ts.map +1 -1
  243. package/dist/render/util/pcolumn_data.js +1 -1
  244. package/dist/render/util/pcolumn_data.js.map +1 -1
  245. package/dist/services/block_services.cjs +2 -1
  246. package/dist/services/block_services.cjs.map +1 -1
  247. package/dist/services/block_services.d.ts +1 -0
  248. package/dist/services/block_services.d.ts.map +1 -1
  249. package/dist/services/block_services.js +2 -1
  250. package/dist/services/block_services.js.map +1 -1
  251. package/dist/services/get_services.cjs +2 -2
  252. package/dist/services/get_services.cjs.map +1 -1
  253. package/dist/services/get_services.d.ts +4 -1
  254. package/dist/services/get_services.d.ts.map +1 -1
  255. package/dist/services/get_services.js +2 -2
  256. package/dist/services/get_services.js.map +1 -1
  257. package/package.json +10 -8
  258. package/src/columns/__test_helpers__/collection_driver.ts +197 -0
  259. package/src/columns/__test_helpers__/stub_registry.ts +134 -0
  260. package/src/columns/column.ts +46 -0
  261. package/src/columns/column_lazy.test.ts +201 -0
  262. package/src/columns/column_lazy.ts +311 -0
  263. package/src/columns/column_providers/index.ts +78 -0
  264. package/src/columns/column_providers/providers.ts +193 -0
  265. package/src/columns/column_providers/types.ts +24 -0
  266. package/src/columns/column_recipes/column_discovered_recipe.ts +231 -0
  267. package/src/columns/column_recipes/column_filtered_recipe.ts +184 -0
  268. package/src/columns/column_recipes/column_overrided_recipe.ts +146 -0
  269. package/src/columns/column_recipes/column_recipes.test.ts +681 -0
  270. package/src/columns/column_recipes/index.ts +127 -0
  271. package/src/columns/column_recipes/leaf_rebrand.ts +28 -0
  272. package/src/columns/column_recipes/types.ts +113 -0
  273. package/src/columns/columns_collection.test.ts +164 -0
  274. package/src/columns/columns_collection.ts +170 -0
  275. package/src/columns/derive_axis_values_labels.ts +98 -0
  276. package/src/columns/expand_by_partition.test.ts +146 -110
  277. package/src/columns/expand_by_partition.ts +72 -84
  278. package/src/columns/index.ts +7 -5
  279. package/src/columns/utils.test.ts +249 -0
  280. package/src/columns/utils.ts +226 -0
  281. package/src/components/PFrameForGraphs.ts +3 -1
  282. package/src/components/PlAnnotations/filters_ui.test.ts +46 -47
  283. package/src/components/PlDataTable/columnResolver.test.ts +122 -0
  284. package/src/components/PlDataTable/columnResolver.ts +57 -0
  285. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +9 -9
  286. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +31 -63
  287. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +85 -58
  288. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +316 -354
  289. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +48 -144
  290. package/src/components/PlDataTable/createPlDataTable/index.ts +2 -2
  291. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +60 -69
  292. package/src/components/PlDataTable/createPlDataTable/utils.ts +65 -173
  293. package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
  294. package/src/components/PlDataTable/index.ts +4 -2
  295. package/src/components/PlDataTable/labels.ts +4 -33
  296. package/src/components/PlDataTable/state-migration.ts +151 -22
  297. package/src/components/PlDataTable/typesV8.ts +188 -0
  298. package/src/components/PlDatasetSelector/build_dataset_options.ts +35 -60
  299. package/src/components/PlDatasetSelector/enrichment_discovery.ts +65 -61
  300. package/src/components/PlDatasetSelector/filter_discovery.test.ts +110 -72
  301. package/src/components/PlDatasetSelector/filter_discovery.ts +51 -31
  302. package/src/filters/converters/filterToQuery.test.ts +15 -8
  303. package/src/filters/converters/filterToQuery.ts +22 -9
  304. package/src/filters/converters/filterUiToExpressionImpl.test.ts +35 -36
  305. package/src/labels/derive_distinct_labels.ts +1 -1
  306. package/src/labels/derive_distinct_tooltips.test.ts +7 -4
  307. package/src/labels/derive_distinct_tooltips.ts +3 -3
  308. package/src/pframe_utils/axes.ts +2 -2
  309. package/src/pframe_utils/columns.ts +14 -23
  310. package/src/pframe_utils/index.ts +1 -1
  311. package/src/render/accessor.ts +35 -38
  312. package/src/render/api.ts +45 -61
  313. package/src/render/index.ts +2 -1
  314. package/src/render/internal.ts +43 -10
  315. package/src/render/util/axis_filtering.ts +0 -1
  316. package/src/render/util/column_collection.ts +17 -17
  317. package/src/render/util/pcolumn_data.ts +5 -9
  318. package/src/services/block_services.ts +1 -0
  319. package/src/services/get_services.ts +5 -2
  320. package/dist/columns/column_collection_builder.cjs +0 -241
  321. package/dist/columns/column_collection_builder.cjs.map +0 -1
  322. package/dist/columns/column_collection_builder.d.ts +0 -119
  323. package/dist/columns/column_collection_builder.d.ts.map +0 -1
  324. package/dist/columns/column_collection_builder.js +0 -241
  325. package/dist/columns/column_collection_builder.js.map +0 -1
  326. package/dist/columns/column_selector.cjs +0 -49
  327. package/dist/columns/column_selector.cjs.map +0 -1
  328. package/dist/columns/column_selector.d.ts +0 -33
  329. package/dist/columns/column_selector.d.ts.map +0 -1
  330. package/dist/columns/column_selector.js +0 -47
  331. package/dist/columns/column_selector.js.map +0 -1
  332. package/dist/columns/column_snapshot.cjs +0 -19
  333. package/dist/columns/column_snapshot.cjs.map +0 -1
  334. package/dist/columns/column_snapshot.d.ts +0 -39
  335. package/dist/columns/column_snapshot.d.ts.map +0 -1
  336. package/dist/columns/column_snapshot.js +0 -18
  337. package/dist/columns/column_snapshot.js.map +0 -1
  338. package/dist/columns/column_snapshot_provider.cjs +0 -137
  339. package/dist/columns/column_snapshot_provider.cjs.map +0 -1
  340. package/dist/columns/column_snapshot_provider.d.ts +0 -74
  341. package/dist/columns/column_snapshot_provider.d.ts.map +0 -1
  342. package/dist/columns/column_snapshot_provider.js +0 -133
  343. package/dist/columns/column_snapshot_provider.js.map +0 -1
  344. package/dist/columns/ctx_column_sources.cjs +0 -80
  345. package/dist/columns/ctx_column_sources.cjs.map +0 -1
  346. package/dist/columns/ctx_column_sources.d.ts +0 -30
  347. package/dist/columns/ctx_column_sources.d.ts.map +0 -1
  348. package/dist/columns/ctx_column_sources.js +0 -79
  349. package/dist/columns/ctx_column_sources.js.map +0 -1
  350. package/src/columns/column_collection_builder.test.ts +0 -484
  351. package/src/columns/column_collection_builder.ts +0 -485
  352. package/src/columns/column_selector.test.ts +0 -90
  353. package/src/columns/column_selector.ts +0 -100
  354. package/src/columns/column_snapshot.ts +0 -58
  355. package/src/columns/column_snapshot_provider.ts +0 -194
  356. package/src/columns/ctx_column_sources.ts +0 -99
@@ -0,0 +1,127 @@
1
+ import {
2
+ isColumnDiscoveredKey,
3
+ isColumnOverriddenKey,
4
+ parseColumnIdSafely,
5
+ type ColumnUniversalId,
6
+ type PObjectId,
7
+ isPObjectKey,
8
+ isColumnFilteredKey,
9
+ } from "@milaboratories/pl-model-common";
10
+ import type { GlobalCfgRenderCtx } from "../../render/internal";
11
+ import { ColumnLazyImpl } from "../column_lazy";
12
+ import { ColumnDiscoveredRecipe } from "./column_discovered_recipe";
13
+ import { ColumnFilteredRecipe } from "./column_filtered_recipe";
14
+ import { ColumnOverriddenRecipe } from "./column_overrided_recipe";
15
+ import type {
16
+ ColumnRecipe as ColumnRecipeBase,
17
+ ColumnRecipeId,
18
+ ColumnResolutionStatus,
19
+ } from "./types";
20
+
21
+ export type { ColumnFieldStatus, ColumnRecipeId, ColumnResolutionStatus, SpecQuery } from "./types";
22
+ export { ColumnAbsentError } from "../column_lazy";
23
+ export { ColumnDiscoveredRecipe } from "./column_discovered_recipe";
24
+ export { ColumnFilteredRecipe } from "./column_filtered_recipe";
25
+ export { ColumnOverriddenRecipe } from "./column_overrided_recipe";
26
+
27
+ // Re-declare the interface locally so the name can merge with the dispatcher
28
+ // value declared below: a single name `ColumnRecipe` resolves to the
29
+ // interface in type position and to the factory function (`Object.assign`d
30
+ // with `.getStatus`) in value position.
31
+ // (Type-only re-exports do not participate in TS declaration merging.)
32
+ export interface ColumnRecipe<
33
+ ID extends ColumnRecipeId = ColumnRecipeId,
34
+ > extends ColumnRecipeBase<ID> {}
35
+
36
+ /**
37
+ * Build a `ColumnRecipe` from a stringified id. Dispatches to the matching
38
+ * concrete recipe variant based on the id's encoding and recurses on
39
+ * wrappers' inner `source`:
40
+ *
41
+ * - bare {@link PObjectId} (non-JSON) → `ColumnLazy.fromId`
42
+ * - `ColumnDiscoveredKey` → {@link ColumnDiscoveredRecipe}
43
+ * - `ColumnOverriddenKey { source, specOverrides }` → recurse on `source`,
44
+ * then {@link ColumnOverriddenRecipe.wrap}
45
+ * - `ColumnFilteredKey { source, axisFilters }` → recurse on `source`,
46
+ * then {@link ColumnFilteredRecipe.wrap}
47
+ *
48
+ * Returns `undefined` for unsupported variants (e.g. AnchoredPColumnId,
49
+ * which needs an anchor map to resolve) or when a nested source itself
50
+ * cannot be built.
51
+ */
52
+ function ColumnRecipeBuild(
53
+ id: ColumnUniversalId,
54
+ opts: { ctx?: GlobalCfgRenderCtx } = {},
55
+ ): undefined | ColumnRecipe {
56
+ const parsed = parseColumnIdSafely(id);
57
+
58
+ if (isPObjectKey(parsed)) {
59
+ return ColumnLazyImpl.fromId(id as PObjectId, opts);
60
+ }
61
+
62
+ if (isColumnDiscoveredKey(parsed)) {
63
+ return ColumnDiscoveredRecipe.fromKey(parsed, opts);
64
+ }
65
+
66
+ if (isColumnOverriddenKey(parsed)) {
67
+ const inner = ColumnRecipe(parsed.source, opts);
68
+ if (inner === undefined) return undefined;
69
+ return ColumnOverriddenRecipe.wrap(inner, parsed.specOverrides);
70
+ }
71
+
72
+ if (isColumnFilteredKey(parsed)) {
73
+ // ColumnFilteredKey.source is a stringified ColumnUniversalId (leaf or
74
+ // any nested wrapper). Legacy `FilteredPColumnId` with an AnchoredPColumnId
75
+ // (object) source is not supported here — guard against it explicitly.
76
+ if (typeof parsed.source !== "string") {
77
+ throw new Error(
78
+ `Unsupported ColumnRecipe id variant: filtered column with non-string source (${JSON.stringify(parsed.source)})`,
79
+ );
80
+ }
81
+ const inner = ColumnRecipe(parsed.source, opts);
82
+ if (inner === undefined) return undefined;
83
+ return ColumnFilteredRecipe.wrap(inner, parsed.axisFilters);
84
+ }
85
+
86
+ throw new Error(`Unsupported ColumnRecipe id variant: ${id}`);
87
+ }
88
+
89
+ /**
90
+ * Resolution status counterpart to {@link ColumnRecipeBuild}. Dispatches on
91
+ * the parsed id shape to the matching `getStatusBy*` static — never
92
+ * constructs the recipe. Use this at boundaries (resolver, filter/sort
93
+ * targets) to throw early on `absent` instead of silently producing an empty
94
+ * recipe via {@link ColumnRecipeBuild}.
95
+ */
96
+ function ColumnRecipeGetStatus(
97
+ id: ColumnUniversalId,
98
+ opts: { ctx?: GlobalCfgRenderCtx } = {},
99
+ ): ColumnResolutionStatus {
100
+ const parsed = parseColumnIdSafely(id);
101
+ if (isPObjectKey(parsed)) return ColumnLazyImpl.getStatusById(id as PObjectId, opts);
102
+ if (isColumnDiscoveredKey(parsed)) return ColumnDiscoveredRecipe.getStatusByKey(parsed, opts);
103
+ if (isColumnOverriddenKey(parsed)) return ColumnOverriddenRecipe.getStatusByKey(parsed, opts);
104
+ if (isColumnFilteredKey(parsed)) return ColumnFilteredRecipe.getStatusByKey(parsed, opts);
105
+ throw new Error(`Unsupported ColumnRecipe id variant: ${id}`);
106
+ }
107
+
108
+ export const ColumnRecipe: typeof ColumnRecipeBuild & {
109
+ readonly getStatus: typeof ColumnRecipeGetStatus;
110
+ } = Object.assign(ColumnRecipeBuild, {
111
+ getStatus: ColumnRecipeGetStatus,
112
+ });
113
+
114
+ /**
115
+ * Type-guard for any recipe class — leaf {@link ColumnLazyImpl} or any of the
116
+ * wrapper recipes ({@link ColumnDiscoveredRecipe}, {@link ColumnFilteredRecipe},
117
+ * {@link ColumnOverriddenRecipe}). Use when a value may be a raw id, a `PColumn`,
118
+ * or a recipe and you want to branch on the recipe case.
119
+ */
120
+ export function isColumnRecipe(value: unknown): value is ColumnRecipe {
121
+ return (
122
+ value instanceof ColumnLazyImpl ||
123
+ value instanceof ColumnDiscoveredRecipe ||
124
+ value instanceof ColumnFilteredRecipe ||
125
+ value instanceof ColumnOverriddenRecipe
126
+ );
127
+ }
@@ -0,0 +1,28 @@
1
+ import {
2
+ mapSpecQueryColumns,
3
+ type ColumnUniversalId,
4
+ type SpecQuery,
5
+ } from "@milaboratories/pl-model-common";
6
+
7
+ /**
8
+ * Replace every column leaf whose id equals `fromId` with `toId`, leaving
9
+ * other column refs (linkers, sub-anchors) intact. Wrapper recipes
10
+ * (Overridden / Filtered) and Discovered use this to lift their own id onto
11
+ * the hit leaf, so per-variant uniqueness propagates to the engine and
12
+ * resolver-emitted ids match leaves in the emitted SpecQuery.
13
+ *
14
+ * Generic over all SpecQuery node shapes — including `linkerJoin`, which
15
+ * occurs when a wrapper sits over a {@link ColumnDiscoveredRecipe}: only
16
+ * the deepest hit leaf carries `fromId`, every linker leaf has a different
17
+ * id and is left untouched.
18
+ */
19
+ export function rebrandLeafId(
20
+ node: SpecQuery,
21
+ fromId: ColumnUniversalId,
22
+ toId: ColumnUniversalId,
23
+ ): SpecQuery {
24
+ if (fromId === toId) return node;
25
+ return mapSpecQueryColumns(node, {
26
+ column: (id) => (id === fromId ? toId : id),
27
+ });
28
+ }
@@ -0,0 +1,113 @@
1
+ import type {
2
+ ColumnUniversalId,
3
+ PColumnSpec,
4
+ PObjectId,
5
+ SpecOverrides,
6
+ SpecQuery,
7
+ } from "@milaboratories/pl-model-common";
8
+
9
+ export type { SpecQuery };
10
+
11
+ /**
12
+ * Stable identifier of a recipe: either the canonical {@link PObjectId} of a
13
+ * leaf or a {@link ColumnUniversalId} encoding `Overridden / Discovered /
14
+ * Filtered` layers on top of it.
15
+ *
16
+ * Recipes are equivalent as value-objects iff their `id`s match (structurally,
17
+ * after canonicalization).
18
+ */
19
+ export type ColumnRecipeId = ColumnUniversalId;
20
+
21
+ /**
22
+ * Aggregate data status of a recipe: the "worst" status across every
23
+ * PObjectId the recipe references (the leaf itself plus any refs inside
24
+ * overrides/discovery).
25
+ *
26
+ * "All or nothing" semantics: spec/query built from a recipe are meaningful
27
+ * only when every referenced column is `present`.
28
+ */
29
+ export type ColumnFieldStatus = "resolving" | "absent" | "present";
30
+
31
+ /**
32
+ * Resolution status of a recipe — whether the recipe is meaningful in the
33
+ * active render ctx. Aggregates spec readiness (the recipe can be
34
+ * constructed/used) and data readiness (the underlying leaves can be read).
35
+ *
36
+ * - `present`: spec + data readable end-to-end.
37
+ * - `resolving`: more accessor inputs may still arrive — recheck later.
38
+ * - `absent`: every relevant accessor is `inputsLocked`; nothing more will
39
+ * appear. Used at boundaries to throw early instead of silently
40
+ * producing an empty/broken recipe.
41
+ *
42
+ * Distinct from {@link ColumnFieldStatus}: that one is the leaf's data field
43
+ * status only. {@link ColumnResolutionStatus} also folds in spec/registry
44
+ * readiness, so the recipe interface exposes both.
45
+ */
46
+ export type ColumnResolutionStatus = "present" | "resolving" | "absent";
47
+
48
+ /**
49
+ * Base contract of a column recipe — an immutable description of HOW to
50
+ * obtain a column, not the column itself.
51
+ *
52
+ * A recipe is a value-object. The only transformation exposed via the
53
+ * interface is {@link withSpecs}: it overlays overrides on the spec.
54
+ * `withDiscovery` / `withAxisFilters` are intentionally absent — discovered
55
+ * and filtered recipes are built only via their own factory constructors
56
+ * from a leaf recipe; nothing further can be stacked on top of Discovered
57
+ * or Filtered.
58
+ *
59
+ * Invariant: `withSpecs` never nests. A recipe is either bare or wrapped
60
+ * in exactly one Overridden layer. Repeated `withSpecs` merges the new
61
+ * overrides into the existing ones, keeping the same depth.
62
+ *
63
+ * A recipe intentionally exposes no `getSpecOverrides / getDiscovery /
64
+ * getAxisFilters` getters: those encoding pieces are details of the id.
65
+ * Consumers that need to decompose call utilities from `pl-model-common`
66
+ * over `recipe.id`.
67
+ */
68
+ export interface ColumnRecipe<ID extends ColumnRecipeId = ColumnRecipeId> {
69
+ /** Canonical recipe identifier. */
70
+ readonly id: ID;
71
+
72
+ /** PObjectIds referenced by this recipe (leaf + any nested refs). */
73
+ getReferencedIds(): PObjectId[];
74
+
75
+ /**
76
+ * Final spec — built via `pframespec` from id + base spec of the source.
77
+ * No partial JS logic: the result matches what the engine returns when
78
+ * executing {@link getQuery}.
79
+ *
80
+ * Always returns a value: the recipe factories validate all referenced
81
+ * specs at construction time and return `undefined` from the factory if
82
+ * anything is missing. A constructed recipe is by contract spec-complete.
83
+ */
84
+ getSpec(): PColumnSpec;
85
+
86
+ /**
87
+ * IR describing how to obtain the column — a {@link SpecQuery} from
88
+ * `pl-model-common`. The recipe builds the description; execution belongs
89
+ * to the layer above (pframespec/engine).
90
+ *
91
+ * The return is parameterized with default `C = PObjectId`. Concrete
92
+ * recipes may narrow the parameter (e.g. `SpecQuery<ColumnRecipeId>`) if
93
+ * they need to thread nested id variants.
94
+ */
95
+ getQuery(): SpecQuery;
96
+
97
+ /**
98
+ * Aggregate status across ALL PObjectIds this recipe reaches: own leaf +
99
+ * refs from overrides + the parent chain of discovery.
100
+ *
101
+ * Rule: `absent ▸ resolving ▸ present` ("worst wins").
102
+ */
103
+ getDataStatus(): ColumnFieldStatus;
104
+
105
+ /**
106
+ * Apply overrides on the spec. Always returns a new recipe.
107
+ *
108
+ * Flat-merge invariant: if `self` is already Overridden, the implementation
109
+ * merges `overrides` with the existing ones and returns the same depth
110
+ * (one Overridden wrapper). No `Overridden<Overridden<...>>`.
111
+ */
112
+ withSpecs(overrides: SpecOverrides): ColumnRecipe;
113
+ }
@@ -0,0 +1,164 @@
1
+ import type { AxisSpec, PColumnSpec, PObjectId } from "@milaboratories/pl-model-common";
2
+ import { createGlobalPObjectId } from "@milaboratories/pl-model-common";
3
+
4
+ import { afterEach, beforeEach, describe, expect, test } from "vitest";
5
+ import { ColumnsCollection } from "./columns_collection";
6
+ import {
7
+ createTestCollectionDriver,
8
+ type TestCollectionDriverHandle,
9
+ } from "./__test_helpers__/collection_driver";
10
+
11
+ let handle: TestCollectionDriverHandle;
12
+
13
+ beforeEach(() => {
14
+ handle = createTestCollectionDriver();
15
+ });
16
+
17
+ afterEach(async () => {
18
+ await handle.dispose();
19
+ });
20
+
21
+ const DEFAULT_AXIS: AxisSpec = { name: "id", type: "String" } as AxisSpec;
22
+
23
+ function gid(name: string): PObjectId {
24
+ return createGlobalPObjectId("test-block", name);
25
+ }
26
+
27
+ function spec(name: string, axesSpec: AxisSpec[] = [DEFAULT_AXIS]): PColumnSpec {
28
+ return { kind: "PColumn", name, valueType: "Int", axesSpec, annotations: {} } as PColumnSpec;
29
+ }
30
+
31
+ function makeCollection(
32
+ cols: ReadonlyArray<{ id: PObjectId; spec: PColumnSpec }>,
33
+ options?: { isFinal?: boolean },
34
+ ): ColumnsCollection {
35
+ handle.register(cols);
36
+ return ColumnsCollection(
37
+ [
38
+ {
39
+ columns: cols.map((c) => ({ id: c.id, spec: c.spec, data: undefined })) as never,
40
+ isFinal: options?.isFinal ?? true,
41
+ },
42
+ ],
43
+ { driver: handle.driver },
44
+ );
45
+ }
46
+
47
+ describe("ColumnsCollection constructor", () => {
48
+ test("accepts column array source", () => {
49
+ const c = { id: gid("c1"), spec: spec("col1") };
50
+ expect(makeCollection([c]).getColumnIds()).toEqual([c.id]);
51
+ });
52
+
53
+ test("merges multiple sources", () => {
54
+ const c1 = { id: gid("c1"), spec: spec("col1") };
55
+ const c2 = { id: gid("c2"), spec: spec("col2") };
56
+ handle.register([c1, c2]);
57
+ const ids = ColumnsCollection(
58
+ [
59
+ { columns: [{ id: c1.id, spec: c1.spec, data: undefined }] as never, isFinal: true },
60
+ { columns: [{ id: c2.id, spec: c2.spec, data: undefined }] as never, isFinal: true },
61
+ ],
62
+ { driver: handle.driver },
63
+ ).getColumnIds();
64
+ expect(ids).toEqual([c1.id, c2.id]);
65
+ });
66
+
67
+ test("empty sources array yields empty collection", () => {
68
+ const coll = ColumnsCollection([], { driver: handle.driver });
69
+ expect(coll.getColumnIds()).toEqual([]);
70
+ });
71
+ });
72
+
73
+ describe("ColumnsCollection.isEmpty", () => {
74
+ test("true when no columns", () => {
75
+ expect(ColumnsCollection([], { driver: handle.driver }).isEmpty()).toBe(true);
76
+ });
77
+
78
+ test("false when at least one column", () => {
79
+ const c = { id: gid("c1"), spec: spec("col1") };
80
+ expect(makeCollection([c]).isEmpty()).toBe(false);
81
+ });
82
+ });
83
+
84
+ describe("ColumnsCollection.isFinal", () => {
85
+ test("true when all sources final", () => {
86
+ const c = { id: gid("c1"), spec: spec("col1") };
87
+ expect(makeCollection([c], { isFinal: true }).isFinal()).toBe(true);
88
+ });
89
+
90
+ test("false when any source incomplete", () => {
91
+ const c = { id: gid("c1"), spec: spec("col1") };
92
+ expect(makeCollection([c], { isFinal: false }).isFinal()).toBe(false);
93
+ });
94
+
95
+ test("true with no sources (vacuous)", () => {
96
+ expect(ColumnsCollection([], { driver: handle.driver }).isFinal()).toBe(true);
97
+ });
98
+ });
99
+
100
+ describe("ColumnsCollection.getColumnIds", () => {
101
+ test("deduplicates by id across sources (first wins)", () => {
102
+ const id = gid("c1");
103
+ const c1 = { id, spec: spec("col1") };
104
+ const c2 = { id, spec: spec("col1-dup") };
105
+ handle.register([c1]);
106
+ const ids = ColumnsCollection(
107
+ [
108
+ { columns: [{ id: c1.id, spec: c1.spec, data: undefined }] as never, isFinal: true },
109
+ { columns: [{ id: c2.id, spec: c2.spec, data: undefined }] as never, isFinal: true },
110
+ ],
111
+ { driver: handle.driver },
112
+ ).getColumnIds();
113
+ expect(ids).toEqual([id]);
114
+ });
115
+ });
116
+
117
+ describe("ColumnsCollection.addSource", () => {
118
+ test("returns new instance, original unchanged", () => {
119
+ const c1 = { id: gid("c1"), spec: spec("col1") };
120
+ const c2 = { id: gid("c2"), spec: spec("col2") };
121
+ handle.register([c1, c2]);
122
+ const base = makeCollection([c1]);
123
+ const next = base.addSource({
124
+ columns: [{ id: c2.id, spec: c2.spec, data: undefined } as never],
125
+ isFinal: true,
126
+ });
127
+
128
+ expect(next).not.toBe(base);
129
+ expect(base.getColumnIds()).toEqual([c1.id]);
130
+ expect(next.getColumnIds()).toEqual([c1.id, c2.id]);
131
+ });
132
+
133
+ test("isFinal reflects appended source", () => {
134
+ const c1 = { id: gid("c1"), spec: spec("col1") };
135
+ const c2 = { id: gid("c2"), spec: spec("col2") };
136
+ handle.register([c1, c2]);
137
+ const base = makeCollection([c1], { isFinal: true });
138
+ expect(base.isFinal()).toBe(true);
139
+
140
+ const next = base.addSource({
141
+ columns: [{ id: c2.id, spec: c2.spec, data: undefined } as never],
142
+ isFinal: false,
143
+ });
144
+ expect(next.isFinal()).toBe(false);
145
+ });
146
+ });
147
+
148
+ describe("ColumnsCollection.filter", () => {
149
+ test("returns collection with filtered ids", () => {
150
+ const c1 = { id: gid("c1"), spec: spec("col1") };
151
+ const c2 = { id: gid("c2"), spec: spec("col2") };
152
+ const ids = makeCollection([c1, c2])
153
+ .filter({ exclude: { name: "col1" } })
154
+ .getColumnIds();
155
+ expect(ids).toEqual([c2.id]);
156
+ });
157
+
158
+ test("no filters returns all ids", () => {
159
+ const c1 = { id: gid("c1"), spec: spec("col1") };
160
+ const c2 = { id: gid("c2"), spec: spec("col2") };
161
+ const ids = makeCollection([c1, c2]).filter({}).getColumnIds();
162
+ expect(ids).toEqual([c1.id, c2.id]);
163
+ });
164
+ });
@@ -0,0 +1,170 @@
1
+ import type {
2
+ CollectionHandle,
3
+ ColumnUniversalId,
4
+ ColumnsCollectionDriverModel,
5
+ ColumnsDiscoverOptions,
6
+ ColumnsFilterOptions,
7
+ SerializedColumnsSource,
8
+ } from "@milaboratories/pl-model-common";
9
+ import type { GlobalCfgRenderCtx } from "../render/internal";
10
+ import { MainAccessorName, StagingAccessorName } from "../render/internal";
11
+ import type { ColumnsSource } from "./column_providers";
12
+ import { isColumnProvider } from "./column_providers";
13
+ import { TreeNodeAccessor } from "../render/accessor";
14
+ import { getService } from "../services/get_services";
15
+ import { getCfgRenderCtx } from "../internal";
16
+ import { ColumnRecipe } from "./column_recipes";
17
+ import { isNil } from "es-toolkit";
18
+
19
+ export interface ColumnsCollectionDeps {
20
+ /** Render ctx used both for service resolution and for default ctx sources. */
21
+ readonly ctx?: GlobalCfgRenderCtx;
22
+ /** Override the resolved `columnsCollection` service — primarily for tests. */
23
+ readonly driver?: ColumnsCollectionDriverModel;
24
+ }
25
+
26
+ /**
27
+ * Shorthand literals accepted inside `ColumnsCollection`'s `sources`
28
+ * array, expanded against the active render ctx:
29
+ *
30
+ * - `"result_pool"` – fan-out into the host's upstream-block result pool.
31
+ * - `"current_block"` – main outputs + prerun (staging) accessors of the
32
+ * current block, when present.
33
+ */
34
+ export type ColumnsSourceShorthand = "result_pool" | "current_block";
35
+
36
+ /**
37
+ * Build a {@link ColumnsCollection} from sandbox-side source descriptors.
38
+ * Resolves the `columnsCollection` driver (either from `deps.driver` or via
39
+ * `getService("columnsCollection")`) and asks the host to mint a fresh
40
+ * handle covering the supplied sources. Pass `sources === undefined` to
41
+ * fall back to the active render ctx (main outputs + prerun + result pool).
42
+ *
43
+ * `sources` accepts {@link ColumnsSourceShorthand} string literals
44
+ * (`"result_pool"`, `"current_block"`) for the common ctx-derived sources.
45
+ */
46
+ export function ColumnsCollection(
47
+ sources?: (ColumnsCollection | ColumnsSource | ColumnsSourceShorthand)[],
48
+ deps?: ColumnsCollectionDeps,
49
+ ): ColumnsCollection {
50
+ const driver = deps?.driver ?? getService("columnsCollection", { ctx: deps?.ctx });
51
+ const serialized: SerializedColumnsSource[] = sources
52
+ ? sources.flatMap((s) => toSerializedSources(s, deps?.ctx))
53
+ : defaultCtxSources(deps?.ctx);
54
+ return new ColumnsCollectionImpl(driver.create(serialized), driver);
55
+ }
56
+
57
+ export function isColumnsCollection(value: unknown): value is ColumnsCollection {
58
+ return value instanceof ColumnsCollectionImpl;
59
+ }
60
+
61
+ /**
62
+ * Sandbox proxy over the host-side `ColumnsCollection` driver. The driver
63
+ * owns all column-set state; this object only carries an opaque
64
+ * {@link CollectionHandle} plus a reference to the driver service.
65
+ *
66
+ * Construct via {@link ColumnsCollection} — the bare constructor is a
67
+ * trivial `(handle, driver)` pair so that `addSource` / `discover` / `filter`
68
+ * can rebind a freshly-minted handle without going through source
69
+ * serialisation again.
70
+ *
71
+ * Every method returning a `ColumnsCollection` mints a fresh handle on the
72
+ * host — the host VM bridge pins it to the active render ctx, so the sandbox
73
+ * never has to manage refcounts.
74
+ */
75
+ export class ColumnsCollectionImpl {
76
+ constructor(
77
+ public readonly handle: CollectionHandle,
78
+ private readonly driver: ColumnsCollectionDriverModel,
79
+ ) {}
80
+
81
+ isEmpty(): boolean {
82
+ return this.driver.isEmpty(this.handle);
83
+ }
84
+
85
+ isFinal(): boolean {
86
+ return this.driver.isFinal(this.handle);
87
+ }
88
+
89
+ getColumnIds(): ColumnUniversalId[] {
90
+ return this.driver.getColumns(this.handle);
91
+ }
92
+
93
+ getColumns(): ColumnRecipe[] {
94
+ return this.getColumnIds()
95
+ .map((id) => ColumnRecipe(id))
96
+ .filter((c): c is ColumnRecipe => !isNil(c));
97
+ }
98
+
99
+ addSource(source: ColumnsSource | ColumnsCollection): ColumnsCollection {
100
+ return new ColumnsCollectionImpl(
101
+ this.driver.addSource(this.handle, toSerializedSources(source)),
102
+ this.driver,
103
+ );
104
+ }
105
+
106
+ discover(options: ColumnsDiscoverOptions): ColumnsCollection {
107
+ return new ColumnsCollectionImpl(this.driver.discover(this.handle, options), this.driver);
108
+ }
109
+
110
+ filter(options: ColumnsFilterOptions): ColumnsCollection {
111
+ return new ColumnsCollectionImpl(this.driver.filter(this.handle, options), this.driver);
112
+ }
113
+ }
114
+
115
+ /** Public type alias — value of the same name is the factory function above. */
116
+ export type ColumnsCollection = ColumnsCollectionImpl;
117
+
118
+ function toSerializedSources(
119
+ source: ColumnsCollection | ColumnsSource | ColumnsSourceShorthand,
120
+ ctx?: GlobalCfgRenderCtx,
121
+ ): SerializedColumnsSource[] {
122
+ if (source === "result_pool") {
123
+ return [{ kind: "result_pool" }];
124
+ }
125
+ if (source === "current_block") {
126
+ return currentBlockSources(ctx);
127
+ }
128
+ if (source instanceof ColumnsCollectionImpl) {
129
+ return [{ kind: "collection", handle: source.handle }];
130
+ }
131
+ if (source instanceof TreeNodeAccessor) {
132
+ return [{ kind: "accessor", accessor: source.handle, path: source.resolvePath }];
133
+ }
134
+ if (isColumnArray(source)) {
135
+ return [{ kind: "ids", ids: source.columns.map((c) => c.id), isFinal: source.isFinal }];
136
+ }
137
+ if (isColumnProvider(source)) {
138
+ return [{ kind: "ids", ids: source.getColumns().map((c) => c.id), isFinal: source.isFinal() }];
139
+ }
140
+ throw new Error("ColumnsCollection: unrecognised ColumnsSource shape");
141
+ }
142
+
143
+ function isColumnArray(source: unknown): source is {
144
+ columns: ReadonlyArray<{ id: ColumnUniversalId; spec?: unknown; data?: unknown }>;
145
+ isFinal: boolean;
146
+ } {
147
+ if (typeof source !== "object" || source === null) return false;
148
+ const s = source as { columns?: unknown; isFinal?: unknown };
149
+ return Array.isArray(s.columns) && typeof s.isFinal === "boolean";
150
+ }
151
+
152
+ function currentBlockSources(ctx?: GlobalCfgRenderCtx): SerializedColumnsSource[] {
153
+ const renderCtx = ctx ?? getCfgRenderCtx();
154
+ const sources: SerializedColumnsSource[] = [];
155
+
156
+ const outputs = renderCtx.getAccessorHandleByName(MainAccessorName);
157
+ if (outputs !== undefined) {
158
+ sources.push({ kind: "accessor", accessor: outputs, path: [MainAccessorName] });
159
+ }
160
+ const prerun = renderCtx.getAccessorHandleByName(StagingAccessorName);
161
+ if (prerun !== undefined) {
162
+ sources.push({ kind: "accessor", accessor: prerun, path: [StagingAccessorName] });
163
+ }
164
+
165
+ return sources;
166
+ }
167
+
168
+ function defaultCtxSources(ctx?: GlobalCfgRenderCtx): SerializedColumnsSource[] {
169
+ return [...currentBlockSources(ctx), { kind: "result_pool" }];
170
+ }