@platforma-sdk/model 1.63.1 → 1.64.0

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 (399) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +12 -22
  2. package/dist/_virtual/_rolldown/runtime.js +6 -11
  3. package/dist/annotations/converter.cjs +4 -5
  4. package/dist/annotations/converter.cjs.map +1 -1
  5. package/dist/annotations/converter.d.ts.map +1 -0
  6. package/dist/annotations/converter.js +1 -2
  7. package/dist/annotations/converter.js.map +1 -1
  8. package/dist/annotations/index.cjs +1 -1
  9. package/dist/annotations/index.js +1 -1
  10. package/dist/annotations/types.d.ts +0 -1
  11. package/dist/annotations/types.d.ts.map +1 -0
  12. package/dist/bconfig/index.cjs +2 -2
  13. package/dist/bconfig/index.js +2 -2
  14. package/dist/bconfig/lambdas.d.ts +0 -1
  15. package/dist/bconfig/lambdas.d.ts.map +1 -0
  16. package/dist/bconfig/normalization.cjs +4 -5
  17. package/dist/bconfig/normalization.cjs.map +1 -1
  18. package/dist/bconfig/normalization.d.ts.map +1 -0
  19. package/dist/bconfig/normalization.js +1 -2
  20. package/dist/bconfig/normalization.js.map +1 -1
  21. package/dist/bconfig/types.cjs +1 -2
  22. package/dist/bconfig/types.cjs.map +1 -1
  23. package/dist/bconfig/types.d.ts +0 -1
  24. package/dist/bconfig/types.d.ts.map +1 -0
  25. package/dist/bconfig/types.js +1 -1
  26. package/dist/bconfig/util.d.ts.map +1 -0
  27. package/dist/bconfig/v3.d.ts.map +1 -0
  28. package/dist/block_api_v1.d.ts.map +1 -0
  29. package/dist/block_api_v2.d.ts.map +1 -0
  30. package/dist/block_api_v3.d.ts.map +1 -0
  31. package/dist/block_migrations.cjs +2 -3
  32. package/dist/block_migrations.cjs.map +1 -1
  33. package/dist/block_migrations.d.ts.map +1 -0
  34. package/dist/block_migrations.js +1 -2
  35. package/dist/block_migrations.js.map +1 -1
  36. package/dist/block_model.cjs +16 -17
  37. package/dist/block_model.cjs.map +1 -1
  38. package/dist/block_model.d.ts +0 -2
  39. package/dist/block_model.d.ts.map +1 -0
  40. package/dist/block_model.js +4 -5
  41. package/dist/block_model.js.map +1 -1
  42. package/dist/block_model_legacy.cjs +10 -11
  43. package/dist/block_model_legacy.cjs.map +1 -1
  44. package/dist/block_model_legacy.d.ts +0 -3
  45. package/dist/block_model_legacy.d.ts.map +1 -0
  46. package/dist/block_model_legacy.js +1 -2
  47. package/dist/block_model_legacy.js.map +1 -1
  48. package/dist/block_state_patch.d.ts.map +1 -0
  49. package/dist/block_state_util.cjs +1 -2
  50. package/dist/block_state_util.cjs.map +1 -1
  51. package/dist/block_state_util.d.ts.map +1 -0
  52. package/dist/block_state_util.js +1 -1
  53. package/dist/block_state_util.js.map +1 -1
  54. package/dist/block_storage.cjs +5 -12
  55. package/dist/block_storage.cjs.map +1 -1
  56. package/dist/block_storage.d.ts.map +1 -0
  57. package/dist/block_storage.js +5 -11
  58. package/dist/block_storage.js.map +1 -1
  59. package/dist/block_storage_callbacks.cjs +4 -5
  60. package/dist/block_storage_callbacks.cjs.map +1 -1
  61. package/dist/block_storage_callbacks.js +3 -4
  62. package/dist/block_storage_callbacks.js.map +1 -1
  63. package/dist/block_storage_facade.cjs +2 -3
  64. package/dist/block_storage_facade.cjs.map +1 -1
  65. package/dist/block_storage_facade.d.ts +0 -1
  66. package/dist/block_storage_facade.d.ts.map +1 -0
  67. package/dist/block_storage_facade.js +1 -2
  68. package/dist/block_storage_facade.js.map +1 -1
  69. package/dist/columns/column_collection_builder.cjs +111 -99
  70. package/dist/columns/column_collection_builder.cjs.map +1 -1
  71. package/dist/columns/column_collection_builder.d.ts +13 -12
  72. package/dist/columns/column_collection_builder.d.ts.map +1 -0
  73. package/dist/columns/column_collection_builder.js +108 -96
  74. package/dist/columns/column_collection_builder.js.map +1 -1
  75. package/dist/columns/column_selector.cjs +9 -82
  76. package/dist/columns/column_selector.cjs.map +1 -1
  77. package/dist/columns/column_selector.d.ts +6 -14
  78. package/dist/columns/column_selector.d.ts.map +1 -0
  79. package/dist/columns/column_selector.js +7 -78
  80. package/dist/columns/column_selector.js.map +1 -1
  81. package/dist/columns/column_snapshot.cjs +4 -5
  82. package/dist/columns/column_snapshot.cjs.map +1 -1
  83. package/dist/columns/column_snapshot.d.ts +3 -3
  84. package/dist/columns/column_snapshot.d.ts.map +1 -0
  85. package/dist/columns/column_snapshot.js +4 -4
  86. package/dist/columns/column_snapshot.js.map +1 -1
  87. package/dist/columns/column_snapshot_provider.cjs +2 -3
  88. package/dist/columns/column_snapshot_provider.cjs.map +1 -1
  89. package/dist/columns/column_snapshot_provider.d.ts +8 -8
  90. package/dist/columns/column_snapshot_provider.d.ts.map +1 -0
  91. package/dist/columns/column_snapshot_provider.js +2 -2
  92. package/dist/columns/column_snapshot_provider.js.map +1 -1
  93. package/dist/columns/ctx_column_sources.cjs +3 -4
  94. package/dist/columns/ctx_column_sources.cjs.map +1 -1
  95. package/dist/columns/ctx_column_sources.d.ts +2 -2
  96. package/dist/columns/ctx_column_sources.d.ts.map +1 -0
  97. package/dist/columns/ctx_column_sources.js +1 -2
  98. package/dist/columns/ctx_column_sources.js.map +1 -1
  99. package/dist/columns/expand_by_partition.cjs +106 -0
  100. package/dist/columns/expand_by_partition.cjs.map +1 -0
  101. package/dist/columns/expand_by_partition.d.ts +33 -0
  102. package/dist/columns/expand_by_partition.d.ts.map +1 -0
  103. package/dist/columns/expand_by_partition.js +105 -0
  104. package/dist/columns/expand_by_partition.js.map +1 -0
  105. package/dist/columns/index.cjs +6 -5
  106. package/dist/columns/index.d.ts +4 -3
  107. package/dist/columns/index.js +6 -5
  108. package/dist/components/PFrameForGraphs.cjs +4 -5
  109. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  110. package/dist/components/PFrameForGraphs.d.ts +0 -1
  111. package/dist/components/PFrameForGraphs.d.ts.map +1 -0
  112. package/dist/components/PFrameForGraphs.js +2 -3
  113. package/dist/components/PFrameForGraphs.js.map +1 -1
  114. package/dist/components/PlAnnotations/filter.d.ts.map +1 -0
  115. package/dist/components/PlAnnotations/filters_ui.cjs +1 -2
  116. package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
  117. package/dist/components/PlAnnotations/filters_ui.d.ts +0 -2
  118. package/dist/components/PlAnnotations/filters_ui.d.ts.map +1 -0
  119. package/dist/components/PlAnnotations/filters_ui.js +1 -1
  120. package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
  121. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +26 -0
  122. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -0
  123. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +25 -0
  124. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -0
  125. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +68 -0
  126. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -0
  127. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +67 -0
  128. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -0
  129. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +28 -18
  130. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  131. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +4 -1
  132. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -0
  133. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +22 -12
  134. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  135. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +262 -181
  136. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  137. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +37 -23
  138. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -0
  139. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +261 -177
  140. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  141. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +64 -0
  142. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -0
  143. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -0
  144. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -0
  145. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +63 -0
  146. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -0
  147. package/dist/components/PlDataTable/createPlDataTable/index.cjs +4 -4
  148. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  149. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
  150. package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -0
  151. package/dist/components/PlDataTable/createPlDataTable/index.js +3 -3
  152. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  153. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +109 -0
  154. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -0
  155. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +19 -0
  156. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -0
  157. package/dist/components/PlDataTable/createPlDataTable/utils.js +102 -0
  158. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -0
  159. package/dist/components/PlDataTable/createPlDataTableSheet.cjs +1 -2
  160. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  161. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +0 -1
  162. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts.map +1 -0
  163. package/dist/components/PlDataTable/createPlDataTableSheet.js +1 -1
  164. package/dist/components/PlDataTable/index.cjs +7 -5
  165. package/dist/components/PlDataTable/index.d.ts +4 -2
  166. package/dist/components/PlDataTable/index.js +7 -5
  167. package/dist/components/PlDataTable/labels.cjs +27 -14
  168. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  169. package/dist/components/PlDataTable/labels.js +26 -13
  170. package/dist/components/PlDataTable/labels.js.map +1 -1
  171. package/dist/components/PlDataTable/state-migration.cjs +8 -6
  172. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  173. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -0
  174. package/dist/components/PlDataTable/state-migration.js +5 -3
  175. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  176. package/dist/components/PlDataTable/typesV4.d.ts.map +1 -0
  177. package/dist/components/PlDataTable/typesV5.d.ts +5 -5
  178. package/dist/components/PlDataTable/typesV5.d.ts.map +1 -0
  179. package/dist/components/PlMultiSequenceAlignment.cjs +2 -3
  180. package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
  181. package/dist/components/PlMultiSequenceAlignment.d.ts.map +1 -0
  182. package/dist/components/PlMultiSequenceAlignment.js +1 -2
  183. package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
  184. package/dist/components/PlSelectionModel.cjs +1 -2
  185. package/dist/components/PlSelectionModel.cjs.map +1 -1
  186. package/dist/components/PlSelectionModel.d.ts.map +1 -0
  187. package/dist/components/PlSelectionModel.js +1 -1
  188. package/dist/components/index.cjs +13 -11
  189. package/dist/components/index.d.ts +3 -3
  190. package/dist/components/index.js +12 -10
  191. package/dist/config/actions.cjs +1 -2
  192. package/dist/config/actions.cjs.map +1 -1
  193. package/dist/config/actions.d.ts.map +1 -0
  194. package/dist/config/actions.js +1 -1
  195. package/dist/config/actions_kinds.d.ts.map +1 -0
  196. package/dist/config/index.cjs +1 -1
  197. package/dist/config/index.js +1 -1
  198. package/dist/config/model.d.ts.map +1 -0
  199. package/dist/config/model_meta.d.ts.map +1 -0
  200. package/dist/config/type_engine.d.ts.map +1 -0
  201. package/dist/config/type_util.d.ts.map +1 -0
  202. package/dist/env_value.cjs +1 -2
  203. package/dist/env_value.cjs.map +1 -1
  204. package/dist/env_value.d.ts.map +1 -0
  205. package/dist/env_value.js +1 -1
  206. package/dist/env_value.js.map +1 -1
  207. package/dist/filters/converters/filterToQuery.cjs +3 -4
  208. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  209. package/dist/filters/converters/filterToQuery.d.ts.map +1 -0
  210. package/dist/filters/converters/filterToQuery.js +1 -2
  211. package/dist/filters/converters/filterToQuery.js.map +1 -1
  212. package/dist/filters/converters/filterUiToExpressionImpl.cjs +3 -4
  213. package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -1
  214. package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +1 -0
  215. package/dist/filters/converters/filterUiToExpressionImpl.js +1 -2
  216. package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -1
  217. package/dist/filters/converters/index.cjs +2 -2
  218. package/dist/filters/converters/index.js +2 -2
  219. package/dist/filters/distill.cjs +3 -4
  220. package/dist/filters/distill.cjs.map +1 -1
  221. package/dist/filters/distill.d.ts.map +1 -0
  222. package/dist/filters/distill.js +1 -2
  223. package/dist/filters/distill.js.map +1 -1
  224. package/dist/filters/index.cjs +4 -4
  225. package/dist/filters/index.d.ts +0 -1
  226. package/dist/filters/index.js +3 -3
  227. package/dist/filters/traverse.cjs +1 -2
  228. package/dist/filters/traverse.cjs.map +1 -1
  229. package/dist/filters/traverse.js +1 -1
  230. package/dist/filters/traverse.js.map +1 -1
  231. package/dist/filters/types.d.ts.map +1 -0
  232. package/dist/index.cjs +89 -83
  233. package/dist/index.d.ts +8 -15
  234. package/dist/index.js +8 -9
  235. package/dist/internal.cjs +1 -2
  236. package/dist/internal.cjs.map +1 -1
  237. package/dist/internal.js +1 -1
  238. package/dist/internal.js.map +1 -1
  239. package/dist/labels/derive_distinct_labels.cjs +41 -30
  240. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  241. package/dist/labels/derive_distinct_labels.d.ts +15 -15
  242. package/dist/labels/derive_distinct_labels.d.ts.map +1 -0
  243. package/dist/labels/derive_distinct_labels.js +40 -29
  244. package/dist/labels/derive_distinct_labels.js.map +1 -1
  245. package/dist/labels/index.cjs +1 -2
  246. package/dist/labels/index.d.ts +1 -2
  247. package/dist/labels/index.js +1 -2
  248. package/dist/package.cjs +7 -8
  249. package/dist/package.js +2 -2
  250. package/dist/pframe.cjs +2 -3
  251. package/dist/pframe.cjs.map +1 -1
  252. package/dist/pframe.d.ts.map +1 -0
  253. package/dist/pframe.js +1 -2
  254. package/dist/pframe.js.map +1 -1
  255. package/dist/pframe_utils/axes.cjs +2 -3
  256. package/dist/pframe_utils/axes.cjs.map +1 -1
  257. package/dist/pframe_utils/axes.d.ts +0 -1
  258. package/dist/pframe_utils/axes.d.ts.map +1 -0
  259. package/dist/pframe_utils/axes.js +1 -2
  260. package/dist/pframe_utils/axes.js.map +1 -1
  261. package/dist/pframe_utils/columns.cjs +5 -6
  262. package/dist/pframe_utils/columns.cjs.map +1 -1
  263. package/dist/pframe_utils/columns.d.ts +0 -1
  264. package/dist/pframe_utils/columns.d.ts.map +1 -0
  265. package/dist/pframe_utils/columns.js +1 -2
  266. package/dist/pframe_utils/columns.js.map +1 -1
  267. package/dist/pframe_utils/index.cjs +3 -4
  268. package/dist/pframe_utils/index.cjs.map +1 -1
  269. package/dist/pframe_utils/index.d.ts.map +1 -0
  270. package/dist/pframe_utils/index.js +2 -3
  271. package/dist/pframe_utils/index.js.map +1 -1
  272. package/dist/platforma.d.ts.map +1 -0
  273. package/dist/plugin_handle.cjs +1 -2
  274. package/dist/plugin_handle.cjs.map +1 -1
  275. package/dist/plugin_handle.d.ts.map +1 -0
  276. package/dist/plugin_handle.js +1 -1
  277. package/dist/plugin_model.cjs +3 -4
  278. package/dist/plugin_model.cjs.map +1 -1
  279. package/dist/plugin_model.d.ts +0 -1
  280. package/dist/plugin_model.d.ts.map +1 -0
  281. package/dist/plugin_model.js +1 -2
  282. package/dist/plugin_model.js.map +1 -1
  283. package/dist/raw_globals.cjs +3 -4
  284. package/dist/raw_globals.cjs.map +1 -1
  285. package/dist/raw_globals.d.ts.map +1 -0
  286. package/dist/raw_globals.js +1 -2
  287. package/dist/raw_globals.js.map +1 -1
  288. package/dist/ref_util.cjs +3 -4
  289. package/dist/ref_util.cjs.map +1 -1
  290. package/dist/ref_util.d.ts +0 -2
  291. package/dist/ref_util.d.ts.map +1 -0
  292. package/dist/ref_util.js +1 -2
  293. package/dist/ref_util.js.map +1 -1
  294. package/dist/render/accessor.cjs +4 -5
  295. package/dist/render/accessor.cjs.map +1 -1
  296. package/dist/render/accessor.d.ts.map +1 -0
  297. package/dist/render/accessor.js +1 -2
  298. package/dist/render/accessor.js.map +1 -1
  299. package/dist/render/api.cjs +20 -14
  300. package/dist/render/api.cjs.map +1 -1
  301. package/dist/render/api.d.ts +2 -3
  302. package/dist/render/api.d.ts.map +1 -0
  303. package/dist/render/api.js +11 -5
  304. package/dist/render/api.js.map +1 -1
  305. package/dist/render/future.cjs +2 -3
  306. package/dist/render/future.cjs.map +1 -1
  307. package/dist/render/future.d.ts.map +1 -0
  308. package/dist/render/future.js +1 -2
  309. package/dist/render/future.js.map +1 -1
  310. package/dist/render/index.cjs +8 -8
  311. package/dist/render/index.d.ts +1 -2
  312. package/dist/render/index.js +7 -7
  313. package/dist/render/internal.cjs +7 -9
  314. package/dist/render/internal.cjs.map +1 -1
  315. package/dist/render/internal.d.ts.map +1 -0
  316. package/dist/render/internal.js +1 -2
  317. package/dist/render/internal.js.map +1 -1
  318. package/dist/render/traversal_ops.d.ts.map +1 -0
  319. package/dist/render/util/axis_filtering.cjs +1 -2
  320. package/dist/render/util/axis_filtering.cjs.map +1 -1
  321. package/dist/render/util/axis_filtering.d.ts.map +1 -0
  322. package/dist/render/util/axis_filtering.js +1 -1
  323. package/dist/render/util/column_collection.cjs +8 -9
  324. package/dist/render/util/column_collection.cjs.map +1 -1
  325. package/dist/render/util/column_collection.d.ts +0 -1
  326. package/dist/render/util/column_collection.d.ts.map +1 -0
  327. package/dist/render/util/column_collection.js +4 -5
  328. package/dist/render/util/column_collection.js.map +1 -1
  329. package/dist/render/util/index.cjs +4 -4
  330. package/dist/render/util/index.js +4 -4
  331. package/dist/render/util/label.cjs +4 -5
  332. package/dist/render/util/label.cjs.map +1 -1
  333. package/dist/render/util/label.d.ts.map +1 -0
  334. package/dist/render/util/label.js +3 -4
  335. package/dist/render/util/label.js.map +1 -1
  336. package/dist/render/util/pcolumn_data.cjs +9 -10
  337. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  338. package/dist/render/util/pcolumn_data.d.ts +2 -2
  339. package/dist/render/util/pcolumn_data.d.ts.map +1 -0
  340. package/dist/render/util/pcolumn_data.js +7 -8
  341. package/dist/render/util/pcolumn_data.js.map +1 -1
  342. package/dist/render/util/pframe_upgraders.cjs +1 -2
  343. package/dist/render/util/pframe_upgraders.cjs.map +1 -1
  344. package/dist/render/util/pframe_upgraders.js +1 -1
  345. package/dist/render/util/split_selectors.d.ts.map +1 -0
  346. package/dist/services/block_services.cjs +2 -3
  347. package/dist/services/block_services.cjs.map +1 -1
  348. package/dist/services/block_services.d.ts +2 -2
  349. package/dist/services/block_services.d.ts.map +1 -0
  350. package/dist/services/block_services.js +1 -2
  351. package/dist/services/block_services.js.map +1 -1
  352. package/dist/services/index.cjs +2 -2
  353. package/dist/services/index.js +2 -2
  354. package/dist/services/service_bridge.cjs +1 -2
  355. package/dist/services/service_bridge.cjs.map +1 -1
  356. package/dist/services/service_bridge.d.ts.map +1 -0
  357. package/dist/services/service_bridge.js +1 -1
  358. package/dist/services/service_resolve.d.ts.map +1 -0
  359. package/dist/version.cjs +2 -4
  360. package/dist/version.cjs.map +1 -1
  361. package/dist/version.d.ts.map +1 -0
  362. package/dist/version.js +1 -2
  363. package/dist/version.js.map +1 -1
  364. package/package.json +13 -13
  365. package/src/columns/column_collection_builder.test.ts +40 -27
  366. package/src/columns/column_collection_builder.ts +176 -131
  367. package/src/columns/column_selector.test.ts +17 -399
  368. package/src/columns/column_selector.ts +14 -127
  369. package/src/columns/column_snapshot.ts +5 -5
  370. package/src/columns/column_snapshot_provider.ts +11 -10
  371. package/src/columns/ctx_column_sources.ts +2 -2
  372. package/src/columns/expand_by_partition.test.ts +4 -4
  373. package/src/columns/expand_by_partition.ts +4 -3
  374. package/src/columns/index.ts +1 -0
  375. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +42 -0
  376. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +89 -0
  377. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +39 -11
  378. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +502 -313
  379. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +122 -0
  380. package/src/components/PlDataTable/createPlDataTable/index.ts +4 -2
  381. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +257 -0
  382. package/src/components/PlDataTable/createPlDataTable/utils.ts +160 -0
  383. package/src/components/PlDataTable/index.ts +13 -2
  384. package/src/components/PlDataTable/labels.ts +29 -18
  385. package/src/components/PlDataTable/state-migration.ts +3 -1
  386. package/src/components/PlDataTable/typesV5.ts +4 -4
  387. package/src/labels/derive_distinct_labels.test.ts +143 -45
  388. package/src/labels/derive_distinct_labels.ts +102 -49
  389. package/src/labels/index.ts +0 -1
  390. package/src/render/api.ts +15 -5
  391. package/src/render/util/column_collection.ts +4 -3
  392. package/src/render/util/label.ts +2 -2
  393. package/src/render/util/pcolumn_data.ts +5 -3
  394. package/dist/labels/write_labels_to_specs.cjs +0 -15
  395. package/dist/labels/write_labels_to_specs.cjs.map +0 -1
  396. package/dist/labels/write_labels_to_specs.d.ts +0 -9
  397. package/dist/labels/write_labels_to_specs.js +0 -14
  398. package/dist/labels/write_labels_to_specs.js.map +0 -1
  399. package/src/labels/write_labels_to_specs.ts +0 -12
@@ -1,4 +1,4 @@
1
- import * as _milaboratories_pl_model_common0 from "@milaboratories/pl-model-common";
1
+ import * as _$_milaboratories_pl_model_common0 from "@milaboratories/pl-model-common";
2
2
 
3
3
  //#region src/services/block_services.d.ts
4
4
  /**
@@ -12,7 +12,7 @@ declare const BLOCK_SERVICE_FLAGS: {
12
12
  readonly requiresPFrameSpec: true;
13
13
  };
14
14
  type BlockServiceFlags = typeof BLOCK_SERVICE_FLAGS;
15
- declare const blockServiceNames: _milaboratories_pl_model_common0.ServiceName[];
15
+ declare const blockServiceNames: _$_milaboratories_pl_model_common0.ServiceName[];
16
16
  //#endregion
17
17
  export { BLOCK_SERVICE_FLAGS, BlockServiceFlags, blockServiceNames };
18
18
  //# sourceMappingURL=block_services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_services.d.ts","names":[],"sources":["../../src/services/block_services.ts"],"mappings":";;;;;;AAUA;;;;cAAa,mBAAA;EAAA,SAEoC,kBAAA;AAAA;AAAA,KAErC,iBAAA,UAA2B,mBAAA;AAAA,cAE1B,iBAAA,EAAgE,kCAAA,CAA/C,WAAA"}
@@ -1,5 +1,4 @@
1
1
  import { resolveRequiredServices } from "@milaboratories/pl-model-common";
2
-
3
2
  //#region src/services/block_services.ts
4
3
  /**
5
4
  * Services required by all V3 blocks by default.
@@ -10,7 +9,7 @@ import { resolveRequiredServices } from "@milaboratories/pl-model-common";
10
9
  */
11
10
  const BLOCK_SERVICE_FLAGS = { requiresPFrameSpec: true };
12
11
  const blockServiceNames = resolveRequiredServices(BLOCK_SERVICE_FLAGS);
13
-
14
12
  //#endregion
15
13
  export { BLOCK_SERVICE_FLAGS, blockServiceNames };
14
+
16
15
  //# sourceMappingURL=block_services.js.map
@@ -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} 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,EACjC,oBAAoB,MACrB;AAID,MAAa,oBAAoB,wBAAwB,oBAAoB"}
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} 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,EACjC,oBAAoB,MACrB;AAID,MAAa,oBAAoB,wBAAwB,oBAAoB"}
@@ -1,2 +1,2 @@
1
- const require_block_services = require('./block_services.cjs');
2
- const require_service_bridge = require('./service_bridge.cjs');
1
+ require("./block_services.cjs");
2
+ require("./service_bridge.cjs");
@@ -1,2 +1,2 @@
1
- import { BLOCK_SERVICE_FLAGS, blockServiceNames } from "./block_services.js";
2
- import { buildServices, createNodeServiceProxy } from "./service_bridge.js";
1
+ import "./block_services.js";
2
+ import "./service_bridge.js";
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/services/service_bridge.ts
3
2
  /**
4
3
  * Builds a lazy services object from ServiceDispatch and UiServiceRegistry.
@@ -28,8 +27,8 @@ function buildServices(dispatch, registry) {
28
27
  function createNodeServiceProxy(dispatch) {
29
28
  return ((serviceId) => Object.freeze(Object.fromEntries(dispatch.getServiceMethods(serviceId).map((method) => [method, async (...args) => dispatch.callServiceMethod(serviceId, method, ...args)]))));
30
29
  }
31
-
32
30
  //#endregion
33
31
  exports.buildServices = buildServices;
34
32
  exports.createNodeServiceProxy = createNodeServiceProxy;
33
+
35
34
  //# sourceMappingURL=service_bridge.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"service_bridge.cjs","names":[],"sources":["../../src/services/service_bridge.ts"],"sourcesContent":["/**\n * Runtime service bridge — builds lazy service objects from dispatch + registry.\n * Used by the UI layer to provide typed service access.\n */\n\nimport type {\n ServiceTypesLike,\n InferServiceUi,\n ServiceName,\n ServiceDispatch,\n UiServices as AllUiServices,\n} from \"@milaboratories/pl-model-common\";\nimport { UiServiceRegistry } from \"@milaboratories/pl-model-common\";\n\n// Makes a remote node service appear local.\n// Given a service ID, returns an object implementing the service's UI interface.\n// Provided by the desktop app (e.g. backed by Electron IPC).\nexport type NodeServiceProxy = <S extends ServiceTypesLike>(\n serviceId: ServiceName<S>,\n) => InferServiceUi<S>;\n\n/**\n * Builds a lazy services object from ServiceDispatch and UiServiceRegistry.\n * Each service is instantiated on first access. Errors are cached to prevent\n * repeated factory calls on failure.\n */\nexport function buildServices<S extends Partial<AllUiServices> = Partial<AllUiServices>>(\n dispatch: ServiceDispatch,\n registry: UiServiceRegistry,\n): S {\n return Object.create(\n null,\n Object.fromEntries(\n dispatch.getServiceNames().map((id) => {\n let fetched = false;\n let cached: unknown;\n return [\n id,\n {\n enumerable: true,\n get() {\n if (!fetched) {\n fetched = true;\n cached = registry.get(id);\n }\n return cached;\n },\n },\n ];\n }),\n ),\n );\n}\n\n/**\n * Builds a NodeServiceProxy from a ServiceDispatch.\n * Each service method call is forwarded to dispatch.callServiceMethod.\n */\nexport function createNodeServiceProxy(dispatch: ServiceDispatch): NodeServiceProxy {\n return ((serviceId: ServiceName) =>\n Object.freeze(\n Object.fromEntries(\n dispatch\n .getServiceMethods(serviceId)\n .map((method) => [\n method,\n async (...args: unknown[]) => dispatch.callServiceMethod(serviceId, method, ...args),\n ]),\n ),\n )) as NodeServiceProxy;\n}\n"],"mappings":";;;;;;;AA0BA,SAAgB,cACd,UACA,UACG;AACH,QAAO,OAAO,OACZ,MACA,OAAO,YACL,SAAS,iBAAiB,CAAC,KAAK,OAAO;EACrC,IAAI,UAAU;EACd,IAAI;AACJ,SAAO,CACL,IACA;GACE,YAAY;GACZ,MAAM;AACJ,QAAI,CAAC,SAAS;AACZ,eAAU;AACV,cAAS,SAAS,IAAI,GAAG;;AAE3B,WAAO;;GAEV,CACF;GACD,CACH,CACF;;;;;;AAOH,SAAgB,uBAAuB,UAA6C;AAClF,UAAS,cACP,OAAO,OACL,OAAO,YACL,SACG,kBAAkB,UAAU,CAC5B,KAAK,WAAW,CACf,QACA,OAAO,GAAG,SAAoB,SAAS,kBAAkB,WAAW,QAAQ,GAAG,KAAK,CACrF,CAAC,CACL,CACF"}
1
+ {"version":3,"file":"service_bridge.cjs","names":[],"sources":["../../src/services/service_bridge.ts"],"sourcesContent":["/**\n * Runtime service bridge — builds lazy service objects from dispatch + registry.\n * Used by the UI layer to provide typed service access.\n */\n\nimport type {\n ServiceTypesLike,\n InferServiceUi,\n ServiceName,\n ServiceDispatch,\n UiServices as AllUiServices,\n} from \"@milaboratories/pl-model-common\";\nimport { UiServiceRegistry } from \"@milaboratories/pl-model-common\";\n\n// Makes a remote node service appear local.\n// Given a service ID, returns an object implementing the service's UI interface.\n// Provided by the desktop app (e.g. backed by Electron IPC).\nexport type NodeServiceProxy = <S extends ServiceTypesLike>(\n serviceId: ServiceName<S>,\n) => InferServiceUi<S>;\n\n/**\n * Builds a lazy services object from ServiceDispatch and UiServiceRegistry.\n * Each service is instantiated on first access. Errors are cached to prevent\n * repeated factory calls on failure.\n */\nexport function buildServices<S extends Partial<AllUiServices> = Partial<AllUiServices>>(\n dispatch: ServiceDispatch,\n registry: UiServiceRegistry,\n): S {\n return Object.create(\n null,\n Object.fromEntries(\n dispatch.getServiceNames().map((id) => {\n let fetched = false;\n let cached: unknown;\n return [\n id,\n {\n enumerable: true,\n get() {\n if (!fetched) {\n fetched = true;\n cached = registry.get(id);\n }\n return cached;\n },\n },\n ];\n }),\n ),\n );\n}\n\n/**\n * Builds a NodeServiceProxy from a ServiceDispatch.\n * Each service method call is forwarded to dispatch.callServiceMethod.\n */\nexport function createNodeServiceProxy(dispatch: ServiceDispatch): NodeServiceProxy {\n return ((serviceId: ServiceName) =>\n Object.freeze(\n Object.fromEntries(\n dispatch\n .getServiceMethods(serviceId)\n .map((method) => [\n method,\n async (...args: unknown[]) => dispatch.callServiceMethod(serviceId, method, ...args),\n ]),\n ),\n )) as NodeServiceProxy;\n}\n"],"mappings":";;;;;;AA0BA,SAAgB,cACd,UACA,UACG;AACH,QAAO,OAAO,OACZ,MACA,OAAO,YACL,SAAS,iBAAiB,CAAC,KAAK,OAAO;EACrC,IAAI,UAAU;EACd,IAAI;AACJ,SAAO,CACL,IACA;GACE,YAAY;GACZ,MAAM;AACJ,QAAI,CAAC,SAAS;AACZ,eAAU;AACV,cAAS,SAAS,IAAI,GAAG;;AAE3B,WAAO;;GAEV,CACF;GACD,CACH,CACF;;;;;;AAOH,SAAgB,uBAAuB,UAA6C;AAClF,UAAS,cACP,OAAO,OACL,OAAO,YACL,SACG,kBAAkB,UAAU,CAC5B,KAAK,WAAW,CACf,QACA,OAAO,GAAG,SAAoB,SAAS,kBAAkB,WAAW,QAAQ,GAAG,KAAK,CACrF,CAAC,CACL,CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service_bridge.d.ts","names":[],"sources":["../../src/services/service_bridge.ts"],"mappings":";;;KAiBY,gBAAA,cAA8B,gBAAA,EACxC,SAAA,EAAW,WAAA,CAAY,CAAA,MACpB,cAAA,CAAe,CAAA;;;;;;iBAOJ,aAAA,WAAwB,OAAA,CAAQ,UAAA,IAAiB,OAAA,CAAQ,UAAA,EAAA,CACvE,QAAA,EAAU,eAAA,EACV,QAAA,EAAU,iBAAA,GACT,CAAA;;;;;iBA6Ba,sBAAA,CAAuB,QAAA,EAAU,eAAA,GAAkB,gBAAA"}
@@ -27,7 +27,7 @@ function buildServices(dispatch, registry) {
27
27
  function createNodeServiceProxy(dispatch) {
28
28
  return ((serviceId) => Object.freeze(Object.fromEntries(dispatch.getServiceMethods(serviceId).map((method) => [method, async (...args) => dispatch.callServiceMethod(serviceId, method, ...args)]))));
29
29
  }
30
-
31
30
  //#endregion
32
31
  export { buildServices, createNodeServiceProxy };
32
+
33
33
  //# sourceMappingURL=service_bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service_resolve.d.ts","names":[],"sources":["../../src/services/service_resolve.ts"],"mappings":";;;;KAeK,UAAA,wBAAkC,IAAA,gCACnC,CAAA,eAAgB,mBAAA,GACd,mBAAA,CAAoB,CAAA;AAAA,KAKrB,oBAAA,wBACS,KAAA,yBAA8B,KAAA,CAAM,CAAA,iBAAkB,UAAA,CAAW,CAAA,2BACvE,KAAA;AAAA,KAII,oBAAA,UAA8B,IAAA,CACxC,eAAA,EACA,oBAAA,CAAqB,KAAA,UAAe,eAAA;AAAA,KAG1B,iBAAA,UAA2B,IAAA,CACrC,YAAA,EACA,oBAAA,CAAqB,KAAA,UAAe,YAAA;AAAA,KAI1B,yBAAA,GAA4B,oBAAA,CAAqB,iBAAA;AAAA,KACjD,sBAAA,GAAyB,iBAAA,CAAkB,iBAAA"}
package/dist/version.cjs CHANGED
@@ -1,10 +1,8 @@
1
- const require_package = require('./package.cjs');
2
-
3
1
  //#region src/version.ts
4
- const PlatformaSDKVersion = require_package.version;
2
+ const PlatformaSDKVersion = require("./package.cjs").version;
5
3
  const CurrentSdkInfo = { sdkVersion: PlatformaSDKVersion };
6
-
7
4
  //#endregion
8
5
  exports.CurrentSdkInfo = CurrentSdkInfo;
9
6
  exports.PlatformaSDKVersion = PlatformaSDKVersion;
7
+
10
8
  //# sourceMappingURL=version.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.cjs","names":["version"],"sources":["../src/version.ts"],"sourcesContent":["import { version } from \"../package.json\";\nexport const PlatformaSDKVersion = version;\n\nexport type SdkInfo = {\n readonly sdkVersion: string;\n};\n\nexport const CurrentSdkInfo: SdkInfo = {\n sdkVersion: PlatformaSDKVersion,\n};\n"],"mappings":";;;AACA,MAAa,sBAAsBA;AAMnC,MAAa,iBAA0B,EACrC,YAAY,qBACb"}
1
+ {"version":3,"file":"version.cjs","names":["version"],"sources":["../src/version.ts"],"sourcesContent":["import { version } from \"../package.json\";\nexport const PlatformaSDKVersion = version;\n\nexport type SdkInfo = {\n readonly sdkVersion: string;\n};\n\nexport const CurrentSdkInfo: SdkInfo = {\n sdkVersion: PlatformaSDKVersion,\n};\n"],"mappings":";AACA,MAAa,+CAAsBA;AAMnC,MAAa,iBAA0B,EACrC,YAAY,qBACb"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","names":[],"sources":["../src/version.ts"],"mappings":";cACa,mBAAA;AAAA,KAED,OAAA;EAAA,SACD,UAAA;AAAA;AAAA,cAGE,cAAA,EAAgB,OAAA"}
package/dist/version.js CHANGED
@@ -1,9 +1,8 @@
1
1
  import { version } from "./package.js";
2
-
3
2
  //#region src/version.ts
4
3
  const PlatformaSDKVersion = version;
5
4
  const CurrentSdkInfo = { sdkVersion: PlatformaSDKVersion };
6
-
7
5
  //#endregion
8
6
  export { CurrentSdkInfo, PlatformaSDKVersion };
7
+
9
8
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["import { version } from \"../package.json\";\nexport const PlatformaSDKVersion = version;\n\nexport type SdkInfo = {\n readonly sdkVersion: string;\n};\n\nexport const CurrentSdkInfo: SdkInfo = {\n sdkVersion: PlatformaSDKVersion,\n};\n"],"mappings":";;;AACA,MAAa,sBAAsB;AAMnC,MAAa,iBAA0B,EACrC,YAAY,qBACb"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["import { version } from \"../package.json\";\nexport const PlatformaSDKVersion = version;\n\nexport type SdkInfo = {\n readonly sdkVersion: string;\n};\n\nexport const CurrentSdkInfo: SdkInfo = {\n sdkVersion: PlatformaSDKVersion,\n};\n"],"mappings":";;AACA,MAAa,sBAAsB;AAMnC,MAAa,iBAA0B,EACrC,YAAY,qBACb"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.63.1",
3
+ "version": "1.64.0",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "files": [
6
6
  "./dist/**/*",
@@ -29,23 +29,23 @@
29
29
  "es-toolkit": "^1.39.10",
30
30
  "fast-json-patch": "^3.1.1",
31
31
  "utility-types": "^3.11.0",
32
- "zod": "~3.23.8",
32
+ "zod": "~3.25.76",
33
+ "@milaboratories/pl-model-middle-layer": "1.16.4",
34
+ "@milaboratories/pl-model-common": "1.31.2",
35
+ "@milaboratories/ptabler-expression-js": "1.2.6",
33
36
  "@milaboratories/helpers": "1.14.1",
34
- "@milaboratories/pl-error-like": "1.12.9",
35
- "@milaboratories/pl-model-common": "1.31.1",
36
- "@milaboratories/pl-model-middle-layer": "1.16.3",
37
- "@milaboratories/ptabler-expression-js": "1.2.5"
37
+ "@milaboratories/pl-error-like": "1.12.9"
38
38
  },
39
39
  "devDependencies": {
40
- "@vitest/coverage-istanbul": "^4.0.18",
40
+ "@vitest/coverage-istanbul": "^4.1.3",
41
41
  "fast-json-patch": "^3.1.1",
42
42
  "typescript": "~5.9.3",
43
- "vitest": "^4.0.18",
44
- "@milaboratories/pf-spec-driver": "1.2.3",
45
- "@milaboratories/ts-builder": "1.3.0",
46
- "@milaboratories/build-configs": "1.5.2",
47
- "@milaboratories/ts-configs": "1.2.2",
48
- "@milaboratories/pf-driver": "1.3.3"
43
+ "vitest": "^4.1.3",
44
+ "@milaboratories/build-configs": "2.0.0",
45
+ "@milaboratories/pf-driver": "1.3.5",
46
+ "@milaboratories/pf-spec-driver": "1.2.5",
47
+ "@milaboratories/ts-configs": "1.2.3",
48
+ "@milaboratories/ts-builder": "1.3.1"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "ts-builder build --target node",
@@ -108,17 +108,17 @@ describe("ColumnCollectionBuilder", () => {
108
108
 
109
109
  const collection = builder.build({ allowPartialColumnList: true });
110
110
  expect(collection).toBeDefined();
111
- expect(collection.columnListComplete).toBe(false);
112
111
  expect(collection.findColumns()).toHaveLength(1);
113
112
  });
114
113
 
115
- test("allowPartialColumnList with complete providers sets columnListComplete true", () => {
114
+ test("allowPartialColumnList with complete providers returns collection", () => {
116
115
  const snap = createSnapshot("id1", createSpec("col1"));
117
116
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
118
117
  builder.addSource(createProvider([snap], true));
119
118
 
120
119
  const collection = builder.build({ allowPartialColumnList: true });
121
- expect(collection.columnListComplete).toBe(true);
120
+ expect(collection).toBeDefined();
121
+ expect(collection.findColumns()).toHaveLength(1);
122
122
  });
123
123
  });
124
124
 
@@ -290,25 +290,30 @@ describe("multiple providers", () => {
290
290
  expect(builder.build()).toBeUndefined();
291
291
  });
292
292
 
293
- test("allowPartialColumnList is false only when all providers complete", () => {
293
+ test("allowPartialColumnList returns collection when any provider incomplete", () => {
294
294
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
295
295
  builder.addSource(createProvider([createSnapshot("id1", createSpec("col1"))], true));
296
296
  builder.addSource(createProvider([createSnapshot("id2", createSpec("col2"))], false));
297
297
 
298
298
  const collection = builder.build({ allowPartialColumnList: true });
299
- expect(collection.columnListComplete).toBe(false);
299
+ expect(collection).toBeDefined();
300
+ expect(collection.findColumns()).toHaveLength(2);
300
301
  });
301
302
  });
302
303
 
303
304
  describe("AnchoredColumnCollection", () => {
305
+ // The anchor spec must also exist as a source column — the new implementation
306
+ // resolves PColumnSpec anchors by matching native ID in the collected columns.
304
307
  const anchorSpec = createSpec("anchor-col", {
305
308
  axesSpec: [sampleAxis("sample"), sampleAxis("gene")],
306
309
  });
310
+ const anchorSnap = createSnapshot("anchor-snap-id", anchorSpec);
307
311
 
308
312
  test("build with PColumnSpec anchor returns anchored collection", () => {
309
313
  const s1 = createSnapshot("id1", createSpec("col1", { axesSpec: [sampleAxis("sample")] }));
310
314
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
311
- builder.addSource([s1]);
315
+ // anchorSnap must be in sources so resolveAnchorMap can find it by native ID
316
+ builder.addSource([s1, anchorSnap]);
312
317
 
313
318
  const collection = builder.build({ anchors: { main: anchorSpec } });
314
319
  expect(collection).toBeDefined();
@@ -333,18 +338,11 @@ describe("AnchoredColumnCollection", () => {
333
338
  );
334
339
  });
335
340
 
336
- test("build with PlRef anchor throws", () => {
337
- const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
338
- const plRef = { __isRef: true as const, blockId: "b1", name: "out" };
339
-
340
- expect(() => builder.build({ anchors: { main: plRef } })).toThrow(/PlRef/);
341
- });
342
-
343
341
  test("getColumn returns snapshot by SUniversalPColumnId", () => {
344
342
  const spec = createSpec("col1", { axesSpec: [sampleAxis("sample")] });
345
343
  const snap = createSnapshot("id1", spec);
346
344
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
347
- builder.addSource([snap]);
345
+ builder.addSource([snap, anchorSnap]);
348
346
 
349
347
  const collection = builder.build({ anchors: { main: anchorSpec } })!;
350
348
 
@@ -360,50 +358,65 @@ describe("AnchoredColumnCollection", () => {
360
358
  test("getColumn returns undefined for unknown id", () => {
361
359
  const snap = createSnapshot("id1", createSpec("col1", { axesSpec: [sampleAxis("sample")] }));
362
360
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
363
- builder.addSource([snap]);
361
+ builder.addSource([snap, anchorSnap]);
364
362
 
365
363
  const collection = builder.build({ anchors: { main: anchorSpec } })!;
366
364
  expect(collection.getColumn("not-a-real-id" as SUniversalPColumnId)).toBeUndefined();
367
365
  });
368
366
 
367
+ test("getAnchors returns resolved anchor map", () => {
368
+ const spec = createSpec("col1", { axesSpec: [sampleAxis("sample")] });
369
+ const snap = createSnapshot("id1", spec);
370
+ const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
371
+ builder.addSource([snap, anchorSnap]);
372
+
373
+ const collection = builder.build({ anchors: { main: anchorSpec } })!;
374
+ const anchors = collection.getAnchors();
375
+ expect(anchors.size).toBe(1);
376
+ expect(anchors.get("main")).toBeDefined();
377
+ expect(anchors.get("main")!.spec.name).toBe("anchor-col");
378
+ });
379
+
369
380
  test("findColumns returns ColumnMatch with originalId and variants", () => {
370
381
  const spec = createSpec("col1", { axesSpec: [sampleAxis("sample")] });
371
382
  const snap = createSnapshot("id1", spec);
372
383
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
373
- builder.addSource([snap]);
384
+ // anchorSnap itself also appears in findColumns results (axes ⊆ anchor axes)
385
+ builder.addSource([snap, anchorSnap]);
374
386
 
375
387
  const collection = builder.build({ anchors: { main: anchorSpec } })!;
376
388
  const matches = collection.findColumns();
377
389
 
378
- expect(matches).toHaveLength(1);
379
- expect(matches[0].originalId).toBe("id1");
380
- expect(matches[0].column.spec.name).toBe("col1");
381
- expect(matches[0].variants).toBeDefined();
390
+ // col1 + anchor-col are both discovered
391
+ expect(matches.length).toBeGreaterThanOrEqual(1);
392
+ const col1Match = matches.find((m) => m.column.spec.name === "col1")!;
393
+ expect(col1Match).toBeDefined();
394
+ expect(col1Match.originalId).toBe("id1");
395
+ expect(col1Match.variants).toBeDefined();
382
396
  });
383
397
 
384
398
  test("findColumns exclude filters out matching columns", () => {
385
399
  const snap1 = createSnapshot("id1", createSpec("col1", { axesSpec: [sampleAxis("sample")] }));
386
400
  const snap2 = createSnapshot("id2", createSpec("col2", { axesSpec: [sampleAxis("sample")] }));
387
401
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
388
- builder.addSource([snap1, snap2]);
402
+ builder.addSource([snap1, snap2, anchorSnap]);
389
403
 
390
404
  const collection = builder.build({ anchors: { main: anchorSpec } })!;
391
405
  const results = collection.findColumns({ exclude: { name: "col1" } });
392
- expect(results).toHaveLength(1);
393
- expect(results[0].column.spec.name).toBe("col2");
406
+ expect(results.every((r) => r.column.spec.name !== "col1")).toBe(true);
407
+ expect(results.some((r) => r.column.spec.name === "col2")).toBe(true);
394
408
  });
395
409
 
396
- test("allowPartialColumnList with anchors tracks completeness", () => {
410
+ test("allowPartialColumnList with anchors returns collection when incomplete", () => {
397
411
  const snap = createSnapshot("id1", createSpec("col1", { axesSpec: [sampleAxis("sample")] }));
398
412
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
399
- builder.addSource(createProvider([snap], false));
413
+ builder.addSource(createProvider([snap, anchorSnap], false));
400
414
 
401
415
  const collection = builder.build({
402
416
  anchors: { main: anchorSpec },
403
417
  allowPartialColumnList: true,
404
418
  });
405
419
  expect(collection).toBeDefined();
406
- expect(collection.columnListComplete).toBe(false);
407
420
  });
408
421
 
409
422
  test("build returns undefined with anchors when incomplete and no allowPartial", () => {
@@ -420,7 +433,7 @@ describe("AnchoredColumnCollection", () => {
420
433
  const snap = createSnapshot("id1", spec, "computing");
421
434
 
422
435
  const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
423
- builder.addSource([snap]);
436
+ builder.addSource([snap, anchorSnap]);
424
437
 
425
438
  const collection = builder.build({ anchors: { main: anchorSpec } })!;
426
439