@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
@@ -373,7 +373,7 @@ function isPColumnReady(c) {
373
373
  const isValues = (d) => Array.isArray(d);
374
374
  const isAccessor = (d) => d instanceof TreeNodeAccessor;
375
375
  let ready = true;
376
- const data = typeof c.data === "function" ? c.data() : c.data;
376
+ const data = c.data;
377
377
  if (data == null) return false;
378
378
  else if (isAccessor(data)) ready &&= data.getIsReadyOrError();
379
379
  else if (isDataInfo(data)) visitDataInfo(data, (v) => ready &&= v.getIsReadyOrError());
@@ -1 +1 @@
1
- {"version":3,"file":"pcolumn_data.js","names":[],"sources":["../../../src/render/util/pcolumn_data.ts"],"sourcesContent":["import type {\n DataInfo,\n ParquetChunkMetadata,\n PartitionedDataInfoEntries,\n PColumn,\n PColumnLazy,\n PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport {\n assertNever,\n dataInfoToEntries,\n isDataInfo,\n isDataInfoEntries,\n visitDataInfo,\n type BinaryChunk,\n type DataInfoEntries,\n type PColumnDataEntry,\n type PColumnKey,\n} from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../accessor\";\nimport type { PColumnDataUniversal } from \"../internal\";\n\nconst PCD_PREFIX = \"PColumnData/\";\n\nexport const RT_RESOURCE_MAP = PCD_PREFIX + \"ResourceMap\";\nexport const RT_RESOURCE_MAP_PARTITIONED = PCD_PREFIX + \"Partitioned/ResourceMap\";\n\nexport const RT_JSON_PARTITIONED = PCD_PREFIX + \"JsonPartitioned\";\nexport const RT_BINARY_PARTITIONED = PCD_PREFIX + \"BinaryPartitioned\";\nexport const RT_PARQUET_PARTITIONED = PCD_PREFIX + \"ParquetPartitioned\";\n\nconst PCD_SUP_PREFIX = PCD_PREFIX + \"Partitioned/\";\nexport const RT_JSON_SUPER_PARTITIONED = PCD_SUP_PREFIX + \"JsonPartitioned\";\nexport const RT_BINARY_SUPER_PARTITIONED = PCD_SUP_PREFIX + \"BinaryPartitioned\";\nexport const RT_PARQUET_SUPER_PARTITIONED = PCD_SUP_PREFIX + \"ParquetPartitioned\";\n\nexport type PColumnResourceMapEntry<T> = {\n key: PColumnKey;\n value: T;\n};\n\nexport type PColumnResourceMapData<T> = {\n isComplete: boolean;\n data: PColumnResourceMapEntry<T>[];\n};\n\nfunction populateResourceMapData<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n data: PColumnResourceMapEntry<T | undefined>[],\n keyPrefix: PColumnKey = [],\n addEntriesWithNoData: boolean,\n): boolean {\n if (acc === undefined) return false;\n switch (acc.resourceType.name) {\n case RT_RESOURCE_MAP: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const converted = value === undefined ? undefined : resourceParser(value);\n if (converted === undefined) isComplete = false;\n if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });\n }\n return isComplete;\n }\n case RT_RESOURCE_MAP_PARTITIONED: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) isComplete = false;\n else {\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const populateResult = populateResourceMapData(\n value,\n resourceParser,\n data,\n key,\n addEntriesWithNoData,\n );\n isComplete = isComplete && populateResult;\n }\n }\n return isComplete;\n }\n default:\n throw new Error(`Unknown resource type: ${acc.resourceType.name}`);\n }\n}\n\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: false,\n): PColumnResourceMapData<NonNullable<T>>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: true,\n): PColumnResourceMapData<T | undefined>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: boolean = false,\n): PColumnResourceMapData<T | undefined> {\n const data: PColumnResourceMapEntry<T | undefined>[] = [];\n const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);\n return { isComplete, data };\n}\n\nexport type PColumnKeyList = {\n /** array of keys */\n data: PColumnKey[];\n /** length of partition key */\n keyLength: number;\n};\n\nconst removeIndexSuffix = (keyStr: string): { baseKey: string; type: \"index\" | \"values\" } => {\n if (keyStr.endsWith(\".index\")) {\n return { baseKey: keyStr.substring(0, keyStr.length - 6), type: \"index\" };\n } else if (keyStr.endsWith(\".values\")) {\n return { baseKey: keyStr.substring(0, keyStr.length - 7), type: \"values\" };\n } else {\n throw new Error(`key must ends on .index/.values for binary p-column, got: ${keyStr}`);\n }\n};\n\n// @TODO define a class with various resource map operations\n/** Returns a list of all partition keys appeared in the p-column */\nexport function getPartitionKeysList(\n acc: TreeNodeAccessor | undefined,\n): PColumnKeyList | undefined {\n if (!acc) return undefined;\n\n const rt = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n const data: PColumnKey[] = [];\n\n let keyLength = 0;\n // @TODO validate meta shape\n switch (rt) {\n case RT_RESOURCE_MAP:\n keyLength = meta[\"keyLength\"];\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n keyLength = meta[\"partitionKeyLength\"] + meta[\"keyLength\"];\n break;\n\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n case RT_PARQUET_PARTITIONED:\n keyLength = meta[\"partitionKeyLength\"];\n break;\n\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n case RT_PARQUET_SUPER_PARTITIONED:\n keyLength = meta[\"superPartitionKeyLength\"] + meta[\"partitionKeyLength\"];\n break;\n }\n\n switch (rt) {\n case RT_RESOURCE_MAP:\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n case RT_PARQUET_PARTITIONED:\n for (let keyStr of acc.listInputFields()) {\n if (rt === RT_BINARY_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n case RT_PARQUET_SUPER_PARTITIONED:\n for (const supKeyStr of acc.listInputFields()) {\n const keyPrefix = [...JSON.parse(supKeyStr)] as PColumnKey;\n\n const value = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (value !== undefined) {\n for (let keyStr of value.listInputFields()) {\n if (rt === RT_BINARY_SUPER_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n }\n }\n break;\n }\n\n return { data, keyLength };\n}\n\nfunction getUniquePartitionKeysForDataEntries(\n list: DataInfoEntries<unknown>,\n): (string | number)[][] {\n if (\n list.type !== \"JsonPartitioned\" &&\n list.type !== \"BinaryPartitioned\" &&\n list.type !== \"ParquetPartitioned\"\n )\n throw new Error(`Splitting requires Partitioned DataInfoEntries, got ${list.type}`);\n\n const { parts, partitionKeyLength } = list;\n\n const result: Set<string | number>[] = [];\n for (let i = 0; i < partitionKeyLength; ++i) {\n result.push(new Set());\n }\n\n for (const part of parts) {\n const key = part.key;\n if (key.length !== partitionKeyLength) {\n throw new Error(\n `Key length (${key.length}) does not match partition length (${partitionKeyLength}) for key: ${JSON.stringify(\n key,\n )}`,\n );\n }\n for (let i = 0; i < partitionKeyLength; ++i) {\n result[i].add(key[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */\nexport function getUniquePartitionKeys(acc: DataInfoEntries<unknown>): (string | number)[][];\nexport function getUniquePartitionKeys(\n acc: DataInfoEntries<unknown> | TreeNodeAccessor | undefined,\n): (string | number)[][] | undefined;\nexport function getUniquePartitionKeys(\n acc: TreeNodeAccessor | DataInfoEntries<unknown> | undefined,\n): (string | number)[][] | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc)) return getUniquePartitionKeysForDataEntries(acc);\n\n const list = getPartitionKeysList(acc);\n if (!list) return undefined;\n\n const { data, keyLength } = list;\n\n const result: Set<string | number>[] = [];\n\n for (let i = 0; i < keyLength; ++i) {\n result.push(new Set());\n }\n\n for (const l of data) {\n if (l.length !== keyLength) {\n throw new Error(\"key length does not match partition length\");\n }\n for (let i = 0; i < keyLength; ++i) {\n result[i].add(l[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/**\n * Parses the PColumn data from a TreeNodeAccessor into a DataInfoEntries structure.\n * Returns undefined if any required data is missing.\n * Throws error on validation failures.\n *\n * @param acc - The TreeNodeAccessor containing PColumn data\n * @param keyPrefix - Optional key prefix for recursive calls\n * @returns DataInfoEntries representation of the PColumn data, or undefined if incomplete\n */\nexport function parsePColumnData(\n acc: TreeNodeAccessor | undefined,\n keyPrefix: PColumnKey = [],\n): PartitionedDataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (!acc.getIsReadyOrError()) return undefined;\n\n const resourceType = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n\n // Prevent recursive super-partitioned resources\n if (\n keyPrefix.length > 0 &&\n (resourceType === RT_JSON_SUPER_PARTITIONED ||\n resourceType === RT_BINARY_SUPER_PARTITIONED ||\n resourceType === RT_PARQUET_SUPER_PARTITIONED)\n ) {\n throw new Error(`Unexpected nested super-partitioned resource: ${resourceType}`);\n }\n\n switch (resourceType) {\n case RT_RESOURCE_MAP:\n case RT_RESOURCE_MAP_PARTITIONED:\n throw new Error(`Only data columns are supported, got: ${resourceType}`);\n\n case RT_JSON_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== \"number\") {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(keyStr)];\n parts.push({ key, value });\n }\n\n return {\n type: \"JsonPartitioned\",\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== \"number\") {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n const baseKeys = new Map<string, { index?: TreeNodeAccessor; values?: TreeNodeAccessor }>();\n\n // Group fields by base key (without .index/.values suffix)\n for (const keyStr of acc.listInputFields()) {\n const suffix = removeIndexSuffix(keyStr);\n\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) return undefined;\n\n let entry = baseKeys.get(suffix.baseKey);\n if (!entry) {\n entry = {};\n baseKeys.set(suffix.baseKey, entry);\n }\n\n if (suffix.type === \"index\") {\n entry.index = value;\n } else {\n entry.values = value;\n }\n }\n\n // Process complete binary chunks only\n for (const [baseKeyStr, entry] of baseKeys.entries()) {\n if (!entry.index || !entry.values) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(baseKeyStr)];\n parts.push({\n key,\n value: {\n index: entry.index,\n values: entry.values,\n },\n });\n }\n\n return {\n type: \"BinaryPartitioned\",\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_PARQUET_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== \"number\") {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(keyStr)];\n parts.push({ key, value });\n }\n\n return {\n type: \"ParquetPartitioned\",\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_JSON_SUPER_PARTITIONED: {\n if (\n typeof meta?.superPartitionKeyLength !== \"number\" ||\n typeof meta?.partitionKeyLength !== \"number\"\n ) {\n throw new Error(\n `Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`,\n );\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_JSON_PARTITIONED) {\n throw new Error(\n `Expected ${RT_JSON_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`,\n );\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== \"JsonPartitioned\")\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: \"JsonPartitioned\",\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_SUPER_PARTITIONED: {\n if (\n typeof meta?.superPartitionKeyLength !== \"number\" ||\n typeof meta?.partitionKeyLength !== \"number\"\n ) {\n throw new Error(\n `Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`,\n );\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_BINARY_PARTITIONED) {\n throw new Error(\n `Expected ${RT_BINARY_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`,\n );\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== \"BinaryPartitioned\")\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: \"BinaryPartitioned\",\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n case RT_PARQUET_SUPER_PARTITIONED: {\n if (\n typeof meta?.superPartitionKeyLength !== \"number\" ||\n typeof meta?.partitionKeyLength !== \"number\"\n ) {\n throw new Error(\n `Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`,\n );\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_PARQUET_PARTITIONED) {\n throw new Error(\n `Expected ${RT_PARQUET_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`,\n );\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== \"ParquetPartitioned\")\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: \"ParquetPartitioned\",\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n default:\n throw new Error(`Unknown resource type: ${resourceType}`);\n }\n}\n\n/**\n * Converts or parses the input into DataInfoEntries format.\n\n * @param acc - The input data, which can be TreeNodeAccessor, DataInfoEntries, DataInfo, or undefined.\n * @returns The data in DataInfoEntries format, or undefined if the input was undefined or data is not ready.\n */\nexport function convertOrParsePColumnData(\n acc:\n | TreeNodeAccessor\n | DataInfoEntries<TreeNodeAccessor>\n | DataInfo<TreeNodeAccessor>\n | undefined,\n): DataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc)) return acc;\n if (isDataInfo(acc)) return dataInfoToEntries(acc);\n if (acc instanceof TreeNodeAccessor) return parsePColumnData(acc);\n\n throw new Error(`Unexpected input type: ${typeof acc}`);\n}\n\n/**\n * Returns the total number of rows in a PColumn, or `undefined` when the count\n * cannot be determined without downloading data blobs.\n *\n * Derivable cases:\n * - Inline values ({@link PColumnValues}): one entry per row.\n * - Inline `Json` {@link DataInfo}: one entry per row.\n * - Parquet (`ParquetPartitioned` / `ParquetSuperPartitioned`): summed from\n * each chunk's precomputed {@link ParquetChunkMetadata.stats} `numberOfRows`,\n * read from the chunk resource metadata without downloading the parquet files.\n *\n * Returns `undefined` when:\n * - the data is `undefined` or still computing / not ready,\n * - the data is `JsonPartitioned` or `BinaryPartitioned` (per-part row counts\n * live inside opaque blobs and are not readable here),\n * - any parquet chunk is missing `stats.numberOfRows`.\n *\n * Note: do not confuse row count with `keyLength` / `partitionKeyLength`, which\n * are axis-tuple lengths, not row counts.\n */\nexport function getNumberOfRows(data: PColumnDataUniversal | undefined): number | undefined {\n if (data === undefined) return undefined;\n\n // Inline explicit values: one entry per row.\n if (Array.isArray(data)) return data.length;\n\n const entries = convertOrParsePColumnData(data);\n if (entries === undefined) return undefined;\n\n switch (entries.type) {\n case \"Json\":\n // Inline Json: one entry per row.\n return entries.data.length;\n\n case \"JsonPartitioned\":\n case \"BinaryPartitioned\":\n // Per-part row counts live inside opaque blobs; not knowable without download.\n return undefined;\n\n case \"ParquetPartitioned\": {\n let total = 0;\n for (const { value } of entries.parts) {\n // The part accessor points at a ParquetChunk resource whose JSON payload\n // is ParquetChunkMetadata. Reading it does not download the parquet file\n // (the file lives in a separate `blob` sub-field of the chunk resource).\n const rows = value.getDataAsJsonOrUndefined<ParquetChunkMetadata>()?.stats?.numberOfRows;\n // stats / numberOfRows are Partial: if any chunk lacks it, the total is unknowable.\n if (typeof rows !== \"number\") return undefined;\n total += rows;\n }\n return total;\n }\n\n default:\n assertNever(entries);\n }\n}\n\nexport function isPColumnReady(\n c: PColumn<undefined | PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>,\n): c is PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal> {\n const isValues = (d: PColumnDataUniversal): d is PColumnValues => Array.isArray(d);\n const isAccessor = (d: PColumnDataUniversal): d is TreeNodeAccessor =>\n d instanceof TreeNodeAccessor;\n\n let ready = true;\n const data = typeof c.data === \"function\" ? c.data() : c.data;\n if (data == null) {\n return false;\n } else if (isAccessor(data)) {\n ready &&= data.getIsReadyOrError();\n } else if (isDataInfo(data)) {\n visitDataInfo(data, (v) => (ready &&= v.getIsReadyOrError()));\n } else if (!isValues(data)) {\n throw Error(`unsupported column data type: ${data satisfies never}`);\n }\n return ready;\n}\n\nexport function allPColumnsReady(\n columns: (\n | PColumn<undefined | PColumnDataUniversal>\n | PColumnLazy<undefined | PColumnDataUniversal>\n )[],\n): columns is (PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal>)[] {\n return columns.every(isPColumnReady);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pcolumn_data.js","names":[],"sources":["../../../src/render/util/pcolumn_data.ts"],"sourcesContent":["import type {\n DataInfo,\n ParquetChunkMetadata,\n PartitionedDataInfoEntries,\n PColumn,\n PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport {\n assertNever,\n dataInfoToEntries,\n isDataInfo,\n isDataInfoEntries,\n visitDataInfo,\n type BinaryChunk,\n type DataInfoEntries,\n type PColumnDataEntry,\n type PColumnKey,\n} from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../accessor\";\nimport type { PColumnDataUniversal } from \"../internal\";\n\nconst PCD_PREFIX = \"PColumnData/\";\n\nexport const RT_RESOURCE_MAP = PCD_PREFIX + \"ResourceMap\";\nexport const RT_RESOURCE_MAP_PARTITIONED = PCD_PREFIX + \"Partitioned/ResourceMap\";\n\nexport const RT_JSON_PARTITIONED = PCD_PREFIX + \"JsonPartitioned\";\nexport const RT_BINARY_PARTITIONED = PCD_PREFIX + \"BinaryPartitioned\";\nexport const RT_PARQUET_PARTITIONED = PCD_PREFIX + \"ParquetPartitioned\";\n\nconst PCD_SUP_PREFIX = PCD_PREFIX + \"Partitioned/\";\nexport const RT_JSON_SUPER_PARTITIONED = PCD_SUP_PREFIX + \"JsonPartitioned\";\nexport const RT_BINARY_SUPER_PARTITIONED = PCD_SUP_PREFIX + \"BinaryPartitioned\";\nexport const RT_PARQUET_SUPER_PARTITIONED = PCD_SUP_PREFIX + \"ParquetPartitioned\";\n\nexport type PColumnResourceMapEntry<T> = {\n key: PColumnKey;\n value: T;\n};\n\nexport type PColumnResourceMapData<T> = {\n isComplete: boolean;\n data: PColumnResourceMapEntry<T>[];\n};\n\nfunction populateResourceMapData<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n data: PColumnResourceMapEntry<T | undefined>[],\n keyPrefix: PColumnKey = [],\n addEntriesWithNoData: boolean,\n): boolean {\n if (acc === undefined) return false;\n switch (acc.resourceType.name) {\n case RT_RESOURCE_MAP: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const converted = value === undefined ? undefined : resourceParser(value);\n if (converted === undefined) isComplete = false;\n if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });\n }\n return isComplete;\n }\n case RT_RESOURCE_MAP_PARTITIONED: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) isComplete = false;\n else {\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const populateResult = populateResourceMapData(\n value,\n resourceParser,\n data,\n key,\n addEntriesWithNoData,\n );\n isComplete = isComplete && populateResult;\n }\n }\n return isComplete;\n }\n default:\n throw new Error(`Unknown resource type: ${acc.resourceType.name}`);\n }\n}\n\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: false,\n): PColumnResourceMapData<NonNullable<T>>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: true,\n): PColumnResourceMapData<T | undefined>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: boolean = false,\n): PColumnResourceMapData<T | undefined> {\n const data: PColumnResourceMapEntry<T | undefined>[] = [];\n const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);\n return { isComplete, data };\n}\n\nexport type PColumnKeyList = {\n /** array of keys */\n data: PColumnKey[];\n /** length of partition key */\n keyLength: number;\n};\n\nconst removeIndexSuffix = (keyStr: string): { baseKey: string; type: \"index\" | \"values\" } => {\n if (keyStr.endsWith(\".index\")) {\n return { baseKey: keyStr.substring(0, keyStr.length - 6), type: \"index\" };\n } else if (keyStr.endsWith(\".values\")) {\n return { baseKey: keyStr.substring(0, keyStr.length - 7), type: \"values\" };\n } else {\n throw new Error(`key must ends on .index/.values for binary p-column, got: ${keyStr}`);\n }\n};\n\n// @TODO define a class with various resource map operations\n/** Returns a list of all partition keys appeared in the p-column */\nexport function getPartitionKeysList(\n acc: TreeNodeAccessor | undefined,\n): PColumnKeyList | undefined {\n if (!acc) return undefined;\n\n const rt = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n const data: PColumnKey[] = [];\n\n let keyLength = 0;\n // @TODO validate meta shape\n switch (rt) {\n case RT_RESOURCE_MAP:\n keyLength = meta[\"keyLength\"];\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n keyLength = meta[\"partitionKeyLength\"] + meta[\"keyLength\"];\n break;\n\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n case RT_PARQUET_PARTITIONED:\n keyLength = meta[\"partitionKeyLength\"];\n break;\n\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n case RT_PARQUET_SUPER_PARTITIONED:\n keyLength = meta[\"superPartitionKeyLength\"] + meta[\"partitionKeyLength\"];\n break;\n }\n\n switch (rt) {\n case RT_RESOURCE_MAP:\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n case RT_PARQUET_PARTITIONED:\n for (let keyStr of acc.listInputFields()) {\n if (rt === RT_BINARY_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n case RT_PARQUET_SUPER_PARTITIONED:\n for (const supKeyStr of acc.listInputFields()) {\n const keyPrefix = [...JSON.parse(supKeyStr)] as PColumnKey;\n\n const value = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (value !== undefined) {\n for (let keyStr of value.listInputFields()) {\n if (rt === RT_BINARY_SUPER_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n }\n }\n break;\n }\n\n return { data, keyLength };\n}\n\nfunction getUniquePartitionKeysForDataEntries(\n list: DataInfoEntries<unknown>,\n): (string | number)[][] {\n if (\n list.type !== \"JsonPartitioned\" &&\n list.type !== \"BinaryPartitioned\" &&\n list.type !== \"ParquetPartitioned\"\n )\n throw new Error(`Splitting requires Partitioned DataInfoEntries, got ${list.type}`);\n\n const { parts, partitionKeyLength } = list;\n\n const result: Set<string | number>[] = [];\n for (let i = 0; i < partitionKeyLength; ++i) {\n result.push(new Set());\n }\n\n for (const part of parts) {\n const key = part.key;\n if (key.length !== partitionKeyLength) {\n throw new Error(\n `Key length (${key.length}) does not match partition length (${partitionKeyLength}) for key: ${JSON.stringify(\n key,\n )}`,\n );\n }\n for (let i = 0; i < partitionKeyLength; ++i) {\n result[i].add(key[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */\nexport function getUniquePartitionKeys(acc: DataInfoEntries<unknown>): (string | number)[][];\nexport function getUniquePartitionKeys(\n acc: DataInfoEntries<unknown> | TreeNodeAccessor | undefined,\n): (string | number)[][] | undefined;\nexport function getUniquePartitionKeys(\n acc: TreeNodeAccessor | DataInfoEntries<unknown> | undefined,\n): (string | number)[][] | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc)) return getUniquePartitionKeysForDataEntries(acc);\n\n const list = getPartitionKeysList(acc);\n if (!list) return undefined;\n\n const { data, keyLength } = list;\n\n const result: Set<string | number>[] = [];\n\n for (let i = 0; i < keyLength; ++i) {\n result.push(new Set());\n }\n\n for (const l of data) {\n if (l.length !== keyLength) {\n throw new Error(\"key length does not match partition length\");\n }\n for (let i = 0; i < keyLength; ++i) {\n result[i].add(l[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/**\n * Parses the PColumn data from a TreeNodeAccessor into a DataInfoEntries structure.\n * Returns undefined if any required data is missing.\n * Throws error on validation failures.\n *\n * @param acc - The TreeNodeAccessor containing PColumn data\n * @param keyPrefix - Optional key prefix for recursive calls\n * @returns DataInfoEntries representation of the PColumn data, or undefined if incomplete\n */\nexport function parsePColumnData(\n acc: TreeNodeAccessor | undefined,\n keyPrefix: PColumnKey = [],\n): PartitionedDataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (!acc.getIsReadyOrError()) return undefined;\n\n const resourceType = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n\n // Prevent recursive super-partitioned resources\n if (\n keyPrefix.length > 0 &&\n (resourceType === RT_JSON_SUPER_PARTITIONED ||\n resourceType === RT_BINARY_SUPER_PARTITIONED ||\n resourceType === RT_PARQUET_SUPER_PARTITIONED)\n ) {\n throw new Error(`Unexpected nested super-partitioned resource: ${resourceType}`);\n }\n\n switch (resourceType) {\n case RT_RESOURCE_MAP:\n case RT_RESOURCE_MAP_PARTITIONED:\n throw new Error(`Only data columns are supported, got: ${resourceType}`);\n\n case RT_JSON_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== \"number\") {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(keyStr)];\n parts.push({ key, value });\n }\n\n return {\n type: \"JsonPartitioned\",\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== \"number\") {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n const baseKeys = new Map<string, { index?: TreeNodeAccessor; values?: TreeNodeAccessor }>();\n\n // Group fields by base key (without .index/.values suffix)\n for (const keyStr of acc.listInputFields()) {\n const suffix = removeIndexSuffix(keyStr);\n\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) return undefined;\n\n let entry = baseKeys.get(suffix.baseKey);\n if (!entry) {\n entry = {};\n baseKeys.set(suffix.baseKey, entry);\n }\n\n if (suffix.type === \"index\") {\n entry.index = value;\n } else {\n entry.values = value;\n }\n }\n\n // Process complete binary chunks only\n for (const [baseKeyStr, entry] of baseKeys.entries()) {\n if (!entry.index || !entry.values) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(baseKeyStr)];\n parts.push({\n key,\n value: {\n index: entry.index,\n values: entry.values,\n },\n });\n }\n\n return {\n type: \"BinaryPartitioned\",\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_PARQUET_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== \"number\") {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: \"Input\" });\n if (value === undefined) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(keyStr)];\n parts.push({ key, value });\n }\n\n return {\n type: \"ParquetPartitioned\",\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_JSON_SUPER_PARTITIONED: {\n if (\n typeof meta?.superPartitionKeyLength !== \"number\" ||\n typeof meta?.partitionKeyLength !== \"number\"\n ) {\n throw new Error(\n `Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`,\n );\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_JSON_PARTITIONED) {\n throw new Error(\n `Expected ${RT_JSON_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`,\n );\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== \"JsonPartitioned\")\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: \"JsonPartitioned\",\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_SUPER_PARTITIONED: {\n if (\n typeof meta?.superPartitionKeyLength !== \"number\" ||\n typeof meta?.partitionKeyLength !== \"number\"\n ) {\n throw new Error(\n `Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`,\n );\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_BINARY_PARTITIONED) {\n throw new Error(\n `Expected ${RT_BINARY_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`,\n );\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== \"BinaryPartitioned\")\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: \"BinaryPartitioned\",\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n case RT_PARQUET_SUPER_PARTITIONED: {\n if (\n typeof meta?.superPartitionKeyLength !== \"number\" ||\n typeof meta?.partitionKeyLength !== \"number\"\n ) {\n throw new Error(\n `Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`,\n );\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: \"Input\" });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_PARQUET_PARTITIONED) {\n throw new Error(\n `Expected ${RT_PARQUET_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`,\n );\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== \"ParquetPartitioned\")\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: \"ParquetPartitioned\",\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n default:\n throw new Error(`Unknown resource type: ${resourceType}`);\n }\n}\n\n/**\n * Converts or parses the input into DataInfoEntries format.\n\n * @param acc - The input data, which can be TreeNodeAccessor, DataInfoEntries, DataInfo, or undefined.\n * @returns The data in DataInfoEntries format, or undefined if the input was undefined or data is not ready.\n */\nexport function convertOrParsePColumnData(\n acc:\n | TreeNodeAccessor\n | DataInfoEntries<TreeNodeAccessor>\n | DataInfo<TreeNodeAccessor>\n | undefined,\n): DataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc)) return acc;\n if (isDataInfo(acc)) return dataInfoToEntries(acc);\n if (acc instanceof TreeNodeAccessor) return parsePColumnData(acc);\n\n throw new Error(`Unexpected input type: ${typeof acc}`);\n}\n\n/**\n * Returns the total number of rows in a PColumn, or `undefined` when the count\n * cannot be determined without downloading data blobs.\n *\n * Derivable cases:\n * - Inline values ({@link PColumnValues}): one entry per row.\n * - Inline `Json` {@link DataInfo}: one entry per row.\n * - Parquet (`ParquetPartitioned` / `ParquetSuperPartitioned`): summed from\n * each chunk's precomputed {@link ParquetChunkMetadata.stats} `numberOfRows`,\n * read from the chunk resource metadata without downloading the parquet files.\n *\n * Returns `undefined` when:\n * - the data is `undefined` or still computing / not ready,\n * - the data is `JsonPartitioned` or `BinaryPartitioned` (per-part row counts\n * live inside opaque blobs and are not readable here),\n * - any parquet chunk is missing `stats.numberOfRows`.\n *\n * Note: do not confuse row count with `keyLength` / `partitionKeyLength`, which\n * are axis-tuple lengths, not row counts.\n */\nexport function getNumberOfRows(data: PColumnDataUniversal | undefined): number | undefined {\n if (data === undefined) return undefined;\n\n // Inline explicit values: one entry per row.\n if (Array.isArray(data)) return data.length;\n\n const entries = convertOrParsePColumnData(data);\n if (entries === undefined) return undefined;\n\n switch (entries.type) {\n case \"Json\":\n // Inline Json: one entry per row.\n return entries.data.length;\n\n case \"JsonPartitioned\":\n case \"BinaryPartitioned\":\n // Per-part row counts live inside opaque blobs; not knowable without download.\n return undefined;\n\n case \"ParquetPartitioned\": {\n let total = 0;\n for (const { value } of entries.parts) {\n // The part accessor points at a ParquetChunk resource whose JSON payload\n // is ParquetChunkMetadata. Reading it does not download the parquet file\n // (the file lives in a separate `blob` sub-field of the chunk resource).\n const rows = value.getDataAsJsonOrUndefined<ParquetChunkMetadata>()?.stats?.numberOfRows;\n // stats / numberOfRows are Partial: if any chunk lacks it, the total is unknowable.\n if (typeof rows !== \"number\") return undefined;\n total += rows;\n }\n return total;\n }\n\n default:\n assertNever(entries);\n }\n}\n\nexport function isPColumnReady(\n c: PColumn<undefined | PColumnDataUniversal>,\n): c is PColumn<PColumnDataUniversal> {\n const isValues = (d: PColumnDataUniversal): d is PColumnValues => Array.isArray(d);\n const isAccessor = (d: PColumnDataUniversal): d is TreeNodeAccessor =>\n d instanceof TreeNodeAccessor;\n\n let ready = true;\n const data = c.data;\n if (data == null) {\n return false;\n } else if (isAccessor(data)) {\n ready &&= data.getIsReadyOrError();\n } else if (isDataInfo(data)) {\n visitDataInfo(data, (v) => (ready &&= v.getIsReadyOrError()));\n } else if (!isValues(data)) {\n throw Error(`unsupported column data type: ${data satisfies never}`);\n }\n return ready;\n}\n\nexport function allPColumnsReady(\n columns: PColumn<undefined | PColumnDataUniversal>[],\n): columns is PColumn<PColumnDataUniversal>[] {\n return columns.every(isPColumnReady);\n}\n"],"mappings":"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"}
@@ -10,7 +10,8 @@ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common")
10
10
  const BLOCK_SERVICE_FLAGS = {
11
11
  requiresPFrameSpec: true,
12
12
  requiresPFrame: true,
13
- requiresDialog: true
13
+ requiresDialog: true,
14
+ requiresColumnsCollection: true
14
15
  };
15
16
  const blockServiceNames = (0, _milaboratories_pl_model_common.resolveRequiredServices)(BLOCK_SERVICE_FLAGS);
16
17
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"block_services.cjs","names":[],"sources":["../../src/services/block_services.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"@milaboratories/pl-model-common\";\nimport { resolveRequiredServices } from \"@milaboratories/pl-model-common\";\n\n/**\n * Services required by all V3 blocks by default.\n * Edit this when a new service should be available to all blocks.\n *\n * Standalone module to avoid circular dependencies between block_model.ts\n * and service type resolution.\n */\nexport const BLOCK_SERVICE_FLAGS = {\n requiresPFrameSpec: true,\n requiresPFrame: true,\n requiresDialog: true,\n} as const satisfies Partial<ServiceRequireFlags>;\n\nexport type BlockServiceFlags = typeof BLOCK_SERVICE_FLAGS;\n\nexport const blockServiceNames = resolveRequiredServices(BLOCK_SERVICE_FLAGS);\n"],"mappings":";;;;;;;;;AAUA,MAAa,sBAAsB;CACjC,oBAAoB;CACpB,gBAAgB;CAChB,gBAAgB;AAClB;AAIA,MAAa,qBAAA,GAAA,gCAAA,wBAAA,CAA4C,mBAAmB"}
1
+ {"version":3,"file":"block_services.cjs","names":[],"sources":["../../src/services/block_services.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"@milaboratories/pl-model-common\";\nimport { resolveRequiredServices } from \"@milaboratories/pl-model-common\";\n\n/**\n * Services required by all V3 blocks by default.\n * Edit this when a new service should be available to all blocks.\n *\n * Standalone module to avoid circular dependencies between block_model.ts\n * and service type resolution.\n */\nexport const BLOCK_SERVICE_FLAGS = {\n requiresPFrameSpec: true,\n requiresPFrame: true,\n requiresDialog: true,\n requiresColumnsCollection: true,\n} as const satisfies Partial<ServiceRequireFlags>;\n\nexport type BlockServiceFlags = typeof BLOCK_SERVICE_FLAGS;\n\nexport const blockServiceNames = resolveRequiredServices(BLOCK_SERVICE_FLAGS);\n"],"mappings":";;;;;;;;;AAUA,MAAa,sBAAsB;CACjC,oBAAoB;CACpB,gBAAgB;CAChB,gBAAgB;CAChB,2BAA2B;AAC7B;AAIA,MAAa,qBAAA,GAAA,gCAAA,wBAAA,CAA4C,mBAAmB"}
@@ -10,6 +10,7 @@ declare const BLOCK_SERVICE_FLAGS: {
10
10
  readonly requiresPFrameSpec: true;
11
11
  readonly requiresPFrame: true;
12
12
  readonly requiresDialog: true;
13
+ readonly requiresColumnsCollection: true;
13
14
  };
14
15
  type BlockServiceFlags = typeof BLOCK_SERVICE_FLAGS;
15
16
  declare const blockServiceNames: import("@milaboratories/pl-model-common").ServiceName[];
@@ -1 +1 @@
1
- {"version":3,"file":"block_services.d.ts","names":[],"sources":["../../src/services/block_services.ts"],"mappings":";;AAUA;;;;;;cAAa,mBAAA;EAAA;;;;KAMD,iBAAA,UAA2B,mBAAmB;AAAA,cAE7C,iBAAA,4CAAiB,WAAA"}
1
+ {"version":3,"file":"block_services.d.ts","names":[],"sources":["../../src/services/block_services.ts"],"mappings":";;AAUA;;;;;;cAAa,mBAAA;EAAA;;;;;KAOD,iBAAA,UAA2B,mBAAmB;AAAA,cAE7C,iBAAA,4CAAiB,WAAA"}
@@ -10,7 +10,8 @@ import { resolveRequiredServices } from "@milaboratories/pl-model-common";
10
10
  const BLOCK_SERVICE_FLAGS = {
11
11
  requiresPFrameSpec: true,
12
12
  requiresPFrame: true,
13
- requiresDialog: true
13
+ requiresDialog: true,
14
+ requiresColumnsCollection: true
14
15
  };
15
16
  const blockServiceNames = resolveRequiredServices(BLOCK_SERVICE_FLAGS);
16
17
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"block_services.js","names":[],"sources":["../../src/services/block_services.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"@milaboratories/pl-model-common\";\nimport { resolveRequiredServices } from \"@milaboratories/pl-model-common\";\n\n/**\n * Services required by all V3 blocks by default.\n * Edit this when a new service should be available to all blocks.\n *\n * Standalone module to avoid circular dependencies between block_model.ts\n * and service type resolution.\n */\nexport const BLOCK_SERVICE_FLAGS = {\n requiresPFrameSpec: true,\n requiresPFrame: true,\n requiresDialog: true,\n} as const satisfies Partial<ServiceRequireFlags>;\n\nexport type BlockServiceFlags = typeof BLOCK_SERVICE_FLAGS;\n\nexport const blockServiceNames = resolveRequiredServices(BLOCK_SERVICE_FLAGS);\n"],"mappings":";;;;;;;;;AAUA,MAAa,sBAAsB;CACjC,oBAAoB;CACpB,gBAAgB;CAChB,gBAAgB;AAClB;AAIA,MAAa,oBAAoB,wBAAwB,mBAAmB"}
1
+ {"version":3,"file":"block_services.js","names":[],"sources":["../../src/services/block_services.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"@milaboratories/pl-model-common\";\nimport { resolveRequiredServices } from \"@milaboratories/pl-model-common\";\n\n/**\n * Services required by all V3 blocks by default.\n * Edit this when a new service should be available to all blocks.\n *\n * Standalone module to avoid circular dependencies between block_model.ts\n * and service type resolution.\n */\nexport const BLOCK_SERVICE_FLAGS = {\n requiresPFrameSpec: true,\n requiresPFrame: true,\n requiresDialog: true,\n requiresColumnsCollection: true,\n} as const satisfies Partial<ServiceRequireFlags>;\n\nexport type BlockServiceFlags = typeof BLOCK_SERVICE_FLAGS;\n\nexport const blockServiceNames = resolveRequiredServices(BLOCK_SERVICE_FLAGS);\n"],"mappings":";;;;;;;;;AAUA,MAAa,sBAAsB;CACjC,oBAAoB;CACpB,gBAAgB;CAChB,gBAAgB;CAChB,2BAA2B;AAC7B;AAIA,MAAa,oBAAoB,wBAAwB,mBAAmB"}
@@ -2,8 +2,8 @@ const require_internal = require("../internal.cjs");
2
2
  const require_service_bridge = require("./service_bridge.cjs");
3
3
  //#region src/services/get_services.ts
4
4
  const cachedServices = /* @__PURE__ */ new WeakMap();
5
- function getService(name) {
6
- const ctx = require_internal.getCfgRenderCtx();
5
+ function getService(name, deps) {
6
+ const ctx = deps?.ctx ?? require_internal.getCfgRenderCtx();
7
7
  const map = cachedServices.has(ctx) ? cachedServices.get(ctx) : (() => {
8
8
  cachedServices.set(ctx, /* @__PURE__ */ new Map());
9
9
  return cachedServices.get(ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"get_services.cjs","names":["getCfgRenderCtx","createServiceProxy"],"sources":["../../src/services/get_services.ts"],"sourcesContent":["import { ModelServices, ServiceName } from \"@milaboratories/pl-model-common\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { ValueOf } from \"@milaboratories/helpers\";\nimport { createServiceProxy } from \"./service_bridge\";\nimport { GlobalCfgRenderCtx } from \"../render/internal\";\n\nconst cachedServices = new WeakMap<\n GlobalCfgRenderCtx,\n Map<keyof ModelServices, ValueOf<ModelServices>>\n>();\n\nexport function getService<T extends keyof ModelServices>(name: T): ModelServices[T] {\n const ctx = getCfgRenderCtx();\n\n const map = cachedServices.has(ctx)\n ? cachedServices.get(ctx)!\n : (() => {\n cachedServices.set(ctx, new Map());\n return cachedServices.get(ctx)!;\n })();\n\n return map.has(name)\n ? (map.get(name) as ModelServices[T])\n : (() => {\n map.set(name, createServiceProxy(ctx)(name as ServiceName) as ModelServices[T]);\n return map.get(name) as ModelServices[T];\n })();\n}\n"],"mappings":";;;AAMA,MAAM,iCAAiB,IAAI,QAGzB;AAEF,SAAgB,WAA0C,MAA2B;CACnF,MAAM,MAAMA,iBAAAA,gBAAgB;CAE5B,MAAM,MAAM,eAAe,IAAI,GAAG,IAC9B,eAAe,IAAI,GAAG,WACf;EACL,eAAe,IAAI,qBAAK,IAAI,IAAI,CAAC;EACjC,OAAO,eAAe,IAAI,GAAG;CAC/B,EAAA,CAAG;CAEP,OAAO,IAAI,IAAI,IAAI,IACd,IAAI,IAAI,IAAI,WACN;EACL,IAAI,IAAI,MAAMC,uBAAAA,mBAAmB,GAAG,CAAC,CAAC,IAAmB,CAAqB;EAC9E,OAAO,IAAI,IAAI,IAAI;CACrB,EAAA,CAAG;AACT"}
1
+ {"version":3,"file":"get_services.cjs","names":["getCfgRenderCtx","createServiceProxy"],"sources":["../../src/services/get_services.ts"],"sourcesContent":["import { ModelServices, ServiceName } from \"@milaboratories/pl-model-common\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { ValueOf } from \"@milaboratories/helpers\";\nimport { createServiceProxy } from \"./service_bridge\";\nimport { GlobalCfgRenderCtx } from \"../render/internal\";\n\nconst cachedServices = new WeakMap<\n GlobalCfgRenderCtx,\n Map<keyof ModelServices, ValueOf<ModelServices>>\n>();\n\nexport function getService<T extends keyof ModelServices>(\n name: T,\n deps?: { ctx?: GlobalCfgRenderCtx },\n): ModelServices[T] {\n const ctx = deps?.ctx ?? getCfgRenderCtx();\n\n const map = cachedServices.has(ctx)\n ? cachedServices.get(ctx)!\n : (() => {\n cachedServices.set(ctx, new Map());\n return cachedServices.get(ctx)!;\n })();\n\n return map.has(name)\n ? (map.get(name) as ModelServices[T])\n : (() => {\n map.set(name, createServiceProxy(ctx)(name as ServiceName) as ModelServices[T]);\n return map.get(name) as ModelServices[T];\n })();\n}\n"],"mappings":";;;AAMA,MAAM,iCAAiB,IAAI,QAGzB;AAEF,SAAgB,WACd,MACA,MACkB;CAClB,MAAM,MAAM,MAAM,OAAOA,iBAAAA,gBAAgB;CAEzC,MAAM,MAAM,eAAe,IAAI,GAAG,IAC9B,eAAe,IAAI,GAAG,WACf;EACL,eAAe,IAAI,qBAAK,IAAI,IAAI,CAAC;EACjC,OAAO,eAAe,IAAI,GAAG;CAC/B,EAAA,CAAG;CAEP,OAAO,IAAI,IAAI,IAAI,IACd,IAAI,IAAI,IAAI,WACN;EACL,IAAI,IAAI,MAAMC,uBAAAA,mBAAmB,GAAG,CAAC,CAAC,IAAmB,CAAqB;EAC9E,OAAO,IAAI,IAAI,IAAI;CACrB,EAAA,CAAG;AACT"}
@@ -1,7 +1,10 @@
1
+ import { GlobalCfgRenderCtx } from "../render/internal.js";
1
2
  import { ModelServices } from "@milaboratories/pl-model-common";
2
3
 
3
4
  //#region src/services/get_services.d.ts
4
- declare function getService<T extends keyof ModelServices>(name: T): ModelServices[T];
5
+ declare function getService<T extends keyof ModelServices>(name: T, deps?: {
6
+ ctx?: GlobalCfgRenderCtx;
7
+ }): ModelServices[T];
5
8
  //#endregion
6
9
  export { getService };
7
10
  //# sourceMappingURL=get_services.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get_services.d.ts","names":[],"sources":["../../src/services/get_services.ts"],"mappings":";;;iBAWgB,UAAA,iBAA2B,aAAA,EAAe,IAAA,EAAM,CAAA,GAAI,aAAA,CAAc,CAAA"}
1
+ {"version":3,"file":"get_services.d.ts","names":[],"sources":["../../src/services/get_services.ts"],"mappings":";;;;iBAWgB,UAAA,iBAA2B,aAAA,EACzC,IAAA,EAAM,CAAA,EACN,IAAA;EAAS,GAAA,GAAM,kBAAA;AAAA,IACd,aAAA,CAAc,CAAA"}
@@ -2,8 +2,8 @@ import { getCfgRenderCtx } from "../internal.js";
2
2
  import { createServiceProxy } from "./service_bridge.js";
3
3
  //#region src/services/get_services.ts
4
4
  const cachedServices = /* @__PURE__ */ new WeakMap();
5
- function getService(name) {
6
- const ctx = getCfgRenderCtx();
5
+ function getService(name, deps) {
6
+ const ctx = deps?.ctx ?? getCfgRenderCtx();
7
7
  const map = cachedServices.has(ctx) ? cachedServices.get(ctx) : (() => {
8
8
  cachedServices.set(ctx, /* @__PURE__ */ new Map());
9
9
  return cachedServices.get(ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"get_services.js","names":[],"sources":["../../src/services/get_services.ts"],"sourcesContent":["import { ModelServices, ServiceName } from \"@milaboratories/pl-model-common\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { ValueOf } from \"@milaboratories/helpers\";\nimport { createServiceProxy } from \"./service_bridge\";\nimport { GlobalCfgRenderCtx } from \"../render/internal\";\n\nconst cachedServices = new WeakMap<\n GlobalCfgRenderCtx,\n Map<keyof ModelServices, ValueOf<ModelServices>>\n>();\n\nexport function getService<T extends keyof ModelServices>(name: T): ModelServices[T] {\n const ctx = getCfgRenderCtx();\n\n const map = cachedServices.has(ctx)\n ? cachedServices.get(ctx)!\n : (() => {\n cachedServices.set(ctx, new Map());\n return cachedServices.get(ctx)!;\n })();\n\n return map.has(name)\n ? (map.get(name) as ModelServices[T])\n : (() => {\n map.set(name, createServiceProxy(ctx)(name as ServiceName) as ModelServices[T]);\n return map.get(name) as ModelServices[T];\n })();\n}\n"],"mappings":";;;AAMA,MAAM,iCAAiB,IAAI,QAGzB;AAEF,SAAgB,WAA0C,MAA2B;CACnF,MAAM,MAAM,gBAAgB;CAE5B,MAAM,MAAM,eAAe,IAAI,GAAG,IAC9B,eAAe,IAAI,GAAG,WACf;EACL,eAAe,IAAI,qBAAK,IAAI,IAAI,CAAC;EACjC,OAAO,eAAe,IAAI,GAAG;CAC/B,EAAA,CAAG;CAEP,OAAO,IAAI,IAAI,IAAI,IACd,IAAI,IAAI,IAAI,WACN;EACL,IAAI,IAAI,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAmB,CAAqB;EAC9E,OAAO,IAAI,IAAI,IAAI;CACrB,EAAA,CAAG;AACT"}
1
+ {"version":3,"file":"get_services.js","names":[],"sources":["../../src/services/get_services.ts"],"sourcesContent":["import { ModelServices, ServiceName } from \"@milaboratories/pl-model-common\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { ValueOf } from \"@milaboratories/helpers\";\nimport { createServiceProxy } from \"./service_bridge\";\nimport { GlobalCfgRenderCtx } from \"../render/internal\";\n\nconst cachedServices = new WeakMap<\n GlobalCfgRenderCtx,\n Map<keyof ModelServices, ValueOf<ModelServices>>\n>();\n\nexport function getService<T extends keyof ModelServices>(\n name: T,\n deps?: { ctx?: GlobalCfgRenderCtx },\n): ModelServices[T] {\n const ctx = deps?.ctx ?? getCfgRenderCtx();\n\n const map = cachedServices.has(ctx)\n ? cachedServices.get(ctx)!\n : (() => {\n cachedServices.set(ctx, new Map());\n return cachedServices.get(ctx)!;\n })();\n\n return map.has(name)\n ? (map.get(name) as ModelServices[T])\n : (() => {\n map.set(name, createServiceProxy(ctx)(name as ServiceName) as ModelServices[T]);\n return map.get(name) as ModelServices[T];\n })();\n}\n"],"mappings":";;;AAMA,MAAM,iCAAiB,IAAI,QAGzB;AAEF,SAAgB,WACd,MACA,MACkB;CAClB,MAAM,MAAM,MAAM,OAAO,gBAAgB;CAEzC,MAAM,MAAM,eAAe,IAAI,GAAG,IAC9B,eAAe,IAAI,GAAG,WACf;EACL,eAAe,IAAI,qBAAK,IAAI,IAAI,CAAC;EACjC,OAAO,eAAe,IAAI,GAAG;CAC/B,EAAA,CAAG;CAEP,OAAO,IAAI,IAAI,IAAI,IACd,IAAI,IAAI,IAAI,WACN;EACL,IAAI,IAAI,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAmB,CAAqB;EAC9E,OAAO,IAAI,IAAI,IAAI;CACrB,EAAA,CAAG;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.79.27",
3
+ "version": "1.80.2",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "files": [
6
6
  "./dist/**/*",
@@ -28,24 +28,26 @@
28
28
  "canonicalize": "~2.1.0",
29
29
  "es-toolkit": "^1.39.10",
30
30
  "fast-json-patch": "^3.1.1",
31
+ "lru-cache": "^11.2.2",
31
32
  "utility-types": "^3.11.0",
32
33
  "zod": "~3.25.76",
33
- "@milaboratories/helpers": "1.14.3",
34
+ "@milaboratories/helpers": "1.14.4",
34
35
  "@milaboratories/pl-error-like": "1.12.10",
35
- "@milaboratories/ptabler-expression-js": "1.2.33",
36
- "@milaboratories/pl-model-middle-layer": "1.30.11",
37
- "@milaboratories/pl-model-common": "1.46.4"
36
+ "@milaboratories/pl-model-common": "1.47.1",
37
+ "@milaboratories/ptabler-expression-js": "1.2.35",
38
+ "@milaboratories/pl-model-middle-layer": "1.30.13"
38
39
  },
39
40
  "devDependencies": {
40
41
  "@vitest/coverage-istanbul": "^4.1.3",
41
42
  "fast-json-patch": "^3.1.1",
42
43
  "typescript": "~5.9.3",
43
44
  "vitest": "^4.1.3",
45
+ "@milaboratories/columns-collection-driver": "0.2.1",
44
46
  "@milaboratories/build-configs": "2.0.0",
45
- "@milaboratories/pf-spec-driver": "1.4.18",
46
- "@milaboratories/ts-configs": "1.3.0",
47
47
  "@milaboratories/ts-builder": "1.6.0",
48
- "@milaboratories/pf-driver": "1.7.16"
48
+ "@milaboratories/pf-spec-driver": "1.4.21",
49
+ "@milaboratories/ts-configs": "1.3.0",
50
+ "@milaboratories/pf-driver": "1.8.2"
49
51
  },
50
52
  "scripts": {
51
53
  "build": "ts-builder build --target node",
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Test-only wiring for `ColumnsCollectionDriverModel`. Wraps a real
3
+ * `ColumnsCollectionDriverImpl` (so the discover / filter algebra is exercised
4
+ * end-to-end) with stub bindings backed by an in-memory `(id → spec)` map.
5
+ *
6
+ * Accessor-based source kinds (`"accessor"`, `"result_pool"`) throw — they
7
+ * have no meaning outside a render ctx. Tests should stick to `"ids"` /
8
+ * `"collection"` sources.
9
+ *
10
+ * Calling {@link TestCollectionDriverHandle.installAmbientCtx} additionally
11
+ * installs a minimal `globalThis.cfgRenderCtx` AND plants a stub
12
+ * `ColumnEntriesProvider` into the ctx-providers cache so registered specs
13
+ * are reachable via `ColumnLazy.fromId` (and therefore via
14
+ * `ColumnsCollection.getColumns()`).
15
+ */
16
+ import type {
17
+ ColumnEntriesProvider,
18
+ ColumnsCollectionDriverHost,
19
+ ColumnsCollectionDriverModel,
20
+ LeafEntry,
21
+ PColumnSpec,
22
+ PObjectId,
23
+ ServiceName,
24
+ } from "@milaboratories/pl-model-common";
25
+ import { extractPObjectId, Services } from "@milaboratories/pl-model-common";
26
+ import { ColumnsCollectionDriverImpl } from "@milaboratories/columns-collection-driver";
27
+ import { SpecDriver } from "@milaboratories/pf-spec-driver";
28
+ import type { GlobalCfgRenderCtx } from "../../render/internal";
29
+ import { TreeNodeAccessor } from "../../render/accessor";
30
+ import { _ctxProvidersCache } from "../column_providers";
31
+ import type { ColumnsProvider } from "../column_providers";
32
+ import { ColumnLazy, ColumnLazyImpl } from "../column_lazy";
33
+
34
+ export interface TestCollectionDriverHandle {
35
+ readonly driver: ColumnsCollectionDriverModel;
36
+ /** Register `(id → spec)` pairs the driver will see via `resolveSpec`. */
37
+ register(columns: ReadonlyArray<{ readonly id: PObjectId; readonly spec: PColumnSpec }>): void;
38
+ /**
39
+ * Install a minimal `globalThis.cfgRenderCtx` so `getService("columnsCollection")`
40
+ * resolves to this driver and registered columns are reachable via
41
+ * `ColumnLazy.fromId`. Call inside `beforeEach` if the code under test uses
42
+ * the ambient ctx instead of an explicit `driver` option.
43
+ */
44
+ installAmbientCtx(): void;
45
+ /** Remove the ambient ctx installed by {@link installAmbientCtx}. */
46
+ uninstallAmbientCtx(): void;
47
+ /** Dispose the underlying SpecDriver. */
48
+ dispose(): Promise<void>;
49
+ }
50
+
51
+ const COLUMNS_COLLECTION_METHODS: ReadonlyArray<string> = [
52
+ "create",
53
+ "isEmpty",
54
+ "isFinal",
55
+ "getColumns",
56
+ "addSource",
57
+ "discover",
58
+ "filter",
59
+ ];
60
+
61
+ const PFRAME_SPEC_METHODS: ReadonlyArray<string> = [
62
+ "createSpecFrame",
63
+ "listColumns",
64
+ "discoverColumns",
65
+ "deleteColumn",
66
+ "evaluateQuery",
67
+ "buildQuery",
68
+ "expandAxes",
69
+ "collapseAxes",
70
+ "findAxis",
71
+ "findTableColumn",
72
+ ];
73
+
74
+ export function createTestCollectionDriver(): TestCollectionDriverHandle {
75
+ const specMap = new Map<PObjectId, PColumnSpec>();
76
+ const specDriver = new SpecDriver();
77
+ const impl = new ColumnsCollectionDriverImpl();
78
+
79
+ const bindings: ColumnsCollectionDriverHost = {
80
+ resolveAccessor: () => {
81
+ throw new Error("test collection driver: no accessor support");
82
+ },
83
+ getUpstreamBlockCtxes: () => [],
84
+ getSpecDriver: () => specDriver,
85
+ resolveSpec: (id) => specMap.get(extractPObjectId(id)),
86
+ };
87
+
88
+ const driver: ColumnsCollectionDriverModel = {
89
+ create: (sources) => impl.create(sources, bindings).key,
90
+ isEmpty: (h) => impl.isEmpty(h),
91
+ isFinal: (h) => impl.isFinal(h),
92
+ getColumns: (h) => impl.getColumns(h, bindings),
93
+ addSource: (h, srcs) => impl.addSource(h, srcs, bindings).key,
94
+ discover: (h, o) => impl.discover(h, o, bindings).key,
95
+ filter: (h, o) => impl.filter(h, o, bindings).key,
96
+ };
97
+
98
+ let installedCtx: GlobalCfgRenderCtx | undefined;
99
+
100
+ return {
101
+ driver,
102
+ register(columns) {
103
+ for (const c of columns) specMap.set(c.id, c.spec);
104
+ if (installedCtx !== undefined) {
105
+ _ctxProvidersCache.set(installedCtx, [buildStubProvider(specMap)]);
106
+ }
107
+ },
108
+ installAmbientCtx() {
109
+ const ctx = {
110
+ getAccessorHandleByName: () => undefined,
111
+ getUpstreamBlockCtx: () => [],
112
+ getServiceNames: () => [Services.ColumnsCollection, Services.PFrameSpec] as ServiceName[],
113
+ getServiceMethods: (id: ServiceName) => {
114
+ if ((id as unknown) === Services.ColumnsCollection)
115
+ return COLUMNS_COLLECTION_METHODS.slice();
116
+ if ((id as unknown) === Services.PFrameSpec) return PFRAME_SPEC_METHODS.slice();
117
+ return [];
118
+ },
119
+ callServiceMethod: (id: ServiceName, method: string, ...args: unknown[]) => {
120
+ if ((id as unknown) === Services.ColumnsCollection) {
121
+ const fn = (driver as unknown as Record<string, (...a: unknown[]) => unknown>)[method];
122
+ return fn(...args);
123
+ }
124
+ if ((id as unknown) === Services.PFrameSpec) {
125
+ const fn = (specDriver as unknown as Record<string, (...a: unknown[]) => unknown>)[
126
+ method
127
+ ];
128
+ return fn.apply(specDriver, args);
129
+ }
130
+ throw new Error(`test ctx: service "${id}" not stubbed`);
131
+ },
132
+ } as unknown as GlobalCfgRenderCtx;
133
+ installedCtx = ctx;
134
+ (globalThis as { cfgRenderCtx?: unknown }).cfgRenderCtx = ctx;
135
+ _ctxProvidersCache.set(ctx, [buildStubProvider(specMap)]);
136
+ },
137
+ uninstallAmbientCtx() {
138
+ installedCtx = undefined;
139
+ delete (globalThis as { cfgRenderCtx?: unknown }).cfgRenderCtx;
140
+ },
141
+ async dispose() {
142
+ await specDriver.dispose();
143
+ },
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Construct a {@link ColumnEntriesProvider} + {@link ColumnsProvider} backed
149
+ * by an `(id → spec)` map. Each entry carries a fake {@link TreeNodeAccessor}
150
+ * whose only contract is the surface `readSpec` / `readData` /
151
+ * `readDataStatus` (in `p_column_lazy.ts`) actually call:
152
+ * - `traverse({field: `${name}.spec`, ignoreError: true})` →
153
+ * stub-accessor whose `getDataAsJson()` returns the spec.
154
+ * - `traverse({field: `${name}.data`})` → `undefined` (data is not
155
+ * materialised in tests).
156
+ * - `listInputFields()` → `[]` (data absent).
157
+ * - `getInputsLocked()` → `true` (no pending resolution).
158
+ */
159
+ function buildStubProvider(
160
+ specMap: ReadonlyMap<PObjectId, PColumnSpec>,
161
+ ): ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider {
162
+ const entries = new Map<PObjectId, LeafEntry<TreeNodeAccessor>>();
163
+ for (const [id, spec] of specMap) {
164
+ entries.set(id, { accessor: stubAccessorFor(id, spec), name: id, id });
165
+ }
166
+ const columns: ColumnLazy[] = [];
167
+ for (const [id, spec] of specMap) {
168
+ columns.push(ColumnLazyImpl.fromColumn({ id, spec, data: undefined as never }));
169
+ }
170
+ return {
171
+ getPObjectEntries: () => entries,
172
+ isFinal: () => true,
173
+ getColumns: () => columns,
174
+ };
175
+ }
176
+
177
+ function stubAccessorFor(id: PObjectId, spec: PColumnSpec): TreeNodeAccessor {
178
+ const specField = `${id}.spec`;
179
+ const specHolder = {
180
+ getDataAsJson: <T>() => spec as unknown as T,
181
+ hasData: () => true,
182
+ };
183
+ const stub = {
184
+ handle: id,
185
+ resolvePath: [],
186
+ traverse: (...steps: unknown[]) => {
187
+ if (steps.length === 0) return stub;
188
+ const first = steps[0] as { field?: string } | string;
189
+ const field = typeof first === "string" ? first : first?.field;
190
+ return field === specField ? specHolder : undefined;
191
+ },
192
+ getDataAsJson: <T>() => spec as unknown as T,
193
+ listInputFields: () => [],
194
+ getInputsLocked: () => true,
195
+ };
196
+ return stub as unknown as TreeNodeAccessor;
197
+ }