@genome-spy/core 0.74.0 → 0.75.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 (79) hide show
  1. package/dist/bundle/index.es.js +4660 -4468
  2. package/dist/bundle/index.js +81 -81
  3. package/dist/schema.json +220 -12
  4. package/dist/src/data/sources/dataUtils.d.ts +25 -0
  5. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  6. package/dist/src/data/sources/dataUtils.js +23 -0
  7. package/dist/src/data/sources/inlineSource.js +2 -2
  8. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  9. package/dist/src/data/sources/urlSource.js +8 -3
  10. package/dist/src/encoder/encoder.d.ts +2 -2
  11. package/dist/src/encoder/encoder.d.ts.map +1 -1
  12. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  13. package/dist/src/genome/scaleLocus.js +8 -3
  14. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  15. package/dist/src/genomeSpy/interactionController.js +91 -51
  16. package/dist/src/gl/dataToVertices.d.ts +12 -14
  17. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  18. package/dist/src/gl/dataToVertices.js +116 -95
  19. package/dist/src/gl/glslScaleGenerator.d.ts +3 -0
  20. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  21. package/dist/src/gl/glslScaleGenerator.js +10 -8
  22. package/dist/src/gl/vertexRangeIndex.d.ts +23 -0
  23. package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -0
  24. package/dist/src/gl/vertexRangeIndex.js +150 -0
  25. package/dist/src/marks/mark.d.ts +1 -1
  26. package/dist/src/paramRuntime/expressionCompiler.d.ts +2 -1
  27. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -1
  28. package/dist/src/paramRuntime/expressionCompiler.js +3 -2
  29. package/dist/src/paramRuntime/expressionRef.d.ts +4 -1
  30. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -1
  31. package/dist/src/paramRuntime/expressionRef.js +10 -3
  32. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -1
  33. package/dist/src/paramRuntime/graphRuntime.js +15 -6
  34. package/dist/src/paramRuntime/paramRuntime.d.ts +8 -2
  35. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -1
  36. package/dist/src/paramRuntime/paramRuntime.js +10 -5
  37. package/dist/src/paramRuntime/types.d.ts +1 -0
  38. package/dist/src/paramRuntime/types.d.ts.map +1 -1
  39. package/dist/src/paramRuntime/types.js +1 -0
  40. package/dist/src/paramRuntime/viewParamRuntime.d.ts +5 -4
  41. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  42. package/dist/src/paramRuntime/viewParamRuntime.js +17 -6
  43. package/dist/src/scale/scale.d.ts.map +1 -1
  44. package/dist/src/scale/scale.js +1 -0
  45. package/dist/src/scales/domainPlanner.d.ts +57 -11
  46. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  47. package/dist/src/scales/domainPlanner.js +182 -83
  48. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  49. package/dist/src/scales/scaleInstanceManager.js +7 -2
  50. package/dist/src/scales/scalePropsResolver.d.ts +3 -3
  51. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  52. package/dist/src/scales/scalePropsResolver.js +28 -5
  53. package/dist/src/scales/scaleResolution.d.ts +12 -1
  54. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  55. package/dist/src/scales/scaleResolution.js +171 -18
  56. package/dist/src/screenshotExport.d.ts +23 -0
  57. package/dist/src/screenshotExport.d.ts.map +1 -0
  58. package/dist/src/screenshotExport.js +44 -0
  59. package/dist/src/screenshotHarness.d.ts.map +1 -1
  60. package/dist/src/screenshotHarness.js +26 -24
  61. package/dist/src/spec/axis.d.ts +2 -2
  62. package/dist/src/spec/channel.d.ts +4 -4
  63. package/dist/src/spec/data.d.ts +12 -0
  64. package/dist/src/spec/scale.d.ts +13 -1
  65. package/dist/src/utils/expression.d.ts +16 -8
  66. package/dist/src/utils/expression.d.ts.map +1 -1
  67. package/dist/src/utils/expression.js +291 -11
  68. package/dist/src/view/flowBuilder.d.ts +1 -1
  69. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  70. package/dist/src/view/flowBuilder.js +11 -7
  71. package/dist/src/view/resolutionPlanner.d.ts +9 -0
  72. package/dist/src/view/resolutionPlanner.d.ts.map +1 -0
  73. package/dist/src/view/resolutionPlanner.js +302 -0
  74. package/dist/src/view/unitView.d.ts +1 -1
  75. package/dist/src/view/unitView.d.ts.map +1 -1
  76. package/dist/src/view/unitView.js +5 -152
  77. package/dist/src/view/view.d.ts.map +1 -1
  78. package/dist/src/view/view.js +2 -1
  79. package/package.json +2 -2
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @callback VertexReader
3
+ * @param {number} vertexIndex
4
+ * @returns {number}
5
+ */
6
+ /**
7
+ * A binned index for vertex ranges that are already emitted into typed arrays.
8
+ * The readers operate on vertices, not source datums.
9
+ *
10
+ * The scan is run-based: consecutive vertices with the same effective x
11
+ * interval are collapsed into one range before binning.
12
+ *
13
+ * @param {number} size Number of bins
14
+ * @param {[number, number]} domain Domain of positions
15
+ * @param {VertexReader} readStart Reader for the start x value at a vertex
16
+ * @param {VertexReader} [readEnd=readStart] Reader for the end x value at a vertex
17
+ * @param {number} [startVertexIndex=0] First vertex index in the scanned range
18
+ * @param {number} [endVertexIndex=startVertexIndex] One past the last vertex index
19
+ * @returns {import("../utils/binnedIndex.js").Lookup | undefined}
20
+ */
21
+ export function createVertexRangeIndexer(size: number, domain: [number, number], readStart: VertexReader, readEnd?: VertexReader, startVertexIndex?: number, endVertexIndex?: number): import("../utils/binnedIndex.js").Lookup | undefined;
22
+ export type VertexReader = (vertexIndex: number) => number;
23
+ //# sourceMappingURL=vertexRangeIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexRangeIndex.d.ts","sourceRoot":"","sources":["../../../src/gl/vertexRangeIndex.js"],"names":[],"mappings":"AAKA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AACH,+CARW,MAAM,UACN,CAAC,MAAM,EAAE,MAAM,CAAC,aAChB,YAAY,YACZ,YAAY,qBACZ,MAAM,mBACN,MAAM,GACJ,OAAO,yBAAyB,EAAE,MAAM,GAAG,SAAS,CA6HhE;yCA9IU,MAAM,KACJ,MAAM"}
@@ -0,0 +1,150 @@
1
+ import clamp from "../utils/clamp.js";
2
+
3
+ const MAX_INTEGER = 2 ** 31 - 1;
4
+ const MIN_INTEGER = -(2 ** 31);
5
+
6
+ /**
7
+ * @callback VertexReader
8
+ * @param {number} vertexIndex
9
+ * @returns {number}
10
+ */
11
+
12
+ /**
13
+ * A binned index for vertex ranges that are already emitted into typed arrays.
14
+ * The readers operate on vertices, not source datums.
15
+ *
16
+ * The scan is run-based: consecutive vertices with the same effective x
17
+ * interval are collapsed into one range before binning.
18
+ *
19
+ * @param {number} size Number of bins
20
+ * @param {[number, number]} domain Domain of positions
21
+ * @param {VertexReader} readStart Reader for the start x value at a vertex
22
+ * @param {VertexReader} [readEnd=readStart] Reader for the end x value at a vertex
23
+ * @param {number} [startVertexIndex=0] First vertex index in the scanned range
24
+ * @param {number} [endVertexIndex=startVertexIndex] One past the last vertex index
25
+ * @returns {import("../utils/binnedIndex.js").Lookup | undefined}
26
+ */
27
+ export function createVertexRangeIndexer(
28
+ size,
29
+ domain,
30
+ readStart,
31
+ readEnd = readStart,
32
+ startVertexIndex = 0,
33
+ endVertexIndex = startVertexIndex
34
+ ) {
35
+ if (endVertexIndex <= startVertexIndex) {
36
+ return undefined;
37
+ }
38
+
39
+ if (domain[1] <= domain[0]) {
40
+ return undefined;
41
+ }
42
+
43
+ const startIndices = new Array(size);
44
+ startIndices.fill(MAX_INTEGER);
45
+
46
+ const endIndices = new Array(size);
47
+ endIndices.fill(0);
48
+
49
+ const start = domain[0];
50
+ const domainLength = domain[1] - domain[0];
51
+ const divisor = domainLength / size;
52
+
53
+ /**
54
+ * @param {number} pos
55
+ * @param {boolean} end
56
+ */
57
+ const getBin = (pos, end) => {
58
+ const unfloored = (pos - start) / divisor;
59
+ const floored = Math.floor(unfloored);
60
+
61
+ // Special handling for the end coordinate because we are using half-open ranges.
62
+ return clamp(
63
+ end && floored == unfloored ? floored - 1 : floored,
64
+ 0,
65
+ size - 1
66
+ );
67
+ };
68
+
69
+ let lastIndex = MIN_INTEGER;
70
+ let lastStart = -Infinity;
71
+ let unordered = false;
72
+
73
+ /**
74
+ * @type {import("../utils/binnedIndex.js").Lookup}
75
+ */
76
+ const lookup = (queryStart, queryEnd, arr = [0, 0]) => {
77
+ const startBin = getBin(queryStart, false);
78
+ const endBin = getBin(queryEnd, true);
79
+ const startIndex = startIndices[startBin];
80
+ const endIndex = Math.max(endIndices[endBin], startIndex);
81
+
82
+ arr[0] = startIndex;
83
+ arr[1] = endIndex;
84
+ return arr;
85
+ };
86
+
87
+ for (let i = startVertexIndex; i < endVertexIndex; ) {
88
+ const runStart = i;
89
+ const runX = readStart(i);
90
+ const runX2 = readEnd(i);
91
+
92
+ i += 1;
93
+ while (
94
+ i < endVertexIndex &&
95
+ readStart(i) === runX &&
96
+ readEnd(i) === runX2
97
+ ) {
98
+ i += 1;
99
+ }
100
+
101
+ if (runStart > lastIndex) {
102
+ lastIndex = runStart;
103
+ } else {
104
+ unordered = true;
105
+ break;
106
+ }
107
+
108
+ if (runX < lastStart || runX2 < runX) {
109
+ unordered = true;
110
+ break;
111
+ }
112
+ lastStart = runX;
113
+
114
+ const startBin = getBin(runX, false);
115
+ const endBin = getBin(runX2, true);
116
+
117
+ for (let bin = startBin; bin <= endBin; bin++) {
118
+ if (startIndices[bin] > runStart) {
119
+ startIndices[bin] = runStart;
120
+ }
121
+
122
+ if (endIndices[bin] < i) {
123
+ endIndices[bin] = i;
124
+ }
125
+ }
126
+ }
127
+
128
+ if (unordered) {
129
+ return undefined;
130
+ }
131
+
132
+ for (let i = 1; i < endIndices.length; i++) {
133
+ if (endIndices[i] < endIndices[i - 1]) {
134
+ endIndices[i] = endIndices[i - 1];
135
+ }
136
+ }
137
+
138
+ let tail = true;
139
+
140
+ for (let i = startIndices.length - 1; i > 0; i--) {
141
+ if (tail && startIndices[i] == MAX_INTEGER) {
142
+ startIndices[i] = endIndices[i];
143
+ tail = false;
144
+ } else if (startIndices[i - 1] > startIndices[i]) {
145
+ startIndices[i - 1] = startIndices[i];
146
+ }
147
+ }
148
+
149
+ return lookup;
150
+ }
@@ -144,7 +144,7 @@ export default class Mark<P extends import("../spec/mark.js").MarkProps = import
144
144
  */
145
145
  get encoding(): import("../spec/channel.js").Encoding;
146
146
  getContext(): import("../types/viewContext.js").default;
147
- getType(): "point" | "link" | "text" | "rect" | "rule" | "tick";
147
+ getType(): "text" | "point" | "link" | "rect" | "rule" | "tick";
148
148
  initializeData(): void;
149
149
  /**
150
150
  * Initialize encoders that encode fields of the data (or constants) to
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @param {string} expr
3
3
  * @param {Record<string, any>} [globalObject]
4
+ * @param {object} [context]
4
5
  * @returns {import("../utils/expression.js").ExpressionFunction}
5
6
  */
6
- export function compileExpression(expr: string, globalObject?: Record<string, any>): import("../utils/expression.js").ExpressionFunction;
7
+ export function compileExpression(expr: string, globalObject?: Record<string, any>, context?: object): import("../utils/expression.js").ExpressionFunction;
7
8
  //# sourceMappingURL=expressionCompiler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expressionCompiler.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/expressionCompiler.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wCAJW,MAAM,iBACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,OAAO,wBAAwB,EAAE,kBAAkB,CAI/D"}
1
+ {"version":3,"file":"expressionCompiler.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/expressionCompiler.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wCALW,MAAM,iBACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YACnB,MAAM,GACJ,OAAO,wBAAwB,EAAE,kBAAkB,CAI/D"}
@@ -3,8 +3,9 @@ import createFunction from "../utils/expression.js";
3
3
  /**
4
4
  * @param {string} expr
5
5
  * @param {Record<string, any>} [globalObject]
6
+ * @param {object} [context]
6
7
  * @returns {import("../utils/expression.js").ExpressionFunction}
7
8
  */
8
- export function compileExpression(expr, globalObject = {}) {
9
- return createFunction(expr, globalObject);
9
+ export function compileExpression(expr, globalObject = {}, context = {}) {
10
+ return createFunction(expr, globalObject, context);
10
11
  }
@@ -10,9 +10,12 @@
10
10
  *
11
11
  * @param {string} expr
12
12
  * @param {(name: string) => import("./types.js").ParamRef<any> | undefined} resolve
13
+ * @param {{ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined }} [options]
13
14
  * @returns {BoundExpression}
14
15
  */
15
- export function bindExpression(expr: string, resolve: (name: string) => import("./types.js").ParamRef<any> | undefined): BoundExpression;
16
+ export function bindExpression(expr: string, resolve: (name: string) => import("./types.js").ParamRef<any> | undefined, options?: {
17
+ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined;
18
+ }): BoundExpression;
16
19
  export type BoundExpression = {
17
20
  expression: import("./types.js").ExprRefFunction;
18
21
  dependencies: import("./types.js").ParamRef<any>[];
@@ -1 +1 @@
1
- {"version":3,"file":"expressionRef.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/expressionRef.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,qCAJW,MAAM,WACN,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,GAC9D,eAAe,CA+E3B;8BA3FY;IACR,UAAU,EAAE,OAAO,YAAY,EAAE,eAAe,CAAC;IACjD,YAAY,EAAE,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAA;CACnD"}
1
+ {"version":3,"file":"expressionRef.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/expressionRef.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,qCALW,MAAM,WACN,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,YAChE;IAAE,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,8BAA8B,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAC1G,eAAe,CAqF3B;8BAlGY;IACR,UAAU,EAAE,OAAO,YAAY,EAAE,eAAe,CAAC;IACjD,YAAY,EAAE,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAA;CACnD"}
@@ -13,14 +13,15 @@ import { compileExpression } from "./expressionCompiler.js";
13
13
  *
14
14
  * @param {string} expr
15
15
  * @param {(name: string) => import("./types.js").ParamRef<any> | undefined} resolve
16
+ * @param {{ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined }} [options]
16
17
  * @returns {BoundExpression}
17
18
  */
18
- export function bindExpression(expr, resolve) {
19
+ export function bindExpression(expr, resolve, options = {}) {
19
20
  const globalObject = {};
20
21
 
21
22
  /** @type {import("./types.js").ExprRefFunction} */
22
23
  const expression = /** @type {any} */ (
23
- compileExpression(expr, globalObject)
24
+ compileExpression(expr, globalObject, options)
24
25
  );
25
26
 
26
27
  /** @type {Map<string, import("./types.js").ParamRef<any>>} */
@@ -57,6 +58,9 @@ export function bindExpression(expr, resolve) {
57
58
  for (const ref of refsForParams.values()) {
58
59
  disposers.push(ref.subscribe(listener));
59
60
  }
61
+ for (const ref of expression.scaleDependencies ?? []) {
62
+ disposers.push(ref.subscribe(listener));
63
+ }
60
64
 
61
65
  let active = true;
62
66
  const unsubscribe = () => {
@@ -86,10 +90,13 @@ export function bindExpression(expr, resolve) {
86
90
  "|" +
87
91
  Array.from(refsForParams.values())
88
92
  .map((ref) => ref.id)
93
+ .concat((expression.scaleDependencies ?? []).map((ref) => ref.id))
89
94
  .join(",");
90
95
 
91
96
  return {
92
97
  expression,
93
- dependencies: Array.from(refsForParams.values()),
98
+ dependencies: Array.from(refsForParams.values()).concat(
99
+ expression.scaleDependencies ?? []
100
+ ),
94
101
  };
95
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graphRuntime.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/graphRuntime.js"],"names":[],"mappings":"AAoIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IA6BI;;;;;;;OAOG;IACH,sBAJG;QAA2D,iBAAiB,GAApE,OAAO,wBAAwB,EAAE,OAAO;KAGlD,EAGA;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,eARa,CAAC,WACH,MAAM,QACN,MAAM,QACN,MAAM,GAAG,WAAW,gBACpB,CAAC,YACD;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAClB,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAwDpD;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAPa,CAAC,WACH,MAAM,QACN,MAAM,QACN,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MACpC,MAAM,CAAC,GACL,OAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAuD5C;IAED;;;;;;;;;;;;OAYG;IACH,gBALW,MAAM,QACN,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MACpC,MAAM,IAAI,GACR,MAAM,IAAI,CAwCtB;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,iBAJa,CAAC,MACH,MAAM,CAAC,GACL,CAAC,CAYb;IAED;;;;;;;;OAQG;IACH,iBA8CC;IAED;;;;;;;;;;OAUG;IACH,yBAJW;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAE1C,OAAO,CAAC,IAAI,CAAC,CAgDzB;;CA2EJ;0BA3mBY,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI;8BAEpC;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,WAAW,CAAA;CACvB;yBAIS,CAAC,IACD,eAAe,GAAG;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb;yBAIS,CAAC,IACD,eAAe,GAAG;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC,CAAA;CACZ;yBAIS;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,IAAI,CAAA;CACf;AAgEJ;;;GAGG;AACH,6BAHW,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAChC,eAAe,CAa3B"}
1
+ {"version":3,"file":"graphRuntime.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/graphRuntime.js"],"names":[],"mappings":"AA+IA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IA6BI;;;;;;;OAOG;IACH,sBAJG;QAA2D,iBAAiB,GAApE,OAAO,wBAAwB,EAAE,OAAO;KAGlD,EAGA;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,eARa,CAAC,WACH,MAAM,QACN,MAAM,QACN,MAAM,GAAG,WAAW,gBACpB,CAAC,YACD;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAClB,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAwDpD;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAPa,CAAC,WACH,MAAM,QACN,MAAM,QACN,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MACpC,MAAM,CAAC,GACL,OAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAsD5C;IAED;;;;;;;;;;;;OAYG;IACH,gBALW,MAAM,QACN,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MACpC,MAAM,IAAI,GACR,MAAM,IAAI,CAuCtB;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,iBAJa,CAAC,MACH,MAAM,CAAC,GACL,CAAC,CAYb;IAED;;;;;;;;OAQG;IACH,iBA8CC;IAED;;;;;;;;;;OAUG;IACH,yBAJW;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAE1C,OAAO,CAAC,IAAI,CAAC,CAgDzB;;CA2EJ;0BApnBY,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI;8BAEpC;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,WAAW,CAAA;CACvB;yBAIS,CAAC,IACD,eAAe,GAAG;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb;yBAIS,CAAC,IACD,eAAe,GAAG;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC,CAAA;CACZ;yBAIS;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,IAAI,CAAA;CACf;AAgEJ;;;GAGG;AACH,6BAHW,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAChC,eAAe,CAa3B"}
@@ -121,6 +121,17 @@ function getNode(ref) {
121
121
  return node;
122
122
  }
123
123
 
124
+ /**
125
+ * @param {import("./types.js").ParamRef<any>} dep
126
+ * @returns {number}
127
+ */
128
+ function getDependencyRank(dep) {
129
+ if (typeof (/** @type {any} */ (dep).rank) === "number") {
130
+ return /** @type {any} */ (dep).rank;
131
+ }
132
+ return getNode(dep).rank;
133
+ }
134
+
124
135
  /**
125
136
  * @param {Set<() => void>} listeners
126
137
  */
@@ -291,9 +302,8 @@ export default class GraphRuntime {
291
302
  * @returns {import("./types.js").ParamRef<T>}
292
303
  */
293
304
  computed(ownerId, name, deps, fn) {
294
- const depNodes = deps.map(getNode);
295
- const maxRank = depNodes.reduce(
296
- (previous, node) => Math.max(previous, node.rank),
305
+ const maxRank = deps.reduce(
306
+ (previous, dep) => Math.max(previous, getDependencyRank(dep)),
297
307
  0
298
308
  );
299
309
 
@@ -359,9 +369,8 @@ export default class GraphRuntime {
359
369
  * @returns {() => void} explicit disposer for manual teardown
360
370
  */
361
371
  effect(ownerId, deps, fn) {
362
- const depNodes = deps.map(getNode);
363
- const maxRank = depNodes.reduce(
364
- (previous, node) => Math.max(previous, node.rank),
372
+ const maxRank = deps.reduce(
373
+ (previous, dep) => Math.max(previous, getDependencyRank(dep)),
365
374
  0
366
375
  );
367
376
 
@@ -89,9 +89,12 @@ export default class ParamRuntime {
89
89
  * @param {ScopeId} scope
90
90
  * @param {string} name
91
91
  * @param {string} expr
92
+ * @param {{ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined }} [options]
92
93
  * @returns {import("./types.js").ParamRef<T>}
93
94
  */
94
- registerDerived<T>(scope: ScopeId, name: string, expr: string): import("./types.js").ParamRef<T>;
95
+ registerDerived<T>(scope: ScopeId, name: string, expr: string, options?: {
96
+ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined;
97
+ }): import("./types.js").ParamRef<T>;
95
98
  /**
96
99
  * Creates an expression function bound to scope-based parameter resolution.
97
100
  *
@@ -101,9 +104,12 @@ export default class ParamRuntime {
101
104
  *
102
105
  * @param {ScopeId} scope
103
106
  * @param {string} expr
107
+ * @param {{ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined }} [options]
104
108
  * @returns {import("./types.js").ExprRefFunction}
105
109
  */
106
- createExpression(scope: ScopeId, expr: string): import("./types.js").ExprRefFunction;
110
+ createExpression(scope: ScopeId, expr: string, options?: {
111
+ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined;
112
+ }): import("./types.js").ExprRefFunction;
107
113
  /**
108
114
  * Resolves a parameter by name from `scope`, searching parent scopes as needed.
109
115
  * Returns the nearest matching binding, if any.
@@ -1 +1 @@
1
- {"version":3,"file":"paramRuntime.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/paramRuntime.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IASI;;;;;;;;OAQG;IACH,0BAHW,OAAO,GACL,OAAO,CAYnB;IAED;;;;;;;;OAQG;IACH,oBAFW,OAAO,QAMjB;IAED;;;;;;;OAOG;IACH,wBAHW,OAAO,YACP,MAAM,IAAI,QAKpB;IAED;;;;;;;;;OASG;IACH,aAPa,CAAC,SACH,OAAO,QACP,MAAM,WACN,CAAC,YACD;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAClB,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAYpD;IAED;;;;;;;;;;;;OAYG;IACH,kBAPa,CAAC,SACH,OAAO,QACP,MAAM,WACN,CAAC,YACD;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAClB,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAYpD;IAED;;;;;;;;;;;OAWG;IACH,gBANa,CAAC,SACH,OAAO,QACP,MAAM,QACN,MAAM,GACJ,OAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAgB5C;IAED;;;;;;;;;;OAUG;IACH,wBAJW,OAAO,QACP,MAAM,GACJ,OAAO,YAAY,EAAE,eAAe,CAOhD;IAED;;;;;;;;OAQG;IACH,QALa,CAAC,SACH,OAAO,QACP,MAAM,GACJ,OAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAIxD;IAED;;;;;;;;;OASG;IACH,iBAJa,CAAC,MACH,MAAM,CAAC,GACL,CAAC,CAIb;IAED;;OAEG;IACH,iBAEC;IAED;;;;;OAKG;IACH,yBAHW;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAIzB;;CACJ;;;;;;;;;;;;;;;;;;;;;sBApMY,MAAM"}
1
+ {"version":3,"file":"paramRuntime.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/paramRuntime.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IASI;;;;;;;;OAQG;IACH,0BAHW,OAAO,GACL,OAAO,CAYnB;IAED;;;;;;;;OAQG;IACH,oBAFW,OAAO,QAMjB;IAED;;;;;;;OAOG;IACH,wBAHW,OAAO,YACP,MAAM,IAAI,QAKpB;IAED;;;;;;;;;OASG;IACH,aAPa,CAAC,SACH,OAAO,QACP,MAAM,WACN,CAAC,YACD;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAClB,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAYpD;IAED;;;;;;;;;;;;OAYG;IACH,kBAPa,CAAC,SACH,OAAO,QACP,MAAM,WACN,CAAC,YACD;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAClB,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAYpD;IAED;;;;;;;;;;;;OAYG;IACH,gBAPa,CAAC,SACH,OAAO,QACP,MAAM,QACN,MAAM,YACN;QAAE,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,8BAA8B,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,GAC1G,OAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAiB5C;IAED;;;;;;;;;;;OAWG;IACH,wBALW,OAAO,QACP,MAAM,YACN;QAAE,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,8BAA8B,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,GAC1G,OAAO,YAAY,EAAE,eAAe,CAShD;IAED;;;;;;;;OAQG;IACH,QALa,CAAC,SACH,OAAO,QACP,MAAM,GACJ,OAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAIxD;IAED;;;;;;;;;OASG;IACH,iBAJa,CAAC,MACH,MAAM,CAAC,GACL,CAAC,CAIb;IAED;;OAEG;IACH,iBAEC;IAED;;;;;OAKG;IACH,yBAHW;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAIzB;;CACJ;;;;;;;;;;;;;;;;;;;;;sBAzMY,MAAM"}
@@ -140,12 +140,14 @@ export default class ParamRuntime {
140
140
  * @param {ScopeId} scope
141
141
  * @param {string} name
142
142
  * @param {string} expr
143
+ * @param {{ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined }} [options]
143
144
  * @returns {import("./types.js").ParamRef<T>}
144
145
  */
145
- registerDerived(scope, name, expr) {
146
+ registerDerived(scope, name, expr, options) {
146
147
  const { expression, dependencies } = bindExpression(
147
148
  expr,
148
- (globalName) => this.resolve(scope, globalName)
149
+ (globalName) => this.resolve(scope, globalName),
150
+ options
149
151
  );
150
152
 
151
153
  const ownerId = this.#paramStore.getOwnerId(scope);
@@ -167,11 +169,14 @@ export default class ParamRuntime {
167
169
  *
168
170
  * @param {ScopeId} scope
169
171
  * @param {string} expr
172
+ * @param {{ resolveScaleResolution?: (channel: string) => import("../scales/scaleResolution.js").default | undefined }} [options]
170
173
  * @returns {import("./types.js").ExprRefFunction}
171
174
  */
172
- createExpression(scope, expr) {
173
- const { expression } = bindExpression(expr, (globalName) =>
174
- this.resolve(scope, globalName)
175
+ createExpression(scope, expr, options) {
176
+ const { expression } = bindExpression(
177
+ expr,
178
+ (globalName) => this.resolve(scope, globalName),
179
+ options
175
180
  );
176
181
  return expression;
177
182
  }
@@ -2,6 +2,7 @@ export type ParamRef<T> = {
2
2
  id: string;
3
3
  name: string;
4
4
  kind: "base" | "derived" | "selection";
5
+ rank?: number;
5
6
  get: () => T;
6
7
  subscribe: (listener: () => void) => () => void;
7
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/types.js"],"names":[],"mappings":"qBACa,CAAC,IACD;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC,CAAC;IACb,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAChD;6BAIS,CAAC,IACD,QAAQ,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;CAAE;8BAIzC,OAAO,wBAAwB,EAAE,kBAAkB,GAAG;IAC9D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,MAAM,CAAA;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/types.js"],"names":[],"mappings":"qBACa,CAAC,IACD;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC,CAAC;IACb,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAChD;6BAIS,CAAC,IACD,QAAQ,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;CAAE;8BAIzC,OAAO,wBAAwB,EAAE,kBAAkB,GAAG;IAC9D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,MAAM,CAAA;CACzB"}
@@ -4,6 +4,7 @@
4
4
  * id: string,
5
5
  * name: string,
6
6
  * kind: "base" | "derived" | "selection",
7
+ * rank?: number,
7
8
  * get: () => T,
8
9
  * subscribe: (listener: () => void) => () => void
9
10
  * }} ParamRef
@@ -10,11 +10,12 @@
10
10
  export default class ViewParamRuntime {
11
11
  /**
12
12
  * @param {() => ViewParamRuntime} [parentFinder]
13
- * An optional function that returns the parent runtime.
14
- * N.B. The function must always return the same runtime for the same parent,
15
- * i.e., the changing the structure of the hierarchy is NOT supported.
13
+ * @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../scales/scaleResolution.js").default | undefined} [scaleResolutionResolver]
14
+ * Optional resolver for scale channels in this runtime's view scope.
15
+ * N.B. The function must always return the same resolution for the
16
+ * same channel in the same view hierarchy.
16
17
  */
17
- constructor(parentFinder?: () => ViewParamRuntime);
18
+ constructor(parentFinder?: () => ViewParamRuntime, scaleResolutionResolver?: (channel: import("../spec/channel.js").ChannelWithScale) => import("../scales/scaleResolution.js").default | undefined);
18
19
  /**
19
20
  * Registers a parameter definition into this runtime scope.
20
21
  *
@@ -1 +1 @@
1
- {"version":3,"file":"viewParamRuntime.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/viewParamRuntime.js"],"names":[],"mappings":"AAmBA;;;;;;;;GAQG;AACH;IAqCI;;;;;OAKG;IACH,2BALW,MAAM,gBAAgB,EAgBhC;IAED;;;;;;;;;;;OAWG;IACH,wEAjEqB,GAAG,KAAK,IAAI,CAyJhC;IAED;;;;;;;OAOG;IACH,eAFa,CAAC,aAJH,MAAM,gBACN,CAAC,YACD,OAAO,GACL,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAgC9B;IAED;;;;;;;;OAQG;IACH,oBAHW,MAAM,SACN,GAAG,QAWb;IAED;;;OAGG;IACH,oBAFW,MAAM,OAIhB;IAED;;;;;;;;OAQG;IACH,qBAJW,MAAM,YACN,MAAM,IAAI,GACR,MAAM,IAAI,CAiBtB;IAED;;;OAGG;IACH,qBAFW,MAAM,OAKhB;IAED;;OAEG;IACH,oBACsB,WAAW,CAAC,MAAM,2CAAY,CAGnD;IAED;;;;;OAKG;IACH,yBAHW,MAAM,GACJ,OAAO,CAKnB;IAED;;;;;;;;;;OAUG;IACH,0CAHW,MAAM,GACJ,OAAO,CAanB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,gBAAgB,CAQ5B;IAKD;;;;OAIG;IACH,uBAFW,MAAM,wCAIhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBALW,MAAM,YACN,MAAM,IAAI;;;;;;;qBAhVX,OAAO;;;;;;2BAKP,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI;QA6U3B,eAAe,CAY3B;IA0BD;;;;OAIG;IACH,qBAFW,MAAM,OAKhB;IAED;;;;OAIG;IACH,iBAJa,CAAC,MACH,MAAM,CAAC,GACL,CAAC,CAIb;IAED,iBAEC;IAED;;;;;OAKG;IACH,yBAFW;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,iBAItD;IAED,gBAUC;IAED;;;;;OAKG;IACH,sBAFa,OAAO,CAiBnB;;CACJ;;;;;;;;8BAncY,OAAO,wBAAwB,EAAE,kBAAkB,GAAG;IAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,MAAM,CAAA;CAAC"}
1
+ {"version":3,"file":"viewParamRuntime.d.ts","sourceRoot":"","sources":["../../../src/paramRuntime/viewParamRuntime.js"],"names":[],"mappings":"AAmBA;;;;;;;;GAQG;AACH;IAwCI;;;;;;OAMG;IACH,2BANW,MAAM,gBAAgB,4BACtB,CAAC,OAAO,EAAE,OAAO,oBAAoB,EAAE,gBAAgB,KAAK,OAAO,8BAA8B,EAAE,OAAO,GAAG,SAAS,EAkBhI;IAED;;;;;;;;;;;OAWG;IACH,wEAvEqB,GAAG,KAAK,IAAI,CAkKhC;IAED;;;;;;;OAOG;IACH,eAFa,CAAC,aAJH,MAAM,gBACN,CAAC,YACD,OAAO,GACL,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAgC9B;IAED;;;;;;;;OAQG;IACH,oBAHW,MAAM,SACN,GAAG,QAWb;IAED;;;OAGG;IACH,oBAFW,MAAM,OAIhB;IAED;;;;;;;;OAQG;IACH,qBAJW,MAAM,YACN,MAAM,IAAI,GACR,MAAM,IAAI,CAiBtB;IAED;;;OAGG;IACH,qBAFW,MAAM,OAKhB;IAED;;OAEG;IACH,oBACsB,WAAW,CAAC,MAAM,2CAAY,CAGnD;IAED;;;;;OAKG;IACH,yBAHW,MAAM,GACJ,OAAO,CAKnB;IAED;;;;;;;;;;OAUG;IACH,0CAHW,MAAM,GACJ,OAAO,CAanB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,gBAAgB,CAQ5B;IAKD;;;;OAIG;IACH,uBAFW,MAAM,wCAMhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBALW,MAAM,YACN,MAAM,IAAI;;;;;;;qBA3VX,OAAO;;;;;;2BAKP,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI;QAwV3B,eAAe,CAY3B;IA0BD;;;;OAIG;IACH,qBAFW,MAAM,OAKhB;IAED;;;;OAIG;IACH,iBAJa,CAAC,MACH,MAAM,CAAC,GACL,CAAC,CAIb;IAED,iBAEC;IAED;;;;;OAKG;IACH,yBAFW;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,iBAItD;IAED,gBAUC;IAED;;;;;OAKG;IACH,sBAFa,OAAO,CAiBnB;;CACJ;;;;;;;;8BA9cY,OAAO,wBAAwB,EAAE,kBAAkB,GAAG;IAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,MAAM,CAAA;CAAC"}
@@ -61,16 +61,22 @@ export default class ViewParamRuntime {
61
61
  /** @type {() => ViewParamRuntime} */
62
62
  #parentFinder;
63
63
 
64
+ /** @type {(channel: string) => import("../scales/scaleResolution.js").default | undefined} */
65
+ #scaleResolutionResolver;
66
+
64
67
  #disposed = false;
65
68
 
66
69
  /**
67
70
  * @param {() => ViewParamRuntime} [parentFinder]
68
- * An optional function that returns the parent runtime.
69
- * N.B. The function must always return the same runtime for the same parent,
70
- * i.e., the changing the structure of the hierarchy is NOT supported.
71
+ * @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../scales/scaleResolution.js").default | undefined} [scaleResolutionResolver]
72
+ * Optional resolver for scale channels in this runtime's view scope.
73
+ * N.B. The function must always return the same resolution for the
74
+ * same channel in the same view hierarchy.
71
75
  */
72
- constructor(parentFinder) {
76
+ constructor(parentFinder, scaleResolutionResolver) {
73
77
  this.#parentFinder = parentFinder ?? (() => undefined);
78
+ this.#scaleResolutionResolver =
79
+ scaleResolutionResolver ?? (() => undefined);
74
80
 
75
81
  const parent = this.#parentFinder();
76
82
  if (parent) {
@@ -149,7 +155,10 @@ export default class ViewParamRuntime {
149
155
  const ref = this.#runtime.registerDerived(
150
156
  this.#scopeId,
151
157
  name,
152
- param.expr
158
+ param.expr,
159
+ {
160
+ resolveScaleResolution: this.#scaleResolutionResolver,
161
+ }
153
162
  );
154
163
  this.#localRefs.set(name, ref);
155
164
  setter = () => {
@@ -352,7 +361,9 @@ export default class ViewParamRuntime {
352
361
  * @param {string} expr
353
362
  */
354
363
  createExpression(expr) {
355
- return this.#runtime.createExpression(this.#scopeId, expr);
364
+ return this.#runtime.createExpression(this.#scopeId, expr, {
365
+ resolveScaleResolution: this.#scaleResolutionResolver,
366
+ });
356
367
  }
357
368
 
358
369
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../../src/scale/scale.js"],"names":[],"mappings":"AAgIA,sEAuBC;AAED;;;;;GAKG;AACH,uCAJW,OAAO,kBAAkB,EAAE,KAAK,UAChC,GAAC,GACC,OAAO,uBAAuB,EAAE,SAAS,CA0BrD;AA4CD;;;;;EAuGC"}
1
+ {"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../../src/scale/scale.js"],"names":[],"mappings":"AAiIA,sEAuBC;AAED;;;;;GAKG;AACH,uCAJW,OAAO,kBAAkB,EAAE,KAAK,UAChC,GAAC,GACC,OAAO,uBAAuB,EAAE,SAAS,CA0BrD;AA4CD;;;;;EAuGC"}
@@ -112,6 +112,7 @@ var SKIP = toSet([
112
112
  "domainMax",
113
113
  "domainRaw",
114
114
  "domainImplicit",
115
+ "domainTransition",
115
116
  "nice",
116
117
  "zero",
117
118
  "bins",
@@ -8,7 +8,30 @@ export function isSelectionDomainRef(domain: any): domain is SelectionDomainRef;
8
8
  * @typedef {import("../spec/scale.js").ComplexDomain} ComplexDomain
9
9
  * @typedef {import("../spec/scale.js").ScalarDomain} ScalarDomain
10
10
  * @typedef {import("../spec/scale.js").SelectionDomainRef} SelectionDomainRef
11
+ * @typedef {import("../spec/parameter.js").ExprRef} ExprRef
11
12
  * @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
13
+ * @typedef {() => Set<ScaleResolutionMember>} ScaleMembersGetter
14
+ * @typedef {(interval: ScalarDomain | ComplexDomain) => number[]} FromComplexInterval
15
+ * @typedef {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} GetLocusExtent
16
+ * @typedef {{
17
+ * domains: DomainArray[],
18
+ * selectionRef: SelectionDomainLinkInfo | undefined,
19
+ * selectionRuntime: any,
20
+ * selectionDescription: string | undefined,
21
+ * hasLiteralDomain: boolean,
22
+ * }} ConfiguredDomainResolutionState
23
+ * @typedef {{
24
+ * kind: "literal",
25
+ * domain: DomainArray,
26
+ * } | {
27
+ * kind: "selection",
28
+ * domain: DomainArray | undefined,
29
+ * description: string,
30
+ * param: string,
31
+ * encoding: "x" | "y",
32
+ * hasInitial: boolean,
33
+ * runtime: any,
34
+ * }} ConfiguredDomainMemberResolution
12
35
  * @typedef {{
13
36
  * param: string,
14
37
  * encoding: "x" | "y",
@@ -19,20 +42,20 @@ export function isSelectionDomainRef(domain: any): domain is SelectionDomainRef;
19
42
  export default class DomainPlanner {
20
43
  /**
21
44
  * @param {object} options
22
- * @param {() => Set<ScaleResolutionMember>} options.getMembers
23
- * @param {() => Set<ScaleResolutionMember>} [options.getAllMembers]
24
- * @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
45
+ * @param {ScaleMembersGetter} options.getActiveMembers Active shared-scale members used for configured domain planning.
46
+ * @param {ScaleMembersGetter} [options.getAllMembers] All members, including inactive ones, used for conflict validation.
47
+ * @param {ScaleMembersGetter} [options.getDataMembers] Members used for data-domain extraction; defaults to `getActiveMembers`.
25
48
  * @param {() => import("../spec/channel.js").Type} options.getType
26
- * @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} options.getLocusExtent
27
- * @param {(interval: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
49
+ * @param {GetLocusExtent} options.getLocusExtent
50
+ * @param {FromComplexInterval} options.fromComplexInterval
28
51
  */
29
- constructor({ getMembers, getAllMembers, getDataMembers, getType, getLocusExtent, fromComplexInterval, }: {
30
- getMembers: () => Set<ScaleResolutionMember>;
31
- getAllMembers?: () => Set<ScaleResolutionMember>;
32
- getDataMembers?: () => Set<ScaleResolutionMember>;
52
+ constructor({ getActiveMembers, getAllMembers, getDataMembers, getType, getLocusExtent, fromComplexInterval, }: {
53
+ getActiveMembers: ScaleMembersGetter;
54
+ getAllMembers?: ScaleMembersGetter;
55
+ getDataMembers?: ScaleMembersGetter;
33
56
  getType: () => import("../spec/channel.js").Type;
34
- getLocusExtent: (assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[];
35
- fromComplexInterval: (interval: ScalarDomain | ComplexDomain) => number[];
57
+ getLocusExtent: GetLocusExtent;
58
+ fromComplexInterval: FromComplexInterval;
36
59
  });
37
60
  /**
38
61
  * @returns {any[]}
@@ -101,7 +124,30 @@ export type DomainArray = import("../utils/domainArray.js").DomainArray;
101
124
  export type ComplexDomain = import("../spec/scale.js").ComplexDomain;
102
125
  export type ScalarDomain = import("../spec/scale.js").ScalarDomain;
103
126
  export type SelectionDomainRef = import("../spec/scale.js").SelectionDomainRef;
127
+ export type ExprRef = import("../spec/parameter.js").ExprRef;
104
128
  export type ScaleResolutionMember = import("./scaleResolution.js").ScaleResolutionMember;
129
+ export type ScaleMembersGetter = () => Set<ScaleResolutionMember>;
130
+ export type FromComplexInterval = (interval: ScalarDomain | ComplexDomain) => number[];
131
+ export type GetLocusExtent = (assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[];
132
+ export type ConfiguredDomainResolutionState = {
133
+ domains: DomainArray[];
134
+ selectionRef: SelectionDomainLinkInfo | undefined;
135
+ selectionRuntime: any;
136
+ selectionDescription: string | undefined;
137
+ hasLiteralDomain: boolean;
138
+ };
139
+ export type ConfiguredDomainMemberResolution = {
140
+ kind: "literal";
141
+ domain: DomainArray;
142
+ } | {
143
+ kind: "selection";
144
+ domain: DomainArray | undefined;
145
+ description: string;
146
+ param: string;
147
+ encoding: "x" | "y";
148
+ hasInitial: boolean;
149
+ runtime: any;
150
+ };
105
151
  export type SelectionDomainLinkInfo = {
106
152
  param: string;
107
153
  encoding: "x" | "y";
@@ -1 +1 @@
1
- {"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"AAiiBA;;;GAGG;AACH,6CAHW,GAAG,GACD,MAAM,IAAI,kBAAkB,CASxC;AAxhBD;;;;;;;;;;;;GAYG;AAEH;IAiCI;;;;;;;;OAQG;IACH,0GAPG;QAAkD,UAAU,EAApD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACW,aAAa,GAAxD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACW,cAAc,GAAzD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACiB,OAAO,EAAxD,MAAM,OAAO,oBAAoB,EAAE,IAAI;QACmD,cAAc,EAAxG,CAAC,QAAQ,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE;QAClB,mBAAmB,EAAjF,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;KAC9D,EAeA;IAED;;OAEG;IACH,6BAFa,GAAG,EAAE,CAIjB;IAED;;OAEG;IACH,8BAFW;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,WAI/C;IAED,wCAGC;IAED;;OAEG;IACH,2CAFa,uBAAuB,GAAG,SAAS,CAS/C;IAED;;;MAUC;IAED,mCAIC;IAED;;;;;;OAMG;IACH,qCAJW,OAAO,kBACP,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAC1C,GAAG,EAAE,CASjB;IAED;;;;;;;OAOG;IACH,iDALW,OAAO,kBACP,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,YAC5C;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,GAAG,EAAE,CAYjB;IAED;;;;;OAKG;IACH,8BAHW;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,GACpC,WAAW,CA8BtB;IAED;;;;OAIG;IACH,iBAFY,WAAW,GAAG,SAAS,CAQlC;IAED;;;;;OAKG;IACH,4BALW,OAAO,qBAAqB,EAAE,SAAS,wBACvC,OAAO,mBACP,GAAG,EAAE,GACH,OAAO,CAgBnB;;CAkCJ;0BAnQY,OAAO,yBAAyB,EAAE,WAAW;4BAC7C,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;iCACvC,OAAO,kBAAkB,EAAE,kBAAkB;oCAC7C,OAAO,sBAAsB,EAAE,qBAAqB;sCACpD;IACR,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC;CACd"}
1
+ {"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"AAooBA;;;GAGG;AACH,6CAHW,GAAG,GACD,MAAM,IAAI,kBAAkB,CASxC;AAhnBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;IAiCI;;;;;;;;OAQG;IACH,gHAPG;QAAoC,gBAAgB,EAA5C,kBAAkB;QACW,aAAa,GAA1C,kBAAkB;QACW,cAAc,GAA3C,kBAAkB;QAC+B,OAAO,EAAxD,MAAM,OAAO,oBAAoB,EAAE,IAAI;QACf,cAAc,EAAtC,cAAc;QACe,mBAAmB,EAAhD,mBAAmB;KAC7B,EAeA;IAED;;OAEG;IACH,6BAFa,GAAG,EAAE,CAIjB;IAED;;OAEG;IACH,8BAFW;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,WAI/C;IAED,wCAGC;IAED;;OAEG;IACH,2CAFa,uBAAuB,GAAG,SAAS,CAS/C;IAED;;;MAUC;IAED,mCAIC;IAED;;;;;;OAMG;IACH,qCAJW,OAAO,kBACP,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAC1C,GAAG,EAAE,CAYjB;IAED;;;;;;;OAOG;IACH,iDALW,OAAO,kBACP,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,YAC5C;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,GAAG,EAAE,CAYjB;IAED;;;;;OAKG;IACH,8BAHW;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,GACpC,WAAW,CA8BtB;IAED;;;;OAIG;IACH,iBAFY,WAAW,GAAG,SAAS,CAQlC;IAED;;;;;OAKG;IACH,4BALW,OAAO,qBAAqB,EAAE,SAAS,wBACvC,OAAO,mBACP,GAAG,EAAE,GACH,OAAO,CAgBnB;;CAkCJ;0BA7RY,OAAO,yBAAyB,EAAE,WAAW;4BAC7C,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;iCACvC,OAAO,kBAAkB,EAAE,kBAAkB;sBAC7C,OAAO,sBAAsB,EAAE,OAAO;oCACtC,OAAO,sBAAsB,EAAE,qBAAqB;iCACpD,MAAM,GAAG,CAAC,qBAAqB,CAAC;kCAChC,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;6BACpD,CAAC,QAAQ,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE;8CAChF;IACR,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAClD,gBAAgB,EAAE,GAAG,CAAC;IACtB,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;+CACS;IACR,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;CACrB,GAAG;IACF,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC;CACd;sCACS;IACR,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC;CACd"}