@platforma-sdk/model 1.63.1 → 1.63.12

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 (334) 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 +6 -7
  70. package/dist/columns/column_collection_builder.cjs.map +1 -1
  71. package/dist/columns/column_collection_builder.d.ts.map +1 -0
  72. package/dist/columns/column_collection_builder.js +1 -2
  73. package/dist/columns/column_collection_builder.js.map +1 -1
  74. package/dist/columns/column_selector.cjs +1 -2
  75. package/dist/columns/column_selector.cjs.map +1 -1
  76. package/dist/columns/column_selector.d.ts.map +1 -0
  77. package/dist/columns/column_selector.js +1 -1
  78. package/dist/columns/column_selector.js.map +1 -1
  79. package/dist/columns/column_snapshot.cjs +1 -2
  80. package/dist/columns/column_snapshot.cjs.map +1 -1
  81. package/dist/columns/column_snapshot.d.ts.map +1 -0
  82. package/dist/columns/column_snapshot.js +1 -1
  83. package/dist/columns/column_snapshot_provider.cjs +1 -2
  84. package/dist/columns/column_snapshot_provider.cjs.map +1 -1
  85. package/dist/columns/column_snapshot_provider.d.ts.map +1 -0
  86. package/dist/columns/column_snapshot_provider.js +1 -1
  87. package/dist/columns/column_snapshot_provider.js.map +1 -1
  88. package/dist/columns/ctx_column_sources.cjs +3 -4
  89. package/dist/columns/ctx_column_sources.cjs.map +1 -1
  90. package/dist/columns/ctx_column_sources.d.ts +0 -1
  91. package/dist/columns/ctx_column_sources.d.ts.map +1 -0
  92. package/dist/columns/ctx_column_sources.js +1 -2
  93. package/dist/columns/ctx_column_sources.js.map +1 -1
  94. package/dist/columns/index.cjs +5 -5
  95. package/dist/columns/index.js +5 -5
  96. package/dist/components/PFrameForGraphs.cjs +4 -5
  97. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  98. package/dist/components/PFrameForGraphs.d.ts +0 -1
  99. package/dist/components/PFrameForGraphs.d.ts.map +1 -0
  100. package/dist/components/PFrameForGraphs.js +2 -3
  101. package/dist/components/PFrameForGraphs.js.map +1 -1
  102. package/dist/components/PlAnnotations/filter.d.ts.map +1 -0
  103. package/dist/components/PlAnnotations/filters_ui.cjs +1 -2
  104. package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
  105. package/dist/components/PlAnnotations/filters_ui.d.ts +0 -2
  106. package/dist/components/PlAnnotations/filters_ui.d.ts.map +1 -0
  107. package/dist/components/PlAnnotations/filters_ui.js +1 -1
  108. package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
  109. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +9 -10
  110. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  111. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +0 -1
  112. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -0
  113. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +1 -2
  114. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  115. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +14 -15
  116. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  117. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +0 -2
  118. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -0
  119. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +1 -2
  120. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  121. package/dist/components/PlDataTable/createPlDataTable/index.cjs +3 -4
  122. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  123. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +0 -1
  124. package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -0
  125. package/dist/components/PlDataTable/createPlDataTable/index.js +1 -2
  126. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  127. package/dist/components/PlDataTable/createPlDataTableSheet.cjs +1 -2
  128. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  129. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +0 -1
  130. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts.map +1 -0
  131. package/dist/components/PlDataTable/createPlDataTableSheet.js +1 -1
  132. package/dist/components/PlDataTable/index.cjs +5 -5
  133. package/dist/components/PlDataTable/index.js +5 -5
  134. package/dist/components/PlDataTable/labels.cjs +4 -5
  135. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  136. package/dist/components/PlDataTable/labels.js +1 -2
  137. package/dist/components/PlDataTable/labels.js.map +1 -1
  138. package/dist/components/PlDataTable/state-migration.cjs +4 -5
  139. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  140. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -0
  141. package/dist/components/PlDataTable/state-migration.js +1 -2
  142. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  143. package/dist/components/PlDataTable/typesV4.d.ts.map +1 -0
  144. package/dist/components/PlDataTable/typesV5.d.ts +0 -1
  145. package/dist/components/PlDataTable/typesV5.d.ts.map +1 -0
  146. package/dist/components/PlMultiSequenceAlignment.cjs +2 -3
  147. package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
  148. package/dist/components/PlMultiSequenceAlignment.d.ts.map +1 -0
  149. package/dist/components/PlMultiSequenceAlignment.js +1 -2
  150. package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
  151. package/dist/components/PlSelectionModel.cjs +1 -2
  152. package/dist/components/PlSelectionModel.cjs.map +1 -1
  153. package/dist/components/PlSelectionModel.d.ts.map +1 -0
  154. package/dist/components/PlSelectionModel.js +1 -1
  155. package/dist/components/index.cjs +11 -11
  156. package/dist/components/index.d.ts +0 -2
  157. package/dist/components/index.js +10 -10
  158. package/dist/config/actions.cjs +1 -2
  159. package/dist/config/actions.cjs.map +1 -1
  160. package/dist/config/actions.d.ts.map +1 -0
  161. package/dist/config/actions.js +1 -1
  162. package/dist/config/actions_kinds.d.ts.map +1 -0
  163. package/dist/config/index.cjs +1 -1
  164. package/dist/config/index.js +1 -1
  165. package/dist/config/model.d.ts.map +1 -0
  166. package/dist/config/model_meta.d.ts.map +1 -0
  167. package/dist/config/type_engine.d.ts.map +1 -0
  168. package/dist/config/type_util.d.ts.map +1 -0
  169. package/dist/env_value.cjs +1 -2
  170. package/dist/env_value.cjs.map +1 -1
  171. package/dist/env_value.d.ts.map +1 -0
  172. package/dist/env_value.js +1 -1
  173. package/dist/env_value.js.map +1 -1
  174. package/dist/filters/converters/filterToQuery.cjs +3 -4
  175. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  176. package/dist/filters/converters/filterToQuery.d.ts.map +1 -0
  177. package/dist/filters/converters/filterToQuery.js +1 -2
  178. package/dist/filters/converters/filterToQuery.js.map +1 -1
  179. package/dist/filters/converters/filterUiToExpressionImpl.cjs +3 -4
  180. package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -1
  181. package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +1 -0
  182. package/dist/filters/converters/filterUiToExpressionImpl.js +1 -2
  183. package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -1
  184. package/dist/filters/converters/index.cjs +2 -2
  185. package/dist/filters/converters/index.js +2 -2
  186. package/dist/filters/distill.cjs +3 -4
  187. package/dist/filters/distill.cjs.map +1 -1
  188. package/dist/filters/distill.d.ts.map +1 -0
  189. package/dist/filters/distill.js +1 -2
  190. package/dist/filters/distill.js.map +1 -1
  191. package/dist/filters/index.cjs +4 -4
  192. package/dist/filters/index.d.ts +0 -1
  193. package/dist/filters/index.js +3 -3
  194. package/dist/filters/traverse.cjs +1 -2
  195. package/dist/filters/traverse.cjs.map +1 -1
  196. package/dist/filters/traverse.js +1 -1
  197. package/dist/filters/traverse.js.map +1 -1
  198. package/dist/filters/types.d.ts.map +1 -0
  199. package/dist/index.cjs +78 -76
  200. package/dist/index.d.ts +0 -9
  201. package/dist/index.js +3 -6
  202. package/dist/internal.cjs +1 -2
  203. package/dist/internal.cjs.map +1 -1
  204. package/dist/internal.js +1 -1
  205. package/dist/internal.js.map +1 -1
  206. package/dist/labels/derive_distinct_labels.cjs +2 -3
  207. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  208. package/dist/labels/derive_distinct_labels.d.ts.map +1 -0
  209. package/dist/labels/derive_distinct_labels.js +1 -2
  210. package/dist/labels/derive_distinct_labels.js.map +1 -1
  211. package/dist/labels/index.cjs +2 -2
  212. package/dist/labels/index.js +2 -2
  213. package/dist/labels/write_labels_to_specs.cjs +2 -3
  214. package/dist/labels/write_labels_to_specs.cjs.map +1 -1
  215. package/dist/labels/write_labels_to_specs.d.ts +0 -2
  216. package/dist/labels/write_labels_to_specs.d.ts.map +1 -0
  217. package/dist/labels/write_labels_to_specs.js +1 -2
  218. package/dist/labels/write_labels_to_specs.js.map +1 -1
  219. package/dist/package.cjs +7 -8
  220. package/dist/package.js +2 -2
  221. package/dist/pframe.cjs +2 -3
  222. package/dist/pframe.cjs.map +1 -1
  223. package/dist/pframe.d.ts.map +1 -0
  224. package/dist/pframe.js +1 -2
  225. package/dist/pframe.js.map +1 -1
  226. package/dist/pframe_utils/axes.cjs +2 -3
  227. package/dist/pframe_utils/axes.cjs.map +1 -1
  228. package/dist/pframe_utils/axes.d.ts +0 -1
  229. package/dist/pframe_utils/axes.d.ts.map +1 -0
  230. package/dist/pframe_utils/axes.js +1 -2
  231. package/dist/pframe_utils/axes.js.map +1 -1
  232. package/dist/pframe_utils/columns.cjs +5 -6
  233. package/dist/pframe_utils/columns.cjs.map +1 -1
  234. package/dist/pframe_utils/columns.d.ts +0 -1
  235. package/dist/pframe_utils/columns.d.ts.map +1 -0
  236. package/dist/pframe_utils/columns.js +1 -2
  237. package/dist/pframe_utils/columns.js.map +1 -1
  238. package/dist/pframe_utils/index.cjs +3 -4
  239. package/dist/pframe_utils/index.cjs.map +1 -1
  240. package/dist/pframe_utils/index.d.ts.map +1 -0
  241. package/dist/pframe_utils/index.js +2 -3
  242. package/dist/pframe_utils/index.js.map +1 -1
  243. package/dist/platforma.d.ts.map +1 -0
  244. package/dist/plugin_handle.cjs +1 -2
  245. package/dist/plugin_handle.cjs.map +1 -1
  246. package/dist/plugin_handle.d.ts.map +1 -0
  247. package/dist/plugin_handle.js +1 -1
  248. package/dist/plugin_model.cjs +3 -4
  249. package/dist/plugin_model.cjs.map +1 -1
  250. package/dist/plugin_model.d.ts +0 -1
  251. package/dist/plugin_model.d.ts.map +1 -0
  252. package/dist/plugin_model.js +1 -2
  253. package/dist/plugin_model.js.map +1 -1
  254. package/dist/raw_globals.cjs +3 -4
  255. package/dist/raw_globals.cjs.map +1 -1
  256. package/dist/raw_globals.d.ts.map +1 -0
  257. package/dist/raw_globals.js +1 -2
  258. package/dist/raw_globals.js.map +1 -1
  259. package/dist/ref_util.cjs +3 -4
  260. package/dist/ref_util.cjs.map +1 -1
  261. package/dist/ref_util.d.ts +0 -2
  262. package/dist/ref_util.d.ts.map +1 -0
  263. package/dist/ref_util.js +1 -2
  264. package/dist/ref_util.js.map +1 -1
  265. package/dist/render/accessor.cjs +4 -5
  266. package/dist/render/accessor.cjs.map +1 -1
  267. package/dist/render/accessor.d.ts.map +1 -0
  268. package/dist/render/accessor.js +1 -2
  269. package/dist/render/accessor.js.map +1 -1
  270. package/dist/render/api.cjs +10 -11
  271. package/dist/render/api.cjs.map +1 -1
  272. package/dist/render/api.d.ts +0 -1
  273. package/dist/render/api.d.ts.map +1 -0
  274. package/dist/render/api.js +1 -2
  275. package/dist/render/api.js.map +1 -1
  276. package/dist/render/future.cjs +2 -3
  277. package/dist/render/future.cjs.map +1 -1
  278. package/dist/render/future.d.ts.map +1 -0
  279. package/dist/render/future.js +1 -2
  280. package/dist/render/future.js.map +1 -1
  281. package/dist/render/index.cjs +8 -8
  282. package/dist/render/index.d.ts +1 -2
  283. package/dist/render/index.js +7 -7
  284. package/dist/render/internal.cjs +7 -9
  285. package/dist/render/internal.cjs.map +1 -1
  286. package/dist/render/internal.d.ts.map +1 -0
  287. package/dist/render/internal.js +1 -2
  288. package/dist/render/internal.js.map +1 -1
  289. package/dist/render/traversal_ops.d.ts.map +1 -0
  290. package/dist/render/util/axis_filtering.cjs +1 -2
  291. package/dist/render/util/axis_filtering.cjs.map +1 -1
  292. package/dist/render/util/axis_filtering.d.ts.map +1 -0
  293. package/dist/render/util/axis_filtering.js +1 -1
  294. package/dist/render/util/column_collection.cjs +5 -6
  295. package/dist/render/util/column_collection.cjs.map +1 -1
  296. package/dist/render/util/column_collection.d.ts +0 -1
  297. package/dist/render/util/column_collection.d.ts.map +1 -0
  298. package/dist/render/util/column_collection.js +1 -2
  299. package/dist/render/util/column_collection.js.map +1 -1
  300. package/dist/render/util/index.cjs +4 -4
  301. package/dist/render/util/index.js +4 -4
  302. package/dist/render/util/label.cjs +2 -3
  303. package/dist/render/util/label.cjs.map +1 -1
  304. package/dist/render/util/label.d.ts.map +1 -0
  305. package/dist/render/util/label.js +1 -2
  306. package/dist/render/util/label.js.map +1 -1
  307. package/dist/render/util/pcolumn_data.cjs +9 -10
  308. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  309. package/dist/render/util/pcolumn_data.d.ts.map +1 -0
  310. package/dist/render/util/pcolumn_data.js +7 -8
  311. package/dist/render/util/pcolumn_data.js.map +1 -1
  312. package/dist/render/util/pframe_upgraders.cjs +1 -2
  313. package/dist/render/util/pframe_upgraders.cjs.map +1 -1
  314. package/dist/render/util/pframe_upgraders.js +1 -1
  315. package/dist/render/util/split_selectors.d.ts.map +1 -0
  316. package/dist/services/block_services.cjs +2 -3
  317. package/dist/services/block_services.cjs.map +1 -1
  318. package/dist/services/block_services.d.ts +2 -2
  319. package/dist/services/block_services.d.ts.map +1 -0
  320. package/dist/services/block_services.js +1 -2
  321. package/dist/services/block_services.js.map +1 -1
  322. package/dist/services/index.cjs +2 -2
  323. package/dist/services/index.js +2 -2
  324. package/dist/services/service_bridge.cjs +1 -2
  325. package/dist/services/service_bridge.cjs.map +1 -1
  326. package/dist/services/service_bridge.d.ts.map +1 -0
  327. package/dist/services/service_bridge.js +1 -1
  328. package/dist/services/service_resolve.d.ts.map +1 -0
  329. package/dist/version.cjs +2 -4
  330. package/dist/version.cjs.map +1 -1
  331. package/dist/version.d.ts.map +1 -0
  332. package/dist/version.js +1 -2
  333. package/dist/version.js.map +1 -1
  334. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"column_collection_builder.js","names":[],"sources":["../../src/columns/column_collection_builder.ts"],"sourcesContent":["import type {\n AxisQualification,\n ColumnAxesWithQualifications,\n DiscoverColumnsConstraints,\n DiscoverColumnsStepInfo,\n MultiColumnSelector,\n NativePObjectId,\n PColumnSpec,\n PlRef,\n PObjectId,\n SUniversalPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { AnchoredIdDeriver, deriveNativeId, isPlRef } from \"@milaboratories/pl-model-common\";\nimport type { ColumnSelectorInput } from \"./column_selector\";\nimport { normalizeSelectors } from \"./column_selector\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport { createColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider, ColumnSource } from \"./column_snapshot_provider\";\nimport { ArrayColumnProvider, toColumnSnapshotProvider } from \"./column_snapshot_provider\";\n\nimport type { PFrameSpecDriver, PoolEntry, SpecFrameHandle } from \"@milaboratories/pl-model-common\";\n\n// --- FindColumnsOptions ---\n\n/** Options for plain collection findColumns. */\nexport interface FindColumnsOptions {\n /** Include columns matching these selectors. If omitted, includes all columns. */\n include?: ColumnSelectorInput;\n /** Exclude columns matching these selectors. */\n exclude?: ColumnSelectorInput;\n}\n\n// --- ColumnCollection ---\n\n/** Plain collection — no axis context, selector-based filtering only. */\nexport interface ColumnCollection extends Disposable {\n /** Release the underlying spec frame WASM resource. */\n dispose(): void;\n /** Point lookup by provider-native ID. */\n getColumn(id: PObjectId): undefined | ColumnSnapshot<PObjectId>;\n\n /** Find columns matching selectors. Returns flat list of snapshots.\n * No axis compatibility matching, no linker traversal.\n * Never returns undefined — the \"not ready\" state was absorbed by the builder. */\n findColumns(options?: FindColumnsOptions): ColumnSnapshot<PObjectId>[];\n}\n\n// --- AnchoredColumnCollection ---\n\n/** Axis-aware column collection with anchored identity derivation. */\nexport interface AnchoredColumnCollection extends Disposable {\n /** Release the underlying spec frame WASM resource. */\n dispose(): void;\n /** Point lookup by anchored ID. */\n getColumn(id: SUniversalPColumnId): undefined | ColumnSnapshot<SUniversalPColumnId>;\n\n /** Axis-aware column discovery. */\n findColumns(options?: AnchoredFindColumnsOptions): ColumnMatch[];\n}\n\n/** Controls axis matching behavior for anchored discovery. */\nexport type MatchingMode = \"enrichment\" | \"related\" | \"exact\";\n\n/** Options for anchored collection findColumns. */\nexport interface AnchoredFindColumnsOptions extends FindColumnsOptions {\n /** Controls axis matching behavior. Default: 'enrichment'. */\n mode?: MatchingMode;\n /** Maximum linker hops for cross-domain discovery (0 = direct only, default: 4). */\n maxHops?: number;\n}\n\n/** Result of anchored discovery — column snapshot + routing info. */\nexport interface ColumnMatch {\n /** Column snapshot with anchored SUniversalPColumnId. */\n readonly column: ColumnSnapshot<SUniversalPColumnId>;\n /** Provider-native ID — for lookups back to the source provider. */\n readonly originalId: PObjectId;\n /** Match variants — different paths/qualifications that reach this column. */\n readonly variants: MatchVariant[];\n /** Linker steps traversed to reach this hit; empty for direct matches. */\n readonly path: DiscoverColumnsStepInfo[];\n}\n\n/** Qualifications needed for both query (already-integrated) columns and the hit column. */\nexport interface MatchQualifications {\n /** Qualifications for each query (already-integrated) column set. */\n readonly forQueries: AxisQualification[][];\n /** Qualifications for the hit column. */\n readonly forHit: AxisQualification[];\n}\n\n/** A single mapping variant describing how a hit column can be integrated. */\nexport interface MatchVariant {\n /** Full qualifications needed for integration. */\n readonly qualifications: MatchQualifications;\n /** Distinctive (minimal) qualifications needed for integration. */\n readonly distinctiveQualifications: MatchQualifications;\n}\n\n// --- Build options ---\n\nexport interface BuildOptions {\n allowPartialColumnList?: true;\n}\n\nexport interface AnchoredBuildOptions extends BuildOptions {\n anchors: Record<string, PlRef | PObjectId | PColumnSpec>;\n}\n\n// --- ColumnCollectionBuilder ---\n\n/**\n * Mutable builder that accumulates column sources, then produces\n * a ColumnCollection (plain) or AnchoredColumnCollection (with anchors).\n *\n * Each output lambda creates its own builder — a constraint of the\n * computable framework where each output tracks its own dependencies.\n */\nexport class ColumnCollectionBuilder {\n private readonly providers: ColumnSnapshotProvider[] = [];\n\n constructor(private readonly specDriver: PFrameSpecDriver) {}\n\n /**\n * Register a column source. Sources added first take precedence for dedup.\n * Does NOT accept undefined — if a source isn't available yet,\n * the caller should return undefined from the output lambda.\n */\n addSource(source: ColumnSource | TreeNodeAccessor): this {\n if (source instanceof TreeNodeAccessor) {\n const columns = source.getPColumns();\n if (columns) this.providers.push(new ArrayColumnProvider(columns));\n } else {\n this.providers.push(toColumnSnapshotProvider(source));\n }\n return this;\n }\n\n addSources(sources: (ColumnSource | TreeNodeAccessor)[]): this {\n for (const source of sources) {\n this.addSource(source);\n }\n return this;\n }\n\n /** Plain collection — selector-based filtering, PObjectId namespace. */\n build(): undefined | ColumnCollection;\n build(options: {\n allowPartialColumnList: true;\n }): ColumnCollection & { readonly columnListComplete: boolean };\n /** Anchored collection — axis-aware discovery, SUniversalPColumnId namespace. */\n build(\n options: AnchoredBuildOptions & { allowPartialColumnList: true },\n ): AnchoredColumnCollection & { readonly columnListComplete: boolean };\n build(options: AnchoredBuildOptions): undefined | AnchoredColumnCollection;\n build(\n options?: BuildOptions | AnchoredBuildOptions,\n ):\n | undefined\n | ColumnCollection\n | AnchoredColumnCollection\n | (ColumnCollection & { readonly columnListComplete: boolean })\n | (AnchoredColumnCollection & { readonly columnListComplete: boolean }) {\n const allowPartial = options?.allowPartialColumnList === true;\n const hasAnchors = options !== undefined && \"anchors\" in options;\n\n // Check column list completeness\n const allComplete = this.providers.every((p) => p.isColumnListComplete());\n if (!allComplete && !allowPartial) return undefined;\n\n // Collect all columns, dedup by native ID (first source wins)\n const columnMap = this.collectColumns();\n\n if (hasAnchors) {\n const anchorSpecs = resolveAnchorSpecs(options.anchors, columnMap);\n const idDeriver = new AnchoredIdDeriver(anchorSpecs);\n\n return new AnchoredColumnCollectionImpl(this.specDriver, {\n columns: columnMap,\n idDeriver,\n anchorSpecs,\n columnListComplete: allowPartial ? allComplete : false,\n });\n } else {\n return new ColumnCollectionImpl(this.specDriver, {\n columns: columnMap,\n columnListComplete: allowPartial ? allComplete : false,\n });\n }\n }\n\n /**\n * Collect all columns from all providers, dedup by NativePObjectId.\n * First source wins.\n */\n private collectColumns(): Map<PObjectId, ColumnSnapshot<PObjectId>> {\n const seen = new Set<NativePObjectId>();\n const result = new Map<PObjectId, ColumnSnapshot<PObjectId>>();\n\n for (const provider of this.providers) {\n const columns = provider.getAllColumns();\n for (const col of columns) {\n const nativeId = deriveNativeId(col.spec);\n if (seen.has(nativeId)) continue;\n seen.add(nativeId);\n result.set(col.id, col);\n }\n }\n\n return result;\n }\n}\n\n// --- Permissive constraints for plain (non-anchored) filtering ---\n\nconst PLAIN_CONSTRAINTS: DiscoverColumnsConstraints = {\n allowFloatingSourceAxes: true,\n allowFloatingHitAxes: true,\n allowSourceQualifications: false,\n allowHitQualifications: false,\n};\n\n// --- ColumnCollectionImpl ---\n\ninterface ColumnCollectionImplOptions {\n readonly columns: Map<PObjectId, ColumnSnapshot<PObjectId>>;\n readonly columnListComplete?: boolean;\n}\n\nclass ColumnCollectionImpl implements ColumnCollection, Disposable {\n private readonly columns: Map<PObjectId, ColumnSnapshot<PObjectId>>;\n private readonly specFrameEntry: PoolEntry<SpecFrameHandle>;\n public readonly columnListComplete: boolean;\n\n constructor(\n private readonly specDriver: PFrameSpecDriver,\n options: ColumnCollectionImplOptions,\n ) {\n this.columns = options.columns;\n this.columnListComplete = options.columnListComplete ?? false;\n this.specFrameEntry = this.specDriver.createSpecFrame(\n Object.fromEntries(Array.from(this.columns.entries(), ([id, col]) => [id, col.spec])),\n );\n }\n\n dispose(): void {\n this.specFrameEntry.unref();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n getColumn(id: PObjectId): undefined | ColumnSnapshot<PObjectId> {\n const col = this.columns.get(id);\n if (col === undefined) return undefined;\n return this.toSnapshot(col);\n }\n\n findColumns(options?: FindColumnsOptions): ColumnSnapshot<PObjectId>[] {\n const includeColumns = options?.include ? toMultiColumnSelectors(options.include) : undefined;\n const excludeColumns = options?.exclude ? toMultiColumnSelectors(options.exclude) : undefined;\n\n const response = this.specDriver.discoverColumns(this.specFrameEntry.key, {\n includeColumns,\n excludeColumns,\n axes: [],\n maxHops: 0,\n constraints: PLAIN_CONSTRAINTS,\n });\n\n // Map hits back to snapshots\n const results = response.hits\n .map((hit) => this.columns.get(hit.hit.columnId as PObjectId))\n .filter((col): col is ColumnSnapshot<PObjectId> => col !== undefined)\n .map((col) => this.toSnapshot(col));\n\n return results;\n }\n\n private toSnapshot(col: ColumnSnapshot<PObjectId>): ColumnSnapshot<PObjectId> {\n return remapSnapshot(col.id, col);\n }\n}\n\n// --- AnchoredColumnCollectionImpl ---\n\ninterface AnchoredColumnCollectionImplOptions extends ColumnCollectionImplOptions {\n readonly idDeriver: AnchoredIdDeriver;\n readonly anchorSpecs: Record<string, PColumnSpec>;\n}\n\nclass AnchoredColumnCollectionImpl implements AnchoredColumnCollection, Disposable {\n private readonly columns: Map<PObjectId, ColumnSnapshot<PObjectId>>;\n private readonly idDeriver: AnchoredIdDeriver;\n private readonly specFrameEntry: PoolEntry<SpecFrameHandle>;\n private readonly anchorAxes: ColumnAxesWithQualifications[];\n /** Reverse lookup: SUniversalPColumnId → PObjectId */\n private readonly idToOriginal: Map<SUniversalPColumnId, PObjectId>;\n public readonly columnListComplete: boolean;\n\n constructor(\n private readonly specDriver: PFrameSpecDriver,\n options: AnchoredColumnCollectionImplOptions,\n ) {\n this.columns = options.columns;\n this.idDeriver = options.idDeriver;\n this.columnListComplete = options.columnListComplete ?? false;\n\n // Create spec frame from all collected columns\n this.specFrameEntry = this.specDriver.createSpecFrame(\n Object.fromEntries(Array.from(this.columns.entries(), ([id, col]) => [id, col.spec])),\n );\n\n // Build anchor axes for discovery requests\n this.anchorAxes = Object.values(options.anchorSpecs).map((spec) => ({\n axesSpec: spec.axesSpec,\n qualifications: [],\n }));\n\n // Build reverse lookup map\n this.idToOriginal = new Map(\n Array.from(this.columns.entries()).map(\n ([id, col]) => [this.idDeriver.deriveS(col.spec), id] as const,\n ),\n );\n }\n\n dispose(): void {\n this.specFrameEntry.unref();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n getColumn(id: SUniversalPColumnId): undefined | ColumnSnapshot<SUniversalPColumnId> {\n const origId = this.idToOriginal.get(id);\n if (origId === undefined) return undefined;\n const col = this.columns.get(origId);\n if (col === undefined) return undefined;\n return this.toSnapshot(id, col);\n }\n\n findColumns(options?: AnchoredFindColumnsOptions): ColumnMatch[] {\n const mode = options?.mode ?? \"enrichment\";\n const constraints = matchingModeToConstraints(mode);\n const includeColumns = options?.include ? toMultiColumnSelectors(options.include) : undefined;\n const excludeColumns = options?.exclude ? toMultiColumnSelectors(options.exclude) : undefined;\n\n const response = this.specDriver.discoverColumns(this.specFrameEntry.key, {\n includeColumns,\n excludeColumns,\n constraints,\n axes: this.anchorAxes,\n maxHops: options?.maxHops ?? 4,\n });\n\n // Map hits back to ColumnMatch entries\n const results = response.hits\n .map((hit) => {\n const origId = hit.hit.columnId as PObjectId;\n const col = this.columns.get(origId);\n if (!col) return undefined;\n const universalId = this.idDeriver.deriveS(col.spec);\n return {\n column: this.toSnapshot(universalId, col),\n originalId: origId,\n variants: hit.mappingVariants.map(\n (v): MatchVariant => ({\n qualifications: v.qualifications,\n distinctiveQualifications: v.distinctiveQualifications,\n }),\n ),\n path: hit.path,\n } satisfies ColumnMatch;\n })\n .filter((m): m is ColumnMatch => m !== undefined);\n\n return results;\n }\n\n private toSnapshot(\n universalId: SUniversalPColumnId,\n col: ColumnSnapshot<PObjectId>,\n ): ColumnSnapshot<SUniversalPColumnId> {\n return remapSnapshot(universalId, col);\n }\n}\n\n// --- Shared snapshot helpers ---\n\n/** Create a new snapshot with a different ID, preserving data accessors. */\nfunction remapSnapshot<Id extends PObjectId>(\n id: Id,\n col: ColumnSnapshot<PObjectId>,\n): ColumnSnapshot<Id> {\n return createColumnSnapshot(id, col.spec, col.dataStatus, col.data);\n}\n\n/** Normalize SDK ColumnSelectorInput to MultiColumnSelector[]. */\nfunction toMultiColumnSelectors(input: ColumnSelectorInput): MultiColumnSelector[] {\n return normalizeSelectors(input);\n}\n\n// --- Anchor resolution ---\n\n/**\n * Resolve each anchor value to a PColumnSpec.\n * - PColumnSpec: used directly\n * - PObjectId (string): looked up in the collected column map\n * - PlRef: not supported at this level — caller must resolve before building\n */\nfunction resolveAnchorSpecs(\n anchors: Record<string, PlRef | PObjectId | PColumnSpec>,\n columnMap: Map<PObjectId, ColumnSnapshot<PObjectId>>,\n): Record<string, PColumnSpec> {\n const result: Record<string, PColumnSpec> = {};\n for (const [key, anchor] of Object.entries(anchors)) {\n if (typeof anchor === \"string\") {\n // PObjectId — look up in collected columns\n const col = columnMap.get(anchor as PObjectId);\n if (!col) throw new Error(`Anchor \"${key}\": column with id \"${anchor}\" not found in sources`);\n result[key] = col.spec;\n } else if (isPlRef(anchor)) {\n throw new Error(\n `Anchor \"${key}\": PlRef anchors must be resolved to PColumnSpec before building. ` +\n `Use the column's spec directly or pass its PObjectId.`,\n );\n } else {\n // PColumnSpec\n result[key] = anchor;\n }\n }\n return result;\n}\n\n// --- MatchingMode → DiscoverColumnsConstraints ---\n\nfunction matchingModeToConstraints(mode: MatchingMode): DiscoverColumnsConstraints {\n switch (mode) {\n case \"enrichment\":\n return {\n allowFloatingSourceAxes: true,\n allowFloatingHitAxes: true,\n allowSourceQualifications: false,\n allowHitQualifications: false,\n };\n case \"related\":\n return {\n allowFloatingSourceAxes: true,\n allowFloatingHitAxes: true,\n allowSourceQualifications: true,\n allowHitQualifications: true,\n };\n case \"exact\":\n return {\n allowFloatingSourceAxes: false,\n allowFloatingHitAxes: false,\n allowSourceQualifications: false,\n allowHitQualifications: false,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"column_collection_builder.js","names":[],"sources":["../../src/columns/column_collection_builder.ts"],"sourcesContent":["import type {\n AxisQualification,\n ColumnAxesWithQualifications,\n DiscoverColumnsConstraints,\n DiscoverColumnsStepInfo,\n MultiColumnSelector,\n NativePObjectId,\n PColumnSpec,\n PlRef,\n PObjectId,\n SUniversalPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { AnchoredIdDeriver, deriveNativeId, isPlRef } from \"@milaboratories/pl-model-common\";\nimport type { ColumnSelectorInput } from \"./column_selector\";\nimport { normalizeSelectors } from \"./column_selector\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport { createColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider, ColumnSource } from \"./column_snapshot_provider\";\nimport { ArrayColumnProvider, toColumnSnapshotProvider } from \"./column_snapshot_provider\";\n\nimport type { PFrameSpecDriver, PoolEntry, SpecFrameHandle } from \"@milaboratories/pl-model-common\";\n\n// --- FindColumnsOptions ---\n\n/** Options for plain collection findColumns. */\nexport interface FindColumnsOptions {\n /** Include columns matching these selectors. If omitted, includes all columns. */\n include?: ColumnSelectorInput;\n /** Exclude columns matching these selectors. */\n exclude?: ColumnSelectorInput;\n}\n\n// --- ColumnCollection ---\n\n/** Plain collection — no axis context, selector-based filtering only. */\nexport interface ColumnCollection extends Disposable {\n /** Release the underlying spec frame WASM resource. */\n dispose(): void;\n /** Point lookup by provider-native ID. */\n getColumn(id: PObjectId): undefined | ColumnSnapshot<PObjectId>;\n\n /** Find columns matching selectors. Returns flat list of snapshots.\n * No axis compatibility matching, no linker traversal.\n * Never returns undefined — the \"not ready\" state was absorbed by the builder. */\n findColumns(options?: FindColumnsOptions): ColumnSnapshot<PObjectId>[];\n}\n\n// --- AnchoredColumnCollection ---\n\n/** Axis-aware column collection with anchored identity derivation. */\nexport interface AnchoredColumnCollection extends Disposable {\n /** Release the underlying spec frame WASM resource. */\n dispose(): void;\n /** Point lookup by anchored ID. */\n getColumn(id: SUniversalPColumnId): undefined | ColumnSnapshot<SUniversalPColumnId>;\n\n /** Axis-aware column discovery. */\n findColumns(options?: AnchoredFindColumnsOptions): ColumnMatch[];\n}\n\n/** Controls axis matching behavior for anchored discovery. */\nexport type MatchingMode = \"enrichment\" | \"related\" | \"exact\";\n\n/** Options for anchored collection findColumns. */\nexport interface AnchoredFindColumnsOptions extends FindColumnsOptions {\n /** Controls axis matching behavior. Default: 'enrichment'. */\n mode?: MatchingMode;\n /** Maximum linker hops for cross-domain discovery (0 = direct only, default: 4). */\n maxHops?: number;\n}\n\n/** Result of anchored discovery — column snapshot + routing info. */\nexport interface ColumnMatch {\n /** Column snapshot with anchored SUniversalPColumnId. */\n readonly column: ColumnSnapshot<SUniversalPColumnId>;\n /** Provider-native ID — for lookups back to the source provider. */\n readonly originalId: PObjectId;\n /** Match variants — different paths/qualifications that reach this column. */\n readonly variants: MatchVariant[];\n /** Linker steps traversed to reach this hit; empty for direct matches. */\n readonly path: DiscoverColumnsStepInfo[];\n}\n\n/** Qualifications needed for both query (already-integrated) columns and the hit column. */\nexport interface MatchQualifications {\n /** Qualifications for each query (already-integrated) column set. */\n readonly forQueries: AxisQualification[][];\n /** Qualifications for the hit column. */\n readonly forHit: AxisQualification[];\n}\n\n/** A single mapping variant describing how a hit column can be integrated. */\nexport interface MatchVariant {\n /** Full qualifications needed for integration. */\n readonly qualifications: MatchQualifications;\n /** Distinctive (minimal) qualifications needed for integration. */\n readonly distinctiveQualifications: MatchQualifications;\n}\n\n// --- Build options ---\n\nexport interface BuildOptions {\n allowPartialColumnList?: true;\n}\n\nexport interface AnchoredBuildOptions extends BuildOptions {\n anchors: Record<string, PlRef | PObjectId | PColumnSpec>;\n}\n\n// --- ColumnCollectionBuilder ---\n\n/**\n * Mutable builder that accumulates column sources, then produces\n * a ColumnCollection (plain) or AnchoredColumnCollection (with anchors).\n *\n * Each output lambda creates its own builder — a constraint of the\n * computable framework where each output tracks its own dependencies.\n */\nexport class ColumnCollectionBuilder {\n private readonly providers: ColumnSnapshotProvider[] = [];\n\n constructor(private readonly specDriver: PFrameSpecDriver) {}\n\n /**\n * Register a column source. Sources added first take precedence for dedup.\n * Does NOT accept undefined — if a source isn't available yet,\n * the caller should return undefined from the output lambda.\n */\n addSource(source: ColumnSource | TreeNodeAccessor): this {\n if (source instanceof TreeNodeAccessor) {\n const columns = source.getPColumns();\n if (columns) this.providers.push(new ArrayColumnProvider(columns));\n } else {\n this.providers.push(toColumnSnapshotProvider(source));\n }\n return this;\n }\n\n addSources(sources: (ColumnSource | TreeNodeAccessor)[]): this {\n for (const source of sources) {\n this.addSource(source);\n }\n return this;\n }\n\n /** Plain collection — selector-based filtering, PObjectId namespace. */\n build(): undefined | ColumnCollection;\n build(options: {\n allowPartialColumnList: true;\n }): ColumnCollection & { readonly columnListComplete: boolean };\n /** Anchored collection — axis-aware discovery, SUniversalPColumnId namespace. */\n build(\n options: AnchoredBuildOptions & { allowPartialColumnList: true },\n ): AnchoredColumnCollection & { readonly columnListComplete: boolean };\n build(options: AnchoredBuildOptions): undefined | AnchoredColumnCollection;\n build(\n options?: BuildOptions | AnchoredBuildOptions,\n ):\n | undefined\n | ColumnCollection\n | AnchoredColumnCollection\n | (ColumnCollection & { readonly columnListComplete: boolean })\n | (AnchoredColumnCollection & { readonly columnListComplete: boolean }) {\n const allowPartial = options?.allowPartialColumnList === true;\n const hasAnchors = options !== undefined && \"anchors\" in options;\n\n // Check column list completeness\n const allComplete = this.providers.every((p) => p.isColumnListComplete());\n if (!allComplete && !allowPartial) return undefined;\n\n // Collect all columns, dedup by native ID (first source wins)\n const columnMap = this.collectColumns();\n\n if (hasAnchors) {\n const anchorSpecs = resolveAnchorSpecs(options.anchors, columnMap);\n const idDeriver = new AnchoredIdDeriver(anchorSpecs);\n\n return new AnchoredColumnCollectionImpl(this.specDriver, {\n columns: columnMap,\n idDeriver,\n anchorSpecs,\n columnListComplete: allowPartial ? allComplete : false,\n });\n } else {\n return new ColumnCollectionImpl(this.specDriver, {\n columns: columnMap,\n columnListComplete: allowPartial ? allComplete : false,\n });\n }\n }\n\n /**\n * Collect all columns from all providers, dedup by NativePObjectId.\n * First source wins.\n */\n private collectColumns(): Map<PObjectId, ColumnSnapshot<PObjectId>> {\n const seen = new Set<NativePObjectId>();\n const result = new Map<PObjectId, ColumnSnapshot<PObjectId>>();\n\n for (const provider of this.providers) {\n const columns = provider.getAllColumns();\n for (const col of columns) {\n const nativeId = deriveNativeId(col.spec);\n if (seen.has(nativeId)) continue;\n seen.add(nativeId);\n result.set(col.id, col);\n }\n }\n\n return result;\n }\n}\n\n// --- Permissive constraints for plain (non-anchored) filtering ---\n\nconst PLAIN_CONSTRAINTS: DiscoverColumnsConstraints = {\n allowFloatingSourceAxes: true,\n allowFloatingHitAxes: true,\n allowSourceQualifications: false,\n allowHitQualifications: false,\n};\n\n// --- ColumnCollectionImpl ---\n\ninterface ColumnCollectionImplOptions {\n readonly columns: Map<PObjectId, ColumnSnapshot<PObjectId>>;\n readonly columnListComplete?: boolean;\n}\n\nclass ColumnCollectionImpl implements ColumnCollection, Disposable {\n private readonly columns: Map<PObjectId, ColumnSnapshot<PObjectId>>;\n private readonly specFrameEntry: PoolEntry<SpecFrameHandle>;\n public readonly columnListComplete: boolean;\n\n constructor(\n private readonly specDriver: PFrameSpecDriver,\n options: ColumnCollectionImplOptions,\n ) {\n this.columns = options.columns;\n this.columnListComplete = options.columnListComplete ?? false;\n this.specFrameEntry = this.specDriver.createSpecFrame(\n Object.fromEntries(Array.from(this.columns.entries(), ([id, col]) => [id, col.spec])),\n );\n }\n\n dispose(): void {\n this.specFrameEntry.unref();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n getColumn(id: PObjectId): undefined | ColumnSnapshot<PObjectId> {\n const col = this.columns.get(id);\n if (col === undefined) return undefined;\n return this.toSnapshot(col);\n }\n\n findColumns(options?: FindColumnsOptions): ColumnSnapshot<PObjectId>[] {\n const includeColumns = options?.include ? toMultiColumnSelectors(options.include) : undefined;\n const excludeColumns = options?.exclude ? toMultiColumnSelectors(options.exclude) : undefined;\n\n const response = this.specDriver.discoverColumns(this.specFrameEntry.key, {\n includeColumns,\n excludeColumns,\n axes: [],\n maxHops: 0,\n constraints: PLAIN_CONSTRAINTS,\n });\n\n // Map hits back to snapshots\n const results = response.hits\n .map((hit) => this.columns.get(hit.hit.columnId as PObjectId))\n .filter((col): col is ColumnSnapshot<PObjectId> => col !== undefined)\n .map((col) => this.toSnapshot(col));\n\n return results;\n }\n\n private toSnapshot(col: ColumnSnapshot<PObjectId>): ColumnSnapshot<PObjectId> {\n return remapSnapshot(col.id, col);\n }\n}\n\n// --- AnchoredColumnCollectionImpl ---\n\ninterface AnchoredColumnCollectionImplOptions extends ColumnCollectionImplOptions {\n readonly idDeriver: AnchoredIdDeriver;\n readonly anchorSpecs: Record<string, PColumnSpec>;\n}\n\nclass AnchoredColumnCollectionImpl implements AnchoredColumnCollection, Disposable {\n private readonly columns: Map<PObjectId, ColumnSnapshot<PObjectId>>;\n private readonly idDeriver: AnchoredIdDeriver;\n private readonly specFrameEntry: PoolEntry<SpecFrameHandle>;\n private readonly anchorAxes: ColumnAxesWithQualifications[];\n /** Reverse lookup: SUniversalPColumnId → PObjectId */\n private readonly idToOriginal: Map<SUniversalPColumnId, PObjectId>;\n public readonly columnListComplete: boolean;\n\n constructor(\n private readonly specDriver: PFrameSpecDriver,\n options: AnchoredColumnCollectionImplOptions,\n ) {\n this.columns = options.columns;\n this.idDeriver = options.idDeriver;\n this.columnListComplete = options.columnListComplete ?? false;\n\n // Create spec frame from all collected columns\n this.specFrameEntry = this.specDriver.createSpecFrame(\n Object.fromEntries(Array.from(this.columns.entries(), ([id, col]) => [id, col.spec])),\n );\n\n // Build anchor axes for discovery requests\n this.anchorAxes = Object.values(options.anchorSpecs).map((spec) => ({\n axesSpec: spec.axesSpec,\n qualifications: [],\n }));\n\n // Build reverse lookup map\n this.idToOriginal = new Map(\n Array.from(this.columns.entries()).map(\n ([id, col]) => [this.idDeriver.deriveS(col.spec), id] as const,\n ),\n );\n }\n\n dispose(): void {\n this.specFrameEntry.unref();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n getColumn(id: SUniversalPColumnId): undefined | ColumnSnapshot<SUniversalPColumnId> {\n const origId = this.idToOriginal.get(id);\n if (origId === undefined) return undefined;\n const col = this.columns.get(origId);\n if (col === undefined) return undefined;\n return this.toSnapshot(id, col);\n }\n\n findColumns(options?: AnchoredFindColumnsOptions): ColumnMatch[] {\n const mode = options?.mode ?? \"enrichment\";\n const constraints = matchingModeToConstraints(mode);\n const includeColumns = options?.include ? toMultiColumnSelectors(options.include) : undefined;\n const excludeColumns = options?.exclude ? toMultiColumnSelectors(options.exclude) : undefined;\n\n const response = this.specDriver.discoverColumns(this.specFrameEntry.key, {\n includeColumns,\n excludeColumns,\n constraints,\n axes: this.anchorAxes,\n maxHops: options?.maxHops ?? 4,\n });\n\n // Map hits back to ColumnMatch entries\n const results = response.hits\n .map((hit) => {\n const origId = hit.hit.columnId as PObjectId;\n const col = this.columns.get(origId);\n if (!col) return undefined;\n const universalId = this.idDeriver.deriveS(col.spec);\n return {\n column: this.toSnapshot(universalId, col),\n originalId: origId,\n variants: hit.mappingVariants.map(\n (v): MatchVariant => ({\n qualifications: v.qualifications,\n distinctiveQualifications: v.distinctiveQualifications,\n }),\n ),\n path: hit.path,\n } satisfies ColumnMatch;\n })\n .filter((m): m is ColumnMatch => m !== undefined);\n\n return results;\n }\n\n private toSnapshot(\n universalId: SUniversalPColumnId,\n col: ColumnSnapshot<PObjectId>,\n ): ColumnSnapshot<SUniversalPColumnId> {\n return remapSnapshot(universalId, col);\n }\n}\n\n// --- Shared snapshot helpers ---\n\n/** Create a new snapshot with a different ID, preserving data accessors. */\nfunction remapSnapshot<Id extends PObjectId>(\n id: Id,\n col: ColumnSnapshot<PObjectId>,\n): ColumnSnapshot<Id> {\n return createColumnSnapshot(id, col.spec, col.dataStatus, col.data);\n}\n\n/** Normalize SDK ColumnSelectorInput to MultiColumnSelector[]. */\nfunction toMultiColumnSelectors(input: ColumnSelectorInput): MultiColumnSelector[] {\n return normalizeSelectors(input);\n}\n\n// --- Anchor resolution ---\n\n/**\n * Resolve each anchor value to a PColumnSpec.\n * - PColumnSpec: used directly\n * - PObjectId (string): looked up in the collected column map\n * - PlRef: not supported at this level — caller must resolve before building\n */\nfunction resolveAnchorSpecs(\n anchors: Record<string, PlRef | PObjectId | PColumnSpec>,\n columnMap: Map<PObjectId, ColumnSnapshot<PObjectId>>,\n): Record<string, PColumnSpec> {\n const result: Record<string, PColumnSpec> = {};\n for (const [key, anchor] of Object.entries(anchors)) {\n if (typeof anchor === \"string\") {\n // PObjectId — look up in collected columns\n const col = columnMap.get(anchor as PObjectId);\n if (!col) throw new Error(`Anchor \"${key}\": column with id \"${anchor}\" not found in sources`);\n result[key] = col.spec;\n } else if (isPlRef(anchor)) {\n throw new Error(\n `Anchor \"${key}\": PlRef anchors must be resolved to PColumnSpec before building. ` +\n `Use the column's spec directly or pass its PObjectId.`,\n );\n } else {\n // PColumnSpec\n result[key] = anchor;\n }\n }\n return result;\n}\n\n// --- MatchingMode → DiscoverColumnsConstraints ---\n\nfunction matchingModeToConstraints(mode: MatchingMode): DiscoverColumnsConstraints {\n switch (mode) {\n case \"enrichment\":\n return {\n allowFloatingSourceAxes: true,\n allowFloatingHitAxes: true,\n allowSourceQualifications: false,\n allowHitQualifications: false,\n };\n case \"related\":\n return {\n allowFloatingSourceAxes: true,\n allowFloatingHitAxes: true,\n allowSourceQualifications: true,\n allowHitQualifications: true,\n };\n case \"exact\":\n return {\n allowFloatingSourceAxes: false,\n allowFloatingHitAxes: false,\n allowSourceQualifications: false,\n allowHitQualifications: false,\n };\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/columns/column_selector.ts
3
2
  function normalizeStringMatchers(input) {
4
3
  if (typeof input === "string") return [{
@@ -113,10 +112,10 @@ function columnSelectorsToPredicate(input) {
113
112
  const selectors = normalizeSelectors(input);
114
113
  return (spec) => matchColumnSelectors(selectors, spec);
115
114
  }
116
-
117
115
  //#endregion
118
116
  exports.columnSelectorsToPredicate = columnSelectorsToPredicate;
119
117
  exports.matchColumn = matchColumn;
120
118
  exports.matchColumnSelectors = matchColumnSelectors;
121
119
  exports.normalizeSelectors = normalizeSelectors;
120
+
122
121
  //# sourceMappingURL=column_selector.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"column_selector.cjs","names":[],"sources":["../../src/columns/column_selector.ts"],"sourcesContent":["import type {\n AxisValueType,\n ColumnValueType,\n MultiAxisSelector,\n MultiColumnSelector,\n PColumnSpec,\n StringMatcher,\n} from \"@milaboratories/pl-model-common\";\n\nexport type { StringMatcher } from \"@milaboratories/pl-model-common\";\n\n// --- Relaxed types ---\n\n/** Relaxed string matcher input: plain string, single matcher, or array of mixed. */\nexport type RelaxedStringMatchers = string | StringMatcher | (string | StringMatcher)[];\n\n/** Relaxed record matcher: values can be plain strings or relaxed matchers. */\nexport type RelaxedRecord = Record<string, RelaxedStringMatchers>;\n\n/** Relaxed axis selector — accepts plain strings where strict requires StringMatcher[]. */\nexport interface RelaxedAxisSelector {\n name?: RelaxedStringMatchers;\n type?: AxisValueType | AxisValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n}\n\n/** Relaxed column selector — convenient hand-written form. */\nexport interface RelaxedColumnSelector {\n name?: RelaxedStringMatchers;\n type?: ColumnValueType | ColumnValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n axes?: RelaxedAxisSelector[];\n partialAxesMatch?: boolean;\n}\n\n/** Input that normalizes to ColumnSelector[]. */\nexport type ColumnSelectorInput = RelaxedColumnSelector | RelaxedColumnSelector[];\n\n// --- Normalization ---\n\nfunction normalizeStringMatchers(input: RelaxedStringMatchers): StringMatcher[] {\n if (typeof input === \"string\") return [{ type: \"regex\", value: input }];\n if (!Array.isArray(input)) return [input];\n return input.map((v) =>\n typeof v === \"string\" ? ({ type: \"regex\", value: v } satisfies StringMatcher) : v,\n );\n}\n\nfunction normalizeRecord(input: RelaxedRecord): Record<string, StringMatcher[]> {\n const result: Record<string, StringMatcher[]> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = normalizeStringMatchers(value);\n }\n return result;\n}\n\nfunction normalizeTypes<T>(input: T | T[]): T[] {\n return Array.isArray(input) ? input : [input];\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nfunction normalizeAxisSelector(input: RelaxedAxisSelector): MultiAxisSelector {\n const result: Mutable<MultiAxisSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n return result;\n}\n\n/** Normalize relaxed input to strict ColumnSelector[]. */\nexport function normalizeSelectors(input: ColumnSelectorInput): MultiColumnSelector[] {\n const arr = Array.isArray(input) ? input : [input];\n return arr.map(normalizeSingleSelector);\n}\n\nfunction normalizeSingleSelector(input: RelaxedColumnSelector): MultiColumnSelector {\n const result: Mutable<MultiColumnSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n if (input.axes !== undefined) result.axes = input.axes.map(normalizeAxisSelector);\n if (input.partialAxesMatch !== undefined) result.partialAxesMatch = input.partialAxesMatch;\n return result;\n}\n\n// --- Matching ---\n\nfunction matchStringValue(value: string, matchers: StringMatcher[]): boolean {\n return matchers.some((m) => {\n if (m.type === \"exact\") return value === m.value;\n return new RegExp(`^(?:${m.value})$`).test(value);\n });\n}\n\nfunction matchRecordField(\n actual: Record<string, string> | undefined,\n required: Record<string, StringMatcher[]>,\n): boolean {\n const record = actual ?? {};\n for (const [key, matchers] of Object.entries(required)) {\n const value = record[key];\n if (value === undefined) return false;\n if (!matchStringValue(value, matchers)) return false;\n }\n return true;\n}\n\n/** Get combined domain: column's own domain merged with all axis domains. */\nfunction getCombinedDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.domain) Object.assign(result, spec.domain);\n for (const axis of spec.axesSpec) {\n if (axis.domain) Object.assign(result, axis.domain);\n }\n return result;\n}\n\n/** Get combined context domain: column's own contextDomain merged with all axis contextDomains. */\nfunction getCombinedContextDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.contextDomain) Object.assign(result, spec.contextDomain);\n for (const axis of spec.axesSpec) {\n if (\"contextDomain\" in axis && axis.contextDomain) Object.assign(result, axis.contextDomain);\n }\n return result;\n}\n\nfunction matchAxisSelector(\n axis: PColumnSpec[\"axesSpec\"][number],\n selector: MultiAxisSelector,\n): boolean {\n if (selector.name !== undefined && !matchStringValue(axis.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(axis.type)) return false;\n if (selector.domain !== undefined && !matchRecordField(axis.domain, selector.domain))\n return false;\n if (\n selector.contextDomain !== undefined &&\n !matchRecordField(\n \"contextDomain\" in axis ? (axis.contextDomain as Record<string, string>) : undefined,\n selector.contextDomain,\n )\n )\n return false;\n if (\n selector.annotations !== undefined &&\n !matchRecordField(axis.annotations, selector.annotations)\n )\n return false;\n return true;\n}\n\n/** Check if a PColumnSpec matches a single strict ColumnSelector. */\nexport function matchColumn(spec: PColumnSpec, selector: MultiColumnSelector): boolean {\n if (selector.name !== undefined && !matchStringValue(spec.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(spec.valueType)) return false;\n\n if (selector.domain !== undefined) {\n const combined = getCombinedDomain(spec);\n if (!matchRecordField(combined, selector.domain)) return false;\n }\n\n if (selector.contextDomain !== undefined) {\n const combined = getCombinedContextDomain(spec);\n if (!matchRecordField(combined, selector.contextDomain)) return false;\n }\n\n if (selector.annotations !== undefined) {\n if (!matchRecordField(spec.annotations, selector.annotations)) return false;\n }\n\n if (selector.axes !== undefined) {\n const partialMatch = selector.partialAxesMatch ?? true;\n if (partialMatch) {\n for (const axisSel of selector.axes) {\n if (!spec.axesSpec.some((axis) => matchAxisSelector(axis, axisSel))) return false;\n }\n } else {\n if (spec.axesSpec.length !== selector.axes.length) return false;\n for (let i = 0; i < selector.axes.length; i++) {\n if (!matchAxisSelector(spec.axesSpec[i], selector.axes[i])) return false;\n }\n }\n }\n\n return true;\n}\n\n/** Check if a PColumnSpec matches any of the selectors (OR across array). */\nexport function matchColumnSelectors(selectors: MultiColumnSelector[], spec: PColumnSpec): boolean {\n return selectors.some((sel) => matchColumn(spec, sel));\n}\n\n/**\n * Convert selector input to a predicate function.\n * Normalizes relaxed form, then returns a function that OR-matches.\n */\nexport function columnSelectorsToPredicate(\n input: ColumnSelectorInput,\n): (spec: PColumnSpec) => boolean {\n const selectors = normalizeSelectors(input);\n return (spec) => matchColumnSelectors(selectors, spec);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"column_selector.cjs","names":[],"sources":["../../src/columns/column_selector.ts"],"sourcesContent":["import type {\n AxisValueType,\n ColumnValueType,\n MultiAxisSelector,\n MultiColumnSelector,\n PColumnSpec,\n StringMatcher,\n} from \"@milaboratories/pl-model-common\";\n\nexport type { StringMatcher } from \"@milaboratories/pl-model-common\";\n\n// --- Relaxed types ---\n\n/** Relaxed string matcher input: plain string, single matcher, or array of mixed. */\nexport type RelaxedStringMatchers = string | StringMatcher | (string | StringMatcher)[];\n\n/** Relaxed record matcher: values can be plain strings or relaxed matchers. */\nexport type RelaxedRecord = Record<string, RelaxedStringMatchers>;\n\n/** Relaxed axis selector — accepts plain strings where strict requires StringMatcher[]. */\nexport interface RelaxedAxisSelector {\n name?: RelaxedStringMatchers;\n type?: AxisValueType | AxisValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n}\n\n/** Relaxed column selector — convenient hand-written form. */\nexport interface RelaxedColumnSelector {\n name?: RelaxedStringMatchers;\n type?: ColumnValueType | ColumnValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n axes?: RelaxedAxisSelector[];\n partialAxesMatch?: boolean;\n}\n\n/** Input that normalizes to ColumnSelector[]. */\nexport type ColumnSelectorInput = RelaxedColumnSelector | RelaxedColumnSelector[];\n\n// --- Normalization ---\n\nfunction normalizeStringMatchers(input: RelaxedStringMatchers): StringMatcher[] {\n if (typeof input === \"string\") return [{ type: \"regex\", value: input }];\n if (!Array.isArray(input)) return [input];\n return input.map((v) =>\n typeof v === \"string\" ? ({ type: \"regex\", value: v } satisfies StringMatcher) : v,\n );\n}\n\nfunction normalizeRecord(input: RelaxedRecord): Record<string, StringMatcher[]> {\n const result: Record<string, StringMatcher[]> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = normalizeStringMatchers(value);\n }\n return result;\n}\n\nfunction normalizeTypes<T>(input: T | T[]): T[] {\n return Array.isArray(input) ? input : [input];\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nfunction normalizeAxisSelector(input: RelaxedAxisSelector): MultiAxisSelector {\n const result: Mutable<MultiAxisSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n return result;\n}\n\n/** Normalize relaxed input to strict ColumnSelector[]. */\nexport function normalizeSelectors(input: ColumnSelectorInput): MultiColumnSelector[] {\n const arr = Array.isArray(input) ? input : [input];\n return arr.map(normalizeSingleSelector);\n}\n\nfunction normalizeSingleSelector(input: RelaxedColumnSelector): MultiColumnSelector {\n const result: Mutable<MultiColumnSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n if (input.axes !== undefined) result.axes = input.axes.map(normalizeAxisSelector);\n if (input.partialAxesMatch !== undefined) result.partialAxesMatch = input.partialAxesMatch;\n return result;\n}\n\n// --- Matching ---\n\nfunction matchStringValue(value: string, matchers: StringMatcher[]): boolean {\n return matchers.some((m) => {\n if (m.type === \"exact\") return value === m.value;\n return new RegExp(`^(?:${m.value})$`).test(value);\n });\n}\n\nfunction matchRecordField(\n actual: Record<string, string> | undefined,\n required: Record<string, StringMatcher[]>,\n): boolean {\n const record = actual ?? {};\n for (const [key, matchers] of Object.entries(required)) {\n const value = record[key];\n if (value === undefined) return false;\n if (!matchStringValue(value, matchers)) return false;\n }\n return true;\n}\n\n/** Get combined domain: column's own domain merged with all axis domains. */\nfunction getCombinedDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.domain) Object.assign(result, spec.domain);\n for (const axis of spec.axesSpec) {\n if (axis.domain) Object.assign(result, axis.domain);\n }\n return result;\n}\n\n/** Get combined context domain: column's own contextDomain merged with all axis contextDomains. */\nfunction getCombinedContextDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.contextDomain) Object.assign(result, spec.contextDomain);\n for (const axis of spec.axesSpec) {\n if (\"contextDomain\" in axis && axis.contextDomain) Object.assign(result, axis.contextDomain);\n }\n return result;\n}\n\nfunction matchAxisSelector(\n axis: PColumnSpec[\"axesSpec\"][number],\n selector: MultiAxisSelector,\n): boolean {\n if (selector.name !== undefined && !matchStringValue(axis.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(axis.type)) return false;\n if (selector.domain !== undefined && !matchRecordField(axis.domain, selector.domain))\n return false;\n if (\n selector.contextDomain !== undefined &&\n !matchRecordField(\n \"contextDomain\" in axis ? (axis.contextDomain as Record<string, string>) : undefined,\n selector.contextDomain,\n )\n )\n return false;\n if (\n selector.annotations !== undefined &&\n !matchRecordField(axis.annotations, selector.annotations)\n )\n return false;\n return true;\n}\n\n/** Check if a PColumnSpec matches a single strict ColumnSelector. */\nexport function matchColumn(spec: PColumnSpec, selector: MultiColumnSelector): boolean {\n if (selector.name !== undefined && !matchStringValue(spec.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(spec.valueType)) return false;\n\n if (selector.domain !== undefined) {\n const combined = getCombinedDomain(spec);\n if (!matchRecordField(combined, selector.domain)) return false;\n }\n\n if (selector.contextDomain !== undefined) {\n const combined = getCombinedContextDomain(spec);\n if (!matchRecordField(combined, selector.contextDomain)) return false;\n }\n\n if (selector.annotations !== undefined) {\n if (!matchRecordField(spec.annotations, selector.annotations)) return false;\n }\n\n if (selector.axes !== undefined) {\n const partialMatch = selector.partialAxesMatch ?? true;\n if (partialMatch) {\n for (const axisSel of selector.axes) {\n if (!spec.axesSpec.some((axis) => matchAxisSelector(axis, axisSel))) return false;\n }\n } else {\n if (spec.axesSpec.length !== selector.axes.length) return false;\n for (let i = 0; i < selector.axes.length; i++) {\n if (!matchAxisSelector(spec.axesSpec[i], selector.axes[i])) return false;\n }\n }\n }\n\n return true;\n}\n\n/** Check if a PColumnSpec matches any of the selectors (OR across array). */\nexport function matchColumnSelectors(selectors: MultiColumnSelector[], spec: PColumnSpec): boolean {\n return selectors.some((sel) => matchColumn(spec, sel));\n}\n\n/**\n * Convert selector input to a predicate function.\n * Normalizes relaxed form, then returns a function that OR-matches.\n */\nexport function columnSelectorsToPredicate(\n input: ColumnSelectorInput,\n): (spec: PColumnSpec) => boolean {\n const selectors = normalizeSelectors(input);\n return (spec) => matchColumnSelectors(selectors, spec);\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column_selector.d.ts","names":[],"sources":["../../src/columns/column_selector.ts"],"mappings":";;;;KAcY,qBAAA,YAAiC,aAAA,aAA0B,aAAA;;KAG3D,aAAA,GAAgB,MAAA,SAAe,qBAAA;;UAG1B,mBAAA;EACf,IAAA,GAAO,qBAAA;EACP,IAAA,GAAO,aAAA,GAAgB,aAAA;EACvB,MAAA,GAAS,aAAA;EACT,aAAA,GAAgB,aAAA;EAChB,WAAA,GAAc,aAAA;AAAA;;UAIC,qBAAA;EACf,IAAA,GAAO,qBAAA;EACP,IAAA,GAAO,eAAA,GAAkB,eAAA;EACzB,MAAA,GAAS,aAAA;EACT,aAAA,GAAgB,aAAA;EAChB,WAAA,GAAc,aAAA;EACd,IAAA,GAAO,mBAAA;EACP,gBAAA;AAAA;;KAIU,mBAAA,GAAsB,qBAAA,GAAwB,qBAAA;;iBAsC1C,kBAAA,CAAmB,KAAA,EAAO,mBAAA,GAAsB,mBAAA;;iBAqFhD,WAAA,CAAY,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,mBAAA;;iBAoCzC,oBAAA,CAAqB,SAAA,EAAW,mBAAA,IAAuB,IAAA,EAAM,WAAA;;;;;iBAQ7D,0BAAA,CACd,KAAA,EAAO,mBAAA,IACL,IAAA,EAAM,WAAA"}
@@ -112,7 +112,7 @@ function columnSelectorsToPredicate(input) {
112
112
  const selectors = normalizeSelectors(input);
113
113
  return (spec) => matchColumnSelectors(selectors, spec);
114
114
  }
115
-
116
115
  //#endregion
117
116
  export { columnSelectorsToPredicate, matchColumn, matchColumnSelectors, normalizeSelectors };
117
+
118
118
  //# sourceMappingURL=column_selector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"column_selector.js","names":[],"sources":["../../src/columns/column_selector.ts"],"sourcesContent":["import type {\n AxisValueType,\n ColumnValueType,\n MultiAxisSelector,\n MultiColumnSelector,\n PColumnSpec,\n StringMatcher,\n} from \"@milaboratories/pl-model-common\";\n\nexport type { StringMatcher } from \"@milaboratories/pl-model-common\";\n\n// --- Relaxed types ---\n\n/** Relaxed string matcher input: plain string, single matcher, or array of mixed. */\nexport type RelaxedStringMatchers = string | StringMatcher | (string | StringMatcher)[];\n\n/** Relaxed record matcher: values can be plain strings or relaxed matchers. */\nexport type RelaxedRecord = Record<string, RelaxedStringMatchers>;\n\n/** Relaxed axis selector — accepts plain strings where strict requires StringMatcher[]. */\nexport interface RelaxedAxisSelector {\n name?: RelaxedStringMatchers;\n type?: AxisValueType | AxisValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n}\n\n/** Relaxed column selector — convenient hand-written form. */\nexport interface RelaxedColumnSelector {\n name?: RelaxedStringMatchers;\n type?: ColumnValueType | ColumnValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n axes?: RelaxedAxisSelector[];\n partialAxesMatch?: boolean;\n}\n\n/** Input that normalizes to ColumnSelector[]. */\nexport type ColumnSelectorInput = RelaxedColumnSelector | RelaxedColumnSelector[];\n\n// --- Normalization ---\n\nfunction normalizeStringMatchers(input: RelaxedStringMatchers): StringMatcher[] {\n if (typeof input === \"string\") return [{ type: \"regex\", value: input }];\n if (!Array.isArray(input)) return [input];\n return input.map((v) =>\n typeof v === \"string\" ? ({ type: \"regex\", value: v } satisfies StringMatcher) : v,\n );\n}\n\nfunction normalizeRecord(input: RelaxedRecord): Record<string, StringMatcher[]> {\n const result: Record<string, StringMatcher[]> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = normalizeStringMatchers(value);\n }\n return result;\n}\n\nfunction normalizeTypes<T>(input: T | T[]): T[] {\n return Array.isArray(input) ? input : [input];\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nfunction normalizeAxisSelector(input: RelaxedAxisSelector): MultiAxisSelector {\n const result: Mutable<MultiAxisSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n return result;\n}\n\n/** Normalize relaxed input to strict ColumnSelector[]. */\nexport function normalizeSelectors(input: ColumnSelectorInput): MultiColumnSelector[] {\n const arr = Array.isArray(input) ? input : [input];\n return arr.map(normalizeSingleSelector);\n}\n\nfunction normalizeSingleSelector(input: RelaxedColumnSelector): MultiColumnSelector {\n const result: Mutable<MultiColumnSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n if (input.axes !== undefined) result.axes = input.axes.map(normalizeAxisSelector);\n if (input.partialAxesMatch !== undefined) result.partialAxesMatch = input.partialAxesMatch;\n return result;\n}\n\n// --- Matching ---\n\nfunction matchStringValue(value: string, matchers: StringMatcher[]): boolean {\n return matchers.some((m) => {\n if (m.type === \"exact\") return value === m.value;\n return new RegExp(`^(?:${m.value})$`).test(value);\n });\n}\n\nfunction matchRecordField(\n actual: Record<string, string> | undefined,\n required: Record<string, StringMatcher[]>,\n): boolean {\n const record = actual ?? {};\n for (const [key, matchers] of Object.entries(required)) {\n const value = record[key];\n if (value === undefined) return false;\n if (!matchStringValue(value, matchers)) return false;\n }\n return true;\n}\n\n/** Get combined domain: column's own domain merged with all axis domains. */\nfunction getCombinedDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.domain) Object.assign(result, spec.domain);\n for (const axis of spec.axesSpec) {\n if (axis.domain) Object.assign(result, axis.domain);\n }\n return result;\n}\n\n/** Get combined context domain: column's own contextDomain merged with all axis contextDomains. */\nfunction getCombinedContextDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.contextDomain) Object.assign(result, spec.contextDomain);\n for (const axis of spec.axesSpec) {\n if (\"contextDomain\" in axis && axis.contextDomain) Object.assign(result, axis.contextDomain);\n }\n return result;\n}\n\nfunction matchAxisSelector(\n axis: PColumnSpec[\"axesSpec\"][number],\n selector: MultiAxisSelector,\n): boolean {\n if (selector.name !== undefined && !matchStringValue(axis.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(axis.type)) return false;\n if (selector.domain !== undefined && !matchRecordField(axis.domain, selector.domain))\n return false;\n if (\n selector.contextDomain !== undefined &&\n !matchRecordField(\n \"contextDomain\" in axis ? (axis.contextDomain as Record<string, string>) : undefined,\n selector.contextDomain,\n )\n )\n return false;\n if (\n selector.annotations !== undefined &&\n !matchRecordField(axis.annotations, selector.annotations)\n )\n return false;\n return true;\n}\n\n/** Check if a PColumnSpec matches a single strict ColumnSelector. */\nexport function matchColumn(spec: PColumnSpec, selector: MultiColumnSelector): boolean {\n if (selector.name !== undefined && !matchStringValue(spec.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(spec.valueType)) return false;\n\n if (selector.domain !== undefined) {\n const combined = getCombinedDomain(spec);\n if (!matchRecordField(combined, selector.domain)) return false;\n }\n\n if (selector.contextDomain !== undefined) {\n const combined = getCombinedContextDomain(spec);\n if (!matchRecordField(combined, selector.contextDomain)) return false;\n }\n\n if (selector.annotations !== undefined) {\n if (!matchRecordField(spec.annotations, selector.annotations)) return false;\n }\n\n if (selector.axes !== undefined) {\n const partialMatch = selector.partialAxesMatch ?? true;\n if (partialMatch) {\n for (const axisSel of selector.axes) {\n if (!spec.axesSpec.some((axis) => matchAxisSelector(axis, axisSel))) return false;\n }\n } else {\n if (spec.axesSpec.length !== selector.axes.length) return false;\n for (let i = 0; i < selector.axes.length; i++) {\n if (!matchAxisSelector(spec.axesSpec[i], selector.axes[i])) return false;\n }\n }\n }\n\n return true;\n}\n\n/** Check if a PColumnSpec matches any of the selectors (OR across array). */\nexport function matchColumnSelectors(selectors: MultiColumnSelector[], spec: PColumnSpec): boolean {\n return selectors.some((sel) => matchColumn(spec, sel));\n}\n\n/**\n * Convert selector input to a predicate function.\n * Normalizes relaxed form, then returns a function that OR-matches.\n */\nexport function columnSelectorsToPredicate(\n input: ColumnSelectorInput,\n): (spec: PColumnSpec) => boolean {\n const selectors = normalizeSelectors(input);\n return (spec) => matchColumnSelectors(selectors, spec);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"column_selector.js","names":[],"sources":["../../src/columns/column_selector.ts"],"sourcesContent":["import type {\n AxisValueType,\n ColumnValueType,\n MultiAxisSelector,\n MultiColumnSelector,\n PColumnSpec,\n StringMatcher,\n} from \"@milaboratories/pl-model-common\";\n\nexport type { StringMatcher } from \"@milaboratories/pl-model-common\";\n\n// --- Relaxed types ---\n\n/** Relaxed string matcher input: plain string, single matcher, or array of mixed. */\nexport type RelaxedStringMatchers = string | StringMatcher | (string | StringMatcher)[];\n\n/** Relaxed record matcher: values can be plain strings or relaxed matchers. */\nexport type RelaxedRecord = Record<string, RelaxedStringMatchers>;\n\n/** Relaxed axis selector — accepts plain strings where strict requires StringMatcher[]. */\nexport interface RelaxedAxisSelector {\n name?: RelaxedStringMatchers;\n type?: AxisValueType | AxisValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n}\n\n/** Relaxed column selector — convenient hand-written form. */\nexport interface RelaxedColumnSelector {\n name?: RelaxedStringMatchers;\n type?: ColumnValueType | ColumnValueType[];\n domain?: RelaxedRecord;\n contextDomain?: RelaxedRecord;\n annotations?: RelaxedRecord;\n axes?: RelaxedAxisSelector[];\n partialAxesMatch?: boolean;\n}\n\n/** Input that normalizes to ColumnSelector[]. */\nexport type ColumnSelectorInput = RelaxedColumnSelector | RelaxedColumnSelector[];\n\n// --- Normalization ---\n\nfunction normalizeStringMatchers(input: RelaxedStringMatchers): StringMatcher[] {\n if (typeof input === \"string\") return [{ type: \"regex\", value: input }];\n if (!Array.isArray(input)) return [input];\n return input.map((v) =>\n typeof v === \"string\" ? ({ type: \"regex\", value: v } satisfies StringMatcher) : v,\n );\n}\n\nfunction normalizeRecord(input: RelaxedRecord): Record<string, StringMatcher[]> {\n const result: Record<string, StringMatcher[]> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = normalizeStringMatchers(value);\n }\n return result;\n}\n\nfunction normalizeTypes<T>(input: T | T[]): T[] {\n return Array.isArray(input) ? input : [input];\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nfunction normalizeAxisSelector(input: RelaxedAxisSelector): MultiAxisSelector {\n const result: Mutable<MultiAxisSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n return result;\n}\n\n/** Normalize relaxed input to strict ColumnSelector[]. */\nexport function normalizeSelectors(input: ColumnSelectorInput): MultiColumnSelector[] {\n const arr = Array.isArray(input) ? input : [input];\n return arr.map(normalizeSingleSelector);\n}\n\nfunction normalizeSingleSelector(input: RelaxedColumnSelector): MultiColumnSelector {\n const result: Mutable<MultiColumnSelector> = {};\n if (input.name !== undefined) result.name = normalizeStringMatchers(input.name);\n if (input.type !== undefined) result.type = normalizeTypes(input.type);\n if (input.domain !== undefined) result.domain = normalizeRecord(input.domain);\n if (input.contextDomain !== undefined)\n result.contextDomain = normalizeRecord(input.contextDomain);\n if (input.annotations !== undefined) result.annotations = normalizeRecord(input.annotations);\n if (input.axes !== undefined) result.axes = input.axes.map(normalizeAxisSelector);\n if (input.partialAxesMatch !== undefined) result.partialAxesMatch = input.partialAxesMatch;\n return result;\n}\n\n// --- Matching ---\n\nfunction matchStringValue(value: string, matchers: StringMatcher[]): boolean {\n return matchers.some((m) => {\n if (m.type === \"exact\") return value === m.value;\n return new RegExp(`^(?:${m.value})$`).test(value);\n });\n}\n\nfunction matchRecordField(\n actual: Record<string, string> | undefined,\n required: Record<string, StringMatcher[]>,\n): boolean {\n const record = actual ?? {};\n for (const [key, matchers] of Object.entries(required)) {\n const value = record[key];\n if (value === undefined) return false;\n if (!matchStringValue(value, matchers)) return false;\n }\n return true;\n}\n\n/** Get combined domain: column's own domain merged with all axis domains. */\nfunction getCombinedDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.domain) Object.assign(result, spec.domain);\n for (const axis of spec.axesSpec) {\n if (axis.domain) Object.assign(result, axis.domain);\n }\n return result;\n}\n\n/** Get combined context domain: column's own contextDomain merged with all axis contextDomains. */\nfunction getCombinedContextDomain(spec: PColumnSpec): Record<string, string> {\n const result: Record<string, string> = {};\n if (spec.contextDomain) Object.assign(result, spec.contextDomain);\n for (const axis of spec.axesSpec) {\n if (\"contextDomain\" in axis && axis.contextDomain) Object.assign(result, axis.contextDomain);\n }\n return result;\n}\n\nfunction matchAxisSelector(\n axis: PColumnSpec[\"axesSpec\"][number],\n selector: MultiAxisSelector,\n): boolean {\n if (selector.name !== undefined && !matchStringValue(axis.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(axis.type)) return false;\n if (selector.domain !== undefined && !matchRecordField(axis.domain, selector.domain))\n return false;\n if (\n selector.contextDomain !== undefined &&\n !matchRecordField(\n \"contextDomain\" in axis ? (axis.contextDomain as Record<string, string>) : undefined,\n selector.contextDomain,\n )\n )\n return false;\n if (\n selector.annotations !== undefined &&\n !matchRecordField(axis.annotations, selector.annotations)\n )\n return false;\n return true;\n}\n\n/** Check if a PColumnSpec matches a single strict ColumnSelector. */\nexport function matchColumn(spec: PColumnSpec, selector: MultiColumnSelector): boolean {\n if (selector.name !== undefined && !matchStringValue(spec.name, selector.name)) return false;\n if (selector.type !== undefined && !selector.type.includes(spec.valueType)) return false;\n\n if (selector.domain !== undefined) {\n const combined = getCombinedDomain(spec);\n if (!matchRecordField(combined, selector.domain)) return false;\n }\n\n if (selector.contextDomain !== undefined) {\n const combined = getCombinedContextDomain(spec);\n if (!matchRecordField(combined, selector.contextDomain)) return false;\n }\n\n if (selector.annotations !== undefined) {\n if (!matchRecordField(spec.annotations, selector.annotations)) return false;\n }\n\n if (selector.axes !== undefined) {\n const partialMatch = selector.partialAxesMatch ?? true;\n if (partialMatch) {\n for (const axisSel of selector.axes) {\n if (!spec.axesSpec.some((axis) => matchAxisSelector(axis, axisSel))) return false;\n }\n } else {\n if (spec.axesSpec.length !== selector.axes.length) return false;\n for (let i = 0; i < selector.axes.length; i++) {\n if (!matchAxisSelector(spec.axesSpec[i], selector.axes[i])) return false;\n }\n }\n }\n\n return true;\n}\n\n/** Check if a PColumnSpec matches any of the selectors (OR across array). */\nexport function matchColumnSelectors(selectors: MultiColumnSelector[], spec: PColumnSpec): boolean {\n return selectors.some((sel) => matchColumn(spec, sel));\n}\n\n/**\n * Convert selector input to a predicate function.\n * Normalizes relaxed form, then returns a function that OR-matches.\n */\nexport function columnSelectorsToPredicate(\n input: ColumnSelectorInput,\n): (spec: PColumnSpec) => boolean {\n const selectors = normalizeSelectors(input);\n return (spec) => matchColumnSelectors(selectors, spec);\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/columns/column_snapshot.ts
3
2
  /** Creates a ColumnData active object for a ready column. */
4
3
  function createReadyColumnData(getData) {
@@ -13,8 +12,8 @@ function createColumnSnapshot(id, spec, dataStatus, data) {
13
12
  data
14
13
  };
15
14
  }
16
-
17
15
  //#endregion
18
16
  exports.createColumnSnapshot = createColumnSnapshot;
19
17
  exports.createReadyColumnData = createReadyColumnData;
18
+
20
19
  //# sourceMappingURL=column_snapshot.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"column_snapshot.cjs","names":[],"sources":["../../src/columns/column_snapshot.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\n\n// --- ColumnSnapshot ---\n\n/** Data status of a column snapshot. */\nexport type ColumnDataStatus = \"ready\" | \"computing\" | \"absent\";\n\n/**\n * Immutable snapshot of a column: spec, data status, and lazy data accessor.\n *\n * - `dataStatus` is readable without marking the render context unstable.\n * - `data` holds an active object when data exists (ready or computing),\n * or `undefined` when data is permanently absent.\n */\nexport interface ColumnSnapshot<Id extends PObjectId = PObjectId> {\n readonly id: Id;\n readonly spec: PColumnSpec;\n readonly dataStatus: ColumnDataStatus;\n\n /**\n * Lazy data accessor.\n * - `'ready'`: `data.get()` returns column data, context stays stable.\n * - `'computing'`: `data.get()` returns `undefined`, marks context unstable.\n * - `'absent'`: `data` is `undefined` — no active object, no instability.\n */\n readonly data: ColumnData | undefined;\n}\n\n// --- ColumnData ---\n\n/**\n * Active object wrapping lazy column data access.\n * Accessing data on a computing column marks the render context unstable.\n */\nexport interface ColumnData {\n get(): PColumnDataUniversal | undefined;\n}\n\n/** Creates a ColumnData active object for a ready column. */\nexport function createReadyColumnData(getData: () => PColumnDataUniversal | undefined): ColumnData {\n return { get: getData };\n}\n\n// --- Snapshot construction helpers ---\n\n/** Creates a ColumnSnapshot from parts. */\nexport function createColumnSnapshot<Id extends PObjectId = PObjectId>(\n id: Id,\n spec: PColumnSpec,\n dataStatus: ColumnDataStatus,\n data: ColumnData | undefined,\n): ColumnSnapshot<Id> {\n return { id, spec, dataStatus, data };\n}\n"],"mappings":";;;AAwCA,SAAgB,sBAAsB,SAA6D;AACjG,QAAO,EAAE,KAAK,SAAS;;;AAMzB,SAAgB,qBACd,IACA,MACA,YACA,MACoB;AACpB,QAAO;EAAE;EAAI;EAAM;EAAY;EAAM"}
1
+ {"version":3,"file":"column_snapshot.cjs","names":[],"sources":["../../src/columns/column_snapshot.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\n\n// --- ColumnSnapshot ---\n\n/** Data status of a column snapshot. */\nexport type ColumnDataStatus = \"ready\" | \"computing\" | \"absent\";\n\n/**\n * Immutable snapshot of a column: spec, data status, and lazy data accessor.\n *\n * - `dataStatus` is readable without marking the render context unstable.\n * - `data` holds an active object when data exists (ready or computing),\n * or `undefined` when data is permanently absent.\n */\nexport interface ColumnSnapshot<Id extends PObjectId = PObjectId> {\n readonly id: Id;\n readonly spec: PColumnSpec;\n readonly dataStatus: ColumnDataStatus;\n\n /**\n * Lazy data accessor.\n * - `'ready'`: `data.get()` returns column data, context stays stable.\n * - `'computing'`: `data.get()` returns `undefined`, marks context unstable.\n * - `'absent'`: `data` is `undefined` — no active object, no instability.\n */\n readonly data: ColumnData | undefined;\n}\n\n// --- ColumnData ---\n\n/**\n * Active object wrapping lazy column data access.\n * Accessing data on a computing column marks the render context unstable.\n */\nexport interface ColumnData {\n get(): PColumnDataUniversal | undefined;\n}\n\n/** Creates a ColumnData active object for a ready column. */\nexport function createReadyColumnData(getData: () => PColumnDataUniversal | undefined): ColumnData {\n return { get: getData };\n}\n\n// --- Snapshot construction helpers ---\n\n/** Creates a ColumnSnapshot from parts. */\nexport function createColumnSnapshot<Id extends PObjectId = PObjectId>(\n id: Id,\n spec: PColumnSpec,\n dataStatus: ColumnDataStatus,\n data: ColumnData | undefined,\n): ColumnSnapshot<Id> {\n return { id, spec, dataStatus, data };\n}\n"],"mappings":";;AAwCA,SAAgB,sBAAsB,SAA6D;AACjG,QAAO,EAAE,KAAK,SAAS;;;AAMzB,SAAgB,qBACd,IACA,MACA,YACA,MACoB;AACpB,QAAO;EAAE;EAAI;EAAM;EAAY;EAAM"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column_snapshot.d.ts","names":[],"sources":["../../src/columns/column_snapshot.ts"],"mappings":";;;;;KAMY,gBAAA;AAAZ;;;;;AASA;;AATA,UASiB,cAAA,YAA0B,SAAA,GAAY,SAAA;EAAA,SAC5C,EAAA,EAAI,EAAA;EAAA,SACJ,IAAA,EAAM,WAAA;EAAA,SACN,UAAA,EAAY,gBAAA;EADN;;;;;;EAAA,SASN,IAAA,EAAM,UAAA;AAAA;;;;;UASA,UAAA;EACf,GAAA,IAAO,oBAAA;AAAA;;iBAIO,qBAAA,CAAsB,OAAA,QAAe,oBAAA,eAAmC,UAAA;;iBAOxE,oBAAA,YAAgC,SAAA,GAAY,SAAA,CAAA,CAC1D,EAAA,EAAI,EAAA,EACJ,IAAA,EAAM,WAAA,EACN,UAAA,EAAY,gBAAA,EACZ,IAAA,EAAM,UAAA,eACL,cAAA,CAAe,EAAA"}
@@ -12,7 +12,7 @@ function createColumnSnapshot(id, spec, dataStatus, data) {
12
12
  data
13
13
  };
14
14
  }
15
-
16
15
  //#endregion
17
16
  export { createColumnSnapshot, createReadyColumnData };
17
+
18
18
  //# sourceMappingURL=column_snapshot.js.map
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/columns/column_snapshot_provider.ts
3
2
  /**
4
3
  * Simple provider wrapping an array of PColumns.
@@ -102,11 +101,11 @@ function toColumnSnapshotProvider(source) {
102
101
  if (isPColumnArray(source)) return new ArrayColumnProvider(source);
103
102
  throw new Error("Unknown ColumnSource type");
104
103
  }
105
-
106
104
  //#endregion
107
105
  exports.ArrayColumnProvider = ArrayColumnProvider;
108
106
  exports.OutputColumnProvider = OutputColumnProvider;
109
107
  exports.SnapshotColumnProvider = SnapshotColumnProvider;
110
108
  exports.isColumnSnapshotProvider = isColumnSnapshotProvider;
111
109
  exports.toColumnSnapshotProvider = toColumnSnapshotProvider;
110
+
112
111
  //# sourceMappingURL=column_snapshot_provider.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"column_snapshot_provider.cjs","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import { PColumn } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n// --- ColumnProvider ---\n\n/**\n * Data source interface for column enumeration.\n *\n * Knows nothing about the render framework, stability tracking, labels,\n * anchoring, or splitting. All that complexity lives in the collection layer.\n */\nexport interface ColumnSnapshotProvider {\n /** Returns all currently known columns. */\n getAllColumns(): ColumnSnapshot[];\n\n /** Whether the provider has finished enumerating all its columns.\n * Calling this may mark the render context unstable — it touches\n * the reactive tree to check field resolution state. */\n isColumnListComplete(): boolean;\n}\n\n// --- ColumnSource ---\n\n/**\n * Union of types that can serve as column sources for helpers and builders.\n * Does NOT include TreeNodeAccessor — call `.toColumnSource()` on it first.\n */\nexport type ColumnSource =\n | ColumnSnapshotProvider\n | ColumnSnapshot[]\n | PColumn<PColumnDataUniversal | undefined>[];\n\n// --- ArrayColumnProvider ---\n\n/**\n * Simple provider wrapping an array of PColumns.\n * Always complete, data status always 'ready'.\n */\nexport class ArrayColumnProvider implements ColumnSnapshotProvider {\n private readonly columns: ColumnSnapshot[];\n\n constructor(columns: PColumn<PColumnDataUniversal | undefined>[]) {\n this.columns = columns.map((col) => ({\n id: col.id,\n spec: col.spec,\n dataStatus: \"ready\" as const,\n data: { get: () => col.data },\n }));\n }\n\n getAllColumns(): ColumnSnapshot[] {\n return this.columns;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- SnapshotColumnProvider ---\n\n/**\n * Provider wrapping an array of ColumnSnapshots.\n * Always complete. Data status taken from each snapshot.\n */\nexport class SnapshotColumnProvider implements ColumnSnapshotProvider {\n constructor(private readonly snapshots: ColumnSnapshot[]) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.snapshots;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- OutputColumnProvider ---\n\nexport interface OutputColumnProviderOpts {\n /** When true and the accessor is final, columns with no ready data get status 'absent'. */\n allowPermanentAbsence?: boolean;\n}\n\n/**\n * Provider wrapping a TreeNodeAccessor (output/prerun resolve result).\n * Detects data status from accessor readiness state.\n */\nexport class OutputColumnProvider implements ColumnSnapshotProvider {\n constructor(\n private readonly accessor: TreeNodeAccessor,\n private readonly opts?: OutputColumnProviderOpts,\n ) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.getColumns();\n }\n\n isColumnListComplete(): boolean {\n return this.accessor.getInputsLocked();\n }\n\n private getColumns(): ColumnSnapshot[] {\n const pColumns = this.accessor.getPColumns();\n if (pColumns === undefined) return [];\n\n const isFinal = this.accessor.getIsFinal();\n const allowAbsence = this.opts?.allowPermanentAbsence === true;\n\n return pColumns.map((col) => {\n const dataAccessor = col.data;\n const isReady = dataAccessor.getIsReadyOrError();\n\n let dataStatus: ColumnDataStatus;\n if (isReady) {\n dataStatus = \"ready\";\n } else if (allowAbsence && isFinal) {\n dataStatus = \"absent\";\n } else {\n dataStatus = \"computing\";\n }\n\n return {\n id: col.id,\n spec: col.spec,\n dataStatus,\n data: { get: () => (isReady ? dataAccessor : undefined) },\n };\n });\n }\n}\n\n// --- Source normalization ---\n\n/** Checks if a value is a ColumnSnapshotProvider (duck-typing). */\nexport function isColumnSnapshotProvider(source: unknown): source is ColumnSnapshotProvider {\n return (\n typeof source === \"object\" &&\n source !== null &&\n \"getAllColumns\" in source &&\n \"isColumnListComplete\" in source &&\n typeof (source as ColumnSnapshotProvider).getAllColumns === \"function\" &&\n typeof (source as ColumnSnapshotProvider).isColumnListComplete === \"function\"\n );\n}\n\n/** Checks if a value looks like a PColumn (has id, spec, data). */\nfunction isPColumnArray(source: unknown): source is PColumn<PColumnDataUniversal | undefined>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as PColumn[]\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"data\" in first && !(\"dataStatus\" in first);\n}\n\n/** Checks if a value looks like a ColumnSnapshot array. */\nfunction isColumnSnapshotArray(source: unknown): source is ColumnSnapshot[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as snapshots\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"dataStatus\" in first;\n}\n\n/**\n * Normalize any ColumnSource into a ColumnSnapshotProvider.\n * - ColumnSnapshotProvider → returned as-is\n * - ColumnSnapshot[] → wrapped in SnapshotColumnProvider\n * - PColumn[] → wrapped in ArrayColumnProvider\n */\nexport function toColumnSnapshotProvider(source: ColumnSource): ColumnSnapshotProvider {\n if (isColumnSnapshotProvider(source)) return source;\n if (isColumnSnapshotArray(source)) return new SnapshotColumnProvider(source);\n if (isPColumnArray(source)) return new ArrayColumnProvider(source);\n // Should not reach here given the type union, but be safe\n throw new Error(\"Unknown ColumnSource type\");\n}\n"],"mappings":";;;;;;AAwCA,IAAa,sBAAb,MAAmE;CACjE,AAAiB;CAEjB,YAAY,SAAsD;AAChE,OAAK,UAAU,QAAQ,KAAK,SAAS;GACnC,IAAI,IAAI;GACR,MAAM,IAAI;GACV,YAAY;GACZ,MAAM,EAAE,WAAW,IAAI,MAAM;GAC9B,EAAE;;CAGL,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAUX,IAAa,yBAAb,MAAsE;CACpE,YAAY,AAAiB,WAA6B;EAA7B;;CAE7B,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAeX,IAAa,uBAAb,MAAoE;CAClE,YACE,AAAiB,UACjB,AAAiB,MACjB;EAFiB;EACA;;CAGnB,gBAAkC;AAChC,SAAO,KAAK,YAAY;;CAG1B,uBAAgC;AAC9B,SAAO,KAAK,SAAS,iBAAiB;;CAGxC,AAAQ,aAA+B;EACrC,MAAM,WAAW,KAAK,SAAS,aAAa;AAC5C,MAAI,aAAa,OAAW,QAAO,EAAE;EAErC,MAAM,UAAU,KAAK,SAAS,YAAY;EAC1C,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAE1D,SAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,eAAe,IAAI;GACzB,MAAM,UAAU,aAAa,mBAAmB;GAEhD,IAAI;AACJ,OAAI,QACF,cAAa;YACJ,gBAAgB,QACzB,cAAa;OAEb,cAAa;AAGf,UAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV;IACA,MAAM,EAAE,WAAY,UAAU,eAAe,QAAY;IAC1D;IACD;;;;AAON,SAAgB,yBAAyB,QAAmD;AAC1F,QACE,OAAO,WAAW,YAClB,WAAW,QACX,mBAAmB,UACnB,0BAA0B,UAC1B,OAAQ,OAAkC,kBAAkB,cAC5D,OAAQ,OAAkC,yBAAyB;;;AAKvE,SAAS,eAAe,QAAwE;AAC9F,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,UAAU,SAAS,EAAE,gBAAgB;;;AAIlF,SAAS,sBAAsB,QAA6C;AAC1E,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,gBAAgB;;;;;;;;AAS7D,SAAgB,yBAAyB,QAA8C;AACrF,KAAI,yBAAyB,OAAO,CAAE,QAAO;AAC7C,KAAI,sBAAsB,OAAO,CAAE,QAAO,IAAI,uBAAuB,OAAO;AAC5E,KAAI,eAAe,OAAO,CAAE,QAAO,IAAI,oBAAoB,OAAO;AAElE,OAAM,IAAI,MAAM,4BAA4B"}
1
+ {"version":3,"file":"column_snapshot_provider.cjs","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import { PColumn } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n// --- ColumnProvider ---\n\n/**\n * Data source interface for column enumeration.\n *\n * Knows nothing about the render framework, stability tracking, labels,\n * anchoring, or splitting. All that complexity lives in the collection layer.\n */\nexport interface ColumnSnapshotProvider {\n /** Returns all currently known columns. */\n getAllColumns(): ColumnSnapshot[];\n\n /** Whether the provider has finished enumerating all its columns.\n * Calling this may mark the render context unstable — it touches\n * the reactive tree to check field resolution state. */\n isColumnListComplete(): boolean;\n}\n\n// --- ColumnSource ---\n\n/**\n * Union of types that can serve as column sources for helpers and builders.\n * Does NOT include TreeNodeAccessor — call `.toColumnSource()` on it first.\n */\nexport type ColumnSource =\n | ColumnSnapshotProvider\n | ColumnSnapshot[]\n | PColumn<PColumnDataUniversal | undefined>[];\n\n// --- ArrayColumnProvider ---\n\n/**\n * Simple provider wrapping an array of PColumns.\n * Always complete, data status always 'ready'.\n */\nexport class ArrayColumnProvider implements ColumnSnapshotProvider {\n private readonly columns: ColumnSnapshot[];\n\n constructor(columns: PColumn<PColumnDataUniversal | undefined>[]) {\n this.columns = columns.map((col) => ({\n id: col.id,\n spec: col.spec,\n dataStatus: \"ready\" as const,\n data: { get: () => col.data },\n }));\n }\n\n getAllColumns(): ColumnSnapshot[] {\n return this.columns;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- SnapshotColumnProvider ---\n\n/**\n * Provider wrapping an array of ColumnSnapshots.\n * Always complete. Data status taken from each snapshot.\n */\nexport class SnapshotColumnProvider implements ColumnSnapshotProvider {\n constructor(private readonly snapshots: ColumnSnapshot[]) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.snapshots;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- OutputColumnProvider ---\n\nexport interface OutputColumnProviderOpts {\n /** When true and the accessor is final, columns with no ready data get status 'absent'. */\n allowPermanentAbsence?: boolean;\n}\n\n/**\n * Provider wrapping a TreeNodeAccessor (output/prerun resolve result).\n * Detects data status from accessor readiness state.\n */\nexport class OutputColumnProvider implements ColumnSnapshotProvider {\n constructor(\n private readonly accessor: TreeNodeAccessor,\n private readonly opts?: OutputColumnProviderOpts,\n ) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.getColumns();\n }\n\n isColumnListComplete(): boolean {\n return this.accessor.getInputsLocked();\n }\n\n private getColumns(): ColumnSnapshot[] {\n const pColumns = this.accessor.getPColumns();\n if (pColumns === undefined) return [];\n\n const isFinal = this.accessor.getIsFinal();\n const allowAbsence = this.opts?.allowPermanentAbsence === true;\n\n return pColumns.map((col) => {\n const dataAccessor = col.data;\n const isReady = dataAccessor.getIsReadyOrError();\n\n let dataStatus: ColumnDataStatus;\n if (isReady) {\n dataStatus = \"ready\";\n } else if (allowAbsence && isFinal) {\n dataStatus = \"absent\";\n } else {\n dataStatus = \"computing\";\n }\n\n return {\n id: col.id,\n spec: col.spec,\n dataStatus,\n data: { get: () => (isReady ? dataAccessor : undefined) },\n };\n });\n }\n}\n\n// --- Source normalization ---\n\n/** Checks if a value is a ColumnSnapshotProvider (duck-typing). */\nexport function isColumnSnapshotProvider(source: unknown): source is ColumnSnapshotProvider {\n return (\n typeof source === \"object\" &&\n source !== null &&\n \"getAllColumns\" in source &&\n \"isColumnListComplete\" in source &&\n typeof (source as ColumnSnapshotProvider).getAllColumns === \"function\" &&\n typeof (source as ColumnSnapshotProvider).isColumnListComplete === \"function\"\n );\n}\n\n/** Checks if a value looks like a PColumn (has id, spec, data). */\nfunction isPColumnArray(source: unknown): source is PColumn<PColumnDataUniversal | undefined>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as PColumn[]\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"data\" in first && !(\"dataStatus\" in first);\n}\n\n/** Checks if a value looks like a ColumnSnapshot array. */\nfunction isColumnSnapshotArray(source: unknown): source is ColumnSnapshot[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as snapshots\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"dataStatus\" in first;\n}\n\n/**\n * Normalize any ColumnSource into a ColumnSnapshotProvider.\n * - ColumnSnapshotProvider → returned as-is\n * - ColumnSnapshot[] → wrapped in SnapshotColumnProvider\n * - PColumn[] → wrapped in ArrayColumnProvider\n */\nexport function toColumnSnapshotProvider(source: ColumnSource): ColumnSnapshotProvider {\n if (isColumnSnapshotProvider(source)) return source;\n if (isColumnSnapshotArray(source)) return new SnapshotColumnProvider(source);\n if (isPColumnArray(source)) return new ArrayColumnProvider(source);\n // Should not reach here given the type union, but be safe\n throw new Error(\"Unknown ColumnSource type\");\n}\n"],"mappings":";;;;;AAwCA,IAAa,sBAAb,MAAmE;CACjE;CAEA,YAAY,SAAsD;AAChE,OAAK,UAAU,QAAQ,KAAK,SAAS;GACnC,IAAI,IAAI;GACR,MAAM,IAAI;GACV,YAAY;GACZ,MAAM,EAAE,WAAW,IAAI,MAAM;GAC9B,EAAE;;CAGL,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAUX,IAAa,yBAAb,MAAsE;CACpE,YAAY,WAA8C;AAA7B,OAAA,YAAA;;CAE7B,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAeX,IAAa,uBAAb,MAAoE;CAClE,YACE,UACA,MACA;AAFiB,OAAA,WAAA;AACA,OAAA,OAAA;;CAGnB,gBAAkC;AAChC,SAAO,KAAK,YAAY;;CAG1B,uBAAgC;AAC9B,SAAO,KAAK,SAAS,iBAAiB;;CAGxC,aAAuC;EACrC,MAAM,WAAW,KAAK,SAAS,aAAa;AAC5C,MAAI,aAAa,KAAA,EAAW,QAAO,EAAE;EAErC,MAAM,UAAU,KAAK,SAAS,YAAY;EAC1C,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAE1D,SAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,eAAe,IAAI;GACzB,MAAM,UAAU,aAAa,mBAAmB;GAEhD,IAAI;AACJ,OAAI,QACF,cAAa;YACJ,gBAAgB,QACzB,cAAa;OAEb,cAAa;AAGf,UAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV;IACA,MAAM,EAAE,WAAY,UAAU,eAAe,KAAA,GAAY;IAC1D;IACD;;;;AAON,SAAgB,yBAAyB,QAAmD;AAC1F,QACE,OAAO,WAAW,YAClB,WAAW,QACX,mBAAmB,UACnB,0BAA0B,UAC1B,OAAQ,OAAkC,kBAAkB,cAC5D,OAAQ,OAAkC,yBAAyB;;;AAKvE,SAAS,eAAe,QAAwE;AAC9F,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,UAAU,SAAS,EAAE,gBAAgB;;;AAIlF,SAAS,sBAAsB,QAA6C;AAC1E,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,gBAAgB;;;;;;;;AAS7D,SAAgB,yBAAyB,QAA8C;AACrF,KAAI,yBAAyB,OAAO,CAAE,QAAO;AAC7C,KAAI,sBAAsB,OAAO,CAAE,QAAO,IAAI,uBAAuB,OAAO;AAC5E,KAAI,eAAe,OAAO,CAAE,QAAO,IAAI,oBAAoB,OAAO;AAElE,OAAM,IAAI,MAAM,4BAA4B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column_snapshot_provider.d.ts","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"mappings":";;;;;;;;AAaA;;;;UAAiB,sBAAA;EAEE;EAAjB,aAAA,IAAiB,cAAA;EAKG;;AAStB;EATE,oBAAA;AAAA;;;;;KASU,YAAA,GACR,sBAAA,GACA,cAAA,KACA,OAAA,CAAQ,oBAAA;;;;;cAQC,mBAAA,YAA+B,sBAAA;EAAA,iBACzB,OAAA;cAEL,OAAA,EAAS,OAAA,CAAQ,oBAAA;EAS7B,aAAA,CAAA,GAAiB,cAAA;EAIjB,oBAAA,CAAA;AAAA;;;;;cAWW,sBAAA,YAAkC,sBAAA;EAAA,iBAChB,SAAA;cAAA,SAAA,EAAW,cAAA;EAExC,aAAA,CAAA,GAAiB,cAAA;EAIjB,oBAAA,CAAA;AAAA;AAAA,UAOe,wBAAA;EAtCH;EAwCZ,qBAAA;AAAA;;;;AAhBF;cAuBa,oBAAA,YAAgC,sBAAA;EAAA,iBAExB,QAAA;EAAA,iBACA,IAAA;cADA,QAAA,EAAU,gBAAA,EACV,IAAA,GAAO,wBAAA;EAG1B,aAAA,CAAA,GAAiB,cAAA;EAIjB,oBAAA,CAAA;EAAA,QAIQ,UAAA;AAAA;;iBAiCM,wBAAA,CAAyB,MAAA,YAAkB,MAAA,IAAU,sBAAA;;;;;;;iBAiCrD,wBAAA,CAAyB,MAAA,EAAQ,YAAA,GAAe,sBAAA"}
@@ -101,7 +101,7 @@ function toColumnSnapshotProvider(source) {
101
101
  if (isPColumnArray(source)) return new ArrayColumnProvider(source);
102
102
  throw new Error("Unknown ColumnSource type");
103
103
  }
104
-
105
104
  //#endregion
106
105
  export { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider };
106
+
107
107
  //# sourceMappingURL=column_snapshot_provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"column_snapshot_provider.js","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import { PColumn } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n// --- ColumnProvider ---\n\n/**\n * Data source interface for column enumeration.\n *\n * Knows nothing about the render framework, stability tracking, labels,\n * anchoring, or splitting. All that complexity lives in the collection layer.\n */\nexport interface ColumnSnapshotProvider {\n /** Returns all currently known columns. */\n getAllColumns(): ColumnSnapshot[];\n\n /** Whether the provider has finished enumerating all its columns.\n * Calling this may mark the render context unstable — it touches\n * the reactive tree to check field resolution state. */\n isColumnListComplete(): boolean;\n}\n\n// --- ColumnSource ---\n\n/**\n * Union of types that can serve as column sources for helpers and builders.\n * Does NOT include TreeNodeAccessor — call `.toColumnSource()` on it first.\n */\nexport type ColumnSource =\n | ColumnSnapshotProvider\n | ColumnSnapshot[]\n | PColumn<PColumnDataUniversal | undefined>[];\n\n// --- ArrayColumnProvider ---\n\n/**\n * Simple provider wrapping an array of PColumns.\n * Always complete, data status always 'ready'.\n */\nexport class ArrayColumnProvider implements ColumnSnapshotProvider {\n private readonly columns: ColumnSnapshot[];\n\n constructor(columns: PColumn<PColumnDataUniversal | undefined>[]) {\n this.columns = columns.map((col) => ({\n id: col.id,\n spec: col.spec,\n dataStatus: \"ready\" as const,\n data: { get: () => col.data },\n }));\n }\n\n getAllColumns(): ColumnSnapshot[] {\n return this.columns;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- SnapshotColumnProvider ---\n\n/**\n * Provider wrapping an array of ColumnSnapshots.\n * Always complete. Data status taken from each snapshot.\n */\nexport class SnapshotColumnProvider implements ColumnSnapshotProvider {\n constructor(private readonly snapshots: ColumnSnapshot[]) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.snapshots;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- OutputColumnProvider ---\n\nexport interface OutputColumnProviderOpts {\n /** When true and the accessor is final, columns with no ready data get status 'absent'. */\n allowPermanentAbsence?: boolean;\n}\n\n/**\n * Provider wrapping a TreeNodeAccessor (output/prerun resolve result).\n * Detects data status from accessor readiness state.\n */\nexport class OutputColumnProvider implements ColumnSnapshotProvider {\n constructor(\n private readonly accessor: TreeNodeAccessor,\n private readonly opts?: OutputColumnProviderOpts,\n ) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.getColumns();\n }\n\n isColumnListComplete(): boolean {\n return this.accessor.getInputsLocked();\n }\n\n private getColumns(): ColumnSnapshot[] {\n const pColumns = this.accessor.getPColumns();\n if (pColumns === undefined) return [];\n\n const isFinal = this.accessor.getIsFinal();\n const allowAbsence = this.opts?.allowPermanentAbsence === true;\n\n return pColumns.map((col) => {\n const dataAccessor = col.data;\n const isReady = dataAccessor.getIsReadyOrError();\n\n let dataStatus: ColumnDataStatus;\n if (isReady) {\n dataStatus = \"ready\";\n } else if (allowAbsence && isFinal) {\n dataStatus = \"absent\";\n } else {\n dataStatus = \"computing\";\n }\n\n return {\n id: col.id,\n spec: col.spec,\n dataStatus,\n data: { get: () => (isReady ? dataAccessor : undefined) },\n };\n });\n }\n}\n\n// --- Source normalization ---\n\n/** Checks if a value is a ColumnSnapshotProvider (duck-typing). */\nexport function isColumnSnapshotProvider(source: unknown): source is ColumnSnapshotProvider {\n return (\n typeof source === \"object\" &&\n source !== null &&\n \"getAllColumns\" in source &&\n \"isColumnListComplete\" in source &&\n typeof (source as ColumnSnapshotProvider).getAllColumns === \"function\" &&\n typeof (source as ColumnSnapshotProvider).isColumnListComplete === \"function\"\n );\n}\n\n/** Checks if a value looks like a PColumn (has id, spec, data). */\nfunction isPColumnArray(source: unknown): source is PColumn<PColumnDataUniversal | undefined>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as PColumn[]\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"data\" in first && !(\"dataStatus\" in first);\n}\n\n/** Checks if a value looks like a ColumnSnapshot array. */\nfunction isColumnSnapshotArray(source: unknown): source is ColumnSnapshot[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as snapshots\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"dataStatus\" in first;\n}\n\n/**\n * Normalize any ColumnSource into a ColumnSnapshotProvider.\n * - ColumnSnapshotProvider → returned as-is\n * - ColumnSnapshot[] → wrapped in SnapshotColumnProvider\n * - PColumn[] → wrapped in ArrayColumnProvider\n */\nexport function toColumnSnapshotProvider(source: ColumnSource): ColumnSnapshotProvider {\n if (isColumnSnapshotProvider(source)) return source;\n if (isColumnSnapshotArray(source)) return new SnapshotColumnProvider(source);\n if (isPColumnArray(source)) return new ArrayColumnProvider(source);\n // Should not reach here given the type union, but be safe\n throw new Error(\"Unknown ColumnSource type\");\n}\n"],"mappings":";;;;;AAwCA,IAAa,sBAAb,MAAmE;CACjE,AAAiB;CAEjB,YAAY,SAAsD;AAChE,OAAK,UAAU,QAAQ,KAAK,SAAS;GACnC,IAAI,IAAI;GACR,MAAM,IAAI;GACV,YAAY;GACZ,MAAM,EAAE,WAAW,IAAI,MAAM;GAC9B,EAAE;;CAGL,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAUX,IAAa,yBAAb,MAAsE;CACpE,YAAY,AAAiB,WAA6B;EAA7B;;CAE7B,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAeX,IAAa,uBAAb,MAAoE;CAClE,YACE,AAAiB,UACjB,AAAiB,MACjB;EAFiB;EACA;;CAGnB,gBAAkC;AAChC,SAAO,KAAK,YAAY;;CAG1B,uBAAgC;AAC9B,SAAO,KAAK,SAAS,iBAAiB;;CAGxC,AAAQ,aAA+B;EACrC,MAAM,WAAW,KAAK,SAAS,aAAa;AAC5C,MAAI,aAAa,OAAW,QAAO,EAAE;EAErC,MAAM,UAAU,KAAK,SAAS,YAAY;EAC1C,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAE1D,SAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,eAAe,IAAI;GACzB,MAAM,UAAU,aAAa,mBAAmB;GAEhD,IAAI;AACJ,OAAI,QACF,cAAa;YACJ,gBAAgB,QACzB,cAAa;OAEb,cAAa;AAGf,UAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV;IACA,MAAM,EAAE,WAAY,UAAU,eAAe,QAAY;IAC1D;IACD;;;;AAON,SAAgB,yBAAyB,QAAmD;AAC1F,QACE,OAAO,WAAW,YAClB,WAAW,QACX,mBAAmB,UACnB,0BAA0B,UAC1B,OAAQ,OAAkC,kBAAkB,cAC5D,OAAQ,OAAkC,yBAAyB;;;AAKvE,SAAS,eAAe,QAAwE;AAC9F,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,UAAU,SAAS,EAAE,gBAAgB;;;AAIlF,SAAS,sBAAsB,QAA6C;AAC1E,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,gBAAgB;;;;;;;;AAS7D,SAAgB,yBAAyB,QAA8C;AACrF,KAAI,yBAAyB,OAAO,CAAE,QAAO;AAC7C,KAAI,sBAAsB,OAAO,CAAE,QAAO,IAAI,uBAAuB,OAAO;AAC5E,KAAI,eAAe,OAAO,CAAE,QAAO,IAAI,oBAAoB,OAAO;AAElE,OAAM,IAAI,MAAM,4BAA4B"}
1
+ {"version":3,"file":"column_snapshot_provider.js","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import { PColumn } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n// --- ColumnProvider ---\n\n/**\n * Data source interface for column enumeration.\n *\n * Knows nothing about the render framework, stability tracking, labels,\n * anchoring, or splitting. All that complexity lives in the collection layer.\n */\nexport interface ColumnSnapshotProvider {\n /** Returns all currently known columns. */\n getAllColumns(): ColumnSnapshot[];\n\n /** Whether the provider has finished enumerating all its columns.\n * Calling this may mark the render context unstable — it touches\n * the reactive tree to check field resolution state. */\n isColumnListComplete(): boolean;\n}\n\n// --- ColumnSource ---\n\n/**\n * Union of types that can serve as column sources for helpers and builders.\n * Does NOT include TreeNodeAccessor — call `.toColumnSource()` on it first.\n */\nexport type ColumnSource =\n | ColumnSnapshotProvider\n | ColumnSnapshot[]\n | PColumn<PColumnDataUniversal | undefined>[];\n\n// --- ArrayColumnProvider ---\n\n/**\n * Simple provider wrapping an array of PColumns.\n * Always complete, data status always 'ready'.\n */\nexport class ArrayColumnProvider implements ColumnSnapshotProvider {\n private readonly columns: ColumnSnapshot[];\n\n constructor(columns: PColumn<PColumnDataUniversal | undefined>[]) {\n this.columns = columns.map((col) => ({\n id: col.id,\n spec: col.spec,\n dataStatus: \"ready\" as const,\n data: { get: () => col.data },\n }));\n }\n\n getAllColumns(): ColumnSnapshot[] {\n return this.columns;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- SnapshotColumnProvider ---\n\n/**\n * Provider wrapping an array of ColumnSnapshots.\n * Always complete. Data status taken from each snapshot.\n */\nexport class SnapshotColumnProvider implements ColumnSnapshotProvider {\n constructor(private readonly snapshots: ColumnSnapshot[]) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.snapshots;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\n// --- OutputColumnProvider ---\n\nexport interface OutputColumnProviderOpts {\n /** When true and the accessor is final, columns with no ready data get status 'absent'. */\n allowPermanentAbsence?: boolean;\n}\n\n/**\n * Provider wrapping a TreeNodeAccessor (output/prerun resolve result).\n * Detects data status from accessor readiness state.\n */\nexport class OutputColumnProvider implements ColumnSnapshotProvider {\n constructor(\n private readonly accessor: TreeNodeAccessor,\n private readonly opts?: OutputColumnProviderOpts,\n ) {}\n\n getAllColumns(): ColumnSnapshot[] {\n return this.getColumns();\n }\n\n isColumnListComplete(): boolean {\n return this.accessor.getInputsLocked();\n }\n\n private getColumns(): ColumnSnapshot[] {\n const pColumns = this.accessor.getPColumns();\n if (pColumns === undefined) return [];\n\n const isFinal = this.accessor.getIsFinal();\n const allowAbsence = this.opts?.allowPermanentAbsence === true;\n\n return pColumns.map((col) => {\n const dataAccessor = col.data;\n const isReady = dataAccessor.getIsReadyOrError();\n\n let dataStatus: ColumnDataStatus;\n if (isReady) {\n dataStatus = \"ready\";\n } else if (allowAbsence && isFinal) {\n dataStatus = \"absent\";\n } else {\n dataStatus = \"computing\";\n }\n\n return {\n id: col.id,\n spec: col.spec,\n dataStatus,\n data: { get: () => (isReady ? dataAccessor : undefined) },\n };\n });\n }\n}\n\n// --- Source normalization ---\n\n/** Checks if a value is a ColumnSnapshotProvider (duck-typing). */\nexport function isColumnSnapshotProvider(source: unknown): source is ColumnSnapshotProvider {\n return (\n typeof source === \"object\" &&\n source !== null &&\n \"getAllColumns\" in source &&\n \"isColumnListComplete\" in source &&\n typeof (source as ColumnSnapshotProvider).getAllColumns === \"function\" &&\n typeof (source as ColumnSnapshotProvider).isColumnListComplete === \"function\"\n );\n}\n\n/** Checks if a value looks like a PColumn (has id, spec, data). */\nfunction isPColumnArray(source: unknown): source is PColumn<PColumnDataUniversal | undefined>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as PColumn[]\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"data\" in first && !(\"dataStatus\" in first);\n}\n\n/** Checks if a value looks like a ColumnSnapshot array. */\nfunction isColumnSnapshotArray(source: unknown): source is ColumnSnapshot[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as snapshots\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"dataStatus\" in first;\n}\n\n/**\n * Normalize any ColumnSource into a ColumnSnapshotProvider.\n * - ColumnSnapshotProvider → returned as-is\n * - ColumnSnapshot[] → wrapped in SnapshotColumnProvider\n * - PColumn[] → wrapped in ArrayColumnProvider\n */\nexport function toColumnSnapshotProvider(source: ColumnSource): ColumnSnapshotProvider {\n if (isColumnSnapshotProvider(source)) return source;\n if (isColumnSnapshotArray(source)) return new SnapshotColumnProvider(source);\n if (isPColumnArray(source)) return new ArrayColumnProvider(source);\n // Should not reach here given the type union, but be safe\n throw new Error(\"Unknown ColumnSource type\");\n}\n"],"mappings":";;;;;AAwCA,IAAa,sBAAb,MAAmE;CACjE;CAEA,YAAY,SAAsD;AAChE,OAAK,UAAU,QAAQ,KAAK,SAAS;GACnC,IAAI,IAAI;GACR,MAAM,IAAI;GACV,YAAY;GACZ,MAAM,EAAE,WAAW,IAAI,MAAM;GAC9B,EAAE;;CAGL,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAUX,IAAa,yBAAb,MAAsE;CACpE,YAAY,WAA8C;AAA7B,OAAA,YAAA;;CAE7B,gBAAkC;AAChC,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAeX,IAAa,uBAAb,MAAoE;CAClE,YACE,UACA,MACA;AAFiB,OAAA,WAAA;AACA,OAAA,OAAA;;CAGnB,gBAAkC;AAChC,SAAO,KAAK,YAAY;;CAG1B,uBAAgC;AAC9B,SAAO,KAAK,SAAS,iBAAiB;;CAGxC,aAAuC;EACrC,MAAM,WAAW,KAAK,SAAS,aAAa;AAC5C,MAAI,aAAa,KAAA,EAAW,QAAO,EAAE;EAErC,MAAM,UAAU,KAAK,SAAS,YAAY;EAC1C,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAE1D,SAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,eAAe,IAAI;GACzB,MAAM,UAAU,aAAa,mBAAmB;GAEhD,IAAI;AACJ,OAAI,QACF,cAAa;YACJ,gBAAgB,QACzB,cAAa;OAEb,cAAa;AAGf,UAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV;IACA,MAAM,EAAE,WAAY,UAAU,eAAe,KAAA,GAAY;IAC1D;IACD;;;;AAON,SAAgB,yBAAyB,QAAmD;AAC1F,QACE,OAAO,WAAW,YAClB,WAAW,QACX,mBAAmB,UACnB,0BAA0B,UAC1B,OAAQ,OAAkC,kBAAkB,cAC5D,OAAQ,OAAkC,yBAAyB;;;AAKvE,SAAS,eAAe,QAAwE;AAC9F,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,UAAU,SAAS,EAAE,gBAAgB;;;AAIlF,SAAS,sBAAsB,QAA6C;AAC1E,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,gBAAgB;;;;;;;;AAS7D,SAAgB,yBAAyB,QAA8C;AACrF,KAAI,yBAAyB,OAAO,CAAE,QAAO;AAC7C,KAAI,sBAAsB,OAAO,CAAE,QAAO,IAAI,uBAAuB,OAAO;AAC5E,KAAI,eAAe,OAAO,CAAE,QAAO,IAAI,oBAAoB,OAAO;AAElE,OAAM,IAAI,MAAM,4BAA4B"}
@@ -1,7 +1,6 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_column_snapshot_provider = require('./column_snapshot_provider.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_column_snapshot_provider = require("./column_snapshot_provider.cjs");
3
3
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
4
-
5
4
  //#region src/columns/ctx_column_sources.ts
6
5
  /**
7
6
  * Collect ColumnSnapshotProviders from all render context sources:
@@ -77,8 +76,8 @@ function walkTree(node, out) {
77
76
  if (child) walkTree(child, out);
78
77
  }
79
78
  }
80
-
81
79
  //#endregion
82
80
  exports.ResultPoolColumnSnapshotProvider = ResultPoolColumnSnapshotProvider;
83
81
  exports.collectCtxColumnSnapshotProviders = collectCtxColumnSnapshotProviders;
82
+
84
83
  //# sourceMappingURL=ctx_column_sources.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ctx_column_sources.cjs","names":["ResourceTypeName","OutputColumnProvider"],"sources":["../../src/columns/ctx_column_sources.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { RenderCtxBase, ResultPool } from \"../render\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnDataStatus } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider } from \"./column_snapshot_provider\";\nimport { OutputColumnProvider } from \"./column_snapshot_provider\";\nimport { ResourceTypeName } from \"@milaboratories/pl-model-common\";\nimport type { ValueOf } from \"@milaboratories/helpers\";\n\n/**\n * Collect ColumnSnapshotProviders from all render context sources:\n *\n * - **resultPool** — all upstream columns (always included)\n * - **outputs** — PFrame fields from block execution outputs\n * - **prerun** — PFrame fields from prerun/staging results\n *\n * Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.\n */\nexport function collectCtxColumnSnapshotProviders<A, U, S>(\n ctx: RenderCtxBase<A, U, S>,\n): ColumnSnapshotProvider[] {\n const providers: ColumnSnapshotProvider[] = [];\n\n // ResultPool — all upstream columns\n providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));\n\n // Outputs — each PFrame-like output field becomes a provider\n const outputs = ctx.outputs;\n if (outputs) {\n providers.push(...collectPFrameProviders(outputs));\n }\n\n // Prerun — same treatment as outputs\n const prerun = ctx.prerun;\n if (prerun) {\n providers.push(...collectPFrameProviders(prerun));\n }\n\n return providers;\n}\n\n/**\n * Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.\n *\n * - `isColumnListComplete()` always returns true — the result pool\n * is a stable snapshot within a single render cycle.\n * - Data status is derived from the underlying TreeNodeAccessor:\n * ready (getIsReadyOrError), computing, or absent (no data resource).\n */\nexport class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {\n constructor(private readonly pool: ResultPool) {}\n\n getAllColumns(): ColumnSnapshot[] {\n const pColumns = this.pool.selectColumns(() => true);\n return pColumns.map((col) => toSnapshot(col.id, col.spec, col.data));\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nfunction toSnapshot(\n id: PObjectId,\n spec: PColumnSpec,\n accessor: TreeNodeAccessor | undefined,\n): ColumnSnapshot {\n if (accessor === undefined) {\n return { id, spec, dataStatus: \"absent\" as ColumnDataStatus, data: undefined };\n }\n const isReady = accessor.getIsReadyOrError();\n return {\n id,\n spec,\n dataStatus: (isReady ? \"ready\" : \"computing\") as ColumnDataStatus,\n data: { get: () => (isReady ? accessor : undefined) },\n };\n}\n\n/**\n * Recursively walk the output tree starting from `accessor`.\n * - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.\n * - If a node's resourceType is StdMap/std/map → recurse into its output fields.\n * - Otherwise → skip (leaf of unknown type).\n */\nfunction collectPFrameProviders(accessor: TreeNodeAccessor): ColumnSnapshotProvider[] {\n const out: ColumnSnapshotProvider[] = [];\n walkTree(accessor, out);\n return out;\n}\n\nfunction walkTree(node: TreeNodeAccessor, out: ColumnSnapshotProvider[]): void {\n const typeName = node.resourceType.name as ValueOf<typeof ResourceTypeName>;\n\n if (typeName === ResourceTypeName.PFrame) {\n out.push(new OutputColumnProvider(node));\n return;\n }\n\n if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) {\n for (const field of node.listInputFields()) {\n const child = node.resolve(field);\n if (child) walkTree(child, out);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAgB,kCACd,KAC0B;CAC1B,MAAM,YAAsC,EAAE;AAG9C,WAAU,KAAK,IAAI,iCAAiC,IAAI,WAAW,CAAC;CAGpE,MAAM,UAAU,IAAI;AACpB,KAAI,QACF,WAAU,KAAK,GAAG,uBAAuB,QAAQ,CAAC;CAIpD,MAAM,SAAS,IAAI;AACnB,KAAI,OACF,WAAU,KAAK,GAAG,uBAAuB,OAAO,CAAC;AAGnD,QAAO;;;;;;;;;;AAWT,IAAa,mCAAb,MAAgF;CAC9E,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,gBAAkC;AAEhC,SADiB,KAAK,KAAK,oBAAoB,KAAK,CACpC,KAAK,QAAQ,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;;CAGtE,uBAAgC;AAC9B,SAAO;;;AAIX,SAAS,WACP,IACA,MACA,UACgB;AAChB,KAAI,aAAa,OACf,QAAO;EAAE;EAAI;EAAM,YAAY;EAA8B,MAAM;EAAW;CAEhF,MAAM,UAAU,SAAS,mBAAmB;AAC5C,QAAO;EACL;EACA;EACA,YAAa,UAAU,UAAU;EACjC,MAAM,EAAE,WAAY,UAAU,WAAW,QAAY;EACtD;;;;;;;;AASH,SAAS,uBAAuB,UAAsD;CACpF,MAAM,MAAgC,EAAE;AACxC,UAAS,UAAU,IAAI;AACvB,QAAO;;AAGT,SAAS,SAAS,MAAwB,KAAqC;CAC7E,MAAM,WAAW,KAAK,aAAa;AAEnC,KAAI,aAAaA,iDAAiB,QAAQ;AACxC,MAAI,KAAK,IAAIC,sDAAqB,KAAK,CAAC;AACxC;;AAGF,KAAI,aAAaD,iDAAiB,UAAU,aAAaA,iDAAiB,YACxE,MAAK,MAAM,SAAS,KAAK,iBAAiB,EAAE;EAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,MAAI,MAAO,UAAS,OAAO,IAAI"}
1
+ {"version":3,"file":"ctx_column_sources.cjs","names":["ResourceTypeName","OutputColumnProvider"],"sources":["../../src/columns/ctx_column_sources.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { RenderCtxBase, ResultPool } from \"../render\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnDataStatus } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider } from \"./column_snapshot_provider\";\nimport { OutputColumnProvider } from \"./column_snapshot_provider\";\nimport { ResourceTypeName } from \"@milaboratories/pl-model-common\";\nimport type { ValueOf } from \"@milaboratories/helpers\";\n\n/**\n * Collect ColumnSnapshotProviders from all render context sources:\n *\n * - **resultPool** — all upstream columns (always included)\n * - **outputs** — PFrame fields from block execution outputs\n * - **prerun** — PFrame fields from prerun/staging results\n *\n * Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.\n */\nexport function collectCtxColumnSnapshotProviders<A, U, S>(\n ctx: RenderCtxBase<A, U, S>,\n): ColumnSnapshotProvider[] {\n const providers: ColumnSnapshotProvider[] = [];\n\n // ResultPool — all upstream columns\n providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));\n\n // Outputs — each PFrame-like output field becomes a provider\n const outputs = ctx.outputs;\n if (outputs) {\n providers.push(...collectPFrameProviders(outputs));\n }\n\n // Prerun — same treatment as outputs\n const prerun = ctx.prerun;\n if (prerun) {\n providers.push(...collectPFrameProviders(prerun));\n }\n\n return providers;\n}\n\n/**\n * Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.\n *\n * - `isColumnListComplete()` always returns true — the result pool\n * is a stable snapshot within a single render cycle.\n * - Data status is derived from the underlying TreeNodeAccessor:\n * ready (getIsReadyOrError), computing, or absent (no data resource).\n */\nexport class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {\n constructor(private readonly pool: ResultPool) {}\n\n getAllColumns(): ColumnSnapshot[] {\n const pColumns = this.pool.selectColumns(() => true);\n return pColumns.map((col) => toSnapshot(col.id, col.spec, col.data));\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nfunction toSnapshot(\n id: PObjectId,\n spec: PColumnSpec,\n accessor: TreeNodeAccessor | undefined,\n): ColumnSnapshot {\n if (accessor === undefined) {\n return { id, spec, dataStatus: \"absent\" as ColumnDataStatus, data: undefined };\n }\n const isReady = accessor.getIsReadyOrError();\n return {\n id,\n spec,\n dataStatus: (isReady ? \"ready\" : \"computing\") as ColumnDataStatus,\n data: { get: () => (isReady ? accessor : undefined) },\n };\n}\n\n/**\n * Recursively walk the output tree starting from `accessor`.\n * - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.\n * - If a node's resourceType is StdMap/std/map → recurse into its output fields.\n * - Otherwise → skip (leaf of unknown type).\n */\nfunction collectPFrameProviders(accessor: TreeNodeAccessor): ColumnSnapshotProvider[] {\n const out: ColumnSnapshotProvider[] = [];\n walkTree(accessor, out);\n return out;\n}\n\nfunction walkTree(node: TreeNodeAccessor, out: ColumnSnapshotProvider[]): void {\n const typeName = node.resourceType.name as ValueOf<typeof ResourceTypeName>;\n\n if (typeName === ResourceTypeName.PFrame) {\n out.push(new OutputColumnProvider(node));\n return;\n }\n\n if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) {\n for (const field of node.listInputFields()) {\n const child = node.resolve(field);\n if (child) walkTree(child, out);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBA,SAAgB,kCACd,KAC0B;CAC1B,MAAM,YAAsC,EAAE;AAG9C,WAAU,KAAK,IAAI,iCAAiC,IAAI,WAAW,CAAC;CAGpE,MAAM,UAAU,IAAI;AACpB,KAAI,QACF,WAAU,KAAK,GAAG,uBAAuB,QAAQ,CAAC;CAIpD,MAAM,SAAS,IAAI;AACnB,KAAI,OACF,WAAU,KAAK,GAAG,uBAAuB,OAAO,CAAC;AAGnD,QAAO;;;;;;;;;;AAWT,IAAa,mCAAb,MAAgF;CAC9E,YAAY,MAAmC;AAAlB,OAAA,OAAA;;CAE7B,gBAAkC;AAEhC,SADiB,KAAK,KAAK,oBAAoB,KAAK,CACpC,KAAK,QAAQ,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;;CAGtE,uBAAgC;AAC9B,SAAO;;;AAIX,SAAS,WACP,IACA,MACA,UACgB;AAChB,KAAI,aAAa,KAAA,EACf,QAAO;EAAE;EAAI;EAAM,YAAY;EAA8B,MAAM,KAAA;EAAW;CAEhF,MAAM,UAAU,SAAS,mBAAmB;AAC5C,QAAO;EACL;EACA;EACA,YAAa,UAAU,UAAU;EACjC,MAAM,EAAE,WAAY,UAAU,WAAW,KAAA,GAAY;EACtD;;;;;;;;AASH,SAAS,uBAAuB,UAAsD;CACpF,MAAM,MAAgC,EAAE;AACxC,UAAS,UAAU,IAAI;AACvB,QAAO;;AAGT,SAAS,SAAS,MAAwB,KAAqC;CAC7E,MAAM,WAAW,KAAK,aAAa;AAEnC,KAAI,aAAaA,gCAAAA,iBAAiB,QAAQ;AACxC,MAAI,KAAK,IAAIC,iCAAAA,qBAAqB,KAAK,CAAC;AACxC;;AAGF,KAAI,aAAaD,gCAAAA,iBAAiB,UAAU,aAAaA,gCAAAA,iBAAiB,YACxE,MAAK,MAAM,SAAS,KAAK,iBAAiB,EAAE;EAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,MAAI,MAAO,UAAS,OAAO,IAAI"}
@@ -1,5 +1,4 @@
1
1
  import { RenderCtxBase, ResultPool } from "../render/api.js";
2
- import "../render/index.js";
3
2
  import { ColumnSnapshot } from "./column_snapshot.js";
4
3
  import { ColumnSnapshotProvider } from "./column_snapshot_provider.js";
5
4
 
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctx_column_sources.d.ts","names":[],"sources":["../../src/columns/ctx_column_sources.ts"],"mappings":";;;;;;;;AAmBA;;;;;;iBAAgB,iCAAA,SAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAA,IACxB,sBAAA;;;;;;;;;cA6BU,gCAAA,YAA4C,sBAAA;EAAA,iBAC1B,IAAA;cAAA,IAAA,EAAM,UAAA;EAEnC,aAAA,CAAA,GAAiB,cAAA;EAKjB,oBAAA,CAAA;AAAA"}
@@ -1,6 +1,5 @@
1
1
  import { OutputColumnProvider } from "./column_snapshot_provider.js";
2
2
  import { ResourceTypeName } from "@milaboratories/pl-model-common";
3
-
4
3
  //#region src/columns/ctx_column_sources.ts
5
4
  /**
6
5
  * Collect ColumnSnapshotProviders from all render context sources:
@@ -76,7 +75,7 @@ function walkTree(node, out) {
76
75
  if (child) walkTree(child, out);
77
76
  }
78
77
  }
79
-
80
78
  //#endregion
81
79
  export { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders };
80
+
82
81
  //# sourceMappingURL=ctx_column_sources.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ctx_column_sources.js","names":[],"sources":["../../src/columns/ctx_column_sources.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { RenderCtxBase, ResultPool } from \"../render\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnDataStatus } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider } from \"./column_snapshot_provider\";\nimport { OutputColumnProvider } from \"./column_snapshot_provider\";\nimport { ResourceTypeName } from \"@milaboratories/pl-model-common\";\nimport type { ValueOf } from \"@milaboratories/helpers\";\n\n/**\n * Collect ColumnSnapshotProviders from all render context sources:\n *\n * - **resultPool** — all upstream columns (always included)\n * - **outputs** — PFrame fields from block execution outputs\n * - **prerun** — PFrame fields from prerun/staging results\n *\n * Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.\n */\nexport function collectCtxColumnSnapshotProviders<A, U, S>(\n ctx: RenderCtxBase<A, U, S>,\n): ColumnSnapshotProvider[] {\n const providers: ColumnSnapshotProvider[] = [];\n\n // ResultPool — all upstream columns\n providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));\n\n // Outputs — each PFrame-like output field becomes a provider\n const outputs = ctx.outputs;\n if (outputs) {\n providers.push(...collectPFrameProviders(outputs));\n }\n\n // Prerun — same treatment as outputs\n const prerun = ctx.prerun;\n if (prerun) {\n providers.push(...collectPFrameProviders(prerun));\n }\n\n return providers;\n}\n\n/**\n * Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.\n *\n * - `isColumnListComplete()` always returns true — the result pool\n * is a stable snapshot within a single render cycle.\n * - Data status is derived from the underlying TreeNodeAccessor:\n * ready (getIsReadyOrError), computing, or absent (no data resource).\n */\nexport class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {\n constructor(private readonly pool: ResultPool) {}\n\n getAllColumns(): ColumnSnapshot[] {\n const pColumns = this.pool.selectColumns(() => true);\n return pColumns.map((col) => toSnapshot(col.id, col.spec, col.data));\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nfunction toSnapshot(\n id: PObjectId,\n spec: PColumnSpec,\n accessor: TreeNodeAccessor | undefined,\n): ColumnSnapshot {\n if (accessor === undefined) {\n return { id, spec, dataStatus: \"absent\" as ColumnDataStatus, data: undefined };\n }\n const isReady = accessor.getIsReadyOrError();\n return {\n id,\n spec,\n dataStatus: (isReady ? \"ready\" : \"computing\") as ColumnDataStatus,\n data: { get: () => (isReady ? accessor : undefined) },\n };\n}\n\n/**\n * Recursively walk the output tree starting from `accessor`.\n * - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.\n * - If a node's resourceType is StdMap/std/map → recurse into its output fields.\n * - Otherwise → skip (leaf of unknown type).\n */\nfunction collectPFrameProviders(accessor: TreeNodeAccessor): ColumnSnapshotProvider[] {\n const out: ColumnSnapshotProvider[] = [];\n walkTree(accessor, out);\n return out;\n}\n\nfunction walkTree(node: TreeNodeAccessor, out: ColumnSnapshotProvider[]): void {\n const typeName = node.resourceType.name as ValueOf<typeof ResourceTypeName>;\n\n if (typeName === ResourceTypeName.PFrame) {\n out.push(new OutputColumnProvider(node));\n return;\n }\n\n if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) {\n for (const field of node.listInputFields()) {\n const child = node.resolve(field);\n if (child) walkTree(child, out);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBA,SAAgB,kCACd,KAC0B;CAC1B,MAAM,YAAsC,EAAE;AAG9C,WAAU,KAAK,IAAI,iCAAiC,IAAI,WAAW,CAAC;CAGpE,MAAM,UAAU,IAAI;AACpB,KAAI,QACF,WAAU,KAAK,GAAG,uBAAuB,QAAQ,CAAC;CAIpD,MAAM,SAAS,IAAI;AACnB,KAAI,OACF,WAAU,KAAK,GAAG,uBAAuB,OAAO,CAAC;AAGnD,QAAO;;;;;;;;;;AAWT,IAAa,mCAAb,MAAgF;CAC9E,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,gBAAkC;AAEhC,SADiB,KAAK,KAAK,oBAAoB,KAAK,CACpC,KAAK,QAAQ,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;;CAGtE,uBAAgC;AAC9B,SAAO;;;AAIX,SAAS,WACP,IACA,MACA,UACgB;AAChB,KAAI,aAAa,OACf,QAAO;EAAE;EAAI;EAAM,YAAY;EAA8B,MAAM;EAAW;CAEhF,MAAM,UAAU,SAAS,mBAAmB;AAC5C,QAAO;EACL;EACA;EACA,YAAa,UAAU,UAAU;EACjC,MAAM,EAAE,WAAY,UAAU,WAAW,QAAY;EACtD;;;;;;;;AASH,SAAS,uBAAuB,UAAsD;CACpF,MAAM,MAAgC,EAAE;AACxC,UAAS,UAAU,IAAI;AACvB,QAAO;;AAGT,SAAS,SAAS,MAAwB,KAAqC;CAC7E,MAAM,WAAW,KAAK,aAAa;AAEnC,KAAI,aAAa,iBAAiB,QAAQ;AACxC,MAAI,KAAK,IAAI,qBAAqB,KAAK,CAAC;AACxC;;AAGF,KAAI,aAAa,iBAAiB,UAAU,aAAa,iBAAiB,YACxE,MAAK,MAAM,SAAS,KAAK,iBAAiB,EAAE;EAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,MAAI,MAAO,UAAS,OAAO,IAAI"}
1
+ {"version":3,"file":"ctx_column_sources.js","names":[],"sources":["../../src/columns/ctx_column_sources.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { RenderCtxBase, ResultPool } from \"../render\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnDataStatus } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider } from \"./column_snapshot_provider\";\nimport { OutputColumnProvider } from \"./column_snapshot_provider\";\nimport { ResourceTypeName } from \"@milaboratories/pl-model-common\";\nimport type { ValueOf } from \"@milaboratories/helpers\";\n\n/**\n * Collect ColumnSnapshotProviders from all render context sources:\n *\n * - **resultPool** — all upstream columns (always included)\n * - **outputs** — PFrame fields from block execution outputs\n * - **prerun** — PFrame fields from prerun/staging results\n *\n * Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.\n */\nexport function collectCtxColumnSnapshotProviders<A, U, S>(\n ctx: RenderCtxBase<A, U, S>,\n): ColumnSnapshotProvider[] {\n const providers: ColumnSnapshotProvider[] = [];\n\n // ResultPool — all upstream columns\n providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));\n\n // Outputs — each PFrame-like output field becomes a provider\n const outputs = ctx.outputs;\n if (outputs) {\n providers.push(...collectPFrameProviders(outputs));\n }\n\n // Prerun — same treatment as outputs\n const prerun = ctx.prerun;\n if (prerun) {\n providers.push(...collectPFrameProviders(prerun));\n }\n\n return providers;\n}\n\n/**\n * Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.\n *\n * - `isColumnListComplete()` always returns true — the result pool\n * is a stable snapshot within a single render cycle.\n * - Data status is derived from the underlying TreeNodeAccessor:\n * ready (getIsReadyOrError), computing, or absent (no data resource).\n */\nexport class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {\n constructor(private readonly pool: ResultPool) {}\n\n getAllColumns(): ColumnSnapshot[] {\n const pColumns = this.pool.selectColumns(() => true);\n return pColumns.map((col) => toSnapshot(col.id, col.spec, col.data));\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nfunction toSnapshot(\n id: PObjectId,\n spec: PColumnSpec,\n accessor: TreeNodeAccessor | undefined,\n): ColumnSnapshot {\n if (accessor === undefined) {\n return { id, spec, dataStatus: \"absent\" as ColumnDataStatus, data: undefined };\n }\n const isReady = accessor.getIsReadyOrError();\n return {\n id,\n spec,\n dataStatus: (isReady ? \"ready\" : \"computing\") as ColumnDataStatus,\n data: { get: () => (isReady ? accessor : undefined) },\n };\n}\n\n/**\n * Recursively walk the output tree starting from `accessor`.\n * - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.\n * - If a node's resourceType is StdMap/std/map → recurse into its output fields.\n * - Otherwise → skip (leaf of unknown type).\n */\nfunction collectPFrameProviders(accessor: TreeNodeAccessor): ColumnSnapshotProvider[] {\n const out: ColumnSnapshotProvider[] = [];\n walkTree(accessor, out);\n return out;\n}\n\nfunction walkTree(node: TreeNodeAccessor, out: ColumnSnapshotProvider[]): void {\n const typeName = node.resourceType.name as ValueOf<typeof ResourceTypeName>;\n\n if (typeName === ResourceTypeName.PFrame) {\n out.push(new OutputColumnProvider(node));\n return;\n }\n\n if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) {\n for (const field of node.listInputFields()) {\n const child = node.resolve(field);\n if (child) walkTree(child, out);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AAmBA,SAAgB,kCACd,KAC0B;CAC1B,MAAM,YAAsC,EAAE;AAG9C,WAAU,KAAK,IAAI,iCAAiC,IAAI,WAAW,CAAC;CAGpE,MAAM,UAAU,IAAI;AACpB,KAAI,QACF,WAAU,KAAK,GAAG,uBAAuB,QAAQ,CAAC;CAIpD,MAAM,SAAS,IAAI;AACnB,KAAI,OACF,WAAU,KAAK,GAAG,uBAAuB,OAAO,CAAC;AAGnD,QAAO;;;;;;;;;;AAWT,IAAa,mCAAb,MAAgF;CAC9E,YAAY,MAAmC;AAAlB,OAAA,OAAA;;CAE7B,gBAAkC;AAEhC,SADiB,KAAK,KAAK,oBAAoB,KAAK,CACpC,KAAK,QAAQ,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;;CAGtE,uBAAgC;AAC9B,SAAO;;;AAIX,SAAS,WACP,IACA,MACA,UACgB;AAChB,KAAI,aAAa,KAAA,EACf,QAAO;EAAE;EAAI;EAAM,YAAY;EAA8B,MAAM,KAAA;EAAW;CAEhF,MAAM,UAAU,SAAS,mBAAmB;AAC5C,QAAO;EACL;EACA;EACA,YAAa,UAAU,UAAU;EACjC,MAAM,EAAE,WAAY,UAAU,WAAW,KAAA,GAAY;EACtD;;;;;;;;AASH,SAAS,uBAAuB,UAAsD;CACpF,MAAM,MAAgC,EAAE;AACxC,UAAS,UAAU,IAAI;AACvB,QAAO;;AAGT,SAAS,SAAS,MAAwB,KAAqC;CAC7E,MAAM,WAAW,KAAK,aAAa;AAEnC,KAAI,aAAa,iBAAiB,QAAQ;AACxC,MAAI,KAAK,IAAI,qBAAqB,KAAK,CAAC;AACxC;;AAGF,KAAI,aAAa,iBAAiB,UAAU,aAAa,iBAAiB,YACxE,MAAK,MAAM,SAAS,KAAK,iBAAiB,EAAE;EAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,MAAI,MAAO,UAAS,OAAO,IAAI"}
@@ -1,5 +1,5 @@
1
- const require_column_snapshot = require('./column_snapshot.cjs');
2
- const require_column_snapshot_provider = require('./column_snapshot_provider.cjs');
3
- const require_column_selector = require('./column_selector.cjs');
4
- const require_column_collection_builder = require('./column_collection_builder.cjs');
5
- const require_ctx_column_sources = require('./ctx_column_sources.cjs');
1
+ require("./column_snapshot.cjs");
2
+ require("./column_snapshot_provider.cjs");
3
+ require("./column_selector.cjs");
4
+ require("./column_collection_builder.cjs");
5
+ require("./ctx_column_sources.cjs");
@@ -1,5 +1,5 @@
1
- import { createColumnSnapshot, createReadyColumnData } from "./column_snapshot.js";
2
- import { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
3
- import { columnSelectorsToPredicate, matchColumn, matchColumnSelectors, normalizeSelectors } from "./column_selector.js";
4
- import { ColumnCollectionBuilder } from "./column_collection_builder.js";
5
- import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./ctx_column_sources.js";
1
+ import "./column_snapshot.js";
2
+ import "./column_snapshot_provider.js";
3
+ import "./column_selector.js";
4
+ import "./column_collection_builder.js";
5
+ import "./ctx_column_sources.js";
@@ -1,8 +1,7 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_axes = require('../pframe_utils/axes.cjs');
3
- const require_columns = require('../pframe_utils/columns.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ require("../pframe_utils/axes.cjs");
3
+ const require_columns = require("../pframe_utils/columns.cjs");
4
4
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
5
-
6
5
  //#region src/components/PFrameForGraphs.ts
7
6
  function isHiddenFromGraphColumn(column) {
8
7
  return !!(0, _milaboratories_pl_model_common.readAnnotationJson)(column, _milaboratories_pl_model_common.Annotation.HideDataFromGraphs);
@@ -30,9 +29,9 @@ function createPFrameForGraphs(ctx, blockColumns) {
30
29
  predicate: suitableSpec
31
30
  }));
32
31
  }
33
-
34
32
  //#endregion
35
33
  exports.createPFrameForGraphs = createPFrameForGraphs;
36
34
  exports.isHiddenFromGraphColumn = isHiddenFromGraphColumn;
37
35
  exports.isHiddenFromUIColumn = isHiddenFromUIColumn;
36
+
38
37
  //# sourceMappingURL=PFrameForGraphs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PFrameForGraphs.cjs","names":["Annotation","getAllRelatedColumns","getRelatedColumns"],"sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PFrameHandle } from \"@milaboratories/pl-model-common\";\nimport { Annotation, readAnnotationJson } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../render\";\nimport { getAllRelatedColumns, getRelatedColumns } from \"../pframe_utils/columns\";\nexport type { AxesVault } from \"../pframe_utils/axes\";\nexport { enrichCompatible, getAvailableWithLinkersAxes } from \"../pframe_utils/axes\";\n\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\n/**\n The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool\n (including linker columns and all label columns).\n Block’s columns are added to pframe as is.\n Other columns are added basing on set of axes of block’s columns, considering available with linker columns.\n Compatible columns must have at least one axis from block’s axes set. This axis of the compatible column from\n result pool must satisfy matchAxisId (it can have less domain keys than in block’s axis, but without conflicting values\n among existing ones).\n In requests to pframe (calculateTableData) columns must have strictly the same axes. For compatibility in case\n of partially matched axis we add to pframe a copy of this column with modified axis (with filled missed domains)\n and modified label (with added domain values in case if more than one copy with different domains exist).\n */\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtxBase<A, U>,\n blockColumns?: PColumn<PColumnDataUniversal>[],\n): PFrameHandle | undefined {\n const suitableSpec = (spec: PColumnSpec) =>\n !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\n // if current block doesn't produce own columns then use all columns from result pool\n if (!blockColumns) {\n return ctx.createPFrame(getAllRelatedColumns(ctx, suitableSpec));\n }\n\n return ctx.createPFrame(\n getRelatedColumns(ctx, { columns: blockColumns, predicate: suitableSpec }),\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,wBAAwB,QAA8B;AACpE,QAAO,CAAC,yDAAoB,QAAQA,2CAAW,mBAAmB;;AAGpE,SAAgB,qBAAqB,QAA8B;AACjE,QAAO,CAAC,yDAAoB,QAAQA,2CAAW,eAAe;;;;;;;;;;;;;;AAehE,SAAgB,sBACd,KACA,cAC0B;CAC1B,MAAM,gBAAgB,SACpB,CAAC,qBAAqB,KAAK,IAAI,CAAC,wBAAwB,KAAK;AAE/D,KAAI,CAAC,aACH,QAAO,IAAI,aAAaC,qCAAqB,KAAK,aAAa,CAAC;AAGlE,QAAO,IAAI,aACTC,kCAAkB,KAAK;EAAE,SAAS;EAAc,WAAW;EAAc,CAAC,CAC3E"}
1
+ {"version":3,"file":"PFrameForGraphs.cjs","names":["Annotation","getAllRelatedColumns","getRelatedColumns"],"sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PFrameHandle } from \"@milaboratories/pl-model-common\";\nimport { Annotation, readAnnotationJson } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../render\";\nimport { getAllRelatedColumns, getRelatedColumns } from \"../pframe_utils/columns\";\nexport type { AxesVault } from \"../pframe_utils/axes\";\nexport { enrichCompatible, getAvailableWithLinkersAxes } from \"../pframe_utils/axes\";\n\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\n/**\n The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool\n (including linker columns and all label columns).\n Block’s columns are added to pframe as is.\n Other columns are added basing on set of axes of block’s columns, considering available with linker columns.\n Compatible columns must have at least one axis from block’s axes set. This axis of the compatible column from\n result pool must satisfy matchAxisId (it can have less domain keys than in block’s axis, but without conflicting values\n among existing ones).\n In requests to pframe (calculateTableData) columns must have strictly the same axes. For compatibility in case\n of partially matched axis we add to pframe a copy of this column with modified axis (with filled missed domains)\n and modified label (with added domain values in case if more than one copy with different domains exist).\n */\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtxBase<A, U>,\n blockColumns?: PColumn<PColumnDataUniversal>[],\n): PFrameHandle | undefined {\n const suitableSpec = (spec: PColumnSpec) =>\n !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\n // if current block doesn't produce own columns then use all columns from result pool\n if (!blockColumns) {\n return ctx.createPFrame(getAllRelatedColumns(ctx, suitableSpec));\n }\n\n return ctx.createPFrame(\n getRelatedColumns(ctx, { columns: blockColumns, predicate: suitableSpec }),\n );\n}\n"],"mappings":";;;;;AAOA,SAAgB,wBAAwB,QAA8B;AACpE,QAAO,CAAC,EAAA,GAAA,gCAAA,oBAAoB,QAAQA,gCAAAA,WAAW,mBAAmB;;AAGpE,SAAgB,qBAAqB,QAA8B;AACjE,QAAO,CAAC,EAAA,GAAA,gCAAA,oBAAoB,QAAQA,gCAAAA,WAAW,eAAe;;;;;;;;;;;;;;AAehE,SAAgB,sBACd,KACA,cAC0B;CAC1B,MAAM,gBAAgB,SACpB,CAAC,qBAAqB,KAAK,IAAI,CAAC,wBAAwB,KAAK;AAE/D,KAAI,CAAC,aACH,QAAO,IAAI,aAAaC,gBAAAA,qBAAqB,KAAK,aAAa,CAAC;AAGlE,QAAO,IAAI,aACTC,gBAAAA,kBAAkB,KAAK;EAAE,SAAS;EAAc,WAAW;EAAc,CAAC,CAC3E"}
@@ -1,6 +1,5 @@
1
1
  import { PColumnDataUniversal } from "../render/internal.js";
2
2
  import { RenderCtxBase } from "../render/api.js";
3
- import "../render/index.js";
4
3
  import { AxesVault, enrichCompatible, getAvailableWithLinkersAxes } from "../pframe_utils/axes.js";
5
4
  import { PColumn, PColumnSpec, PFrameHandle } from "@milaboratories/pl-model-common";
6
5