@milaboratories/pl-model-common 1.29.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/bmodel/block_config.d.ts +1 -0
  2. package/dist/bmodel/code.d.ts +1 -0
  3. package/dist/driver_kit.d.ts +1 -1
  4. package/dist/drivers/index.d.ts +6 -6
  5. package/dist/drivers/index.js +1 -1
  6. package/dist/drivers/pframe/driver.cjs.map +1 -1
  7. package/dist/drivers/pframe/driver.d.ts +13 -5
  8. package/dist/drivers/pframe/driver.js.map +1 -1
  9. package/dist/drivers/pframe/index.d.ts +5 -5
  10. package/dist/drivers/pframe/index.js +1 -1
  11. package/dist/drivers/pframe/pframe.d.ts +2 -2
  12. package/dist/drivers/pframe/query/query_common.d.ts +2 -2
  13. package/dist/drivers/pframe/query/query_data.d.ts +1 -1
  14. package/dist/drivers/pframe/query/query_spec.d.ts +2 -2
  15. package/dist/drivers/pframe/spec/ids.d.ts +2 -2
  16. package/dist/drivers/pframe/spec/index.d.ts +1 -1
  17. package/dist/drivers/pframe/spec/index.js +1 -1
  18. package/dist/drivers/pframe/spec/selectors.d.ts +1 -1
  19. package/dist/drivers/pframe/spec/spec.cjs +14 -1
  20. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  21. package/dist/drivers/pframe/spec/spec.d.ts +7 -1
  22. package/dist/drivers/pframe/spec/spec.js +14 -2
  23. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  24. package/dist/drivers/pframe/spec_driver.d.ts +36 -6
  25. package/dist/drivers/pframe/table_calculate.d.ts +2 -2
  26. package/dist/drivers/pframe/table_common.d.ts +1 -1
  27. package/dist/drivers/pframe/unique_values.d.ts +2 -2
  28. package/dist/errors.cjs +48 -0
  29. package/dist/errors.cjs.map +1 -1
  30. package/dist/errors.d.ts +25 -1
  31. package/dist/errors.js +37 -1
  32. package/dist/errors.js.map +1 -1
  33. package/dist/flags/block_flags.cjs.map +1 -1
  34. package/dist/flags/block_flags.d.ts +4 -1
  35. package/dist/flags/block_flags.js.map +1 -1
  36. package/dist/flags/flag_utils.d.ts +1 -1
  37. package/dist/flags/index.d.ts +3 -0
  38. package/dist/index.cjs +38 -0
  39. package/dist/index.d.ts +30 -21
  40. package/dist/index.js +11 -3
  41. package/dist/pool/query.d.ts +1 -1
  42. package/dist/pool_entry.cjs +30 -0
  43. package/dist/pool_entry.cjs.map +1 -0
  44. package/dist/pool_entry.d.ts +30 -0
  45. package/dist/pool_entry.js +29 -0
  46. package/dist/pool_entry.js.map +1 -0
  47. package/dist/services/index.cjs +6 -0
  48. package/dist/services/index.d.ts +6 -0
  49. package/dist/services/index.js +6 -0
  50. package/dist/services/service_capabilities.cjs +51 -0
  51. package/dist/services/service_capabilities.cjs.map +1 -0
  52. package/dist/services/service_capabilities.d.ts +33 -0
  53. package/dist/services/service_capabilities.js +46 -0
  54. package/dist/services/service_capabilities.js.map +1 -0
  55. package/dist/services/service_declarations.cjs +17 -0
  56. package/dist/services/service_declarations.cjs.map +1 -0
  57. package/dist/services/service_declarations.d.ts +16 -0
  58. package/dist/services/service_declarations.js +17 -0
  59. package/dist/services/service_declarations.js.map +1 -0
  60. package/dist/services/service_injector_factory.cjs +19 -0
  61. package/dist/services/service_injector_factory.cjs.map +1 -0
  62. package/dist/services/service_injector_factory.d.ts +8 -0
  63. package/dist/services/service_injector_factory.js +18 -0
  64. package/dist/services/service_injector_factory.js.map +1 -0
  65. package/dist/services/service_injectors.cjs +48 -0
  66. package/dist/services/service_injectors.cjs.map +1 -0
  67. package/dist/services/service_injectors.d.ts +23 -0
  68. package/dist/services/service_injectors.js +46 -0
  69. package/dist/services/service_injectors.js.map +1 -0
  70. package/dist/services/service_registry.cjs +52 -0
  71. package/dist/services/service_registry.cjs.map +1 -0
  72. package/dist/services/service_registry.d.ts +25 -0
  73. package/dist/services/service_registry.js +51 -0
  74. package/dist/services/service_registry.js.map +1 -0
  75. package/dist/services/service_types.cjs +30 -0
  76. package/dist/services/service_types.cjs.map +1 -0
  77. package/dist/services/service_types.d.ts +45 -0
  78. package/dist/services/service_types.js +28 -0
  79. package/dist/services/service_types.js.map +1 -0
  80. package/package.json +3 -3
  81. package/src/drivers/pframe/driver.ts +11 -1
  82. package/src/drivers/pframe/spec/spec.ts +16 -2
  83. package/src/drivers/pframe/spec_driver.ts +37 -5
  84. package/src/errors.ts +53 -0
  85. package/src/flags/block_flags.ts +5 -2
  86. package/src/index.ts +2 -0
  87. package/src/pool_entry.ts +42 -0
  88. package/src/services/index.ts +5 -0
  89. package/src/services/service_capabilities.test.ts +119 -0
  90. package/src/services/service_capabilities.ts +64 -0
  91. package/src/services/service_declarations.ts +25 -0
  92. package/src/services/service_injector_factory.ts +27 -0
  93. package/src/services/service_injectors.ts +79 -0
  94. package/src/services/service_registry.test.ts +69 -0
  95. package/src/services/service_registry.ts +94 -0
  96. package/src/services/service_types.ts +114 -0
@@ -1 +1 @@
1
- {"version":3,"file":"spec.js","names":[],"sources":["../../../../src/drivers/pframe/spec/spec.ts"],"sourcesContent":["import { ensureError } from \"../../../errors\";\nimport { canonicalizeJson, type CanonicalizedJson, type StringifiedJson } from \"../../../json\";\nimport type { PObject, PObjectId, PObjectSpec } from \"../../../pool\";\nimport { z } from \"zod\";\n\nexport const ValueType = {\n Int: \"Int\",\n Long: \"Long\",\n Float: \"Float\",\n Double: \"Double\",\n String: \"String\",\n Bytes: \"Bytes\",\n} as const;\n\nexport type AxisValueType = Extract<ValueType, \"Int\" | \"Long\" | \"String\">;\nexport type ColumnValueType = ValueType;\n\n/** PFrame columns and axes within them may store one of these types. */\nexport type ValueType = (typeof ValueType)[keyof typeof ValueType];\n\nexport type Metadata = Record<string, string>;\n\nexport function readMetadata<U extends Metadata, T extends keyof U = keyof U>(\n metadata: Metadata | undefined,\n key: T,\n): U[T] | undefined {\n return (metadata as U | undefined)?.[key];\n}\n\ntype MetadataJsonImpl<M> = {\n [P in keyof M as M[P] extends StringifiedJson ? P : never]: M[P] extends StringifiedJson<infer U>\n ? z.ZodType<U>\n : never;\n};\nexport type MetadataJson<M> = MetadataJsonImpl<Required<M>>;\n\nexport function readMetadataJsonOrThrow<M extends Metadata, T extends keyof MetadataJson<M>>(\n metadata: Metadata | undefined,\n metadataJson: MetadataJson<M>,\n key: T,\n methodNameInError: string = \"readMetadataJsonOrThrow\",\n): z.infer<MetadataJson<M>[T]> | undefined {\n const json = readMetadata<M, T>(metadata, key);\n if (json === undefined) return undefined;\n\n const schema = metadataJson[key];\n try {\n const value = JSON.parse(json);\n return schema.parse(value);\n } catch (error: unknown) {\n throw new Error(\n `${methodNameInError} failed, ` +\n `key: ${String(key)}, ` +\n `value: ${json}, ` +\n `error: ${ensureError(error)}`,\n );\n }\n}\n\nexport function readMetadataJson<M extends Metadata, T extends keyof MetadataJson<M>>(\n metadata: Metadata | undefined,\n metadataJson: MetadataJson<M>,\n key: T,\n): z.infer<MetadataJson<M>[T]> | undefined {\n try {\n return readMetadataJsonOrThrow(metadata, metadataJson, key);\n } catch {\n return undefined; // treat invalid values as unset\n }\n}\n\n/// Well-known domains\nexport const Domain = {\n Alphabet: \"pl7.app/alphabet\",\n BlockId: \"pl7.app/blockId\",\n VDJ: {\n Clustering: {\n BlockId: \"pl7.app/vdj/clustering/blockId\",\n },\n ScClonotypeChain: {\n Index: \"pl7.app/vdj/scClonotypeChain/index\",\n },\n },\n} as const;\n\nexport type Domain = Metadata &\n Partial<{\n [Domain.Alphabet]: \"nucleotide\" | \"aminoacid\" | (string & {});\n [Domain.BlockId]: string;\n [Domain.VDJ.ScClonotypeChain.Index]: \"primary\" | \"secondary\" | (string & {});\n }>;\n\nexport type DomainJson = MetadataJson<Domain>;\nexport const DomainJson: DomainJson = {};\n\n/// Helper function for reading plain domain values\nexport function readDomain<T extends keyof Domain>(\n spec: { domain?: Metadata | undefined } | undefined,\n key: T,\n): Domain[T] | undefined {\n return readMetadata<Domain, T>(spec?.domain, key);\n}\n\n/// Helper function for reading json-encoded domain values, throws on JSON parsing error\nexport function readDomainJsonOrThrow<T extends keyof DomainJson>(\n spec: { domain?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<DomainJson[T]> | undefined {\n return readMetadataJsonOrThrow<Domain, T>(spec?.domain, DomainJson, key, \"readDomainJsonOrThrow\");\n}\n\n/// Helper function for reading json-encoded domain values, returns undefined on JSON parsing error\nexport function readDomainJson<T extends keyof DomainJson>(\n spec: { domain?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<DomainJson[T]> | undefined {\n return readMetadataJson<Domain, T>(spec?.domain, DomainJson, key);\n}\n\n/// Well-known annotations\nexport const Annotation = {\n AxisNature: \"pl7.app/axisNature\",\n Alphabet: \"pl7.app/alphabet\",\n Description: \"pl7.app/description\",\n DiscreteValues: \"pl7.app/discreteValues\",\n Format: \"pl7.app/format\",\n Graph: {\n Axis: {\n HighCardinality: \"pl7.app/graph/axis/highCardinality\",\n LowerLimit: \"pl7.app/graph/axis/lowerLimit\",\n SymmetricRange: \"pl7.app/graph/axis/symmetricRange\",\n UpperLimit: \"pl7.app/graph/axis/upperLimit\",\n },\n IsDenseAxis: \"pl7.app/graph/isDenseAxis\",\n IsVirtual: \"pl7.app/graph/isVirtual\",\n Palette: \"pl7.app/graph/palette\",\n Thresholds: \"pl7.app/graph/thresholds\",\n TreatAbsentValuesAs: \"pl7.app/graph/treatAbsentValuesAs\",\n },\n HideDataFromUi: \"pl7.app/hideDataFromUi\",\n HideDataFromGraphs: \"pl7.app/hideDataFromGraphs\",\n IsDiscreteFilter: \"pl7.app/isDiscreteFilter\",\n IsAnchor: \"pl7.app/isAnchor\",\n IsLinkerColumn: \"pl7.app/isLinkerColumn\",\n IsScore: \"pl7.app/isScore\",\n IsSubset: \"pl7.app/isSubset\",\n Label: \"pl7.app/label\",\n Max: \"pl7.app/max\",\n Min: \"pl7.app/min\",\n MultipliesBy: \"pl7.app/multipliesBy\",\n Parents: \"pl7.app/parents\",\n Score: {\n DefaultCutoff: \"pl7.app/score/defaultCutoff\",\n RankingOrder: \"pl7.app/score/rankingOrder\",\n },\n Sequence: {\n Annotation: {\n Mapping: \"pl7.app/sequence/annotation/mapping\",\n },\n IsAnnotation: \"pl7.app/sequence/isAnnotation\",\n },\n Table: {\n FontFamily: \"pl7.app/table/fontFamily\",\n OrderPriority: \"pl7.app/table/orderPriority\",\n Visibility: \"pl7.app/table/visibility\",\n },\n Trace: \"pl7.app/trace\",\n VDJ: {\n IsAssemblingFeature: \"pl7.app/vdj/isAssemblingFeature\",\n IsMainSequence: \"pl7.app/vdj/isMainSequence\",\n },\n} as const;\n\nexport type Annotation = Metadata &\n Partial<{\n [Annotation.Alphabet]: \"nucleotide\" | \"aminoacid\" | (string & {});\n [Annotation.AxisNature]: \"homogeneous\" | \"heterogeneous\" | \"scaleCompatible\" | (string & {});\n [Annotation.Description]: string;\n [Annotation.DiscreteValues]: StringifiedJson<number[]> | StringifiedJson<string[]>;\n [Annotation.Format]: string;\n [Annotation.Graph.Axis.HighCardinality]: StringifiedJson<boolean>;\n [Annotation.Graph.Axis.LowerLimit]: StringifiedJson<number>;\n [Annotation.Graph.Axis.SymmetricRange]: StringifiedJson<boolean>;\n [Annotation.Graph.Axis.UpperLimit]: StringifiedJson<number>;\n [Annotation.Graph.IsDenseAxis]: StringifiedJson<boolean>;\n [Annotation.Graph.IsVirtual]: StringifiedJson<boolean>;\n [Annotation.Graph.Palette]: StringifiedJson<{ mapping: Record<string, number>; name: string }>;\n [Annotation.Graph.Thresholds]: StringifiedJson<\n { columnId: { valueType: ValueType; name: string }; value: number }[]\n >;\n [Annotation.Graph.TreatAbsentValuesAs]: StringifiedJson<number>;\n [Annotation.HideDataFromGraphs]: StringifiedJson<boolean>;\n [Annotation.HideDataFromUi]: StringifiedJson<boolean>;\n [Annotation.IsDiscreteFilter]: StringifiedJson<boolean>;\n [Annotation.IsLinkerColumn]: StringifiedJson<boolean>;\n [Annotation.IsSubset]: StringifiedJson<boolean>;\n [Annotation.Label]: string;\n [Annotation.Max]: StringifiedJson<number>;\n [Annotation.Min]: StringifiedJson<number>;\n [Annotation.MultipliesBy]: StringifiedJson<AxisSpec[\"name\"][]>;\n [Annotation.Parents]: StringifiedJson<AxisSpec[\"name\"][]>;\n [Annotation.Sequence.Annotation.Mapping]: StringifiedJson<Record<string, string>>;\n [Annotation.Sequence.IsAnnotation]: StringifiedJson<boolean>;\n [Annotation.Table.FontFamily]: string;\n [Annotation.Table.OrderPriority]: StringifiedJson<number>;\n [Annotation.Table.Visibility]: \"hidden\" | \"optional\" | (string & {});\n [Annotation.Trace]: StringifiedJson<Record<string, unknown>>;\n [Annotation.VDJ.IsAssemblingFeature]: StringifiedJson<boolean>;\n }>;\n\n// export const AxisSpec = z.object({\n// type: z.nativeEnum(ValueType),\n// name: z.string(),\n// domain: z.record(z.string(), z.string()).optional(),\n// annotations: z.record(z.string(), z.string()).optional(),\n// parentAxes: z.array(z.number()).optional(),\n// }).passthrough();\n//\n// type Expect<T extends true> = T;\n// type Equal<X, Y> =\n// (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n//\n// type _test = Expect<Equal<\n// Readonly<z.infer<typeof AxisSpec>>,\n// Readonly<AxisSpec & Record<string, unknown>>\n// >>;\n\nexport type AnnotationJson = MetadataJson<Annotation>;\n\nconst ValueTypeSchema = z.enum([\"Int\", \"Long\", \"Float\", \"Double\", \"String\"] as const);\nexport const AnnotationJson: AnnotationJson = {\n [Annotation.DiscreteValues]: z.array(z.string()).or(z.array(z.number())),\n [Annotation.Graph.Axis.HighCardinality]: z.boolean(),\n [Annotation.Graph.Axis.LowerLimit]: z.number(),\n [Annotation.Graph.Axis.UpperLimit]: z.number(),\n [Annotation.Graph.Axis.SymmetricRange]: z.boolean(),\n [Annotation.Graph.IsDenseAxis]: z.boolean(),\n [Annotation.Graph.Palette]: z.object({ mapping: z.record(z.number()), name: z.string() }),\n [Annotation.Graph.Thresholds]: z.array(\n z.object({\n columnId: z.object({ valueType: ValueTypeSchema, name: z.string() }),\n value: z.number(),\n }),\n ),\n [Annotation.Graph.TreatAbsentValuesAs]: z.number(),\n [Annotation.Graph.IsVirtual]: z.boolean(),\n [Annotation.HideDataFromUi]: z.boolean(),\n [Annotation.HideDataFromGraphs]: z.boolean(),\n [Annotation.IsDiscreteFilter]: z.boolean(),\n [Annotation.IsLinkerColumn]: z.boolean(),\n [Annotation.IsSubset]: z.boolean(),\n [Annotation.Max]: z.number(),\n [Annotation.Min]: z.number(),\n [Annotation.MultipliesBy]: z.array(z.string()),\n [Annotation.Parents]: z.array(z.string()),\n [Annotation.Sequence.Annotation.Mapping]: z.record(z.string(), z.string()),\n [Annotation.Sequence.IsAnnotation]: z.boolean(),\n [Annotation.Table.OrderPriority]: z.number(),\n [Annotation.Trace]: z.record(z.string(), z.unknown()),\n [Annotation.VDJ.IsAssemblingFeature]: z.boolean(),\n};\n\n/// Helper function for reading plain annotation values\nexport function readAnnotation<T extends keyof Annotation>(\n spec: { annotations?: Metadata | undefined } | undefined,\n key: T,\n): Annotation[T] | undefined {\n return readMetadata<Annotation, T>(spec?.annotations, key);\n}\n\n/// Helper function for reading json-encoded annotation values, throws on JSON parsing error\nexport function readAnnotationJsonOrThrow<T extends keyof AnnotationJson>(\n spec: { annotations?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<AnnotationJson[T]> | undefined {\n return readMetadataJsonOrThrow<Annotation, T>(\n spec?.annotations,\n AnnotationJson,\n key,\n \"readAnnotationJsonOrThrow\",\n );\n}\n\n/// Helper function for reading json-encoded annotation values, returns undefined on JSON parsing error\nexport function readAnnotationJson<T extends keyof AnnotationJson>(\n spec: { annotations?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<AnnotationJson[T]> | undefined {\n return readMetadataJson<Annotation, T>(spec?.annotations, AnnotationJson, key);\n}\n\nexport function isLinkerColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.IsLinkerColumn);\n}\n\n/**\n * Specification of an individual axis.\n *\n * Each axis is a part of a composite key that addresses data inside the PColumn.\n *\n * Each record inside a PColumn is addressed by a unique tuple of values set for\n * all the axes specified in the column spec.\n */\nexport type AxisSpec = {\n /** Type of the axis value. Should not use non-key types like float or double. */\n readonly type: AxisValueType;\n\n /** Name of the axis */\n readonly name: string;\n\n /** Adds auxiliary information to the axis name, type and parents to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional axis identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n\n /** Any additional information attached to the axis that does not affect its\n * identifier */\n readonly annotations?: Record<string, string>;\n\n /**\n * Parent axes provide contextual grouping for the axis in question, establishing\n * a hierarchy where the current axis is dependent on one or more axes for its\n * full definition and meaning. For instance, in a data structure where each\n * \"container\" axis may contain multiple \"item\" axes, the `item` axis would\n * list the index of the `container` axis in this field to denote its dependency.\n *\n * This means that the identity or significance of the `item` axis is only\n * interpretable when combined with its parent `container` axis. An `item` axis\n * index by itself may be non-unique and only gains uniqueness within the context\n * of its parent `container`. Therefore, the `parentAxes` field is essential for\n * mapping these relationships and ensuring data coherence across nested or\n * multi-level data models.\n *\n * A list of zero-based indices of parent axes in the overall axes specification\n * from the column spec. Each index corresponds to the position of a parent axis\n * in the list that defines the structure of the data model.\n */\n readonly parentAxes?: number[];\n};\n\n/** Parents are specs, not indexes; normalized axis can be used considering its parents independently from column */\nexport interface AxisSpecNormalized extends Omit<AxisSpec, \"parentAxes\"> {\n parentAxesSpec: AxisSpecNormalized[];\n}\n\n/** Tree: axis is a root, its parents are children */\nexport type AxisTree = {\n axis: AxisSpecNormalized;\n children: AxisTree[]; // parents\n};\n\nfunction makeAxisTree(axis: AxisSpecNormalized): AxisTree {\n return { axis, children: [] };\n}\n\n/** Build tree by axis parents annotations */\nexport function getAxesTree(rootAxis: AxisSpecNormalized): AxisTree {\n const root = makeAxisTree(rootAxis);\n let nodesQ = [root];\n while (nodesQ.length) {\n const nextNodes: AxisTree[] = [];\n for (const node of nodesQ) {\n node.children = node.axis.parentAxesSpec.map(makeAxisTree);\n nextNodes.push(...node.children);\n }\n nodesQ = nextNodes;\n }\n return root;\n}\n\n/** Get set of canonicalized axisIds from axisTree */\nexport function getSetFromAxisTree(tree: AxisTree): Set<CanonicalizedJson<AxisId>> {\n const set = new Set([canonicalizeJson(getAxisId(tree.axis))]);\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.children) {\n set.add(canonicalizeJson(getAxisId(parent.axis)));\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return set;\n}\n\n/** Get array of axisSpecs from axisTree */\nexport function getArrayFromAxisTree(tree: AxisTree): AxisSpecNormalized[] {\n const res = [tree.axis];\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.children) {\n res.push(parent.axis);\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return res;\n}\n\nexport function canonicalizeAxisWithParents(axis: AxisSpecNormalized) {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n}\n\nfunction normalizingAxesComparator(\n axis1: AxisSpecNormalized,\n axis2: AxisSpecNormalized,\n): 1 | -1 | 0 {\n if (axis1.name !== axis2.name) {\n return axis1.name < axis2.name ? 1 : -1;\n }\n if (axis1.type !== axis2.type) {\n return axis1.type < axis2.type ? 1 : -1;\n }\n const domain1 = canonicalizeJson(axis1.domain ?? {});\n const domain2 = canonicalizeJson(axis2.domain ?? {});\n if (domain1 !== domain2) {\n return domain1 < domain2 ? 1 : -1;\n }\n\n const contextDomain1 = canonicalizeJson(axis1.contextDomain ?? {});\n const contextDomain2 = canonicalizeJson(axis2.contextDomain ?? {});\n if (contextDomain1 !== contextDomain2) {\n return contextDomain1 < contextDomain2 ? 1 : -1;\n }\n\n const parents1 = canonicalizeAxisWithParents(axis1);\n const parents2 = canonicalizeAxisWithParents(axis2);\n\n if (parents1 !== parents2) {\n return parents1 < parents2 ? 1 : -1;\n }\n\n const annotation1 = canonicalizeJson(axis1.annotations ?? {});\n const annotation2 = canonicalizeJson(axis2.annotations ?? {});\n if (annotation1 !== annotation2) {\n return annotation1 < annotation2 ? 1 : -1;\n }\n return 0;\n}\n\nfunction parseParentsFromAnnotations(axis: AxisSpec) {\n const parentsList = readAnnotationJson(axis, Annotation.Parents);\n if (parentsList === undefined) {\n return [];\n }\n return parentsList;\n}\n\nfunction sortParentsDeep(axisSpec: AxisSpecNormalized) {\n axisSpec.parentAxesSpec.forEach(sortParentsDeep);\n axisSpec.parentAxesSpec.sort(normalizingAxesComparator);\n}\n\nfunction hasCycleOfParents(axisSpec: AxisSpecNormalized) {\n const root = makeAxisTree(axisSpec);\n let nodesQ = [root];\n const ancestors = new Set(canonicalizeJson(getAxisId(axisSpec)));\n while (nodesQ.length) {\n const nextNodes: AxisTree[] = [];\n const levelIds = new Set<CanonicalizedJson<AxisId>>();\n for (const node of nodesQ) {\n node.children = node.axis.parentAxesSpec.map(makeAxisTree);\n for (const child of node.children) {\n const childId = canonicalizeJson(getAxisId(child.axis));\n if (!levelIds.has(childId)) {\n nextNodes.push(child);\n levelIds.add(childId);\n if (ancestors.has(childId)) {\n return true;\n }\n ancestors.add(childId);\n }\n }\n }\n nodesQ = nextNodes;\n }\n return false;\n}\n\n/** Create list of normalized axisSpec (parents are in array of specs, not indexes) */\nexport function getNormalizedAxesList(axes: AxisSpec[]): AxisSpecNormalized[] {\n if (!axes.length) {\n return [];\n }\n const modifiedAxes: AxisSpecNormalized[] = axes.map((axis) => {\n const { parentAxes: _, ...copiedRest } = axis;\n return { ...copiedRest, annotations: { ...copiedRest.annotations }, parentAxesSpec: [] };\n });\n\n axes.forEach((axis, idx) => {\n const modifiedAxis = modifiedAxes[idx];\n if (axis.parentAxes) {\n // if we have parents by indexes then take from the list\n modifiedAxis.parentAxesSpec = axis.parentAxes.map((idx) => modifiedAxes[idx]);\n } else {\n // else try to parse from annotation name\n const parents = parseParentsFromAnnotations(axis).map((name) =>\n modifiedAxes.find((axis) => axis.name === name),\n );\n modifiedAxis.parentAxesSpec = parents.some((p) => p === undefined)\n ? []\n : (parents as AxisSpecNormalized[]);\n\n delete modifiedAxis.annotations?.[Annotation.Parents];\n }\n });\n\n if (modifiedAxes.some(hasCycleOfParents)) {\n // Axes list is broken\n modifiedAxes.forEach((axis) => {\n axis.parentAxesSpec = [];\n });\n } else {\n modifiedAxes.forEach((axis) => {\n sortParentsDeep(axis);\n });\n }\n\n return modifiedAxes;\n}\n\n/** Create list of regular axisSpec from normalized (parents are indexes, inside of current axes list) */\nexport function getDenormalizedAxesList(axesSpec: AxisSpecNormalized[]): AxisSpec[] {\n const idsList = axesSpec.map((axisSpec) => canonicalizeJson(getAxisId(axisSpec)));\n return axesSpec.map((axisSpec) => {\n const parentsIds = axisSpec.parentAxesSpec.map((axisSpec) =>\n canonicalizeJson(getAxisId(axisSpec)),\n );\n const parentIdxs = parentsIds.map((id) => idsList.indexOf(id));\n const { parentAxesSpec: _, ...copiedRest } = axisSpec;\n if (parentIdxs.length) {\n return { ...copiedRest, parentAxes: parentIdxs } as AxisSpec;\n }\n return copiedRest;\n });\n}\n\n/** Common type representing spec for all the axes in a column */\nexport type AxesSpec = AxisSpec[];\n\n/// Well-known column names\nexport const PColumnName = {\n Label: \"pl7.app/label\",\n Table: {\n RowSelection: \"pl7.app/table/row-selection\",\n },\n VDJ: {\n LeadSelection: \"pl7.app/vdj/lead-selection\",\n RankingOrder: \"pl7.app/vdj/ranking-order\",\n Sequence: \"pl7.app/vdj/sequence\",\n },\n} as const;\n\n/// Well-known axis names\nexport const PAxisName = {\n SampleId: \"pl7.app/sampleId\",\n VDJ: {\n Assay: {\n SequenceId: \"pl7.app/vdj/assay/sequenceId\",\n },\n ClusterId: \"pl7.app/vdj/clusterId\",\n ClonotypeKey: \"pl7.app/vdj/clonotypeKey\",\n ScClonotypeKey: \"pl7.app/vdj/scClonotypeKey\",\n },\n} as const;\n\nexport function isLabelColumn(column: PColumnSpec) {\n return column.axesSpec.length === 1 && column.name === PColumnName.Label;\n}\n\n/**\n * Full column specification including all axes specs and specs of the column\n * itself.\n *\n * A PColumn in its essence represents a mapping from a fixed size, explicitly\n * typed tuple to an explicitly typed value.\n *\n * (axis1Value1, axis2Value1, ...) -> columnValue\n *\n * Each element in tuple correspond to the axis having the same index in axesSpec.\n */\nexport type PUniversalColumnSpec = PObjectSpec & {\n /** Defines specific type of BObject, the most generic type of unit of\n * information in Platforma Project. */\n readonly kind: \"PColumn\";\n\n /** Type of column values */\n readonly valueType: string;\n\n /** Column name */\n readonly name: string;\n\n /** Adds auxiliary information to the axis name, type and parents to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional column identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n\n /** Any additional information attached to the column that does not affect its\n * identifier */\n readonly annotations?: Record<string, string>;\n\n /** A list of zero-based indices of parent axes from the {@link axesSpec} array. */\n readonly parentAxes?: number[];\n\n /** Axes specifications */\n readonly axesSpec: AxesSpec;\n};\n\n/**\n * Specification of a data column.\n *\n * Data column is a specialized type of PColumn that stores only simple values (strings and numbers)\n * addressed by multiple keys. This is in contrast to other PColumn variants that can store more complex\n * values like files or other abstract data types. Data columns are optimized for storing and processing\n * basic tabular data.\n */\nexport type PDataColumnSpec = PUniversalColumnSpec & {\n /** Type of column values */\n readonly valueType: ValueType;\n};\n\n// @todo: change this to PUniversalColumnSpec\nexport type PColumnSpec = PDataColumnSpec;\n\n/** Unique PColumnSpec identifier */\nexport type PColumnSpecId = {\n /** Defines specific type of BObject, the most generic type of unit of\n * information in Platforma Project. */\n readonly kind: \"PColumn\";\n\n /** Type of column values */\n readonly valueType: ValueType;\n\n /** Column name */\n readonly name: string;\n\n /** Adds auxiliary information to the axis name, type and parents to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional column identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n\n /** A list of zero-based indices of parent axes from the {@link axesSpec} array. */\n readonly parentAxes?: number[];\n\n /** Axes id */\n readonly axesId: AxesId;\n};\n\nexport function getPColumnSpecId(spec: PColumnSpec): PColumnSpecId {\n return {\n kind: spec.kind,\n valueType: spec.valueType,\n name: spec.name,\n domain: spec.domain,\n contextDomain: spec.contextDomain,\n parentAxes: spec.parentAxes,\n axesId: getAxesId(spec.axesSpec),\n };\n}\n\nexport interface PColumn<Data> extends PObject<Data> {\n /** PColumn spec, allowing it to be found among other PObjects */\n readonly spec: PColumnSpec;\n}\n\nexport type PColumnLazy<T> = PColumn<() => T>;\n\n/** Columns in a PFrame also have internal identifier, this object represents\n * combination of specs and such id */\nexport interface PColumnIdAndSpec {\n /** Internal column id within the PFrame */\n readonly columnId: PObjectId;\n\n /** Column spec */\n readonly spec: PColumnSpec;\n}\n\n/** Get column id and spec from a column */\nexport function getColumnIdAndSpec<Data>(column: PColumn<Data>): PColumnIdAndSpec {\n return {\n columnId: column.id,\n spec: column.spec,\n };\n}\n\n/** Information returned by {@link PFrame.listColumns} method */\nexport interface PColumnInfo extends PColumnIdAndSpec {\n /** True if data was associated with this PColumn */\n readonly hasData: boolean;\n}\n\nexport interface AxisId {\n /** Type of the axis or column value. For an axis should not use non-key\n * types like float or double. */\n readonly type: AxisValueType;\n\n /** Name of the axis or column */\n readonly name: string;\n\n /** Adds auxiliary information to the axis or column name and type to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional axis identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n}\n\n/** Array of axis ids */\nexport type AxesId = AxisId[];\n\n/** Extracts axis ids from axis spec */\nexport function getAxisId(spec: AxisSpec): AxisId {\n const { type, name, domain, contextDomain } = spec;\n const result: AxisId = { type, name };\n if (domain && Object.entries(domain).length > 0) {\n Object.assign(result, { domain });\n }\n if (contextDomain && Object.entries(contextDomain).length > 0) {\n Object.assign(result, { contextDomain });\n }\n return result;\n}\n\n/** Extracts axes ids from axes spec array from column spec */\nexport function getAxesId(spec: AxesSpec): AxesId {\n return spec.map(getAxisId);\n}\n\n/** Canonicalizes axis id */\nexport function canonicalizeAxisId(id: AxisId): CanonicalizedJson<AxisId> {\n return canonicalizeJson(getAxisId(id));\n}\n\n/** Returns true if all domains from query are found in target */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\n/** Returns whether \"match\" axis id is compatible with the \"query\" */\nexport function matchAxisId(query: AxisId, target: AxisId): boolean {\n return (\n query.name === target.name &&\n matchDomain(query.domain, target.domain) &&\n matchDomain(query.contextDomain, target.contextDomain)\n );\n}\n\nexport function getTypeFromPColumnOrAxisSpec(spec: PColumnSpec | AxisSpec): ValueType {\n return \"valueType\" in spec ? spec.valueType : spec.type;\n}\n\nexport function isAxisId(id: unknown): id is AxisId {\n return typeof id === \"object\" && id !== null && \"name\" in id && \"type\" in id;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"spec.js","names":[],"sources":["../../../../src/drivers/pframe/spec/spec.ts"],"sourcesContent":["import { ensureError } from \"../../../errors\";\nimport { canonicalizeJson, type CanonicalizedJson, type StringifiedJson } from \"../../../json\";\nimport type { PObject, PObjectId, PObjectSpec } from \"../../../pool\";\nimport { z } from \"zod\";\n\nexport const ValueType = {\n Int: \"Int\",\n Long: \"Long\",\n Float: \"Float\",\n Double: \"Double\",\n String: \"String\",\n Bytes: \"Bytes\",\n} as const;\n\nexport type AxisValueType = Extract<ValueType, \"Int\" | \"Long\" | \"String\">;\nexport type ColumnValueType = ValueType;\n\n/** PFrame columns and axes within them may store one of these types. */\nexport type ValueType = (typeof ValueType)[keyof typeof ValueType];\n\nexport type Metadata = Record<string, string>;\n\nexport function readMetadata<U extends Metadata, T extends keyof U = keyof U>(\n metadata: Metadata | undefined,\n key: T,\n): U[T] | undefined {\n return (metadata as U | undefined)?.[key];\n}\n\ntype MetadataJsonImpl<M> = {\n [P in keyof M as M[P] extends StringifiedJson ? P : never]: M[P] extends StringifiedJson<infer U>\n ? z.ZodType<U>\n : never;\n};\nexport type MetadataJson<M> = MetadataJsonImpl<Required<M>>;\n\nexport function readMetadataJsonOrThrow<M extends Metadata, T extends keyof MetadataJson<M>>(\n metadata: Metadata | undefined,\n metadataJson: MetadataJson<M>,\n key: T,\n methodNameInError: string = \"readMetadataJsonOrThrow\",\n): z.infer<MetadataJson<M>[T]> | undefined {\n const json = readMetadata<M, T>(metadata, key);\n if (json === undefined) return undefined;\n\n const schema = metadataJson[key];\n try {\n const value = JSON.parse(json);\n return schema.parse(value);\n } catch (error: unknown) {\n throw new Error(\n `${methodNameInError} failed, ` +\n `key: ${String(key)}, ` +\n `value: ${json}, ` +\n `error: ${ensureError(error)}`,\n );\n }\n}\n\nexport function readMetadataJson<M extends Metadata, T extends keyof MetadataJson<M>>(\n metadata: Metadata | undefined,\n metadataJson: MetadataJson<M>,\n key: T,\n): z.infer<MetadataJson<M>[T]> | undefined {\n try {\n return readMetadataJsonOrThrow(metadata, metadataJson, key);\n } catch {\n return undefined; // treat invalid values as unset\n }\n}\n\n/// Well-known domains\nexport const Domain = {\n Alphabet: \"pl7.app/alphabet\",\n BlockId: \"pl7.app/blockId\",\n VDJ: {\n Clustering: {\n BlockId: \"pl7.app/vdj/clustering/blockId\",\n },\n ScClonotypeChain: {\n Index: \"pl7.app/vdj/scClonotypeChain/index\",\n },\n },\n} as const;\n\nexport type Domain = Metadata &\n Partial<{\n [Domain.Alphabet]: \"nucleotide\" | \"aminoacid\" | (string & {});\n [Domain.BlockId]: string;\n [Domain.VDJ.ScClonotypeChain.Index]: \"primary\" | \"secondary\" | (string & {});\n }>;\n\nexport type DomainJson = MetadataJson<Domain>;\nexport const DomainJson: DomainJson = {};\n\n/// Helper function for reading plain domain values\nexport function readDomain<T extends keyof Domain>(\n spec: { domain?: Metadata | undefined } | undefined,\n key: T,\n): Domain[T] | undefined {\n return readMetadata<Domain, T>(spec?.domain, key);\n}\n\n/// Helper function for reading json-encoded domain values, throws on JSON parsing error\nexport function readDomainJsonOrThrow<T extends keyof DomainJson>(\n spec: { domain?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<DomainJson[T]> | undefined {\n return readMetadataJsonOrThrow<Domain, T>(spec?.domain, DomainJson, key, \"readDomainJsonOrThrow\");\n}\n\n/// Helper function for reading json-encoded domain values, returns undefined on JSON parsing error\nexport function readDomainJson<T extends keyof DomainJson>(\n spec: { domain?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<DomainJson[T]> | undefined {\n return readMetadataJson<Domain, T>(spec?.domain, DomainJson, key);\n}\n\n/// Well-known annotations\nexport const Annotation = {\n AxisNature: \"pl7.app/axisNature\",\n Alphabet: \"pl7.app/alphabet\",\n Description: \"pl7.app/description\",\n DiscreteValues: \"pl7.app/discreteValues\",\n Format: \"pl7.app/format\",\n Graph: {\n Axis: {\n HighCardinality: \"pl7.app/graph/axis/highCardinality\",\n LowerLimit: \"pl7.app/graph/axis/lowerLimit\",\n SymmetricRange: \"pl7.app/graph/axis/symmetricRange\",\n UpperLimit: \"pl7.app/graph/axis/upperLimit\",\n },\n IsDenseAxis: \"pl7.app/graph/isDenseAxis\",\n IsVirtual: \"pl7.app/graph/isVirtual\",\n Palette: \"pl7.app/graph/palette\",\n Thresholds: \"pl7.app/graph/thresholds\",\n TreatAbsentValuesAs: \"pl7.app/graph/treatAbsentValuesAs\",\n },\n HideDataFromUi: \"pl7.app/hideDataFromUi\",\n HideDataFromGraphs: \"pl7.app/hideDataFromGraphs\",\n IsDiscreteFilter: \"pl7.app/isDiscreteFilter\",\n IsAnchor: \"pl7.app/isAnchor\",\n IsLinkerColumn: \"pl7.app/isLinkerColumn\",\n IsScore: \"pl7.app/isScore\",\n IsSubset: \"pl7.app/isSubset\",\n Label: \"pl7.app/label\",\n Max: \"pl7.app/max\",\n Min: \"pl7.app/min\",\n MultipliesBy: \"pl7.app/multipliesBy\",\n Parents: \"pl7.app/parents\",\n Score: {\n DefaultCutoff: \"pl7.app/score/defaultCutoff\",\n RankingOrder: \"pl7.app/score/rankingOrder\",\n },\n Sequence: {\n Annotation: {\n Mapping: \"pl7.app/sequence/annotation/mapping\",\n },\n IsAnnotation: \"pl7.app/sequence/isAnnotation\",\n },\n Table: {\n FontFamily: \"pl7.app/table/fontFamily\",\n OrderPriority: \"pl7.app/table/orderPriority\",\n Visibility: \"pl7.app/table/visibility\",\n },\n Trace: \"pl7.app/trace\",\n VDJ: {\n IsAssemblingFeature: \"pl7.app/vdj/isAssemblingFeature\",\n IsMainSequence: \"pl7.app/vdj/isMainSequence\",\n },\n} as const;\n\nexport type Annotation = Metadata &\n Partial<{\n [Annotation.Alphabet]: \"nucleotide\" | \"aminoacid\" | (string & {});\n [Annotation.AxisNature]: \"homogeneous\" | \"heterogeneous\" | \"scaleCompatible\" | (string & {});\n [Annotation.Description]: string;\n [Annotation.DiscreteValues]: StringifiedJson<number[]> | StringifiedJson<string[]>;\n [Annotation.Format]: string;\n [Annotation.Graph.Axis.HighCardinality]: StringifiedJson<boolean>;\n [Annotation.Graph.Axis.LowerLimit]: StringifiedJson<number>;\n [Annotation.Graph.Axis.SymmetricRange]: StringifiedJson<boolean>;\n [Annotation.Graph.Axis.UpperLimit]: StringifiedJson<number>;\n [Annotation.Graph.IsDenseAxis]: StringifiedJson<boolean>;\n [Annotation.Graph.IsVirtual]: StringifiedJson<boolean>;\n [Annotation.Graph.Palette]: StringifiedJson<{ mapping: Record<string, number>; name: string }>;\n [Annotation.Graph.Thresholds]: StringifiedJson<\n { columnId: { valueType: ValueType; name: string }; value: number }[]\n >;\n [Annotation.Graph.TreatAbsentValuesAs]: StringifiedJson<number>;\n [Annotation.HideDataFromGraphs]: StringifiedJson<boolean>;\n [Annotation.HideDataFromUi]: StringifiedJson<boolean>;\n [Annotation.IsDiscreteFilter]: StringifiedJson<boolean>;\n [Annotation.IsLinkerColumn]: StringifiedJson<boolean>;\n [Annotation.IsSubset]: StringifiedJson<boolean>;\n [Annotation.Label]: string;\n [Annotation.Max]: StringifiedJson<number>;\n [Annotation.Min]: StringifiedJson<number>;\n [Annotation.MultipliesBy]: StringifiedJson<AxisSpec[\"name\"][]>;\n [Annotation.Parents]: StringifiedJson<AxisSpec[\"name\"][]>;\n [Annotation.Sequence.Annotation.Mapping]: StringifiedJson<Record<string, string>>;\n [Annotation.Sequence.IsAnnotation]: StringifiedJson<boolean>;\n [Annotation.Table.FontFamily]: string;\n [Annotation.Table.OrderPriority]: StringifiedJson<number>;\n [Annotation.Table.Visibility]: \"hidden\" | \"optional\" | (string & {});\n [Annotation.Trace]: StringifiedJson<Record<string, unknown>>;\n [Annotation.VDJ.IsAssemblingFeature]: StringifiedJson<boolean>;\n }>;\n\n// export const AxisSpec = z.object({\n// type: z.nativeEnum(ValueType),\n// name: z.string(),\n// domain: z.record(z.string(), z.string()).optional(),\n// annotations: z.record(z.string(), z.string()).optional(),\n// parentAxes: z.array(z.number()).optional(),\n// }).passthrough();\n//\n// type Expect<T extends true> = T;\n// type Equal<X, Y> =\n// (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n//\n// type _test = Expect<Equal<\n// Readonly<z.infer<typeof AxisSpec>>,\n// Readonly<AxisSpec & Record<string, unknown>>\n// >>;\n\nexport type AnnotationJson = MetadataJson<Annotation>;\n\nconst ValueTypeSchema = z.enum([\"Int\", \"Long\", \"Float\", \"Double\", \"String\"] as const);\nexport const AnnotationJson: AnnotationJson = {\n [Annotation.DiscreteValues]: z.array(z.string()).or(z.array(z.number())),\n [Annotation.Graph.Axis.HighCardinality]: z.boolean(),\n [Annotation.Graph.Axis.LowerLimit]: z.number(),\n [Annotation.Graph.Axis.UpperLimit]: z.number(),\n [Annotation.Graph.Axis.SymmetricRange]: z.boolean(),\n [Annotation.Graph.IsDenseAxis]: z.boolean(),\n [Annotation.Graph.Palette]: z.object({ mapping: z.record(z.number()), name: z.string() }),\n [Annotation.Graph.Thresholds]: z.array(\n z.object({\n columnId: z.object({ valueType: ValueTypeSchema, name: z.string() }),\n value: z.number(),\n }),\n ),\n [Annotation.Graph.TreatAbsentValuesAs]: z.number(),\n [Annotation.Graph.IsVirtual]: z.boolean(),\n [Annotation.HideDataFromUi]: z.boolean(),\n [Annotation.HideDataFromGraphs]: z.boolean(),\n [Annotation.IsDiscreteFilter]: z.boolean(),\n [Annotation.IsLinkerColumn]: z.boolean(),\n [Annotation.IsSubset]: z.boolean(),\n [Annotation.Max]: z.number(),\n [Annotation.Min]: z.number(),\n [Annotation.MultipliesBy]: z.array(z.string()),\n [Annotation.Parents]: z.array(z.string()),\n [Annotation.Sequence.Annotation.Mapping]: z.record(z.string(), z.string()),\n [Annotation.Sequence.IsAnnotation]: z.boolean(),\n [Annotation.Table.OrderPriority]: z.number(),\n [Annotation.Trace]: z.record(z.string(), z.unknown()),\n [Annotation.VDJ.IsAssemblingFeature]: z.boolean(),\n};\n\n/// Helper function for reading plain annotation values\nexport function readAnnotation<T extends keyof Annotation>(\n spec: { annotations?: Metadata | undefined } | undefined,\n key: T,\n): Annotation[T] | undefined {\n return readMetadata<Annotation, T>(spec?.annotations, key);\n}\n\n/// Helper function for reading json-encoded annotation values, throws on JSON parsing error\nexport function readAnnotationJsonOrThrow<T extends keyof AnnotationJson>(\n spec: { annotations?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<AnnotationJson[T]> | undefined {\n return readMetadataJsonOrThrow<Annotation, T>(\n spec?.annotations,\n AnnotationJson,\n key,\n \"readAnnotationJsonOrThrow\",\n );\n}\n\n/// Helper function for reading json-encoded annotation values, returns undefined on JSON parsing error\nexport function readAnnotationJson<T extends keyof AnnotationJson>(\n spec: { annotations?: Metadata | undefined } | undefined,\n key: T,\n): z.infer<AnnotationJson[T]> | undefined {\n return readMetadataJson<Annotation, T>(spec?.annotations, AnnotationJson, key);\n}\n\nexport function isLinkerColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.IsLinkerColumn);\n}\n\n/**\n * Specification of an individual axis.\n *\n * Each axis is a part of a composite key that addresses data inside the PColumn.\n *\n * Each record inside a PColumn is addressed by a unique tuple of values set for\n * all the axes specified in the column spec.\n */\nexport type AxisSpec = {\n /** Type of the axis value. Should not use non-key types like float or double. */\n readonly type: AxisValueType;\n\n /** Name of the axis */\n readonly name: string;\n\n /** Adds auxiliary information to the axis name, type and parents to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional axis identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n\n /** Any additional information attached to the axis that does not affect its\n * identifier */\n readonly annotations?: Record<string, string>;\n\n /**\n * Parent axes provide contextual grouping for the axis in question, establishing\n * a hierarchy where the current axis is dependent on one or more axes for its\n * full definition and meaning. For instance, in a data structure where each\n * \"container\" axis may contain multiple \"item\" axes, the `item` axis would\n * list the index of the `container` axis in this field to denote its dependency.\n *\n * This means that the identity or significance of the `item` axis is only\n * interpretable when combined with its parent `container` axis. An `item` axis\n * index by itself may be non-unique and only gains uniqueness within the context\n * of its parent `container`. Therefore, the `parentAxes` field is essential for\n * mapping these relationships and ensuring data coherence across nested or\n * multi-level data models.\n *\n * A list of zero-based indices of parent axes in the overall axes specification\n * from the column spec. Each index corresponds to the position of a parent axis\n * in the list that defines the structure of the data model.\n */\n readonly parentAxes?: number[];\n};\n\n/** Parents are specs, not indexes; normalized axis can be used considering its parents independently from column */\nexport interface AxisSpecNormalized extends Omit<AxisSpec, \"parentAxes\"> {\n parentAxesSpec: AxisSpecNormalized[];\n}\n\n/** Tree: axis is a root, its parents are children */\nexport type AxisTree = {\n axis: AxisSpecNormalized;\n children: AxisTree[]; // parents\n};\n\nfunction makeAxisTree(axis: AxisSpecNormalized): AxisTree {\n return { axis, children: [] };\n}\n\n/** Build tree by axis parents annotations */\nexport function getAxesTree(rootAxis: AxisSpecNormalized): AxisTree {\n const root = makeAxisTree(rootAxis);\n let nodesQ = [root];\n while (nodesQ.length) {\n const nextNodes: AxisTree[] = [];\n for (const node of nodesQ) {\n node.children = node.axis.parentAxesSpec.map(makeAxisTree);\n nextNodes.push(...node.children);\n }\n nodesQ = nextNodes;\n }\n return root;\n}\n\n/** Get set of canonicalized axisIds from axisTree */\nexport function getSetFromAxisTree(tree: AxisTree): Set<CanonicalizedJson<AxisId>> {\n const set = new Set([canonicalizeJson(getAxisId(tree.axis))]);\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.children) {\n set.add(canonicalizeJson(getAxisId(parent.axis)));\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return set;\n}\n\n/** Get array of axisSpecs from axisTree */\nexport function getArrayFromAxisTree(tree: AxisTree): AxisSpecNormalized[] {\n const res = [tree.axis];\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.children) {\n res.push(parent.axis);\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return res;\n}\n\nexport function canonicalizeAxisWithParents(axis: AxisSpecNormalized) {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n}\n\nfunction normalizingAxesComparator(\n axis1: AxisSpecNormalized,\n axis2: AxisSpecNormalized,\n): 1 | -1 | 0 {\n if (axis1.name !== axis2.name) {\n return axis1.name < axis2.name ? 1 : -1;\n }\n if (axis1.type !== axis2.type) {\n return axis1.type < axis2.type ? 1 : -1;\n }\n const domain1 = canonicalizeJson(axis1.domain ?? {});\n const domain2 = canonicalizeJson(axis2.domain ?? {});\n if (domain1 !== domain2) {\n return domain1 < domain2 ? 1 : -1;\n }\n\n const contextDomain1 = canonicalizeJson(axis1.contextDomain ?? {});\n const contextDomain2 = canonicalizeJson(axis2.contextDomain ?? {});\n if (contextDomain1 !== contextDomain2) {\n return contextDomain1 < contextDomain2 ? 1 : -1;\n }\n\n const parents1 = canonicalizeAxisWithParents(axis1);\n const parents2 = canonicalizeAxisWithParents(axis2);\n\n if (parents1 !== parents2) {\n return parents1 < parents2 ? 1 : -1;\n }\n\n const annotation1 = canonicalizeJson(axis1.annotations ?? {});\n const annotation2 = canonicalizeJson(axis2.annotations ?? {});\n if (annotation1 !== annotation2) {\n return annotation1 < annotation2 ? 1 : -1;\n }\n return 0;\n}\n\nfunction parseParentsFromAnnotations(axis: AxisSpec) {\n const parentsList = readAnnotationJson(axis, Annotation.Parents);\n if (parentsList === undefined) {\n return [];\n }\n return parentsList;\n}\n\nfunction sortParentsDeep(axisSpec: AxisSpecNormalized) {\n axisSpec.parentAxesSpec.forEach(sortParentsDeep);\n axisSpec.parentAxesSpec.sort(normalizingAxesComparator);\n}\n\nfunction hasCycleOfParents(axisSpec: AxisSpecNormalized) {\n const root = makeAxisTree(axisSpec);\n let nodesQ = [root];\n const ancestors = new Set(canonicalizeJson(getAxisId(axisSpec)));\n while (nodesQ.length) {\n const nextNodes: AxisTree[] = [];\n const levelIds = new Set<CanonicalizedJson<AxisId>>();\n for (const node of nodesQ) {\n node.children = node.axis.parentAxesSpec.map(makeAxisTree);\n for (const child of node.children) {\n const childId = canonicalizeJson(getAxisId(child.axis));\n if (!levelIds.has(childId)) {\n nextNodes.push(child);\n levelIds.add(childId);\n if (ancestors.has(childId)) {\n return true;\n }\n ancestors.add(childId);\n }\n }\n }\n nodesQ = nextNodes;\n }\n return false;\n}\n\n/** Create list of normalized axisSpec (parents are in array of specs, not indexes) */\nexport function getNormalizedAxesList(axes: AxisSpec[]): AxisSpecNormalized[] {\n if (!axes.length) {\n return [];\n }\n const modifiedAxes: AxisSpecNormalized[] = axes.map((axis) => {\n const { parentAxes: _, ...copiedRest } = axis;\n return { ...copiedRest, annotations: { ...copiedRest.annotations }, parentAxesSpec: [] };\n });\n\n axes.forEach((axis, idx) => {\n const modifiedAxis = modifiedAxes[idx];\n if (axis.parentAxes) {\n // if we have parents by indexes then take from the list\n modifiedAxis.parentAxesSpec = axis.parentAxes.map((idx) => modifiedAxes[idx]);\n } else {\n // else try to parse from annotation name\n const parents = parseParentsFromAnnotations(axis).map((name) =>\n modifiedAxes.find((axis) => axis.name === name),\n );\n modifiedAxis.parentAxesSpec = parents.some((p) => p === undefined)\n ? []\n : (parents as AxisSpecNormalized[]);\n }\n });\n\n if (modifiedAxes.some(hasCycleOfParents)) {\n // Axes list is broken\n modifiedAxes.forEach((axis) => {\n axis.parentAxesSpec = [];\n });\n } else {\n modifiedAxes.forEach((axis) => {\n sortParentsDeep(axis);\n });\n }\n\n return modifiedAxes;\n}\n\n/** Create list of regular axisSpec from normalized (parents are indexes, inside of current axes list) */\nexport function getDenormalizedAxesList(axesSpec: AxisSpecNormalized[]): AxisSpec[] {\n const idsList = axesSpec.map((axisSpec) => canonicalizeJson(getAxisId(axisSpec)));\n return axesSpec.map((axisSpec) => {\n const parentsIds = axisSpec.parentAxesSpec.map((axisSpec) =>\n canonicalizeJson(getAxisId(axisSpec)),\n );\n const parentIdxs = parentsIds.map((id) => idsList.indexOf(id));\n const { parentAxesSpec: _, ...copiedRest } = axisSpec;\n if (parentIdxs.length) {\n return { ...copiedRest, parentAxes: parentIdxs } as AxisSpec;\n }\n return copiedRest;\n });\n}\n\n/**\n * Resolve annotation-based parents (`pl7.app/parents`) to numeric `parentAxes`\n * on a column spec. Returns the spec unchanged if all axes already use numeric\n * indices or have no parent annotations.\n */\nexport function resolveAnnotationParents(spec: PColumnSpec): PColumnSpec {\n const hasAnnotationParents = spec.axesSpec.some(\n (axis) => !!readAnnotationJson(axis, Annotation.Parents),\n );\n if (!hasAnnotationParents) return spec;\n\n const normalized = getNormalizedAxesList(spec.axesSpec);\n const denormalized = getDenormalizedAxesList(normalized);\n return { ...spec, axesSpec: denormalized };\n}\n\n/** Common type representing spec for all the axes in a column */\nexport type AxesSpec = AxisSpec[];\n\n/// Well-known column names\nexport const PColumnName = {\n Label: \"pl7.app/label\",\n Table: {\n RowSelection: \"pl7.app/table/row-selection\",\n },\n VDJ: {\n LeadSelection: \"pl7.app/vdj/lead-selection\",\n RankingOrder: \"pl7.app/vdj/ranking-order\",\n Sequence: \"pl7.app/vdj/sequence\",\n },\n} as const;\n\n/// Well-known axis names\nexport const PAxisName = {\n SampleId: \"pl7.app/sampleId\",\n VDJ: {\n Assay: {\n SequenceId: \"pl7.app/vdj/assay/sequenceId\",\n },\n ClusterId: \"pl7.app/vdj/clusterId\",\n ClonotypeKey: \"pl7.app/vdj/clonotypeKey\",\n ScClonotypeKey: \"pl7.app/vdj/scClonotypeKey\",\n },\n} as const;\n\nexport function isLabelColumn(column: PColumnSpec) {\n return column.axesSpec.length === 1 && column.name === PColumnName.Label;\n}\n\n/**\n * Full column specification including all axes specs and specs of the column\n * itself.\n *\n * A PColumn in its essence represents a mapping from a fixed size, explicitly\n * typed tuple to an explicitly typed value.\n *\n * (axis1Value1, axis2Value1, ...) -> columnValue\n *\n * Each element in tuple correspond to the axis having the same index in axesSpec.\n */\nexport type PUniversalColumnSpec = PObjectSpec & {\n /** Defines specific type of BObject, the most generic type of unit of\n * information in Platforma Project. */\n readonly kind: \"PColumn\";\n\n /** Type of column values */\n readonly valueType: string;\n\n /** Column name */\n readonly name: string;\n\n /** Adds auxiliary information to the axis name, type and parents to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional column identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n\n /** Any additional information attached to the column that does not affect its\n * identifier */\n readonly annotations?: Record<string, string>;\n\n /** A list of zero-based indices of parent axes from the {@link axesSpec} array. */\n readonly parentAxes?: number[];\n\n /** Axes specifications */\n readonly axesSpec: AxesSpec;\n};\n\n/**\n * Specification of a data column.\n *\n * Data column is a specialized type of PColumn that stores only simple values (strings and numbers)\n * addressed by multiple keys. This is in contrast to other PColumn variants that can store more complex\n * values like files or other abstract data types. Data columns are optimized for storing and processing\n * basic tabular data.\n */\nexport type PDataColumnSpec = PUniversalColumnSpec & {\n /** Type of column values */\n readonly valueType: ValueType;\n};\n\n// @todo: change this to PUniversalColumnSpec\nexport type PColumnSpec = PDataColumnSpec;\n\n/** Unique PColumnSpec identifier */\nexport type PColumnSpecId = {\n /** Defines specific type of BObject, the most generic type of unit of\n * information in Platforma Project. */\n readonly kind: \"PColumn\";\n\n /** Type of column values */\n readonly valueType: ValueType;\n\n /** Column name */\n readonly name: string;\n\n /** Adds auxiliary information to the axis name, type and parents to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional column identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n\n /** A list of zero-based indices of parent axes from the {@link axesSpec} array. */\n readonly parentAxes?: number[];\n\n /** Axes id */\n readonly axesId: AxesId;\n};\n\nexport function getPColumnSpecId(spec: PColumnSpec): PColumnSpecId {\n return {\n kind: spec.kind,\n valueType: spec.valueType,\n name: spec.name,\n domain: spec.domain,\n contextDomain: spec.contextDomain,\n parentAxes: spec.parentAxes,\n axesId: getAxesId(spec.axesSpec),\n };\n}\n\nexport interface PColumn<Data> extends PObject<Data> {\n /** PColumn spec, allowing it to be found among other PObjects */\n readonly spec: PColumnSpec;\n}\n\nexport type PColumnLazy<T> = PColumn<() => T>;\n\n/** Columns in a PFrame also have internal identifier, this object represents\n * combination of specs and such id */\nexport interface PColumnIdAndSpec {\n /** Internal column id within the PFrame */\n readonly columnId: PObjectId;\n\n /** Column spec */\n readonly spec: PColumnSpec;\n}\n\n/** Get column id and spec from a column */\nexport function getColumnIdAndSpec<Data>(column: PColumn<Data>): PColumnIdAndSpec {\n return {\n columnId: column.id,\n spec: column.spec,\n };\n}\n\n/** Information returned by {@link PFrame.listColumns} method */\nexport interface PColumnInfo extends PColumnIdAndSpec {\n /** True if data was associated with this PColumn */\n readonly hasData: boolean;\n}\n\nexport interface AxisId {\n /** Type of the axis or column value. For an axis should not use non-key\n * types like float or double. */\n readonly type: AxisValueType;\n\n /** Name of the axis or column */\n readonly name: string;\n\n /** Adds auxiliary information to the axis or column name and type to form a\n * unique identifier */\n readonly domain?: Record<string, string>;\n\n /** Context domain provides additional axis identity that is matched\n * by kinship rules (subset/superset/overlap) rather than exact equality */\n readonly contextDomain?: Record<string, string>;\n}\n\n/** Array of axis ids */\nexport type AxesId = AxisId[];\n\n/** Extracts axis ids from axis spec */\nexport function getAxisId(spec: AxisSpec): AxisId {\n const { type, name, domain, contextDomain } = spec;\n const result: AxisId = { type, name };\n if (domain && Object.entries(domain).length > 0) {\n Object.assign(result, { domain });\n }\n if (contextDomain && Object.entries(contextDomain).length > 0) {\n Object.assign(result, { contextDomain });\n }\n return result;\n}\n\n/** Extracts axes ids from axes spec array from column spec */\nexport function getAxesId(spec: AxesSpec): AxesId {\n return spec.map(getAxisId);\n}\n\n/** Canonicalizes axis id */\nexport function canonicalizeAxisId(id: AxisId): CanonicalizedJson<AxisId> {\n return canonicalizeJson(getAxisId(id));\n}\n\n/** Returns true if all domains from query are found in target */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\n/** Returns whether \"match\" axis id is compatible with the \"query\" */\nexport function matchAxisId(query: AxisId, target: AxisId): boolean {\n return (\n query.name === target.name &&\n matchDomain(query.domain, target.domain) &&\n matchDomain(query.contextDomain, target.contextDomain)\n );\n}\n\nexport function getTypeFromPColumnOrAxisSpec(spec: PColumnSpec | AxisSpec): ValueType {\n return \"valueType\" in spec ? spec.valueType : spec.type;\n}\n\nexport function isAxisId(id: unknown): id is AxisId {\n return typeof id === \"object\" && id !== null && \"name\" in id && \"type\" in id;\n}\n"],"mappings":"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"}
@@ -2,6 +2,10 @@ import { AxesId, AxesSpec, AxisSpec, AxisValueType, ColumnValueType, PColumnIdAn
2
2
  import { SingleAxisSelector } from "./spec/selectors.js";
3
3
  import { PTableColumnId, PTableColumnSpec } from "./table_common.js";
4
4
  import "./spec/index.js";
5
+ import { SpecQuery } from "./query/query_spec.js";
6
+ import { DataQuery } from "./query/query_data.js";
7
+ import "./query/index.js";
8
+ import { PoolEntry } from "../../pool_entry.js";
5
9
  import { Branded } from "@milaboratories/helpers";
6
10
 
7
11
  //#region src/drivers/pframe/spec_driver.d.ts
@@ -122,6 +126,30 @@ interface DiscoverColumnsResponse {
122
126
  /** Columns that could be integrated and possible ways to integrate them */
123
127
  hits: DiscoverColumnsResponseHit[];
124
128
  }
129
+ /** Request for deleting an entry from a given axes integration */
130
+ interface DeleteColumnRequest {
131
+ /** Already integrated axes with qualifications */
132
+ axes: ColumnAxesWithQualifications[];
133
+ /** Zero based index of the entry to be deleted */
134
+ delete: number;
135
+ }
136
+ /** Response from delete column */
137
+ interface DeleteColumnResponse {
138
+ axes: ColumnAxesWithQualifications[];
139
+ }
140
+ /** Response from evaluating a query against a PFrame. */
141
+ type EvaluateQueryResponse = {
142
+ /**
143
+ * The table specification describing the structure of the query result,
144
+ * including all axes and columns that will be present in the output.
145
+ */
146
+ tableSpec: PTableColumnSpec[];
147
+ /**
148
+ * The data layer query representation with numeric indices,
149
+ * suitable for execution by the data processing engine.
150
+ */
151
+ dataQuery: DataQuery;
152
+ };
125
153
  /** Handle to a spec-only PFrame (no data, synchronous operations). */
126
154
  type SpecFrameHandle = Branded<string, "SpecFrameHandle">;
127
155
  /**
@@ -132,12 +160,14 @@ type SpecFrameHandle = Branded<string, "SpecFrameHandle">;
132
160
  * because the underlying WASM PFrame computes results immediately.
133
161
  */
134
162
  interface PFrameSpecDriver {
135
- /** Create a spec-only PFrame from column specs. Returns a handle. */
136
- createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle;
163
+ /** Create a spec-only PFrame from column specs. Returns a pool entry with handle and unref. */
164
+ createSpecFrame(specs: Record<string, PColumnSpec>): PoolEntry<SpecFrameHandle>;
137
165
  /** Discover columns compatible with given axes integration. */
138
- specFrameDiscoverColumns(handle: SpecFrameHandle, request: DiscoverColumnsRequest): DiscoverColumnsResponse;
139
- /** Dispose a spec frame, freeing WASM resources. */
140
- disposeSpecFrame(handle: SpecFrameHandle): void;
166
+ discoverColumns(handle: SpecFrameHandle, request: DiscoverColumnsRequest): DiscoverColumnsResponse;
167
+ /** Delete an entry from a given axes integration */
168
+ deleteColumn(handle: SpecFrameHandle, request: DeleteColumnRequest): DeleteColumnResponse;
169
+ /** Evaluates a query specification against this PFrame */
170
+ evaluateQuery(handle: SpecFrameHandle, request: SpecQuery): EvaluateQueryResponse;
141
171
  /** Expand index-based parentAxes in AxesSpec to resolved AxisId parents in AxesId. */
142
172
  expandAxes(spec: AxesSpec): AxesId;
143
173
  /** Collapse resolved AxisId parents back to index-based parentAxes in AxesSpec. */
@@ -148,5 +178,5 @@ interface PFrameSpecDriver {
148
178
  findTableColumn(tableSpec: PTableColumnSpec[], selector: PTableColumnId): number;
149
179
  }
150
180
  //#endregion
151
- export { AxisQualification, ColumnAxesWithQualifications, DiscoverColumnsConstraints, DiscoverColumnsLinkerStep, DiscoverColumnsMappingVariant, DiscoverColumnsRequest, DiscoverColumnsResponse, DiscoverColumnsResponseHit, DiscoverColumnsResponseQualifications, DiscoverColumnsStepInfo, MatcherMap, MultiAxisSelector, MultiColumnSelector, PFrameSpecDriver, SpecFrameHandle, StringMatcher };
181
+ export { AxisQualification, ColumnAxesWithQualifications, DeleteColumnRequest, DeleteColumnResponse, DiscoverColumnsConstraints, DiscoverColumnsLinkerStep, DiscoverColumnsMappingVariant, DiscoverColumnsRequest, DiscoverColumnsResponse, DiscoverColumnsResponseHit, DiscoverColumnsResponseQualifications, DiscoverColumnsStepInfo, EvaluateQueryResponse, MatcherMap, MultiAxisSelector, MultiColumnSelector, PFrameSpecDriver, SpecFrameHandle, StringMatcher };
152
182
  //# sourceMappingURL=spec_driver.d.ts.map
@@ -1,10 +1,10 @@
1
- import { PObjectId } from "../../pool/spec.js";
2
- import "../../pool/index.js";
3
1
  import { PColumn } from "./spec/spec.js";
4
2
  import { PColumnValues } from "./data_info.js";
5
3
  import { PTableVector } from "./data_types.js";
6
4
  import { PTableColumnId, PTableColumnSpec } from "./table_common.js";
7
5
  import { SpecQuery } from "./query/query_spec.js";
6
+ import { PObjectId } from "../../pool/spec.js";
7
+ import "../../pool/index.js";
8
8
 
9
9
  //#region src/drivers/pframe/table_calculate.d.ts
10
10
  /** Defines a terminal column node in the join request tree */
@@ -1,6 +1,6 @@
1
+ import { AxisId, AxisSpec, PColumnSpec } from "./spec/spec.js";
1
2
  import { PObjectId } from "../../pool/spec.js";
2
3
  import "../../pool/index.js";
3
- import { AxisId, AxisSpec, PColumnSpec } from "./spec/spec.js";
4
4
 
5
5
  //#region src/drivers/pframe/table_common.d.ts
6
6
  type PTableColumnSpecAxis = {
@@ -1,8 +1,8 @@
1
- import { PObjectId } from "../../pool/spec.js";
2
- import "../../pool/index.js";
3
1
  import { AxisId } from "./spec/spec.js";
4
2
  import { PTableVector } from "./data_types.js";
5
3
  import { PTableRecordFilter } from "./table_calculate.js";
4
+ import { PObjectId } from "../../pool/spec.js";
5
+ import "../../pool/index.js";
6
6
 
7
7
  //#region src/drivers/pframe/unique_values.d.ts
8
8
  /** Calculate set of unique values for a specific axis for the filtered set of records */
package/dist/errors.cjs CHANGED
@@ -22,6 +22,42 @@ function hasAbortError(error) {
22
22
  function isAggregateError(error) {
23
23
  return error instanceof Error && error.name === "AggregateError";
24
24
  }
25
+ var ServiceError = class extends Error {
26
+ name = "ServiceError";
27
+ };
28
+ function isServiceError(error) {
29
+ return error instanceof Error && (error.name === "ServiceError" || error.name.startsWith("ServiceError."));
30
+ }
31
+ var ServiceInvalidIdError = class extends ServiceError {
32
+ name = "ServiceError.InvalidId";
33
+ };
34
+ function isServiceInvalidIdError(error) {
35
+ return error instanceof Error && error.name === "ServiceError.InvalidId";
36
+ }
37
+ var ServiceAlreadyRegisteredError = class extends ServiceError {
38
+ name = "ServiceError.AlreadyRegistered";
39
+ };
40
+ function isServiceAlreadyRegisteredError(error) {
41
+ return error instanceof Error && error.name === "ServiceError.AlreadyRegistered";
42
+ }
43
+ var ServiceInjectionError = class extends ServiceError {
44
+ name = "ServiceError.Injection";
45
+ };
46
+ function isServiceInjectionError(error) {
47
+ return error instanceof Error && error.name === "ServiceError.Injection";
48
+ }
49
+ var ServiceNotRegisteredError = class extends ServiceError {
50
+ name = "ServiceError.NotRegistered";
51
+ };
52
+ function isServiceNotRegisteredError(error) {
53
+ return error instanceof Error && error.name === "ServiceError.NotRegistered";
54
+ }
55
+ var ServiceMethodNotFoundError = class extends ServiceError {
56
+ name = "ServiceError.MethodNotFound";
57
+ };
58
+ function isServiceMethodNotFoundError(error) {
59
+ return error instanceof Error && error.name === "ServiceError.MethodNotFound";
60
+ }
25
61
  var PFrameError = class extends Error {
26
62
  name = "PFrameError";
27
63
  };
@@ -108,6 +144,12 @@ exports.AbortError = AbortError;
108
144
  exports.PFrameDriverError = PFrameDriverError;
109
145
  exports.PFrameError = PFrameError;
110
146
  exports.PFrameSpecDriverError = PFrameSpecDriverError;
147
+ exports.ServiceAlreadyRegisteredError = ServiceAlreadyRegisteredError;
148
+ exports.ServiceError = ServiceError;
149
+ exports.ServiceInjectionError = ServiceInjectionError;
150
+ exports.ServiceInvalidIdError = ServiceInvalidIdError;
151
+ exports.ServiceMethodNotFoundError = ServiceMethodNotFoundError;
152
+ exports.ServiceNotRegisteredError = ServiceNotRegisteredError;
111
153
  exports.UiError = UiError;
112
154
  exports.deserializeError = deserializeError;
113
155
  exports.deserializeResult = deserializeResult;
@@ -118,6 +160,12 @@ exports.isAggregateError = isAggregateError;
118
160
  exports.isPFrameDriverError = isPFrameDriverError;
119
161
  exports.isPFrameError = isPFrameError;
120
162
  exports.isPFrameSpecDriverError = isPFrameSpecDriverError;
163
+ exports.isServiceAlreadyRegisteredError = isServiceAlreadyRegisteredError;
164
+ exports.isServiceError = isServiceError;
165
+ exports.isServiceInjectionError = isServiceInjectionError;
166
+ exports.isServiceInvalidIdError = isServiceInvalidIdError;
167
+ exports.isServiceMethodNotFoundError = isServiceMethodNotFoundError;
168
+ exports.isServiceNotRegisteredError = isServiceNotRegisteredError;
121
169
  exports.serializeError = serializeError;
122
170
  exports.serializeResult = serializeResult;
123
171
  exports.unwrapResult = unwrapResult;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class ServiceError extends Error {\n name = \"ServiceError\";\n}\n\nexport function isServiceError(error: unknown): error is ServiceError {\n return (\n error instanceof Error &&\n (error.name === \"ServiceError\" || error.name.startsWith(\"ServiceError.\"))\n );\n}\n\nexport class ServiceInvalidIdError extends ServiceError {\n name = \"ServiceError.InvalidId\";\n}\n\nexport function isServiceInvalidIdError(error: unknown): error is ServiceInvalidIdError {\n return error instanceof Error && error.name === \"ServiceError.InvalidId\";\n}\n\nexport class ServiceAlreadyRegisteredError extends ServiceError {\n name = \"ServiceError.AlreadyRegistered\";\n}\n\nexport function isServiceAlreadyRegisteredError(\n error: unknown,\n): error is ServiceAlreadyRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.AlreadyRegistered\";\n}\n\nexport class ServiceInjectionError extends ServiceError {\n name = \"ServiceError.Injection\";\n}\n\nexport function isServiceInjectionError(error: unknown): error is ServiceInjectionError {\n return error instanceof Error && error.name === \"ServiceError.Injection\";\n}\n\nexport class ServiceNotRegisteredError extends ServiceError {\n name = \"ServiceError.NotRegistered\";\n}\n\nexport function isServiceNotRegisteredError(error: unknown): error is ServiceNotRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.NotRegistered\";\n}\n\nexport class ServiceMethodNotFoundError extends ServiceError {\n name = \"ServiceError.MethodNotFound\";\n}\n\nexport function isServiceMethodNotFoundError(error: unknown): error is ServiceMethodNotFoundError {\n return error instanceof Error && error.name === \"ServiceError.MethodNotFound\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -16,6 +16,30 @@ declare function isAbortError(error: unknown): error is Error & {
16
16
  };
17
17
  declare function hasAbortError(error: unknown): boolean;
18
18
  declare function isAggregateError(error: unknown): error is AggregateError;
19
+ declare class ServiceError extends Error {
20
+ name: string;
21
+ }
22
+ declare function isServiceError(error: unknown): error is ServiceError;
23
+ declare class ServiceInvalidIdError extends ServiceError {
24
+ name: string;
25
+ }
26
+ declare function isServiceInvalidIdError(error: unknown): error is ServiceInvalidIdError;
27
+ declare class ServiceAlreadyRegisteredError extends ServiceError {
28
+ name: string;
29
+ }
30
+ declare function isServiceAlreadyRegisteredError(error: unknown): error is ServiceAlreadyRegisteredError;
31
+ declare class ServiceInjectionError extends ServiceError {
32
+ name: string;
33
+ }
34
+ declare function isServiceInjectionError(error: unknown): error is ServiceInjectionError;
35
+ declare class ServiceNotRegisteredError extends ServiceError {
36
+ name: string;
37
+ }
38
+ declare function isServiceNotRegisteredError(error: unknown): error is ServiceNotRegisteredError;
39
+ declare class ServiceMethodNotFoundError extends ServiceError {
40
+ name: string;
41
+ }
42
+ declare function isServiceMethodNotFoundError(error: unknown): error is ServiceMethodNotFoundError;
19
43
  declare class PFrameError extends Error {
20
44
  name: string;
21
45
  }
@@ -51,5 +75,5 @@ declare function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<Resul
51
75
  declare function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError>;
52
76
  declare function wrapAndSerializeAsync<T>(callback: () => Promise<T>): Promise<ResultOrError<T, SerializedError>>;
53
77
  //#endregion
54
- export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, ResultOrError, SerializedError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
78
+ export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, ResultOrError, SerializedError, ServiceAlreadyRegisteredError, ServiceError, ServiceInjectionError, ServiceInvalidIdError, ServiceMethodNotFoundError, ServiceNotRegisteredError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, isServiceAlreadyRegisteredError, isServiceError, isServiceInjectionError, isServiceInvalidIdError, isServiceMethodNotFoundError, isServiceNotRegisteredError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
55
79
  //# sourceMappingURL=errors.d.ts.map
package/dist/errors.js CHANGED
@@ -21,6 +21,42 @@ function hasAbortError(error) {
21
21
  function isAggregateError(error) {
22
22
  return error instanceof Error && error.name === "AggregateError";
23
23
  }
24
+ var ServiceError = class extends Error {
25
+ name = "ServiceError";
26
+ };
27
+ function isServiceError(error) {
28
+ return error instanceof Error && (error.name === "ServiceError" || error.name.startsWith("ServiceError."));
29
+ }
30
+ var ServiceInvalidIdError = class extends ServiceError {
31
+ name = "ServiceError.InvalidId";
32
+ };
33
+ function isServiceInvalidIdError(error) {
34
+ return error instanceof Error && error.name === "ServiceError.InvalidId";
35
+ }
36
+ var ServiceAlreadyRegisteredError = class extends ServiceError {
37
+ name = "ServiceError.AlreadyRegistered";
38
+ };
39
+ function isServiceAlreadyRegisteredError(error) {
40
+ return error instanceof Error && error.name === "ServiceError.AlreadyRegistered";
41
+ }
42
+ var ServiceInjectionError = class extends ServiceError {
43
+ name = "ServiceError.Injection";
44
+ };
45
+ function isServiceInjectionError(error) {
46
+ return error instanceof Error && error.name === "ServiceError.Injection";
47
+ }
48
+ var ServiceNotRegisteredError = class extends ServiceError {
49
+ name = "ServiceError.NotRegistered";
50
+ };
51
+ function isServiceNotRegisteredError(error) {
52
+ return error instanceof Error && error.name === "ServiceError.NotRegistered";
53
+ }
54
+ var ServiceMethodNotFoundError = class extends ServiceError {
55
+ name = "ServiceError.MethodNotFound";
56
+ };
57
+ function isServiceMethodNotFoundError(error) {
58
+ return error instanceof Error && error.name === "ServiceError.MethodNotFound";
59
+ }
24
60
  var PFrameError = class extends Error {
25
61
  name = "PFrameError";
26
62
  };
@@ -103,5 +139,5 @@ async function wrapAndSerializeAsync(callback) {
103
139
  }
104
140
 
105
141
  //#endregion
106
- export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
142
+ export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, ServiceAlreadyRegisteredError, ServiceError, ServiceInjectionError, ServiceInvalidIdError, ServiceMethodNotFoundError, ServiceNotRegisteredError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, isServiceAlreadyRegisteredError, isServiceError, isServiceInjectionError, isServiceInvalidIdError, isServiceMethodNotFoundError, isServiceNotRegisteredError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
107
143
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class ServiceError extends Error {\n name = \"ServiceError\";\n}\n\nexport function isServiceError(error: unknown): error is ServiceError {\n return (\n error instanceof Error &&\n (error.name === \"ServiceError\" || error.name.startsWith(\"ServiceError.\"))\n );\n}\n\nexport class ServiceInvalidIdError extends ServiceError {\n name = \"ServiceError.InvalidId\";\n}\n\nexport function isServiceInvalidIdError(error: unknown): error is ServiceInvalidIdError {\n return error instanceof Error && error.name === \"ServiceError.InvalidId\";\n}\n\nexport class ServiceAlreadyRegisteredError extends ServiceError {\n name = \"ServiceError.AlreadyRegistered\";\n}\n\nexport function isServiceAlreadyRegisteredError(\n error: unknown,\n): error is ServiceAlreadyRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.AlreadyRegistered\";\n}\n\nexport class ServiceInjectionError extends ServiceError {\n name = \"ServiceError.Injection\";\n}\n\nexport function isServiceInjectionError(error: unknown): error is ServiceInjectionError {\n return error instanceof Error && error.name === \"ServiceError.Injection\";\n}\n\nexport class ServiceNotRegisteredError extends ServiceError {\n name = \"ServiceError.NotRegistered\";\n}\n\nexport function isServiceNotRegisteredError(error: unknown): error is ServiceNotRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.NotRegistered\";\n}\n\nexport class ServiceMethodNotFoundError extends ServiceError {\n name = \"ServiceError.MethodNotFound\";\n}\n\nexport function isServiceMethodNotFoundError(error: unknown): error is ServiceMethodNotFoundError {\n return error instanceof Error && error.name === \"ServiceError.MethodNotFound\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"block_flags.cjs","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n};\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n >\n>;\n"],"mappings":";;AAwBA,MAAa,0BAA0B,CAAC,qBAAqB,6BAA6B;AAE1F,MAAa,0BAA0B;CACrC;CACA;CACA;CACD"}
1
+ {"version":3,"file":"block_flags.cjs","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"../services\";\nimport type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n} & ServiceRequireFlags;\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\n// Adding a service to Services automatically satisfies this assertion via ServiceRequireFlags.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n | ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n | keyof ServiceRequireFlags\n >\n>;\n"],"mappings":";;AAyBA,MAAa,0BAA0B,CAAC,qBAAqB,6BAA6B;AAE1F,MAAa,0BAA0B;CACrC;CACA;CACA;CACD"}
@@ -1,3 +1,6 @@
1
+ import { ServiceRequireFlags } from "../services/service_types.js";
2
+ import "../services/index.js";
3
+
1
4
  //#region src/flags/block_flags.d.ts
2
5
  /**
3
6
  * Block-specific feature flags. Define flags that are interpreted by the desktop app to select
@@ -17,7 +20,7 @@ type BlockCodeKnownFeatureFlags = {
17
20
  readonly requiresModelAPIVersion?: number;
18
21
  readonly requiresUIAPIVersion?: number;
19
22
  readonly requiresCreatePTable?: number;
20
- };
23
+ } & ServiceRequireFlags;
21
24
  declare const AllSupportsFeatureFlags: readonly ["supportsLazyState", "supportsPframeQueryRanking"];
22
25
  declare const AllRequiresFeatureFlags: readonly ["requiresUIAPIVersion", "requiresCreatePTable", "requiresModelAPIVersion"];
23
26
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"block_flags.js","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n};\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n >\n>;\n"],"mappings":";AAwBA,MAAa,0BAA0B,CAAC,qBAAqB,6BAA6B;AAE1F,MAAa,0BAA0B;CACrC;CACA;CACA;CACD"}
1
+ {"version":3,"file":"block_flags.js","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"../services\";\nimport type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n} & ServiceRequireFlags;\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\n// Adding a service to Services automatically satisfies this assertion via ServiceRequireFlags.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n | ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n | keyof ServiceRequireFlags\n >\n>;\n"],"mappings":";AAyBA,MAAa,0BAA0B,CAAC,qBAAqB,6BAA6B;AAE1F,MAAa,0BAA0B;CACrC;CACA;CACA;CACD"}
@@ -1,5 +1,5 @@
1
- import { BlockCodeFeatureFlags, BlockCodeKnownFeatureFlags } from "./block_flags.js";
2
1
  import { FilterKeysByPrefix } from "./type_utils.js";
2
+ import { BlockCodeFeatureFlags, BlockCodeKnownFeatureFlags } from "./block_flags.js";
3
3
 
4
4
  //#region src/flags/flag_utils.d.ts
5
5
  declare function checkBlockFlag(flags: BlockCodeFeatureFlags | undefined, flag: keyof BlockCodeKnownFeatureFlags, flagValue?: boolean | number): boolean;
@@ -0,0 +1,3 @@
1
+ import { ArrayTypeUnion, Assert, AssertKeysEqual, FilterKeysByPrefix, Is, IsSubtypeOf } from "./type_utils.js";
2
+ import { IncompatibleFlagsError, RuntimeCapabilities, SupportedRequirement, checkBlockFlag, extractAllRequirements, extractAllSupports } from "./flag_utils.js";
3
+ import { AllRequiresFeatureFlags, AllSupportsFeatureFlags, BlockCodeFeatureFlags, BlockCodeKnownFeatureFlags } from "./block_flags.js";