@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
@@ -117,17 +117,14 @@ test.each<{ name: string; traces: Trace[]; labels: string[] }>([
117
117
  labels: ["Unique entry 1", "Unique entry 2"],
118
118
  },
119
119
  ])("test label derivation: $name", ({ traces, labels }) => {
120
- expect(deriveDistinctLabels(tracesToSpecs(traces)).map((r) => r.label)).toEqual(labels);
121
- expect(
122
- deriveDistinctLabels(tracesToSpecs(traces), { includeNativeLabel: true }).map((r) => r.label),
123
- ).toEqual(labels.map((l) => "Label / " + l));
120
+ expect(deriveDistinctLabels(tracesToSpecs(traces))).toEqual(labels);
121
+ expect(deriveDistinctLabels(tracesToSpecs(traces), { includeNativeLabel: true })).toEqual(
122
+ labels.map((l) => "Label / " + l),
123
+ );
124
124
  });
125
125
 
126
126
  test("test fallback to native labels in label derivation", () => {
127
- expect(deriveDistinctLabels(tracesToSpecs([[], []])).map((r) => r.label)).toEqual([
128
- "Label",
129
- "Label",
130
- ]);
127
+ expect(deriveDistinctLabels(tracesToSpecs([[], []]))).toEqual(["Label", "Label"]);
131
128
  });
132
129
 
133
130
  test.each<{ name: string; traces: Trace[]; labels: string[] }>([
@@ -208,7 +205,7 @@ test.each<{ name: string; traces: Trace[]; labels: string[] }>([
208
205
  labels: ["A", "A", "B"],
209
206
  },
210
207
  ])("test label minimization: $name", ({ traces, labels }) => {
211
- expect(deriveDistinctLabels(tracesToSpecs(traces)).map((r) => r.label)).toEqual(labels);
208
+ expect(deriveDistinctLabels(tracesToSpecs(traces))).toEqual(labels);
212
209
  });
213
210
 
214
211
  test.each<{ name: string; traces: Trace[]; labels: string[]; forceTraceElements: string[] }>([
@@ -274,72 +271,173 @@ test.each<{ name: string; traces: Trace[]; labels: string[]; forceTraceElements:
274
271
  ])(
275
272
  "test label derivation with forceTraceElements: $name",
276
273
  ({ name, traces, labels, forceTraceElements }) => {
277
- expect(
278
- deriveDistinctLabels(tracesToSpecs(traces), { forceTraceElements }).map((r) => r.label),
279
- ).toEqual(labels);
274
+ expect(deriveDistinctLabels(tracesToSpecs(traces), { forceTraceElements })).toEqual(labels);
280
275
 
281
276
  if (name === "force element with includeNativeLabel") {
282
277
  expect(
283
278
  deriveDistinctLabels(tracesToSpecs(traces), {
284
279
  forceTraceElements,
285
280
  includeNativeLabel: true,
286
- }).map((r) => r.label),
281
+ }),
287
282
  ).toEqual(labels.map((l) => "Label / " + l));
288
283
  }
289
284
  },
290
285
  );
291
286
 
292
- // --- Entry with { spec, prefixTrace, suffixTrace } ---
287
+ // --- Entry with { spec, extraTrace } ---
293
288
 
294
- test("Entry with prefixTrace prepends to labels", () => {
289
+ test("Entry with extraTrace (suffix, default) appends to labels", () => {
295
290
  const spec = createSpec({
296
291
  annotations: {
297
292
  [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Base" }]),
298
293
  },
299
294
  });
300
295
  const entries: Entry[] = [
301
- { spec, prefixTrace: [{ type: "prefix", label: "P1" }] },
302
- { spec, prefixTrace: [{ type: "prefix", label: "P2" }] },
296
+ { spec, extraTrace: [{ type: "suffix", label: "S1" }] },
297
+ { spec, extraTrace: [{ type: "suffix", label: "S2" }] },
303
298
  ];
304
- const labels = deriveDistinctLabels(entries).map((r) => r.label);
305
- expect(labels).toEqual(["P1", "P2"]);
299
+ const labels = deriveDistinctLabels(entries);
300
+ expect(labels).toEqual(["S1", "S2"]);
306
301
  });
307
302
 
308
- test("Entry with suffixTrace appends to labels", () => {
303
+ test("Entry with extraTrace position prefix prepends to labels", () => {
309
304
  const spec = createSpec({
310
305
  annotations: {
311
306
  [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Base" }]),
312
307
  },
313
308
  });
314
309
  const entries: Entry[] = [
315
- { spec, suffixTrace: [{ type: "suffix", label: "S1" }] },
316
- { spec, suffixTrace: [{ type: "suffix", label: "S2" }] },
310
+ { spec, extraTrace: [{ type: "prefix", label: "P1", position: "prefix" }] },
311
+ { spec, extraTrace: [{ type: "prefix", label: "P2", position: "prefix" }] },
317
312
  ];
318
- const labels = deriveDistinctLabels(entries).map((r) => r.label);
319
- expect(labels).toEqual(["S1", "S2"]);
313
+ const labels = deriveDistinctLabels(entries);
314
+ expect(labels).toEqual(["P1", "P2"]);
320
315
  });
321
316
 
322
- test("Entry with both prefixTrace and suffixTrace", () => {
323
- const spec1 = createSpec({
324
- annotations: {
325
- [Annotation.Trace]: JSON.stringify([{ type: "base", label: "Same" }]),
317
+ // --- linkerPath ---
318
+
319
+ test("linkerPath appends default 'via' suffix", () => {
320
+ const entries: Entry[] = [
321
+ {
322
+ spec: createSpec({
323
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col1" }]) },
324
+ }),
325
+ linkerPath: [
326
+ {
327
+ spec: createSpec({
328
+ annotations: { [Annotation.LinkLabel]: "MyLinker" },
329
+ }),
330
+ },
331
+ ],
332
+ },
333
+ {
334
+ spec: createSpec({
335
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col2" }]) },
336
+ }),
326
337
  },
338
+ ];
339
+ const labels = deriveDistinctLabels(entries);
340
+ expect(labels).toEqual(["Col1 via MyLinker", "Col2"]);
341
+ });
342
+
343
+ test("linkerPath with multiple steps joins with ' > '", () => {
344
+ const entries: Entry[] = [
345
+ {
346
+ spec: createSpec({
347
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col1" }]) },
348
+ }),
349
+ linkerPath: [
350
+ { spec: createSpec({ annotations: { [Annotation.LinkLabel]: "L1" } }) },
351
+ { spec: createSpec({ annotations: { [Annotation.LinkLabel]: "L2" } }) },
352
+ ],
353
+ },
354
+ {
355
+ spec: createSpec({
356
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col2" }]) },
357
+ }),
358
+ },
359
+ ];
360
+ const labels = deriveDistinctLabels(entries);
361
+ expect(labels).toEqual(["Col1 via L1 > L2", "Col2"]);
362
+ });
363
+
364
+ test("linkerPath skips steps without labels", () => {
365
+ const entries: Entry[] = [
366
+ {
367
+ spec: createSpec({
368
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col1" }]) },
369
+ }),
370
+ linkerPath: [
371
+ { spec: createSpec() },
372
+ { spec: createSpec({ annotations: { [Annotation.LinkLabel]: "L2" } }) },
373
+ ],
374
+ },
375
+ {
376
+ spec: createSpec({
377
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col2" }]) },
378
+ }),
379
+ },
380
+ ];
381
+ const labels = deriveDistinctLabels(entries);
382
+ expect(labels).toEqual(["Col1 via L2", "Col2"]);
383
+ });
384
+
385
+ test("linkerPath with custom linkerLabelFormatter", () => {
386
+ const entries: Entry[] = [
387
+ {
388
+ spec: createSpec({
389
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col1" }]) },
390
+ }),
391
+ linkerPath: [{ spec: createSpec({ annotations: { [Annotation.LinkLabel]: "L1" } }) }],
392
+ },
393
+ {
394
+ spec: createSpec({
395
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col2" }]) },
396
+ }),
397
+ },
398
+ ];
399
+ const labels = deriveDistinctLabels(entries, {
400
+ linkerLabelFormatter: (linkerLabels) => `[${linkerLabels.join(", ")}]`,
327
401
  });
402
+ expect(labels).toEqual(["Col1 [L1]", "Col2"]);
403
+ });
404
+
405
+ test("linkerPath with linkerLabelFormatter returning undefined suppresses suffix", () => {
328
406
  const entries: Entry[] = [
329
407
  {
330
- spec: spec1,
331
- prefixTrace: [{ type: "pfx", label: "Pre1" }],
332
- suffixTrace: [{ type: "sfx", label: "Suf1" }],
408
+ spec: createSpec({
409
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col1" }]) },
410
+ }),
411
+ linkerPath: [{ spec: createSpec({ annotations: { [Annotation.LinkLabel]: "L1" } }) }],
333
412
  },
334
413
  {
335
- spec: spec1,
336
- prefixTrace: [{ type: "pfx", label: "Pre2" }],
337
- suffixTrace: [{ type: "sfx", label: "Suf2" }],
414
+ spec: createSpec({
415
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col2" }]) },
416
+ }),
338
417
  },
339
418
  ];
340
- const labels = deriveDistinctLabels(entries).map((r) => r.label);
341
- // suffix is later in the trace (higher positional importance), so it wins over prefix
342
- expect(labels).toEqual(["Suf1", "Suf2"]);
419
+ const labels = deriveDistinctLabels(entries, {
420
+ linkerLabelFormatter: () => undefined,
421
+ });
422
+ expect(labels).toEqual(["Col1", "Col2"]);
423
+ });
424
+
425
+ test("linkerPath falls back to Label when LinkLabel is absent", () => {
426
+ const entries: Entry[] = [
427
+ {
428
+ spec: createSpec({
429
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col1" }]) },
430
+ }),
431
+ linkerPath: [{ spec: createSpec({ annotations: { [Annotation.Label]: "FallbackLabel" } }) }],
432
+ },
433
+ {
434
+ spec: createSpec({
435
+ annotations: { [Annotation.Trace]: JSON.stringify([{ type: "t1", label: "Col2" }]) },
436
+ }),
437
+ },
438
+ ];
439
+ const labels = deriveDistinctLabels(entries);
440
+ expect(labels).toEqual(["Col1 via FallbackLabel", "Col2"]);
343
441
  });
344
442
 
345
443
  // --- addLabelAsSuffix ---
@@ -349,7 +447,7 @@ test("addLabelAsSuffix places native label at the end", () => {
349
447
  const labels = deriveDistinctLabels(specs, {
350
448
  includeNativeLabel: true,
351
449
  addLabelAsSuffix: true,
352
- }).map((r) => r.label);
450
+ });
353
451
  expect(labels).toEqual(["L1 / Label", "L2 / Label"]);
354
452
  });
355
453
 
@@ -370,7 +468,7 @@ test("custom separator is used between label parts", () => {
370
468
  { type: "t2", label: "Y" },
371
469
  ],
372
470
  ]);
373
- const labels = deriveDistinctLabels(specs, { separator: " - " }).map((r) => r.label);
471
+ const labels = deriveDistinctLabels(specs, { separator: " - " });
374
472
  expect(labels).toEqual(["A - X", "A - Y", "B - Y"]);
375
473
  });
376
474
 
@@ -378,7 +476,7 @@ test("custom separator is used between label parts", () => {
378
476
 
379
477
  test("single value gets its trace label", () => {
380
478
  const specs = tracesToSpecs([[{ type: "t1", label: "Only" }]]);
381
- const labels = deriveDistinctLabels(specs).map((r) => r.label);
479
+ const labels = deriveDistinctLabels(specs);
382
480
  expect(labels).toEqual(["Only"]);
383
481
  });
384
482
 
@@ -395,13 +493,13 @@ test("Unlabeled fallback when no trace entries match", () => {
395
493
  delete spec.annotations![Annotation.Label];
396
494
 
397
495
  const result = deriveDistinctLabels([spec, spec]);
398
- expect(result.every((r) => r.label === "Same")).toBe(true);
496
+ expect(result.every((r) => r === "Same")).toBe(true);
399
497
  });
400
498
 
401
499
  test("Unlabeled when no traces and no label", () => {
402
500
  const spec = createSpec();
403
501
  const result = deriveDistinctLabels([spec, spec]);
404
- expect(result.every((r) => r.label === "Unlabeled")).toBe(true);
502
+ expect(result.every((r) => r === "Unlabeled")).toBe(true);
405
503
  });
406
504
 
407
505
  // --- repeated type occurrences (secondaryTypes path) ---
@@ -418,7 +516,7 @@ test("repeated type occurrences are used as secondary types", () => {
418
516
  { type: "t1", label: "B" },
419
517
  ],
420
518
  ]);
421
- const labels = deriveDistinctLabels(specs).map((r) => r.label);
519
+ const labels = deriveDistinctLabels(specs);
422
520
  // t1@1 has label "First" for both (same), t1@2 has "A" vs "B" (distinguishing)
423
521
  // t1@2 is secondary since it only appears when there are 2 occurrences
424
522
  expect(labels).toEqual(["A", "B"]);
@@ -439,7 +537,7 @@ test("spec without native label uses only trace entries", () => {
439
537
  },
440
538
  }),
441
539
  ];
442
- const labels = deriveDistinctLabels(specs).map((r) => r.label);
540
+ const labels = deriveDistinctLabels(specs);
443
541
  expect(labels).toEqual(["X", "Y"]);
444
542
  });
445
543
 
@@ -456,6 +554,6 @@ test("includeNativeLabel with no native label does not break", () => {
456
554
  },
457
555
  }),
458
556
  ];
459
- const labels = deriveDistinctLabels(specs, { includeNativeLabel: true }).map((r) => r.label);
557
+ const labels = deriveDistinctLabels(specs, { includeNativeLabel: true });
460
558
  expect(labels).toEqual(["X", "Y"]);
461
559
  });
@@ -2,32 +2,34 @@ import {
2
2
  Annotation,
3
3
  parseJson,
4
4
  readAnnotation,
5
- type CanonicalizedJson,
6
5
  type PObjectSpec,
6
+ type StringifiedJson,
7
+ type Trace,
7
8
  } from "@milaboratories/pl-model-common";
8
9
  import { throwError } from "@milaboratories/helpers";
10
+ import { isFunction, isNil } from "es-toolkit";
11
+
12
+ export type { Trace, TraceEntry } from "@milaboratories/pl-model-common";
9
13
 
10
14
  const DISTANCE_PENALTY = 0.001;
11
15
  const LABEL_TYPE = "__LABEL__";
12
16
  const LABEL_TYPE_FULL = "__LABEL__@1";
13
17
 
14
- export type WithLabel<T> = {
15
- value: T;
16
- label: string;
17
- };
18
-
19
- type TraceEntry = {
20
- id?: string;
21
- type: string;
22
- label: string;
18
+ /** SDK-internal trace shape — adds fields used by this algorithm only, not part of the on-disk contract. */
19
+ type ExtendedTraceEntry = Trace[number] & {
23
20
  importance?: number;
21
+ position?: "prefix" | "suffix";
24
22
  };
25
23
 
26
- export type Trace = TraceEntry[];
27
-
28
24
  export type Entry =
29
25
  | PObjectSpec
30
- | { spec: PObjectSpec; prefixTrace?: TraceEntry[]; suffixTrace?: TraceEntry[] };
26
+ | {
27
+ spec: PObjectSpec;
28
+ /** Extra trace entries merged with the base trace from annotations. */
29
+ extraTrace?: ExtendedTraceEntry[];
30
+ /** Linker steps traversed to discover this column; used to append "via $linkLabel" to derived labels. */
31
+ linkerPath?: { spec: PObjectSpec }[];
32
+ };
31
33
 
32
34
  export type DeriveLabelsOptions = {
33
35
  /** Separator to use between label parts (" / " by default) */
@@ -38,18 +40,33 @@ export type DeriveLabelsOptions = {
38
40
  includeNativeLabel?: boolean;
39
41
  /** Trace elements list that will be forced to be included in the label. */
40
42
  forceTraceElements?: string[];
43
+ /** Custom formatter for linker path suffix. Receives the array of linker labels from the full traversal chain,
44
+ * the column spec, and the column index.
45
+ * If returns undefined, no linker suffix is appended. By default labels are joined with " > " and prefixed with "via ". */
46
+ linkerLabelFormatter?: (
47
+ linkerLabels: string[],
48
+ spec: PObjectSpec,
49
+ index: number,
50
+ ) => string | undefined;
41
51
  };
42
52
 
43
- export function deriveDistinctLabels<T extends Entry>(
44
- values: T[],
45
- options: DeriveLabelsOptions = {},
46
- ): WithLabel<T>[] {
53
+ export function deriveDistinctLabels(values: Entry[], options: DeriveLabelsOptions = {}): string[] {
47
54
  const forceTraceElements =
48
55
  options.forceTraceElements !== undefined && options.forceTraceElements.length > 0
49
56
  ? new Set(options.forceTraceElements)
50
57
  : undefined;
51
58
  const separator = options.separator ?? " / ";
52
59
 
60
+ // Collect per-entry linker suffixes before disambiguation
61
+ const linkerSuffixes = values.map((v, i) => {
62
+ const spec = "spec" in v && typeof v.spec === "object" ? v.spec : (v as PObjectSpec);
63
+ const linkerLabels = extractLinkerLabels(v);
64
+ if (linkerLabels.length === 0) return undefined;
65
+ return isFunction(options.linkerLabelFormatter)
66
+ ? options.linkerLabelFormatter(linkerLabels, spec, i)
67
+ : `via ${linkerLabels.join(" > ")}`;
68
+ });
69
+
53
70
  // Phase 1: enrich each value with parsed trace
54
71
  const records = values.map((v) => enrichRecord(v, options));
55
72
 
@@ -65,7 +82,12 @@ export function deriveDistinctLabels<T extends Entry>(
65
82
  if (mainTypes.length === 0) {
66
83
  if (secondaryTypes.length !== 0)
67
84
  throw new Error("Non-empty secondary types list while main types list is empty.");
68
- return build(new Set(LABEL_TYPE_FULL), true)!;
85
+
86
+ return applyLinkerSuffixes(
87
+ build(new Set(LABEL_TYPE_FULL), true) ??
88
+ throwError("Failed to derive labels using native column labels"),
89
+ linkerSuffixes,
90
+ );
69
91
  }
70
92
 
71
93
  // Phase 4: search for minimal type set that produces unique labels
@@ -96,7 +118,10 @@ export function deriveDistinctLabels<T extends Entry>(
96
118
  options,
97
119
  separator,
98
120
  );
99
- return build(minimized, false) ?? throwError("Failed to derive unique labels");
121
+ return applyLinkerSuffixes(
122
+ build(minimized, false) ?? throwError("Failed to derive unique labels"),
123
+ linkerSuffixes,
124
+ );
100
125
  }
101
126
 
102
127
  additionalType++;
@@ -116,29 +141,55 @@ export function deriveDistinctLabels<T extends Entry>(
116
141
  options,
117
142
  separator,
118
143
  );
119
- return build(minimized, true) ?? throwError("Failed to derive unique labels");
144
+ return applyLinkerSuffixes(
145
+ build(minimized, true) ?? throwError("Failed to derive unique labels"),
146
+ linkerSuffixes,
147
+ );
148
+ }
149
+
150
+ /** Apply pre-formatted linker suffixes to labels that have them. */
151
+ function applyLinkerSuffixes(labels: string[], suffixes: (string | undefined)[]): string[] {
152
+ return labels.map((label, i) => (isNil(suffixes[i]) ? label : `${label} ${suffixes[i]}`));
153
+ }
154
+
155
+ /** Extract linker labels from every step of the linkers path. */
156
+ function extractLinkerLabels(entry: Entry): string[] {
157
+ if (!("spec" in entry) || typeof entry.spec !== "object") return [];
158
+ const path = entry.linkerPath;
159
+ if (path === undefined || path.length === 0) return [];
160
+ const labels: string[] = [];
161
+ for (const step of path) {
162
+ const label = (
163
+ readAnnotation(step.spec, Annotation.LinkLabel) ?? readAnnotation(step.spec, Annotation.Label)
164
+ )?.trim();
165
+ if (label !== undefined && label.length > 0) {
166
+ labels.push(label);
167
+ }
168
+ }
169
+ return labels;
120
170
  }
121
171
 
122
172
  // --- Pure helpers ---
123
- type FullTraceEntry = TraceEntry & { fullType: string; occurrenceIndex: number };
173
+ type FullTraceEntry = ExtendedTraceEntry & { fullType: string; occurrenceIndex: number };
124
174
 
125
- type EnrichedRecord<T> = {
126
- value: T;
175
+ type EnrichedRecord = {
127
176
  fullTrace: FullTraceEntry[];
128
177
  };
129
178
 
130
179
  function extractSpecAndTrace(entry: Entry): {
131
180
  spec: PObjectSpec;
132
- prefixTrace: TraceEntry[] | undefined;
133
- suffixTrace: TraceEntry[] | undefined;
181
+ extraTrace: ExtendedTraceEntry[] | undefined;
182
+ linkerPath: { spec: PObjectSpec }[] | undefined;
134
183
  } {
135
- if ("spec" in entry && typeof entry.spec === "object") {
136
- return { spec: entry.spec, prefixTrace: entry.prefixTrace, suffixTrace: entry.suffixTrace };
137
- }
138
- return { spec: entry as PObjectSpec, prefixTrace: undefined, suffixTrace: undefined };
184
+ const isEnriched = "spec" in entry && typeof entry.spec === "object";
185
+ return {
186
+ spec: isEnriched ? entry.spec : (entry as PObjectSpec),
187
+ extraTrace: isEnriched ? entry.extraTrace : undefined,
188
+ linkerPath: isEnriched ? entry.linkerPath : undefined,
189
+ };
139
190
  }
140
191
 
141
- function buildFullTrace(trace: TraceEntry[]): FullTraceEntry[] {
192
+ function buildFullTrace(trace: ExtendedTraceEntry[]): FullTraceEntry[] {
142
193
  const result: FullTraceEntry[] = [];
143
194
  const occurrences = new Map<string, number>();
144
195
 
@@ -157,15 +208,17 @@ function buildFullTrace(trace: TraceEntry[]): FullTraceEntry[] {
157
208
  return result;
158
209
  }
159
210
 
160
- function enrichRecord<T extends Entry>(value: T, options: DeriveLabelsOptions): EnrichedRecord<T> {
161
- const { spec, prefixTrace, suffixTrace } = extractSpecAndTrace(value);
211
+ function enrichRecord(value: Entry, options: DeriveLabelsOptions): EnrichedRecord {
212
+ const { spec, extraTrace } = extractSpecAndTrace(value);
162
213
 
163
214
  const label = readAnnotation(spec, Annotation.Label);
164
- const traceStr = readAnnotation(spec, Annotation.Trace) as
165
- | CanonicalizedJson<TraceEntry[]>
166
- | undefined;
167
- const baseTrace: Trace = traceStr ? (parseJson<Trace>(traceStr) ?? []) : [];
168
- const trace = [...(prefixTrace ?? []), ...baseTrace, ...(suffixTrace ?? [])];
215
+ const traceStr = readAnnotation(spec, Annotation.Trace);
216
+ const baseTrace = traceStr
217
+ ? (parseJson(traceStr as StringifiedJson<ExtendedTraceEntry[]>) ?? [])
218
+ : [];
219
+ const prefixExtra = extraTrace?.filter((e) => e.position === "prefix") ?? [];
220
+ const suffixExtra = extraTrace?.filter((e) => e.position !== "prefix") ?? [];
221
+ const trace = [...prefixExtra, ...baseTrace, ...suffixExtra];
169
222
 
170
223
  if (label !== undefined) {
171
224
  const labelEntry = { label, type: LABEL_TYPE, importance: -2 };
@@ -173,7 +226,7 @@ function enrichRecord<T extends Entry>(value: T, options: DeriveLabelsOptions):
173
226
  else trace.splice(0, 0, labelEntry);
174
227
  }
175
228
 
176
- return { value, fullTrace: buildFullTrace(trace) };
229
+ return { fullTrace: buildFullTrace(trace) };
177
230
  }
178
231
 
179
232
  type TypeStats = {
@@ -181,7 +234,7 @@ type TypeStats = {
181
234
  countByType: Map<string, number>;
182
235
  };
183
236
 
184
- function collectTypeStats<T>(records: EnrichedRecord<T>[]): TypeStats {
237
+ function collectTypeStats(records: EnrichedRecord[]): TypeStats {
185
238
  const importances = new Map<string, number>();
186
239
  const countByType = new Map<string, number>();
187
240
 
@@ -220,14 +273,14 @@ function classifyTypes(
220
273
  return { mainTypes, secondaryTypes };
221
274
  }
222
275
 
223
- function buildLabels<T>(
224
- records: EnrichedRecord<T>[],
276
+ function buildLabels(
277
+ records: EnrichedRecord[],
225
278
  includedTypes: Set<string>,
226
279
  forceTraceElements: Set<string> | undefined,
227
280
  separator: string,
228
281
  force: boolean,
229
- ): WithLabel<T>[] | undefined {
230
- const result: WithLabel<T>[] = [];
282
+ ): string[] | undefined {
283
+ const result: string[] = [];
231
284
 
232
285
  for (const r of records) {
233
286
  const parts: string[] = [];
@@ -239,24 +292,24 @@ function buildLabels<T>(
239
292
 
240
293
  if (parts.length === 0) {
241
294
  if (!force) return undefined;
242
- result.push({ label: "Unlabeled", value: r.value });
295
+ result.push("Unlabeled");
243
296
  continue;
244
297
  }
245
298
 
246
- result.push({ label: parts.join(separator), value: r.value });
299
+ result.push(parts.join(separator));
247
300
  }
248
301
 
249
302
  return result;
250
303
  }
251
304
 
252
- function countUniqueLabels<T>(result: WithLabel<T>[] | undefined): number {
305
+ function countUniqueLabels(result: string[] | undefined): number {
253
306
  if (result === undefined) return 0;
254
- return new Set(result.map((c) => c.label)).size;
307
+ return new Set(result).size;
255
308
  }
256
309
 
257
- function minimizeTypeSet<T>(
310
+ function minimizeTypeSet(
258
311
  typeSet: Set<string>,
259
- records: EnrichedRecord<T>[],
312
+ records: EnrichedRecord[],
260
313
  stats: TypeStats,
261
314
  forceTraceElements: Set<string> | undefined,
262
315
  options: DeriveLabelsOptions,
@@ -1,2 +1 @@
1
1
  export * from "./derive_distinct_labels";
2
- export * from "./write_labels_to_specs";
package/src/render/api.ts CHANGED
@@ -686,10 +686,12 @@ export abstract class RenderCtxBase<
686
686
 
687
687
  // TODO remove all non-PColumn fields
688
688
  public createPFrame(
689
- def: PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>>,
689
+ def: PFrameDef<
690
+ PColumn<undefined | PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>
691
+ >,
690
692
  ): PFrameHandle | undefined {
691
- this.verifyInlineAndExplicitColumnsSupport(def);
692
693
  if (!allPColumnsReady(def)) return undefined;
694
+ this.verifyInlineAndExplicitColumnsSupport(def);
693
695
  return this.ctx.createPFrame(def.map((c) => transformPColumnData(c)));
694
696
  }
695
697
 
@@ -731,11 +733,19 @@ export abstract class RenderCtxBase<
731
733
  return this.ctx.createPTable(mapPTableDef(rawDef, (po) => transformPColumnData(po)));
732
734
  }
733
735
 
734
- public createPTableV2(def: PTableDefV2<PColumn<PColumnDataUniversal>>): PTableHandle | undefined {
736
+ public createPTableV2(
737
+ def: PTableDefV2<PColumn<undefined | PColumnDataUniversal>>,
738
+ ): PTableHandle | undefined {
735
739
  const columns = collectSpecQueryColumns(def.query);
736
- this.verifyInlineAndExplicitColumnsSupport(columns);
737
740
  if (!allPColumnsReady(columns)) return undefined;
738
- return this.ctx.createPTableV2(mapPTableDefV2(def, (po) => transformPColumnData(po)));
741
+ this.verifyInlineAndExplicitColumnsSupport(columns);
742
+ return this.ctx.createPTableV2(
743
+ mapPTableDefV2(def, (po) => {
744
+ if (po.data === undefined)
745
+ throw new Error("unreachable: column data undefined after readiness check");
746
+ return transformPColumnData({ id: po.id, spec: po.spec, data: po.data });
747
+ }),
748
+ );
739
749
  }
740
750
 
741
751
  /** @deprecated scheduled for removal from SDK */
@@ -126,8 +126,8 @@ type IntermediateDirectEntry = {
126
126
  // Union type for intermediate processing
127
127
  type IntermediateColumnEntry = IntermediateSplitEntry | IntermediateDirectEntry;
128
128
 
129
- function splitFiltersToTrace(splitFilters?: AxisFilterInfo[]) {
130
- if (!splitFilters) return undefined;
129
+ function splitFiltersToExtraTrace(splitFilters?: AxisFilterInfo[]) {
130
+ if (splitFilters === undefined) return undefined;
131
131
  return splitFilters.map((filter) => ({
132
132
  type: `split:${canonicalizeAxisId(filter.axisId)}`,
133
133
  label: filter.label,
@@ -467,7 +467,8 @@ export class PColumnCollection {
467
467
  intermediateResults,
468
468
  (entry) => ({
469
469
  spec: entry.spec,
470
- suffixTrace: entry.type === "split" ? splitFiltersToTrace(entry.axisFilters) : undefined,
470
+ extraTrace:
471
+ entry.type === "split" ? splitFiltersToExtraTrace(entry.axisFilters) : undefined,
471
472
  }),
472
473
  labelOps,
473
474
  );
@@ -20,6 +20,6 @@ export function deriveLabels<T>(
20
20
  options: DeriveLabelsOptions = {},
21
21
  ): WithLabel<T>[] {
22
22
  const specs = values.map(getSpec);
23
- const labeled = deriveDistinctLabels(specs, options);
24
- return labeled.map((l, i) => ({ value: values[i], label: l.label }));
23
+ const labels = deriveDistinctLabels(specs, options);
24
+ return labels.map((label, i) => ({ value: values[i], label }));
25
25
  }
@@ -546,7 +546,7 @@ export function convertOrParsePColumnData(
546
546
  }
547
547
 
548
548
  export function isPColumnReady(
549
- c: PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>,
549
+ c: PColumn<undefined | PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>,
550
550
  ): c is PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal> {
551
551
  const isValues = (d: PColumnDataUniversal): d is PColumnValues => Array.isArray(d);
552
552
  const isAccessor = (d: PColumnDataUniversal): d is TreeNodeAccessor =>
@@ -561,14 +561,16 @@ export function isPColumnReady(
561
561
  } else if (isDataInfo(data)) {
562
562
  visitDataInfo(data, (v) => (ready &&= v.getIsReadyOrError()));
563
563
  } else if (!isValues(data)) {
564
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
565
564
  throw Error(`unsupported column data type: ${data satisfies never}`);
566
565
  }
567
566
  return ready;
568
567
  }
569
568
 
570
569
  export function allPColumnsReady(
571
- columns: (PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>)[],
570
+ columns: (
571
+ | PColumn<undefined | PColumnDataUniversal>
572
+ | PColumnLazy<undefined | PColumnDataUniversal>
573
+ )[],
572
574
  ): columns is (PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal>)[] {
573
575
  return columns.every(isPColumnReady);
574
576
  }