@platforma-sdk/model 1.22.97 → 1.23.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/block_state_util.ts","../src/config/actions.ts","../src/internal.ts","../src/render/future.ts","../src/render/accessor.ts","../src/render/internal.ts","../src/render/util/label.ts","../src/render/api.ts","../src/render/util/resource_map.ts","../src/version.ts","../src/bconfig/types.ts","../src/bconfig/normalization.ts","../src/builder.ts","../src/components/PlDataTable.ts","../src/components/PFrameForGraphs.ts","../src/pframe.ts","../src/ref_util.ts","../src/sdk_info.ts","../src/raw_globals.ts","../src/env_value.ts"],"sourcesContent":["import { BlockOutputsBase, ValueOrErrors } from '@milaboratories/pl-model-common';\n\nexport class OutputError extends Error {\n constructor(\n public readonly errors: string[],\n public readonly moreErrors: boolean\n ) {\n super(`${errors.length}${moreErrors ? '+' : ''} errors, first error: ` + errors[0]);\n }\n}\n\nexport function readOutput<T>(outputValue: ValueOrErrors<T>): T {\n if (!outputValue.ok) throw new OutputError(outputValue.errors, outputValue.moreErrors);\n return outputValue.value;\n}\n\ntype ExtractValueType<V extends ValueOrErrors<unknown>> = Extract<V, { ok: true }>['value'];\ntype SimpleOutputs<Outputs extends BlockOutputsBase> = {\n [Key in keyof Outputs]: ExtractValueType<Outputs[Key]>;\n};\n\nexport function wrapOutputs<Outputs extends BlockOutputsBase>(\n outputs: Outputs\n): SimpleOutputs<Outputs> {\n return new Proxy(outputs, {\n get(target, key: string) {\n return readOutput(target[key]);\n }\n }) as SimpleOutputs<Outputs>;\n}\n","import {\n ActGetField,\n ActGetFromCtx,\n ActGetImmediate,\n ActGetResourceField,\n ActGetResourceValueAsJson,\n ActMakeObject,\n ActMapRecordValues,\n ActMapResourceFields,\n ActMapArrayValues,\n ActIsEmpty,\n ActNot,\n ActIsolate,\n ActGetBlobContentAsJson,\n ActGetBlobContentAsString,\n ActGetBlobContent,\n ActAnd,\n ActOr,\n ActMakeArray,\n ActFlatten,\n ActGetDownloadedBlobContent,\n ActGetOnDemandBlobContent,\n ActImportProgress,\n ActGetLastLogs,\n ActGetProgressLog,\n ActGetProgressLogWithInfo,\n ActGetLogHandle,\n ActExtractArchiveAndGetURL\n} from './actions_kinds';\nimport { ExtractAction, POCExtractAction, PrimitiveOrConfig, TypedConfig } from './type_engine';\nimport { Cfg } from './model';\nimport { CheckedSyncConf } from './type_util';\nimport { ArchiveFormat } from '@milaboratories/pl-model-common';\n\n//\n// Helpers\n//\n\nfunction primitiveToConfig(value: PrimitiveOrConfig): TypedConfig {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n )\n return getImmediate(value);\n else return value as TypedConfig;\n}\n\n//\n// Context\n//\n\nexport function getFromCfg<const V extends string>(variable: V): TypedConfig<ActGetFromCtx<V>> {\n return { type: 'GetFromCtx', variable } as Cfg as any;\n}\n\n//\n// Isolate\n//\n\nexport function isolate<const Config extends TypedConfig>(\n cfg: Config\n): TypedConfig<ActIsolate<ExtractAction<Config>>> {\n return {\n type: 'Isolate',\n cfg\n } as Cfg as any;\n}\n\n//\n// Well-known Context Vars\n//\n\nexport const Args = getFromCfg('$args');\nexport const It = getFromCfg('$it');\nexport const MainOutputs = getFromCfg('$prod');\nexport const StagingOutputs = getFromCfg('$staging');\nexport const UiState = getFromCfg('$ui');\n\n//\n// Json\n//\n\nexport function getImmediate<const T>(value: T): TypedConfig<ActGetImmediate<T>> {\n return { type: 'Immediate', value } as Cfg as any;\n}\n\nexport function makeObject<const T extends Record<string, PrimitiveOrConfig>>(\n template: T\n): TypedConfig<ActMakeObject<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: Record<string, TypedConfig> = {};\n for (const [k, cfg] of Object.entries(template)) normalizedTemplate[k] = primitiveToConfig(cfg);\n return {\n type: 'MakeObject',\n template: normalizedTemplate\n } as Cfg as any;\n}\n\nexport function makeArray<const T extends PrimitiveOrConfig[]>(\n ...template: T\n): TypedConfig<ActMakeArray<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: TypedConfig[] = [];\n for (const cfg of template) normalizedTemplate.push(primitiveToConfig(cfg));\n return {\n type: 'MakeArray',\n template: normalizedTemplate\n } as Cfg as any;\n}\n\nexport function getJsonField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig\n>(\n source: Source,\n field: Field\n): TypedConfig<ActGetField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetJsonField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field)\n } as Cfg as any;\n}\n\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapRecordValues',\n source,\n mapping,\n itVar\n } as Cfg as any;\n}\n\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapArrayValues',\n source,\n mapping,\n itVar\n } as Cfg as any;\n}\n\nexport function flatten<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActFlatten<ExtractAction<Source>>> {\n return {\n type: 'Flatten',\n source\n } as Cfg as any;\n}\n\n//\n// Boolean\n//\n\nexport function isEmpty<const Arg extends TypedConfig>(\n arg: Arg\n): TypedConfig<ActIsEmpty<ExtractAction<Arg>>> {\n return {\n type: 'IsEmpty',\n arg\n } as Cfg as any;\n}\n\nexport function not<const Operand extends TypedConfig>(\n operand: Operand\n): TypedConfig<ActNot<ExtractAction<Operand>>> {\n return {\n type: 'Not',\n operand\n } as Cfg as any;\n}\n\nexport function and<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2\n): TypedConfig<ActAnd<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'And',\n operand1,\n operand2\n } as Cfg as any;\n}\n\nexport function or<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2\n): TypedConfig<ActOr<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'Or',\n operand1,\n operand2\n } as Cfg as any;\n}\n\n//\n// Resources\n//\n\nexport function getResourceField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig\n>(\n source: Source,\n field: Field\n): TypedConfig<ActGetResourceField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetResourceField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field)\n } as Cfg as any;\n}\n\nexport function getResourceValueAsJson<T>() {\n return function <const Source extends PrimitiveOrConfig>(\n source: Source\n ): TypedConfig<ActGetResourceValueAsJson<POCExtractAction<Source>, T>> {\n return {\n type: 'GetResourceValueAsJson',\n source: primitiveToConfig(source)\n } as Cfg as any;\n };\n}\n\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig\n>(\n source: Source,\n mapping: Mapping\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapResourceFields',\n source,\n mapping,\n itVar\n } as Cfg as TypedConfig<\n ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>\n >;\n}\n\n//\n// Download Blobs\n//\n\nexport function getBlobContent<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContent',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\nexport function getBlobContentAsString<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetBlobContentAsString<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContentAsString',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\nexport function getBlobContentAsJson<T>() {\n return function <const Source extends TypedConfig>(\n source: Source\n ): TypedConfig<ActGetBlobContentAsJson<ExtractAction<Source>, T>> {\n return {\n type: 'GetBlobContentAsJson',\n source: primitiveToConfig(source)\n } as Cfg as any;\n };\n}\n\nexport function getDownloadedBlobContent<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetDownloadedBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetDownloadedBlobContent',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\nexport function getOnDemandBlobContent<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetOnDemandBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetOnDemandBlobContent',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\n//\n// Download Blobs to URLs\n//\n\nexport function extractArchiveAndGetURL<const Source extends TypedConfig>(\n source: Source,\n format: ArchiveFormat,\n): TypedConfig<ActExtractArchiveAndGetURL<ExtractAction<Source>>> {\n return {\n type: 'ExtractArchiveAndGetURL',\n format,\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\n//\n// Upload Blobs\n//\n\nexport function getImportProgress<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActImportProgress<ExtractAction<Source>>> {\n return {\n type: 'GetImportProgress',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\n//\n// Logs\n//\n\nexport function getLastLogs<const Source extends TypedConfig>(\n source: Source,\n lines: number\n): TypedConfig<ActGetLastLogs<ExtractAction<Source>>> {\n return {\n type: 'GetLastLogs',\n source: primitiveToConfig(source),\n lines\n } as Cfg as any;\n}\n\nexport function getProgressLog<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string\n): TypedConfig<ActGetProgressLog<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLog',\n source: primitiveToConfig(source),\n patternToSearch\n } as Cfg as any;\n}\n\nexport function getProgressLogWithInfo<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string\n): TypedConfig<ActGetProgressLogWithInfo<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLogWithInfo',\n source: primitiveToConfig(source),\n patternToSearch\n } as Cfg as any;\n}\n\nexport function getLogHandle<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetLogHandle<ExtractAction<Source>>> {\n return {\n type: 'GetLogHandle',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n","import {} from './global';\nimport { Platforma, PlatformaFactory } from './platforma';\nimport { FutureHandle, GlobalCfgRenderCtx } from './render/internal';\n\n/** Utility code helping to identify whether the code is running in actual UI environment */\nexport function isInUI() {\n return (\n typeof globalThis.getPlatforma !== 'undefined' || typeof globalThis.platforma !== 'undefined'\n );\n}\n\n/** Utility code helping to retrieve a platforma instance form the environment */\nexport function getPlatformaInstance(config?: {sdkVersion: string}): Platforma {\n if (config && typeof globalThis.getPlatforma === 'function')\n return globalThis.getPlatforma(config);\n else if (typeof globalThis.platforma !== 'undefined') return globalThis.platforma;\n else throw new Error(\"Can't get platforma instance.\");\n}\n\nexport function tryGetCfgRenderCtx(): GlobalCfgRenderCtx | undefined {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else return undefined;\n}\n\nexport function getCfgRenderCtx(): GlobalCfgRenderCtx {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else throw new Error('Not in config rendering context');\n}\n\nexport function tryRegisterCallback(key: string, callback: (...args: any[]) => any): boolean {\n const ctx = tryGetCfgRenderCtx();\n if (ctx === undefined) return false;\n if (key in ctx.callbackRegistry) throw new Error(`Callback with key ${key} already registered.`);\n ctx.callbackRegistry[key] = callback;\n return true;\n}\n\nconst futureResolves = new Map<string, ((value: unknown) => void)[]>();\n\nexport function registerFutureAwait(handle: FutureHandle, onResolve: (value: unknown) => void) {\n if (!(handle in getCfgRenderCtx().callbackRegistry)) {\n getCfgRenderCtx().callbackRegistry[handle] = (value: unknown) => {\n for (const res of futureResolves.get(handle)!) {\n res(value);\n }\n };\n futureResolves.set(handle, []);\n }\n futureResolves.get(handle)!.push(onResolve);\n}\n","import { FutureAwait, FutureHandle } from './internal';\nimport { registerFutureAwait } from '../internal';\n\nexport class FutureRef<T = unknown> {\n private isResolved = false;\n private resolvedValue?: T;\n\n constructor(\n private readonly handle: FutureHandle,\n private readonly postProcess: (value: unknown) => T = (v) => v as T\n ) {\n registerFutureAwait(handle, (value) => {\n this.resolvedValue = postProcess(value);\n this.isResolved = true;\n });\n }\n\n public map<R>(mapping: (v: T) => R): FutureRef<R> {\n return new FutureRef<R>(this.handle, (v) => mapping(this.postProcess(v)));\n }\n\n public mapDefined<R>(mapping: (v: NonNullable<T>) => R): FutureRef<R | undefined> {\n return new FutureRef<R | undefined>(this.handle, (v) => {\n const vv = this.postProcess(v);\n return vv ? mapping(vv) : undefined;\n });\n }\n\n toJSON(): any {\n return this.isResolved\n ? this.resolvedValue\n : ({ __awaited_futures__: [this.handle] } as FutureAwait);\n }\n}\n\nexport type ExtractFutureRefType<Ref extends FutureRef> =\n Ref extends FutureRef<infer T> ? T : never;\n","import {\n AnyLogHandle,\n ImportProgress,\n LocalBlobHandleAndSize,\n PColumn,\n PObject,\n RemoteBlobHandleAndSize,\n FolderURL,\n ArchiveFormat,\n isPColumn,\n mapPObjectData,\n ProgressLogWithInfo\n} from '@milaboratories/pl-model-common';\nimport { getCfgRenderCtx } from '../internal';\nimport { FutureRef } from './future';\nimport { AccessorHandle } from './internal';\nimport { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\n\nexport function ifDef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\ntype FieldMapOps = {\n /**\n * Type of fields to iterate over.\n * (default 'Input')\n * */\n readonly fieldType?: 'Input' | 'Output' | 'Dynamic';\n /**\n * If not locked, `undefined` value will be returned. Do nothing if mapping `Dynamic` fields.\n * (default true)\n * */\n readonly requireLocked?: boolean;\n /**\n * Will skip unresolved fields.\n * (default false)\n * */\n readonly skipUnresolved?: boolean;\n};\n\n/** Represent resource tree node accessor */\nexport class TreeNodeAccessor {\n constructor(\n public readonly handle: AccessorHandle,\n public readonly resolvePath: string[],\n ) {}\n\n /** Shortcut for {@link resolveInput} */\n public resolve(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n /** Shortcut for {@link resolveInput} */\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s)\n }) satisfies FieldTraversalStep\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Output',\n ...(typeof s === 'string' ? { field: s } : s)\n }) satisfies FieldTraversalStep\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s)\n }) satisfies FieldTraversalStep\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n public resolveAny(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n return this.resolveWithCommon({}, ...steps);\n }\n\n public resolveWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): TreeNodeAccessor | undefined {\n const resolvePath = [\n ...this.resolvePath,\n ...steps.map((step) => typeof step === 'string' ? step : step.field),\n ];\n return ifDef(\n getCfgRenderCtx().resolveWithCommon(this.handle, commonOptions, ...steps),\n (accessor) => new TreeNodeAccessor(accessor, resolvePath),\n );\n }\n\n public get resourceType(): ResourceType {\n return getCfgRenderCtx().getResourceType(this.handle);\n }\n\n public getInputsLocked(): boolean {\n return getCfgRenderCtx().getInputsLocked(this.handle);\n }\n\n public getOutputsLocked(): boolean {\n return getCfgRenderCtx().getOutputsLocked(this.handle);\n }\n\n public getIsReadyOrError(): boolean {\n return getCfgRenderCtx().getIsReadyOrError(this.handle);\n }\n\n public getIsFinal(): boolean {\n return getCfgRenderCtx().getIsFinal(this.handle);\n }\n\n public getError(): TreeNodeAccessor | undefined {\n const resolvePath = [...this.resolvePath, 'error'];\n return ifDef(\n getCfgRenderCtx().getError(this.handle),\n (accsessor) => new TreeNodeAccessor(accsessor, resolvePath),\n );\n }\n\n public listInputFields(): string[] {\n return getCfgRenderCtx().listInputFields(this.handle);\n }\n\n public listOutputFields(): string[] {\n return getCfgRenderCtx().listOutputFields(this.handle);\n }\n\n public listDynamicFields(): string[] {\n return getCfgRenderCtx().listDynamicFields(this.handle);\n }\n\n public getKeyValueBase64(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueBase64(this.handle, key);\n }\n\n public getKeyValueAsString(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueAsString(this.handle, key);\n }\n\n public getKeyValueAsJson<T>(key: string): T {\n const content = this.getKeyValueAsString(key);\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n public getDataBase64(): string | undefined {\n return getCfgRenderCtx().getDataBase64(this.handle);\n }\n\n public getDataAsString(): string | undefined {\n return getCfgRenderCtx().getDataAsString(this.handle);\n }\n\n public getDataAsJson<T>(): T {\n const content = this.getDataAsString();\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n /**\n *\n */\n public getPColumns(\n errorOnUnknownField: boolean = false,\n prefix: string = ''\n ): PColumn<TreeNodeAccessor>[] | undefined {\n const result = this.parsePObjectCollection(errorOnUnknownField, prefix);\n if (result === undefined) return undefined;\n\n const pf = Object.entries(result).map(([, obj]) => {\n if (!isPColumn(obj)) throw new Error(`not a PColumn (kind = ${obj.spec.kind})`);\n return obj;\n });\n\n return pf;\n }\n\n /**\n *\n */\n public parsePObjectCollection(\n errorOnUnknownField: boolean = false,\n prefix: string = ''\n ): Record<string, PObject<TreeNodeAccessor>> | undefined {\n const pObjects = getCfgRenderCtx().parsePObjectCollection(\n this.handle,\n errorOnUnknownField,\n prefix,\n ...this.resolvePath,\n );\n if (pObjects === undefined) return undefined;\n const result: Record<string, PObject<TreeNodeAccessor>> = {};\n for (const [key, value] of Object.entries(pObjects)) {\n const resolvePath = [...this.resolvePath, key];\n result[key] = mapPObjectData(value, (c) => new TreeNodeAccessor(c, resolvePath));\n }\n return result;\n }\n\n public getFileContentAsBase64(): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsBase64(this.handle));\n }\n\n public getFileContentAsString(): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsString(this.handle));\n }\n\n public getFileContentAsJson<T>(): FutureRef<T | undefined> {\n return new FutureRef<string | undefined>(\n getCfgRenderCtx().getBlobContentAsString(this.handle)\n ).mapDefined((v) => JSON.parse(v) as T);\n }\n\n /**\n * @deprecated use getFileContentAsBase64\n */\n public getBlobContentAsBase64(): FutureRef<string | undefined> {\n return this.getFileContentAsBase64();\n }\n\n /**\n * @deprecated use getFileContentAsString\n */\n public getBlobContentAsString(): FutureRef<string | undefined> {\n return this.getFileContentAsString();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getFileHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getDownloadedBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getFileHandle\n */\n public getDownloadedBlobHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return this.getFileHandle();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getRemoteFileHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getOnDemandBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getRemoteFileHandle\n */\n public getOnDemandBlobHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return this.getRemoteFileHandle();\n }\n\n /**\n * @returns the url to the extracted folder\n */\n public extractArchiveAndGetURL(format: ArchiveFormat): FutureRef<FolderURL | undefined> {\n return new FutureRef(getCfgRenderCtx().extractArchiveAndGetURL(this.handle, format));\n }\n\n public getImportProgress(): FutureRef<ImportProgress> {\n return new FutureRef(getCfgRenderCtx().getImportProgress(this.handle));\n }\n\n public getLastLogs(nLines: number): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getLastLogs(this.handle, nLines));\n }\n\n public getProgressLog(patternToSearch: string): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLog(this.handle, patternToSearch));\n }\n\n public getProgressLogWithInfo(patternToSearch: string): FutureRef<ProgressLogWithInfo | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLogWithInfo(this.handle, patternToSearch));\n }\n\n public getLogHandle(): FutureRef<AnyLogHandle | undefined> {\n return new FutureRef(getCfgRenderCtx().getLogHandle(this.handle));\n }\n\n public allFieldsResolved(fieldType: 'Input' | 'Output' = 'Input'): boolean {\n switch (fieldType) {\n case 'Input':\n return (\n this.getInputsLocked() &&\n this.listInputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Input' }) !== undefined\n )\n );\n case 'Output':\n return (\n this.getOutputsLocked() &&\n this.listOutputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Output' }) !== undefined\n )\n );\n }\n }\n\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops: FieldMapOps & { skipUnresolved: true }\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor | undefined) => T,\n _ops?: FieldMapOps\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops?: FieldMapOps\n ): T[] | undefined {\n const { fieldType, requireLocked, skipUnresolved } = {\n fieldType: 'Input' as const,\n requireLocked: true,\n skipUnresolved: false,\n ..._ops\n };\n const mapping = _mapping as (name: string, value: TreeNodeAccessor | undefined) => T;\n if (requireLocked) {\n if (fieldType === 'Input' && !this.getInputsLocked()) return undefined;\n if (fieldType === 'Output' && !this.getOutputsLocked()) return undefined;\n }\n const fieldList =\n fieldType === 'Input'\n ? this.listInputFields()\n : fieldType === 'Output'\n ? this.listOutputFields()\n : this.listDynamicFields();\n let fieldEntries = fieldList.map(\n (field) => [field, this.resolve({ field, assertFieldType: fieldType })] as const\n );\n if (skipUnresolved) fieldEntries = fieldEntries.filter((e) => e[1] !== undefined);\n return fieldEntries.map(([name, value]) => mapping(name, value));\n }\n}\n","import { Optional } from 'utility-types';\nimport { Branded } from '../branding';\nimport { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\nimport {\n ArchiveFormat,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n Ref,\n ResultCollection,\n ValueOrError\n} 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 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): FHandle; // string | undefined\n\n getBlobContentAsString(handle: AHandle): 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, string>>, '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<AHandle | PColumnValues>): PFrameHandle;\n\n createPTable(def: PTableDef<PColumn<AHandle | PColumnValues>>): PTableHandle;\n\n //\n // Computable\n //\n\n getCurrentUnstableMarker(): string | undefined;\n}\n\nexport const GlobalCfgRenderCtxFeatureFlags = {\n inlineColumnsSupport: true as const,\n activeArgs: true as const\n};\n\nexport interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods {\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 args: string;\n readonly uiState: string;\n readonly activeArgs?: string;\n readonly callbackRegistry: Record<string, Function>;\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","import { PObjectSpec } from '@milaboratories/pl-model-common';\nimport { z } from 'zod';\n\nexport const PAnnotationLabel = 'pl7.app/label';\nexport const PAnnotationTrace = 'pl7.app/trace';\n\nexport type RecordsWithLabel<T> = {\n value: T;\n label: string;\n};\n\nexport type LabelDerivationOps = {\n /** Force inclusion of native column label */\n includeNativeLabel?: boolean;\n /** Separator to use between label parts (\" / \" by default) */\n separator?: string;\n /** If true, label will be added as suffix (at the end of the generated label). By default label added as a prefix. */\n addLabelAsSuffix?: boolean;\n};\n\nexport const TraceEntry = z.object({\n type: z.string(),\n importance: z.number().optional(),\n id: z.string().optional(),\n label: z.string()\n});\nexport type TraceEntry = z.infer<typeof TraceEntry>;\ntype FullTraceEntry = TraceEntry & { fullType: string; occurenceIndex: number };\n\nexport const Trace = z.array(TraceEntry);\nexport type Trace = z.infer<typeof Trace>;\ntype FullTrace = FullTraceEntry[];\n\nconst DistancePenalty = 0.001;\n\nconst LabelType = '__LABEL__';\nconst LabelTypeFull = '__LABEL__@1';\n\nexport function deriveLabels<T>(\n values: T[],\n specExtractor: (obj: T) => PObjectSpec,\n ops: LabelDerivationOps = {}\n): RecordsWithLabel<T>[] {\n const importances = new Map<string, number>();\n\n // number of times certain type occured among all of the\n const numberOfRecordsWithType = new Map<string, number>();\n\n const enrichedRecords = values.map((value) => {\n const spec = specExtractor(value);\n const label = spec.annotations?.[PAnnotationLabel];\n const traceStr = spec.annotations?.[PAnnotationTrace];\n const trace = (traceStr ? Trace.safeParse(JSON.parse(traceStr)).data : undefined) ?? [];\n\n if (label) {\n const labelEntry = { label, type: LabelType, importance: -2 };\n if (ops.addLabelAsSuffix) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n\n const fullTrace: FullTrace = [];\n\n const occurences = new Map<string, number>();\n for (let i = trace.length - 1; i >= 0; --i) {\n const { type: typeName } = trace[i];\n const importance = trace[i].importance ?? 0;\n const occurenceIndex = (occurences.get(typeName) ?? 0) + 1;\n occurences.set(typeName, occurenceIndex);\n const fullType = `${typeName}@${occurenceIndex}`;\n numberOfRecordsWithType.set(fullType, (numberOfRecordsWithType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(\n importances.get(fullType) ?? Number.NEGATIVE_INFINITY,\n importance - (trace.length - i) * DistancePenalty\n )\n );\n fullTrace.push({ ...trace[i], fullType, occurenceIndex });\n }\n fullTrace.reverse();\n return {\n value,\n spec,\n label,\n fullTrace\n };\n });\n\n // excluding repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const mainTypes: string[] = [];\n // repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const secondaryTypes: string[] = [];\n\n const allTypeRecords = [...importances];\n // sorting: most important types go first\n allTypeRecords.sort(([, i1], [, i2]) => i2 - i1);\n\n for (const [typeName] of allTypeRecords) {\n if (typeName.endsWith('@1') || numberOfRecordsWithType.get(typeName) === values.length)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n const calculate = (includedTypes: Set<string>) =>\n enrichedRecords.map((r) => {\n const labelSet = r.fullTrace\n .filter((fm) => includedTypes.has(fm.fullType))\n .map((fm) => fm.label);\n const sep = ops.separator ?? ' / ';\n return {\n label: labelSet.join(sep),\n value: r.value\n } satisfies RecordsWithLabel<T>;\n });\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0) throw new Error('Assertion error.');\n return calculate(new Set(LabelTypeFull));\n }\n\n //\n // includedTypes = 2\n // * *\n // T0 T1 T2 T3 T4 T5\n // *\n // additinalType = 3\n //\n // Resulting set: T0, T1, T3\n //\n let includedTypes = 0;\n let additinalType = 0;\n while (includedTypes < mainTypes.length) {\n const currentSet = new Set<string>();\n if (ops.includeNativeLabel) currentSet.add(LabelTypeFull);\n for (let i = 0; i < includedTypes; ++i) currentSet.add(mainTypes[i]);\n currentSet.add(mainTypes[additinalType]);\n\n const candidateResult = calculate(currentSet);\n\n // checking if labels uniquely separate our records\n if (new Set(candidateResult.map((c) => c.label)).size === values.length) return candidateResult;\n\n additinalType++;\n if (additinalType == mainTypes.length) {\n includedTypes++;\n additinalType = includedTypes;\n }\n }\n\n return calculate(new Set([...mainTypes, ...secondaryTypes]));\n}\n","import {\n AxisId,\n Option,\n PColumn,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResultCollection,\n ValueOrError,\n ensurePColumn,\n extractAllColumns,\n isPColumn,\n isPColumnSpec,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE\n} from '@milaboratories/pl-model-common';\nimport { Optional } from 'utility-types';\nimport { getCfgRenderCtx } from '../internal';\nimport { TreeNodeAccessor, ifDef } from './accessor';\nimport { FutureRef } from './future';\nimport { GlobalCfgRenderCtx, MainAccessorName, StagingAccessorName } from './internal';\nimport { LabelDerivationOps, deriveLabels } from './util/label';\n\nexport class ResultPool {\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 private defaultLabelFn = (spec: PObjectSpec, ref: PlRef) =>\n spec.annotations?.['pl7.app/label'] ?? `Unlabelled`;\n\n public getOptions(\n predicate: (spec: PObjectSpec) => boolean,\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps\n ): Option[] {\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n if (typeof label === 'object' || typeof label === 'undefined') {\n return deriveLabels(filtered, (o) => o.obj, label ?? {}).map(({ value: { ref }, label }) => ({\n ref,\n label\n }));\n } else\n return filtered.map((s) => ({\n ref: s.ref,\n label: label(s.obj, s.ref)\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, string>>, 'id'>\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, string>>, '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 return mapPObjectData(\n this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name),\n (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name])\n );\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 as PColumnSpec;\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 // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getSpecFromResultPoolByRef === 'undefined')\n return this.getSpecs().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name\n )?.obj;\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 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 }\n\n result.push(data.obj);\n }\n return result;\n }\n}\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\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport class RenderCtx<Args, UiState> {\n private readonly ctx: GlobalCfgRenderCtx;\n\n public readonly args: Args;\n public readonly uiState: UiState;\n\n constructor() {\n this.ctx = getCfgRenderCtx();\n this.args = JSON.parse(this.ctx.args);\n this.uiState = this.ctx.uiState !== undefined ? JSON.parse(this.ctx.uiState) : {};\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 this._activeArgsCache = {\n v: this.ctx.activeArgs ? JSON.parse(this.ctx.activeArgs) : undefined\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 */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.resultPool.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 === 'pl7.app/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 ) {\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 private verifyInlineColumnsSupport(columns: PColumn<TreeNodeAccessor | PColumnValues>[]) {\n const hasInlineColumns = columns.some((c) => !(c.data instanceof TreeNodeAccessor));\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport) throw Error(`inline columns not supported`);\n }\n\n public createPFrame(def: PFrameDef<TreeNodeAccessor | PColumnValues>): PFrameHandle {\n this.verifyInlineColumnsSupport(def);\n return this.ctx.createPFrame(\n def.map((c) => mapPObjectData(c, (d) => (d instanceof TreeNodeAccessor ? d.handle : d)))\n );\n }\n\n public createPTable(def: PTableDef<PColumn<TreeNodeAccessor | PColumnValues>>): PTableHandle;\n public createPTable(def: {\n columns: PColumn<TreeNodeAccessor | PColumnValues>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle;\n public createPTable(\n def:\n | PTableDef<PColumn<TreeNodeAccessor | PColumnValues>>\n | {\n columns: PColumn<TreeNodeAccessor | PColumnValues>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }\n ): PTableHandle {\n var rawDef: PTableDef<PColumn<TreeNodeAccessor | PColumnValues>>;\n if ('columns' in def) {\n rawDef = {\n src: {\n type: 'full',\n entries: def.columns.map((c) => ({ type: 'column', column: c }))\n },\n filters: def.filters ?? [],\n sorting: def.sorting ?? []\n };\n } else {\n rawDef = def;\n }\n this.verifyInlineColumnsSupport(extractAllColumns(rawDef.src));\n return this.ctx.createPTable(\n mapPTableDef(rawDef, (po) =>\n mapPObjectData(po, (d) => (d instanceof TreeNodeAccessor ? d.handle : d))\n )\n );\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 // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getCurrentUnstableMarker === 'undefined') return undefined;\n return this.ctx.getCurrentUnstableMarker();\n }\n}\n\nexport type RenderFunction<Args = unknown, UiState = unknown, Ret = unknown> = (\n rCtx: RenderCtx<Args, UiState>\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 Function> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n","import { TreeNodeAccessor } from '../accessor';\n\nconst PCD_PREFIX = 'PColumnData/';\n\nexport const RT_RESOURCE_MAP = PCD_PREFIX + 'ResourceMap';\nexport const RT_RESOURCE_MAP_PARTITIONED = PCD_PREFIX + 'Partitioned/ResourceMap';\n\nexport const RT_JSON_PARTITIONED = PCD_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_PARTITIONED = PCD_PREFIX + 'BinaryPartitioned';\n\nconst PCD_SUP_PREFIX = PCD_PREFIX + 'Partitioned/';\nexport const RT_JSON_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'BinaryPartitioned';\n\nexport type PColumnKey = (string | number)[];\n\nexport type PColumnResourceMapEntry<T> = {\n key: PColumnKey;\n value: T;\n};\n\nexport type PColumnResourceMapData<T> = {\n isComplete: boolean;\n data: PColumnResourceMapEntry<T>[];\n};\n\nfunction populateResourceMapData<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n data: PColumnResourceMapEntry<T | undefined>[],\n keyPrefix: PColumnKey = [],\n addEntriesWithNoData: boolean\n): boolean {\n if (acc === undefined) return false;\n switch (acc.resourceType.name) {\n case RT_RESOURCE_MAP: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const converted = value === undefined ? undefined : resourceParser(value);\n if (converted === undefined) isComplete = false;\n if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });\n }\n return isComplete;\n }\n case RT_RESOURCE_MAP_PARTITIONED: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) isComplete = false;\n else {\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const populateResult = populateResourceMapData(\n value,\n resourceParser,\n data,\n key,\n addEntriesWithNoData\n );\n isComplete = isComplete && populateResult;\n }\n }\n return isComplete;\n }\n default:\n throw new Error(`Unknown resource type: ${acc.resourceType.name}`);\n }\n}\n\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: false\n): PColumnResourceMapData<NonNullable<T>>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: true\n): PColumnResourceMapData<T | undefined>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: boolean = false\n): PColumnResourceMapData<T | undefined> {\n const data: PColumnResourceMapEntry<T | undefined>[] = [];\n const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);\n return { isComplete, data };\n}\n\n\nexport type PColumnKeyList = {\n /** array of keys */\n data: PColumnKey[];\n /** length of partition key */\n keyLength: number;\n};\n\nconst removeIndexSuffix = (keyStr: string): string | undefined => {\n if (keyStr.endsWith('.index')) {\n return undefined;\n } else if (keyStr.endsWith('.values')) {\n return keyStr.substring(0, keyStr.length - 7);\n } else {\n throw Error(`key must ends on .index/.values for binary p-column, got: ${keyStr}`);\n }\n};\n\n// @TODO define a class with various resource map operations\n/** Returns a list of all partition keys appeared in the p-column */\nexport function getPartitionKeysList(\n acc: TreeNodeAccessor | undefined\n): PColumnKeyList | undefined {\n if (!acc) return undefined;\n\n const rt = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n const data: PColumnKey[] = [];\n\n let keyLength = 0;\n // @TODO validate meta shape\n switch (rt) {\n case RT_RESOURCE_MAP:\n keyLength = meta['keyLength'];\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n keyLength = meta['partitionKeyLength'] + meta['keyLength'];\n break;\n\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n keyLength = meta['partitionKeyLength'];\n break;\n\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n keyLength = meta['superPartitionKeyLength'] + meta['partitionKeyLength'];\n break;\n }\n\n switch (rt) {\n case RT_RESOURCE_MAP:\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n for (let keyStr of acc.listInputFields()) {\n if (rt === RT_BINARY_PARTITIONED) {\n const k = removeIndexSuffix(keyStr);\n if (!k) continue;\n else keyStr = k;\n }\n const key = [...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n for (const supKeyStr of acc.listInputFields()) {\n const keyPrefix = [...JSON.parse(supKeyStr)] as PColumnKey;\n\n const value = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (value !== undefined) {\n for (let keyStr of value.listInputFields()) {\n if (rt === RT_BINARY_SUPER_PARTITIONED) {\n const k = removeIndexSuffix(keyStr);\n if (!k) continue;\n else keyStr = k;\n }\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n }\n }\n break;\n }\n\n return { data, keyLength };\n}\n\n/** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */\n// @TODO define a class with various resource map operations\nexport function getUniquePartitionKeys(\n acc: TreeNodeAccessor | undefined\n): (string | number)[][] | undefined {\n const list = getPartitionKeysList(acc);\n if (!list) return undefined;\n\n const { data, keyLength } = list;\n\n const result: Set<string | number>[] = [];\n\n for (let i = 0; i < keyLength; ++i) {\n result.push(new Set());\n }\n\n for (const l of data) {\n if (l.length !== keyLength) {\n throw new Error('key length does not match partition length');\n }\n for (let i = 0; i < keyLength; ++i) {\n result[i].add(l[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n","export const PlatformaSDKVersion = '1.22.97';\n","import { TypedConfig } from '../config';\nimport { ConfigRenderLambda } from './lambdas';\n\nexport type Code = {\n type: 'plain';\n content: string;\n};\n\nexport function isConfigLambda(\n cfgOrFh: TypedConfigOrConfigLambda\n): cfgOrFh is ConfigRenderLambda {\n return (cfgOrFh as any).__renderLambda === true;\n}\n\nexport type TypedConfigOrConfigLambda = TypedConfig | ConfigRenderLambda;\n\n/** @deprecated */\nexport type TypedConfigOrString = TypedConfig | string;\n","import { BlockConfigContainer } from './container';\nimport { isConfigLambda, TypedConfigOrConfigLambda, TypedConfigOrString } from './types';\nimport { BlockConfig } from './v3';\n\nexport function downgradeCfgOrLambda(data: TypedConfigOrConfigLambda): TypedConfigOrString;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined\n): TypedConfigOrString | undefined;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined\n): TypedConfigOrString | undefined {\n if (data === undefined) return undefined;\n if (isConfigLambda(data)) return data.handle;\n return data;\n}\n\nfunction upgradeCfgOrLambda(data: TypedConfigOrString): TypedConfigOrConfigLambda;\nfunction upgradeCfgOrLambda(\n data: TypedConfigOrString | undefined\n): TypedConfigOrConfigLambda | undefined;\nfunction upgradeCfgOrLambda(\n data: TypedConfigOrString | undefined\n): TypedConfigOrConfigLambda | undefined {\n if (data === undefined) return undefined;\n if (typeof data === 'string') return { __renderLambda: true, handle: data, retentive: false };\n return data;\n}\n\n/**\n * Takes universal config, and converts it into latest config structure.\n *\n * **Important**: This operation is not meant to be executed recusively.\n * In no circumstance result of this function should be persisted!\n * */\nexport function extractConfig(cfg: BlockConfigContainer): BlockConfig {\n if (cfg.v3 !== undefined) {\n // version 3\n const {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n sections,\n title\n } = cfg.v3;\n const { code } = cfg;\n return {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n sections,\n title,\n code\n };\n } else if (cfg.inputsValid !== undefined) {\n // version 2\n const { sdkVersion, renderingMode, outputs, inputsValid, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n sdkVersion === undefined ||\n renderingMode === undefined ||\n outputs === undefined ||\n inputsValid === undefined ||\n sections === undefined ||\n initialArgs === undefined\n )\n throw new Error(\n `Malformed config v2. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`\n );\n return {\n sdkVersion,\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)])\n ),\n inputsValid: upgradeCfgOrLambda(inputsValid),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code\n };\n } else if (cfg.renderingMode !== undefined) {\n // version 1\n const { sdkVersion, canRun, renderingMode, outputs, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n renderingMode === undefined ||\n outputs === undefined ||\n canRun === undefined ||\n sections === undefined ||\n initialArgs === undefined\n )\n throw new Error(\n `Malformed config v1. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`\n );\n return {\n sdkVersion: sdkVersion ?? 'unknown',\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)])\n ),\n inputsValid: upgradeCfgOrLambda(canRun),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code\n };\n } else {\n const { sdkVersion } = cfg;\n const fields = Object.keys(cfg);\n throw new Error(\n `Config format not supported: SDK = ${sdkVersion}; Fields = ${fields.join(', ')}`\n );\n }\n}\n","import { BlockRenderingMode, BlockSection, ValueOrErrors } from '@milaboratories/pl-model-common';\nimport { Checked, ConfigResult, getImmediate, PlResourceEntry, TypedConfig } from './config';\nimport { getPlatformaInstance, isInUI, tryRegisterCallback } from './internal';\nimport { Platforma } from './platforma';\nimport { InferRenderFunctionReturn, RenderCtx, RenderFunction } from './render';\nimport { PlatformaSDKVersion } from './version';\nimport {\n TypedConfigOrConfigLambda,\n ConfigRenderLambda,\n StdCtxArgsOnly,\n DeriveHref,\n ResolveCfgType,\n ExtractFunctionHandleReturn,\n BlockConfigContainer,\n downgradeCfgOrLambda,\n ConfigRenderLambdaFlags\n} from './bconfig';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype SectionsCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends SectionsExpectedType ? true : false\n>;\n\ntype SectionsRFChecked<RF extends Function> = Checked<\n RF,\n InferRenderFunctionReturn<RF> extends SectionsExpectedType ? true : false\n>;\n\ntype InputsValidExpectedType = boolean;\n\ntype InputsValidCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends InputsValidExpectedType ? true : false\n>;\n\ntype InputsValidRFChecked<RF extends Function> = Checked<\n RF,\n InferRenderFunctionReturn<RF> extends InputsValidExpectedType ? true : false\n>;\n\ntype NoOb = Record<string, never>;\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module. */\nexport class BlockModel<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n Href extends `/${string}` = '/'\n> {\n private constructor(\n private readonly _renderingMode: BlockRenderingMode,\n private readonly _initialArgs: Args | undefined,\n private readonly _initialUiState: UiState,\n private readonly _outputs: OutputsCfg,\n private readonly _inputsValid: TypedConfigOrConfigLambda,\n private readonly _sections: TypedConfigOrConfigLambda,\n private readonly _title: ConfigRenderLambda | undefined\n ) {}\n\n /** Initiates configuration builder */\n public static create(renderingMode: BlockRenderingMode): BlockModel<NoOb, {}, NoOb>;\n /** Initiates configuration builder */\n public static create(): BlockModel<NoOb, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(renderingMode: BlockRenderingMode): BlockModel<Args, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(): BlockModel<Args, {}, NoOb>;\n public static create(renderingMode: BlockRenderingMode = 'Heavy'): BlockModel<NoOb, {}, NoOb> {\n return new BlockModel<NoOb, {}, NoOb>(\n renderingMode,\n undefined,\n {},\n {},\n getImmediate(true),\n getImmediate([]),\n undefined\n );\n }\n\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param cfg configuration describing how to render cell value from the blocks\n * workflow outputs\n * @deprecated use lambda-based API\n * */\n public output<const Key extends string, const Cfg extends TypedConfig>(\n key: Key,\n cfg: Cfg\n ): BlockModel<Args, OutputsCfg & { [K in Key]: Cfg }, UiState, Href>;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: TypedConfig | Function,\n flags: ConfigRenderLambdaFlags = {}\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n if (typeof cfgOrRf === 'function') {\n const handle = `output#${key}`;\n tryRegisterCallback(handle, () => cfgOrRf(new RenderCtx()));\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: {\n __renderLambda: true,\n handle,\n ...flags\n } satisfies ConfigRenderLambda\n },\n this._inputsValid,\n this._sections,\n this._title\n );\n } else\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: cfgOrRf\n },\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Sets custom configuration predicate on the block args at which block can be executed\n * @deprecated use lambda-based API */\n public argsValid<Cfg extends TypedConfig>(\n cfg: Cfg & InputsValidCfgChecked<Cfg, Args, UiState>\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n /** Sets custom configuration predicate on the block args at which block can be executed */\n public argsValid<RF extends RenderFunction<Args, UiState, boolean>>(\n rf: RF\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n public argsValid(\n cfgOrRf: TypedConfig | Function\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (typeof cfgOrRf === 'function') {\n tryRegisterCallback('inputsValid', () => cfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n {\n __renderLambda: true,\n handle: 'inputsValid'\n } satisfies ConfigRenderLambda,\n this._sections,\n this._title\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n cfgOrRf,\n this._sections,\n this._title\n );\n }\n\n /** Sets the config to generate list of section in the left block overviews panel\n * @deprecated use lambda-based API */\n public sections<const S extends SectionsExpectedType>(\n rf: S\n ): BlockModel<Args, OutputsCfg, UiState, DeriveHref<S>>;\n /** Sets the config to generate list of section in the left block overviews panel */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, UiState, Ret>\n >(rf: RF): BlockModel<Args, OutputsCfg, UiState, DeriveHref<ReturnType<RF>>>;\n public sections<const Cfg extends TypedConfig>(\n cfg: Cfg & SectionsCfgChecked<Cfg, Args, UiState>\n ): BlockModel<\n Args,\n OutputsCfg,\n UiState,\n DeriveHref<ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>>>\n >;\n public sections(\n arrOrCfgOrRf: SectionsExpectedType | TypedConfig | Function\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (Array.isArray(arrOrCfgOrRf)) {\n return this.sections(getImmediate(arrOrCfgOrRf));\n } else if (typeof arrOrCfgOrRf === 'function') {\n tryRegisterCallback('sections', () => arrOrCfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n { __renderLambda: true, handle: 'sections' } as ConfigRenderLambda,\n this._title\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n arrOrCfgOrRf as TypedConfig,\n this._title\n );\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, UiState, string>\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback('title', () => rf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n { __renderLambda: true, handle: 'title' } as ConfigRenderLambda\n );\n }\n\n /**\n * Sets initial args for the block, this value must be specified.\n * @deprecated use {@link withArgs}\n * */\n public initialArgs(value: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n value,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Sets initial args for the block, this value must be specified. */\n public withArgs<Args>(initialValue: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n initialValue,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Defines type and sets initial value for block UiState. */\n public withUiState<UiState>(initialValue: UiState): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n initialValue,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block state, and\n * other features provided by the platforma to the block. */\n public done(): Platforma<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n > {\n if (this._initialArgs === undefined) throw new Error('Initial arguments not set.');\n\n const config: BlockConfigContainer = {\n v3: {\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n initialUiState: this._initialUiState,\n inputsValid: this._inputsValid,\n sections: this._sections,\n title: this._title,\n outputs: this._outputs\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n inputsValid: downgradeCfgOrLambda(this._inputsValid),\n sections: downgradeCfgOrLambda(this._sections),\n outputs: Object.fromEntries(\n Object.entries(this._outputs).map(([key, value]) => [key, downgradeCfgOrLambda(value)])\n )\n };\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config } as any;\n // normal operation inside the UI\n else return getPlatformaInstance({ sdkVersion: PlatformaSDKVersion }) as any;\n }\n}\n\nexport type InferOutputType<CfgOrFH, Args, UiState> = CfgOrFH extends TypedConfig\n ? ResolveCfgType<CfgOrFH, Args, UiState>\n : CfgOrFH extends ConfigRenderLambda\n ? ExtractFunctionHandleReturn<CfgOrFH>\n : never;\n\ntype InferOutputsFromConfigs<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState\n> = {\n [Key in keyof OutputsCfg]: ValueOrErrors<InferOutputType<OutputsCfg[Key], Args, UiState>>;\n};\n","import {\n AxisSpec,\n getAxisId,\n isPColumn,\n JoinEntry,\n matchAxisId,\n PColumn,\n PColumnIdAndSpec,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting\n} from '@milaboratories/pl-model-common';\nimport { RenderCtx, TreeNodeAccessor } from '../render';\n\n/** Data table state */\nexport type PlDataTableGridState = {\n /** Includes column ordering */\n columnOrder?: {\n /** All colIds in order */\n orderedColIds: string[];\n };\n /** Includes current sort columns and direction */\n sort?: {\n /** Sorted columns and directions in order */\n sortModel: {\n /** Column Id to apply the sort to. */\n colId: string;\n /** Sort direction */\n sort: 'asc' | 'desc';\n }[];\n };\n /** Includes column visibility */\n columnVisibility?: {\n /** All colIds which were hidden */\n hiddenColIds: string[];\n };\n\n /** current sheet selections */\n sheets?: Record<string, string | number>;\n};\n\nexport type PlDataTableSheet = {\n /** spec of the axis to use */\n axis: AxisSpec;\n /** options to show in the filter tan */\n options: {\n /** value of the option (should be one of the values in the axis or column) */\n value: string | number;\n /** corresponding label */\n label: string;\n }[];\n /** default (selected) value */\n defaultValue?: string | number;\n};\n\n/**\n * Params used to get p-table handle from the driver\n */\nexport type PTableParams = {\n /** For sourceType: 'pframe' the join is original one, enriched with label columns */\n join?: JoinEntry<PColumnIdAndSpec>;\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n};\n\n/**\n * PlDataTable persisted state\n */\nexport type PlDataTableState = {\n // internal ag-grid state\n gridState: PlDataTableGridState;\n // mapping of gridState onto the p-table data structures\n pTableParams?: PTableParams;\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNotNA = {\n /** Predicate type */\n type: 'isNotNA';\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNA = {\n /** Predicate type */\n type: 'isNA';\n};\n\n/** PlTableFilters filter entries applicable to both string and number values */\nexport type PlTableFilterCommon = PlTableFilterIsNotNA | PlTableFilterIsNA;\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberEquals = {\n /** Predicate type */\n type: 'number_equals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberNotEquals = {\n /** Predicate type */\n type: 'number_notEquals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThan = {\n /** Predicate type */\n type: 'number_greaterThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThanOrEqualTo = {\n /** Predicate type */\n type: 'number_greaterThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThan = {\n /** Predicate type */\n type: 'number_lessThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThanOrEqualTo = {\n /** Predicate type */\n type: 'number_lessThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberBetween = {\n /** Predicate type */\n type: 'number_between';\n /** Referense value for the lower bound */\n lowerBound: number;\n /** Defines whether values equal to lower bound reference value should be matched */\n includeLowerBound: boolean;\n /** Referense value for the upper bound */\n upperBound: number;\n /** Defines whether values equal to upper bound reference value should be matched */\n includeUpperBound: boolean;\n};\n\n/** All PlTableFilters numeric filter entries */\nexport type PlTableFilterNumber =\n | PlTableFilterCommon\n | PlTableFilterNumberEquals\n | PlTableFilterNumberNotEquals\n | PlTableFilterNumberGreaterThan\n | PlTableFilterNumberGreaterThanOrEqualTo\n | PlTableFilterNumberLessThan\n | PlTableFilterNumberLessThanOrEqualTo\n | PlTableFilterNumberBetween;\n/** All types of PlTableFilters numeric filter entries */\nexport type PlTableFilterNumberType = PlTableFilterNumber['type'];\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringEquals = {\n /** Predicate type */\n type: 'string_equals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringNotEquals = {\n /** Predicate type */\n type: 'string_notEquals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContains = {\n /** Predicate type */\n type: 'string_contains';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotContain = {\n /** Predicate type */\n type: 'string_doesNotContain';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringMatches = {\n /** Predicate type */\n type: 'string_matches';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotMatch = {\n /** Predicate type */\n type: 'string_doesNotMatch';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContainsFuzzyMatch = {\n /** Predicate type */\n type: 'string_containsFuzzyMatch';\n /** Referense value */\n reference: string;\n /**\n * Maximum acceptable edit distance between reference value and matched substring\n * @see https://en.wikipedia.org/wiki/Edit_distance\n */\n maxEdits: number;\n /**\n * When {@link substitutionsOnly} is set to false\n * Levenshtein distance is used as edit distance (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used as edit distance (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n substitutionsOnly: boolean;\n /**\n * Single character in {@link reference} that will labelColumn any\n * single character in searched text.\n */\n wildcard?: string;\n};\n\n/** All PlTableFilters string filter entries */\nexport type PlTableFilterString =\n | PlTableFilterCommon\n | PlTableFilterStringEquals\n | PlTableFilterStringNotEquals\n | PlTableFilterStringContains\n | PlTableFilterStringDoesNotContain\n | PlTableFilterStringMatches\n | PlTableFilterStringDoesNotMatch\n | PlTableFilterStringContainsFuzzyMatch;\n/** All types of PlTableFilters string filter entries */\nexport type PlTableFilterStringType = PlTableFilterString['type'];\n\n/** All PlTableFilters filter entries */\nexport type PlTableFilter = PlTableFilterNumber | PlTableFilterString;\n/** All types of PlTableFilters filter entries */\nexport type PlTableFilterType = PlTableFilter['type'];\n\n/** Internal grid column identifier */\nexport type PlTableFilterColumnId = string;\n\n/** PlTableFiltersState entry */\nexport type PlTableFiltersStateEntry = {\n /** Column identifier */\n columnId: PlTableFilterColumnId;\n /** Active filter */\n filter: PlTableFilter;\n /** Flag to temporarily disable filter */\n disabled: boolean;\n};\n\n/** PlTableFiltersModel state */\nexport type PlTableFiltersState = PlTableFiltersStateEntry[];\n\n/** PlTableFilters model */\nexport type PlTableFiltersModel = {\n /** Internal PlTableFilters component state, do not change! */\n state?: PlTableFiltersState;\n /** Resulting filters which should be used in Join */\n filters?: PTableRecordFilter[];\n};\n\nexport type CreatePlDataTableOps = {\n /** Table filters, should contain */\n filters?: PTableRecordFilter[];\n\n /**\n * Selects columns for which will be inner-joined to the table.\n *\n * Default behaviour: all columns are considered to be core\n */\n coreColumnPredicate?: (spec: PColumnSpec) => boolean;\n\n /**\n * Determines how core columns should be joined together:\n * inner - so user will only see records present in all core columns\n * full - so user will only see records present in any of the core columns\n *\n * All non-core columns will be left joined to the table produced by the core\n * columns, in other words records form the pool of non-core columns will only\n * make their way into the final table if core table contins corresponding key.\n *\n * Default: 'full'\n */\n coreJoinType?: 'inner' | 'full';\n};\n\n/**\n * Create p-table handle given ui table state\n *\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns\n */\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined\n): PTableHandle | undefined;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined,\n ops: CreatePlDataTableOps\n): PTableHandle | undefined;\n/** @deprecated use method with extended ops as the last argument */\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined,\n filters: PTableRecordFilter[]\n): PTableHandle | undefined;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined,\n ops?: PTableRecordFilter[] | CreatePlDataTableOps\n): PTableHandle | undefined {\n // ops migration for backward compatibility with previous deprecated API\n if (Array.isArray(ops)) {\n ops = { filters: ops };\n }\n\n const allLabelCols = ctx.resultPool\n .getData()\n .entries.map((d) => d.obj)\n .filter(isPColumn)\n .filter((p) => p.spec.name === 'pl7.app/label' && p.spec.axesSpec.length === 1);\n\n const colId = (id: PObjectId, domain?: Record<string, string>) => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n return wid;\n };\n\n const labelColumns = new Map<string, PColumn<TreeNodeAccessor>>();\n\n for (const col of columns) {\n for (const axis of col.spec.axesSpec) {\n const axisId = getAxisId(axis);\n for (const labelColumn of allLabelCols) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n if (matchAxisId(axisId, labelAxisId)) {\n const dataDomainLen = Object.keys(axisId.domain ?? {}).length;\n const labelDomainLen = Object.keys(labelAxisId.domain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n const id = colId(labelColumn.id, axisId.domain);\n\n labelColumns.set(id, {\n id: id as PObjectId,\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }]\n },\n data: labelColumn.data\n });\n } else {\n labelColumns.set(colId(labelColumn.id), labelColumn);\n }\n }\n }\n }\n }\n\n // if at least one column is not yet ready, we can't show the table\n if (\n [...columns, ...labelColumns.values()].some(\n (a) => a.data instanceof TreeNodeAccessor && !a.data.getIsReadyOrError()\n )\n )\n return undefined;\n\n let coreColumns = columns;\n const secondaryColumns: typeof columns = [];\n\n if (ops?.coreColumnPredicate) {\n coreColumns = [];\n for (const c of columns)\n if (ops.coreColumnPredicate(c.spec)) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...labelColumns.values());\n\n return ctx.createPTable({\n src: {\n type: 'outer',\n primary: {\n type: ops?.coreJoinType ?? 'full',\n entries: coreColumns.map((c) => ({ type: 'column', column: c }))\n },\n secondary: secondaryColumns.map((c) => ({ type: 'column', column: c }))\n },\n filters: [...(ops?.filters ?? []), ...(tableState?.pTableParams?.filters ?? [])],\n sorting: tableState?.pTableParams?.sorting ?? []\n });\n}\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtx<A, U>,\n axis: AxisSpec,\n values: (string | number)[]\n): PlDataTableSheet {\n const labels = ctx.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString()\n })),\n defaultValue: values[0]\n };\n}\n","import {\n AxisId,\n getAxisId,\n isPColumn,\n matchAxisId,\n PColumn,\n PColumnValues,\n PFrameHandle,\n PObjectId,\n ValueType,\n} from '@milaboratories/pl-model-common';\nimport {RenderCtx, TreeNodeAccessor} from '../render';\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\n let wid = id.toString();\n domains?.forEach(domain => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach(list => {\n const nextResult: AxisId[][] = [];\n list.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\n/** Check if axes of secondary column are exactly in axes of main column */\nfunction checkFullCompatibility(\n mainColumn: PColumn<TreeNodeAccessor | PColumnValues>,\n secondaryColumn: PColumn<TreeNodeAccessor | PColumnValues>\n): boolean {\n const mainAxesIds = mainColumn.spec.axesSpec.map(getAxisId);\n const secondaryAxesIds = secondaryColumn.spec.axesSpec.map(getAxisId);\n return secondaryAxesIds.every(id => mainAxesIds.some(mainId => matchAxisId(mainId, id) && matchAxisId(id, mainId)));\n}\n\n/** Check if axes of secondary column are in axes of main column, but they can have compatible difference in domains */\nfunction checkCompatibility(\n mainColumn: PColumn<TreeNodeAccessor | PColumnValues>,\n secondaryColumn: PColumn<TreeNodeAccessor | PColumnValues>\n): boolean {\n const mainAxesIds = mainColumn.spec.axesSpec.map(getAxisId);\n const secondaryAxesIds = secondaryColumn.spec.axesSpec.map(getAxisId);\n return secondaryAxesIds.every(id => mainAxesIds.some(mainId => matchAxisId(mainId, id)));\n}\n\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // annotation for column duplicates with extended domains\n\n/** Main column can have additional domains, if secondary column (meta-column) has all axes match main column axes\n we can add its copy with missed domain fields for compatibility */\nfunction getAdditionalColumnsForPair(\n mainColumn: PColumn<TreeNodeAccessor | PColumnValues>,\n secondaryColumn: PColumn<TreeNodeAccessor | PColumnValues>\n): PColumn<TreeNodeAccessor | PColumnValues>[] {\n const mainAxesIds = mainColumn.spec.axesSpec.map(getAxisId);\n const secondaryAxesIds = secondaryColumn.spec.axesSpec.map(getAxisId);\n\n const isFullCompatible = checkFullCompatibility(mainColumn, secondaryColumn);\n if (isFullCompatible) { // in this case it isn't necessary to add more columns\n return [];\n }\n const isCompatible = checkCompatibility(mainColumn, secondaryColumn);\n if (!isCompatible) { // in this case it is impossible to add some compatible column\n return [];\n }\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = secondaryAxesIds.map(id => {\n return mainAxesIds.filter(mainId => matchAxisId(mainId, id));\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n return secondaryIdsVariants.map(idsList => {\n const id = colId(secondaryColumn.id, idsList.map(id => id.domain));\n return {\n id: id as PObjectId,\n spec: {\n ...secondaryColumn.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: secondaryColumn.spec.axesSpec[idx].annotations\n })),\n annotations: {\n ...secondaryColumn.spec.annotations,\n [IS_VIRTUAL_COLUMN]: 'true'\n }\n },\n data: secondaryColumn.data\n };\n });\n}\n\nexport function getAdditionalColumns(columns: PColumn<TreeNodeAccessor | PColumnValues>[]): PColumn<TreeNodeAccessor | PColumnValues>[] {\n const additionalColumns: PColumn<TreeNodeAccessor | PColumnValues>[] = [];\n for (let i = 0; i < columns.length; i++) {\n for (let j = i + 1; j < columns.length; j++) {\n const column1 = columns[i];\n const column2 = columns[j];\n\n // check if column 1 is meta for column 2 or backward\n additionalColumns.push(\n ...getAdditionalColumnsForPair(column1, column2),\n ...getAdditionalColumnsForPair(column2, column1)\n );\n }\n }\n return additionalColumns;\n}\n\nexport function enrichColumnsWithCompatible(\n mainColumns: PColumn<TreeNodeAccessor | PColumnValues>[],\n secondaryColumns: PColumn<TreeNodeAccessor | PColumnValues>[]\n): PColumn<TreeNodeAccessor | PColumnValues>[] {\n const result = [...mainColumns];\n for (const secondaryColumn of secondaryColumns) {\n for (const mainColumn of mainColumns) {\n if (mainColumn.id === secondaryColumn.id) {\n break;\n }\n if (checkCompatibility(mainColumn, secondaryColumn)) {\n result.push(secondaryColumn);\n break;\n }\n }\n }\n return result;\n}\n\nconst VALUE_TYPES: ValueType[] = [\n 'Int',\n 'Long',\n 'Float',\n 'Double',\n 'String',\n 'Bytes'\n];\n\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtx<A, U>,\n blockColumns?: PColumn<TreeNodeAccessor | PColumnValues>[]\n): PFrameHandle | undefined {\n if (blockColumns === undefined) return undefined;\n\n const upstreamColumns = ctx.resultPool\n .getData()\n .entries.map((v) => v.obj)\n .filter(isPColumn)\n .filter((column) => VALUE_TYPES.includes(column.spec.valueType));\n\n const columnsWithCompatibleFromUpstream = enrichColumnsWithCompatible(blockColumns, upstreamColumns);\n\n // additional columns are duplicates with extra fields in domains for compatibility in all possible pairs of columns set\n const extendedColumns = [...columnsWithCompatibleFromUpstream, ...getAdditionalColumns(columnsWithCompatibleFromUpstream)];\n\n // if at least one column is not yet ready, we can't show the table\n if (\n extendedColumns.some(\n (a) => a.data instanceof TreeNodeAccessor && !a.data.getIsReadyOrError()\n )\n )\n return undefined;\n\n return ctx.createPFrame(extendedColumns);\n}","import {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n FindColumnsRequest,\n FindColumnsResponse,\n PColumnIdAndSpec,\n PColumnSpec,\n PFrame,\n PFrameHandle,\n PObjectId,\n UniqueValuesRequest,\n UniqueValuesResponse\n} from '@milaboratories/pl-model-common';\n\nexport class PFrameImpl implements PFrame {\n constructor(private readonly handle: PFrameHandle) {}\n\n public async findColumns(request: FindColumnsRequest): Promise<FindColumnsResponse> {\n return await platforma.pFrameDriver.findColumns(this.handle, request);\n }\n\n public async getColumnSpec(columnId: PObjectId): Promise<PColumnSpec> {\n return await platforma.pFrameDriver.getColumnSpec(this.handle, columnId);\n }\n\n public async listColumns(): Promise<PColumnIdAndSpec[]> {\n return await platforma.pFrameDriver.listColumns(this.handle);\n }\n\n public async calculateTableData(\n request: CalculateTableDataRequest<PObjectId>\n ): Promise<CalculateTableDataResponse> {\n return await platforma.pFrameDriver.calculateTableData(this.handle, request);\n }\n\n public async getUniqueValues(request: UniqueValuesRequest): Promise<UniqueValuesResponse> {\n return await platforma.pFrameDriver.getUniqueValues(this.handle, request);\n }\n}\n","import { getJsonField, makeObject, TypedConfig } from './config';\n\nexport function fromPlRef<Source extends TypedConfig>(source: Source) {\n return makeObject({\n __isRef: true,\n blockId: getJsonField(source, 'blockId'),\n name: getJsonField(source, 'name')\n });\n}\n\nexport function fromPlOption<Source extends TypedConfig>(source: Source) {\n return makeObject({\n ref: fromPlRef(getJsonField(source, 'ref')),\n label: getJsonField(source, 'label')\n });\n}\n","import { PlatformaSDKVersion } from './version';\n\nexport type SdkInfo = {\n readonly sdkVersion: string;\n};\n\nexport const CurrentSdkInfo: SdkInfo = {\n sdkVersion: PlatformaSDKVersion\n};\n","import {} from './global';\nimport { getPlatformaInstance } from './internal';\nimport { Platforma } from './platforma';\nimport { PlatformaSDKVersion } from './version';\n\nexport function getRawPlatformaInstance(): Platforma {\n return getPlatformaInstance({ sdkVersion: PlatformaSDKVersion });\n}\n","import {} from './global';\n\nexport function getEnvironmentValue(name: string): string | undefined {\n if (typeof globalThis.getEnvironmentValue !== 'function') return undefined;\n else return globalThis.getEnvironmentValue(name);\n}\n"],"names":["OutputError","errors","moreErrors","readOutput","outputValue","wrapOutputs","outputs","target","key","primitiveToConfig","value","getImmediate","getFromCfg","variable","isolate","cfg","Args","It","MainOutputs","StagingOutputs","UiState","makeObject","template","normalizedTemplate","k","makeArray","getJsonField","source","field","mapRecordValues","mapping","itVar","mapArrayValues","flatten","isEmpty","arg","not","operand","and","operand1","operand2","or","getResourceField","getResourceValueAsJson","mapResourceFields","getBlobContent","getBlobContentAsString","getBlobContentAsJson","getDownloadedBlobContent","getOnDemandBlobContent","extractArchiveAndGetURL","format","getImportProgress","getLastLogs","lines","getProgressLog","patternToSearch","getProgressLogWithInfo","getLogHandle","isInUI","getPlatformaInstance","config","tryGetCfgRenderCtx","getCfgRenderCtx","tryRegisterCallback","callback","ctx","futureResolves","registerFutureAwait","handle","onResolve","res","FutureRef","postProcess","v","__publicField","vv","ifDef","cb","TreeNodeAccessor","resolvePath","steps","transformedSteps","s","commonOptions","step","accessor","accsessor","content","errorOnUnknownField","prefix","result","obj","isPColumn","pObjects","mapPObjectData","c","nLines","fieldType","_mapping","_ops","requireLocked","skipUnresolved","fieldEntries","e","name","StagingAccessorName","MainAccessorName","GlobalCfgRenderCtxFeatureFlags","isFutureAwait","addAllFutureAwaits","set","visited","node","a","nested","getAllFutureAwaits","PAnnotationLabel","PAnnotationTrace","TraceEntry","z","Trace","DistancePenalty","LabelType","LabelTypeFull","deriveLabels","values","specExtractor","ops","importances","numberOfRecordsWithType","enrichedRecords","spec","label","_a","traceStr","_b","trace","labelEntry","fullTrace","occurences","i","typeName","importance","occurenceIndex","fullType","mainTypes","secondaryTypes","allTypeRecords","i1","i2","calculate","includedTypes","r","labelSet","fm","sep","additinalType","currentSet","candidateResult","ResultPool","ref","predicate","filtered","o","mapValueInVOE","f","data","ensurePColumn","isPColumnSpec","out","oth","matchDomain","qAx","tAx","query","RenderCtx","axis","dataPool","column","columns","hasInlineColumns","inlineColumnsSupport","def","d","rawDef","extractAllColumns","mapPTableDef","po","blockId","PCD_PREFIX","RT_RESOURCE_MAP","RT_RESOURCE_MAP_PARTITIONED","RT_JSON_PARTITIONED","RT_BINARY_PARTITIONED","PCD_SUP_PREFIX","RT_JSON_SUPER_PARTITIONED","RT_BINARY_SUPER_PARTITIONED","populateResourceMapData","acc","resourceParser","keyPrefix","addEntriesWithNoData","isComplete","keyStr","converted","populateResult","parseResourceMap","removeIndexSuffix","getPartitionKeysList","rt","meta","keyLength","supKeyStr","getUniquePartitionKeys","list","l","PlatformaSDKVersion","isConfigLambda","cfgOrFh","downgradeCfgOrLambda","upgradeCfgOrLambda","extractConfig","initialArgs","initialUiState","inputsValid","renderingMode","sdkVersion","sections","title","code","fields","canRun","BlockModel","_renderingMode","_initialArgs","_initialUiState","_outputs","_inputsValid","_sections","_title","cfgOrRf","flags","rf","arrOrCfgOrRf","initialValue","createPlDataTable","tableState","allLabelCols","p","colId","id","domain","wid","labelColumns","col","axisId","getAxisId","labelColumn","labelAxis","labelAxisId","matchAxisId","dataDomainLen","labelDomainLen","coreColumns","secondaryColumns","createPlDataTableSheet","labels","domains","getKeysCombinations","idsLists","nextResult","resultItem","checkFullCompatibility","mainColumn","secondaryColumn","mainAxesIds","mainId","checkCompatibility","IS_VIRTUAL_COLUMN","getAdditionalColumnsForPair","secondaryAxesIds","secondaryIdsOptions","idsList","idx","getAdditionalColumns","additionalColumns","j","column1","column2","enrichColumnsWithCompatible","mainColumns","VALUE_TYPES","createPFrameForGraphs","blockColumns","upstreamColumns","columnsWithCompatibleFromUpstream","extendedColumns","PFrameImpl","request","columnId","fromPlRef","fromPlOption","CurrentSdkInfo","getRawPlatformaInstance","getEnvironmentValue"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/block_state_util.ts","../src/config/actions.ts","../src/internal.ts","../src/render/future.ts","../src/render/accessor.ts","../src/render/internal.ts","../src/render/util/label.ts","../src/render/api.ts","../src/render/util/resource_map.ts","../src/version.ts","../src/bconfig/types.ts","../src/bconfig/normalization.ts","../src/builder.ts","../src/components/PlDataTable.ts","../src/components/PFrameForGraphs.ts","../src/pframe.ts","../src/ref_util.ts","../src/sdk_info.ts","../src/raw_globals.ts","../src/env_value.ts"],"sourcesContent":["import { BlockOutputsBase, ValueOrErrors } from '@milaboratories/pl-model-common';\n\nexport class OutputError extends Error {\n constructor(\n public readonly errors: string[],\n public readonly moreErrors: boolean\n ) {\n super(`${errors.length}${moreErrors ? '+' : ''} errors, first error: ` + errors[0]);\n }\n}\n\nexport function readOutput<T>(outputValue: ValueOrErrors<T>): T {\n if (!outputValue.ok) throw new OutputError(outputValue.errors, outputValue.moreErrors);\n return outputValue.value;\n}\n\ntype ExtractValueType<V extends ValueOrErrors<unknown>> = Extract<V, { ok: true }>['value'];\ntype SimpleOutputs<Outputs extends BlockOutputsBase> = {\n [Key in keyof Outputs]: ExtractValueType<Outputs[Key]>;\n};\n\nexport function wrapOutputs<Outputs extends BlockOutputsBase>(\n outputs: Outputs\n): SimpleOutputs<Outputs> {\n return new Proxy(outputs, {\n get(target, key: string) {\n return readOutput(target[key]);\n }\n }) as SimpleOutputs<Outputs>;\n}\n","import {\n ActGetField,\n ActGetFromCtx,\n ActGetImmediate,\n ActGetResourceField,\n ActGetResourceValueAsJson,\n ActMakeObject,\n ActMapRecordValues,\n ActMapResourceFields,\n ActMapArrayValues,\n ActIsEmpty,\n ActNot,\n ActIsolate,\n ActGetBlobContentAsJson,\n ActGetBlobContentAsString,\n ActGetBlobContent,\n ActAnd,\n ActOr,\n ActMakeArray,\n ActFlatten,\n ActGetDownloadedBlobContent,\n ActGetOnDemandBlobContent,\n ActImportProgress,\n ActGetLastLogs,\n ActGetProgressLog,\n ActGetProgressLogWithInfo,\n ActGetLogHandle,\n ActExtractArchiveAndGetURL\n} from './actions_kinds';\nimport { ExtractAction, POCExtractAction, PrimitiveOrConfig, TypedConfig } from './type_engine';\nimport { Cfg } from './model';\nimport { CheckedSyncConf } from './type_util';\nimport { ArchiveFormat } from '@milaboratories/pl-model-common';\n\n//\n// Helpers\n//\n\nfunction primitiveToConfig(value: PrimitiveOrConfig): TypedConfig {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n )\n return getImmediate(value);\n else return value as TypedConfig;\n}\n\n//\n// Context\n//\n\nexport function getFromCfg<const V extends string>(variable: V): TypedConfig<ActGetFromCtx<V>> {\n return { type: 'GetFromCtx', variable } as Cfg as any;\n}\n\n//\n// Isolate\n//\n\nexport function isolate<const Config extends TypedConfig>(\n cfg: Config\n): TypedConfig<ActIsolate<ExtractAction<Config>>> {\n return {\n type: 'Isolate',\n cfg\n } as Cfg as any;\n}\n\n//\n// Well-known Context Vars\n//\n\nexport const Args = getFromCfg('$args');\nexport const It = getFromCfg('$it');\nexport const MainOutputs = getFromCfg('$prod');\nexport const StagingOutputs = getFromCfg('$staging');\nexport const UiState = getFromCfg('$ui');\n\n//\n// Json\n//\n\nexport function getImmediate<const T>(value: T): TypedConfig<ActGetImmediate<T>> {\n return { type: 'Immediate', value } as Cfg as any;\n}\n\nexport function makeObject<const T extends Record<string, PrimitiveOrConfig>>(\n template: T\n): TypedConfig<ActMakeObject<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: Record<string, TypedConfig> = {};\n for (const [k, cfg] of Object.entries(template)) normalizedTemplate[k] = primitiveToConfig(cfg);\n return {\n type: 'MakeObject',\n template: normalizedTemplate\n } as Cfg as any;\n}\n\nexport function makeArray<const T extends PrimitiveOrConfig[]>(\n ...template: T\n): TypedConfig<ActMakeArray<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: TypedConfig[] = [];\n for (const cfg of template) normalizedTemplate.push(primitiveToConfig(cfg));\n return {\n type: 'MakeArray',\n template: normalizedTemplate\n } as Cfg as any;\n}\n\nexport function getJsonField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig\n>(\n source: Source,\n field: Field\n): TypedConfig<ActGetField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetJsonField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field)\n } as Cfg as any;\n}\n\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapRecordValues',\n source,\n mapping,\n itVar\n } as Cfg as any;\n}\n\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapArrayValues',\n source,\n mapping,\n itVar\n } as Cfg as any;\n}\n\nexport function flatten<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActFlatten<ExtractAction<Source>>> {\n return {\n type: 'Flatten',\n source\n } as Cfg as any;\n}\n\n//\n// Boolean\n//\n\nexport function isEmpty<const Arg extends TypedConfig>(\n arg: Arg\n): TypedConfig<ActIsEmpty<ExtractAction<Arg>>> {\n return {\n type: 'IsEmpty',\n arg\n } as Cfg as any;\n}\n\nexport function not<const Operand extends TypedConfig>(\n operand: Operand\n): TypedConfig<ActNot<ExtractAction<Operand>>> {\n return {\n type: 'Not',\n operand\n } as Cfg as any;\n}\n\nexport function and<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2\n): TypedConfig<ActAnd<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'And',\n operand1,\n operand2\n } as Cfg as any;\n}\n\nexport function or<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2\n): TypedConfig<ActOr<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'Or',\n operand1,\n operand2\n } as Cfg as any;\n}\n\n//\n// Resources\n//\n\nexport function getResourceField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig\n>(\n source: Source,\n field: Field\n): TypedConfig<ActGetResourceField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetResourceField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field)\n } as Cfg as any;\n}\n\nexport function getResourceValueAsJson<T>() {\n return function <const Source extends PrimitiveOrConfig>(\n source: Source\n ): TypedConfig<ActGetResourceValueAsJson<POCExtractAction<Source>, T>> {\n return {\n type: 'GetResourceValueAsJson',\n source: primitiveToConfig(source)\n } as Cfg as any;\n };\n}\n\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig\n>(\n source: Source,\n mapping: Mapping\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapResourceFields',\n source,\n mapping,\n itVar\n } as Cfg as TypedConfig<\n ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>\n >;\n}\n\n//\n// Download Blobs\n//\n\nexport function getBlobContent<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContent',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\nexport function getBlobContentAsString<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetBlobContentAsString<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContentAsString',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\nexport function getBlobContentAsJson<T>() {\n return function <const Source extends TypedConfig>(\n source: Source\n ): TypedConfig<ActGetBlobContentAsJson<ExtractAction<Source>, T>> {\n return {\n type: 'GetBlobContentAsJson',\n source: primitiveToConfig(source)\n } as Cfg as any;\n };\n}\n\nexport function getDownloadedBlobContent<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetDownloadedBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetDownloadedBlobContent',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\nexport function getOnDemandBlobContent<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetOnDemandBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetOnDemandBlobContent',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\n//\n// Download Blobs to URLs\n//\n\nexport function extractArchiveAndGetURL<const Source extends TypedConfig>(\n source: Source,\n format: ArchiveFormat,\n): TypedConfig<ActExtractArchiveAndGetURL<ExtractAction<Source>>> {\n return {\n type: 'ExtractArchiveAndGetURL',\n format,\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\n//\n// Upload Blobs\n//\n\nexport function getImportProgress<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActImportProgress<ExtractAction<Source>>> {\n return {\n type: 'GetImportProgress',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n\n//\n// Logs\n//\n\nexport function getLastLogs<const Source extends TypedConfig>(\n source: Source,\n lines: number\n): TypedConfig<ActGetLastLogs<ExtractAction<Source>>> {\n return {\n type: 'GetLastLogs',\n source: primitiveToConfig(source),\n lines\n } as Cfg as any;\n}\n\nexport function getProgressLog<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string\n): TypedConfig<ActGetProgressLog<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLog',\n source: primitiveToConfig(source),\n patternToSearch\n } as Cfg as any;\n}\n\nexport function getProgressLogWithInfo<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string\n): TypedConfig<ActGetProgressLogWithInfo<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLogWithInfo',\n source: primitiveToConfig(source),\n patternToSearch\n } as Cfg as any;\n}\n\nexport function getLogHandle<const Source extends TypedConfig>(\n source: Source\n): TypedConfig<ActGetLogHandle<ExtractAction<Source>>> {\n return {\n type: 'GetLogHandle',\n source: primitiveToConfig(source)\n } as Cfg as any;\n}\n","import {} from './global';\nimport { Platforma, PlatformaFactory } from './platforma';\nimport { FutureHandle, GlobalCfgRenderCtx } from './render/internal';\n\n/** Utility code helping to identify whether the code is running in actual UI environment */\nexport function isInUI() {\n return (\n typeof globalThis.getPlatforma !== 'undefined' || typeof globalThis.platforma !== 'undefined'\n );\n}\n\n/** Utility code helping to retrieve a platforma instance form the environment */\nexport function getPlatformaInstance(config?: {sdkVersion: string}): Platforma {\n if (config && typeof globalThis.getPlatforma === 'function')\n return globalThis.getPlatforma(config);\n else if (typeof globalThis.platforma !== 'undefined') return globalThis.platforma;\n else throw new Error(\"Can't get platforma instance.\");\n}\n\nexport function tryGetCfgRenderCtx(): GlobalCfgRenderCtx | undefined {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else return undefined;\n}\n\nexport function getCfgRenderCtx(): GlobalCfgRenderCtx {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else throw new Error('Not in config rendering context');\n}\n\nexport function tryRegisterCallback(key: string, callback: (...args: any[]) => any): boolean {\n const ctx = tryGetCfgRenderCtx();\n if (ctx === undefined) return false;\n if (key in ctx.callbackRegistry) throw new Error(`Callback with key ${key} already registered.`);\n ctx.callbackRegistry[key] = callback;\n return true;\n}\n\nconst futureResolves = new Map<string, ((value: unknown) => void)[]>();\n\nexport function registerFutureAwait(handle: FutureHandle, onResolve: (value: unknown) => void) {\n if (!(handle in getCfgRenderCtx().callbackRegistry)) {\n getCfgRenderCtx().callbackRegistry[handle] = (value: unknown) => {\n for (const res of futureResolves.get(handle)!) {\n res(value);\n }\n };\n futureResolves.set(handle, []);\n }\n futureResolves.get(handle)!.push(onResolve);\n}\n","import { FutureAwait, FutureHandle } from './internal';\nimport { registerFutureAwait } from '../internal';\n\nexport class FutureRef<T = unknown> {\n private isResolved = false;\n private resolvedValue?: T;\n\n constructor(\n private readonly handle: FutureHandle,\n private readonly postProcess: (value: unknown) => T = (v) => v as T\n ) {\n registerFutureAwait(handle, (value) => {\n this.resolvedValue = postProcess(value);\n this.isResolved = true;\n });\n }\n\n public map<R>(mapping: (v: T) => R): FutureRef<R> {\n return new FutureRef<R>(this.handle, (v) => mapping(this.postProcess(v)));\n }\n\n public mapDefined<R>(mapping: (v: NonNullable<T>) => R): FutureRef<R | undefined> {\n return new FutureRef<R | undefined>(this.handle, (v) => {\n const vv = this.postProcess(v);\n return vv ? mapping(vv) : undefined;\n });\n }\n\n toJSON(): any {\n return this.isResolved\n ? this.resolvedValue\n : ({ __awaited_futures__: [this.handle] } as FutureAwait);\n }\n}\n\nexport type ExtractFutureRefType<Ref extends FutureRef> =\n Ref extends FutureRef<infer T> ? T : never;\n","import {\n AnyLogHandle,\n ImportProgress,\n LocalBlobHandleAndSize,\n PColumn,\n PObject,\n RemoteBlobHandleAndSize,\n FolderURL,\n ArchiveFormat,\n isPColumn,\n mapPObjectData,\n ProgressLogWithInfo\n} from '@milaboratories/pl-model-common';\nimport { getCfgRenderCtx } from '../internal';\nimport { FutureRef } from './future';\nimport { AccessorHandle } from './internal';\nimport { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\n\nexport function ifDef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\ntype FieldMapOps = {\n /**\n * Type of fields to iterate over.\n * (default 'Input')\n * */\n readonly fieldType?: 'Input' | 'Output' | 'Dynamic';\n /**\n * If not locked, `undefined` value will be returned. Do nothing if mapping `Dynamic` fields.\n * (default true)\n * */\n readonly requireLocked?: boolean;\n /**\n * Will skip unresolved fields.\n * (default false)\n * */\n readonly skipUnresolved?: boolean;\n};\n\n/** Represent resource tree node accessor */\nexport class TreeNodeAccessor {\n constructor(\n public readonly handle: AccessorHandle,\n public readonly resolvePath: string[],\n ) {}\n\n /** Shortcut for {@link resolveInput} */\n public resolve(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n /** Shortcut for {@link resolveInput} */\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s)\n }) satisfies FieldTraversalStep\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Output',\n ...(typeof s === 'string' ? { field: s } : s)\n }) satisfies FieldTraversalStep\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s)\n }) satisfies FieldTraversalStep\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n public resolveAny(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n }\n ]\n ): TreeNodeAccessor;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n return this.resolveWithCommon({}, ...steps);\n }\n\n public resolveWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): TreeNodeAccessor | undefined {\n const resolvePath = [\n ...this.resolvePath,\n ...steps.map((step) => typeof step === 'string' ? step : step.field),\n ];\n return ifDef(\n getCfgRenderCtx().resolveWithCommon(this.handle, commonOptions, ...steps),\n (accessor) => new TreeNodeAccessor(accessor, resolvePath),\n );\n }\n\n public get resourceType(): ResourceType {\n return getCfgRenderCtx().getResourceType(this.handle);\n }\n\n public getInputsLocked(): boolean {\n return getCfgRenderCtx().getInputsLocked(this.handle);\n }\n\n public getOutputsLocked(): boolean {\n return getCfgRenderCtx().getOutputsLocked(this.handle);\n }\n\n public getIsReadyOrError(): boolean {\n return getCfgRenderCtx().getIsReadyOrError(this.handle);\n }\n\n public getIsFinal(): boolean {\n return getCfgRenderCtx().getIsFinal(this.handle);\n }\n\n public getError(): TreeNodeAccessor | undefined {\n const resolvePath = [...this.resolvePath, 'error'];\n return ifDef(\n getCfgRenderCtx().getError(this.handle),\n (accsessor) => new TreeNodeAccessor(accsessor, resolvePath),\n );\n }\n\n public listInputFields(): string[] {\n return getCfgRenderCtx().listInputFields(this.handle);\n }\n\n public listOutputFields(): string[] {\n return getCfgRenderCtx().listOutputFields(this.handle);\n }\n\n public listDynamicFields(): string[] {\n return getCfgRenderCtx().listDynamicFields(this.handle);\n }\n\n public getKeyValueBase64(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueBase64(this.handle, key);\n }\n\n public getKeyValueAsString(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueAsString(this.handle, key);\n }\n\n public getKeyValueAsJson<T>(key: string): T {\n const content = this.getKeyValueAsString(key);\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n public getDataBase64(): string | undefined {\n return getCfgRenderCtx().getDataBase64(this.handle);\n }\n\n public getDataAsString(): string | undefined {\n return getCfgRenderCtx().getDataAsString(this.handle);\n }\n\n public getDataAsJson<T>(): T {\n const content = this.getDataAsString();\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n /**\n *\n */\n public getPColumns(\n errorOnUnknownField: boolean = false,\n prefix: string = ''\n ): PColumn<TreeNodeAccessor>[] | undefined {\n const result = this.parsePObjectCollection(errorOnUnknownField, prefix);\n if (result === undefined) return undefined;\n\n const pf = Object.entries(result).map(([, obj]) => {\n if (!isPColumn(obj)) throw new Error(`not a PColumn (kind = ${obj.spec.kind})`);\n return obj;\n });\n\n return pf;\n }\n\n /**\n *\n */\n public parsePObjectCollection(\n errorOnUnknownField: boolean = false,\n prefix: string = ''\n ): Record<string, PObject<TreeNodeAccessor>> | undefined {\n const pObjects = getCfgRenderCtx().parsePObjectCollection(\n this.handle,\n errorOnUnknownField,\n prefix,\n ...this.resolvePath,\n );\n if (pObjects === undefined) return undefined;\n const result: Record<string, PObject<TreeNodeAccessor>> = {};\n for (const [key, value] of Object.entries(pObjects)) {\n const resolvePath = [...this.resolvePath, key];\n result[key] = mapPObjectData(value, (c) => new TreeNodeAccessor(c, resolvePath));\n }\n return result;\n }\n\n public getFileContentAsBase64(): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsBase64(this.handle));\n }\n\n public getFileContentAsString(): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsString(this.handle));\n }\n\n public getFileContentAsJson<T>(): FutureRef<T | undefined> {\n return new FutureRef<string | undefined>(\n getCfgRenderCtx().getBlobContentAsString(this.handle)\n ).mapDefined((v) => JSON.parse(v) as T);\n }\n\n /**\n * @deprecated use getFileContentAsBase64\n */\n public getBlobContentAsBase64(): FutureRef<string | undefined> {\n return this.getFileContentAsBase64();\n }\n\n /**\n * @deprecated use getFileContentAsString\n */\n public getBlobContentAsString(): FutureRef<string | undefined> {\n return this.getFileContentAsString();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getFileHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getDownloadedBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getFileHandle\n */\n public getDownloadedBlobHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return this.getFileHandle();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getRemoteFileHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getOnDemandBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getRemoteFileHandle\n */\n public getOnDemandBlobHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return this.getRemoteFileHandle();\n }\n\n /**\n * @returns the url to the extracted folder\n */\n public extractArchiveAndGetURL(format: ArchiveFormat): FutureRef<FolderURL | undefined> {\n return new FutureRef(getCfgRenderCtx().extractArchiveAndGetURL(this.handle, format));\n }\n\n public getImportProgress(): FutureRef<ImportProgress> {\n return new FutureRef(getCfgRenderCtx().getImportProgress(this.handle));\n }\n\n public getLastLogs(nLines: number): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getLastLogs(this.handle, nLines));\n }\n\n public getProgressLog(patternToSearch: string): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLog(this.handle, patternToSearch));\n }\n\n public getProgressLogWithInfo(patternToSearch: string): FutureRef<ProgressLogWithInfo | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLogWithInfo(this.handle, patternToSearch));\n }\n\n public getLogHandle(): FutureRef<AnyLogHandle | undefined> {\n return new FutureRef(getCfgRenderCtx().getLogHandle(this.handle));\n }\n\n public allFieldsResolved(fieldType: 'Input' | 'Output' = 'Input'): boolean {\n switch (fieldType) {\n case 'Input':\n return (\n this.getInputsLocked() &&\n this.listInputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Input' }) !== undefined\n )\n );\n case 'Output':\n return (\n this.getOutputsLocked() &&\n this.listOutputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Output' }) !== undefined\n )\n );\n }\n }\n\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops: FieldMapOps & { skipUnresolved: true }\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor | undefined) => T,\n _ops?: FieldMapOps\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops?: FieldMapOps\n ): T[] | undefined {\n const { fieldType, requireLocked, skipUnresolved } = {\n fieldType: 'Input' as const,\n requireLocked: true,\n skipUnresolved: false,\n ..._ops\n };\n const mapping = _mapping as (name: string, value: TreeNodeAccessor | undefined) => T;\n if (requireLocked) {\n if (fieldType === 'Input' && !this.getInputsLocked()) return undefined;\n if (fieldType === 'Output' && !this.getOutputsLocked()) return undefined;\n }\n const fieldList =\n fieldType === 'Input'\n ? this.listInputFields()\n : fieldType === 'Output'\n ? this.listOutputFields()\n : this.listDynamicFields();\n let fieldEntries = fieldList.map(\n (field) => [field, this.resolve({ field, assertFieldType: fieldType })] as const\n );\n if (skipUnresolved) fieldEntries = fieldEntries.filter((e) => e[1] !== undefined);\n return fieldEntries.map(([name, value]) => mapping(name, value));\n }\n}\n","import { Optional } from 'utility-types';\nimport { Branded } from '../branding';\nimport { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\nimport {\n ArchiveFormat,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n Ref,\n ResultCollection,\n ValueOrError\n} 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 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): FHandle; // string | undefined\n\n getBlobContentAsString(handle: AHandle): 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, string>>, '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<AHandle | PColumnValues>): PFrameHandle;\n\n createPTable(def: PTableDef<PColumn<AHandle | PColumnValues>>): PTableHandle;\n\n //\n // Computable\n //\n\n getCurrentUnstableMarker(): string | undefined;\n}\n\nexport const GlobalCfgRenderCtxFeatureFlags = {\n inlineColumnsSupport: true as const,\n activeArgs: true as const\n};\n\nexport interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods {\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 args: string;\n readonly uiState: string;\n readonly activeArgs?: string;\n readonly callbackRegistry: Record<string, Function>;\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","import { PObjectSpec } from '@milaboratories/pl-model-common';\nimport { z } from 'zod';\n\nexport const PAnnotationLabel = 'pl7.app/label';\nexport const PAnnotationTrace = 'pl7.app/trace';\n\nexport type RecordsWithLabel<T> = {\n value: T;\n label: string;\n};\n\nexport type LabelDerivationOps = {\n /** Force inclusion of native column label */\n includeNativeLabel?: boolean;\n /** Separator to use between label parts (\" / \" by default) */\n separator?: string;\n /** If true, label will be added as suffix (at the end of the generated label). By default label added as a prefix. */\n addLabelAsSuffix?: boolean;\n};\n\nexport const TraceEntry = z.object({\n type: z.string(),\n importance: z.number().optional(),\n id: z.string().optional(),\n label: z.string()\n});\nexport type TraceEntry = z.infer<typeof TraceEntry>;\ntype FullTraceEntry = TraceEntry & { fullType: string; occurenceIndex: number };\n\nexport const Trace = z.array(TraceEntry);\nexport type Trace = z.infer<typeof Trace>;\ntype FullTrace = FullTraceEntry[];\n\nconst DistancePenalty = 0.001;\n\nconst LabelType = '__LABEL__';\nconst LabelTypeFull = '__LABEL__@1';\n\nexport function deriveLabels<T>(\n values: T[],\n specExtractor: (obj: T) => PObjectSpec,\n ops: LabelDerivationOps = {}\n): RecordsWithLabel<T>[] {\n const importances = new Map<string, number>();\n\n // number of times certain type occured among all of the\n const numberOfRecordsWithType = new Map<string, number>();\n\n const enrichedRecords = values.map((value) => {\n const spec = specExtractor(value);\n const label = spec.annotations?.[PAnnotationLabel];\n const traceStr = spec.annotations?.[PAnnotationTrace];\n const trace = (traceStr ? Trace.safeParse(JSON.parse(traceStr)).data : undefined) ?? [];\n\n if (label) {\n const labelEntry = { label, type: LabelType, importance: -2 };\n if (ops.addLabelAsSuffix) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n\n const fullTrace: FullTrace = [];\n\n const occurences = new Map<string, number>();\n for (let i = trace.length - 1; i >= 0; --i) {\n const { type: typeName } = trace[i];\n const importance = trace[i].importance ?? 0;\n const occurenceIndex = (occurences.get(typeName) ?? 0) + 1;\n occurences.set(typeName, occurenceIndex);\n const fullType = `${typeName}@${occurenceIndex}`;\n numberOfRecordsWithType.set(fullType, (numberOfRecordsWithType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(\n importances.get(fullType) ?? Number.NEGATIVE_INFINITY,\n importance - (trace.length - i) * DistancePenalty\n )\n );\n fullTrace.push({ ...trace[i], fullType, occurenceIndex });\n }\n fullTrace.reverse();\n return {\n value,\n spec,\n label,\n fullTrace\n };\n });\n\n // excluding repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const mainTypes: string[] = [];\n // repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const secondaryTypes: string[] = [];\n\n const allTypeRecords = [...importances];\n // sorting: most important types go first\n allTypeRecords.sort(([, i1], [, i2]) => i2 - i1);\n\n for (const [typeName] of allTypeRecords) {\n if (typeName.endsWith('@1') || numberOfRecordsWithType.get(typeName) === values.length)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n const calculate = (includedTypes: Set<string>) =>\n enrichedRecords.map((r) => {\n const labelSet = r.fullTrace\n .filter((fm) => includedTypes.has(fm.fullType))\n .map((fm) => fm.label);\n const sep = ops.separator ?? ' / ';\n return {\n label: labelSet.join(sep),\n value: r.value\n } satisfies RecordsWithLabel<T>;\n });\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0) throw new Error('Assertion error.');\n return calculate(new Set(LabelTypeFull));\n }\n\n //\n // includedTypes = 2\n // * *\n // T0 T1 T2 T3 T4 T5\n // *\n // additinalType = 3\n //\n // Resulting set: T0, T1, T3\n //\n let includedTypes = 0;\n let additinalType = 0;\n while (includedTypes < mainTypes.length) {\n const currentSet = new Set<string>();\n if (ops.includeNativeLabel) currentSet.add(LabelTypeFull);\n for (let i = 0; i < includedTypes; ++i) currentSet.add(mainTypes[i]);\n currentSet.add(mainTypes[additinalType]);\n\n const candidateResult = calculate(currentSet);\n\n // checking if labels uniquely separate our records\n if (new Set(candidateResult.map((c) => c.label)).size === values.length) return candidateResult;\n\n additinalType++;\n if (additinalType == mainTypes.length) {\n includedTypes++;\n additinalType = includedTypes;\n }\n }\n\n return calculate(new Set([...mainTypes, ...secondaryTypes]));\n}\n","import type {\n APColumnSelector,\n AxisId,\n Option,\n PColumn,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResultCollection,\n ValueOrError } from '@milaboratories/pl-model-common';\nimport {\n AnchorIdDeriver,\n resolveAnchors } from '@milaboratories/pl-model-common';\nimport {\n ensurePColumn,\n extractAllColumns,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE,\n selectorsToPredicate,\n} from '@milaboratories/pl-model-common';\nimport type { Optional } from 'utility-types';\nimport { getCfgRenderCtx } from '../internal';\nimport { TreeNodeAccessor, ifDef } from './accessor';\nimport type { FutureRef } from './future';\nimport type { GlobalCfgRenderCtx } from './internal';\nimport { MainAccessorName, StagingAccessorName } from './internal';\nimport type { LabelDerivationOps } from './util/label';\nimport { deriveLabels } from './util/label';\n\nexport class ResultPool {\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 private defaultLabelFn = (spec: PObjectSpec, ref: PlRef) =>\n spec.annotations?.['pl7.app/label'] ?? `Unlabelled`;\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate = typeof predicateOrSelector === 'function'\n ? predicateOrSelector\n : selectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n if (typeof label === 'object' || typeof label === 'undefined') {\n return deriveLabels(filtered, (o) => o.obj, label ?? {}).map(({ value: { ref }, label }) => ({\n ref,\n label,\n }));\n } else\n return filtered.map((s) => ({\n ref: s.ref,\n label: label(s.obj, s.ref),\n }));\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate.\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 predicateOrSelector - 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 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 * @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 // Overload for AnchorCtx - guaranteed to never return undefined\n getAnchoredOptions(\n anchorsOrCtx: AnchorIdDeriver,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],\n labelOps?: LabelDerivationOps,\n ): { label: string; value: string }[];\n\n // Overload for Record<string, PColumnSpec> - guaranteed to never return undefined\n getAnchoredOptions(\n anchorsOrCtx: Record<string, PColumnSpec>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],\n labelOps?: LabelDerivationOps,\n ): { label: string; value: string }[];\n\n // Overload for Record<string, PColumnSpec | PlRef> - may return undefined if PlRef resolution fails\n getAnchoredOptions(\n anchorsOrCtx: Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],\n labelOps?: LabelDerivationOps,\n ): { label: string; value: string }[] | undefined;\n\n // Implementation\n getAnchoredOptions(\n anchorsOrCtx: AnchorIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],\n labelOps?: LabelDerivationOps,\n ): { label: string; value: string }[] | undefined {\n // Handle PlRef objects by resolving them to PColumnSpec\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n\n if (!(anchorsOrCtx instanceof AnchorIdDeriver)) {\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec)\n return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n // It's already a PColumnSpec\n resolvedAnchors[key] = value as PColumnSpec;\n }\n }\n }\n\n const predicate = typeof predicateOrSelectors === 'function'\n ? predicateOrSelectors\n : selectorsToPredicate(Array.isArray(predicateOrSelectors)\n ? predicateOrSelectors.map((selector) => resolveAnchors(resolvedAnchors, selector))\n : resolveAnchors(resolvedAnchors, predicateOrSelectors),\n );\n\n const filtered = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n const anchorIdDeriver = anchorsOrCtx instanceof AnchorIdDeriver\n ? anchorsOrCtx\n : new AnchorIdDeriver(resolvedAnchors);\n\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(({ value: { obj: spec }, label }) => ({\n value: anchorIdDeriver.deriveString(spec as PColumnSpec)!,\n 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, string>>, 'id'>\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, string>>, '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 return mapPObjectData(\n this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name),\n (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]),\n );\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 as PColumnSpec;\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 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 }\n\n result.push(data.obj);\n }\n return result;\n }\n}\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\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport class RenderCtx<Args, UiState> {\n private readonly ctx: GlobalCfgRenderCtx;\n\n public readonly args: Args;\n public readonly uiState: UiState;\n\n constructor() {\n this.ctx = getCfgRenderCtx();\n this.args = JSON.parse(this.ctx.args);\n this.uiState = this.ctx.uiState !== undefined ? JSON.parse(this.ctx.uiState) : {};\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 this._activeArgsCache = {\n v: this.ctx.activeArgs ? JSON.parse(this.ctx.activeArgs) : undefined,\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 */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.resultPool.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 === 'pl7.app/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 ) {\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 private verifyInlineColumnsSupport(columns: PColumn<TreeNodeAccessor | PColumnValues>[]) {\n const hasInlineColumns = columns.some((c) => !(c.data instanceof TreeNodeAccessor));\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport) throw Error(`inline columns not supported`);\n }\n\n public createPFrame(def: PFrameDef<TreeNodeAccessor | PColumnValues>): PFrameHandle {\n this.verifyInlineColumnsSupport(def);\n return this.ctx.createPFrame(\n def.map((c) => mapPObjectData(c, (d) => (d instanceof TreeNodeAccessor ? d.handle : d))),\n );\n }\n\n public createPTable(def: PTableDef<PColumn<TreeNodeAccessor | PColumnValues>>): PTableHandle;\n public createPTable(def: {\n columns: PColumn<TreeNodeAccessor | PColumnValues>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle;\n public createPTable(\n def:\n | PTableDef<PColumn<TreeNodeAccessor | PColumnValues>>\n | {\n columns: PColumn<TreeNodeAccessor | PColumnValues>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle {\n let rawDef: PTableDef<PColumn<TreeNodeAccessor | PColumnValues>>;\n if ('columns' in def) {\n rawDef = {\n src: {\n type: 'full',\n entries: def.columns.map((c) => ({ type: 'column', column: c })),\n },\n filters: def.filters ?? [],\n sorting: def.sorting ?? [],\n };\n } else {\n rawDef = def;\n }\n this.verifyInlineColumnsSupport(extractAllColumns(rawDef.src));\n return this.ctx.createPTable(\n mapPTableDef(rawDef, (po) =>\n mapPObjectData(po, (d) => (d instanceof TreeNodeAccessor ? d.handle : d)),\n ),\n );\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 // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getCurrentUnstableMarker === 'undefined') return undefined;\n return this.ctx.getCurrentUnstableMarker();\n }\n}\n\nexport type RenderFunction<Args = unknown, UiState = unknown, Ret = unknown> = (\n rCtx: RenderCtx<Args, UiState>\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 Function> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n","import { TreeNodeAccessor } from '../accessor';\n\nconst PCD_PREFIX = 'PColumnData/';\n\nexport const RT_RESOURCE_MAP = PCD_PREFIX + 'ResourceMap';\nexport const RT_RESOURCE_MAP_PARTITIONED = PCD_PREFIX + 'Partitioned/ResourceMap';\n\nexport const RT_JSON_PARTITIONED = PCD_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_PARTITIONED = PCD_PREFIX + 'BinaryPartitioned';\n\nconst PCD_SUP_PREFIX = PCD_PREFIX + 'Partitioned/';\nexport const RT_JSON_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'BinaryPartitioned';\n\nexport type PColumnKey = (string | number)[];\n\nexport type PColumnResourceMapEntry<T> = {\n key: PColumnKey;\n value: T;\n};\n\nexport type PColumnResourceMapData<T> = {\n isComplete: boolean;\n data: PColumnResourceMapEntry<T>[];\n};\n\nfunction populateResourceMapData<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n data: PColumnResourceMapEntry<T | undefined>[],\n keyPrefix: PColumnKey = [],\n addEntriesWithNoData: boolean\n): boolean {\n if (acc === undefined) return false;\n switch (acc.resourceType.name) {\n case RT_RESOURCE_MAP: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const converted = value === undefined ? undefined : resourceParser(value);\n if (converted === undefined) isComplete = false;\n if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });\n }\n return isComplete;\n }\n case RT_RESOURCE_MAP_PARTITIONED: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) isComplete = false;\n else {\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const populateResult = populateResourceMapData(\n value,\n resourceParser,\n data,\n key,\n addEntriesWithNoData\n );\n isComplete = isComplete && populateResult;\n }\n }\n return isComplete;\n }\n default:\n throw new Error(`Unknown resource type: ${acc.resourceType.name}`);\n }\n}\n\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: false\n): PColumnResourceMapData<NonNullable<T>>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: true\n): PColumnResourceMapData<T | undefined>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: boolean = false\n): PColumnResourceMapData<T | undefined> {\n const data: PColumnResourceMapEntry<T | undefined>[] = [];\n const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);\n return { isComplete, data };\n}\n\n\nexport type PColumnKeyList = {\n /** array of keys */\n data: PColumnKey[];\n /** length of partition key */\n keyLength: number;\n};\n\nconst removeIndexSuffix = (keyStr: string): string | undefined => {\n if (keyStr.endsWith('.index')) {\n return undefined;\n } else if (keyStr.endsWith('.values')) {\n return keyStr.substring(0, keyStr.length - 7);\n } else {\n throw Error(`key must ends on .index/.values for binary p-column, got: ${keyStr}`);\n }\n};\n\n// @TODO define a class with various resource map operations\n/** Returns a list of all partition keys appeared in the p-column */\nexport function getPartitionKeysList(\n acc: TreeNodeAccessor | undefined\n): PColumnKeyList | undefined {\n if (!acc) return undefined;\n\n const rt = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n const data: PColumnKey[] = [];\n\n let keyLength = 0;\n // @TODO validate meta shape\n switch (rt) {\n case RT_RESOURCE_MAP:\n keyLength = meta['keyLength'];\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n keyLength = meta['partitionKeyLength'] + meta['keyLength'];\n break;\n\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n keyLength = meta['partitionKeyLength'];\n break;\n\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n keyLength = meta['superPartitionKeyLength'] + meta['partitionKeyLength'];\n break;\n }\n\n switch (rt) {\n case RT_RESOURCE_MAP:\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n for (let keyStr of acc.listInputFields()) {\n if (rt === RT_BINARY_PARTITIONED) {\n const k = removeIndexSuffix(keyStr);\n if (!k) continue;\n else keyStr = k;\n }\n const key = [...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n for (const supKeyStr of acc.listInputFields()) {\n const keyPrefix = [...JSON.parse(supKeyStr)] as PColumnKey;\n\n const value = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (value !== undefined) {\n for (let keyStr of value.listInputFields()) {\n if (rt === RT_BINARY_SUPER_PARTITIONED) {\n const k = removeIndexSuffix(keyStr);\n if (!k) continue;\n else keyStr = k;\n }\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n }\n }\n break;\n }\n\n return { data, keyLength };\n}\n\n/** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */\n// @TODO define a class with various resource map operations\nexport function getUniquePartitionKeys(\n acc: TreeNodeAccessor | undefined\n): (string | number)[][] | undefined {\n const list = getPartitionKeysList(acc);\n if (!list) return undefined;\n\n const { data, keyLength } = list;\n\n const result: Set<string | number>[] = [];\n\n for (let i = 0; i < keyLength; ++i) {\n result.push(new Set());\n }\n\n for (const l of data) {\n if (l.length !== keyLength) {\n throw new Error('key length does not match partition length');\n }\n for (let i = 0; i < keyLength; ++i) {\n result[i].add(l[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n","export const PlatformaSDKVersion = '1.23.0';\n","import { TypedConfig } from '../config';\nimport { ConfigRenderLambda } from './lambdas';\n\nexport type Code = {\n type: 'plain';\n content: string;\n};\n\nexport function isConfigLambda(\n cfgOrFh: TypedConfigOrConfigLambda\n): cfgOrFh is ConfigRenderLambda {\n return (cfgOrFh as any).__renderLambda === true;\n}\n\nexport type TypedConfigOrConfigLambda = TypedConfig | ConfigRenderLambda;\n\n/** @deprecated */\nexport type TypedConfigOrString = TypedConfig | string;\n","import { BlockConfigContainer } from './container';\nimport { isConfigLambda, TypedConfigOrConfigLambda, TypedConfigOrString } from './types';\nimport { BlockConfig } from './v3';\n\nexport function downgradeCfgOrLambda(data: TypedConfigOrConfigLambda): TypedConfigOrString;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined\n): TypedConfigOrString | undefined;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined\n): TypedConfigOrString | undefined {\n if (data === undefined) return undefined;\n if (isConfigLambda(data)) return data.handle;\n return data;\n}\n\nfunction upgradeCfgOrLambda(data: TypedConfigOrString): TypedConfigOrConfigLambda;\nfunction upgradeCfgOrLambda(\n data: TypedConfigOrString | undefined\n): TypedConfigOrConfigLambda | undefined;\nfunction upgradeCfgOrLambda(\n data: TypedConfigOrString | undefined\n): TypedConfigOrConfigLambda | undefined {\n if (data === undefined) return undefined;\n if (typeof data === 'string') return { __renderLambda: true, handle: data, retentive: false };\n return data;\n}\n\n/**\n * Takes universal config, and converts it into latest config structure.\n *\n * **Important**: This operation is not meant to be executed recusively.\n * In no circumstance result of this function should be persisted!\n * */\nexport function extractConfig(cfg: BlockConfigContainer): BlockConfig {\n if (cfg.v3 !== undefined) {\n // version 3\n const {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n sections,\n title\n } = cfg.v3;\n const { code } = cfg;\n return {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n sections,\n title,\n code\n };\n } else if (cfg.inputsValid !== undefined) {\n // version 2\n const { sdkVersion, renderingMode, outputs, inputsValid, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n sdkVersion === undefined ||\n renderingMode === undefined ||\n outputs === undefined ||\n inputsValid === undefined ||\n sections === undefined ||\n initialArgs === undefined\n )\n throw new Error(\n `Malformed config v2. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`\n );\n return {\n sdkVersion,\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)])\n ),\n inputsValid: upgradeCfgOrLambda(inputsValid),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code\n };\n } else if (cfg.renderingMode !== undefined) {\n // version 1\n const { sdkVersion, canRun, renderingMode, outputs, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n renderingMode === undefined ||\n outputs === undefined ||\n canRun === undefined ||\n sections === undefined ||\n initialArgs === undefined\n )\n throw new Error(\n `Malformed config v1. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`\n );\n return {\n sdkVersion: sdkVersion ?? 'unknown',\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)])\n ),\n inputsValid: upgradeCfgOrLambda(canRun),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code\n };\n } else {\n const { sdkVersion } = cfg;\n const fields = Object.keys(cfg);\n throw new Error(\n `Config format not supported: SDK = ${sdkVersion}; Fields = ${fields.join(', ')}`\n );\n }\n}\n","import { BlockRenderingMode, BlockSection, ValueOrErrors } from '@milaboratories/pl-model-common';\nimport { Checked, ConfigResult, getImmediate, PlResourceEntry, TypedConfig } from './config';\nimport { getPlatformaInstance, isInUI, tryRegisterCallback } from './internal';\nimport { Platforma } from './platforma';\nimport { InferRenderFunctionReturn, RenderCtx, RenderFunction } from './render';\nimport { PlatformaSDKVersion } from './version';\nimport {\n TypedConfigOrConfigLambda,\n ConfigRenderLambda,\n StdCtxArgsOnly,\n DeriveHref,\n ResolveCfgType,\n ExtractFunctionHandleReturn,\n BlockConfigContainer,\n downgradeCfgOrLambda,\n ConfigRenderLambdaFlags\n} from './bconfig';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype SectionsCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends SectionsExpectedType ? true : false\n>;\n\ntype SectionsRFChecked<RF extends Function> = Checked<\n RF,\n InferRenderFunctionReturn<RF> extends SectionsExpectedType ? true : false\n>;\n\ntype InputsValidExpectedType = boolean;\n\ntype InputsValidCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends InputsValidExpectedType ? true : false\n>;\n\ntype InputsValidRFChecked<RF extends Function> = Checked<\n RF,\n InferRenderFunctionReturn<RF> extends InputsValidExpectedType ? true : false\n>;\n\ntype NoOb = Record<string, never>;\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module. */\nexport class BlockModel<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n Href extends `/${string}` = '/'\n> {\n private constructor(\n private readonly _renderingMode: BlockRenderingMode,\n private readonly _initialArgs: Args | undefined,\n private readonly _initialUiState: UiState,\n private readonly _outputs: OutputsCfg,\n private readonly _inputsValid: TypedConfigOrConfigLambda,\n private readonly _sections: TypedConfigOrConfigLambda,\n private readonly _title: ConfigRenderLambda | undefined\n ) {}\n\n /** Initiates configuration builder */\n public static create(renderingMode: BlockRenderingMode): BlockModel<NoOb, {}, NoOb>;\n /** Initiates configuration builder */\n public static create(): BlockModel<NoOb, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(renderingMode: BlockRenderingMode): BlockModel<Args, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(): BlockModel<Args, {}, NoOb>;\n public static create(renderingMode: BlockRenderingMode = 'Heavy'): BlockModel<NoOb, {}, NoOb> {\n return new BlockModel<NoOb, {}, NoOb>(\n renderingMode,\n undefined,\n {},\n {},\n getImmediate(true),\n getImmediate([]),\n undefined\n );\n }\n\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param cfg configuration describing how to render cell value from the blocks\n * workflow outputs\n * @deprecated use lambda-based API\n * */\n public output<const Key extends string, const Cfg extends TypedConfig>(\n key: Key,\n cfg: Cfg\n ): BlockModel<Args, OutputsCfg & { [K in Key]: Cfg }, UiState, Href>;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: TypedConfig | Function,\n flags: ConfigRenderLambdaFlags = {}\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n if (typeof cfgOrRf === 'function') {\n const handle = `output#${key}`;\n tryRegisterCallback(handle, () => cfgOrRf(new RenderCtx()));\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: {\n __renderLambda: true,\n handle,\n ...flags\n } satisfies ConfigRenderLambda\n },\n this._inputsValid,\n this._sections,\n this._title\n );\n } else\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: cfgOrRf\n },\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Sets custom configuration predicate on the block args at which block can be executed\n * @deprecated use lambda-based API */\n public argsValid<Cfg extends TypedConfig>(\n cfg: Cfg & InputsValidCfgChecked<Cfg, Args, UiState>\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n /** Sets custom configuration predicate on the block args at which block can be executed */\n public argsValid<RF extends RenderFunction<Args, UiState, boolean>>(\n rf: RF\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n public argsValid(\n cfgOrRf: TypedConfig | Function\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (typeof cfgOrRf === 'function') {\n tryRegisterCallback('inputsValid', () => cfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n {\n __renderLambda: true,\n handle: 'inputsValid'\n } satisfies ConfigRenderLambda,\n this._sections,\n this._title\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n cfgOrRf,\n this._sections,\n this._title\n );\n }\n\n /** Sets the config to generate list of section in the left block overviews panel\n * @deprecated use lambda-based API */\n public sections<const S extends SectionsExpectedType>(\n rf: S\n ): BlockModel<Args, OutputsCfg, UiState, DeriveHref<S>>;\n /** Sets the config to generate list of section in the left block overviews panel */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, UiState, Ret>\n >(rf: RF): BlockModel<Args, OutputsCfg, UiState, DeriveHref<ReturnType<RF>>>;\n public sections<const Cfg extends TypedConfig>(\n cfg: Cfg & SectionsCfgChecked<Cfg, Args, UiState>\n ): BlockModel<\n Args,\n OutputsCfg,\n UiState,\n DeriveHref<ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>>>\n >;\n public sections(\n arrOrCfgOrRf: SectionsExpectedType | TypedConfig | Function\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (Array.isArray(arrOrCfgOrRf)) {\n return this.sections(getImmediate(arrOrCfgOrRf));\n } else if (typeof arrOrCfgOrRf === 'function') {\n tryRegisterCallback('sections', () => arrOrCfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n { __renderLambda: true, handle: 'sections' } as ConfigRenderLambda,\n this._title\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n arrOrCfgOrRf as TypedConfig,\n this._title\n );\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, UiState, string>\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback('title', () => rf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n { __renderLambda: true, handle: 'title' } as ConfigRenderLambda\n );\n }\n\n /**\n * Sets initial args for the block, this value must be specified.\n * @deprecated use {@link withArgs}\n * */\n public initialArgs(value: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n value,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Sets initial args for the block, this value must be specified. */\n public withArgs<Args>(initialValue: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n initialValue,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Defines type and sets initial value for block UiState. */\n public withUiState<UiState>(initialValue: UiState): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n initialValue,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title\n );\n }\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block state, and\n * other features provided by the platforma to the block. */\n public done(): Platforma<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n > {\n if (this._initialArgs === undefined) throw new Error('Initial arguments not set.');\n\n const config: BlockConfigContainer = {\n v3: {\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n initialUiState: this._initialUiState,\n inputsValid: this._inputsValid,\n sections: this._sections,\n title: this._title,\n outputs: this._outputs\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n inputsValid: downgradeCfgOrLambda(this._inputsValid),\n sections: downgradeCfgOrLambda(this._sections),\n outputs: Object.fromEntries(\n Object.entries(this._outputs).map(([key, value]) => [key, downgradeCfgOrLambda(value)])\n )\n };\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config } as any;\n // normal operation inside the UI\n else return getPlatformaInstance({ sdkVersion: PlatformaSDKVersion }) as any;\n }\n}\n\nexport type InferOutputType<CfgOrFH, Args, UiState> = CfgOrFH extends TypedConfig\n ? ResolveCfgType<CfgOrFH, Args, UiState>\n : CfgOrFH extends ConfigRenderLambda\n ? ExtractFunctionHandleReturn<CfgOrFH>\n : never;\n\ntype InferOutputsFromConfigs<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState\n> = {\n [Key in keyof OutputsCfg]: ValueOrErrors<InferOutputType<OutputsCfg[Key], Args, UiState>>;\n};\n","import {\n AxisSpec,\n getAxisId,\n isPColumn,\n JoinEntry,\n matchAxisId,\n PColumn,\n PColumnIdAndSpec,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting\n} from '@milaboratories/pl-model-common';\nimport { RenderCtx, TreeNodeAccessor } from '../render';\n\n/** Data table state */\nexport type PlDataTableGridState = {\n /** Includes column ordering */\n columnOrder?: {\n /** All colIds in order */\n orderedColIds: string[];\n };\n /** Includes current sort columns and direction */\n sort?: {\n /** Sorted columns and directions in order */\n sortModel: {\n /** Column Id to apply the sort to. */\n colId: string;\n /** Sort direction */\n sort: 'asc' | 'desc';\n }[];\n };\n /** Includes column visibility */\n columnVisibility?: {\n /** All colIds which were hidden */\n hiddenColIds: string[];\n };\n\n /** current sheet selections */\n sheets?: Record<string, string | number>;\n};\n\nexport type PlDataTableSheet = {\n /** spec of the axis to use */\n axis: AxisSpec;\n /** options to show in the filter tan */\n options: {\n /** value of the option (should be one of the values in the axis or column) */\n value: string | number;\n /** corresponding label */\n label: string;\n }[];\n /** default (selected) value */\n defaultValue?: string | number;\n};\n\n/**\n * Params used to get p-table handle from the driver\n */\nexport type PTableParams = {\n /** For sourceType: 'pframe' the join is original one, enriched with label columns */\n join?: JoinEntry<PColumnIdAndSpec>;\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n};\n\n/**\n * PlDataTable persisted state\n */\nexport type PlDataTableState = {\n // internal ag-grid state\n gridState: PlDataTableGridState;\n // mapping of gridState onto the p-table data structures\n pTableParams?: PTableParams;\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNotNA = {\n /** Predicate type */\n type: 'isNotNA';\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNA = {\n /** Predicate type */\n type: 'isNA';\n};\n\n/** PlTableFilters filter entries applicable to both string and number values */\nexport type PlTableFilterCommon = PlTableFilterIsNotNA | PlTableFilterIsNA;\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberEquals = {\n /** Predicate type */\n type: 'number_equals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberNotEquals = {\n /** Predicate type */\n type: 'number_notEquals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThan = {\n /** Predicate type */\n type: 'number_greaterThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThanOrEqualTo = {\n /** Predicate type */\n type: 'number_greaterThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThan = {\n /** Predicate type */\n type: 'number_lessThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThanOrEqualTo = {\n /** Predicate type */\n type: 'number_lessThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberBetween = {\n /** Predicate type */\n type: 'number_between';\n /** Referense value for the lower bound */\n lowerBound: number;\n /** Defines whether values equal to lower bound reference value should be matched */\n includeLowerBound: boolean;\n /** Referense value for the upper bound */\n upperBound: number;\n /** Defines whether values equal to upper bound reference value should be matched */\n includeUpperBound: boolean;\n};\n\n/** All PlTableFilters numeric filter entries */\nexport type PlTableFilterNumber =\n | PlTableFilterCommon\n | PlTableFilterNumberEquals\n | PlTableFilterNumberNotEquals\n | PlTableFilterNumberGreaterThan\n | PlTableFilterNumberGreaterThanOrEqualTo\n | PlTableFilterNumberLessThan\n | PlTableFilterNumberLessThanOrEqualTo\n | PlTableFilterNumberBetween;\n/** All types of PlTableFilters numeric filter entries */\nexport type PlTableFilterNumberType = PlTableFilterNumber['type'];\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringEquals = {\n /** Predicate type */\n type: 'string_equals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringNotEquals = {\n /** Predicate type */\n type: 'string_notEquals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContains = {\n /** Predicate type */\n type: 'string_contains';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotContain = {\n /** Predicate type */\n type: 'string_doesNotContain';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringMatches = {\n /** Predicate type */\n type: 'string_matches';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotMatch = {\n /** Predicate type */\n type: 'string_doesNotMatch';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContainsFuzzyMatch = {\n /** Predicate type */\n type: 'string_containsFuzzyMatch';\n /** Referense value */\n reference: string;\n /**\n * Maximum acceptable edit distance between reference value and matched substring\n * @see https://en.wikipedia.org/wiki/Edit_distance\n */\n maxEdits: number;\n /**\n * When {@link substitutionsOnly} is set to false\n * Levenshtein distance is used as edit distance (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used as edit distance (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n substitutionsOnly: boolean;\n /**\n * Single character in {@link reference} that will labelColumn any\n * single character in searched text.\n */\n wildcard?: string;\n};\n\n/** All PlTableFilters string filter entries */\nexport type PlTableFilterString =\n | PlTableFilterCommon\n | PlTableFilterStringEquals\n | PlTableFilterStringNotEquals\n | PlTableFilterStringContains\n | PlTableFilterStringDoesNotContain\n | PlTableFilterStringMatches\n | PlTableFilterStringDoesNotMatch\n | PlTableFilterStringContainsFuzzyMatch;\n/** All types of PlTableFilters string filter entries */\nexport type PlTableFilterStringType = PlTableFilterString['type'];\n\n/** All PlTableFilters filter entries */\nexport type PlTableFilter = PlTableFilterNumber | PlTableFilterString;\n/** All types of PlTableFilters filter entries */\nexport type PlTableFilterType = PlTableFilter['type'];\n\n/** Internal grid column identifier */\nexport type PlTableFilterColumnId = string;\n\n/** PlTableFiltersState entry */\nexport type PlTableFiltersStateEntry = {\n /** Column identifier */\n columnId: PlTableFilterColumnId;\n /** Active filter */\n filter: PlTableFilter;\n /** Flag to temporarily disable filter */\n disabled: boolean;\n};\n\n/** PlTableFiltersModel state */\nexport type PlTableFiltersState = PlTableFiltersStateEntry[];\n\n/** PlTableFilters model */\nexport type PlTableFiltersModel = {\n /** Internal PlTableFilters component state, do not change! */\n state?: PlTableFiltersState;\n /** Resulting filters which should be used in Join */\n filters?: PTableRecordFilter[];\n};\n\nexport type CreatePlDataTableOps = {\n /** Table filters, should contain */\n filters?: PTableRecordFilter[];\n\n /**\n * Selects columns for which will be inner-joined to the table.\n *\n * Default behaviour: all columns are considered to be core\n */\n coreColumnPredicate?: (spec: PColumnSpec) => boolean;\n\n /**\n * Determines how core columns should be joined together:\n * inner - so user will only see records present in all core columns\n * full - so user will only see records present in any of the core columns\n *\n * All non-core columns will be left joined to the table produced by the core\n * columns, in other words records form the pool of non-core columns will only\n * make their way into the final table if core table contins corresponding key.\n *\n * Default: 'full'\n */\n coreJoinType?: 'inner' | 'full';\n};\n\n/**\n * Create p-table handle given ui table state\n *\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns\n */\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined\n): PTableHandle | undefined;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined,\n ops: CreatePlDataTableOps\n): PTableHandle | undefined;\n/** @deprecated use method with extended ops as the last argument */\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined,\n filters: PTableRecordFilter[]\n): PTableHandle | undefined;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtx<A, U>,\n columns: PColumn<TreeNodeAccessor | PColumnValues>[],\n tableState: PlDataTableState | undefined,\n ops?: PTableRecordFilter[] | CreatePlDataTableOps\n): PTableHandle | undefined {\n // ops migration for backward compatibility with previous deprecated API\n if (Array.isArray(ops)) {\n ops = { filters: ops };\n }\n\n const allLabelCols = ctx.resultPool\n .getData()\n .entries.map((d) => d.obj)\n .filter(isPColumn)\n .filter((p) => p.spec.name === 'pl7.app/label' && p.spec.axesSpec.length === 1);\n\n const colId = (id: PObjectId, domain?: Record<string, string>) => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n return wid;\n };\n\n const labelColumns = new Map<string, PColumn<TreeNodeAccessor>>();\n\n for (const col of columns) {\n for (const axis of col.spec.axesSpec) {\n const axisId = getAxisId(axis);\n for (const labelColumn of allLabelCols) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n if (matchAxisId(axisId, labelAxisId)) {\n const dataDomainLen = Object.keys(axisId.domain ?? {}).length;\n const labelDomainLen = Object.keys(labelAxisId.domain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n const id = colId(labelColumn.id, axisId.domain);\n\n labelColumns.set(id, {\n id: id as PObjectId,\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }]\n },\n data: labelColumn.data\n });\n } else {\n labelColumns.set(colId(labelColumn.id), labelColumn);\n }\n }\n }\n }\n }\n\n // if at least one column is not yet ready, we can't show the table\n if (\n [...columns, ...labelColumns.values()].some(\n (a) => a.data instanceof TreeNodeAccessor && !a.data.getIsReadyOrError()\n )\n )\n return undefined;\n\n let coreColumns = columns;\n const secondaryColumns: typeof columns = [];\n\n if (ops?.coreColumnPredicate) {\n coreColumns = [];\n for (const c of columns)\n if (ops.coreColumnPredicate(c.spec)) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...labelColumns.values());\n\n return ctx.createPTable({\n src: {\n type: 'outer',\n primary: {\n type: ops?.coreJoinType ?? 'full',\n entries: coreColumns.map((c) => ({ type: 'column', column: c }))\n },\n secondary: secondaryColumns.map((c) => ({ type: 'column', column: c }))\n },\n filters: [...(ops?.filters ?? []), ...(tableState?.pTableParams?.filters ?? [])],\n sorting: tableState?.pTableParams?.sorting ?? []\n });\n}\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtx<A, U>,\n axis: AxisSpec,\n values: (string | number)[]\n): PlDataTableSheet {\n const labels = ctx.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString()\n })),\n defaultValue: values[0]\n };\n}\n","import {\n AxisId,\n getAxisId,\n isPColumn,\n matchAxisId,\n PColumn,\n PColumnValues,\n PFrameHandle,\n PObjectId,\n ValueType,\n} from '@milaboratories/pl-model-common';\nimport {RenderCtx, TreeNodeAccessor} from '../render';\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\n let wid = id.toString();\n domains?.forEach(domain => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach(list => {\n const nextResult: AxisId[][] = [];\n list.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\n/** Check if axes of secondary column are exactly in axes of main column */\nfunction checkFullCompatibility(\n mainColumn: PColumn<TreeNodeAccessor | PColumnValues>,\n secondaryColumn: PColumn<TreeNodeAccessor | PColumnValues>\n): boolean {\n const mainAxesIds = mainColumn.spec.axesSpec.map(getAxisId);\n const secondaryAxesIds = secondaryColumn.spec.axesSpec.map(getAxisId);\n return secondaryAxesIds.every(id => mainAxesIds.some(mainId => matchAxisId(mainId, id) && matchAxisId(id, mainId)));\n}\n\n/** Check if axes of secondary column are in axes of main column, but they can have compatible difference in domains */\nfunction checkCompatibility(\n mainColumn: PColumn<TreeNodeAccessor | PColumnValues>,\n secondaryColumn: PColumn<TreeNodeAccessor | PColumnValues>\n): boolean {\n const mainAxesIds = mainColumn.spec.axesSpec.map(getAxisId);\n const secondaryAxesIds = secondaryColumn.spec.axesSpec.map(getAxisId);\n return secondaryAxesIds.every(id => mainAxesIds.some(mainId => matchAxisId(mainId, id)));\n}\n\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // annotation for column duplicates with extended domains\n\n/** Main column can have additional domains, if secondary column (meta-column) has all axes match main column axes\n we can add its copy with missed domain fields for compatibility */\nfunction getAdditionalColumnsForPair(\n mainColumn: PColumn<TreeNodeAccessor | PColumnValues>,\n secondaryColumn: PColumn<TreeNodeAccessor | PColumnValues>\n): PColumn<TreeNodeAccessor | PColumnValues>[] {\n const mainAxesIds = mainColumn.spec.axesSpec.map(getAxisId);\n const secondaryAxesIds = secondaryColumn.spec.axesSpec.map(getAxisId);\n\n const isFullCompatible = checkFullCompatibility(mainColumn, secondaryColumn);\n if (isFullCompatible) { // in this case it isn't necessary to add more columns\n return [];\n }\n const isCompatible = checkCompatibility(mainColumn, secondaryColumn);\n if (!isCompatible) { // in this case it is impossible to add some compatible column\n return [];\n }\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = secondaryAxesIds.map(id => {\n return mainAxesIds.filter(mainId => matchAxisId(mainId, id));\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n return secondaryIdsVariants.map(idsList => {\n const id = colId(secondaryColumn.id, idsList.map(id => id.domain));\n return {\n id: id as PObjectId,\n spec: {\n ...secondaryColumn.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: secondaryColumn.spec.axesSpec[idx].annotations\n })),\n annotations: {\n ...secondaryColumn.spec.annotations,\n [IS_VIRTUAL_COLUMN]: 'true'\n }\n },\n data: secondaryColumn.data\n };\n });\n}\n\nexport function getAdditionalColumns(columns: PColumn<TreeNodeAccessor | PColumnValues>[]): PColumn<TreeNodeAccessor | PColumnValues>[] {\n const additionalColumns: PColumn<TreeNodeAccessor | PColumnValues>[] = [];\n for (let i = 0; i < columns.length; i++) {\n for (let j = i + 1; j < columns.length; j++) {\n const column1 = columns[i];\n const column2 = columns[j];\n\n // check if column 1 is meta for column 2 or backward\n additionalColumns.push(\n ...getAdditionalColumnsForPair(column1, column2),\n ...getAdditionalColumnsForPair(column2, column1)\n );\n }\n }\n return additionalColumns;\n}\n\nexport function enrichColumnsWithCompatible(\n mainColumns: PColumn<TreeNodeAccessor | PColumnValues>[],\n secondaryColumns: PColumn<TreeNodeAccessor | PColumnValues>[]\n): PColumn<TreeNodeAccessor | PColumnValues>[] {\n const result = [...mainColumns];\n for (const secondaryColumn of secondaryColumns) {\n for (const mainColumn of mainColumns) {\n if (mainColumn.id === secondaryColumn.id) {\n break;\n }\n if (checkCompatibility(mainColumn, secondaryColumn)) {\n result.push(secondaryColumn);\n break;\n }\n }\n }\n return result;\n}\n\nconst VALUE_TYPES: ValueType[] = [\n 'Int',\n 'Long',\n 'Float',\n 'Double',\n 'String',\n 'Bytes'\n];\n\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtx<A, U>,\n blockColumns?: PColumn<TreeNodeAccessor | PColumnValues>[]\n): PFrameHandle | undefined {\n if (blockColumns === undefined) return undefined;\n\n const upstreamColumns = ctx.resultPool\n .getData()\n .entries.map((v) => v.obj)\n .filter(isPColumn)\n .filter((column) => VALUE_TYPES.includes(column.spec.valueType));\n\n const columnsWithCompatibleFromUpstream = enrichColumnsWithCompatible(blockColumns, upstreamColumns);\n\n // additional columns are duplicates with extra fields in domains for compatibility in all possible pairs of columns set\n const extendedColumns = [...columnsWithCompatibleFromUpstream, ...getAdditionalColumns(columnsWithCompatibleFromUpstream)];\n\n // if at least one column is not yet ready, we can't show the table\n if (\n extendedColumns.some(\n (a) => a.data instanceof TreeNodeAccessor && !a.data.getIsReadyOrError()\n )\n )\n return undefined;\n\n return ctx.createPFrame(extendedColumns);\n}","import {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n FindColumnsRequest,\n FindColumnsResponse,\n PColumnIdAndSpec,\n PColumnSpec,\n PFrame,\n PFrameHandle,\n PObjectId,\n UniqueValuesRequest,\n UniqueValuesResponse\n} from '@milaboratories/pl-model-common';\n\nexport class PFrameImpl implements PFrame {\n constructor(private readonly handle: PFrameHandle) {}\n\n public async findColumns(request: FindColumnsRequest): Promise<FindColumnsResponse> {\n return await platforma.pFrameDriver.findColumns(this.handle, request);\n }\n\n public async getColumnSpec(columnId: PObjectId): Promise<PColumnSpec> {\n return await platforma.pFrameDriver.getColumnSpec(this.handle, columnId);\n }\n\n public async listColumns(): Promise<PColumnIdAndSpec[]> {\n return await platforma.pFrameDriver.listColumns(this.handle);\n }\n\n public async calculateTableData(\n request: CalculateTableDataRequest<PObjectId>\n ): Promise<CalculateTableDataResponse> {\n return await platforma.pFrameDriver.calculateTableData(this.handle, request);\n }\n\n public async getUniqueValues(request: UniqueValuesRequest): Promise<UniqueValuesResponse> {\n return await platforma.pFrameDriver.getUniqueValues(this.handle, request);\n }\n}\n","import { getJsonField, makeObject, TypedConfig } from './config';\n\nexport function fromPlRef<Source extends TypedConfig>(source: Source) {\n return makeObject({\n __isRef: true,\n blockId: getJsonField(source, 'blockId'),\n name: getJsonField(source, 'name')\n });\n}\n\nexport function fromPlOption<Source extends TypedConfig>(source: Source) {\n return makeObject({\n ref: fromPlRef(getJsonField(source, 'ref')),\n label: getJsonField(source, 'label')\n });\n}\n","import { PlatformaSDKVersion } from './version';\n\nexport type SdkInfo = {\n readonly sdkVersion: string;\n};\n\nexport const CurrentSdkInfo: SdkInfo = {\n sdkVersion: PlatformaSDKVersion\n};\n","import {} from './global';\nimport { getPlatformaInstance } from './internal';\nimport { Platforma } from './platforma';\nimport { PlatformaSDKVersion } from './version';\n\nexport function getRawPlatformaInstance(): Platforma {\n return getPlatformaInstance({ sdkVersion: PlatformaSDKVersion });\n}\n","import {} from './global';\n\nexport function getEnvironmentValue(name: string): string | undefined {\n if (typeof globalThis.getEnvironmentValue !== 'function') return undefined;\n else return globalThis.getEnvironmentValue(name);\n}\n"],"names":["OutputError","errors","moreErrors","readOutput","outputValue","wrapOutputs","outputs","target","key","primitiveToConfig","value","getImmediate","getFromCfg","variable","isolate","cfg","Args","It","MainOutputs","StagingOutputs","UiState","makeObject","template","normalizedTemplate","k","makeArray","getJsonField","source","field","mapRecordValues","mapping","itVar","mapArrayValues","flatten","isEmpty","arg","not","operand","and","operand1","operand2","or","getResourceField","getResourceValueAsJson","mapResourceFields","getBlobContent","getBlobContentAsString","getBlobContentAsJson","getDownloadedBlobContent","getOnDemandBlobContent","extractArchiveAndGetURL","format","getImportProgress","getLastLogs","lines","getProgressLog","patternToSearch","getProgressLogWithInfo","getLogHandle","isInUI","getPlatformaInstance","config","tryGetCfgRenderCtx","getCfgRenderCtx","tryRegisterCallback","callback","ctx","futureResolves","registerFutureAwait","handle","onResolve","res","FutureRef","postProcess","v","__publicField","vv","ifDef","cb","TreeNodeAccessor","resolvePath","steps","transformedSteps","commonOptions","step","accessor","accsessor","content","errorOnUnknownField","prefix","result","obj","isPColumn","pObjects","mapPObjectData","c","nLines","fieldType","_mapping","_ops","requireLocked","skipUnresolved","fieldEntries","e","name","StagingAccessorName","MainAccessorName","GlobalCfgRenderCtxFeatureFlags","isFutureAwait","addAllFutureAwaits","set","visited","node","a","nested","getAllFutureAwaits","PAnnotationLabel","PAnnotationTrace","TraceEntry","z","Trace","DistancePenalty","LabelType","LabelTypeFull","deriveLabels","values","specExtractor","ops","importances","numberOfRecordsWithType","enrichedRecords","spec","label","_a","traceStr","_b","trace","labelEntry","fullTrace","occurences","i","typeName","importance","occurenceIndex","fullType","mainTypes","secondaryTypes","allTypeRecords","i1","i2","calculate","includedTypes","r","labelSet","fm","sep","additinalType","currentSet","candidateResult","ResultPool","ref","predicate","predicateOrSelector","selectorsToPredicate","filtered","s","o","anchorsOrCtx","predicateOrSelectors","labelOps","resolvedAnchors","AnchorIdDeriver","isPlRef","resolvedSpec","selector","resolveAnchors","isPColumnSpec","anchorIdDeriver","mapValueInVOE","f","data","ensurePColumn","out","oth","matchDomain","qAx","tAx","query","RenderCtx","axis","dataPool","column","columns","hasInlineColumns","inlineColumnsSupport","def","d","rawDef","extractAllColumns","mapPTableDef","po","blockId","PCD_PREFIX","RT_RESOURCE_MAP","RT_RESOURCE_MAP_PARTITIONED","RT_JSON_PARTITIONED","RT_BINARY_PARTITIONED","PCD_SUP_PREFIX","RT_JSON_SUPER_PARTITIONED","RT_BINARY_SUPER_PARTITIONED","populateResourceMapData","acc","resourceParser","keyPrefix","addEntriesWithNoData","isComplete","keyStr","converted","populateResult","parseResourceMap","removeIndexSuffix","getPartitionKeysList","rt","meta","keyLength","supKeyStr","getUniquePartitionKeys","list","l","PlatformaSDKVersion","isConfigLambda","cfgOrFh","downgradeCfgOrLambda","upgradeCfgOrLambda","extractConfig","initialArgs","initialUiState","inputsValid","renderingMode","sdkVersion","sections","title","code","fields","canRun","BlockModel","_renderingMode","_initialArgs","_initialUiState","_outputs","_inputsValid","_sections","_title","cfgOrRf","flags","rf","arrOrCfgOrRf","initialValue","createPlDataTable","tableState","allLabelCols","p","colId","id","domain","wid","labelColumns","col","axisId","getAxisId","labelColumn","labelAxis","labelAxisId","matchAxisId","dataDomainLen","labelDomainLen","coreColumns","secondaryColumns","createPlDataTableSheet","labels","domains","getKeysCombinations","idsLists","nextResult","resultItem","checkFullCompatibility","mainColumn","secondaryColumn","mainAxesIds","mainId","checkCompatibility","IS_VIRTUAL_COLUMN","getAdditionalColumnsForPair","secondaryAxesIds","secondaryIdsOptions","idsList","idx","getAdditionalColumns","additionalColumns","j","column1","column2","enrichColumnsWithCompatible","mainColumns","VALUE_TYPES","createPFrameForGraphs","blockColumns","upstreamColumns","columnsWithCompatibleFromUpstream","extendedColumns","PFrameImpl","request","columnId","fromPlRef","fromPlOption","CurrentSdkInfo","getRawPlatformaInstance","getEnvironmentValue"],"mappings":"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"}