@milaboratories/pl-model-common 1.46.3 → 1.47.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 (178) hide show
  1. package/dist/columns/accessor_traversal.cjs +119 -0
  2. package/dist/columns/accessor_traversal.cjs.map +1 -0
  3. package/dist/columns/accessor_traversal.d.ts +52 -0
  4. package/dist/columns/accessor_traversal.d.ts.map +1 -0
  5. package/dist/columns/accessor_traversal.js +114 -0
  6. package/dist/columns/accessor_traversal.js.map +1 -0
  7. package/dist/columns/column_registry.cjs +40 -0
  8. package/dist/columns/column_registry.cjs.map +1 -0
  9. package/dist/columns/column_registry.d.ts +31 -0
  10. package/dist/columns/column_registry.d.ts.map +1 -0
  11. package/dist/columns/column_registry.js +40 -0
  12. package/dist/columns/column_registry.js.map +1 -0
  13. package/dist/columns/column_selector.cjs +49 -0
  14. package/dist/columns/column_selector.cjs.map +1 -0
  15. package/dist/columns/column_selector.d.ts +33 -0
  16. package/dist/columns/column_selector.d.ts.map +1 -0
  17. package/dist/columns/column_selector.js +47 -0
  18. package/dist/columns/column_selector.js.map +1 -0
  19. package/dist/columns/dedup.cjs +47 -0
  20. package/dist/columns/dedup.cjs.map +1 -0
  21. package/dist/columns/dedup.d.ts +27 -0
  22. package/dist/columns/dedup.d.ts.map +1 -0
  23. package/dist/columns/dedup.js +47 -0
  24. package/dist/columns/dedup.js.map +1 -0
  25. package/dist/columns/index.cjs +18 -0
  26. package/dist/columns/index.d.ts +8 -0
  27. package/dist/columns/index.js +6 -0
  28. package/dist/columns/providers.cjs +62 -0
  29. package/dist/columns/providers.cjs.map +1 -0
  30. package/dist/columns/providers.d.ts +39 -0
  31. package/dist/columns/providers.d.ts.map +1 -0
  32. package/dist/columns/providers.js +61 -0
  33. package/dist/columns/providers.js.map +1 -0
  34. package/dist/columns/types.d.ts +108 -0
  35. package/dist/columns/types.d.ts.map +1 -0
  36. package/dist/driver_kit.d.ts +1 -2
  37. package/dist/driver_kit.d.ts.map +1 -1
  38. package/dist/drivers/columns/columns_collection_driver.d.ts +124 -0
  39. package/dist/drivers/columns/columns_collection_driver.d.ts.map +1 -0
  40. package/dist/drivers/columns/discover_columns_options.cjs +28 -0
  41. package/dist/drivers/columns/discover_columns_options.cjs.map +1 -0
  42. package/dist/drivers/columns/discover_columns_options.d.ts +64 -0
  43. package/dist/drivers/columns/discover_columns_options.d.ts.map +1 -0
  44. package/dist/drivers/columns/discover_columns_options.js +28 -0
  45. package/dist/drivers/columns/discover_columns_options.js.map +1 -0
  46. package/dist/drivers/columns/index.d.ts +3 -0
  47. package/dist/drivers/index.cjs +32 -7
  48. package/dist/drivers/index.d.ts +12 -9
  49. package/dist/drivers/index.js +6 -4
  50. package/dist/drivers/pframe/driver.d.ts +1 -2
  51. package/dist/drivers/pframe/driver.d.ts.map +1 -1
  52. package/dist/drivers/pframe/index.cjs +30 -7
  53. package/dist/drivers/pframe/index.d.ts +9 -8
  54. package/dist/drivers/pframe/index.js +5 -4
  55. package/dist/drivers/pframe/query/index.d.ts +2 -2
  56. package/dist/drivers/pframe/query/query_common.d.ts +24 -1
  57. package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
  58. package/dist/drivers/pframe/query/query_spec.d.ts +25 -24
  59. package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
  60. package/dist/drivers/pframe/query/utils.cjs +18 -8
  61. package/dist/drivers/pframe/query/utils.cjs.map +1 -1
  62. package/dist/drivers/pframe/query/utils.d.ts +5 -1
  63. package/dist/drivers/pframe/query/utils.d.ts.map +1 -1
  64. package/dist/drivers/pframe/query/utils.js +18 -8
  65. package/dist/drivers/pframe/query/utils.js.map +1 -1
  66. package/dist/drivers/pframe/spec/anchored.d.ts +2 -2
  67. package/dist/drivers/pframe/spec/discovered_column.cjs +31 -15
  68. package/dist/drivers/pframe/spec/discovered_column.cjs.map +1 -1
  69. package/dist/drivers/pframe/spec/discovered_column.d.ts +23 -13
  70. package/dist/drivers/pframe/spec/discovered_column.d.ts.map +1 -1
  71. package/dist/drivers/pframe/spec/discovered_column.js +26 -12
  72. package/dist/drivers/pframe/spec/discovered_column.js.map +1 -1
  73. package/dist/drivers/pframe/spec/filtered_column.cjs +46 -0
  74. package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
  75. package/dist/drivers/pframe/spec/filtered_column.d.ts +39 -1
  76. package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -1
  77. package/dist/drivers/pframe/spec/filtered_column.js +41 -1
  78. package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
  79. package/dist/drivers/pframe/spec/ids.cjs +62 -10
  80. package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
  81. package/dist/drivers/pframe/spec/ids.d.ts +48 -15
  82. package/dist/drivers/pframe/spec/ids.d.ts.map +1 -1
  83. package/dist/drivers/pframe/spec/ids.js +60 -9
  84. package/dist/drivers/pframe/spec/ids.js.map +1 -1
  85. package/dist/drivers/pframe/spec/index.cjs +30 -7
  86. package/dist/drivers/pframe/spec/index.d.ts +6 -5
  87. package/dist/drivers/pframe/spec/index.js +5 -4
  88. package/dist/drivers/pframe/spec/native_id.cjs +1 -0
  89. package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
  90. package/dist/drivers/pframe/spec/native_id.js +1 -0
  91. package/dist/drivers/pframe/spec/native_id.js.map +1 -1
  92. package/dist/drivers/pframe/spec/overridden.cjs +212 -0
  93. package/dist/drivers/pframe/spec/overridden.cjs.map +1 -0
  94. package/dist/drivers/pframe/spec/overridden.d.ts +67 -0
  95. package/dist/drivers/pframe/spec/overridden.d.ts.map +1 -0
  96. package/dist/drivers/pframe/spec/overridden.js +202 -0
  97. package/dist/drivers/pframe/spec/overridden.js.map +1 -0
  98. package/dist/drivers/pframe/spec/selectors.cjs +1 -0
  99. package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
  100. package/dist/drivers/pframe/spec/selectors.d.ts +3 -0
  101. package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
  102. package/dist/drivers/pframe/spec/selectors.js +1 -0
  103. package/dist/drivers/pframe/spec/selectors.js.map +1 -1
  104. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  105. package/dist/drivers/pframe/spec/spec.d.ts +2 -3
  106. package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
  107. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  108. package/dist/drivers/pframe/spec_driver.d.ts +2 -2
  109. package/dist/drivers/pframe/spec_driver.d.ts.map +1 -1
  110. package/dist/drivers/pframe/table_calculate.cjs +2 -2
  111. package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
  112. package/dist/drivers/pframe/table_calculate.d.ts +6 -2
  113. package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
  114. package/dist/drivers/pframe/table_calculate.js +2 -2
  115. package/dist/drivers/pframe/table_calculate.js.map +1 -1
  116. package/dist/drivers/pframe/table_common.cjs.map +1 -1
  117. package/dist/drivers/pframe/table_common.d.ts +11 -4
  118. package/dist/drivers/pframe/table_common.d.ts.map +1 -1
  119. package/dist/drivers/pframe/table_common.js.map +1 -1
  120. package/dist/index.cjs +63 -10
  121. package/dist/index.d.ts +20 -11
  122. package/dist/index.js +15 -6
  123. package/dist/pool/index.cjs +18 -0
  124. package/dist/pool/index.d.ts +2 -2
  125. package/dist/pool/index.js +3 -0
  126. package/dist/pool/spec.cjs +59 -11
  127. package/dist/pool/spec.cjs.map +1 -1
  128. package/dist/pool/spec.d.ts +24 -9
  129. package/dist/pool/spec.d.ts.map +1 -1
  130. package/dist/pool/spec.js +50 -10
  131. package/dist/pool/spec.js.map +1 -1
  132. package/dist/services/index.d.ts +2 -2
  133. package/dist/services/service_declarations.cjs +22 -0
  134. package/dist/services/service_declarations.cjs.map +1 -1
  135. package/dist/services/service_declarations.d.ts +5 -3
  136. package/dist/services/service_declarations.d.ts.map +1 -1
  137. package/dist/services/service_declarations.js +22 -0
  138. package/dist/services/service_declarations.js.map +1 -1
  139. package/dist/services/service_registry.cjs.map +1 -1
  140. package/dist/services/service_registry.d.ts +3 -3
  141. package/dist/services/service_registry.d.ts.map +1 -1
  142. package/dist/services/service_registry.js.map +1 -1
  143. package/dist/services/service_types.cjs.map +1 -1
  144. package/dist/services/service_types.d.ts +25 -9
  145. package/dist/services/service_types.d.ts.map +1 -1
  146. package/dist/services/service_types.js.map +1 -1
  147. package/package.json +3 -2
  148. package/src/columns/accessor_traversal.ts +139 -0
  149. package/src/columns/column_registry.ts +41 -0
  150. package/src/columns/column_selector.ts +100 -0
  151. package/src/columns/dedup.ts +49 -0
  152. package/src/columns/index.ts +6 -0
  153. package/src/columns/providers.ts +74 -0
  154. package/src/columns/types.ts +116 -0
  155. package/src/drivers/columns/columns_collection_driver.ts +146 -0
  156. package/src/drivers/columns/discover_columns_options.ts +91 -0
  157. package/src/drivers/columns/index.ts +2 -0
  158. package/src/drivers/index.ts +1 -0
  159. package/src/drivers/pframe/index.ts +0 -1
  160. package/src/drivers/pframe/query/query_common.ts +24 -0
  161. package/src/drivers/pframe/query/query_spec.ts +38 -25
  162. package/src/drivers/pframe/query/utils.test.ts +6 -6
  163. package/src/drivers/pframe/query/utils.ts +27 -7
  164. package/src/drivers/pframe/spec/discovered_column.ts +43 -28
  165. package/src/drivers/pframe/spec/filtered_column.ts +66 -0
  166. package/src/drivers/pframe/spec/ids.ts +142 -17
  167. package/src/drivers/pframe/spec/index.ts +1 -0
  168. package/src/drivers/pframe/spec/overridden.ts +285 -0
  169. package/src/drivers/pframe/spec/selectors.ts +3 -0
  170. package/src/drivers/pframe/spec/spec.ts +7 -3
  171. package/src/drivers/pframe/spec_driver.ts +3 -3
  172. package/src/drivers/pframe/table_calculate.ts +13 -3
  173. package/src/drivers/pframe/table_common.ts +10 -3
  174. package/src/index.ts +1 -0
  175. package/src/pool/spec.ts +69 -23
  176. package/src/services/service_declarations.ts +31 -0
  177. package/src/services/service_registry.ts +8 -4
  178. package/src/services/service_types.ts +35 -9
@@ -174,7 +174,13 @@ export const Annotation = {
174
174
  },
175
175
  } as const;
176
176
 
177
- export type AnnotationDataStatus = "computing" | "ready" | "error" | "absent";
177
+ export type AnnotationDataStatus =
178
+ | "missing"
179
+ | "resolving"
180
+ | "absent"
181
+ | "computing"
182
+ | "ready"
183
+ | "error";
178
184
 
179
185
  export type Annotation = Metadata &
180
186
  Partial<{
@@ -710,8 +716,6 @@ export interface PColumn<Data> extends PObject<Data> {
710
716
  readonly spec: PColumnSpec;
711
717
  }
712
718
 
713
- export type PColumnLazy<T> = PColumn<() => T>;
714
-
715
719
  /** Columns in a PFrame also have internal identifier, this object represents
716
720
  * combination of specs and such id */
717
721
  export interface PColumnIdAndSpec {
@@ -1,6 +1,5 @@
1
1
  import type { Branded } from "@milaboratories/helpers";
2
2
  import type { PoolEntry } from "../../pool_entry";
3
- import type { PObjectId } from "../../pool";
4
3
  import type {
5
4
  AxisSpec,
6
5
  AxesSpec,
@@ -15,6 +14,7 @@ import type {
15
14
  import type { PTableColumnId, PTableColumnSpec } from "./table_common";
16
15
  import type { PTableRecordFilter } from "./table_calculate";
17
16
  import { DataQuery, DataQueryBooleanExpression, SpecQuery, SpecQueryJoinEntry } from "./query";
17
+ import { PObjectId } from "../..";
18
18
 
19
19
  /** Matches a string value either exactly or by regex pattern */
20
20
  export type StringMatcher =
@@ -167,10 +167,10 @@ export interface DiscoverColumnsMappingVariant {
167
167
  export interface DiscoverColumnsResponseHit {
168
168
  /** The column that was found compatible */
169
169
  hit: PColumnIdAndSpec;
170
- /** Possible ways to integrate this column with the existing set */
171
- mappingVariants: DiscoverColumnsMappingVariant[];
172
170
  /** Linker steps traversed to reach this hit; empty for direct matches */
173
171
  path: DiscoverColumnsStepInfo[];
172
+ /** Possible ways to integrate this column with the existing set */
173
+ mappingVariants: DiscoverColumnsMappingVariant[];
174
174
  }
175
175
 
176
176
  /** Response from discover columns */
@@ -4,7 +4,7 @@ import type { PObjectId } from "../../pool";
4
4
  import { assertNever } from "../../util";
5
5
  import { getAxisId, type PColumn } from "./spec/spec";
6
6
  import type { PColumnValues } from "./data_info";
7
- import type { SpecQuery } from "./query/query_spec";
7
+ import type { SpecQuery, SpecQueryJoinEntry } from "./query/query_spec";
8
8
  import { canonicalizeJson } from "../../json";
9
9
  import { mapSpecQueryColumns } from "./query";
10
10
 
@@ -422,8 +422,18 @@ export function sortPTableDef(def: PTableDef<PObjectId>): PTableDef<PObjectId> {
422
422
  };
423
423
  }
424
424
 
425
- export function mapPTableDefV2<C1, C2>(def: PTableDefV2<C1>, cb: (c: C1) => C2): PTableDefV2<C2> {
426
- return { query: mapSpecQueryColumns(def.query, cb) };
425
+ export function mapPTableDefV2<C1, C2>(
426
+ def: PTableDefV2<C1>,
427
+ visitor: {
428
+ /** Transform column references in leaf nodes (column, sparseToDenseColumn). */
429
+ column: (c: C1) => C2;
430
+ /** Visit a node after its children have been traversed. */
431
+ node?: (node: SpecQuery<C2>) => SpecQuery<C2>;
432
+ /** Visit a join entry after its inner query has been traversed. */
433
+ joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;
434
+ },
435
+ ): PTableDefV2<C2> {
436
+ return { query: mapSpecQueryColumns(def.query, visitor) };
427
437
  }
428
438
 
429
439
  export function mapJoinEntry<C1, C2>(entry: JoinEntry<C1>, cb: (c: C1) => C2): JoinEntry<C2> {
@@ -1,5 +1,5 @@
1
- import type { PObjectId } from "../../pool";
2
1
  import type { AxisId, AxisSpec, PColumnSpec } from "./spec/spec";
2
+ import type { ColumnUniversalId } from "./spec/ids";
3
3
 
4
4
  export type PTableColumnSpecAxis = {
5
5
  type: "axis";
@@ -9,7 +9,13 @@ export type PTableColumnSpecAxis = {
9
9
 
10
10
  export type PTableColumnSpecColumn = {
11
11
  type: "column";
12
- id: PObjectId;
12
+ /**
13
+ * Leaf column id as it appears in the SpecQuery — may be a rich
14
+ * {@link ColumnUniversalId} (Discovered / Overridden / Filtered) or a bare
15
+ * {@link PObjectId}. The host resolver strips to bare via `extractPObjectId`
16
+ * before physical lookup.
17
+ */
18
+ id: ColumnUniversalId;
13
19
  spec: PColumnSpec;
14
20
  };
15
21
 
@@ -23,7 +29,8 @@ export type PTableColumnIdAxis = {
23
29
 
24
30
  export type PTableColumnIdColumn = {
25
31
  type: "column";
26
- id: PObjectId;
32
+ /** @see PTableColumnSpecColumn.id */
33
+ id: ColumnUniversalId;
27
34
  };
28
35
 
29
36
  /** Unified PTable column identifier */
package/src/index.ts CHANGED
@@ -22,3 +22,4 @@ export * from "./resource_types";
22
22
  export * from "./services";
23
23
  export * from "./pool_entry";
24
24
  export * from "./project_id";
25
+ export * from "./columns";
package/src/pool/spec.ts CHANGED
@@ -1,7 +1,8 @@
1
- import type { Branded } from "../branding";
2
- import type { JoinEntry, PColumn, PColumnLazy, PColumnSpec } from "../drivers";
1
+ import type { JoinEntry, PColumn, PColumnSpec } from "../drivers";
3
2
  import { assertNever } from "../util";
4
- import type { ResultPoolEntry } from "./entry";
3
+ import { PlRef } from "../ref";
4
+ import { CanonicalizedJson, canonicalizeJson, parseJsonSafely } from "../json";
5
+ import { Branded } from "@milaboratories/helpers";
5
6
 
6
7
  /** Any object exported into the result pool by the block always have spec attached to it */
7
8
  export type PObjectSpec = {
@@ -22,8 +23,65 @@ export type PObjectSpec = {
22
23
  readonly annotations?: Record<string, string>;
23
24
  };
24
25
 
26
+ export type LocalPObjectKey = { resolvePath: string[]; name: string };
27
+ export type LocalPObjectId = Branded<CanonicalizedJson<LocalPObjectKey>, "LocalPObjectId">;
28
+ export type GlobalPObjectKey = PlRef;
29
+ export type GlobalPObjectId = Branded<CanonicalizedJson<GlobalPObjectKey>, "GlobalPObjectId">;
25
30
  /** Stable PObject id */
26
- export type PObjectId = Branded<string, "PColumnId">;
31
+ export type PObjectId = LocalPObjectId | GlobalPObjectId;
32
+
33
+ export function isPObjectId(value: unknown): value is PObjectId {
34
+ if (typeof value !== "string") return false;
35
+ return isPObjectKey(parseJsonSafely(value));
36
+ }
37
+
38
+ export function isPObjectKey(value: unknown): value is LocalPObjectKey | GlobalPObjectKey {
39
+ return isLocalPObjectKey(value) || isGlobalPObjectKey(value);
40
+ }
41
+
42
+ export function createPObjectId(obj: LocalPObjectKey | GlobalPObjectKey): PObjectId {
43
+ if (isLocalPObjectKey(obj)) {
44
+ return createLocalPObjectId(obj.resolvePath, obj.name);
45
+ }
46
+ if (isGlobalPObjectKey(obj)) {
47
+ return createGlobalPObjectId(obj.blockId, obj.name);
48
+ }
49
+ throw new Error(`createPObjectId: unrecognized object key structure: ${JSON.stringify(obj)}`);
50
+ }
51
+
52
+ export function createLocalPObjectId(resolvePath: string[], name: string): PObjectId {
53
+ return canonicalizeJson({ resolvePath, name }) as PObjectId;
54
+ }
55
+
56
+ export function isLocalPObjectId(value: unknown): value is LocalPObjectId {
57
+ if (typeof value !== "string") return false;
58
+ return isLocalPObjectKey(parseJsonSafely<LocalPObjectKey>(value));
59
+ }
60
+
61
+ export function isLocalPObjectKey(value: unknown): value is LocalPObjectKey {
62
+ if (typeof value !== "object" || value === null) return false;
63
+ const v = value as LocalPObjectKey;
64
+ return Array.isArray(v.resolvePath) && typeof v.name === "string";
65
+ }
66
+
67
+ export function createGlobalPObjectId(blockId: string, exportName: string): PObjectId {
68
+ return canonicalizeJson({
69
+ __isRef: true,
70
+ blockId,
71
+ name: exportName,
72
+ } satisfies PlRef) as PObjectId;
73
+ }
74
+
75
+ export function isGlobalPObjectKey(value: unknown): value is GlobalPObjectKey {
76
+ if (typeof value !== "object" || value === null) return false;
77
+ return "__isRef" in value && "blockId" in value && "name" in value;
78
+ }
79
+
80
+ export function isGlobalPObjectId(value: unknown): value is GlobalPObjectId {
81
+ if (typeof value !== "string") return false;
82
+ const parsed = parseJsonSafely<GlobalPObjectKey>(value);
83
+ return isGlobalPObjectKey(parsed);
84
+ }
27
85
 
28
86
  /**
29
87
  * Full PObject representation.
@@ -41,24 +99,16 @@ export interface PObject<Data> {
41
99
  readonly data: Data;
42
100
  }
43
101
 
44
- export function isPColumnSpec(spec: PObjectSpec): spec is PColumnSpec {
45
- return spec.kind === "PColumn";
102
+ export function isPObject<Data>(obj: unknown): obj is PObject<Data> {
103
+ return typeof obj === "object" && obj !== null && "id" in obj && "spec" in obj && "data" in obj;
46
104
  }
47
105
 
48
- export function isPColumn<T>(obj: PObject<T>): obj is PColumn<T> {
49
- return isPColumnSpec(obj.spec);
106
+ export function isPColumn<T>(obj: unknown): obj is PColumn<T> {
107
+ return isPObject(obj) && isPColumnSpec(obj.spec);
50
108
  }
51
109
 
52
- export function isPColumnSpecResult(
53
- r: ResultPoolEntry<PObjectSpec>,
54
- ): r is ResultPoolEntry<PColumnSpec> {
55
- return isPColumnSpec(r.obj);
56
- }
57
-
58
- export function isPColumnResult<T>(
59
- r: ResultPoolEntry<PObject<T>>,
60
- ): r is ResultPoolEntry<PColumn<T>> {
61
- return isPColumnSpec(r.obj.spec);
110
+ export function isPColumnSpec(spec: PObjectSpec): spec is PColumnSpec {
111
+ return spec.kind === "PColumn";
62
112
  }
63
113
 
64
114
  export function ensurePColumn<T>(obj: PObject<T>): PColumn<T> {
@@ -66,10 +116,6 @@ export function ensurePColumn<T>(obj: PObject<T>): PColumn<T> {
66
116
  return obj;
67
117
  }
68
118
 
69
- export function mapPObjectData<D1, D2>(
70
- pObj: PColumn<D1> | PColumnLazy<D1>,
71
- cb: (d: D1) => D2,
72
- ): PColumn<D2>;
73
119
  export function mapPObjectData<D1, D2>(pObj: PColumn<D1>, cb: (d: D1) => D2): PColumn<D2>;
74
120
  export function mapPObjectData<D1, D2>(
75
121
  pObj: PColumn<D1> | undefined,
@@ -88,7 +134,7 @@ export function mapPObjectData<D1, D2>(
88
134
  ? undefined
89
135
  : {
90
136
  ...pObj,
91
- data: cb(typeof pObj.data === "function" ? pObj.data() : pObj.data),
137
+ data: cb(pObj.data),
92
138
  };
93
139
  }
94
140
 
@@ -24,6 +24,10 @@
24
24
  */
25
25
 
26
26
  import type { DialogService } from "../dialog";
27
+ import type {
28
+ ColumnsCollectionDriver,
29
+ ColumnsCollectionDriverModel,
30
+ } from "../drivers/columns/columns_collection_driver";
27
31
  import type { PFrameDriver, PFrameModelDriver } from "../drivers/pframe/driver";
28
32
  import type { PFrameSpecDriver } from "../drivers/pframe/spec_driver";
29
33
  import { service } from "./service_types";
@@ -82,4 +86,31 @@ export const Services = {
82
86
  modelMethods: [] as const,
83
87
  uiMethods: ["showSaveDialog"] as const,
84
88
  }),
89
+ ColumnsCollection: service<
90
+ ColumnsCollectionDriverModel,
91
+ ColumnsCollectionDriverModel,
92
+ ColumnsCollectionDriver,
93
+ ColumnsCollectionDriver
94
+ >()({
95
+ type: "wasm",
96
+ name: "columnsCollection",
97
+ modelMethods: [
98
+ "create",
99
+ "isEmpty",
100
+ "isFinal",
101
+ "getColumns",
102
+ "addSource",
103
+ "discover",
104
+ "filter",
105
+ ] as const,
106
+ uiMethods: [
107
+ "create",
108
+ "isEmpty",
109
+ "isFinal",
110
+ "getColumns",
111
+ "addSource",
112
+ "discover",
113
+ "filter",
114
+ ] as const,
115
+ }),
85
116
  };
@@ -1,7 +1,7 @@
1
1
  import type {
2
2
  ServiceTypesLike,
3
- InferServiceModel,
4
- InferServiceUi,
3
+ InferServiceModelHost,
4
+ InferServiceUiHost,
5
5
  ServiceName,
6
6
  ModelServiceFactoryMap,
7
7
  UiServiceFactoryMap,
@@ -71,7 +71,9 @@ export class ModelServiceRegistry<
71
71
  get<S extends ServiceTypesLike>(
72
72
  id: ServiceName<S>,
73
73
  ):
74
- | ([unknown] extends [InferServiceModel<S>] ? Record<string, Function> : InferServiceModel<S>)
74
+ | ([unknown] extends [InferServiceModelHost<S>]
75
+ ? Record<string, Function>
76
+ : InferServiceModelHost<S>)
75
77
  | null;
76
78
  get(id: ServiceName): Record<string, Function> | null {
77
79
  return this.getById(id);
@@ -87,7 +89,9 @@ export class UiServiceRegistry<
87
89
 
88
90
  get<S extends ServiceTypesLike>(
89
91
  id: ServiceName<S>,
90
- ): ([unknown] extends [InferServiceUi<S>] ? Record<string, Function> : InferServiceUi<S>) | null;
92
+ ):
93
+ | ([unknown] extends [InferServiceUiHost<S>] ? Record<string, Function> : InferServiceUiHost<S>)
94
+ | null;
91
95
  get(id: ServiceName): Record<string, Function> | null {
92
96
  return this.getById(id);
93
97
  }
@@ -7,18 +7,44 @@ export type ServiceTypesLike<
7
7
  Model = unknown,
8
8
  Ui = unknown,
9
9
  Kind extends ServiceType = ServiceType,
10
+ ModelHost = Model,
11
+ UiHost = Ui,
10
12
  > = {
11
- readonly __types?: { model: Model; ui: Ui; kind: Kind };
13
+ readonly __types?: {
14
+ model: Model;
15
+ ui: Ui;
16
+ kind: Kind;
17
+ modelHost: ModelHost;
18
+ uiHost: UiHost;
19
+ };
12
20
  };
13
21
 
14
22
  export type InferServiceModel<S extends ServiceTypesLike> =
15
- S extends ServiceTypesLike<infer M, unknown, ServiceType> ? M : unknown;
23
+ S extends ServiceTypesLike<infer M, unknown, ServiceType, unknown, unknown> ? M : unknown;
16
24
 
17
25
  export type InferServiceUi<S extends ServiceTypesLike> =
18
- S extends ServiceTypesLike<unknown, infer U, ServiceType> ? U : unknown;
26
+ S extends ServiceTypesLike<unknown, infer U, ServiceType, unknown, unknown> ? U : unknown;
19
27
 
20
28
  export type InferServiceKind<S extends ServiceTypesLike> =
21
- S extends ServiceTypesLike<unknown, unknown, infer K> ? K : ServiceType;
29
+ S extends ServiceTypesLike<unknown, unknown, infer K, unknown, unknown> ? K : ServiceType;
30
+
31
+ /**
32
+ * Host-side shape stored in the model service registry. Differs from
33
+ * {@link InferServiceModel} only when the registered impl carries extra
34
+ * parameters (e.g. per-call `host` bindings) that the sandbox-view does
35
+ * not expose. Defaults to {@link InferServiceModel}.
36
+ */
37
+ export type InferServiceModelHost<S extends ServiceTypesLike> =
38
+ S extends ServiceTypesLike<unknown, unknown, ServiceType, infer MH, unknown> ? MH : unknown;
39
+
40
+ /**
41
+ * Host-side shape stored in the UI service registry. Differs from
42
+ * {@link InferServiceUi} only when the registered impl carries extra
43
+ * parameters that the UI-proxy view does not expose. Defaults to
44
+ * {@link InferServiceUi}.
45
+ */
46
+ export type InferServiceUiHost<S extends ServiceTypesLike> =
47
+ S extends ServiceTypesLike<unknown, unknown, ServiceType, unknown, infer UH> ? UH : unknown;
22
48
 
23
49
  export type ServiceName<S extends ServiceTypesLike = ServiceTypesLike> = Branded<string, S>;
24
50
 
@@ -39,7 +65,7 @@ export const {
39
65
  const modelMethodsMap = new Map<string, readonly string[]>();
40
66
  const uiMethodsMap = new Map<string, readonly string[]>();
41
67
  return {
42
- service<Model, Ui>() {
68
+ service<Model, Ui, ModelHost = Model, UiHost = Ui>() {
43
69
  return <
44
70
  K extends ServiceType,
45
71
  N extends string,
@@ -50,7 +76,7 @@ export const {
50
76
  readonly name: N;
51
77
  readonly modelMethods: MM;
52
78
  readonly uiMethods: UM;
53
- }): Branded<N, ServiceTypesLike<Model, Ui, K>> => {
79
+ }): Branded<N, ServiceTypesLike<Model, Ui, K, ModelHost, UiHost>> => {
54
80
  const { name, type, modelMethods, uiMethods } = options;
55
81
  if (!SERVICE_ID_PATTERN.test(name)) {
56
82
  throw new ServiceInvalidIdError(
@@ -63,7 +89,7 @@ export const {
63
89
  typeMap.set(name, type);
64
90
  modelMethodsMap.set(name, modelMethods);
65
91
  uiMethodsMap.set(name, uiMethods);
66
- return name as Branded<N, ServiceTypesLike<Model, Ui, K>>;
92
+ return name as Branded<N, ServiceTypesLike<Model, Ui, K, ModelHost, UiHost>>;
67
93
  };
68
94
  },
69
95
  isNodeService(id: ServiceName): boolean {
@@ -95,11 +121,11 @@ export type ServiceBrand<T> =
95
121
  T extends Branded<string, infer S extends ServiceTypesLike> ? S : never;
96
122
 
97
123
  export type ModelServiceFactoryMap<SMap extends Record<string, ServiceName>> = {
98
- [K in keyof SMap]: (() => InferServiceModel<ServiceBrand<SMap[K]>>) | null;
124
+ [K in keyof SMap]: (() => InferServiceModelHost<ServiceBrand<SMap[K]>>) | null;
99
125
  };
100
126
 
101
127
  export type UiServiceFactoryMap<SMap extends Record<string, ServiceName>> = {
102
- [K in keyof SMap]: (() => InferServiceUi<ServiceBrand<SMap[K]>>) | null;
128
+ [K in keyof SMap]: (() => InferServiceUiHost<ServiceBrand<SMap[K]>>) | null;
103
129
  };
104
130
 
105
131
  /** Contract between any service provider and any service consumer. */