@milaboratories/pl-middle-layer 1.74.12 → 1.74.14
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.
- package/dist/js_render/service_injectors.cjs +1 -1
- package/dist/js_render/service_injectors.cjs.map +1 -1
- package/dist/js_render/service_injectors.js +1 -1
- package/dist/js_render/service_injectors.js.map +1 -1
- package/dist/middle_layer/build_stamp.cjs +1 -1
- package/dist/middle_layer/build_stamp.js +1 -1
- package/package.json +16 -16
- package/src/js_render/service_injectors.ts +5 -2
- package/src/mutator/project-v3.test.ts +1 -1
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pl-middle-layer",
|
|
3
|
-
"version": "1.74.
|
|
3
|
+
"version": "1.74.14",
|
|
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.
|
|
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.
|
|
26
|
-
"@milaboratories/pf-spec-driver": "1.5.
|
|
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.
|
|
29
|
-
"@milaboratories/pl-crash-recorder": "0.3.
|
|
30
|
-
"@milaboratories/pl-deployments": "3.0.
|
|
31
|
-
"@milaboratories/pl-drivers": "1.16.
|
|
32
|
-
"@milaboratories/pl-errors": "1.4.
|
|
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.
|
|
35
|
-
"@milaboratories/pl-model-common": "1.54.
|
|
36
|
-
"@milaboratories/pl-model-middle-layer": "1.34.
|
|
37
|
-
"@milaboratories/pl-tree": "1.16.
|
|
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.
|
|
41
|
-
"@platforma-sdk/model": "1.86.
|
|
42
|
-
"@platforma-sdk/workflow-tengo": "6.17.
|
|
40
|
+
"@platforma-sdk/block-tools": "2.17.1",
|
|
41
|
+
"@platforma-sdk/model": "1.86.5",
|
|
42
|
+
"@platforma-sdk/workflow-tengo": "6.17.3",
|
|
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<
|
|
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(
|
|
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 (
|
|
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();
|