@milaboratories/pf-spec-driver 1.4.24 → 1.5.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,5 +1,5 @@
1
1
  import { logPFrames } from "./logging.js";
2
- import { createPFrame } from "@milaboratories/pframes-rs-wasm";
2
+ import { createPFrame } from "@milaboratories/pf-spec";
3
3
  import { PFrameDriverError, canonicalizeJson, stringifyJson } from "@milaboratories/pl-model-common";
4
4
  import { RefCountPoolBase } from "@milaboratories/helpers";
5
5
  import { blake3 } from "@noble/hashes/blake3.js";
@@ -1 +1 @@
1
- {"version":3,"file":"pframe_pool.js","names":[],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n PFrameDriverError,\n PColumnSpec,\n SpecFrameHandle,\n stringifyJson,\n canonicalizeJson,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { MiLogger, RefCountPoolBase } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport { createPFrame } from \"@milaboratories/pframes-rs-wasm\";\nimport { blake3 } from \"@noble/hashes/blake3.js\";\nimport { bytesToHex } from \"@noble/hashes/utils.js\";\n\nexport class PFramePool extends RefCountPoolBase<\n Record<string, PColumnSpec>,\n SpecFrameHandle,\n PFrameInternal.PFrameWasmV3\n> {\n constructor(private readonly logger: MiLogger) {\n super();\n }\n\n protected calculateParamsKey(params: Record<string, PColumnSpec>): SpecFrameHandle {\n return bytesToHex(\n blake3(new TextEncoder().encode(canonicalizeJson(params))),\n ) as SpecFrameHandle;\n }\n\n protected createNewResource(\n params: Record<string, PColumnSpec>,\n key: SpecFrameHandle,\n ): PFrameInternal.PFrameWasmV3 {\n if (logPFrames()) {\n this.logger.info(`Creating SpecFrame for handle = ${key}, columns: ` + stringifyJson(params));\n }\n return createPFrame(params);\n }\n\n public getByKey(key: SpecFrameHandle): PFrameInternal.PFrameWasmV3 {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid SpecFrame handle`);\n error.cause = new Error(`SpecFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAa,aAAb,cAAgC,iBAI9B;CAC6B;CAA7B,YAAY,QAAmC;EAC7C,MAAM;EADqB,KAAA,SAAA;CAE7B;CAEA,mBAA6B,QAAsD;EACjF,OAAO,WACL,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,iBAAiB,MAAM,CAAC,CAAC,CAC3D;CACF;CAEA,kBACE,QACA,KAC6B;EAC7B,IAAI,WAAW,GACb,KAAK,OAAO,KAAK,mCAAmC,IAAI,eAAe,cAAc,MAAM,CAAC;EAE9F,OAAO,aAAa,MAAM;CAC5B;CAEA,SAAgB,KAAmD;EACjE,MAAM,WAAW,MAAM,YAAY,GAAG;EACtC,IAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,0BAA0B;GAC9D,MAAM,wBAAQ,IAAI,MAAM,yBAAyB,IAAI,WAAW;GAChE,MAAM;EACR;EACA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"pframe_pool.js","names":[],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n PFrameDriverError,\n PColumnSpec,\n SpecFrameHandle,\n stringifyJson,\n canonicalizeJson,\n} from \"@milaboratories/pl-model-common\";\nimport { MiLogger, RefCountPoolBase } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport { createPFrame, type PFrame } from \"@milaboratories/pf-spec\";\nimport { blake3 } from \"@noble/hashes/blake3.js\";\nimport { bytesToHex } from \"@noble/hashes/utils.js\";\n\nexport class PFramePool extends RefCountPoolBase<\n Record<string, PColumnSpec>,\n SpecFrameHandle,\n PFrame\n> {\n constructor(private readonly logger: MiLogger) {\n super();\n }\n\n protected calculateParamsKey(params: Record<string, PColumnSpec>): SpecFrameHandle {\n return bytesToHex(\n blake3(new TextEncoder().encode(canonicalizeJson(params))),\n ) as SpecFrameHandle;\n }\n\n protected createNewResource(params: Record<string, PColumnSpec>, key: SpecFrameHandle): PFrame {\n if (logPFrames()) {\n this.logger.info(`Creating SpecFrame for handle = ${key}, columns: ` + stringifyJson(params));\n }\n return createPFrame(params);\n }\n\n public getByKey(key: SpecFrameHandle): PFrame {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid SpecFrame handle`);\n error.cause = new Error(`SpecFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;;AAaA,IAAa,aAAb,cAAgC,iBAI9B;CAC6B;CAA7B,YAAY,QAAmC;EAC7C,MAAM;EADqB,KAAA,SAAA;CAE7B;CAEA,mBAA6B,QAAsD;EACjF,OAAO,WACL,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,iBAAiB,MAAM,CAAC,CAAC,CAC3D;CACF;CAEA,kBAA4B,QAAqC,KAA8B;EAC7F,IAAI,WAAW,GACb,KAAK,OAAO,KAAK,mCAAmC,IAAI,eAAe,cAAc,MAAM,CAAC;EAE9F,OAAO,aAAa,MAAM;CAC5B;CAEA,SAAgB,KAA8B;EAC5C,MAAM,WAAW,MAAM,YAAY,GAAG;EACtC,IAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,0BAA0B;GAC9D,MAAM,wBAAQ,IAAI,MAAM,yBAAyB,IAAI,WAAW;GAChE,MAAM;EACR;EACA,OAAO;CACT;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { logPFrames } from "./logging.js";
2
2
  import { PFramePool } from "./pframe_pool.js";
3
- import { buildQuery, collapseAxes, expandAxes, findAxis, findTableColumn, rewriteLegacyFilters } from "@milaboratories/pframes-rs-wasm";
3
+ import { buildQuery, collapseAxes, expandAxes, findAxis, findTableColumn, rewriteLegacyFilters } from "@milaboratories/pf-spec";
4
4
  import { PFrameSpecDriverError, ValueType, ensureError, resolveAnnotationParents } from "@milaboratories/pl-model-common";
5
5
  import { ConsoleLoggerAdapter } from "@milaboratories/helpers";
6
6
  //#region src/spec_driver.ts
@@ -1 +1 @@
1
- {"version":3,"file":"spec_driver.js","names":[],"sources":["../src/spec_driver.ts"],"sourcesContent":["import {\n buildQuery,\n expandAxes,\n collapseAxes,\n findAxis,\n findTableColumn,\n rewriteLegacyFilters,\n} from \"@milaboratories/pframes-rs-wasm\";\nimport type {\n AxesId,\n AxesSpec,\n BuildQueryInput,\n DataQueryBooleanExpression,\n PColumnSpec,\n PFrameSpecDriver,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n SpecFrameHandle,\n SpecQueryJoinEntry,\n PoolEntry,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n DeleteColumnRequest,\n DeleteColumnResponse,\n EvaluateQueryResponse,\n SpecQuery,\n PColumnIdAndSpec,\n} from \"@milaboratories/pl-model-common\";\nimport {\n PFrameSpecDriverError,\n ValueType,\n ensureError,\n resolveAnnotationParents,\n} from \"@milaboratories/pl-model-common\";\nimport { type MiLogger, ConsoleLoggerAdapter } from \"@milaboratories/helpers\";\nimport { PFramePool } from \"./pframe_pool\";\nimport { logPFrames } from \"./logging\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PFrameSpecDriver, AsyncDisposable {\n private readonly logger: MiLogger;\n private readonly frames: PFramePool;\n\n public constructor(options?: { logger?: MiLogger }) {\n this.logger = options?.logger ?? new ConsoleLoggerAdapter();\n this.frames = new PFramePool(this.logger);\n }\n\n createSpecFrame(specs: Record<string, PColumnSpec>): PoolEntry<SpecFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n const filtered = Object.fromEntries(\n Object.entries(specs)\n .filter(([, spec]) => ValueTypes.has(spec.valueType))\n .map(([id, spec]) => [id, resolveAnnotationParents(spec)]),\n );\n try {\n if (logPFrames()) {\n this.logger.info(`createSpecFrame: ${Object.keys(filtered).length} columns`);\n }\n return this.frames.acquire(filtered);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`createSpecFrame failed`);\n error.cause = ensureError(err);\n throw error;\n }\n }\n\n listColumns(handle: SpecFrameHandle): PColumnIdAndSpec[] {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`listColumns: handle = ${handle}`);\n }\n return pframe.listColumns();\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`listColumns failed`);\n error.cause = new Error(`handle: ${handle}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n buildQuery(input: BuildQueryInput): SpecQueryJoinEntry {\n try {\n if (logPFrames()) {\n this.logger.info(`buildQuery: input: ${JSON.stringify(input)}`);\n }\n return buildQuery(input);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`buildQuery failed`);\n error.cause = new Error(`input: ${JSON.stringify(input)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n discoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(\n `discoverColumns: handle = ${handle}, request: ${JSON.stringify(request)}`,\n );\n }\n const result = pframe.discoverColumns(request);\n // Backward-compat shim: pframes-rs >= 1.1.31 dropped the `qualifications`\n return {\n ...result,\n hits: result.hits.map((hit) => ({\n ...hit,\n path: hit.path.map((step) =>\n step.type === \"linker\" ? { ...step, qualifications: [] } : step,\n ),\n })),\n };\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`discoverColumns failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n deleteColumn(handle: SpecFrameHandle, request: DeleteColumnRequest): DeleteColumnResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`deleteColumn: handle = ${handle}, request: ${JSON.stringify(request)}`);\n }\n const result = {\n axes: pframe.deleteColumns({ columns: request.axes, delete: request.delete }).columns,\n };\n return result;\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`deleteColumn failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n evaluateQuery(handle: SpecFrameHandle, request: SpecQuery): EvaluateQueryResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`evaluateQuery: handle = ${handle}, request: ${JSON.stringify(request)}`);\n }\n const result = pframe.evaluateQuery(request);\n return result;\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`evaluateQuery failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n expandAxes(spec: AxesSpec): AxesId {\n try {\n return expandAxes(spec);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`expandAxes failed`);\n error.cause = new Error(`spec: ${JSON.stringify(spec)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n collapseAxes(ids: AxesId): AxesSpec {\n try {\n return collapseAxes(ids);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`collapseAxes failed`);\n error.cause = new Error(`ids: ${JSON.stringify(ids)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n findAxis(spec: AxesSpec, selector: SingleAxisSelector): number {\n try {\n return findAxis(spec, selector);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`findAxis failed`);\n error.cause = new Error(\n `spec: ${JSON.stringify(spec)}, ` +\n `selector: ${JSON.stringify(selector)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number {\n try {\n return findTableColumn(tableSpec, selector);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`findTableColumn failed`);\n error.cause = new Error(\n `selector: ${JSON.stringify(selector)}, ` + `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n rewriteLegacyFilters(request: {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n }): DataQueryBooleanExpression[] {\n try {\n return rewriteLegacyFilters(request);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`rewriteLegacyFilters failed`);\n error.cause = new Error(\n `request: ${JSON.stringify(request)}, ` + `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n async dispose(): Promise<void> {\n await this.frames.dispose();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"spec_driver.js","names":[],"sources":["../src/spec_driver.ts"],"sourcesContent":["import {\n buildQuery,\n expandAxes,\n collapseAxes,\n findAxis,\n findTableColumn,\n rewriteLegacyFilters,\n} from \"@milaboratories/pf-spec\";\nimport type {\n AxesId,\n AxesSpec,\n BuildQueryInput,\n DataQueryBooleanExpression,\n PColumnSpec,\n PFrameSpecDriver,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n SpecFrameHandle,\n SpecQueryJoinEntry,\n PoolEntry,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n DeleteColumnRequest,\n DeleteColumnResponse,\n EvaluateQueryResponse,\n SpecQuery,\n PColumnIdAndSpec,\n} from \"@milaboratories/pl-model-common\";\nimport {\n PFrameSpecDriverError,\n ValueType,\n ensureError,\n resolveAnnotationParents,\n} from \"@milaboratories/pl-model-common\";\nimport { type MiLogger, ConsoleLoggerAdapter } from \"@milaboratories/helpers\";\nimport { PFramePool } from \"./pframe_pool\";\nimport { logPFrames } from \"./logging\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PFrameSpecDriver, AsyncDisposable {\n private readonly logger: MiLogger;\n private readonly frames: PFramePool;\n\n public constructor(options?: { logger?: MiLogger }) {\n this.logger = options?.logger ?? new ConsoleLoggerAdapter();\n this.frames = new PFramePool(this.logger);\n }\n\n createSpecFrame(specs: Record<string, PColumnSpec>): PoolEntry<SpecFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n const filtered = Object.fromEntries(\n Object.entries(specs)\n .filter(([, spec]) => ValueTypes.has(spec.valueType))\n .map(([id, spec]) => [id, resolveAnnotationParents(spec)]),\n );\n try {\n if (logPFrames()) {\n this.logger.info(`createSpecFrame: ${Object.keys(filtered).length} columns`);\n }\n return this.frames.acquire(filtered);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`createSpecFrame failed`);\n error.cause = ensureError(err);\n throw error;\n }\n }\n\n listColumns(handle: SpecFrameHandle): PColumnIdAndSpec[] {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`listColumns: handle = ${handle}`);\n }\n return pframe.listColumns();\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`listColumns failed`);\n error.cause = new Error(`handle: ${handle}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n buildQuery(input: BuildQueryInput): SpecQueryJoinEntry {\n try {\n if (logPFrames()) {\n this.logger.info(`buildQuery: input: ${JSON.stringify(input)}`);\n }\n return buildQuery(input);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`buildQuery failed`);\n error.cause = new Error(`input: ${JSON.stringify(input)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n discoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(\n `discoverColumns: handle = ${handle}, request: ${JSON.stringify(request)}`,\n );\n }\n const result = pframe.discoverColumns(request);\n // Backward-compat shim: pframes-rs >= 1.1.31 dropped the `qualifications`\n return {\n ...result,\n hits: result.hits.map((hit) => ({\n ...hit,\n path: hit.path.map((step) =>\n step.type === \"linker\" ? { ...step, qualifications: [] } : step,\n ),\n })),\n };\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`discoverColumns failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n deleteColumn(handle: SpecFrameHandle, request: DeleteColumnRequest): DeleteColumnResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`deleteColumn: handle = ${handle}, request: ${JSON.stringify(request)}`);\n }\n const result = {\n axes: pframe.deleteColumns({ columns: request.axes, delete: request.delete }).columns,\n };\n return result;\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`deleteColumn failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n evaluateQuery(handle: SpecFrameHandle, request: SpecQuery): EvaluateQueryResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`evaluateQuery: handle = ${handle}, request: ${JSON.stringify(request)}`);\n }\n const result = pframe.evaluateQuery(request);\n return result;\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`evaluateQuery failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n expandAxes(spec: AxesSpec): AxesId {\n try {\n return expandAxes(spec);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`expandAxes failed`);\n error.cause = new Error(`spec: ${JSON.stringify(spec)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n collapseAxes(ids: AxesId): AxesSpec {\n try {\n return collapseAxes(ids);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`collapseAxes failed`);\n error.cause = new Error(`ids: ${JSON.stringify(ids)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n findAxis(spec: AxesSpec, selector: SingleAxisSelector): number {\n try {\n return findAxis(spec, selector);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`findAxis failed`);\n error.cause = new Error(\n `spec: ${JSON.stringify(spec)}, ` +\n `selector: ${JSON.stringify(selector)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number {\n try {\n return findTableColumn(tableSpec, selector);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`findTableColumn failed`);\n error.cause = new Error(\n `selector: ${JSON.stringify(selector)}, ` + `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n rewriteLegacyFilters(request: {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n }): DataQueryBooleanExpression[] {\n try {\n return rewriteLegacyFilters(request);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`rewriteLegacyFilters failed`);\n error.cause = new Error(\n `request: ${JSON.stringify(request)}, ` + `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n async dispose(): Promise<void> {\n await this.frames.dispose();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@milaboratories/pf-spec-driver",
3
- "version": "1.4.24",
4
- "description": "PSpecDriver implementation: spec-only PFrame operations via WASM",
3
+ "version": "1.5.0",
4
+ "description": "PSpecDriver implementation: a handle pool and error handling over pf-spec",
5
5
  "keywords": [],
6
6
  "license": "UNLICENSED",
7
7
  "files": [
@@ -15,28 +15,26 @@
15
15
  "exports": {
16
16
  ".": {
17
17
  "types": "./dist/index.d.ts",
18
- "import": "./dist/index.js",
19
- "require": "./dist/index.cjs"
18
+ "import": "./dist/index.js"
20
19
  }
21
20
  },
22
21
  "dependencies": {
23
- "@milaboratories/pframes-rs-wasm": "1.1.56",
24
22
  "@noble/hashes": "^2.0.1",
23
+ "@milaboratories/pf-spec": "1.0.0",
25
24
  "@milaboratories/helpers": "1.14.5",
26
- "@milaboratories/pl-model-common": "1.47.3",
27
- "@milaboratories/pl-model-middle-layer": "1.30.15"
25
+ "@milaboratories/pl-model-common": "1.47.3"
28
26
  },
29
27
  "devDependencies": {
30
28
  "@vitest/coverage-istanbul": "^4.1.3",
31
29
  "typescript": "~5.9.3",
32
30
  "vitest": "^4.1.3",
33
31
  "@milaboratories/build-configs": "2.0.0",
34
- "@milaboratories/ts-builder": "1.6.1",
35
- "@milaboratories/ts-configs": "1.3.1"
32
+ "@milaboratories/ts-builder": "1.6.2",
33
+ "@milaboratories/ts-configs": "1.4.0"
36
34
  },
37
35
  "scripts": {
38
- "build": "ts-builder build --target node",
39
- "watch": "ts-builder build --target node --watch",
36
+ "build": "ts-builder build --target node --build-config build.config.js",
37
+ "watch": "ts-builder build --target node --build-config build.config.js --watch",
40
38
  "check": "ts-builder check --target node",
41
39
  "formatter:check": "ts-builder formatter --check",
42
40
  "linter:check": "ts-builder linter --check",
@@ -5,17 +5,16 @@ import {
5
5
  stringifyJson,
6
6
  canonicalizeJson,
7
7
  } from "@milaboratories/pl-model-common";
8
- import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
9
8
  import { MiLogger, RefCountPoolBase } from "@milaboratories/helpers";
10
9
  import { logPFrames } from "./logging";
11
- import { createPFrame } from "@milaboratories/pframes-rs-wasm";
10
+ import { createPFrame, type PFrame } from "@milaboratories/pf-spec";
12
11
  import { blake3 } from "@noble/hashes/blake3.js";
13
12
  import { bytesToHex } from "@noble/hashes/utils.js";
14
13
 
15
14
  export class PFramePool extends RefCountPoolBase<
16
15
  Record<string, PColumnSpec>,
17
16
  SpecFrameHandle,
18
- PFrameInternal.PFrameWasmV3
17
+ PFrame
19
18
  > {
20
19
  constructor(private readonly logger: MiLogger) {
21
20
  super();
@@ -27,17 +26,14 @@ export class PFramePool extends RefCountPoolBase<
27
26
  ) as SpecFrameHandle;
28
27
  }
29
28
 
30
- protected createNewResource(
31
- params: Record<string, PColumnSpec>,
32
- key: SpecFrameHandle,
33
- ): PFrameInternal.PFrameWasmV3 {
29
+ protected createNewResource(params: Record<string, PColumnSpec>, key: SpecFrameHandle): PFrame {
34
30
  if (logPFrames()) {
35
31
  this.logger.info(`Creating SpecFrame for handle = ${key}, columns: ` + stringifyJson(params));
36
32
  }
37
33
  return createPFrame(params);
38
34
  }
39
35
 
40
- public getByKey(key: SpecFrameHandle): PFrameInternal.PFrameWasmV3 {
36
+ public getByKey(key: SpecFrameHandle): PFrame {
41
37
  const resource = super.tryGetByKey(key);
42
38
  if (!resource) {
43
39
  const error = new PFrameDriverError(`Invalid SpecFrame handle`);
@@ -5,7 +5,7 @@ import {
5
5
  findAxis,
6
6
  findTableColumn,
7
7
  rewriteLegacyFilters,
8
- } from "@milaboratories/pframes-rs-wasm";
8
+ } from "@milaboratories/pf-spec";
9
9
  import type {
10
10
  AxesId,
11
11
  AxesSpec,
package/dist/index.cjs DELETED
@@ -1,3 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_spec_driver = require("./spec_driver.cjs");
3
- exports.SpecDriver = require_spec_driver.SpecDriver;
package/dist/logging.cjs DELETED
@@ -1,9 +0,0 @@
1
- //#region src/logging.ts
2
- const LogPFrames = Boolean(process.env.MI_LOG_PFRAMES);
3
- function logPFrames() {
4
- return LogPFrames;
5
- }
6
- //#endregion
7
- exports.logPFrames = logPFrames;
8
-
9
- //# sourceMappingURL=logging.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.cjs","names":[],"sources":["../src/logging.ts"],"sourcesContent":["const LogPFrames = Boolean(process.env.MI_LOG_PFRAMES);\n\nexport function logPFrames(): boolean {\n return LogPFrames;\n}\n"],"mappings":";AAAA,MAAM,aAAa,QAAQ,QAAQ,IAAI,cAAc;AAErD,SAAgB,aAAsB;CACpC,OAAO;AACT"}
@@ -1,34 +0,0 @@
1
- const require_logging = require("./logging.cjs");
2
- let _milaboratories_pframes_rs_wasm = require("@milaboratories/pframes-rs-wasm");
3
- let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
4
- let _milaboratories_helpers = require("@milaboratories/helpers");
5
- let _noble_hashes_blake3_js = require("@noble/hashes/blake3.js");
6
- let _noble_hashes_utils_js = require("@noble/hashes/utils.js");
7
- //#region src/pframe_pool.ts
8
- var PFramePool = class extends _milaboratories_helpers.RefCountPoolBase {
9
- logger;
10
- constructor(logger) {
11
- super();
12
- this.logger = logger;
13
- }
14
- calculateParamsKey(params) {
15
- return (0, _noble_hashes_utils_js.bytesToHex)((0, _noble_hashes_blake3_js.blake3)(new TextEncoder().encode((0, _milaboratories_pl_model_common.canonicalizeJson)(params))));
16
- }
17
- createNewResource(params, key) {
18
- if (require_logging.logPFrames()) this.logger.info(`Creating SpecFrame for handle = ${key}, columns: ` + (0, _milaboratories_pl_model_common.stringifyJson)(params));
19
- return (0, _milaboratories_pframes_rs_wasm.createPFrame)(params);
20
- }
21
- getByKey(key) {
22
- const resource = super.tryGetByKey(key);
23
- if (!resource) {
24
- const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid SpecFrame handle`);
25
- error.cause = /* @__PURE__ */ new Error(`SpecFrame with handle ${key} not found`);
26
- throw error;
27
- }
28
- return resource;
29
- }
30
- };
31
- //#endregion
32
- exports.PFramePool = PFramePool;
33
-
34
- //# sourceMappingURL=pframe_pool.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pframe_pool.cjs","names":["RefCountPoolBase","logPFrames","PFrameDriverError"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n PFrameDriverError,\n PColumnSpec,\n SpecFrameHandle,\n stringifyJson,\n canonicalizeJson,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { MiLogger, RefCountPoolBase } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport { createPFrame } from \"@milaboratories/pframes-rs-wasm\";\nimport { blake3 } from \"@noble/hashes/blake3.js\";\nimport { bytesToHex } from \"@noble/hashes/utils.js\";\n\nexport class PFramePool extends RefCountPoolBase<\n Record<string, PColumnSpec>,\n SpecFrameHandle,\n PFrameInternal.PFrameWasmV3\n> {\n constructor(private readonly logger: MiLogger) {\n super();\n }\n\n protected calculateParamsKey(params: Record<string, PColumnSpec>): SpecFrameHandle {\n return bytesToHex(\n blake3(new TextEncoder().encode(canonicalizeJson(params))),\n ) as SpecFrameHandle;\n }\n\n protected createNewResource(\n params: Record<string, PColumnSpec>,\n key: SpecFrameHandle,\n ): PFrameInternal.PFrameWasmV3 {\n if (logPFrames()) {\n this.logger.info(`Creating SpecFrame for handle = ${key}, columns: ` + stringifyJson(params));\n }\n return createPFrame(params);\n }\n\n public getByKey(key: SpecFrameHandle): PFrameInternal.PFrameWasmV3 {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid SpecFrame handle`);\n error.cause = new Error(`SpecFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAa,aAAb,cAAgCA,wBAAAA,iBAI9B;CAC6B;CAA7B,YAAY,QAAmC;EAC7C,MAAM;EADqB,KAAA,SAAA;CAE7B;CAEA,mBAA6B,QAAsD;EACjF,QAAA,GAAA,uBAAA,WAAA,EAAA,GAAA,wBAAA,OAAA,CACS,IAAI,YAAY,CAAC,CAAC,QAAA,GAAA,gCAAA,iBAAA,CAAwB,MAAM,CAAC,CAAC,CAC3D;CACF;CAEA,kBACE,QACA,KAC6B;EAC7B,IAAIC,gBAAAA,WAAW,GACb,KAAK,OAAO,KAAK,mCAAmC,IAAI,gBAAA,GAAA,gCAAA,cAAA,CAA6B,MAAM,CAAC;EAE9F,QAAA,GAAA,gCAAA,aAAA,CAAoB,MAAM;CAC5B;CAEA,SAAgB,KAAmD;EACjE,MAAM,WAAW,MAAM,YAAY,GAAG;EACtC,IAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,0BAA0B;GAC9D,MAAM,wBAAQ,IAAI,MAAM,yBAAyB,IAAI,WAAW;GAChE,MAAM;EACR;EACA,OAAO;CACT;AACF"}
@@ -1,153 +0,0 @@
1
- const require_logging = require("./logging.cjs");
2
- const require_pframe_pool = require("./pframe_pool.cjs");
3
- let _milaboratories_pframes_rs_wasm = require("@milaboratories/pframes-rs-wasm");
4
- let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
5
- let _milaboratories_helpers = require("@milaboratories/helpers");
6
- //#region src/spec_driver.ts
7
- /**
8
- * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
9
- *
10
- * All operations are synchronous — WASM computes results immediately.
11
- */
12
- var SpecDriver = class {
13
- logger;
14
- frames;
15
- constructor(options) {
16
- this.logger = options?.logger ?? new _milaboratories_helpers.ConsoleLoggerAdapter();
17
- this.frames = new require_pframe_pool.PFramePool(this.logger);
18
- }
19
- createSpecFrame(specs) {
20
- const ValueTypes = new Set(Object.values(_milaboratories_pl_model_common.ValueType));
21
- const filtered = Object.fromEntries(Object.entries(specs).filter(([, spec]) => ValueTypes.has(spec.valueType)).map(([id, spec]) => [id, (0, _milaboratories_pl_model_common.resolveAnnotationParents)(spec)]));
22
- try {
23
- if (require_logging.logPFrames()) this.logger.info(`createSpecFrame: ${Object.keys(filtered).length} columns`);
24
- return this.frames.acquire(filtered);
25
- } catch (err) {
26
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`createSpecFrame failed`);
27
- error.cause = (0, _milaboratories_pl_model_common.ensureError)(err);
28
- throw error;
29
- }
30
- }
31
- listColumns(handle) {
32
- const pframe = this.frames.getByKey(handle);
33
- try {
34
- if (require_logging.logPFrames()) this.logger.info(`listColumns: handle = ${handle}`);
35
- return pframe.listColumns();
36
- } catch (err) {
37
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`listColumns failed`);
38
- error.cause = /* @__PURE__ */ new Error(`handle: ${handle}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
39
- throw error;
40
- }
41
- }
42
- buildQuery(input) {
43
- try {
44
- if (require_logging.logPFrames()) this.logger.info(`buildQuery: input: ${JSON.stringify(input)}`);
45
- return (0, _milaboratories_pframes_rs_wasm.buildQuery)(input);
46
- } catch (err) {
47
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`buildQuery failed`);
48
- error.cause = /* @__PURE__ */ new Error(`input: ${JSON.stringify(input)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
49
- throw error;
50
- }
51
- }
52
- discoverColumns(handle, request) {
53
- const pframe = this.frames.getByKey(handle);
54
- try {
55
- if (require_logging.logPFrames()) this.logger.info(`discoverColumns: handle = ${handle}, request: ${JSON.stringify(request)}`);
56
- const result = pframe.discoverColumns(request);
57
- return {
58
- ...result,
59
- hits: result.hits.map((hit) => ({
60
- ...hit,
61
- path: hit.path.map((step) => step.type === "linker" ? {
62
- ...step,
63
- qualifications: []
64
- } : step)
65
- }))
66
- };
67
- } catch (err) {
68
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`discoverColumns failed`);
69
- error.cause = /* @__PURE__ */ new Error(`handle: ${handle}, request: ${JSON.stringify(request)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
70
- throw error;
71
- }
72
- }
73
- deleteColumn(handle, request) {
74
- const pframe = this.frames.getByKey(handle);
75
- try {
76
- if (require_logging.logPFrames()) this.logger.info(`deleteColumn: handle = ${handle}, request: ${JSON.stringify(request)}`);
77
- return { axes: pframe.deleteColumns({
78
- columns: request.axes,
79
- delete: request.delete
80
- }).columns };
81
- } catch (err) {
82
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`deleteColumn failed`);
83
- error.cause = /* @__PURE__ */ new Error(`handle: ${handle}, request: ${JSON.stringify(request)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
84
- throw error;
85
- }
86
- }
87
- evaluateQuery(handle, request) {
88
- const pframe = this.frames.getByKey(handle);
89
- try {
90
- if (require_logging.logPFrames()) this.logger.info(`evaluateQuery: handle = ${handle}, request: ${JSON.stringify(request)}`);
91
- return pframe.evaluateQuery(request);
92
- } catch (err) {
93
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`evaluateQuery failed`);
94
- error.cause = /* @__PURE__ */ new Error(`handle: ${handle}, request: ${JSON.stringify(request)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
95
- throw error;
96
- }
97
- }
98
- expandAxes(spec) {
99
- try {
100
- return (0, _milaboratories_pframes_rs_wasm.expandAxes)(spec);
101
- } catch (err) {
102
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`expandAxes failed`);
103
- error.cause = /* @__PURE__ */ new Error(`spec: ${JSON.stringify(spec)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
104
- throw error;
105
- }
106
- }
107
- collapseAxes(ids) {
108
- try {
109
- return (0, _milaboratories_pframes_rs_wasm.collapseAxes)(ids);
110
- } catch (err) {
111
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`collapseAxes failed`);
112
- error.cause = /* @__PURE__ */ new Error(`ids: ${JSON.stringify(ids)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
113
- throw error;
114
- }
115
- }
116
- findAxis(spec, selector) {
117
- try {
118
- return (0, _milaboratories_pframes_rs_wasm.findAxis)(spec, selector);
119
- } catch (err) {
120
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`findAxis failed`);
121
- error.cause = /* @__PURE__ */ new Error(`spec: ${JSON.stringify(spec)}, selector: ${JSON.stringify(selector)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
122
- throw error;
123
- }
124
- }
125
- findTableColumn(tableSpec, selector) {
126
- try {
127
- return (0, _milaboratories_pframes_rs_wasm.findTableColumn)(tableSpec, selector);
128
- } catch (err) {
129
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`findTableColumn failed`);
130
- error.cause = /* @__PURE__ */ new Error(`selector: ${JSON.stringify(selector)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
131
- throw error;
132
- }
133
- }
134
- rewriteLegacyFilters(request) {
135
- try {
136
- return (0, _milaboratories_pframes_rs_wasm.rewriteLegacyFilters)(request);
137
- } catch (err) {
138
- const error = new _milaboratories_pl_model_common.PFrameSpecDriverError(`rewriteLegacyFilters failed`);
139
- error.cause = /* @__PURE__ */ new Error(`request: ${JSON.stringify(request)}, error:\n${(0, _milaboratories_pl_model_common.ensureError)(err)}`);
140
- throw error;
141
- }
142
- }
143
- async dispose() {
144
- await this.frames.dispose();
145
- }
146
- async [Symbol.asyncDispose]() {
147
- await this.dispose();
148
- }
149
- };
150
- //#endregion
151
- exports.SpecDriver = SpecDriver;
152
-
153
- //# sourceMappingURL=spec_driver.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec_driver.cjs","names":["ConsoleLoggerAdapter","PFramePool","ValueType","logPFrames","PFrameSpecDriverError"],"sources":["../src/spec_driver.ts"],"sourcesContent":["import {\n buildQuery,\n expandAxes,\n collapseAxes,\n findAxis,\n findTableColumn,\n rewriteLegacyFilters,\n} from \"@milaboratories/pframes-rs-wasm\";\nimport type {\n AxesId,\n AxesSpec,\n BuildQueryInput,\n DataQueryBooleanExpression,\n PColumnSpec,\n PFrameSpecDriver,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n SingleAxisSelector,\n SpecFrameHandle,\n SpecQueryJoinEntry,\n PoolEntry,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n DeleteColumnRequest,\n DeleteColumnResponse,\n EvaluateQueryResponse,\n SpecQuery,\n PColumnIdAndSpec,\n} from \"@milaboratories/pl-model-common\";\nimport {\n PFrameSpecDriverError,\n ValueType,\n ensureError,\n resolveAnnotationParents,\n} from \"@milaboratories/pl-model-common\";\nimport { type MiLogger, ConsoleLoggerAdapter } from \"@milaboratories/helpers\";\nimport { PFramePool } from \"./pframe_pool\";\nimport { logPFrames } from \"./logging\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PFrameSpecDriver, AsyncDisposable {\n private readonly logger: MiLogger;\n private readonly frames: PFramePool;\n\n public constructor(options?: { logger?: MiLogger }) {\n this.logger = options?.logger ?? new ConsoleLoggerAdapter();\n this.frames = new PFramePool(this.logger);\n }\n\n createSpecFrame(specs: Record<string, PColumnSpec>): PoolEntry<SpecFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n const filtered = Object.fromEntries(\n Object.entries(specs)\n .filter(([, spec]) => ValueTypes.has(spec.valueType))\n .map(([id, spec]) => [id, resolveAnnotationParents(spec)]),\n );\n try {\n if (logPFrames()) {\n this.logger.info(`createSpecFrame: ${Object.keys(filtered).length} columns`);\n }\n return this.frames.acquire(filtered);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`createSpecFrame failed`);\n error.cause = ensureError(err);\n throw error;\n }\n }\n\n listColumns(handle: SpecFrameHandle): PColumnIdAndSpec[] {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`listColumns: handle = ${handle}`);\n }\n return pframe.listColumns();\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`listColumns failed`);\n error.cause = new Error(`handle: ${handle}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n buildQuery(input: BuildQueryInput): SpecQueryJoinEntry {\n try {\n if (logPFrames()) {\n this.logger.info(`buildQuery: input: ${JSON.stringify(input)}`);\n }\n return buildQuery(input);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`buildQuery failed`);\n error.cause = new Error(`input: ${JSON.stringify(input)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n discoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(\n `discoverColumns: handle = ${handle}, request: ${JSON.stringify(request)}`,\n );\n }\n const result = pframe.discoverColumns(request);\n // Backward-compat shim: pframes-rs >= 1.1.31 dropped the `qualifications`\n return {\n ...result,\n hits: result.hits.map((hit) => ({\n ...hit,\n path: hit.path.map((step) =>\n step.type === \"linker\" ? { ...step, qualifications: [] } : step,\n ),\n })),\n };\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`discoverColumns failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n deleteColumn(handle: SpecFrameHandle, request: DeleteColumnRequest): DeleteColumnResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`deleteColumn: handle = ${handle}, request: ${JSON.stringify(request)}`);\n }\n const result = {\n axes: pframe.deleteColumns({ columns: request.axes, delete: request.delete }).columns,\n };\n return result;\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`deleteColumn failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n evaluateQuery(handle: SpecFrameHandle, request: SpecQuery): EvaluateQueryResponse {\n const pframe = this.frames.getByKey(handle);\n try {\n if (logPFrames()) {\n this.logger.info(`evaluateQuery: handle = ${handle}, request: ${JSON.stringify(request)}`);\n }\n const result = pframe.evaluateQuery(request);\n return result;\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`evaluateQuery failed`);\n error.cause = new Error(\n `handle: ${handle}, ` +\n `request: ${JSON.stringify(request)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n expandAxes(spec: AxesSpec): AxesId {\n try {\n return expandAxes(spec);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`expandAxes failed`);\n error.cause = new Error(`spec: ${JSON.stringify(spec)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n collapseAxes(ids: AxesId): AxesSpec {\n try {\n return collapseAxes(ids);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`collapseAxes failed`);\n error.cause = new Error(`ids: ${JSON.stringify(ids)}, ` + `error:\\n${ensureError(err)}`);\n throw error;\n }\n }\n\n findAxis(spec: AxesSpec, selector: SingleAxisSelector): number {\n try {\n return findAxis(spec, selector);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`findAxis failed`);\n error.cause = new Error(\n `spec: ${JSON.stringify(spec)}, ` +\n `selector: ${JSON.stringify(selector)}, ` +\n `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number {\n try {\n return findTableColumn(tableSpec, selector);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`findTableColumn failed`);\n error.cause = new Error(\n `selector: ${JSON.stringify(selector)}, ` + `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n rewriteLegacyFilters(request: {\n tableSpec: PTableColumnSpec[];\n filters: PTableRecordFilter[];\n }): DataQueryBooleanExpression[] {\n try {\n return rewriteLegacyFilters(request);\n } catch (err: unknown) {\n const error = new PFrameSpecDriverError(`rewriteLegacyFilters failed`);\n error.cause = new Error(\n `request: ${JSON.stringify(request)}, ` + `error:\\n${ensureError(err)}`,\n );\n throw error;\n }\n }\n\n async dispose(): Promise<void> {\n await this.frames.dispose();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n}\n"],"mappings":"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"}