@milaboratories/pl-middle-layer 1.74.13 → 1.74.15

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.
@@ -76,7 +76,7 @@ function getServiceInjectors() {
76
76
  };
77
77
  return {
78
78
  create: (sources) => vm.exportSingleValue(pinHandle(driver.create(vm.importObjectViaJson(sources), bindings))),
79
- isEmpty: (handle) => vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle))),
79
+ isEmpty: (handle) => vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle), bindings)),
80
80
  isFinal: (handle) => vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle))),
81
81
  getColumns: (handle) => vm.exportObjectViaJson(driver.getColumns(vm.vm.getString(handle), bindings)),
82
82
  addSource: (handle, sources) => vm.exportSingleValue(pinHandle(driver.addSource(vm.vm.getString(handle), vm.importObjectViaJson(sources), bindings))),
@@ -1 +1 @@
1
- {"version":3,"file":"service_injectors.cjs","names":["Services","ServiceNotRegisteredError","PoolEntryGuard"],"sources":["../../src/js_render/service_injectors.ts"],"sourcesContent":["import type { QuickJSHandle, VmFunctionImplementation } from \"quickjs-emscripten\";\nimport type {\n CollectionHandle,\n ColumnsCollectionDriverHost,\n DiscoverColumnsOptions,\n InferServiceModel,\n PoolEntry,\n SerializedColumnsSource,\n ServiceBrand,\n} from \"@milaboratories/pl-model-common\";\nimport { Services, ServiceNotRegisteredError } from \"@milaboratories/pl-model-common\";\nimport type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n AxesId,\n AxesSpec,\n DataInfo,\n PColumn,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n BuildQueryInput,\n DeleteColumnRequest,\n DiscoverColumnsRequest,\n PFrameDef,\n SpecQuery,\n PTableDef,\n PTableDefV2,\n SpecFrameHandle,\n} from \"@milaboratories/pl-model-common\";\nimport { PoolEntryGuard } from \"@milaboratories/pl-model-common\";\nimport type { JsExecutionContext } from \"./context\";\nimport type { ComputableContextHelper } from \"./computable_context\";\n\ntype VmMethod = VmFunctionImplementation<QuickJSHandle>;\n\nexport type ServiceInjectorContext = {\n host: ComputableContextHelper;\n vm: JsExecutionContext;\n};\n\n// Each injector returns a record of method name -> VM function implementation.\n// The framework automatically registers them with serviceFnKey(serviceId, methodName).\nexport type ServiceInjector<Methods extends string = string> = (\n ctx: ServiceInjectorContext,\n) => Record<Methods, VmMethod>;\n\n// Type-safe injector for a specific service — must return all methods from the model interface.\ntype ServiceInjectorFor<S extends keyof typeof Services> = ServiceInjector<\n string & keyof InferServiceModel<ServiceBrand<(typeof Services)[S]>>\n>;\n\n// Complete, type-checked injector map.\n// Adding a service to Services without an entry here is a compile-time error.\n// Missing a method from the interface is also a compile-time error.\ntype ServiceInjectorMap = { [K in keyof typeof Services]: ServiceInjectorFor<K> };\n\nexport function getServiceInjectors(): ServiceInjectorMap {\n return {\n PFrameSpec: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n return {\n createSpecFrame: (specs: QuickJSHandle) => {\n using guard = new PoolEntryGuard(\n driver.createSpecFrame(vm.importObjectViaJson(specs) as Record<string, PColumnSpec>),\n );\n host.addOnDestroy(guard.entry.unref);\n const entry = guard.keep();\n // TODO: add [Symbol.dispose] once QuickJS supports ES2024 explicit resource management\n const obj = vm.vm.newObject();\n vm.vm.newString(entry.key).consume((k) => vm.vm.setProp(obj, \"key\", k));\n vm.vm\n .newFunction(\"unref\", () => {\n entry.unref();\n })\n .consume((fn) => vm.vm.setProp(obj, \"unref\", fn));\n return obj;\n },\n\n listColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.listColumns(vm.vm.getString(handle) as SpecFrameHandle)),\n\n discoverColumns: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.discoverColumns(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DiscoverColumnsRequest,\n ),\n ),\n\n buildQuery: (input: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.buildQuery(vm.importObjectViaJson(input) as BuildQueryInput),\n ),\n\n deleteColumn: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.deleteColumn(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DeleteColumnRequest,\n ),\n ),\n\n evaluateQuery: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.evaluateQuery(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as SpecQuery,\n ),\n ),\n\n expandAxes: (spec: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.expandAxes(vm.importObjectViaJson(spec) as AxesSpec)),\n\n collapseAxes: (ids: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.collapseAxes(vm.importObjectViaJson(ids) as AxesId)),\n\n findAxis: (spec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findAxis(\n vm.importObjectViaJson(spec) as AxesSpec,\n vm.importObjectViaJson(selector) as SingleAxisSelector,\n ),\n ),\n\n findTableColumn: (tableSpec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findTableColumn(\n vm.importObjectViaJson(tableSpec) as PTableColumnSpec[],\n vm.importObjectViaJson(selector) as PTableColumnId,\n ),\n ),\n\n rewriteLegacyFilters: (request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.rewriteLegacyFilters(\n vm.importObjectViaJson(request) as {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n },\n ),\n ),\n };\n },\n\n PFrame: ({ host, vm }: ServiceInjectorContext) => ({\n createPFrame: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPFrame(\n vm.importObjectViaJson(def) as PFrameDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTable: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTable(\n vm.importObjectViaJson(def) as PTableDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTableV2: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTableV2(\n vm.importObjectViaJson(def) as PTableDefV2<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n }),\n\n // Dialog has no model-side surface — workflow scripts cannot open save dialogs.\n // Declared as an empty injector to satisfy the exhaustive ServiceInjectorMap.\n Dialog: () => ({}) as Record<never, VmMethod>,\n\n ColumnsCollection: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.ColumnsCollection);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.ColumnsCollection}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n const specDriver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!specDriver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n const bindings: ColumnsCollectionDriverHost<PlTreeNodeAccessor> = {\n resolveAccessor: (h) => host.getAccessor(h),\n getUpstreamBlockCtxes: () => host.getRawUpstreamBlockCtx(),\n getSpecDriver: () => specDriver,\n resolveSpec: (id: PObjectId) => {\n const leaf = host.getColumnRegistry().resolve(id);\n if (leaf === undefined) return undefined;\n const specNode = leaf.accessor.traverse({\n field: `${leaf.name}.spec`,\n assertFieldType: \"Input\",\n ignoreError: true,\n });\n return specNode?.getDataAsJson<PColumnSpec>();\n },\n };\n\n const pinHandle = (entry: PoolEntry<CollectionHandle>): CollectionHandle => {\n using guard = new PoolEntryGuard(entry);\n host.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n };\n\n return {\n create: (sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.create(vm.importObjectViaJson(sources) as SerializedColumnsSource[], bindings),\n ),\n ),\n\n isEmpty: (handle: QuickJSHandle) =>\n vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle) as CollectionHandle)),\n\n isFinal: (handle: QuickJSHandle) =>\n vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle) as CollectionHandle)),\n\n getColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.getColumns(vm.vm.getString(handle) as CollectionHandle, bindings),\n ),\n\n addSource: (handle: QuickJSHandle, sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.addSource(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(sources) as SerializedColumnsSource[],\n bindings,\n ),\n ),\n ),\n\n discover: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.discover(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n\n filter: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.filter(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n };\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service_injectors.cjs","names":["Services","ServiceNotRegisteredError","PoolEntryGuard"],"sources":["../../src/js_render/service_injectors.ts"],"sourcesContent":["import type { QuickJSHandle, VmFunctionImplementation } from \"quickjs-emscripten\";\nimport type {\n CollectionHandle,\n ColumnsCollectionDriverHost,\n DiscoverColumnsOptions,\n InferServiceModel,\n PoolEntry,\n SerializedColumnsSource,\n ServiceBrand,\n} from \"@milaboratories/pl-model-common\";\nimport { Services, ServiceNotRegisteredError } from \"@milaboratories/pl-model-common\";\nimport type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n AxesId,\n AxesSpec,\n DataInfo,\n PColumn,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PObjectSpec,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n BuildQueryInput,\n DeleteColumnRequest,\n DiscoverColumnsRequest,\n PFrameDef,\n SpecQuery,\n PTableDef,\n PTableDefV2,\n SpecFrameHandle,\n} from \"@milaboratories/pl-model-common\";\nimport { PoolEntryGuard } from \"@milaboratories/pl-model-common\";\nimport type { JsExecutionContext } from \"./context\";\nimport type { ComputableContextHelper } from \"./computable_context\";\n\ntype VmMethod = VmFunctionImplementation<QuickJSHandle>;\n\nexport type ServiceInjectorContext = {\n host: ComputableContextHelper;\n vm: JsExecutionContext;\n};\n\n// Each injector returns a record of method name -> VM function implementation.\n// The framework automatically registers them with serviceFnKey(serviceId, methodName).\nexport type ServiceInjector<Methods extends string = string> = (\n ctx: ServiceInjectorContext,\n) => Record<Methods, VmMethod>;\n\n// Type-safe injector for a specific service — must return all methods from the model interface.\ntype ServiceInjectorFor<S extends keyof typeof Services> = ServiceInjector<\n string & keyof InferServiceModel<ServiceBrand<(typeof Services)[S]>>\n>;\n\n// Complete, type-checked injector map.\n// Adding a service to Services without an entry here is a compile-time error.\n// Missing a method from the interface is also a compile-time error.\ntype ServiceInjectorMap = { [K in keyof typeof Services]: ServiceInjectorFor<K> };\n\nexport function getServiceInjectors(): ServiceInjectorMap {\n return {\n PFrameSpec: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n return {\n createSpecFrame: (specs: QuickJSHandle) => {\n using guard = new PoolEntryGuard(\n driver.createSpecFrame(vm.importObjectViaJson(specs) as Record<string, PColumnSpec>),\n );\n host.addOnDestroy(guard.entry.unref);\n const entry = guard.keep();\n // TODO: add [Symbol.dispose] once QuickJS supports ES2024 explicit resource management\n const obj = vm.vm.newObject();\n vm.vm.newString(entry.key).consume((k) => vm.vm.setProp(obj, \"key\", k));\n vm.vm\n .newFunction(\"unref\", () => {\n entry.unref();\n })\n .consume((fn) => vm.vm.setProp(obj, \"unref\", fn));\n return obj;\n },\n\n listColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.listColumns(vm.vm.getString(handle) as SpecFrameHandle)),\n\n discoverColumns: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.discoverColumns(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DiscoverColumnsRequest,\n ),\n ),\n\n buildQuery: (input: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.buildQuery(vm.importObjectViaJson(input) as BuildQueryInput),\n ),\n\n deleteColumn: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.deleteColumn(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DeleteColumnRequest,\n ),\n ),\n\n evaluateQuery: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.evaluateQuery(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as SpecQuery,\n ),\n ),\n\n expandAxes: (spec: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.expandAxes(vm.importObjectViaJson(spec) as AxesSpec)),\n\n collapseAxes: (ids: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.collapseAxes(vm.importObjectViaJson(ids) as AxesId)),\n\n findAxis: (spec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findAxis(\n vm.importObjectViaJson(spec) as AxesSpec,\n vm.importObjectViaJson(selector) as SingleAxisSelector,\n ),\n ),\n\n findTableColumn: (tableSpec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findTableColumn(\n vm.importObjectViaJson(tableSpec) as PTableColumnSpec[],\n vm.importObjectViaJson(selector) as PTableColumnId,\n ),\n ),\n\n rewriteLegacyFilters: (request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.rewriteLegacyFilters(\n vm.importObjectViaJson(request) as {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n },\n ),\n ),\n };\n },\n\n PFrame: ({ host, vm }: ServiceInjectorContext) => ({\n createPFrame: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPFrame(\n vm.importObjectViaJson(def) as PFrameDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTable: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTable(\n vm.importObjectViaJson(def) as PTableDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTableV2: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTableV2(\n vm.importObjectViaJson(def) as PTableDefV2<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n }),\n\n // Dialog has no model-side surface — workflow scripts cannot open save dialogs.\n // Declared as an empty injector to satisfy the exhaustive ServiceInjectorMap.\n Dialog: () => ({}) as Record<never, VmMethod>,\n\n ColumnsCollection: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.ColumnsCollection);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.ColumnsCollection}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n const specDriver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!specDriver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n const bindings: ColumnsCollectionDriverHost<PlTreeNodeAccessor> = {\n resolveAccessor: (h) => host.getAccessor(h),\n getUpstreamBlockCtxes: () => host.getRawUpstreamBlockCtx(),\n getSpecDriver: () => specDriver,\n resolveSpec: (id: PObjectId) => {\n const leaf = host.getColumnRegistry().resolve(id);\n if (leaf === undefined) return undefined;\n const specNode = leaf.accessor.traverse({\n field: `${leaf.name}.spec`,\n assertFieldType: \"Input\",\n ignoreError: true,\n });\n return specNode?.getDataAsJson<PObjectSpec>();\n },\n };\n\n const pinHandle = (entry: PoolEntry<CollectionHandle>): CollectionHandle => {\n using guard = new PoolEntryGuard(entry);\n host.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n };\n\n return {\n create: (sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.create(vm.importObjectViaJson(sources) as SerializedColumnsSource[], bindings),\n ),\n ),\n\n isEmpty: (handle: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.isEmpty(vm.vm.getString(handle) as CollectionHandle, bindings),\n ),\n\n isFinal: (handle: QuickJSHandle) =>\n vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle) as CollectionHandle)),\n\n getColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.getColumns(vm.vm.getString(handle) as CollectionHandle, bindings),\n ),\n\n addSource: (handle: QuickJSHandle, sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.addSource(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(sources) as SerializedColumnsSource[],\n bindings,\n ),\n ),\n ),\n\n discover: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.discover(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n\n filter: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.filter(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -76,7 +76,7 @@ function getServiceInjectors() {
76
76
  };
77
77
  return {
78
78
  create: (sources) => vm.exportSingleValue(pinHandle(driver.create(vm.importObjectViaJson(sources), bindings))),
79
- isEmpty: (handle) => vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle))),
79
+ isEmpty: (handle) => vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle), bindings)),
80
80
  isFinal: (handle) => vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle))),
81
81
  getColumns: (handle) => vm.exportObjectViaJson(driver.getColumns(vm.vm.getString(handle), bindings)),
82
82
  addSource: (handle, sources) => vm.exportSingleValue(pinHandle(driver.addSource(vm.vm.getString(handle), vm.importObjectViaJson(sources), bindings))),
@@ -1 +1 @@
1
- {"version":3,"file":"service_injectors.js","names":[],"sources":["../../src/js_render/service_injectors.ts"],"sourcesContent":["import type { QuickJSHandle, VmFunctionImplementation } from \"quickjs-emscripten\";\nimport type {\n CollectionHandle,\n ColumnsCollectionDriverHost,\n DiscoverColumnsOptions,\n InferServiceModel,\n PoolEntry,\n SerializedColumnsSource,\n ServiceBrand,\n} from \"@milaboratories/pl-model-common\";\nimport { Services, ServiceNotRegisteredError } from \"@milaboratories/pl-model-common\";\nimport type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n AxesId,\n AxesSpec,\n DataInfo,\n PColumn,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n BuildQueryInput,\n DeleteColumnRequest,\n DiscoverColumnsRequest,\n PFrameDef,\n SpecQuery,\n PTableDef,\n PTableDefV2,\n SpecFrameHandle,\n} from \"@milaboratories/pl-model-common\";\nimport { PoolEntryGuard } from \"@milaboratories/pl-model-common\";\nimport type { JsExecutionContext } from \"./context\";\nimport type { ComputableContextHelper } from \"./computable_context\";\n\ntype VmMethod = VmFunctionImplementation<QuickJSHandle>;\n\nexport type ServiceInjectorContext = {\n host: ComputableContextHelper;\n vm: JsExecutionContext;\n};\n\n// Each injector returns a record of method name -> VM function implementation.\n// The framework automatically registers them with serviceFnKey(serviceId, methodName).\nexport type ServiceInjector<Methods extends string = string> = (\n ctx: ServiceInjectorContext,\n) => Record<Methods, VmMethod>;\n\n// Type-safe injector for a specific service — must return all methods from the model interface.\ntype ServiceInjectorFor<S extends keyof typeof Services> = ServiceInjector<\n string & keyof InferServiceModel<ServiceBrand<(typeof Services)[S]>>\n>;\n\n// Complete, type-checked injector map.\n// Adding a service to Services without an entry here is a compile-time error.\n// Missing a method from the interface is also a compile-time error.\ntype ServiceInjectorMap = { [K in keyof typeof Services]: ServiceInjectorFor<K> };\n\nexport function getServiceInjectors(): ServiceInjectorMap {\n return {\n PFrameSpec: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n return {\n createSpecFrame: (specs: QuickJSHandle) => {\n using guard = new PoolEntryGuard(\n driver.createSpecFrame(vm.importObjectViaJson(specs) as Record<string, PColumnSpec>),\n );\n host.addOnDestroy(guard.entry.unref);\n const entry = guard.keep();\n // TODO: add [Symbol.dispose] once QuickJS supports ES2024 explicit resource management\n const obj = vm.vm.newObject();\n vm.vm.newString(entry.key).consume((k) => vm.vm.setProp(obj, \"key\", k));\n vm.vm\n .newFunction(\"unref\", () => {\n entry.unref();\n })\n .consume((fn) => vm.vm.setProp(obj, \"unref\", fn));\n return obj;\n },\n\n listColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.listColumns(vm.vm.getString(handle) as SpecFrameHandle)),\n\n discoverColumns: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.discoverColumns(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DiscoverColumnsRequest,\n ),\n ),\n\n buildQuery: (input: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.buildQuery(vm.importObjectViaJson(input) as BuildQueryInput),\n ),\n\n deleteColumn: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.deleteColumn(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DeleteColumnRequest,\n ),\n ),\n\n evaluateQuery: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.evaluateQuery(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as SpecQuery,\n ),\n ),\n\n expandAxes: (spec: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.expandAxes(vm.importObjectViaJson(spec) as AxesSpec)),\n\n collapseAxes: (ids: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.collapseAxes(vm.importObjectViaJson(ids) as AxesId)),\n\n findAxis: (spec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findAxis(\n vm.importObjectViaJson(spec) as AxesSpec,\n vm.importObjectViaJson(selector) as SingleAxisSelector,\n ),\n ),\n\n findTableColumn: (tableSpec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findTableColumn(\n vm.importObjectViaJson(tableSpec) as PTableColumnSpec[],\n vm.importObjectViaJson(selector) as PTableColumnId,\n ),\n ),\n\n rewriteLegacyFilters: (request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.rewriteLegacyFilters(\n vm.importObjectViaJson(request) as {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n },\n ),\n ),\n };\n },\n\n PFrame: ({ host, vm }: ServiceInjectorContext) => ({\n createPFrame: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPFrame(\n vm.importObjectViaJson(def) as PFrameDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTable: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTable(\n vm.importObjectViaJson(def) as PTableDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTableV2: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTableV2(\n vm.importObjectViaJson(def) as PTableDefV2<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n }),\n\n // Dialog has no model-side surface — workflow scripts cannot open save dialogs.\n // Declared as an empty injector to satisfy the exhaustive ServiceInjectorMap.\n Dialog: () => ({}) as Record<never, VmMethod>,\n\n ColumnsCollection: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.ColumnsCollection);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.ColumnsCollection}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n const specDriver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!specDriver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n const bindings: ColumnsCollectionDriverHost<PlTreeNodeAccessor> = {\n resolveAccessor: (h) => host.getAccessor(h),\n getUpstreamBlockCtxes: () => host.getRawUpstreamBlockCtx(),\n getSpecDriver: () => specDriver,\n resolveSpec: (id: PObjectId) => {\n const leaf = host.getColumnRegistry().resolve(id);\n if (leaf === undefined) return undefined;\n const specNode = leaf.accessor.traverse({\n field: `${leaf.name}.spec`,\n assertFieldType: \"Input\",\n ignoreError: true,\n });\n return specNode?.getDataAsJson<PColumnSpec>();\n },\n };\n\n const pinHandle = (entry: PoolEntry<CollectionHandle>): CollectionHandle => {\n using guard = new PoolEntryGuard(entry);\n host.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n };\n\n return {\n create: (sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.create(vm.importObjectViaJson(sources) as SerializedColumnsSource[], bindings),\n ),\n ),\n\n isEmpty: (handle: QuickJSHandle) =>\n vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle) as CollectionHandle)),\n\n isFinal: (handle: QuickJSHandle) =>\n vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle) as CollectionHandle)),\n\n getColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.getColumns(vm.vm.getString(handle) as CollectionHandle, bindings),\n ),\n\n addSource: (handle: QuickJSHandle, sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.addSource(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(sources) as SerializedColumnsSource[],\n bindings,\n ),\n ),\n ),\n\n discover: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.discover(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n\n filter: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.filter(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n };\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service_injectors.js","names":[],"sources":["../../src/js_render/service_injectors.ts"],"sourcesContent":["import type { QuickJSHandle, VmFunctionImplementation } from \"quickjs-emscripten\";\nimport type {\n CollectionHandle,\n ColumnsCollectionDriverHost,\n DiscoverColumnsOptions,\n InferServiceModel,\n PoolEntry,\n SerializedColumnsSource,\n ServiceBrand,\n} from \"@milaboratories/pl-model-common\";\nimport { Services, ServiceNotRegisteredError } from \"@milaboratories/pl-model-common\";\nimport type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n AxesId,\n AxesSpec,\n DataInfo,\n PColumn,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PObjectSpec,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n BuildQueryInput,\n DeleteColumnRequest,\n DiscoverColumnsRequest,\n PFrameDef,\n SpecQuery,\n PTableDef,\n PTableDefV2,\n SpecFrameHandle,\n} from \"@milaboratories/pl-model-common\";\nimport { PoolEntryGuard } from \"@milaboratories/pl-model-common\";\nimport type { JsExecutionContext } from \"./context\";\nimport type { ComputableContextHelper } from \"./computable_context\";\n\ntype VmMethod = VmFunctionImplementation<QuickJSHandle>;\n\nexport type ServiceInjectorContext = {\n host: ComputableContextHelper;\n vm: JsExecutionContext;\n};\n\n// Each injector returns a record of method name -> VM function implementation.\n// The framework automatically registers them with serviceFnKey(serviceId, methodName).\nexport type ServiceInjector<Methods extends string = string> = (\n ctx: ServiceInjectorContext,\n) => Record<Methods, VmMethod>;\n\n// Type-safe injector for a specific service — must return all methods from the model interface.\ntype ServiceInjectorFor<S extends keyof typeof Services> = ServiceInjector<\n string & keyof InferServiceModel<ServiceBrand<(typeof Services)[S]>>\n>;\n\n// Complete, type-checked injector map.\n// Adding a service to Services without an entry here is a compile-time error.\n// Missing a method from the interface is also a compile-time error.\ntype ServiceInjectorMap = { [K in keyof typeof Services]: ServiceInjectorFor<K> };\n\nexport function getServiceInjectors(): ServiceInjectorMap {\n return {\n PFrameSpec: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n return {\n createSpecFrame: (specs: QuickJSHandle) => {\n using guard = new PoolEntryGuard(\n driver.createSpecFrame(vm.importObjectViaJson(specs) as Record<string, PColumnSpec>),\n );\n host.addOnDestroy(guard.entry.unref);\n const entry = guard.keep();\n // TODO: add [Symbol.dispose] once QuickJS supports ES2024 explicit resource management\n const obj = vm.vm.newObject();\n vm.vm.newString(entry.key).consume((k) => vm.vm.setProp(obj, \"key\", k));\n vm.vm\n .newFunction(\"unref\", () => {\n entry.unref();\n })\n .consume((fn) => vm.vm.setProp(obj, \"unref\", fn));\n return obj;\n },\n\n listColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.listColumns(vm.vm.getString(handle) as SpecFrameHandle)),\n\n discoverColumns: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.discoverColumns(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DiscoverColumnsRequest,\n ),\n ),\n\n buildQuery: (input: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.buildQuery(vm.importObjectViaJson(input) as BuildQueryInput),\n ),\n\n deleteColumn: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.deleteColumn(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as DeleteColumnRequest,\n ),\n ),\n\n evaluateQuery: (handle: QuickJSHandle, request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.evaluateQuery(\n vm.vm.getString(handle) as SpecFrameHandle,\n vm.importObjectViaJson(request) as SpecQuery,\n ),\n ),\n\n expandAxes: (spec: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.expandAxes(vm.importObjectViaJson(spec) as AxesSpec)),\n\n collapseAxes: (ids: QuickJSHandle) =>\n vm.exportObjectViaJson(driver.collapseAxes(vm.importObjectViaJson(ids) as AxesId)),\n\n findAxis: (spec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findAxis(\n vm.importObjectViaJson(spec) as AxesSpec,\n vm.importObjectViaJson(selector) as SingleAxisSelector,\n ),\n ),\n\n findTableColumn: (tableSpec: QuickJSHandle, selector: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.findTableColumn(\n vm.importObjectViaJson(tableSpec) as PTableColumnSpec[],\n vm.importObjectViaJson(selector) as PTableColumnId,\n ),\n ),\n\n rewriteLegacyFilters: (request: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.rewriteLegacyFilters(\n vm.importObjectViaJson(request) as {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n },\n ),\n ),\n };\n },\n\n PFrame: ({ host, vm }: ServiceInjectorContext) => ({\n createPFrame: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPFrame(\n vm.importObjectViaJson(def) as PFrameDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTable: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTable(\n vm.importObjectViaJson(def) as PTableDef<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n\n createPTableV2: (def: QuickJSHandle) =>\n vm.exportSingleValue(\n host.createPTableV2(\n vm.importObjectViaJson(def) as PTableDefV2<\n PObjectId | PColumn<string | PColumnValues | DataInfo<string>>\n >,\n ),\n ),\n }),\n\n // Dialog has no model-side surface — workflow scripts cannot open save dialogs.\n // Declared as an empty injector to satisfy the exhaustive ServiceInjectorMap.\n Dialog: () => ({}) as Record<never, VmMethod>,\n\n ColumnsCollection: ({ host, vm }: ServiceInjectorContext) => {\n const driver = host.serviceRegistry.get(Services.ColumnsCollection);\n if (!driver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.ColumnsCollection}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n const specDriver = host.serviceRegistry.get(Services.PFrameSpec);\n if (!specDriver)\n throw new ServiceNotRegisteredError(\n `Service \"${Services.PFrameSpec}\" has no factory in ModelServiceRegistry. Provide a non-null factory.`,\n );\n\n const bindings: ColumnsCollectionDriverHost<PlTreeNodeAccessor> = {\n resolveAccessor: (h) => host.getAccessor(h),\n getUpstreamBlockCtxes: () => host.getRawUpstreamBlockCtx(),\n getSpecDriver: () => specDriver,\n resolveSpec: (id: PObjectId) => {\n const leaf = host.getColumnRegistry().resolve(id);\n if (leaf === undefined) return undefined;\n const specNode = leaf.accessor.traverse({\n field: `${leaf.name}.spec`,\n assertFieldType: \"Input\",\n ignoreError: true,\n });\n return specNode?.getDataAsJson<PObjectSpec>();\n },\n };\n\n const pinHandle = (entry: PoolEntry<CollectionHandle>): CollectionHandle => {\n using guard = new PoolEntryGuard(entry);\n host.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n };\n\n return {\n create: (sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.create(vm.importObjectViaJson(sources) as SerializedColumnsSource[], bindings),\n ),\n ),\n\n isEmpty: (handle: QuickJSHandle) =>\n vm.exportSingleValue(\n driver.isEmpty(vm.vm.getString(handle) as CollectionHandle, bindings),\n ),\n\n isFinal: (handle: QuickJSHandle) =>\n vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle) as CollectionHandle)),\n\n getColumns: (handle: QuickJSHandle) =>\n vm.exportObjectViaJson(\n driver.getColumns(vm.vm.getString(handle) as CollectionHandle, bindings),\n ),\n\n addSource: (handle: QuickJSHandle, sources: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.addSource(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(sources) as SerializedColumnsSource[],\n bindings,\n ),\n ),\n ),\n\n discover: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.discover(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n\n filter: (handle: QuickJSHandle, opts: QuickJSHandle) =>\n vm.exportSingleValue(\n pinHandle(\n driver.filter(\n vm.vm.getString(handle) as CollectionHandle,\n vm.importObjectViaJson(opts) as DiscoverColumnsOptions,\n bindings,\n ),\n ),\n ),\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  // src/middle_layer/build_stamp.ts
2
2
  function injectedStamp() {
3
3
  try {
4
- return "98945012b770-dirty-1793293182863";
4
+ return "fb6a7a4077c5-dirty-1793645837953";
5
5
  } catch {
6
6
  return;
7
7
  }
@@ -1,7 +1,7 @@
1
1
  // src/middle_layer/build_stamp.ts
2
2
  function injectedStamp() {
3
3
  try {
4
- return "98945012b770-dirty-1793293182834";
4
+ return "fb6a7a4077c5-dirty-1793645837921";
5
5
  } catch {
6
6
  return;
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.74.13",
3
+ "version": "1.74.15",
4
4
  "description": "Pl Middle Layer",
5
5
  "keywords": [],
6
6
  "license": "UNLICENSED",
@@ -19,27 +19,27 @@
19
19
  }
20
20
  },
21
21
  "dependencies": {
22
- "@milaboratories/columns-collection-driver": "0.2.11",
22
+ "@milaboratories/columns-collection-driver": "0.2.12",
23
23
  "@milaboratories/computable": "2.9.9",
24
24
  "@milaboratories/helpers": "1.14.6",
25
- "@milaboratories/pf-driver": "1.9.11",
26
- "@milaboratories/pf-spec-driver": "1.5.11",
25
+ "@milaboratories/pf-driver": "1.9.12",
26
+ "@milaboratories/pf-spec-driver": "1.5.12",
27
27
  "@milaboratories/pframes-rs-node": "1.2.0",
28
- "@milaboratories/pl-client": "3.19.2",
29
- "@milaboratories/pl-crash-recorder": "0.3.7",
30
- "@milaboratories/pl-deployments": "3.0.23",
31
- "@milaboratories/pl-drivers": "1.16.37",
32
- "@milaboratories/pl-errors": "1.4.54",
28
+ "@milaboratories/pl-client": "3.19.3",
29
+ "@milaboratories/pl-crash-recorder": "0.3.8",
30
+ "@milaboratories/pl-deployments": "3.0.24",
31
+ "@milaboratories/pl-drivers": "1.16.38",
32
+ "@milaboratories/pl-errors": "1.4.55",
33
33
  "@milaboratories/pl-http": "1.2.5",
34
- "@milaboratories/pl-model-backend": "1.4.39",
35
- "@milaboratories/pl-model-common": "1.54.1",
36
- "@milaboratories/pl-model-middle-layer": "1.34.5",
37
- "@milaboratories/pl-tree": "1.16.6",
34
+ "@milaboratories/pl-model-backend": "1.4.40",
35
+ "@milaboratories/pl-model-common": "1.54.2",
36
+ "@milaboratories/pl-model-middle-layer": "1.34.6",
37
+ "@milaboratories/pl-tree": "1.16.7",
38
38
  "@milaboratories/resolve-helper": "1.1.3",
39
39
  "@milaboratories/ts-helpers": "1.9.0",
40
- "@platforma-sdk/block-tools": "2.17.0",
41
- "@platforma-sdk/model": "1.86.3",
42
- "@platforma-sdk/workflow-tengo": "6.17.3",
40
+ "@platforma-sdk/block-tools": "2.17.1",
41
+ "@platforma-sdk/model": "1.86.5",
42
+ "@platforma-sdk/workflow-tengo": "6.18.0",
43
43
  "canonicalize": "~2.1.0",
44
44
  "denque": "^2.1.0",
45
45
  "es-toolkit": "^1.39.10",
@@ -18,6 +18,7 @@ import type {
18
18
  PColumnSpec,
19
19
  PColumnValues,
20
20
  PObjectId,
21
+ PObjectSpec,
21
22
  PTableColumnId,
22
23
  PTableColumnSpec,
23
24
  PTableRecordFilter,
@@ -208,7 +209,7 @@ export function getServiceInjectors(): ServiceInjectorMap {
208
209
  assertFieldType: "Input",
209
210
  ignoreError: true,
210
211
  });
211
- return specNode?.getDataAsJson<PColumnSpec>();
212
+ return specNode?.getDataAsJson<PObjectSpec>();
212
213
  },
213
214
  };
214
215
 
@@ -227,7 +228,9 @@ export function getServiceInjectors(): ServiceInjectorMap {
227
228
  ),
228
229
 
229
230
  isEmpty: (handle: QuickJSHandle) =>
230
- vm.exportSingleValue(driver.isEmpty(vm.vm.getString(handle) as CollectionHandle)),
231
+ vm.exportSingleValue(
232
+ driver.isEmpty(vm.vm.getString(handle) as CollectionHandle, bindings),
233
+ ),
231
234
 
232
235
  isFinal: (handle: QuickJSHandle) =>
233
236
  vm.exportSingleValue(driver.isFinal(vm.vm.getString(handle) as CollectionHandle)),
@@ -560,7 +560,7 @@ test("v3 blocks: migrateBlockPack assigns author marker", async () => {
560
560
  // standard "inputs incomplete/invalid" contract, e.g. `if (!Valid.safeParse(data).success)
561
561
  // return undefined`) must not crash. Previously applyStorageAndDeriveArgs passed the
562
562
  // undefined value straight to createJsonFieldValue -> Buffer.from(undefined) -> ERR_INVALID_ARG_TYPE,
563
- // aborting the update-block-pack task (reported by AstraZeneca on mixcr-clonotyping 2.14 -> 2.20).
563
+ // aborting the update-block-pack task (seen when upgrading mixcr-clonotyping 2.14 -> 2.20).
564
564
  // The sentinel input [777] makes the enter-numbers model's args() return undefined without throwing.
565
565
  test("v3 blocks: migrateBlockPack does not crash when args() returns undefined", async () => {
566
566
  const quickJs = await getQuickJS();