@platforma-sdk/model 1.61.1 → 1.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/block_model.cjs +17 -10
  2. package/dist/block_model.cjs.map +1 -1
  3. package/dist/block_model.d.ts +22 -5
  4. package/dist/block_model.js +16 -10
  5. package/dist/block_model.js.map +1 -1
  6. package/dist/columns/column_collection_builder.cjs +26 -14
  7. package/dist/columns/column_collection_builder.cjs.map +1 -1
  8. package/dist/columns/column_collection_builder.d.ts +9 -8
  9. package/dist/columns/column_collection_builder.js +26 -14
  10. package/dist/columns/column_collection_builder.js.map +1 -1
  11. package/dist/columns/ctx_column_sources.cjs.map +1 -1
  12. package/dist/columns/ctx_column_sources.d.ts +1 -1
  13. package/dist/columns/ctx_column_sources.js.map +1 -1
  14. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +93 -89
  15. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  16. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +2 -2
  17. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +93 -89
  18. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  19. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  20. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -1
  21. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  22. package/dist/index.cjs +7 -0
  23. package/dist/index.d.ts +6 -2
  24. package/dist/index.js +4 -1
  25. package/dist/package.cjs +1 -1
  26. package/dist/package.js +1 -1
  27. package/dist/platforma.d.ts +8 -4
  28. package/dist/plugin_handle.cjs.map +1 -1
  29. package/dist/plugin_handle.d.ts +13 -7
  30. package/dist/plugin_handle.js.map +1 -1
  31. package/dist/plugin_model.cjs +37 -11
  32. package/dist/plugin_model.cjs.map +1 -1
  33. package/dist/plugin_model.d.ts +80 -39
  34. package/dist/plugin_model.js +37 -11
  35. package/dist/plugin_model.js.map +1 -1
  36. package/dist/render/api.cjs +13 -24
  37. package/dist/render/api.cjs.map +1 -1
  38. package/dist/render/api.d.ts +11 -14
  39. package/dist/render/api.js +13 -24
  40. package/dist/render/api.js.map +1 -1
  41. package/dist/render/internal.cjs.map +1 -1
  42. package/dist/render/internal.d.ts +3 -14
  43. package/dist/render/internal.js.map +1 -1
  44. package/dist/services/block_services.cjs +18 -0
  45. package/dist/services/block_services.cjs.map +1 -0
  46. package/dist/services/block_services.d.ts +18 -0
  47. package/dist/services/block_services.js +16 -0
  48. package/dist/services/block_services.js.map +1 -0
  49. package/dist/services/index.cjs +2 -0
  50. package/dist/services/index.d.ts +3 -0
  51. package/dist/services/index.js +2 -0
  52. package/dist/services/service_bridge.cjs +35 -0
  53. package/dist/services/service_bridge.cjs.map +1 -0
  54. package/dist/services/service_bridge.d.ts +18 -0
  55. package/dist/services/service_bridge.js +33 -0
  56. package/dist/services/service_bridge.js.map +1 -0
  57. package/dist/services/service_resolve.d.ts +13 -0
  58. package/package.json +9 -9
  59. package/src/block_model.ts +47 -14
  60. package/src/columns/column_collection_builder.test.ts +23 -2
  61. package/src/columns/column_collection_builder.ts +38 -30
  62. package/src/columns/ctx_column_sources.ts +2 -2
  63. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +159 -153
  64. package/src/components/PlDataTable/createPlDataTable/index.ts +5 -4
  65. package/src/index.ts +1 -0
  66. package/src/platforma.ts +14 -2
  67. package/src/plugin_handle.ts +24 -6
  68. package/src/plugin_model.ts +252 -84
  69. package/src/render/api.ts +50 -51
  70. package/src/render/internal.ts +3 -38
  71. package/src/services/block_services.ts +17 -0
  72. package/src/services/index.ts +3 -0
  73. package/src/services/service_bridge.ts +71 -0
  74. package/src/services/service_resolve.ts +71 -0
@@ -1 +1 @@
1
- {"version":3,"file":"api.cjs","names":["TreeNodeAccessor","getCfgRenderCtx","deriveLabels","AnchoredIdDeriver","PColumnCollection","PColumnName","ifDef","StagingAccessorName","MainAccessorName","patchInSetFilters","allPColumnsReady","getPluginData"],"sources":["../../src/render/api.ts"],"sourcesContent":["import type {\n AnchoredPColumnSelector,\n AnyFunction,\n AxesId,\n AxesSpec,\n AxisId,\n DataInfo,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n Option,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectId,\n PObjectSpec,\n PSpecPredicate,\n PTableColumnId,\n PTableColumnSpec,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResolveAnchorsOptions,\n ResultCollection,\n SingleAxisSelector,\n SUniversalPColumnId,\n ValueOrError,\n} from \"@milaboratories/pl-model-common\";\nimport {\n AnchoredIdDeriver,\n collectSpecQueryColumns,\n ensurePColumn,\n parseJson,\n extractAllColumns,\n isDataInfo,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapPTableDefV2,\n mapValueInVOE,\n PColumnName,\n readAnnotation,\n withEnrichments,\n legacyColumnSelectorsToPredicate,\n} from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type { Optional } from \"utility-types\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { getPluginData } from \"../block_storage\";\nimport type {\n PluginHandle,\n PluginFactoryLike,\n InferFactoryData,\n InferFactoryParams,\n} from \"../plugin_handle\";\nimport { TreeNodeAccessor, ifDef } from \"./accessor\";\nimport type { FutureRef } from \"./future\";\nimport type { AccessorHandle, GlobalCfgRenderCtx } from \"./internal\";\nimport { MainAccessorName, StagingAccessorName } from \"./internal\";\nimport {\n PColumnCollection,\n type AxisLabelProvider,\n type ColumnProvider,\n} from \"./util/column_collection\";\nimport type { LabelDerivationOps } from \"./util/label\";\nimport { deriveLabels } from \"./util/label\";\nimport type { APColumnSelectorWithSplit } from \"./util/split_selectors\";\nimport { patchInSetFilters } from \"./util/pframe_upgraders\";\nimport { allPColumnsReady } from \"./util/pcolumn_data\";\nimport type { PColumnDataUniversal } from \"./internal\";\n\n/**\n * Helper function to match domain objects\n * @param query Optional domain to match against\n * @param target Optional domain to match\n * @returns true if domains match, false otherwise\n */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\nexport type UniversalColumnOption = { label: string; value: SUniversalPColumnId };\n\n/**\n * Transforms PColumn data into the internal representation expected by the platform\n * @param data Data from a PColumn to transform\n * @returns Transformed data compatible with platform API\n */\nfunction transformPColumnData(\n data: PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal>,\n): PColumn<PColumnValues | AccessorHandle | DataInfo<AccessorHandle>> {\n return mapPObjectData(data, (d) => {\n if (d instanceof TreeNodeAccessor) {\n return d.handle;\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (accessor) => accessor.handle);\n } else {\n return d;\n }\n });\n}\n\ntype UniversalPColumnOpts = {\n labelOps?: LabelDerivationOps;\n dontWaitAllData?: boolean;\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n} & ResolveAnchorsOptions;\n\ntype GetOptionsOpts = {\n /**\n * If true, references returned by the method will contain `requireEnrichments` flag set to true.\n * If this reference is added to the block's args, it will communicate to the platform that the block\n * expects enrichments of the referenced block to be available in the context of the current block.\n */\n refsWithEnrichments?: boolean;\n /**\n * Label derivation options.\n * If provided, it will be used to derive labels for the options.\n * If not provided, labels will be derived using the default logic.\n */\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps;\n};\n\nexport class ResultPool implements ColumnProvider, AxisLabelProvider {\n private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();\n\n /**\n * @deprecated use getOptions()\n */\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.ctx.calculateOptions(predicate);\n }\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts,\n ): Option[];\n /** @deprecated wrap label ops with { label: <...> } */\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[];\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts | ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate =\n typeof predicateOrSelector === \"function\"\n ? predicateOrSelector\n : legacyColumnSelectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n\n let labelOps: LabelDerivationOps | ((spec: PObjectSpec, ref: PlRef) => string) = {};\n let refsWithEnrichments: boolean = false;\n if (typeof opts !== \"undefined\") {\n if (typeof opts === \"function\") {\n labelOps = opts;\n } else if (typeof opts === \"object\") {\n if (\"includeNativeLabel\" in opts || \"separator\" in opts || \"addLabelAsSuffix\" in opts) {\n labelOps = opts;\n } else {\n opts = opts as GetOptionsOpts;\n labelOps = opts.label ?? {};\n refsWithEnrichments = opts.refsWithEnrichments ?? false;\n }\n }\n }\n\n if (typeof labelOps === \"object\")\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(\n ({ value: { ref }, label }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label,\n }),\n );\n else\n return filtered.map(({ ref, obj }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label: labelOps(obj, ref),\n }));\n }\n\n public resolveAnchorCtx(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n ): AnchoredIdDeriver | undefined {\n if (anchorsOrCtx instanceof AnchoredIdDeriver) return anchorsOrCtx;\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec) return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n resolvedAnchors[key] = value;\n }\n }\n return new AnchoredIdDeriver(resolvedAnchors);\n }\n\n /**\n * Returns columns that match the provided anchors and selectors. It applies axis filters and label derivation.\n *\n * @param anchorsOrCtx - Anchor context for column selection (same as in getCanonicalOptions)\n * @param predicateOrSelectors - Predicate or selectors for filtering columns (same as in getCanonicalOptions)\n * @param opts - Optional configuration for label generation and data waiting\n * @returns A PFrameHandle for the created PFrame, or undefined if any required data is missing\n */\n public getAnchoredPColumns(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): PColumn<PColumnDataUniversal>[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n return new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getColumns(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate and returns their\n * canonicalized representations.\n *\n * This function filters column specifications from the result pool that match the provided predicate,\n * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value\n * pairs for UI components (like dropdowns).\n *\n * @param anchorsOrCtx - Either:\n * - An existing AnchorCtx instance\n * - A record mapping anchor IDs to PColumnSpec objects\n * - A record mapping anchor IDs to PlRef objects (which will be resolved to PColumnSpec)\n * @param predicateOrSelectors - Either:\n * - A predicate function that takes a PColumnSpec and returns a boolean.\n * Only specs that return true will be included.\n * - An APColumnSelector object for declarative filtering, which will be\n * resolved against the provided anchors and matched using matchPColumn.\n * - An array of APColumnSelector objects - columns matching ANY selector\n * in the array will be included (OR operation).\n * @param opts - Optional configuration for label generation:\n * - labelOps: Optional configuration for label generation:\n * - includeNativeLabel: Whether to include native column labels\n * - separator: String to use between label parts (defaults to \" / \")\n * - addLabelAsSuffix: Whether to add labels as suffix instead of prefix\n * - dontWaitAllData: Whether to skip columns that don't have all data (if not set, will return undefined,\n * if at least one column that requires splitting is missing data)\n * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,\n * or undefined if any PlRef resolution fails.\n */\n getCanonicalOptions(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): { label: string; value: SUniversalPColumnId }[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n const entries = new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getUniversalEntries(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n if (!entries) return undefined;\n return entries.map((item) => ({\n value: item.id,\n label: item.label,\n }));\n }\n\n /**\n * @deprecated use getData()\n */\n public getDataFromResultPool(): ResultCollection<PObject<TreeNodeAccessor>> {\n return this.getData();\n }\n\n public getData(): ResultCollection<PObject<TreeNodeAccessor>> {\n const result = this.ctx.getDataFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: new TreeNodeAccessor(e.obj.data, [e.ref.blockId, e.ref.name]),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getDataWithErrors()\n */\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n const result = this.ctx.getDataWithErrorsFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: mapValueInVOE(\n e.obj.data,\n (handle) => new TreeNodeAccessor(handle, [e.ref.blockId, e.ref.name]),\n ),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getSpecs()\n */\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n return this.getSpecs();\n }\n\n public getSpecs(): ResultCollection<PObjectSpec> {\n return this.ctx.getSpecsFromResultPool();\n }\n\n /**\n * @param ref a Ref\n * @returns data associated with the ref\n */\n public getDataByRef(ref: PlRef): PObject<TreeNodeAccessor> | undefined {\n // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getDataFromResultPoolByRef === \"undefined\")\n return this.getData().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name,\n )?.obj;\n const data = this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name); // Keep original call\n // Need to handle undefined case before mapping\n if (!data) return undefined;\n return mapPObjectData(data, (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]));\n }\n\n /**\n * Returns data associated with the ref ensuring that it is a p-column.\n * @param ref a Ref\n * @returns p-column associated with the ref\n */\n public getPColumnByRef(ref: PlRef): PColumn<TreeNodeAccessor> | undefined {\n const data = this.getDataByRef(ref);\n if (!data) return undefined;\n return ensurePColumn(data);\n }\n\n /**\n * Returns spec associated with the ref ensuring that it is a p-column spec.\n * @param ref a Ref\n * @returns p-column spec associated with the ref\n */\n public getPColumnSpecByRef(ref: PlRef): PColumnSpec | undefined {\n const spec = this.getSpecByRef(ref);\n if (!spec) return undefined;\n if (!isPColumnSpec(spec)) throw new Error(`not a PColumn spec (kind = ${spec.kind})`);\n return spec;\n }\n\n /**\n * @param ref a Ref\n * @returns object spec associated with the ref\n */\n public getSpecByRef(ref: PlRef): PObjectSpec | undefined {\n return this.ctx.getSpecFromResultPoolByRef(ref.blockId, ref.name);\n }\n\n /**\n * @param spec object specification\n * @returns array of data objects with compatible specs\n * @deprecated delete this method after Jan 1, 2025\n */\n public findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[] {\n const result: PObject<TreeNodeAccessor>[] = [];\n\n out: for (const data of this.getData().entries) {\n if (!isPColumnSpec(data.obj.spec)) {\n continue;\n }\n\n const oth = data.obj.spec;\n\n if (spec.name !== oth.name) {\n continue;\n }\n\n if (spec.valueType !== oth.valueType) {\n continue;\n }\n\n if (spec.axesSpec.length !== oth.axesSpec.length) {\n continue;\n }\n\n if (!matchDomain(spec.domain, oth.domain)) {\n continue;\n }\n\n if (!matchDomain(spec.contextDomain, oth.contextDomain)) {\n continue;\n }\n\n for (let i = 0; i < spec.axesSpec.length; ++i) {\n const qAx = spec.axesSpec[i];\n const tAx = oth.axesSpec[i];\n if (qAx.name !== tAx.name) {\n continue out;\n }\n if (qAx.type !== tAx.type) {\n continue out;\n }\n if (!matchDomain(qAx.domain, tAx.domain)) {\n continue out;\n }\n if (!matchDomain(qAx.contextDomain, tAx.contextDomain)) {\n continue out;\n }\n }\n\n result.push(data.obj);\n }\n return result;\n }\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.getData();\n for (const column of dataPool.entries) {\n if (!isPColumn(column.obj)) continue;\n\n const spec = column.obj.spec;\n if (\n spec.name === PColumnName.Label &&\n spec.axesSpec.length === 1 &&\n spec.axesSpec[0].name === axis.name &&\n spec.axesSpec[0].type === axis.type &&\n matchDomain(axis.domain, spec.axesSpec[0].domain) &&\n matchDomain(axis.contextDomain, spec.axesSpec[0].contextDomain)\n ) {\n if (column.obj.data.resourceType.name !== \"PColumnData/Json\") {\n throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);\n }\n const labels: Record<string | number, string> = Object.fromEntries(\n Object.entries(\n column.obj.data.getDataAsJson<{\n data: Record<string | number, string>;\n }>().data,\n ).map((e) => [JSON.parse(e[0])[0], e[1]]),\n );\n\n return labels;\n }\n }\n return undefined;\n }\n\n /**\n * Selects columns based on the provided selectors, returning PColumn objects\n * with lazily loaded data.\n *\n * @param selectors - A predicate function, a single selector, or an array of selectors.\n * @returns An array of PColumn objects matching the selectors. Data is loaded on first access.\n */\n public selectColumns(\n selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],\n ): PColumn<TreeNodeAccessor | undefined>[] {\n const predicate =\n typeof selectors === \"function\" ? selectors : legacyColumnSelectorsToPredicate(selectors);\n\n const matchedSpecs = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n // Map specs to PColumn objects with lazy data loading\n return matchedSpecs.map(({ ref, obj: spec }) => {\n // Type assertion needed because filter ensures it's PColumnSpec\n const pcolumnSpec = spec as PColumnSpec;\n let _cachedData: TreeNodeAccessor | undefined | null = null; // Use null to distinguish initial state from undefined result\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this; // Capture 'this' for use inside the getter\n\n return {\n id: canonicalize(ref) as PObjectId,\n spec: pcolumnSpec,\n get data(): TreeNodeAccessor | undefined {\n if (_cachedData !== null) {\n return _cachedData; // Return cached data (could be undefined if fetch failed)\n }\n\n _cachedData = self.getPColumnByRef(ref)?.data;\n return _cachedData;\n },\n } satisfies PColumn<TreeNodeAccessor | undefined>; // Cast needed because 'data' is a getter\n });\n }\n\n /**\n * Find labels data for a given axis id of a p-column.\n * @returns a map of axis value => label\n */\n public findLabelsForColumnAxis(\n column: PColumnSpec,\n axisIdx: number,\n ): Record<string | number, string> | undefined {\n const labels = this.findLabels(column.axesSpec[axisIdx]);\n if (!labels) return undefined;\n const axisKeys = readAnnotation(column, `pl7.app/axisKeys/${axisIdx}`);\n if (axisKeys !== undefined) {\n const keys = JSON.parse(axisKeys) as string[];\n return Object.fromEntries(\n keys.map((key) => {\n return [key, labels[key] ?? \"Unlabelled\"];\n }),\n );\n } else {\n return labels;\n }\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport abstract class RenderCtxBase<Args = unknown, Data = unknown> {\n protected readonly ctx: GlobalCfgRenderCtx;\n\n constructor() {\n this.ctx = getCfgRenderCtx();\n }\n\n private dataCache?: { v: Data };\n\n public get data(): Data {\n if (this.dataCache === undefined) {\n const raw = this.ctx.data;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.dataCache = { v: value ? JSON.parse(value) : ({} as Data) };\n }\n return this.dataCache.v;\n }\n\n // lazy rendering because this feature is rarely used\n private activeArgsCache?: { v?: Args };\n\n /**\n * Returns args snapshot the block was executed for (i.e. when \"Run\" button was pressed).\n * Returns undefined, if block was never executed or stopped mid-way execution, so that the result was cleared.\n * */\n public get activeArgs(): Args | undefined {\n if (this.activeArgsCache === undefined) {\n const raw = this.ctx.activeArgs;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.activeArgsCache = {\n v: value ? JSON.parse(value) : undefined,\n };\n }\n return this.activeArgsCache.v;\n }\n\n // /** Can be used to determine features provided by the desktop instance. */\n // public get featureFlags() {\n // return this.ctx.featureFlags;\n // }\n\n private getNamedAccessor(name: string): TreeNodeAccessor | undefined {\n return ifDef(\n this.ctx.getAccessorHandleByName(name),\n (accessor) => new TreeNodeAccessor(accessor, [name]),\n );\n }\n\n public get prerun(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(StagingAccessorName);\n }\n\n public get outputs(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(MainAccessorName);\n }\n\n public readonly resultPool = new ResultPool();\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n * @deprecated Use resultPool.findLabels instead\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n return this.resultPool.findLabels(axis);\n }\n\n private verifyInlineAndExplicitColumnsSupport(\n columns: (PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>)[],\n ) {\n const hasInlineColumns = columns.some(\n (c) => !(c.data instanceof TreeNodeAccessor) || isDataInfo(c.data),\n ); // Updated check for DataInfo\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport)\n throw Error(`Inline or explicit columns not supported`); // Combined check\n\n // Removed redundant explicitColumns check\n }\n\n private patchPTableDef(\n def: PTableDef<PColumn<PColumnDataUniversal>>,\n ): PTableDef<PColumn<PColumnDataUniversal>> {\n if (!this.ctx.featureFlags?.pTablePartitionFiltersSupport) {\n // For old desktop move all partition filters to filters field as it doesn't read partitionFilters field\n def = {\n ...def,\n partitionFilters: [],\n filters: [...def.partitionFilters, ...def.filters],\n };\n }\n if (!this.ctx.featureFlags?.pFrameInSetFilterSupport) {\n def = {\n ...def,\n partitionFilters: patchInSetFilters(def.partitionFilters),\n filters: patchInSetFilters(def.filters),\n };\n }\n return def;\n }\n\n // TODO remove all non-PColumn fields\n public createPFrame(\n def: PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>>,\n ): PFrameHandle | undefined {\n this.verifyInlineAndExplicitColumnsSupport(def);\n if (!allPColumnsReady(def)) return undefined;\n return this.ctx.createPFrame(def.map((c) => transformPColumnData(c)));\n }\n\n // TODO remove all non-PColumn fields\n public createPTable(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableHandle | undefined;\n public createPTable(def: {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle | undefined;\n public createPTable(\n def:\n | PTableDef<PColumn<PColumnDataUniversal>>\n | {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle | undefined {\n let rawDef: PTableDef<PColumn<PColumnDataUniversal>>;\n if (\"columns\" in def) {\n rawDef = this.patchPTableDef({\n src: {\n type: \"full\",\n entries: def.columns.map((c) => ({ type: \"column\", column: c })),\n },\n partitionFilters: def.filters ?? [],\n filters: [],\n sorting: def.sorting ?? [],\n });\n } else {\n rawDef = this.patchPTableDef(def);\n }\n const columns = extractAllColumns(rawDef.src);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTable(mapPTableDef(rawDef, (po) => transformPColumnData(po)));\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnDataUniversal>>): PTableHandle | undefined {\n const columns = collectSpecQueryColumns(def.query);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTableV2(mapPTableDefV2(def, (po) => transformPColumnData(po)));\n }\n\n /** @deprecated scheduled for removal from SDK */\n public getBlockLabel(blockId: string): string {\n return this.ctx.getBlockLabel(blockId);\n }\n\n //\n // Spec Frames\n //\n\n public createSpecFrame(specs: Record<string, PColumnSpec>): string {\n return this.ctx.createSpecFrame(specs);\n }\n\n public specFrameDiscoverColumns(\n handle: string,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n return this.ctx.specFrameDiscoverColumns(handle, request);\n }\n\n public disposeSpecFrame(handle: string): void {\n this.ctx.disposeSpecFrame(handle);\n }\n\n public expandAxes(spec: AxesSpec): AxesId {\n return this.ctx.expandAxes(spec);\n }\n\n public collapseAxes(ids: AxesId): AxesSpec {\n return this.ctx.collapseAxes(ids);\n }\n\n public findAxis(spec: AxesSpec, selector: SingleAxisSelector): number {\n return this.ctx.findAxis(spec, selector);\n }\n\n public findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number {\n return this.ctx.findTableColumn(tableSpec, selector);\n }\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.ctx.getCurrentUnstableMarker();\n }\n\n public logInfo(msg: string): void {\n this.ctx.logInfo(msg);\n }\n\n public logWarn(msg: string): void {\n this.ctx.logWarn(msg);\n }\n\n public logError(msg: string): void {\n this.ctx.logError(msg);\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) for v3+ blocks */\nexport class BlockRenderCtx<Args = unknown, Data = unknown> extends RenderCtxBase<Args, Data> {\n private argsCache?: { v: Args | undefined };\n public get args(): Args | undefined {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: value === undefined ? undefined : JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n}\n\n/** Render context for legacy v1/v2 blocks - provides backward compatibility */\nexport class RenderCtxLegacy<Args = unknown, UiState = unknown> extends RenderCtxBase<\n Args,\n UiState\n> {\n private argsCache?: { v: Args };\n\n public get args(): Args {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n\n private uiStateCache?: { v: UiState };\n\n public get uiState(): UiState {\n if (this.uiStateCache === undefined) {\n const raw = this.ctx.uiState!;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.uiStateCache = { v: value ? JSON.parse(value) : ({} as UiState) };\n }\n return this.uiStateCache.v;\n }\n}\n\n/**\n * Render context for plugin output functions.\n * Reads plugin data from blockStorage and derives params from pre-wrapped input callbacks.\n *\n * Parameterized on the factory-like phantom F so that getPluginData returns\n * InferFactoryData<F> directly — no casts needed for the data getter.\n *\n * @typeParam F - PluginFactoryLike phantom carrying data/params/outputs types\n */\nexport class PluginRenderCtx<F extends PluginFactoryLike = PluginFactoryLike> extends RenderCtxBase<\n unknown,\n InferFactoryData<F>\n> {\n private readonly handle: PluginHandle<F>;\n private readonly wrappedInputs: Record<string, () => unknown>;\n\n constructor(handle: PluginHandle<F>, wrappedInputs: Record<string, () => unknown>) {\n super();\n this.handle = handle;\n this.wrappedInputs = wrappedInputs;\n }\n\n private pluginDataCache?: { v: InferFactoryData<F> };\n\n /** Plugin's persistent data from blockStorage.__plugins.{pluginId}.__data */\n public override get data(): InferFactoryData<F> {\n if (this.pluginDataCache === undefined) {\n const raw = this.ctx.blockStorage();\n this.pluginDataCache = { v: getPluginData(parseJson(raw), this.handle) };\n }\n return this.pluginDataCache.v;\n }\n\n private paramsCache?: { v: InferFactoryParams<F> };\n\n /** Params derived from block context via pre-wrapped input callbacks */\n public get params(): InferFactoryParams<F> {\n if (this.paramsCache === undefined) {\n const result: Record<string, unknown> = {};\n for (const [key, fn] of Object.entries(this.wrappedInputs)) {\n result[key] = fn();\n }\n this.paramsCache = { v: result as InferFactoryParams<F> };\n }\n return this.paramsCache.v;\n }\n}\n\n/** @deprecated Use BlockRenderCtx instead */\nexport type RenderCtx<Args = unknown, Data = unknown> = BlockRenderCtx<Args, Data>;\n\nexport type RenderFunction<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: BlockRenderCtx<Args, State>,\n) => Ret;\n\nexport type RenderFunctionLegacy<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: RenderCtxLegacy<Args, State>,\n) => Ret;\n\nexport type UnwrapFutureRef<K> =\n K extends FutureRef<infer T>\n ? T\n : K extends bigint | boolean | null | number | string | symbol | undefined\n ? K\n : { [key in keyof K]: UnwrapFutureRef<K[key]> };\n\nexport type InferRenderFunctionReturn<RF extends AnyFunction> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n"],"mappings":"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"}
1
+ {"version":3,"file":"api.cjs","names":["TreeNodeAccessor","getCfgRenderCtx","deriveLabels","AnchoredIdDeriver","PColumnCollection","PColumnName","ifDef","StagingAccessorName","MainAccessorName","patchInSetFilters","allPColumnsReady","getPluginData"],"sources":["../../src/render/api.ts"],"sourcesContent":["import type {\n AnchoredPColumnSelector,\n AnyFunction,\n AxisId,\n DataInfo,\n Option,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectId,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResolveAnchorsOptions,\n ResultCollection,\n ServiceName,\n SUniversalPColumnId,\n ValueOrError,\n} from \"@milaboratories/pl-model-common\";\nimport {\n AnchoredIdDeriver,\n collectSpecQueryColumns,\n ensurePColumn,\n parseJson,\n extractAllColumns,\n isDataInfo,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapPTableDefV2,\n mapValueInVOE,\n PColumnName,\n readAnnotation,\n withEnrichments,\n legacyColumnSelectorsToPredicate,\n} from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type { Optional } from \"utility-types\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { getPluginData } from \"../block_storage\";\nimport type {\n PluginHandle,\n PluginFactoryLike,\n InferFactoryData,\n InferFactoryModelServices,\n InferFactoryParams,\n} from \"../plugin_handle\";\nimport type { BlockDefaultModelServices } from \"../services/service_resolve\";\nimport type { ModelServices as AllModelServices } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor, ifDef } from \"./accessor\";\nimport type { FutureRef } from \"./future\";\nimport type { AccessorHandle, GlobalCfgRenderCtx } from \"./internal\";\nimport { MainAccessorName, StagingAccessorName } from \"./internal\";\nimport {\n PColumnCollection,\n type AxisLabelProvider,\n type ColumnProvider,\n} from \"./util/column_collection\";\nimport type { LabelDerivationOps } from \"./util/label\";\nimport { deriveLabels } from \"./util/label\";\nimport type { APColumnSelectorWithSplit } from \"./util/split_selectors\";\nimport { patchInSetFilters } from \"./util/pframe_upgraders\";\nimport { allPColumnsReady } from \"./util/pcolumn_data\";\nimport type { PColumnDataUniversal } from \"./internal\";\n\n/**\n * Helper function to match domain objects\n * @param query Optional domain to match against\n * @param target Optional domain to match\n * @returns true if domains match, false otherwise\n */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\nexport type UniversalColumnOption = { label: string; value: SUniversalPColumnId };\n\n/**\n * Transforms PColumn data into the internal representation expected by the platform\n * @param data Data from a PColumn to transform\n * @returns Transformed data compatible with platform API\n */\nfunction transformPColumnData(\n data: PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal>,\n): PColumn<PColumnValues | AccessorHandle | DataInfo<AccessorHandle>> {\n return mapPObjectData(data, (d) => {\n if (d instanceof TreeNodeAccessor) {\n return d.handle;\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (accessor) => accessor.handle);\n } else {\n return d;\n }\n });\n}\n\ntype UniversalPColumnOpts = {\n labelOps?: LabelDerivationOps;\n dontWaitAllData?: boolean;\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n} & ResolveAnchorsOptions;\n\ntype GetOptionsOpts = {\n /**\n * If true, references returned by the method will contain `requireEnrichments` flag set to true.\n * If this reference is added to the block's args, it will communicate to the platform that the block\n * expects enrichments of the referenced block to be available in the context of the current block.\n */\n refsWithEnrichments?: boolean;\n /**\n * Label derivation options.\n * If provided, it will be used to derive labels for the options.\n * If not provided, labels will be derived using the default logic.\n */\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps;\n};\n\nexport class ResultPool implements ColumnProvider, AxisLabelProvider {\n private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();\n\n /**\n * @deprecated use getOptions()\n */\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.ctx.calculateOptions(predicate);\n }\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts,\n ): Option[];\n /** @deprecated wrap label ops with { label: <...> } */\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[];\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts | ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate =\n typeof predicateOrSelector === \"function\"\n ? predicateOrSelector\n : legacyColumnSelectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n\n let labelOps: LabelDerivationOps | ((spec: PObjectSpec, ref: PlRef) => string) = {};\n let refsWithEnrichments: boolean = false;\n if (typeof opts !== \"undefined\") {\n if (typeof opts === \"function\") {\n labelOps = opts;\n } else if (typeof opts === \"object\") {\n if (\"includeNativeLabel\" in opts || \"separator\" in opts || \"addLabelAsSuffix\" in opts) {\n labelOps = opts;\n } else {\n opts = opts as GetOptionsOpts;\n labelOps = opts.label ?? {};\n refsWithEnrichments = opts.refsWithEnrichments ?? false;\n }\n }\n }\n\n if (typeof labelOps === \"object\")\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(\n ({ value: { ref }, label }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label,\n }),\n );\n else\n return filtered.map(({ ref, obj }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label: labelOps(obj, ref),\n }));\n }\n\n public resolveAnchorCtx(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n ): AnchoredIdDeriver | undefined {\n if (anchorsOrCtx instanceof AnchoredIdDeriver) return anchorsOrCtx;\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec) return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n resolvedAnchors[key] = value;\n }\n }\n return new AnchoredIdDeriver(resolvedAnchors);\n }\n\n /**\n * Returns columns that match the provided anchors and selectors. It applies axis filters and label derivation.\n *\n * @param anchorsOrCtx - Anchor context for column selection (same as in getCanonicalOptions)\n * @param predicateOrSelectors - Predicate or selectors for filtering columns (same as in getCanonicalOptions)\n * @param opts - Optional configuration for label generation and data waiting\n * @returns A PFrameHandle for the created PFrame, or undefined if any required data is missing\n */\n public getAnchoredPColumns(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): PColumn<PColumnDataUniversal>[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n return new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getColumns(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate and returns their\n * canonicalized representations.\n *\n * This function filters column specifications from the result pool that match the provided predicate,\n * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value\n * pairs for UI components (like dropdowns).\n *\n * @param anchorsOrCtx - Either:\n * - An existing AnchorCtx instance\n * - A record mapping anchor IDs to PColumnSpec objects\n * - A record mapping anchor IDs to PlRef objects (which will be resolved to PColumnSpec)\n * @param predicateOrSelectors - Either:\n * - A predicate function that takes a PColumnSpec and returns a boolean.\n * Only specs that return true will be included.\n * - An APColumnSelector object for declarative filtering, which will be\n * resolved against the provided anchors and matched using matchPColumn.\n * - An array of APColumnSelector objects - columns matching ANY selector\n * in the array will be included (OR operation).\n * @param opts - Optional configuration for label generation:\n * - labelOps: Optional configuration for label generation:\n * - includeNativeLabel: Whether to include native column labels\n * - separator: String to use between label parts (defaults to \" / \")\n * - addLabelAsSuffix: Whether to add labels as suffix instead of prefix\n * - dontWaitAllData: Whether to skip columns that don't have all data (if not set, will return undefined,\n * if at least one column that requires splitting is missing data)\n * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,\n * or undefined if any PlRef resolution fails.\n */\n getCanonicalOptions(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): { label: string; value: SUniversalPColumnId }[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n const entries = new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getUniversalEntries(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n if (!entries) return undefined;\n return entries.map((item) => ({\n value: item.id,\n label: item.label,\n }));\n }\n\n /**\n * @deprecated use getData()\n */\n public getDataFromResultPool(): ResultCollection<PObject<TreeNodeAccessor>> {\n return this.getData();\n }\n\n public getData(): ResultCollection<PObject<TreeNodeAccessor>> {\n const result = this.ctx.getDataFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: new TreeNodeAccessor(e.obj.data, [e.ref.blockId, e.ref.name]),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getDataWithErrors()\n */\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n const result = this.ctx.getDataWithErrorsFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: mapValueInVOE(\n e.obj.data,\n (handle) => new TreeNodeAccessor(handle, [e.ref.blockId, e.ref.name]),\n ),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getSpecs()\n */\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n return this.getSpecs();\n }\n\n public getSpecs(): ResultCollection<PObjectSpec> {\n return this.ctx.getSpecsFromResultPool();\n }\n\n /**\n * @param ref a Ref\n * @returns data associated with the ref\n */\n public getDataByRef(ref: PlRef): PObject<TreeNodeAccessor> | undefined {\n // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getDataFromResultPoolByRef === \"undefined\")\n return this.getData().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name,\n )?.obj;\n const data = this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name); // Keep original call\n // Need to handle undefined case before mapping\n if (!data) return undefined;\n return mapPObjectData(data, (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]));\n }\n\n /**\n * Returns data associated with the ref ensuring that it is a p-column.\n * @param ref a Ref\n * @returns p-column associated with the ref\n */\n public getPColumnByRef(ref: PlRef): PColumn<TreeNodeAccessor> | undefined {\n const data = this.getDataByRef(ref);\n if (!data) return undefined;\n return ensurePColumn(data);\n }\n\n /**\n * Returns spec associated with the ref ensuring that it is a p-column spec.\n * @param ref a Ref\n * @returns p-column spec associated with the ref\n */\n public getPColumnSpecByRef(ref: PlRef): PColumnSpec | undefined {\n const spec = this.getSpecByRef(ref);\n if (!spec) return undefined;\n if (!isPColumnSpec(spec)) throw new Error(`not a PColumn spec (kind = ${spec.kind})`);\n return spec;\n }\n\n /**\n * @param ref a Ref\n * @returns object spec associated with the ref\n */\n public getSpecByRef(ref: PlRef): PObjectSpec | undefined {\n return this.ctx.getSpecFromResultPoolByRef(ref.blockId, ref.name);\n }\n\n /**\n * @param spec object specification\n * @returns array of data objects with compatible specs\n * @deprecated delete this method after Jan 1, 2025\n */\n public findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[] {\n const result: PObject<TreeNodeAccessor>[] = [];\n\n out: for (const data of this.getData().entries) {\n if (!isPColumnSpec(data.obj.spec)) {\n continue;\n }\n\n const oth = data.obj.spec;\n\n if (spec.name !== oth.name) {\n continue;\n }\n\n if (spec.valueType !== oth.valueType) {\n continue;\n }\n\n if (spec.axesSpec.length !== oth.axesSpec.length) {\n continue;\n }\n\n if (!matchDomain(spec.domain, oth.domain)) {\n continue;\n }\n\n if (!matchDomain(spec.contextDomain, oth.contextDomain)) {\n continue;\n }\n\n for (let i = 0; i < spec.axesSpec.length; ++i) {\n const qAx = spec.axesSpec[i];\n const tAx = oth.axesSpec[i];\n if (qAx.name !== tAx.name) {\n continue out;\n }\n if (qAx.type !== tAx.type) {\n continue out;\n }\n if (!matchDomain(qAx.domain, tAx.domain)) {\n continue out;\n }\n if (!matchDomain(qAx.contextDomain, tAx.contextDomain)) {\n continue out;\n }\n }\n\n result.push(data.obj);\n }\n return result;\n }\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.getData();\n for (const column of dataPool.entries) {\n if (!isPColumn(column.obj)) continue;\n\n const spec = column.obj.spec;\n if (\n spec.name === PColumnName.Label &&\n spec.axesSpec.length === 1 &&\n spec.axesSpec[0].name === axis.name &&\n spec.axesSpec[0].type === axis.type &&\n matchDomain(axis.domain, spec.axesSpec[0].domain) &&\n matchDomain(axis.contextDomain, spec.axesSpec[0].contextDomain)\n ) {\n if (column.obj.data.resourceType.name !== \"PColumnData/Json\") {\n throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);\n }\n const labels: Record<string | number, string> = Object.fromEntries(\n Object.entries(\n column.obj.data.getDataAsJson<{\n data: Record<string | number, string>;\n }>().data,\n ).map((e) => [JSON.parse(e[0])[0], e[1]]),\n );\n\n return labels;\n }\n }\n return undefined;\n }\n\n /**\n * Selects columns based on the provided selectors, returning PColumn objects\n * with lazily loaded data.\n *\n * @param selectors - A predicate function, a single selector, or an array of selectors.\n * @returns An array of PColumn objects matching the selectors. Data is loaded on first access.\n */\n public selectColumns(\n selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],\n ): PColumn<TreeNodeAccessor | undefined>[] {\n const predicate =\n typeof selectors === \"function\" ? selectors : legacyColumnSelectorsToPredicate(selectors);\n\n const matchedSpecs = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n // Map specs to PColumn objects with lazy data loading\n return matchedSpecs.map(({ ref, obj: spec }) => {\n // Type assertion needed because filter ensures it's PColumnSpec\n const pcolumnSpec = spec as PColumnSpec;\n let _cachedData: TreeNodeAccessor | undefined | null = null; // Use null to distinguish initial state from undefined result\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this; // Capture 'this' for use inside the getter\n\n return {\n id: canonicalize(ref) as PObjectId,\n spec: pcolumnSpec,\n get data(): TreeNodeAccessor | undefined {\n if (_cachedData !== null) {\n return _cachedData; // Return cached data (could be undefined if fetch failed)\n }\n\n _cachedData = self.getPColumnByRef(ref)?.data;\n return _cachedData;\n },\n } satisfies PColumn<TreeNodeAccessor | undefined>; // Cast needed because 'data' is a getter\n });\n }\n\n /**\n * Find labels data for a given axis id of a p-column.\n * @returns a map of axis value => label\n */\n public findLabelsForColumnAxis(\n column: PColumnSpec,\n axisIdx: number,\n ): Record<string | number, string> | undefined {\n const labels = this.findLabels(column.axesSpec[axisIdx]);\n if (!labels) return undefined;\n const axisKeys = readAnnotation(column, `pl7.app/axisKeys/${axisIdx}`);\n if (axisKeys !== undefined) {\n const keys = JSON.parse(axisKeys) as string[];\n return Object.fromEntries(\n keys.map((key) => {\n return [key, labels[key] ?? \"Unlabelled\"];\n }),\n );\n } else {\n return labels;\n }\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport abstract class RenderCtxBase<\n Args = unknown,\n Data = unknown,\n ModelServices = Partial<AllModelServices>,\n> {\n protected readonly ctx: GlobalCfgRenderCtx;\n private readonly requiredServiceNames: ServiceName[];\n private cachedServices?: ModelServices;\n\n constructor(requiredServiceNames: ServiceName[] = []) {\n this.ctx = getCfgRenderCtx();\n this.requiredServiceNames = requiredServiceNames;\n }\n\n get services(): ModelServices {\n if (this.cachedServices) return this.cachedServices;\n const ctx = this.ctx;\n const services = Object.freeze(\n Object.fromEntries(\n this.requiredServiceNames.map((id) => [\n id,\n Object.freeze(\n Object.fromEntries(\n (ctx.getServiceMethods(id) as string[]).map((method) => [\n method,\n (...args: unknown[]) => ctx.callServiceMethod(id, method, ...args),\n ]),\n ),\n ),\n ]),\n ),\n ) as ModelServices;\n this.cachedServices = services;\n return services;\n }\n\n private dataCache?: { v: Data };\n\n public get data(): Data {\n if (this.dataCache === undefined) {\n const raw = this.ctx.data;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.dataCache = { v: value ? JSON.parse(value) : ({} as Data) };\n }\n return this.dataCache.v;\n }\n\n // lazy rendering because this feature is rarely used\n private activeArgsCache?: { v?: Args };\n\n /**\n * Returns args snapshot the block was executed for (i.e. when \"Run\" button was pressed).\n * Returns undefined, if block was never executed or stopped mid-way execution, so that the result was cleared.\n * */\n public get activeArgs(): Args | undefined {\n if (this.activeArgsCache === undefined) {\n const raw = this.ctx.activeArgs;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.activeArgsCache = {\n v: value ? JSON.parse(value) : undefined,\n };\n }\n return this.activeArgsCache.v;\n }\n\n // /** Can be used to determine features provided by the desktop instance. */\n // public get featureFlags() {\n // return this.ctx.featureFlags;\n // }\n\n private getNamedAccessor(name: string): TreeNodeAccessor | undefined {\n return ifDef(\n this.ctx.getAccessorHandleByName(name),\n (accessor) => new TreeNodeAccessor(accessor, [name]),\n );\n }\n\n public get prerun(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(StagingAccessorName);\n }\n\n public get outputs(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(MainAccessorName);\n }\n\n public readonly resultPool = new ResultPool();\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n * @deprecated Use resultPool.findLabels instead\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n return this.resultPool.findLabels(axis);\n }\n\n private verifyInlineAndExplicitColumnsSupport(\n columns: (PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>)[],\n ) {\n const hasInlineColumns = columns.some(\n (c) => !(c.data instanceof TreeNodeAccessor) || isDataInfo(c.data),\n ); // Updated check for DataInfo\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport)\n throw Error(`Inline or explicit columns not supported`); // Combined check\n\n // Removed redundant explicitColumns check\n }\n\n private patchPTableDef(\n def: PTableDef<PColumn<PColumnDataUniversal>>,\n ): PTableDef<PColumn<PColumnDataUniversal>> {\n if (!this.ctx.featureFlags?.pTablePartitionFiltersSupport) {\n // For old desktop move all partition filters to filters field as it doesn't read partitionFilters field\n def = {\n ...def,\n partitionFilters: [],\n filters: [...def.partitionFilters, ...def.filters],\n };\n }\n if (!this.ctx.featureFlags?.pFrameInSetFilterSupport) {\n def = {\n ...def,\n partitionFilters: patchInSetFilters(def.partitionFilters),\n filters: patchInSetFilters(def.filters),\n };\n }\n return def;\n }\n\n // TODO remove all non-PColumn fields\n public createPFrame(\n def: PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>>,\n ): PFrameHandle | undefined {\n this.verifyInlineAndExplicitColumnsSupport(def);\n if (!allPColumnsReady(def)) return undefined;\n return this.ctx.createPFrame(def.map((c) => transformPColumnData(c)));\n }\n\n // TODO remove all non-PColumn fields\n public createPTable(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableHandle | undefined;\n public createPTable(def: {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle | undefined;\n public createPTable(\n def:\n | PTableDef<PColumn<PColumnDataUniversal>>\n | {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle | undefined {\n let rawDef: PTableDef<PColumn<PColumnDataUniversal>>;\n if (\"columns\" in def) {\n rawDef = this.patchPTableDef({\n src: {\n type: \"full\",\n entries: def.columns.map((c) => ({ type: \"column\", column: c })),\n },\n partitionFilters: def.filters ?? [],\n filters: [],\n sorting: def.sorting ?? [],\n });\n } else {\n rawDef = this.patchPTableDef(def);\n }\n const columns = extractAllColumns(rawDef.src);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTable(mapPTableDef(rawDef, (po) => transformPColumnData(po)));\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnDataUniversal>>): PTableHandle | undefined {\n const columns = collectSpecQueryColumns(def.query);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTableV2(mapPTableDefV2(def, (po) => transformPColumnData(po)));\n }\n\n /** @deprecated scheduled for removal from SDK */\n public getBlockLabel(blockId: string): string {\n return this.ctx.getBlockLabel(blockId);\n }\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.ctx.getCurrentUnstableMarker();\n }\n\n public logInfo(msg: string): void {\n this.ctx.logInfo(msg);\n }\n\n public logWarn(msg: string): void {\n this.ctx.logWarn(msg);\n }\n\n public logError(msg: string): void {\n this.ctx.logError(msg);\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) for v3+ blocks */\nexport class BlockRenderCtx<\n Args = unknown,\n Data = unknown,\n ModelServices = BlockDefaultModelServices,\n> extends RenderCtxBase<Args, Data, ModelServices> {\n private argsCache?: { v: Args | undefined };\n public get args(): Args | undefined {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: value === undefined ? undefined : JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n}\n\n/** Render context for legacy v1/v2 blocks - provides backward compatibility */\nexport class RenderCtxLegacy<Args = unknown, UiState = unknown> extends RenderCtxBase<\n Args,\n UiState\n> {\n private argsCache?: { v: Args };\n\n public get args(): Args {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n\n private uiStateCache?: { v: UiState };\n\n public get uiState(): UiState {\n if (this.uiStateCache === undefined) {\n const raw = this.ctx.uiState!;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.uiStateCache = { v: value ? JSON.parse(value) : ({} as UiState) };\n }\n return this.uiStateCache.v;\n }\n}\n\n/**\n * Render context for plugin output functions.\n * Reads plugin data from blockStorage and derives params from pre-wrapped input callbacks.\n *\n * Parameterized on the factory-like phantom F so that getPluginData returns\n * InferFactoryData<F> directly — no casts needed for the data getter.\n *\n * @typeParam F - PluginFactoryLike phantom carrying data/params/outputs types\n */\nexport class PluginRenderCtx<\n F extends PluginFactoryLike = PluginFactoryLike,\n ModelServices = InferFactoryModelServices<F>,\n> extends RenderCtxBase<unknown, InferFactoryData<F>, ModelServices> {\n private readonly handle: PluginHandle<F>;\n private readonly wrappedInputs: Record<string, () => unknown>;\n\n constructor(\n handle: PluginHandle<F>,\n wrappedInputs: Record<string, () => unknown>,\n requiredServiceNames: ServiceName[] = [],\n ) {\n super(requiredServiceNames);\n this.handle = handle;\n this.wrappedInputs = wrappedInputs;\n }\n\n private pluginDataCache?: { v: InferFactoryData<F> };\n\n /** Plugin's persistent data from blockStorage.__plugins.{pluginId}.__data */\n public override get data(): InferFactoryData<F> {\n if (this.pluginDataCache === undefined) {\n const raw = this.ctx.blockStorage();\n this.pluginDataCache = { v: getPluginData(parseJson(raw), this.handle) };\n }\n return this.pluginDataCache.v;\n }\n\n private paramsCache?: { v: InferFactoryParams<F> };\n\n /** Params derived from block context via pre-wrapped input callbacks */\n public get params(): InferFactoryParams<F> {\n if (this.paramsCache === undefined) {\n const result: Record<string, unknown> = {};\n for (const [key, fn] of Object.entries(this.wrappedInputs)) {\n result[key] = fn();\n }\n this.paramsCache = { v: result as InferFactoryParams<F> };\n }\n return this.paramsCache.v;\n }\n}\n\n/** @deprecated Use BlockRenderCtx instead */\nexport type RenderCtx<Args = unknown, Data = unknown> = BlockRenderCtx<Args, Data>;\n\nexport type RenderFunction<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: BlockRenderCtx<Args, State>,\n) => Ret;\n\nexport type RenderFunctionLegacy<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: RenderCtxLegacy<Args, State>,\n) => Ret;\n\nexport type UnwrapFutureRef<K> =\n K extends FutureRef<infer T>\n ? T\n : K extends bigint | boolean | null | number | string | symbol | undefined\n ? K\n : { [key in keyof K]: UnwrapFutureRef<K[key]> };\n\nexport type InferRenderFunctionReturn<RF extends AnyFunction> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { InferFactoryData, InferFactoryParams, PluginFactoryLike, PluginHandle } from "../plugin_handle.js";
1
+ import { InferFactoryData, InferFactoryModelServices, InferFactoryParams, PluginFactoryLike, PluginHandle } from "../plugin_handle.js";
2
+ import { BlockDefaultModelServices } from "../services/service_resolve.js";
2
3
  import { GlobalCfgRenderCtx, PColumnDataUniversal } from "./internal.js";
3
4
  import { FutureRef } from "./future.js";
4
5
  import { TreeNodeAccessor } from "./accessor.js";
@@ -6,7 +7,7 @@ import { DeriveLabelsOptions } from "../labels/derive_distinct_labels.js";
6
7
  import "./util/label.js";
7
8
  import { APColumnSelectorWithSplit } from "./util/split_selectors.js";
8
9
  import { AxisLabelProvider, ColumnProvider } from "./util/column_collection.js";
9
- import { AnchoredIdDeriver, AnchoredPColumnSelector, AnyFunction, AxesId, AxesSpec, AxisId, DiscoverColumnsRequest, DiscoverColumnsResponse, Option, PColumn, PColumnLazy, PColumnSelector, PColumnSpec, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableColumnId, PTableColumnSpec, PTableDef, PTableDefV2, PTableHandle, PTableRecordFilter, PTableSorting, PlRef, ResolveAnchorsOptions, ResultCollection, SUniversalPColumnId, SingleAxisSelector, ValueOrError } from "@milaboratories/pl-model-common";
10
+ import { AnchoredIdDeriver, AnchoredPColumnSelector, AnyFunction, AxisId, ModelServices, Option, PColumn, PColumnLazy, PColumnSelector, PColumnSpec, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableDef, PTableDefV2, PTableHandle, PTableRecordFilter, PTableSorting, PlRef, ResolveAnchorsOptions, ResultCollection, SUniversalPColumnId, ServiceName, ValueOrError } from "@milaboratories/pl-model-common";
10
11
  import { Optional } from "utility-types";
11
12
 
12
13
  //#region src/render/api.d.ts
@@ -148,9 +149,12 @@ declare class ResultPool implements ColumnProvider, AxisLabelProvider {
148
149
  findLabelsForColumnAxis(column: PColumnSpec, axisIdx: number): Record<string | number, string> | undefined;
149
150
  }
150
151
  /** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */
151
- declare abstract class RenderCtxBase<Args = unknown, Data = unknown> {
152
+ declare abstract class RenderCtxBase<Args = unknown, Data = unknown, ModelServices$1 = Partial<ModelServices>> {
152
153
  protected readonly ctx: GlobalCfgRenderCtx;
153
- constructor();
154
+ private readonly requiredServiceNames;
155
+ private cachedServices?;
156
+ constructor(requiredServiceNames?: ServiceName[]);
157
+ get services(): ModelServices$1;
154
158
  private dataCache?;
155
159
  get data(): Data;
156
160
  private activeArgsCache?;
@@ -181,20 +185,13 @@ declare abstract class RenderCtxBase<Args = unknown, Data = unknown> {
181
185
  createPTableV2(def: PTableDefV2<PColumn<PColumnDataUniversal>>): PTableHandle | undefined;
182
186
  /** @deprecated scheduled for removal from SDK */
183
187
  getBlockLabel(blockId: string): string;
184
- createSpecFrame(specs: Record<string, PColumnSpec>): string;
185
- specFrameDiscoverColumns(handle: string, request: DiscoverColumnsRequest): DiscoverColumnsResponse;
186
- disposeSpecFrame(handle: string): void;
187
- expandAxes(spec: AxesSpec): AxesId;
188
- collapseAxes(ids: AxesId): AxesSpec;
189
- findAxis(spec: AxesSpec, selector: SingleAxisSelector): number;
190
- findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number;
191
188
  getCurrentUnstableMarker(): string | undefined;
192
189
  logInfo(msg: string): void;
193
190
  logWarn(msg: string): void;
194
191
  logError(msg: string): void;
195
192
  }
196
193
  /** Main entry point to the API available within model lambdas (like outputs, sections, etc..) for v3+ blocks */
197
- declare class BlockRenderCtx<Args = unknown, Data = unknown> extends RenderCtxBase<Args, Data> {
194
+ declare class BlockRenderCtx<Args = unknown, Data = unknown, ModelServices = BlockDefaultModelServices> extends RenderCtxBase<Args, Data, ModelServices> {
198
195
  private argsCache?;
199
196
  get args(): Args | undefined;
200
197
  }
@@ -214,10 +211,10 @@ declare class RenderCtxLegacy<Args = unknown, UiState = unknown> extends RenderC
214
211
  *
215
212
  * @typeParam F - PluginFactoryLike phantom carrying data/params/outputs types
216
213
  */
217
- declare class PluginRenderCtx<F extends PluginFactoryLike = PluginFactoryLike> extends RenderCtxBase<unknown, InferFactoryData<F>> {
214
+ declare class PluginRenderCtx<F extends PluginFactoryLike = PluginFactoryLike, ModelServices = InferFactoryModelServices<F>> extends RenderCtxBase<unknown, InferFactoryData<F>, ModelServices> {
218
215
  private readonly handle;
219
216
  private readonly wrappedInputs;
220
- constructor(handle: PluginHandle<F>, wrappedInputs: Record<string, () => unknown>);
217
+ constructor(handle: PluginHandle<F>, wrappedInputs: Record<string, () => unknown>, requiredServiceNames?: ServiceName[]);
221
218
  private pluginDataCache?;
222
219
  /** Plugin's persistent data from blockStorage.__plugins.{pluginId}.__data */
223
220
  get data(): InferFactoryData<F>;
@@ -306,8 +306,18 @@ var ResultPool = class {
306
306
  /** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */
307
307
  var RenderCtxBase = class {
308
308
  ctx;
309
- constructor() {
309
+ requiredServiceNames;
310
+ cachedServices;
311
+ constructor(requiredServiceNames = []) {
310
312
  this.ctx = getCfgRenderCtx();
313
+ this.requiredServiceNames = requiredServiceNames;
314
+ }
315
+ get services() {
316
+ if (this.cachedServices) return this.cachedServices;
317
+ const ctx = this.ctx;
318
+ const services = Object.freeze(Object.fromEntries(this.requiredServiceNames.map((id) => [id, Object.freeze(Object.fromEntries(ctx.getServiceMethods(id).map((method) => [method, (...args) => ctx.callServiceMethod(id, method, ...args)])))])));
319
+ this.cachedServices = services;
320
+ return services;
311
321
  }
312
322
  dataCache;
313
323
  get data() {
@@ -402,27 +412,6 @@ var RenderCtxBase = class {
402
412
  getBlockLabel(blockId) {
403
413
  return this.ctx.getBlockLabel(blockId);
404
414
  }
405
- createSpecFrame(specs) {
406
- return this.ctx.createSpecFrame(specs);
407
- }
408
- specFrameDiscoverColumns(handle, request) {
409
- return this.ctx.specFrameDiscoverColumns(handle, request);
410
- }
411
- disposeSpecFrame(handle) {
412
- this.ctx.disposeSpecFrame(handle);
413
- }
414
- expandAxes(spec) {
415
- return this.ctx.expandAxes(spec);
416
- }
417
- collapseAxes(ids) {
418
- return this.ctx.collapseAxes(ids);
419
- }
420
- findAxis(spec, selector) {
421
- return this.ctx.findAxis(spec, selector);
422
- }
423
- findTableColumn(tableSpec, selector) {
424
- return this.ctx.findTableColumn(tableSpec, selector);
425
- }
426
415
  getCurrentUnstableMarker() {
427
416
  return this.ctx.getCurrentUnstableMarker();
428
417
  }
@@ -481,8 +470,8 @@ var RenderCtxLegacy = class extends RenderCtxBase {
481
470
  var PluginRenderCtx = class extends RenderCtxBase {
482
471
  handle;
483
472
  wrappedInputs;
484
- constructor(handle, wrappedInputs) {
485
- super();
473
+ constructor(handle, wrappedInputs, requiredServiceNames = []) {
474
+ super(requiredServiceNames);
486
475
  this.handle = handle;
487
476
  this.wrappedInputs = wrappedInputs;
488
477
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","names":[],"sources":["../../src/render/api.ts"],"sourcesContent":["import type {\n AnchoredPColumnSelector,\n AnyFunction,\n AxesId,\n AxesSpec,\n AxisId,\n DataInfo,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n Option,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectId,\n PObjectSpec,\n PSpecPredicate,\n PTableColumnId,\n PTableColumnSpec,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResolveAnchorsOptions,\n ResultCollection,\n SingleAxisSelector,\n SUniversalPColumnId,\n ValueOrError,\n} from \"@milaboratories/pl-model-common\";\nimport {\n AnchoredIdDeriver,\n collectSpecQueryColumns,\n ensurePColumn,\n parseJson,\n extractAllColumns,\n isDataInfo,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapPTableDefV2,\n mapValueInVOE,\n PColumnName,\n readAnnotation,\n withEnrichments,\n legacyColumnSelectorsToPredicate,\n} from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type { Optional } from \"utility-types\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { getPluginData } from \"../block_storage\";\nimport type {\n PluginHandle,\n PluginFactoryLike,\n InferFactoryData,\n InferFactoryParams,\n} from \"../plugin_handle\";\nimport { TreeNodeAccessor, ifDef } from \"./accessor\";\nimport type { FutureRef } from \"./future\";\nimport type { AccessorHandle, GlobalCfgRenderCtx } from \"./internal\";\nimport { MainAccessorName, StagingAccessorName } from \"./internal\";\nimport {\n PColumnCollection,\n type AxisLabelProvider,\n type ColumnProvider,\n} from \"./util/column_collection\";\nimport type { LabelDerivationOps } from \"./util/label\";\nimport { deriveLabels } from \"./util/label\";\nimport type { APColumnSelectorWithSplit } from \"./util/split_selectors\";\nimport { patchInSetFilters } from \"./util/pframe_upgraders\";\nimport { allPColumnsReady } from \"./util/pcolumn_data\";\nimport type { PColumnDataUniversal } from \"./internal\";\n\n/**\n * Helper function to match domain objects\n * @param query Optional domain to match against\n * @param target Optional domain to match\n * @returns true if domains match, false otherwise\n */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\nexport type UniversalColumnOption = { label: string; value: SUniversalPColumnId };\n\n/**\n * Transforms PColumn data into the internal representation expected by the platform\n * @param data Data from a PColumn to transform\n * @returns Transformed data compatible with platform API\n */\nfunction transformPColumnData(\n data: PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal>,\n): PColumn<PColumnValues | AccessorHandle | DataInfo<AccessorHandle>> {\n return mapPObjectData(data, (d) => {\n if (d instanceof TreeNodeAccessor) {\n return d.handle;\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (accessor) => accessor.handle);\n } else {\n return d;\n }\n });\n}\n\ntype UniversalPColumnOpts = {\n labelOps?: LabelDerivationOps;\n dontWaitAllData?: boolean;\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n} & ResolveAnchorsOptions;\n\ntype GetOptionsOpts = {\n /**\n * If true, references returned by the method will contain `requireEnrichments` flag set to true.\n * If this reference is added to the block's args, it will communicate to the platform that the block\n * expects enrichments of the referenced block to be available in the context of the current block.\n */\n refsWithEnrichments?: boolean;\n /**\n * Label derivation options.\n * If provided, it will be used to derive labels for the options.\n * If not provided, labels will be derived using the default logic.\n */\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps;\n};\n\nexport class ResultPool implements ColumnProvider, AxisLabelProvider {\n private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();\n\n /**\n * @deprecated use getOptions()\n */\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.ctx.calculateOptions(predicate);\n }\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts,\n ): Option[];\n /** @deprecated wrap label ops with { label: <...> } */\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[];\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts | ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate =\n typeof predicateOrSelector === \"function\"\n ? predicateOrSelector\n : legacyColumnSelectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n\n let labelOps: LabelDerivationOps | ((spec: PObjectSpec, ref: PlRef) => string) = {};\n let refsWithEnrichments: boolean = false;\n if (typeof opts !== \"undefined\") {\n if (typeof opts === \"function\") {\n labelOps = opts;\n } else if (typeof opts === \"object\") {\n if (\"includeNativeLabel\" in opts || \"separator\" in opts || \"addLabelAsSuffix\" in opts) {\n labelOps = opts;\n } else {\n opts = opts as GetOptionsOpts;\n labelOps = opts.label ?? {};\n refsWithEnrichments = opts.refsWithEnrichments ?? false;\n }\n }\n }\n\n if (typeof labelOps === \"object\")\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(\n ({ value: { ref }, label }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label,\n }),\n );\n else\n return filtered.map(({ ref, obj }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label: labelOps(obj, ref),\n }));\n }\n\n public resolveAnchorCtx(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n ): AnchoredIdDeriver | undefined {\n if (anchorsOrCtx instanceof AnchoredIdDeriver) return anchorsOrCtx;\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec) return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n resolvedAnchors[key] = value;\n }\n }\n return new AnchoredIdDeriver(resolvedAnchors);\n }\n\n /**\n * Returns columns that match the provided anchors and selectors. It applies axis filters and label derivation.\n *\n * @param anchorsOrCtx - Anchor context for column selection (same as in getCanonicalOptions)\n * @param predicateOrSelectors - Predicate or selectors for filtering columns (same as in getCanonicalOptions)\n * @param opts - Optional configuration for label generation and data waiting\n * @returns A PFrameHandle for the created PFrame, or undefined if any required data is missing\n */\n public getAnchoredPColumns(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): PColumn<PColumnDataUniversal>[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n return new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getColumns(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate and returns their\n * canonicalized representations.\n *\n * This function filters column specifications from the result pool that match the provided predicate,\n * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value\n * pairs for UI components (like dropdowns).\n *\n * @param anchorsOrCtx - Either:\n * - An existing AnchorCtx instance\n * - A record mapping anchor IDs to PColumnSpec objects\n * - A record mapping anchor IDs to PlRef objects (which will be resolved to PColumnSpec)\n * @param predicateOrSelectors - Either:\n * - A predicate function that takes a PColumnSpec and returns a boolean.\n * Only specs that return true will be included.\n * - An APColumnSelector object for declarative filtering, which will be\n * resolved against the provided anchors and matched using matchPColumn.\n * - An array of APColumnSelector objects - columns matching ANY selector\n * in the array will be included (OR operation).\n * @param opts - Optional configuration for label generation:\n * - labelOps: Optional configuration for label generation:\n * - includeNativeLabel: Whether to include native column labels\n * - separator: String to use between label parts (defaults to \" / \")\n * - addLabelAsSuffix: Whether to add labels as suffix instead of prefix\n * - dontWaitAllData: Whether to skip columns that don't have all data (if not set, will return undefined,\n * if at least one column that requires splitting is missing data)\n * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,\n * or undefined if any PlRef resolution fails.\n */\n getCanonicalOptions(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): { label: string; value: SUniversalPColumnId }[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n const entries = new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getUniversalEntries(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n if (!entries) return undefined;\n return entries.map((item) => ({\n value: item.id,\n label: item.label,\n }));\n }\n\n /**\n * @deprecated use getData()\n */\n public getDataFromResultPool(): ResultCollection<PObject<TreeNodeAccessor>> {\n return this.getData();\n }\n\n public getData(): ResultCollection<PObject<TreeNodeAccessor>> {\n const result = this.ctx.getDataFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: new TreeNodeAccessor(e.obj.data, [e.ref.blockId, e.ref.name]),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getDataWithErrors()\n */\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n const result = this.ctx.getDataWithErrorsFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: mapValueInVOE(\n e.obj.data,\n (handle) => new TreeNodeAccessor(handle, [e.ref.blockId, e.ref.name]),\n ),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getSpecs()\n */\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n return this.getSpecs();\n }\n\n public getSpecs(): ResultCollection<PObjectSpec> {\n return this.ctx.getSpecsFromResultPool();\n }\n\n /**\n * @param ref a Ref\n * @returns data associated with the ref\n */\n public getDataByRef(ref: PlRef): PObject<TreeNodeAccessor> | undefined {\n // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getDataFromResultPoolByRef === \"undefined\")\n return this.getData().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name,\n )?.obj;\n const data = this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name); // Keep original call\n // Need to handle undefined case before mapping\n if (!data) return undefined;\n return mapPObjectData(data, (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]));\n }\n\n /**\n * Returns data associated with the ref ensuring that it is a p-column.\n * @param ref a Ref\n * @returns p-column associated with the ref\n */\n public getPColumnByRef(ref: PlRef): PColumn<TreeNodeAccessor> | undefined {\n const data = this.getDataByRef(ref);\n if (!data) return undefined;\n return ensurePColumn(data);\n }\n\n /**\n * Returns spec associated with the ref ensuring that it is a p-column spec.\n * @param ref a Ref\n * @returns p-column spec associated with the ref\n */\n public getPColumnSpecByRef(ref: PlRef): PColumnSpec | undefined {\n const spec = this.getSpecByRef(ref);\n if (!spec) return undefined;\n if (!isPColumnSpec(spec)) throw new Error(`not a PColumn spec (kind = ${spec.kind})`);\n return spec;\n }\n\n /**\n * @param ref a Ref\n * @returns object spec associated with the ref\n */\n public getSpecByRef(ref: PlRef): PObjectSpec | undefined {\n return this.ctx.getSpecFromResultPoolByRef(ref.blockId, ref.name);\n }\n\n /**\n * @param spec object specification\n * @returns array of data objects with compatible specs\n * @deprecated delete this method after Jan 1, 2025\n */\n public findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[] {\n const result: PObject<TreeNodeAccessor>[] = [];\n\n out: for (const data of this.getData().entries) {\n if (!isPColumnSpec(data.obj.spec)) {\n continue;\n }\n\n const oth = data.obj.spec;\n\n if (spec.name !== oth.name) {\n continue;\n }\n\n if (spec.valueType !== oth.valueType) {\n continue;\n }\n\n if (spec.axesSpec.length !== oth.axesSpec.length) {\n continue;\n }\n\n if (!matchDomain(spec.domain, oth.domain)) {\n continue;\n }\n\n if (!matchDomain(spec.contextDomain, oth.contextDomain)) {\n continue;\n }\n\n for (let i = 0; i < spec.axesSpec.length; ++i) {\n const qAx = spec.axesSpec[i];\n const tAx = oth.axesSpec[i];\n if (qAx.name !== tAx.name) {\n continue out;\n }\n if (qAx.type !== tAx.type) {\n continue out;\n }\n if (!matchDomain(qAx.domain, tAx.domain)) {\n continue out;\n }\n if (!matchDomain(qAx.contextDomain, tAx.contextDomain)) {\n continue out;\n }\n }\n\n result.push(data.obj);\n }\n return result;\n }\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.getData();\n for (const column of dataPool.entries) {\n if (!isPColumn(column.obj)) continue;\n\n const spec = column.obj.spec;\n if (\n spec.name === PColumnName.Label &&\n spec.axesSpec.length === 1 &&\n spec.axesSpec[0].name === axis.name &&\n spec.axesSpec[0].type === axis.type &&\n matchDomain(axis.domain, spec.axesSpec[0].domain) &&\n matchDomain(axis.contextDomain, spec.axesSpec[0].contextDomain)\n ) {\n if (column.obj.data.resourceType.name !== \"PColumnData/Json\") {\n throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);\n }\n const labels: Record<string | number, string> = Object.fromEntries(\n Object.entries(\n column.obj.data.getDataAsJson<{\n data: Record<string | number, string>;\n }>().data,\n ).map((e) => [JSON.parse(e[0])[0], e[1]]),\n );\n\n return labels;\n }\n }\n return undefined;\n }\n\n /**\n * Selects columns based on the provided selectors, returning PColumn objects\n * with lazily loaded data.\n *\n * @param selectors - A predicate function, a single selector, or an array of selectors.\n * @returns An array of PColumn objects matching the selectors. Data is loaded on first access.\n */\n public selectColumns(\n selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],\n ): PColumn<TreeNodeAccessor | undefined>[] {\n const predicate =\n typeof selectors === \"function\" ? selectors : legacyColumnSelectorsToPredicate(selectors);\n\n const matchedSpecs = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n // Map specs to PColumn objects with lazy data loading\n return matchedSpecs.map(({ ref, obj: spec }) => {\n // Type assertion needed because filter ensures it's PColumnSpec\n const pcolumnSpec = spec as PColumnSpec;\n let _cachedData: TreeNodeAccessor | undefined | null = null; // Use null to distinguish initial state from undefined result\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this; // Capture 'this' for use inside the getter\n\n return {\n id: canonicalize(ref) as PObjectId,\n spec: pcolumnSpec,\n get data(): TreeNodeAccessor | undefined {\n if (_cachedData !== null) {\n return _cachedData; // Return cached data (could be undefined if fetch failed)\n }\n\n _cachedData = self.getPColumnByRef(ref)?.data;\n return _cachedData;\n },\n } satisfies PColumn<TreeNodeAccessor | undefined>; // Cast needed because 'data' is a getter\n });\n }\n\n /**\n * Find labels data for a given axis id of a p-column.\n * @returns a map of axis value => label\n */\n public findLabelsForColumnAxis(\n column: PColumnSpec,\n axisIdx: number,\n ): Record<string | number, string> | undefined {\n const labels = this.findLabels(column.axesSpec[axisIdx]);\n if (!labels) return undefined;\n const axisKeys = readAnnotation(column, `pl7.app/axisKeys/${axisIdx}`);\n if (axisKeys !== undefined) {\n const keys = JSON.parse(axisKeys) as string[];\n return Object.fromEntries(\n keys.map((key) => {\n return [key, labels[key] ?? \"Unlabelled\"];\n }),\n );\n } else {\n return labels;\n }\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport abstract class RenderCtxBase<Args = unknown, Data = unknown> {\n protected readonly ctx: GlobalCfgRenderCtx;\n\n constructor() {\n this.ctx = getCfgRenderCtx();\n }\n\n private dataCache?: { v: Data };\n\n public get data(): Data {\n if (this.dataCache === undefined) {\n const raw = this.ctx.data;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.dataCache = { v: value ? JSON.parse(value) : ({} as Data) };\n }\n return this.dataCache.v;\n }\n\n // lazy rendering because this feature is rarely used\n private activeArgsCache?: { v?: Args };\n\n /**\n * Returns args snapshot the block was executed for (i.e. when \"Run\" button was pressed).\n * Returns undefined, if block was never executed or stopped mid-way execution, so that the result was cleared.\n * */\n public get activeArgs(): Args | undefined {\n if (this.activeArgsCache === undefined) {\n const raw = this.ctx.activeArgs;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.activeArgsCache = {\n v: value ? JSON.parse(value) : undefined,\n };\n }\n return this.activeArgsCache.v;\n }\n\n // /** Can be used to determine features provided by the desktop instance. */\n // public get featureFlags() {\n // return this.ctx.featureFlags;\n // }\n\n private getNamedAccessor(name: string): TreeNodeAccessor | undefined {\n return ifDef(\n this.ctx.getAccessorHandleByName(name),\n (accessor) => new TreeNodeAccessor(accessor, [name]),\n );\n }\n\n public get prerun(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(StagingAccessorName);\n }\n\n public get outputs(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(MainAccessorName);\n }\n\n public readonly resultPool = new ResultPool();\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n * @deprecated Use resultPool.findLabels instead\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n return this.resultPool.findLabels(axis);\n }\n\n private verifyInlineAndExplicitColumnsSupport(\n columns: (PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>)[],\n ) {\n const hasInlineColumns = columns.some(\n (c) => !(c.data instanceof TreeNodeAccessor) || isDataInfo(c.data),\n ); // Updated check for DataInfo\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport)\n throw Error(`Inline or explicit columns not supported`); // Combined check\n\n // Removed redundant explicitColumns check\n }\n\n private patchPTableDef(\n def: PTableDef<PColumn<PColumnDataUniversal>>,\n ): PTableDef<PColumn<PColumnDataUniversal>> {\n if (!this.ctx.featureFlags?.pTablePartitionFiltersSupport) {\n // For old desktop move all partition filters to filters field as it doesn't read partitionFilters field\n def = {\n ...def,\n partitionFilters: [],\n filters: [...def.partitionFilters, ...def.filters],\n };\n }\n if (!this.ctx.featureFlags?.pFrameInSetFilterSupport) {\n def = {\n ...def,\n partitionFilters: patchInSetFilters(def.partitionFilters),\n filters: patchInSetFilters(def.filters),\n };\n }\n return def;\n }\n\n // TODO remove all non-PColumn fields\n public createPFrame(\n def: PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>>,\n ): PFrameHandle | undefined {\n this.verifyInlineAndExplicitColumnsSupport(def);\n if (!allPColumnsReady(def)) return undefined;\n return this.ctx.createPFrame(def.map((c) => transformPColumnData(c)));\n }\n\n // TODO remove all non-PColumn fields\n public createPTable(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableHandle | undefined;\n public createPTable(def: {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle | undefined;\n public createPTable(\n def:\n | PTableDef<PColumn<PColumnDataUniversal>>\n | {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle | undefined {\n let rawDef: PTableDef<PColumn<PColumnDataUniversal>>;\n if (\"columns\" in def) {\n rawDef = this.patchPTableDef({\n src: {\n type: \"full\",\n entries: def.columns.map((c) => ({ type: \"column\", column: c })),\n },\n partitionFilters: def.filters ?? [],\n filters: [],\n sorting: def.sorting ?? [],\n });\n } else {\n rawDef = this.patchPTableDef(def);\n }\n const columns = extractAllColumns(rawDef.src);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTable(mapPTableDef(rawDef, (po) => transformPColumnData(po)));\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnDataUniversal>>): PTableHandle | undefined {\n const columns = collectSpecQueryColumns(def.query);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTableV2(mapPTableDefV2(def, (po) => transformPColumnData(po)));\n }\n\n /** @deprecated scheduled for removal from SDK */\n public getBlockLabel(blockId: string): string {\n return this.ctx.getBlockLabel(blockId);\n }\n\n //\n // Spec Frames\n //\n\n public createSpecFrame(specs: Record<string, PColumnSpec>): string {\n return this.ctx.createSpecFrame(specs);\n }\n\n public specFrameDiscoverColumns(\n handle: string,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n return this.ctx.specFrameDiscoverColumns(handle, request);\n }\n\n public disposeSpecFrame(handle: string): void {\n this.ctx.disposeSpecFrame(handle);\n }\n\n public expandAxes(spec: AxesSpec): AxesId {\n return this.ctx.expandAxes(spec);\n }\n\n public collapseAxes(ids: AxesId): AxesSpec {\n return this.ctx.collapseAxes(ids);\n }\n\n public findAxis(spec: AxesSpec, selector: SingleAxisSelector): number {\n return this.ctx.findAxis(spec, selector);\n }\n\n public findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number {\n return this.ctx.findTableColumn(tableSpec, selector);\n }\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.ctx.getCurrentUnstableMarker();\n }\n\n public logInfo(msg: string): void {\n this.ctx.logInfo(msg);\n }\n\n public logWarn(msg: string): void {\n this.ctx.logWarn(msg);\n }\n\n public logError(msg: string): void {\n this.ctx.logError(msg);\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) for v3+ blocks */\nexport class BlockRenderCtx<Args = unknown, Data = unknown> extends RenderCtxBase<Args, Data> {\n private argsCache?: { v: Args | undefined };\n public get args(): Args | undefined {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: value === undefined ? undefined : JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n}\n\n/** Render context for legacy v1/v2 blocks - provides backward compatibility */\nexport class RenderCtxLegacy<Args = unknown, UiState = unknown> extends RenderCtxBase<\n Args,\n UiState\n> {\n private argsCache?: { v: Args };\n\n public get args(): Args {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n\n private uiStateCache?: { v: UiState };\n\n public get uiState(): UiState {\n if (this.uiStateCache === undefined) {\n const raw = this.ctx.uiState!;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.uiStateCache = { v: value ? JSON.parse(value) : ({} as UiState) };\n }\n return this.uiStateCache.v;\n }\n}\n\n/**\n * Render context for plugin output functions.\n * Reads plugin data from blockStorage and derives params from pre-wrapped input callbacks.\n *\n * Parameterized on the factory-like phantom F so that getPluginData returns\n * InferFactoryData<F> directly — no casts needed for the data getter.\n *\n * @typeParam F - PluginFactoryLike phantom carrying data/params/outputs types\n */\nexport class PluginRenderCtx<F extends PluginFactoryLike = PluginFactoryLike> extends RenderCtxBase<\n unknown,\n InferFactoryData<F>\n> {\n private readonly handle: PluginHandle<F>;\n private readonly wrappedInputs: Record<string, () => unknown>;\n\n constructor(handle: PluginHandle<F>, wrappedInputs: Record<string, () => unknown>) {\n super();\n this.handle = handle;\n this.wrappedInputs = wrappedInputs;\n }\n\n private pluginDataCache?: { v: InferFactoryData<F> };\n\n /** Plugin's persistent data from blockStorage.__plugins.{pluginId}.__data */\n public override get data(): InferFactoryData<F> {\n if (this.pluginDataCache === undefined) {\n const raw = this.ctx.blockStorage();\n this.pluginDataCache = { v: getPluginData(parseJson(raw), this.handle) };\n }\n return this.pluginDataCache.v;\n }\n\n private paramsCache?: { v: InferFactoryParams<F> };\n\n /** Params derived from block context via pre-wrapped input callbacks */\n public get params(): InferFactoryParams<F> {\n if (this.paramsCache === undefined) {\n const result: Record<string, unknown> = {};\n for (const [key, fn] of Object.entries(this.wrappedInputs)) {\n result[key] = fn();\n }\n this.paramsCache = { v: result as InferFactoryParams<F> };\n }\n return this.paramsCache.v;\n }\n}\n\n/** @deprecated Use BlockRenderCtx instead */\nexport type RenderCtx<Args = unknown, Data = unknown> = BlockRenderCtx<Args, Data>;\n\nexport type RenderFunction<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: BlockRenderCtx<Args, State>,\n) => Ret;\n\nexport type RenderFunctionLegacy<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: RenderCtxLegacy<Args, State>,\n) => Ret;\n\nexport type UnwrapFutureRef<K> =\n K extends FutureRef<infer T>\n ? T\n : K extends bigint | boolean | null | number | string | symbol | undefined\n ? K\n : { [key in keyof K]: UnwrapFutureRef<K[key]> };\n\nexport type InferRenderFunctionReturn<RF extends AnyFunction> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuFA,SAAS,YAAY,OAAgC,QAAiC;AACpF,KAAI,UAAU,OAAW,QAAO,WAAW;AAC3C,KAAI,WAAW,OAAW,QAAO;AACjC,MAAK,MAAM,KAAK,OACd,KAAI,MAAM,OAAO,OAAO,GAAI,QAAO;AAErC,QAAO;;;;;;;AAUT,SAAS,qBACP,MACoE;AACpE,QAAO,eAAe,OAAO,MAAM;AACjC,MAAI,aAAa,iBACf,QAAO,EAAE;WACA,WAAW,EAAE,CACtB,QAAO,YAAY,IAAI,aAAa,SAAS,OAAO;MAEpD,QAAO;GAET;;AAwBJ,IAAa,aAAb,MAAqE;CACnE,AAAiB,MAA0B,iBAAiB;;;;CAK5D,AAAO,iBAAiB,WAAqC;AAC3D,SAAO,KAAK,IAAI,iBAAiB,UAAU;;CAY7C,AAAO,WACL,qBACA,MACU;EACV,MAAM,YACJ,OAAO,wBAAwB,aAC3B,sBACA,iCAAiC,oBAAoB;EAC3D,MAAM,WAAW,KAAK,UAAU,CAAC,QAAQ,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC;EAExE,IAAI,WAA6E,EAAE;EACnF,IAAI,sBAA+B;AACnC,MAAI,OAAO,SAAS,aAClB;OAAI,OAAO,SAAS,WAClB,YAAW;YACF,OAAO,SAAS,SACzB,KAAI,wBAAwB,QAAQ,eAAe,QAAQ,sBAAsB,KAC/E,YAAW;QACN;AACL,WAAO;AACP,eAAW,KAAK,SAAS,EAAE;AAC3B,0BAAsB,KAAK,uBAAuB;;;AAKxD,MAAI,OAAO,aAAa,SACtB,QAAO,aAAa,WAAW,MAAM,EAAE,KAAK,YAAY,EAAE,CAAC,CAAC,KACzD,EAAE,OAAO,EAAE,OAAO,aAAa;GAC9B,KAAK,gBAAgB,KAAK,oBAAoB;GAC9C;GACD,EACF;MAED,QAAO,SAAS,KAAK,EAAE,KAAK,WAAW;GACrC,KAAK,gBAAgB,KAAK,oBAAoB;GAC9C,OAAO,SAAS,KAAK,IAAI;GAC1B,EAAE;;CAGP,AAAO,iBACL,cAC+B;AAC/B,MAAI,wBAAwB,kBAAmB,QAAO;EACtD,MAAM,kBAA+C,EAAE;AACvD,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,CACrD,KAAI,QAAQ,MAAM,EAAE;GAClB,MAAM,eAAe,KAAK,oBAAoB,MAAM;AACpD,OAAI,CAAC,aAAc,QAAO;AAC1B,mBAAgB,OAAO;QAEvB,iBAAgB,OAAO;AAG3B,SAAO,IAAI,kBAAkB,gBAAgB;;;;;;;;;;CAW/C,AAAO,oBACL,cACA,sBAIA,MAC6C;EAC7C,MAAM,YAAY,KAAK,iBAAiB,aAAa;AACrD,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,IAAI,mBAAmB,CAC3B,kBAAkB,KAAK,CACvB,qBAAqB,KAAK,CAC1B,WAAW,sBAAsB;GAChC,GAAG;GACH;GACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCN,oBACE,cACA,sBAIA,MAC6D;EAC7D,MAAM,YAAY,KAAK,iBAAiB,aAAa;AACrD,MAAI,CAAC,UAAW,QAAO;EACvB,MAAM,UAAU,IAAI,mBAAmB,CACpC,kBAAkB,KAAK,CACvB,qBAAqB,KAAK,CAC1B,oBAAoB,sBAAsB;GACzC,GAAG;GACH;GACD,CAAC;AACJ,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,KAAK,UAAU;GAC5B,OAAO,KAAK;GACZ,OAAO,KAAK;GACb,EAAE;;;;;CAML,AAAO,wBAAqE;AAC1E,SAAO,KAAK,SAAS;;CAGvB,AAAO,UAAuD;EAC5D,MAAM,SAAS,KAAK,IAAI,uBAAuB;AAC/C,SAAO;GACL,YAAY,OAAO;GACnB,SAAS,OAAO,QAAQ,KAAK,OAAO;IAClC,KAAK,EAAE;IACP,KAAK;KACH,GAAG,EAAE;KACL,MAAM,IAAI,iBAAiB,EAAE,IAAI,MAAM,CAAC,EAAE,IAAI,SAAS,EAAE,IAAI,KAAK,CAAC;KACpE;IACF,EAAE;GACJ;;;;;CAMH,AAAO,kCAEL;AACA,SAAO,KAAK,mBAAmB;;CAGjC,AAAO,oBAEL;EACA,MAAM,SAAS,KAAK,IAAI,iCAAiC;AACzD,SAAO;GACL,YAAY,OAAO;GACnB,SAAS,OAAO,QAAQ,KAAK,OAAO;IAClC,KAAK,EAAE;IACP,KAAK;KACH,GAAG,EAAE;KACL,MAAM,cACJ,EAAE,IAAI,OACL,WAAW,IAAI,iBAAiB,QAAQ,CAAC,EAAE,IAAI,SAAS,EAAE,IAAI,KAAK,CAAC,CACtE;KACF;IACF,EAAE;GACJ;;;;;CAMH,AAAO,yBAAwD;AAC7D,SAAO,KAAK,UAAU;;CAGxB,AAAO,WAA0C;AAC/C,SAAO,KAAK,IAAI,wBAAwB;;;;;;CAO1C,AAAO,aAAa,KAAmD;AAErE,MAAI,OAAO,KAAK,IAAI,+BAA+B,YACjD,QAAO,KAAK,SAAS,CAAC,QAAQ,MAC3B,MAAM,EAAE,IAAI,YAAY,IAAI,WAAW,EAAE,IAAI,SAAS,IAAI,KAC5D,EAAE;EACL,MAAM,OAAO,KAAK,IAAI,2BAA2B,IAAI,SAAS,IAAI,KAAK;AAEvE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,eAAe,OAAO,WAAW,IAAI,iBAAiB,QAAQ,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,CAAC;;;;;;;CAQhG,AAAO,gBAAgB,KAAmD;EACxE,MAAM,OAAO,KAAK,aAAa,IAAI;AACnC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,cAAc,KAAK;;;;;;;CAQ5B,AAAO,oBAAoB,KAAqC;EAC9D,MAAM,OAAO,KAAK,aAAa,IAAI;AACnC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,cAAc,KAAK,CAAE,OAAM,IAAI,MAAM,8BAA8B,KAAK,KAAK,GAAG;AACrF,SAAO;;;;;;CAOT,AAAO,aAAa,KAAqC;AACvD,SAAO,KAAK,IAAI,2BAA2B,IAAI,SAAS,IAAI,KAAK;;;;;;;CAQnE,AAAO,2BAA2B,MAAgD;EAChF,MAAM,SAAsC,EAAE;AAE9C,MAAK,MAAK,MAAM,QAAQ,KAAK,SAAS,CAAC,SAAS;AAC9C,OAAI,CAAC,cAAc,KAAK,IAAI,KAAK,CAC/B;GAGF,MAAM,MAAM,KAAK,IAAI;AAErB,OAAI,KAAK,SAAS,IAAI,KACpB;AAGF,OAAI,KAAK,cAAc,IAAI,UACzB;AAGF,OAAI,KAAK,SAAS,WAAW,IAAI,SAAS,OACxC;AAGF,OAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CACvC;AAGF,OAAI,CAAC,YAAY,KAAK,eAAe,IAAI,cAAc,CACrD;AAGF,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,EAAE,GAAG;IAC7C,MAAM,MAAM,KAAK,SAAS;IAC1B,MAAM,MAAM,IAAI,SAAS;AACzB,QAAI,IAAI,SAAS,IAAI,KACnB,UAAS;AAEX,QAAI,IAAI,SAAS,IAAI,KACnB,UAAS;AAEX,QAAI,CAAC,YAAY,IAAI,QAAQ,IAAI,OAAO,CACtC,UAAS;AAEX,QAAI,CAAC,YAAY,IAAI,eAAe,IAAI,cAAc,CACpD,UAAS;;AAIb,UAAO,KAAK,KAAK,IAAI;;AAEvB,SAAO;;;;;;CAOT,AAAO,WAAW,MAA2D;EAC3E,MAAM,WAAW,KAAK,SAAS;AAC/B,OAAK,MAAM,UAAU,SAAS,SAAS;AACrC,OAAI,CAAC,UAAU,OAAO,IAAI,CAAE;GAE5B,MAAM,OAAO,OAAO,IAAI;AACxB,OACE,KAAK,SAAS,YAAY,SAC1B,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,GAAG,SAAS,KAAK,QAC/B,KAAK,SAAS,GAAG,SAAS,KAAK,QAC/B,YAAY,KAAK,QAAQ,KAAK,SAAS,GAAG,OAAO,IACjD,YAAY,KAAK,eAAe,KAAK,SAAS,GAAG,cAAc,EAC/D;AACA,QAAI,OAAO,IAAI,KAAK,aAAa,SAAS,mBACxC,OAAM,MAAM,yCAAyC,OAAO,IAAI,KAAK,aAAa,OAAO;AAU3F,WARgD,OAAO,YACrD,OAAO,QACL,OAAO,IAAI,KAAK,eAEZ,CAAC,KACN,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAC1C;;;;;;;;;;;CAeP,AAAO,cACL,WACyC;EACzC,MAAM,YACJ,OAAO,cAAc,aAAa,YAAY,iCAAiC,UAAU;AAQ3F,SANqB,KAAK,UAAU,CAAC,QAAQ,QAAQ,EAAE,KAAK,WAAW;AACrE,OAAI,CAAC,cAAc,KAAK,CAAE,QAAO;AACjC,UAAO,UAAU,KAAK;IACtB,CAGkB,KAAK,EAAE,KAAK,KAAK,WAAW;GAE9C,MAAM,cAAc;GACpB,IAAI,cAAmD;GAEvD,MAAM,OAAO;AAEb,UAAO;IACL,IAAI,aAAa,IAAI;IACrB,MAAM;IACN,IAAI,OAAqC;AACvC,SAAI,gBAAgB,KAClB,QAAO;AAGT,mBAAc,KAAK,gBAAgB,IAAI,EAAE;AACzC,YAAO;;IAEV;IACD;;;;;;CAOJ,AAAO,wBACL,QACA,SAC6C;EAC7C,MAAM,SAAS,KAAK,WAAW,OAAO,SAAS,SAAS;AACxD,MAAI,CAAC,OAAQ,QAAO;EACpB,MAAM,WAAW,eAAe,QAAQ,oBAAoB,UAAU;AACtE,MAAI,aAAa,QAAW;GAC1B,MAAM,OAAO,KAAK,MAAM,SAAS;AACjC,UAAO,OAAO,YACZ,KAAK,KAAK,QAAQ;AAChB,WAAO,CAAC,KAAK,OAAO,QAAQ,aAAa;KACzC,CACH;QAED,QAAO;;;;AAMb,IAAsB,gBAAtB,MAAoE;CAClE,AAAmB;CAEnB,cAAc;AACZ,OAAK,MAAM,iBAAiB;;CAG9B,AAAQ;CAER,IAAW,OAAa;AACtB,MAAI,KAAK,cAAc,QAAW;GAChC,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,QAAQ,OAAO,QAAQ,aAAa,KAAK,GAAG;AAClD,QAAK,YAAY,EAAE,GAAG,QAAQ,KAAK,MAAM,MAAM,GAAI,EAAE,EAAW;;AAElE,SAAO,KAAK,UAAU;;CAIxB,AAAQ;;;;;CAMR,IAAW,aAA+B;AACxC,MAAI,KAAK,oBAAoB,QAAW;GACtC,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,QAAQ,OAAO,QAAQ,aAAa,KAAK,GAAG;AAClD,QAAK,kBAAkB,EACrB,GAAG,QAAQ,KAAK,MAAM,MAAM,GAAG,QAChC;;AAEH,SAAO,KAAK,gBAAgB;;CAQ9B,AAAQ,iBAAiB,MAA4C;AACnE,SAAO,MACL,KAAK,IAAI,wBAAwB,KAAK,GACrC,aAAa,IAAI,iBAAiB,UAAU,CAAC,KAAK,CAAC,CACrD;;CAGH,IAAW,SAAuC;AAChD,SAAO,KAAK,iBAAiB,oBAAoB;;CAGnD,IAAW,UAAwC;AACjD,SAAO,KAAK,iBAAiB,iBAAiB;;CAGhD,AAAgB,aAAa,IAAI,YAAY;;;;;;CAO7C,AAAO,WAAW,MAA2D;AAC3E,SAAO,KAAK,WAAW,WAAW,KAAK;;CAGzC,AAAQ,sCACN,SACA;EACA,MAAM,mBAAmB,QAAQ,MAC9B,MAAM,EAAE,EAAE,gBAAgB,qBAAqB,WAAW,EAAE,KAAK,CACnE;EACD,MAAM,uBAAuB,KAAK,IAAI,cAAc,yBAAyB;AAC7E,MAAI,oBAAoB,CAAC,qBACvB,OAAM,MAAM,2CAA2C;;CAK3D,AAAQ,eACN,KAC0C;AAC1C,MAAI,CAAC,KAAK,IAAI,cAAc,8BAE1B,OAAM;GACJ,GAAG;GACH,kBAAkB,EAAE;GACpB,SAAS,CAAC,GAAG,IAAI,kBAAkB,GAAG,IAAI,QAAQ;GACnD;AAEH,MAAI,CAAC,KAAK,IAAI,cAAc,yBAC1B,OAAM;GACJ,GAAG;GACH,kBAAkB,kBAAkB,IAAI,iBAAiB;GACzD,SAAS,kBAAkB,IAAI,QAAQ;GACxC;AAEH,SAAO;;CAIT,AAAO,aACL,KAC0B;AAC1B,OAAK,sCAAsC,IAAI;AAC/C,MAAI,CAAC,iBAAiB,IAAI,CAAE,QAAO;AACnC,SAAO,KAAK,IAAI,aAAa,IAAI,KAAK,MAAM,qBAAqB,EAAE,CAAC,CAAC;;CAWvE,AAAO,aACL,KAQ0B;EAC1B,IAAI;AACJ,MAAI,aAAa,IACf,UAAS,KAAK,eAAe;GAC3B,KAAK;IACH,MAAM;IACN,SAAS,IAAI,QAAQ,KAAK,OAAO;KAAE,MAAM;KAAU,QAAQ;KAAG,EAAE;IACjE;GACD,kBAAkB,IAAI,WAAW,EAAE;GACnC,SAAS,EAAE;GACX,SAAS,IAAI,WAAW,EAAE;GAC3B,CAAC;MAEF,UAAS,KAAK,eAAe,IAAI;EAEnC,MAAM,UAAU,kBAAkB,OAAO,IAAI;AAC7C,OAAK,sCAAsC,QAAQ;AACnD,MAAI,CAAC,iBAAiB,QAAQ,CAAE,QAAO;AACvC,SAAO,KAAK,IAAI,aAAa,aAAa,SAAS,OAAO,qBAAqB,GAAG,CAAC,CAAC;;CAGtF,AAAO,eAAe,KAA2E;EAC/F,MAAM,UAAU,wBAAwB,IAAI,MAAM;AAClD,OAAK,sCAAsC,QAAQ;AACnD,MAAI,CAAC,iBAAiB,QAAQ,CAAE,QAAO;AACvC,SAAO,KAAK,IAAI,eAAe,eAAe,MAAM,OAAO,qBAAqB,GAAG,CAAC,CAAC;;;CAIvF,AAAO,cAAc,SAAyB;AAC5C,SAAO,KAAK,IAAI,cAAc,QAAQ;;CAOxC,AAAO,gBAAgB,OAA4C;AACjE,SAAO,KAAK,IAAI,gBAAgB,MAAM;;CAGxC,AAAO,yBACL,QACA,SACyB;AACzB,SAAO,KAAK,IAAI,yBAAyB,QAAQ,QAAQ;;CAG3D,AAAO,iBAAiB,QAAsB;AAC5C,OAAK,IAAI,iBAAiB,OAAO;;CAGnC,AAAO,WAAW,MAAwB;AACxC,SAAO,KAAK,IAAI,WAAW,KAAK;;CAGlC,AAAO,aAAa,KAAuB;AACzC,SAAO,KAAK,IAAI,aAAa,IAAI;;CAGnC,AAAO,SAAS,MAAgB,UAAsC;AACpE,SAAO,KAAK,IAAI,SAAS,MAAM,SAAS;;CAG1C,AAAO,gBAAgB,WAA+B,UAAkC;AACtF,SAAO,KAAK,IAAI,gBAAgB,WAAW,SAAS;;CAGtD,AAAO,2BAA+C;AACpD,SAAO,KAAK,IAAI,0BAA0B;;CAG5C,AAAO,QAAQ,KAAmB;AAChC,OAAK,IAAI,QAAQ,IAAI;;CAGvB,AAAO,QAAQ,KAAmB;AAChC,OAAK,IAAI,QAAQ,IAAI;;CAGvB,AAAO,SAAS,KAAmB;AACjC,OAAK,IAAI,SAAS,IAAI;;;;AAK1B,IAAa,iBAAb,cAAoE,cAA0B;CAC5F,AAAQ;CACR,IAAW,OAAyB;AAClC,MAAI,KAAK,cAAc,QAAW;GAChC,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,QAAQ,OAAO,QAAQ,aAAa,KAAK,GAAG;AAClD,QAAK,YAAY,EAAE,GAAG,UAAU,SAAY,SAAY,KAAK,MAAM,MAAM,EAAE;;AAE7E,SAAO,KAAK,UAAU;;;;AAK1B,IAAa,kBAAb,cAAwE,cAGtE;CACA,AAAQ;CAER,IAAW,OAAa;AACtB,MAAI,KAAK,cAAc,QAAW;GAChC,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,QAAQ,OAAO,QAAQ,aAAa,KAAK,GAAG;AAClD,QAAK,YAAY,EAAE,GAAG,KAAK,MAAM,MAAM,EAAE;;AAE3C,SAAO,KAAK,UAAU;;CAGxB,AAAQ;CAER,IAAW,UAAmB;AAC5B,MAAI,KAAK,iBAAiB,QAAW;GACnC,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,QAAQ,OAAO,QAAQ,aAAa,KAAK,GAAG;AAClD,QAAK,eAAe,EAAE,GAAG,QAAQ,KAAK,MAAM,MAAM,GAAI,EAAE,EAAc;;AAExE,SAAO,KAAK,aAAa;;;;;;;;;;;;AAa7B,IAAa,kBAAb,cAAsF,cAGpF;CACA,AAAiB;CACjB,AAAiB;CAEjB,YAAY,QAAyB,eAA8C;AACjF,SAAO;AACP,OAAK,SAAS;AACd,OAAK,gBAAgB;;CAGvB,AAAQ;;CAGR,IAAoB,OAA4B;AAC9C,MAAI,KAAK,oBAAoB,OAE3B,MAAK,kBAAkB,EAAE,GAAG,cAAc,UAD9B,KAAK,IAAI,cAAc,CACqB,EAAE,KAAK,OAAO,EAAE;AAE1E,SAAO,KAAK,gBAAgB;;CAG9B,AAAQ;;CAGR,IAAW,SAAgC;AACzC,MAAI,KAAK,gBAAgB,QAAW;GAClC,MAAM,SAAkC,EAAE;AAC1C,QAAK,MAAM,CAAC,KAAK,OAAO,OAAO,QAAQ,KAAK,cAAc,CACxD,QAAO,OAAO,IAAI;AAEpB,QAAK,cAAc,EAAE,GAAG,QAAiC;;AAE3D,SAAO,KAAK,YAAY"}
1
+ {"version":3,"file":"api.js","names":[],"sources":["../../src/render/api.ts"],"sourcesContent":["import type {\n AnchoredPColumnSelector,\n AnyFunction,\n AxisId,\n DataInfo,\n Option,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectId,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResolveAnchorsOptions,\n ResultCollection,\n ServiceName,\n SUniversalPColumnId,\n ValueOrError,\n} from \"@milaboratories/pl-model-common\";\nimport {\n AnchoredIdDeriver,\n collectSpecQueryColumns,\n ensurePColumn,\n parseJson,\n extractAllColumns,\n isDataInfo,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapPTableDefV2,\n mapValueInVOE,\n PColumnName,\n readAnnotation,\n withEnrichments,\n legacyColumnSelectorsToPredicate,\n} from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type { Optional } from \"utility-types\";\nimport { getCfgRenderCtx } from \"../internal\";\nimport { getPluginData } from \"../block_storage\";\nimport type {\n PluginHandle,\n PluginFactoryLike,\n InferFactoryData,\n InferFactoryModelServices,\n InferFactoryParams,\n} from \"../plugin_handle\";\nimport type { BlockDefaultModelServices } from \"../services/service_resolve\";\nimport type { ModelServices as AllModelServices } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor, ifDef } from \"./accessor\";\nimport type { FutureRef } from \"./future\";\nimport type { AccessorHandle, GlobalCfgRenderCtx } from \"./internal\";\nimport { MainAccessorName, StagingAccessorName } from \"./internal\";\nimport {\n PColumnCollection,\n type AxisLabelProvider,\n type ColumnProvider,\n} from \"./util/column_collection\";\nimport type { LabelDerivationOps } from \"./util/label\";\nimport { deriveLabels } from \"./util/label\";\nimport type { APColumnSelectorWithSplit } from \"./util/split_selectors\";\nimport { patchInSetFilters } from \"./util/pframe_upgraders\";\nimport { allPColumnsReady } from \"./util/pcolumn_data\";\nimport type { PColumnDataUniversal } from \"./internal\";\n\n/**\n * Helper function to match domain objects\n * @param query Optional domain to match against\n * @param target Optional domain to match\n * @returns true if domains match, false otherwise\n */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\nexport type UniversalColumnOption = { label: string; value: SUniversalPColumnId };\n\n/**\n * Transforms PColumn data into the internal representation expected by the platform\n * @param data Data from a PColumn to transform\n * @returns Transformed data compatible with platform API\n */\nfunction transformPColumnData(\n data: PColumn<PColumnDataUniversal> | PColumnLazy<PColumnDataUniversal>,\n): PColumn<PColumnValues | AccessorHandle | DataInfo<AccessorHandle>> {\n return mapPObjectData(data, (d) => {\n if (d instanceof TreeNodeAccessor) {\n return d.handle;\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (accessor) => accessor.handle);\n } else {\n return d;\n }\n });\n}\n\ntype UniversalPColumnOpts = {\n labelOps?: LabelDerivationOps;\n dontWaitAllData?: boolean;\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n} & ResolveAnchorsOptions;\n\ntype GetOptionsOpts = {\n /**\n * If true, references returned by the method will contain `requireEnrichments` flag set to true.\n * If this reference is added to the block's args, it will communicate to the platform that the block\n * expects enrichments of the referenced block to be available in the context of the current block.\n */\n refsWithEnrichments?: boolean;\n /**\n * Label derivation options.\n * If provided, it will be used to derive labels for the options.\n * If not provided, labels will be derived using the default logic.\n */\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps;\n};\n\nexport class ResultPool implements ColumnProvider, AxisLabelProvider {\n private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();\n\n /**\n * @deprecated use getOptions()\n */\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.ctx.calculateOptions(predicate);\n }\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts,\n ): Option[];\n /** @deprecated wrap label ops with { label: <...> } */\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[];\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts | ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate =\n typeof predicateOrSelector === \"function\"\n ? predicateOrSelector\n : legacyColumnSelectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n\n let labelOps: LabelDerivationOps | ((spec: PObjectSpec, ref: PlRef) => string) = {};\n let refsWithEnrichments: boolean = false;\n if (typeof opts !== \"undefined\") {\n if (typeof opts === \"function\") {\n labelOps = opts;\n } else if (typeof opts === \"object\") {\n if (\"includeNativeLabel\" in opts || \"separator\" in opts || \"addLabelAsSuffix\" in opts) {\n labelOps = opts;\n } else {\n opts = opts as GetOptionsOpts;\n labelOps = opts.label ?? {};\n refsWithEnrichments = opts.refsWithEnrichments ?? false;\n }\n }\n }\n\n if (typeof labelOps === \"object\")\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(\n ({ value: { ref }, label }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label,\n }),\n );\n else\n return filtered.map(({ ref, obj }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label: labelOps(obj, ref),\n }));\n }\n\n public resolveAnchorCtx(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n ): AnchoredIdDeriver | undefined {\n if (anchorsOrCtx instanceof AnchoredIdDeriver) return anchorsOrCtx;\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec) return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n resolvedAnchors[key] = value;\n }\n }\n return new AnchoredIdDeriver(resolvedAnchors);\n }\n\n /**\n * Returns columns that match the provided anchors and selectors. It applies axis filters and label derivation.\n *\n * @param anchorsOrCtx - Anchor context for column selection (same as in getCanonicalOptions)\n * @param predicateOrSelectors - Predicate or selectors for filtering columns (same as in getCanonicalOptions)\n * @param opts - Optional configuration for label generation and data waiting\n * @returns A PFrameHandle for the created PFrame, or undefined if any required data is missing\n */\n public getAnchoredPColumns(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): PColumn<PColumnDataUniversal>[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n return new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getColumns(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate and returns their\n * canonicalized representations.\n *\n * This function filters column specifications from the result pool that match the provided predicate,\n * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value\n * pairs for UI components (like dropdowns).\n *\n * @param anchorsOrCtx - Either:\n * - An existing AnchorCtx instance\n * - A record mapping anchor IDs to PColumnSpec objects\n * - A record mapping anchor IDs to PlRef objects (which will be resolved to PColumnSpec)\n * @param predicateOrSelectors - Either:\n * - A predicate function that takes a PColumnSpec and returns a boolean.\n * Only specs that return true will be included.\n * - An APColumnSelector object for declarative filtering, which will be\n * resolved against the provided anchors and matched using matchPColumn.\n * - An array of APColumnSelector objects - columns matching ANY selector\n * in the array will be included (OR operation).\n * @param opts - Optional configuration for label generation:\n * - labelOps: Optional configuration for label generation:\n * - includeNativeLabel: Whether to include native column labels\n * - separator: String to use between label parts (defaults to \" / \")\n * - addLabelAsSuffix: Whether to add labels as suffix instead of prefix\n * - dontWaitAllData: Whether to skip columns that don't have all data (if not set, will return undefined,\n * if at least one column that requires splitting is missing data)\n * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,\n * or undefined if any PlRef resolution fails.\n */\n getCanonicalOptions(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors:\n | ((spec: PColumnSpec) => boolean)\n | APColumnSelectorWithSplit\n | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): { label: string; value: SUniversalPColumnId }[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n const entries = new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getUniversalEntries(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n if (!entries) return undefined;\n return entries.map((item) => ({\n value: item.id,\n label: item.label,\n }));\n }\n\n /**\n * @deprecated use getData()\n */\n public getDataFromResultPool(): ResultCollection<PObject<TreeNodeAccessor>> {\n return this.getData();\n }\n\n public getData(): ResultCollection<PObject<TreeNodeAccessor>> {\n const result = this.ctx.getDataFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: new TreeNodeAccessor(e.obj.data, [e.ref.blockId, e.ref.name]),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getDataWithErrors()\n */\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, \"id\">\n > {\n const result = this.ctx.getDataWithErrorsFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: mapValueInVOE(\n e.obj.data,\n (handle) => new TreeNodeAccessor(handle, [e.ref.blockId, e.ref.name]),\n ),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getSpecs()\n */\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n return this.getSpecs();\n }\n\n public getSpecs(): ResultCollection<PObjectSpec> {\n return this.ctx.getSpecsFromResultPool();\n }\n\n /**\n * @param ref a Ref\n * @returns data associated with the ref\n */\n public getDataByRef(ref: PlRef): PObject<TreeNodeAccessor> | undefined {\n // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getDataFromResultPoolByRef === \"undefined\")\n return this.getData().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name,\n )?.obj;\n const data = this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name); // Keep original call\n // Need to handle undefined case before mapping\n if (!data) return undefined;\n return mapPObjectData(data, (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]));\n }\n\n /**\n * Returns data associated with the ref ensuring that it is a p-column.\n * @param ref a Ref\n * @returns p-column associated with the ref\n */\n public getPColumnByRef(ref: PlRef): PColumn<TreeNodeAccessor> | undefined {\n const data = this.getDataByRef(ref);\n if (!data) return undefined;\n return ensurePColumn(data);\n }\n\n /**\n * Returns spec associated with the ref ensuring that it is a p-column spec.\n * @param ref a Ref\n * @returns p-column spec associated with the ref\n */\n public getPColumnSpecByRef(ref: PlRef): PColumnSpec | undefined {\n const spec = this.getSpecByRef(ref);\n if (!spec) return undefined;\n if (!isPColumnSpec(spec)) throw new Error(`not a PColumn spec (kind = ${spec.kind})`);\n return spec;\n }\n\n /**\n * @param ref a Ref\n * @returns object spec associated with the ref\n */\n public getSpecByRef(ref: PlRef): PObjectSpec | undefined {\n return this.ctx.getSpecFromResultPoolByRef(ref.blockId, ref.name);\n }\n\n /**\n * @param spec object specification\n * @returns array of data objects with compatible specs\n * @deprecated delete this method after Jan 1, 2025\n */\n public findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[] {\n const result: PObject<TreeNodeAccessor>[] = [];\n\n out: for (const data of this.getData().entries) {\n if (!isPColumnSpec(data.obj.spec)) {\n continue;\n }\n\n const oth = data.obj.spec;\n\n if (spec.name !== oth.name) {\n continue;\n }\n\n if (spec.valueType !== oth.valueType) {\n continue;\n }\n\n if (spec.axesSpec.length !== oth.axesSpec.length) {\n continue;\n }\n\n if (!matchDomain(spec.domain, oth.domain)) {\n continue;\n }\n\n if (!matchDomain(spec.contextDomain, oth.contextDomain)) {\n continue;\n }\n\n for (let i = 0; i < spec.axesSpec.length; ++i) {\n const qAx = spec.axesSpec[i];\n const tAx = oth.axesSpec[i];\n if (qAx.name !== tAx.name) {\n continue out;\n }\n if (qAx.type !== tAx.type) {\n continue out;\n }\n if (!matchDomain(qAx.domain, tAx.domain)) {\n continue out;\n }\n if (!matchDomain(qAx.contextDomain, tAx.contextDomain)) {\n continue out;\n }\n }\n\n result.push(data.obj);\n }\n return result;\n }\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.getData();\n for (const column of dataPool.entries) {\n if (!isPColumn(column.obj)) continue;\n\n const spec = column.obj.spec;\n if (\n spec.name === PColumnName.Label &&\n spec.axesSpec.length === 1 &&\n spec.axesSpec[0].name === axis.name &&\n spec.axesSpec[0].type === axis.type &&\n matchDomain(axis.domain, spec.axesSpec[0].domain) &&\n matchDomain(axis.contextDomain, spec.axesSpec[0].contextDomain)\n ) {\n if (column.obj.data.resourceType.name !== \"PColumnData/Json\") {\n throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);\n }\n const labels: Record<string | number, string> = Object.fromEntries(\n Object.entries(\n column.obj.data.getDataAsJson<{\n data: Record<string | number, string>;\n }>().data,\n ).map((e) => [JSON.parse(e[0])[0], e[1]]),\n );\n\n return labels;\n }\n }\n return undefined;\n }\n\n /**\n * Selects columns based on the provided selectors, returning PColumn objects\n * with lazily loaded data.\n *\n * @param selectors - A predicate function, a single selector, or an array of selectors.\n * @returns An array of PColumn objects matching the selectors. Data is loaded on first access.\n */\n public selectColumns(\n selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],\n ): PColumn<TreeNodeAccessor | undefined>[] {\n const predicate =\n typeof selectors === \"function\" ? selectors : legacyColumnSelectorsToPredicate(selectors);\n\n const matchedSpecs = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n // Map specs to PColumn objects with lazy data loading\n return matchedSpecs.map(({ ref, obj: spec }) => {\n // Type assertion needed because filter ensures it's PColumnSpec\n const pcolumnSpec = spec as PColumnSpec;\n let _cachedData: TreeNodeAccessor | undefined | null = null; // Use null to distinguish initial state from undefined result\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this; // Capture 'this' for use inside the getter\n\n return {\n id: canonicalize(ref) as PObjectId,\n spec: pcolumnSpec,\n get data(): TreeNodeAccessor | undefined {\n if (_cachedData !== null) {\n return _cachedData; // Return cached data (could be undefined if fetch failed)\n }\n\n _cachedData = self.getPColumnByRef(ref)?.data;\n return _cachedData;\n },\n } satisfies PColumn<TreeNodeAccessor | undefined>; // Cast needed because 'data' is a getter\n });\n }\n\n /**\n * Find labels data for a given axis id of a p-column.\n * @returns a map of axis value => label\n */\n public findLabelsForColumnAxis(\n column: PColumnSpec,\n axisIdx: number,\n ): Record<string | number, string> | undefined {\n const labels = this.findLabels(column.axesSpec[axisIdx]);\n if (!labels) return undefined;\n const axisKeys = readAnnotation(column, `pl7.app/axisKeys/${axisIdx}`);\n if (axisKeys !== undefined) {\n const keys = JSON.parse(axisKeys) as string[];\n return Object.fromEntries(\n keys.map((key) => {\n return [key, labels[key] ?? \"Unlabelled\"];\n }),\n );\n } else {\n return labels;\n }\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport abstract class RenderCtxBase<\n Args = unknown,\n Data = unknown,\n ModelServices = Partial<AllModelServices>,\n> {\n protected readonly ctx: GlobalCfgRenderCtx;\n private readonly requiredServiceNames: ServiceName[];\n private cachedServices?: ModelServices;\n\n constructor(requiredServiceNames: ServiceName[] = []) {\n this.ctx = getCfgRenderCtx();\n this.requiredServiceNames = requiredServiceNames;\n }\n\n get services(): ModelServices {\n if (this.cachedServices) return this.cachedServices;\n const ctx = this.ctx;\n const services = Object.freeze(\n Object.fromEntries(\n this.requiredServiceNames.map((id) => [\n id,\n Object.freeze(\n Object.fromEntries(\n (ctx.getServiceMethods(id) as string[]).map((method) => [\n method,\n (...args: unknown[]) => ctx.callServiceMethod(id, method, ...args),\n ]),\n ),\n ),\n ]),\n ),\n ) as ModelServices;\n this.cachedServices = services;\n return services;\n }\n\n private dataCache?: { v: Data };\n\n public get data(): Data {\n if (this.dataCache === undefined) {\n const raw = this.ctx.data;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.dataCache = { v: value ? JSON.parse(value) : ({} as Data) };\n }\n return this.dataCache.v;\n }\n\n // lazy rendering because this feature is rarely used\n private activeArgsCache?: { v?: Args };\n\n /**\n * Returns args snapshot the block was executed for (i.e. when \"Run\" button was pressed).\n * Returns undefined, if block was never executed or stopped mid-way execution, so that the result was cleared.\n * */\n public get activeArgs(): Args | undefined {\n if (this.activeArgsCache === undefined) {\n const raw = this.ctx.activeArgs;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.activeArgsCache = {\n v: value ? JSON.parse(value) : undefined,\n };\n }\n return this.activeArgsCache.v;\n }\n\n // /** Can be used to determine features provided by the desktop instance. */\n // public get featureFlags() {\n // return this.ctx.featureFlags;\n // }\n\n private getNamedAccessor(name: string): TreeNodeAccessor | undefined {\n return ifDef(\n this.ctx.getAccessorHandleByName(name),\n (accessor) => new TreeNodeAccessor(accessor, [name]),\n );\n }\n\n public get prerun(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(StagingAccessorName);\n }\n\n public get outputs(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(MainAccessorName);\n }\n\n public readonly resultPool = new ResultPool();\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n * @deprecated Use resultPool.findLabels instead\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n return this.resultPool.findLabels(axis);\n }\n\n private verifyInlineAndExplicitColumnsSupport(\n columns: (PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>)[],\n ) {\n const hasInlineColumns = columns.some(\n (c) => !(c.data instanceof TreeNodeAccessor) || isDataInfo(c.data),\n ); // Updated check for DataInfo\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport)\n throw Error(`Inline or explicit columns not supported`); // Combined check\n\n // Removed redundant explicitColumns check\n }\n\n private patchPTableDef(\n def: PTableDef<PColumn<PColumnDataUniversal>>,\n ): PTableDef<PColumn<PColumnDataUniversal>> {\n if (!this.ctx.featureFlags?.pTablePartitionFiltersSupport) {\n // For old desktop move all partition filters to filters field as it doesn't read partitionFilters field\n def = {\n ...def,\n partitionFilters: [],\n filters: [...def.partitionFilters, ...def.filters],\n };\n }\n if (!this.ctx.featureFlags?.pFrameInSetFilterSupport) {\n def = {\n ...def,\n partitionFilters: patchInSetFilters(def.partitionFilters),\n filters: patchInSetFilters(def.filters),\n };\n }\n return def;\n }\n\n // TODO remove all non-PColumn fields\n public createPFrame(\n def: PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>>,\n ): PFrameHandle | undefined {\n this.verifyInlineAndExplicitColumnsSupport(def);\n if (!allPColumnsReady(def)) return undefined;\n return this.ctx.createPFrame(def.map((c) => transformPColumnData(c)));\n }\n\n // TODO remove all non-PColumn fields\n public createPTable(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableHandle | undefined;\n public createPTable(def: {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle | undefined;\n public createPTable(\n def:\n | PTableDef<PColumn<PColumnDataUniversal>>\n | {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle | undefined {\n let rawDef: PTableDef<PColumn<PColumnDataUniversal>>;\n if (\"columns\" in def) {\n rawDef = this.patchPTableDef({\n src: {\n type: \"full\",\n entries: def.columns.map((c) => ({ type: \"column\", column: c })),\n },\n partitionFilters: def.filters ?? [],\n filters: [],\n sorting: def.sorting ?? [],\n });\n } else {\n rawDef = this.patchPTableDef(def);\n }\n const columns = extractAllColumns(rawDef.src);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTable(mapPTableDef(rawDef, (po) => transformPColumnData(po)));\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnDataUniversal>>): PTableHandle | undefined {\n const columns = collectSpecQueryColumns(def.query);\n this.verifyInlineAndExplicitColumnsSupport(columns);\n if (!allPColumnsReady(columns)) return undefined;\n return this.ctx.createPTableV2(mapPTableDefV2(def, (po) => transformPColumnData(po)));\n }\n\n /** @deprecated scheduled for removal from SDK */\n public getBlockLabel(blockId: string): string {\n return this.ctx.getBlockLabel(blockId);\n }\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.ctx.getCurrentUnstableMarker();\n }\n\n public logInfo(msg: string): void {\n this.ctx.logInfo(msg);\n }\n\n public logWarn(msg: string): void {\n this.ctx.logWarn(msg);\n }\n\n public logError(msg: string): void {\n this.ctx.logError(msg);\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) for v3+ blocks */\nexport class BlockRenderCtx<\n Args = unknown,\n Data = unknown,\n ModelServices = BlockDefaultModelServices,\n> extends RenderCtxBase<Args, Data, ModelServices> {\n private argsCache?: { v: Args | undefined };\n public get args(): Args | undefined {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: value === undefined ? undefined : JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n}\n\n/** Render context for legacy v1/v2 blocks - provides backward compatibility */\nexport class RenderCtxLegacy<Args = unknown, UiState = unknown> extends RenderCtxBase<\n Args,\n UiState\n> {\n private argsCache?: { v: Args };\n\n public get args(): Args {\n if (this.argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.argsCache = { v: JSON.parse(value) };\n }\n return this.argsCache.v;\n }\n\n private uiStateCache?: { v: UiState };\n\n public get uiState(): UiState {\n if (this.uiStateCache === undefined) {\n const raw = this.ctx.uiState!;\n const value = typeof raw === \"function\" ? raw() : raw;\n this.uiStateCache = { v: value ? JSON.parse(value) : ({} as UiState) };\n }\n return this.uiStateCache.v;\n }\n}\n\n/**\n * Render context for plugin output functions.\n * Reads plugin data from blockStorage and derives params from pre-wrapped input callbacks.\n *\n * Parameterized on the factory-like phantom F so that getPluginData returns\n * InferFactoryData<F> directly — no casts needed for the data getter.\n *\n * @typeParam F - PluginFactoryLike phantom carrying data/params/outputs types\n */\nexport class PluginRenderCtx<\n F extends PluginFactoryLike = PluginFactoryLike,\n ModelServices = InferFactoryModelServices<F>,\n> extends RenderCtxBase<unknown, InferFactoryData<F>, ModelServices> {\n private readonly handle: PluginHandle<F>;\n private readonly wrappedInputs: Record<string, () => unknown>;\n\n constructor(\n handle: PluginHandle<F>,\n wrappedInputs: Record<string, () => unknown>,\n requiredServiceNames: ServiceName[] = [],\n ) {\n super(requiredServiceNames);\n this.handle = handle;\n this.wrappedInputs = wrappedInputs;\n }\n\n private pluginDataCache?: { v: InferFactoryData<F> };\n\n /** Plugin's persistent data from blockStorage.__plugins.{pluginId}.__data */\n public override get data(): InferFactoryData<F> {\n if (this.pluginDataCache === undefined) {\n const raw = this.ctx.blockStorage();\n this.pluginDataCache = { v: getPluginData(parseJson(raw), this.handle) };\n }\n return this.pluginDataCache.v;\n }\n\n private paramsCache?: { v: InferFactoryParams<F> };\n\n /** Params derived from block context via pre-wrapped input callbacks */\n public get params(): InferFactoryParams<F> {\n if (this.paramsCache === undefined) {\n const result: Record<string, unknown> = {};\n for (const [key, fn] of Object.entries(this.wrappedInputs)) {\n result[key] = fn();\n }\n this.paramsCache = { v: result as InferFactoryParams<F> };\n }\n return this.paramsCache.v;\n }\n}\n\n/** @deprecated Use BlockRenderCtx instead */\nexport type RenderCtx<Args = unknown, Data = unknown> = BlockRenderCtx<Args, Data>;\n\nexport type RenderFunction<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: BlockRenderCtx<Args, State>,\n) => Ret;\n\nexport type RenderFunctionLegacy<Args = unknown, State = unknown, Ret = unknown> = (\n rCtx: RenderCtxLegacy<Args, State>,\n) => Ret;\n\nexport type UnwrapFutureRef<K> =\n K extends FutureRef<infer T>\n ? T\n : K extends bigint | boolean | null | number | string | symbol | undefined\n ? K\n : { [key in keyof K]: UnwrapFutureRef<K[key]> };\n\nexport type InferRenderFunctionReturn<RF extends AnyFunction> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"internal.cjs","names":[],"sources":["../../src/render/internal.ts"],"sourcesContent":["import type { Optional } from \"utility-types\";\nimport type {\n AxesId,\n AxesSpec,\n Branded,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n PTableColumnId,\n PTableColumnSpec,\n SingleAxisSelector,\n StringifiedJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from \"./traversal_ops\";\nimport type {\n ArchiveFormat,\n AnyFunction,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n ResultCollection,\n ValueOrError,\n DataInfo,\n RangeBytes,\n PColumnSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type { TreeNodeAccessor } from \"./accessor\";\n\nexport const StagingAccessorName = \"staging\";\nexport const MainAccessorName = \"main\";\n\nexport type AccessorHandle = Branded<string, \"AccessorHandle\">;\nexport type FutureHandle = Branded<string, \"FutureHandle\">;\n\nexport type PColumnDataUniversal<TreeEntry = TreeNodeAccessor> =\n | TreeEntry\n | DataInfo<TreeEntry>\n | PColumnValues;\n\nexport interface GlobalCfgRenderCtxMethods<AHandle = AccessorHandle, FHandle = FutureHandle> {\n //\n // Root accessor creation\n //\n\n getAccessorHandleByName(name: string): AHandle | undefined;\n\n //\n // Basic resource accessor actions\n //\n\n resolveWithCommon(\n handle: AHandle,\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): AHandle | undefined;\n\n getResourceType(handle: AHandle): ResourceType;\n\n getInputsLocked(handle: AHandle): boolean;\n\n getOutputsLocked(handle: AHandle): boolean;\n\n getIsReadyOrError(handle: AHandle): boolean;\n\n getIsFinal(handle: AHandle): boolean;\n\n getError(handle: AHandle): AHandle | undefined;\n\n listInputFields(handle: AHandle): string[];\n\n listOutputFields(handle: AHandle): string[];\n\n listDynamicFields(handle: AHandle): string[];\n\n getKeyValueBase64(handle: AHandle, key: string): string | undefined;\n\n getKeyValueAsString(handle: AHandle, key: string): string | undefined;\n\n getDataBase64(handle: AHandle): string | undefined;\n\n getDataAsString(handle: AHandle): string | undefined;\n\n /** If not final returns undefined */\n parsePObjectCollection(\n handle: AHandle,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolvePath: string[]\n ): Record<string, PObject<AHandle>> | undefined;\n\n //\n // Blob\n //\n\n getBlobContentAsBase64(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getBlobContentAsString(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getDownloadedBlobContentHandle(handle: AHandle): FHandle; // LocalBlobHandleAndSize | undefined;\n\n getOnDemandBlobContentHandle(handle: AHandle): FHandle; // RemoteBlobHandleAndSize | undefined;\n\n //\n // Blobs to URLs\n //\n\n extractArchiveAndGetURL(handle: AHandle, format: ArchiveFormat): FHandle;\n\n //\n // Import progress\n //\n\n getImportProgress(handle: AHandle): FHandle; // ImportProgress;\n\n //\n // Logs\n //\n\n getLastLogs(handle: AHandle, nLines: number): FHandle; // string | undefined;\n\n getProgressLog(handle: AHandle, patternToSearch: string): FHandle; // string | undefined;\n\n getProgressLogWithInfo(handle: AHandle, patternToSearch: string): FHandle; // ProgressLogWithInfo | undefined;\n\n getLogHandle(handle: AHandle): FHandle; // AnyLogHandle | undefined;\n\n //\n // Blocks\n //\n\n /** @deprecated at some point will stop working and will return dummy values */\n getBlockLabel(blockId: string): string;\n\n //\n // Result Pool\n //\n\n getDataFromResultPool(): ResultCollection<PObject<AHandle>>;\n\n getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<AHandle, Error>>, \"id\">\n >;\n\n getSpecsFromResultPool(): ResultCollection<PObjectSpec>;\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined;\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<AHandle> | undefined;\n\n calculateOptions(predicate: PSpecPredicate): Option[];\n\n //\n // PFrame / PTable\n //\n\n createPFrame(def: PFrameDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PFrameHandle;\n\n createPTable(def: PTableDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PTableHandle;\n\n createPTableV2(\n def: PTableDefV2<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>,\n ): PTableHandle;\n\n //\n // Spec Frames (synchronous WASM-based PFrame for spec-level operations)\n //\n\n createSpecFrame(specs: Record<string, PColumnSpec>): string;\n\n specFrameDiscoverColumns(\n handle: string,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse;\n\n disposeSpecFrame(handle: string): void;\n\n /** Expand index-based parentAxes in AxesSpec to resolved AxisId parents in AxesId. */\n expandAxes(spec: AxesSpec): AxesId;\n\n /** Collapse resolved AxisId parents back to index-based parentAxes in AxesSpec. */\n collapseAxes(ids: AxesId): AxesSpec;\n\n /** Find the index of an axis matching the given selector. Returns -1 if not found. */\n findAxis(spec: AxesSpec, selector: SingleAxisSelector): number;\n\n /** Find the flat index of a table column matching the given selector. Returns -1 if not found. */\n findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number;\n\n //\n // Computable\n //\n\n getCurrentUnstableMarker(): string | undefined;\n\n //\n // Logging\n //\n\n logInfo(message: string): void;\n\n logWarn(message: string): void;\n\n logError(message: string): void;\n}\n\nexport const GlobalCfgRenderCtxFeatureFlags = {\n explicitColumnsSupport: true as const,\n inlineColumnsSupport: true as const,\n activeArgs: true as const,\n pTablePartitionFiltersSupport: true as const,\n pFrameInSetFilterSupport: true as const,\n};\n\nexport interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods {\n //\n // State: Args, UI State, Active Args\n //\n // Old runtime injects these values as strings, new runtime injects them as functions\n // that return strings, if block declares supportsLazyState flag.\n // If function not called in lazy state API, then resulting output will not depend on these values,\n // and thus will not be recalculated on corresponding state change.\n //\n\n readonly args: string | (() => string);\n /** @deprecated Use `data` instead. Optional for backward compatibility - falls back to `data` if not injected. */\n readonly uiState?: string | (() => string);\n readonly data: string | (() => string);\n readonly activeArgs: undefined | string | (() => string | undefined);\n\n readonly blockStorage: () => StringifiedJson;\n\n // Note: strings below are used because, anyway, using strings is the only way\n // to get data inside the QuickJS context, as it is implemented now. With this\n // approach deserialization can be lazily postponed until it is actually needed.\n readonly callbackRegistry: Record<string, AnyFunction>;\n readonly featureFlags?: typeof GlobalCfgRenderCtxFeatureFlags;\n}\n\nexport type FutureAwait = {\n __awaited_futures__: FutureHandle[];\n};\n\nexport function isFutureAwait(obj: unknown): obj is FutureAwait {\n return typeof obj === \"object\" && obj !== null && \"__awaited_futures__\" in obj;\n}\n\nfunction addAllFutureAwaits(set: Set<string>, visited: Set<unknown>, node: unknown) {\n if (visited.has(node)) return;\n visited.add(node);\n\n const type = typeof node;\n if (type === \"object\") {\n if (isFutureAwait(node)) node.__awaited_futures__.forEach((a) => set.add(a));\n else if (Array.isArray(node))\n for (const nested of node) addAllFutureAwaits(set, visited, nested);\n else\n for (const [, nested] of Object.entries(node as object))\n if (nested !== node) addAllFutureAwaits(set, visited, nested);\n }\n}\n\nexport function getAllFutureAwaits(obj: unknown): Set<string> {\n const set = new Set<string>();\n addAllFutureAwaits(set, new Set(), obj);\n return set;\n}\n"],"mappings":";;;;;;;;;;AAmCA,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAgLhC,MAAa,iCAAiC;CAC5C,wBAAwB;CACxB,sBAAsB;CACtB,YAAY;CACZ,+BAA+B;CAC/B,0BAA0B;CAC3B;AA+BD,SAAgB,cAAc,KAAkC;AAC9D,QAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,yBAAyB;;AAG7E,SAAS,mBAAmB,KAAkB,SAAuB,MAAe;AAClF,KAAI,QAAQ,IAAI,KAAK,CAAE;AACvB,SAAQ,IAAI,KAAK;AAGjB,KADa,OAAO,SACP,UACX;MAAI,cAAc,KAAK,CAAE,MAAK,oBAAoB,SAAS,MAAM,IAAI,IAAI,EAAE,CAAC;WACnE,MAAM,QAAQ,KAAK,CAC1B,MAAK,MAAM,UAAU,KAAM,oBAAmB,KAAK,SAAS,OAAO;MAEnE,MAAK,MAAM,GAAG,WAAW,OAAO,QAAQ,KAAe,CACrD,KAAI,WAAW,KAAM,oBAAmB,KAAK,SAAS,OAAO;;;AAIrE,SAAgB,mBAAmB,KAA2B;CAC5D,MAAM,sBAAM,IAAI,KAAa;AAC7B,oBAAmB,qBAAK,IAAI,KAAK,EAAE,IAAI;AACvC,QAAO"}
1
+ {"version":3,"file":"internal.cjs","names":[],"sources":["../../src/render/internal.ts"],"sourcesContent":["import type { Optional } from \"utility-types\";\nimport type { Branded, StringifiedJson } from \"@milaboratories/pl-model-common\";\nimport type { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from \"./traversal_ops\";\nimport type {\n ArchiveFormat,\n AnyFunction,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n ResultCollection,\n ValueOrError,\n DataInfo,\n RangeBytes,\n} from \"@milaboratories/pl-model-common\";\nimport type { TreeNodeAccessor } from \"./accessor\";\nimport type { ServiceDispatch } from \"@milaboratories/pl-model-common\";\n\nexport const StagingAccessorName = \"staging\";\nexport const MainAccessorName = \"main\";\n\nexport type AccessorHandle = Branded<string, \"AccessorHandle\">;\nexport type FutureHandle = Branded<string, \"FutureHandle\">;\n\nexport type PColumnDataUniversal<TreeEntry = TreeNodeAccessor> =\n | TreeEntry\n | DataInfo<TreeEntry>\n | PColumnValues;\n\nexport interface GlobalCfgRenderCtxMethods<AHandle = AccessorHandle, FHandle = FutureHandle> {\n //\n // Root accessor creation\n //\n\n getAccessorHandleByName(name: string): AHandle | undefined;\n\n //\n // Basic resource accessor actions\n //\n\n resolveWithCommon(\n handle: AHandle,\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): AHandle | undefined;\n\n getResourceType(handle: AHandle): ResourceType;\n\n getInputsLocked(handle: AHandle): boolean;\n\n getOutputsLocked(handle: AHandle): boolean;\n\n getIsReadyOrError(handle: AHandle): boolean;\n\n getIsFinal(handle: AHandle): boolean;\n\n getError(handle: AHandle): AHandle | undefined;\n\n listInputFields(handle: AHandle): string[];\n\n listOutputFields(handle: AHandle): string[];\n\n listDynamicFields(handle: AHandle): string[];\n\n getKeyValueBase64(handle: AHandle, key: string): string | undefined;\n\n getKeyValueAsString(handle: AHandle, key: string): string | undefined;\n\n getDataBase64(handle: AHandle): string | undefined;\n\n getDataAsString(handle: AHandle): string | undefined;\n\n /** If not final returns undefined */\n parsePObjectCollection(\n handle: AHandle,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolvePath: string[]\n ): Record<string, PObject<AHandle>> | undefined;\n\n //\n // Blob\n //\n\n getBlobContentAsBase64(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getBlobContentAsString(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getDownloadedBlobContentHandle(handle: AHandle): FHandle; // LocalBlobHandleAndSize | undefined;\n\n getOnDemandBlobContentHandle(handle: AHandle): FHandle; // RemoteBlobHandleAndSize | undefined;\n\n //\n // Blobs to URLs\n //\n\n extractArchiveAndGetURL(handle: AHandle, format: ArchiveFormat): FHandle;\n\n //\n // Import progress\n //\n\n getImportProgress(handle: AHandle): FHandle; // ImportProgress;\n\n //\n // Logs\n //\n\n getLastLogs(handle: AHandle, nLines: number): FHandle; // string | undefined;\n\n getProgressLog(handle: AHandle, patternToSearch: string): FHandle; // string | undefined;\n\n getProgressLogWithInfo(handle: AHandle, patternToSearch: string): FHandle; // ProgressLogWithInfo | undefined;\n\n getLogHandle(handle: AHandle): FHandle; // AnyLogHandle | undefined;\n\n //\n // Blocks\n //\n\n /** @deprecated at some point will stop working and will return dummy values */\n getBlockLabel(blockId: string): string;\n\n //\n // Result Pool\n //\n\n getDataFromResultPool(): ResultCollection<PObject<AHandle>>;\n\n getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<AHandle, Error>>, \"id\">\n >;\n\n getSpecsFromResultPool(): ResultCollection<PObjectSpec>;\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined;\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<AHandle> | undefined;\n\n calculateOptions(predicate: PSpecPredicate): Option[];\n\n //\n // PFrame / PTable\n //\n\n createPFrame(def: PFrameDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PFrameHandle;\n\n createPTable(def: PTableDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PTableHandle;\n\n createPTableV2(\n def: PTableDefV2<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>,\n ): PTableHandle;\n\n //\n // Computable\n //\n\n getCurrentUnstableMarker(): string | undefined;\n\n //\n // Logging\n //\n\n logInfo(message: string): void;\n\n logWarn(message: string): void;\n\n logError(message: string): void;\n}\n\nexport const GlobalCfgRenderCtxFeatureFlags = {\n explicitColumnsSupport: true as const,\n inlineColumnsSupport: true as const,\n activeArgs: true as const,\n pTablePartitionFiltersSupport: true as const,\n pFrameInSetFilterSupport: true as const,\n};\n\nexport interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods, ServiceDispatch {\n //\n // State: Args, UI State, Active Args\n //\n // Old runtime injects these values as strings, new runtime injects them as functions\n // that return strings, if block declares supportsLazyState flag.\n // If function not called in lazy state API, then resulting output will not depend on these values,\n // and thus will not be recalculated on corresponding state change.\n //\n\n readonly args: string | (() => string);\n /** @deprecated Use `data` instead. Optional for backward compatibility - falls back to `data` if not injected. */\n readonly uiState?: string | (() => string);\n readonly data: string | (() => string);\n readonly activeArgs: undefined | string | (() => string | undefined);\n\n readonly blockStorage: () => StringifiedJson;\n\n // Note: strings below are used because, anyway, using strings is the only way\n // to get data inside the QuickJS context, as it is implemented now. With this\n // approach deserialization can be lazily postponed until it is actually needed.\n readonly callbackRegistry: Record<string, AnyFunction>;\n readonly featureFlags?: typeof GlobalCfgRenderCtxFeatureFlags;\n}\n\nexport type FutureAwait = {\n __awaited_futures__: FutureHandle[];\n};\n\nexport function isFutureAwait(obj: unknown): obj is FutureAwait {\n return typeof obj === \"object\" && obj !== null && \"__awaited_futures__\" in obj;\n}\n\nfunction addAllFutureAwaits(set: Set<string>, visited: Set<unknown>, node: unknown) {\n if (visited.has(node)) return;\n visited.add(node);\n\n const type = typeof node;\n if (type === \"object\") {\n if (isFutureAwait(node)) node.__awaited_futures__.forEach((a) => set.add(a));\n else if (Array.isArray(node))\n for (const nested of node) addAllFutureAwaits(set, visited, nested);\n else\n for (const [, nested] of Object.entries(node as object))\n if (nested !== node) addAllFutureAwaits(set, visited, nested);\n }\n}\n\nexport function getAllFutureAwaits(obj: unknown): Set<string> {\n const set = new Set<string>();\n addAllFutureAwaits(set, new Set(), obj);\n return set;\n}\n"],"mappings":";;;;;;;;;;AAyBA,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAuJhC,MAAa,iCAAiC;CAC5C,wBAAwB;CACxB,sBAAsB;CACtB,YAAY;CACZ,+BAA+B;CAC/B,0BAA0B;CAC3B;AA+BD,SAAgB,cAAc,KAAkC;AAC9D,QAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,yBAAyB;;AAG7E,SAAS,mBAAmB,KAAkB,SAAuB,MAAe;AAClF,KAAI,QAAQ,IAAI,KAAK,CAAE;AACvB,SAAQ,IAAI,KAAK;AAGjB,KADa,OAAO,SACP,UACX;MAAI,cAAc,KAAK,CAAE,MAAK,oBAAoB,SAAS,MAAM,IAAI,IAAI,EAAE,CAAC;WACnE,MAAM,QAAQ,KAAK,CAC1B,MAAK,MAAM,UAAU,KAAM,oBAAmB,KAAK,SAAS,OAAO;MAEnE,MAAK,MAAM,GAAG,WAAW,OAAO,QAAQ,KAAe,CACrD,KAAI,WAAW,KAAM,oBAAmB,KAAK,SAAS,OAAO;;;AAIrE,SAAgB,mBAAmB,KAA2B;CAC5D,MAAM,sBAAM,IAAI,KAAa;AAC7B,oBAAmB,qBAAK,IAAI,KAAK,EAAE,IAAI;AACvC,QAAO"}
@@ -1,6 +1,6 @@
1
1
  import { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from "./traversal_ops.js";
2
2
  import { TreeNodeAccessor } from "./accessor.js";
3
- import { AnyFunction, ArchiveFormat, AxesId, AxesSpec, Branded, DataInfo, DiscoverColumnsRequest, DiscoverColumnsResponse, Option, PColumn, PColumnSpec, PColumnValues, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableColumnId, PTableColumnSpec, PTableDef, PTableDefV2, PTableHandle, RangeBytes, ResultCollection, SingleAxisSelector, StringifiedJson, ValueOrError } from "@milaboratories/pl-model-common";
3
+ import { AnyFunction, ArchiveFormat, Branded, DataInfo, Option, PColumn, PColumnValues, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableDef, PTableDefV2, PTableHandle, RangeBytes, ResultCollection, ServiceDispatch, StringifiedJson, ValueOrError } from "@milaboratories/pl-model-common";
4
4
  import { Optional } from "utility-types";
5
5
 
6
6
  //#region src/render/internal.d.ts
@@ -51,17 +51,6 @@ interface GlobalCfgRenderCtxMethods<AHandle = AccessorHandle, FHandle = FutureHa
51
51
  createPFrame(def: PFrameDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PFrameHandle;
52
52
  createPTable(def: PTableDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PTableHandle;
53
53
  createPTableV2(def: PTableDefV2<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PTableHandle;
54
- createSpecFrame(specs: Record<string, PColumnSpec>): string;
55
- specFrameDiscoverColumns(handle: string, request: DiscoverColumnsRequest): DiscoverColumnsResponse;
56
- disposeSpecFrame(handle: string): void;
57
- /** Expand index-based parentAxes in AxesSpec to resolved AxisId parents in AxesId. */
58
- expandAxes(spec: AxesSpec): AxesId;
59
- /** Collapse resolved AxisId parents back to index-based parentAxes in AxesSpec. */
60
- collapseAxes(ids: AxesId): AxesSpec;
61
- /** Find the index of an axis matching the given selector. Returns -1 if not found. */
62
- findAxis(spec: AxesSpec, selector: SingleAxisSelector): number;
63
- /** Find the flat index of a table column matching the given selector. Returns -1 if not found. */
64
- findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number;
65
54
  getCurrentUnstableMarker(): string | undefined;
66
55
  logInfo(message: string): void;
67
56
  logWarn(message: string): void;
@@ -74,7 +63,7 @@ declare const GlobalCfgRenderCtxFeatureFlags: {
74
63
  pTablePartitionFiltersSupport: true;
75
64
  pFrameInSetFilterSupport: true;
76
65
  };
77
- interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods {
66
+ interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods, ServiceDispatch {
78
67
  readonly args: string | (() => string);
79
68
  /** @deprecated Use `data` instead. Optional for backward compatibility - falls back to `data` if not injected. */
80
69
  readonly uiState?: string | (() => string);
@@ -90,5 +79,5 @@ type FutureAwait = {
90
79
  declare function isFutureAwait(obj: unknown): obj is FutureAwait;
91
80
  declare function getAllFutureAwaits(obj: unknown): Set<string>;
92
81
  //#endregion
93
- export { AccessorHandle, FutureAwait, FutureHandle, GlobalCfgRenderCtx, GlobalCfgRenderCtxMethods, PColumnDataUniversal, internal_d_exports };
82
+ export { AccessorHandle, FutureAwait, FutureHandle, GlobalCfgRenderCtx, PColumnDataUniversal, internal_d_exports };
94
83
  //# sourceMappingURL=internal.d.ts.map