@genome-spy/core 0.48.2 → 0.49.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 (221) hide show
  1. package/dist/bundle/index.es.js +7226 -6923
  2. package/dist/bundle/index.js +121 -108
  3. package/dist/schema.json +838 -344
  4. package/dist/src/data/collector.test.d.ts +2 -0
  5. package/dist/src/data/collector.test.d.ts.map +1 -0
  6. package/dist/src/data/dataFlow.test.d.ts +2 -0
  7. package/dist/src/data/dataFlow.test.d.ts.map +1 -0
  8. package/dist/src/data/flow.test.d.ts +2 -0
  9. package/dist/src/data/flow.test.d.ts.map +1 -0
  10. package/dist/src/data/flow.test.js +19 -14
  11. package/dist/src/data/flowNode.test.d.ts +2 -0
  12. package/dist/src/data/flowNode.test.d.ts.map +1 -0
  13. package/dist/src/data/flowOptimizer.test.d.ts +2 -0
  14. package/dist/src/data/flowOptimizer.test.d.ts.map +1 -0
  15. package/dist/src/data/flowOptimizer.test.js +9 -10
  16. package/dist/src/data/formats/fasta.test.d.ts +2 -0
  17. package/dist/src/data/formats/fasta.test.d.ts.map +1 -0
  18. package/dist/src/data/sources/inlineSource.test.d.ts +2 -0
  19. package/dist/src/data/sources/inlineSource.test.d.ts.map +1 -0
  20. package/dist/src/data/sources/inlineSource.test.js +23 -16
  21. package/dist/src/data/sources/sequenceSource.test.d.ts +2 -0
  22. package/dist/src/data/sources/sequenceSource.test.d.ts.map +1 -0
  23. package/dist/src/data/sources/sequenceSource.test.js +59 -42
  24. package/dist/src/data/transforms/clone.test.d.ts +2 -0
  25. package/dist/src/data/transforms/clone.test.d.ts.map +1 -0
  26. package/dist/src/data/transforms/coverage.test.d.ts +2 -0
  27. package/dist/src/data/transforms/coverage.test.d.ts.map +1 -0
  28. package/dist/src/data/transforms/coverage.test.js +1 -1
  29. package/dist/src/data/transforms/filter.d.ts +10 -0
  30. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  31. package/dist/src/data/transforms/filter.js +30 -1
  32. package/dist/src/data/transforms/filter.test.d.ts +2 -0
  33. package/dist/src/data/transforms/filter.test.d.ts.map +1 -0
  34. package/dist/src/data/transforms/flatten.test.d.ts +2 -0
  35. package/dist/src/data/transforms/flatten.test.d.ts.map +1 -0
  36. package/dist/src/data/transforms/flatten.test.js +10 -7
  37. package/dist/src/data/transforms/flattenDelimited.test.d.ts +2 -0
  38. package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +1 -0
  39. package/dist/src/data/transforms/flattenDelimited.test.js +16 -13
  40. package/dist/src/data/transforms/flattenSequence.test.d.ts +2 -0
  41. package/dist/src/data/transforms/flattenSequence.test.d.ts.map +1 -0
  42. package/dist/src/data/transforms/flattenSequence.test.js +1 -1
  43. package/dist/src/data/transforms/formula.test.d.ts +2 -0
  44. package/dist/src/data/transforms/formula.test.d.ts.map +1 -0
  45. package/dist/src/data/transforms/formula.test.js +1 -1
  46. package/dist/src/data/transforms/identifier.test.d.ts +2 -0
  47. package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
  48. package/dist/src/data/transforms/pileup.test.d.ts +2 -0
  49. package/dist/src/data/transforms/pileup.test.d.ts.map +1 -0
  50. package/dist/src/data/transforms/project.test.d.ts +2 -0
  51. package/dist/src/data/transforms/project.test.d.ts.map +1 -0
  52. package/dist/src/data/transforms/project.test.js +1 -1
  53. package/dist/src/data/transforms/regexExtract.test.d.ts +2 -0
  54. package/dist/src/data/transforms/regexExtract.test.d.ts.map +1 -0
  55. package/dist/src/data/transforms/regexExtract.test.js +6 -3
  56. package/dist/src/data/transforms/regexFold.test.d.ts +2 -0
  57. package/dist/src/data/transforms/regexFold.test.d.ts.map +1 -0
  58. package/dist/src/data/transforms/sample.test.d.ts +2 -0
  59. package/dist/src/data/transforms/sample.test.d.ts.map +1 -0
  60. package/dist/src/data/transforms/stack.test.d.ts +2 -0
  61. package/dist/src/data/transforms/stack.test.d.ts.map +1 -0
  62. package/dist/src/data/transforms/stack.test.js +8 -8
  63. package/dist/src/encoder/accessor.d.ts +17 -14
  64. package/dist/src/encoder/accessor.d.ts.map +1 -1
  65. package/dist/src/encoder/accessor.js +127 -56
  66. package/dist/src/encoder/accessor.test.d.ts +2 -0
  67. package/dist/src/encoder/accessor.test.d.ts.map +1 -0
  68. package/dist/src/encoder/accessor.test.js +145 -31
  69. package/dist/src/encoder/encoder.d.ts +26 -13
  70. package/dist/src/encoder/encoder.d.ts.map +1 -1
  71. package/dist/src/encoder/encoder.js +98 -114
  72. package/dist/src/encoder/encoder.test.d.ts +2 -0
  73. package/dist/src/encoder/encoder.test.d.ts.map +1 -0
  74. package/dist/src/encoder/encoder.test.js +85 -82
  75. package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
  76. package/dist/src/fonts/bmFontManager.js +10 -4
  77. package/dist/src/genome/genome.test.d.ts +2 -0
  78. package/dist/src/genome/genome.test.d.ts.map +1 -0
  79. package/dist/src/genome/scaleIndex.test.d.ts +2 -0
  80. package/dist/src/genome/scaleIndex.test.d.ts.map +1 -0
  81. package/dist/src/genome/scaleLocus.test.d.ts +2 -0
  82. package/dist/src/genome/scaleLocus.test.d.ts.map +1 -0
  83. package/dist/src/genomeSpy.d.ts +3 -2
  84. package/dist/src/genomeSpy.d.ts.map +1 -1
  85. package/dist/src/genomeSpy.js +15 -6
  86. package/dist/src/gl/dataToVertices.d.ts +6 -8
  87. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  88. package/dist/src/gl/dataToVertices.js +42 -33
  89. package/dist/src/gl/glslScaleGenerator.d.ts +84 -15
  90. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  91. package/dist/src/gl/glslScaleGenerator.js +260 -73
  92. package/dist/src/marks/link.common.glsl.js +1 -1
  93. package/dist/src/marks/link.d.ts.map +1 -1
  94. package/dist/src/marks/link.js +10 -0
  95. package/dist/src/marks/link.vertex.glsl.js +1 -1
  96. package/dist/src/marks/mark.d.ts +6 -9
  97. package/dist/src/marks/mark.d.ts.map +1 -1
  98. package/dist/src/marks/mark.js +212 -95
  99. package/dist/src/marks/point.d.ts.map +1 -1
  100. package/dist/src/marks/point.js +5 -1
  101. package/dist/src/marks/rect.d.ts.map +1 -1
  102. package/dist/src/marks/rect.js +9 -4
  103. package/dist/src/marks/rule.d.ts.map +1 -1
  104. package/dist/src/marks/rule.js +4 -0
  105. package/dist/src/marks/text.d.ts.map +1 -1
  106. package/dist/src/marks/text.js +5 -1
  107. package/dist/src/scale/scale.test.d.ts +2 -0
  108. package/dist/src/scale/scale.test.d.ts.map +1 -0
  109. package/dist/src/scale/scale.test.js +2 -0
  110. package/dist/src/scale/ticks.test.d.ts +2 -0
  111. package/dist/src/scale/ticks.test.d.ts.map +1 -0
  112. package/dist/src/scale/ticks.test.js +6 -0
  113. package/dist/src/selection/selection.d.ts +39 -0
  114. package/dist/src/selection/selection.d.ts.map +1 -0
  115. package/dist/src/selection/selection.js +78 -0
  116. package/dist/src/spec/channel.d.ts +137 -83
  117. package/dist/src/spec/mark.d.ts +9 -0
  118. package/dist/src/spec/parameter.d.ts +112 -3
  119. package/dist/src/spec/root.d.ts +0 -1
  120. package/dist/src/spec/transform.d.ts +19 -1
  121. package/dist/src/spec/view.d.ts +3 -3
  122. package/dist/src/tooltip/dataTooltipHandler.js +1 -1
  123. package/dist/src/types/encoder.d.ts +80 -26
  124. package/dist/src/types/rendering.d.ts +1 -0
  125. package/dist/src/types/selectionTypes.d.ts +44 -0
  126. package/dist/src/types/viewContext.d.ts +1 -4
  127. package/dist/src/utils/addBaseUrl.test.d.ts +2 -0
  128. package/dist/src/utils/addBaseUrl.test.d.ts.map +1 -0
  129. package/dist/src/utils/binnedIndex.test.d.ts +2 -0
  130. package/dist/src/utils/binnedIndex.test.d.ts.map +1 -0
  131. package/dist/src/utils/cloner.test.d.ts +2 -0
  132. package/dist/src/utils/cloner.test.d.ts.map +1 -0
  133. package/dist/src/utils/coalesce.test.d.ts +2 -0
  134. package/dist/src/utils/coalesce.test.d.ts.map +1 -0
  135. package/dist/src/utils/concatIterables.test.d.ts +2 -0
  136. package/dist/src/utils/concatIterables.test.d.ts.map +1 -0
  137. package/dist/src/utils/domainArray.test.d.ts +2 -0
  138. package/dist/src/utils/domainArray.test.d.ts.map +1 -0
  139. package/dist/src/utils/expression.d.ts +2 -2
  140. package/dist/src/utils/expression.d.ts.map +1 -1
  141. package/dist/src/utils/expression.js +11 -2
  142. package/dist/src/utils/indexer.test.d.ts +2 -0
  143. package/dist/src/utils/indexer.test.d.ts.map +1 -0
  144. package/dist/src/utils/inputBinding.d.ts.map +1 -1
  145. package/dist/src/utils/inputBinding.js +4 -0
  146. package/dist/src/utils/iterateNestedMaps.test.d.ts +2 -0
  147. package/dist/src/utils/iterateNestedMaps.test.d.ts.map +1 -0
  148. package/dist/src/utils/kWayMerge.test.d.ts +2 -0
  149. package/dist/src/utils/kWayMerge.test.d.ts.map +1 -0
  150. package/dist/src/utils/mergeObjects.test.d.ts +2 -0
  151. package/dist/src/utils/mergeObjects.test.d.ts.map +1 -0
  152. package/dist/src/utils/numberExtractor.test.d.ts +2 -0
  153. package/dist/src/utils/numberExtractor.test.d.ts.map +1 -0
  154. package/dist/src/utils/propertyCacher.test.d.ts +2 -0
  155. package/dist/src/utils/propertyCacher.test.d.ts.map +1 -0
  156. package/dist/src/utils/propertyCoalescer.test.d.ts +2 -0
  157. package/dist/src/utils/propertyCoalescer.test.d.ts.map +1 -0
  158. package/dist/src/utils/propertyCoalescer.test.js +3 -0
  159. package/dist/src/utils/radixSort.test.d.ts +2 -0
  160. package/dist/src/utils/radixSort.test.d.ts.map +1 -0
  161. package/dist/src/utils/reservationMap.test.d.ts +2 -0
  162. package/dist/src/utils/reservationMap.test.d.ts.map +1 -0
  163. package/dist/src/utils/ringBuffer.test.d.ts +2 -0
  164. package/dist/src/utils/ringBuffer.test.d.ts.map +1 -0
  165. package/dist/src/utils/topK.test.d.ts +2 -0
  166. package/dist/src/utils/topK.test.d.ts.map +1 -0
  167. package/dist/src/utils/trees.test.d.ts +2 -0
  168. package/dist/src/utils/trees.test.d.ts.map +1 -0
  169. package/dist/src/utils/trees.test.js +8 -3
  170. package/dist/src/utils/variableTools.test.d.ts +2 -0
  171. package/dist/src/utils/variableTools.test.d.ts.map +1 -0
  172. package/dist/src/view/axisResolution.d.ts +19 -6
  173. package/dist/src/view/axisResolution.d.ts.map +1 -1
  174. package/dist/src/view/axisResolution.js +16 -7
  175. package/dist/src/view/axisResolution.test.d.ts +2 -0
  176. package/dist/src/view/axisResolution.test.d.ts.map +1 -0
  177. package/dist/src/view/axisResolution.test.js +16 -11
  178. package/dist/src/view/facetView.d.ts +1 -1
  179. package/dist/src/view/facetView.d.ts.map +1 -1
  180. package/dist/src/view/flowBuilder.d.ts +1 -1
  181. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  182. package/dist/src/view/flowBuilder.js +34 -5
  183. package/dist/src/view/flowBuilder.test.d.ts +2 -0
  184. package/dist/src/view/flowBuilder.test.d.ts.map +1 -0
  185. package/dist/src/view/gridView.d.ts +0 -6
  186. package/dist/src/view/gridView.d.ts.map +1 -1
  187. package/dist/src/view/layerView.d.ts +0 -6
  188. package/dist/src/view/layerView.d.ts.map +1 -1
  189. package/dist/src/view/layout/flexLayout.test.d.ts +2 -0
  190. package/dist/src/view/layout/flexLayout.test.d.ts.map +1 -0
  191. package/dist/src/view/layout/grid.test.d.ts +2 -0
  192. package/dist/src/view/layout/grid.test.d.ts.map +1 -0
  193. package/dist/src/view/layout/rectangle.test.d.ts +2 -0
  194. package/dist/src/view/layout/rectangle.test.d.ts.map +1 -0
  195. package/dist/src/view/paramMediator.d.ts +32 -5
  196. package/dist/src/view/paramMediator.d.ts.map +1 -1
  197. package/dist/src/view/paramMediator.js +97 -9
  198. package/dist/src/view/paramMediator.test.d.ts +2 -0
  199. package/dist/src/view/paramMediator.test.d.ts.map +1 -0
  200. package/dist/src/view/paramMediator.test.js +17 -1
  201. package/dist/src/view/scaleResolution.d.ts +17 -9
  202. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  203. package/dist/src/view/scaleResolution.js +51 -34
  204. package/dist/src/view/scaleResolution.test.d.ts +2 -0
  205. package/dist/src/view/scaleResolution.test.d.ts.map +1 -0
  206. package/dist/src/view/scaleResolution.test.js +2 -0
  207. package/dist/src/view/testUtils.d.ts.map +1 -1
  208. package/dist/src/view/testUtils.js +15 -3
  209. package/dist/src/view/unitView.d.ts +5 -15
  210. package/dist/src/view/unitView.d.ts.map +1 -1
  211. package/dist/src/view/unitView.js +81 -101
  212. package/dist/src/view/view.d.ts +1 -1
  213. package/dist/src/view/view.d.ts.map +1 -1
  214. package/dist/src/view/view.test.d.ts +2 -0
  215. package/dist/src/view/view.test.d.ts.map +1 -0
  216. package/dist/src/view/view.test.js +73 -55
  217. package/dist/src/view/viewFactory.test.d.ts +2 -0
  218. package/dist/src/view/viewFactory.test.d.ts.map +1 -0
  219. package/dist/src/view/viewFactory.test.js +2 -2
  220. package/dist/src/view/zoom.js +2 -2
  221. package/package.json +5 -2
@@ -17,8 +17,12 @@ export const LOCUS: "locus";
17
17
  export const INDEX: "index";
18
18
  /**
19
19
  * @template {ChannelWithScale}[T=ChannelWithScale]
20
- * @typedef {{view: import("./unitView.js").default, channel: T}} ResolutionMember
21
20
  *
21
+ * @typedef {object} ScaleResolutionMember
22
+ * @prop {import("./unitView.js").default} view TODO: Get rid of the view reference
23
+ * @prop {T} channel
24
+ * @prop {import("../spec/channel.js").ChannelDefWithScale} channelDef
25
+ * @prop {(channel: ChannelWithScale, type: import("../spec/channel.js").Type) => DomainArray} dataDomainSource
22
26
  */
23
27
  /**
24
28
  * Resolution takes care of merging domains and scales from multiple views.
@@ -34,10 +38,10 @@ export default class ScaleResolution implements ScaleResolutionApi {
34
38
  */
35
39
  constructor(channel: import("../spec/channel.js").Channel);
36
40
  channel: import("../spec/channel.js").Channel;
37
- /** @type {ResolutionMember[]} The involved views */
38
- members: ResolutionMember[];
39
- /** @type {string} Data type (quantitative, nominal, etc...) */
40
- type: string;
41
+ /** @type {ScaleResolutionMember[]} The involved views */
42
+ members: ScaleResolutionMember[];
43
+ /** @type {import("../spec/channel.js").Type} Data type (quantitative, nominal, etc...) */
44
+ type: import("../spec/channel.js").Type;
41
45
  /** @type {string} An optional unique identifier for the scale */
42
46
  name: string;
43
47
  /**
@@ -58,10 +62,9 @@ export default class ScaleResolution implements ScaleResolutionApi {
58
62
  * Add a view to this resolution.
59
63
  * N.B. This is expected to be called in depth-first order
60
64
  *
61
- * @param {UnitView} view
62
- * @param {ChannelWithScale} channel
65
+ * @param {ScaleResolutionMember} newMember
63
66
  */
64
- pushUnitView(view: import("./unitView.js").default, channel: import("../spec/channel.js").ChannelWithScale): void;
67
+ pushUnitView(newMember: ScaleResolutionMember): void;
65
68
  /**
66
69
  * Unions the configured domains of all participating views.
67
70
  *
@@ -157,8 +160,13 @@ export default class ScaleResolution implements ScaleResolutionApi {
157
160
  fromComplexInterval(interval: import("../spec/scale.js").ScalarDomain | import("../spec/scale.js").ComplexDomain): number[];
158
161
  #private;
159
162
  }
160
- export type ResolutionMember<T extends import("../spec/channel.js").ChannelWithScale = import("../spec/channel.js").ChannelWithScale> = {
163
+ export type ScaleResolutionMember<T extends import("../spec/channel.js").ChannelWithScale = import("../spec/channel.js").ChannelWithScale> = {
164
+ /**
165
+ * TODO: Get rid of the view reference
166
+ */
161
167
  view: import("./unitView.js").default;
162
168
  channel: T;
169
+ channelDef: import("../spec/channel.js").ChannelDefWithScale;
170
+ dataDomainSource: (channel: import("../spec/channel.js").ChannelWithScale, type: import("../spec/channel.js").Type) => import("../utils/domainArray.js").DomainArray;
163
171
  };
164
172
  //# sourceMappingURL=scaleResolution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.js"],"names":[],"mappings":"AA86BA;;;;;;;;;;GAUG;AACH,6CAFW,OAAO,WAAW,EAAE,OAAO,GAAG,OAAO,WAAW,EAAE,OAAO,EAAE,QA4BrE;AAr6BD,0CAA2C;AAC3C,gCAAiC;AACjC,gCAAiC;AACjC,4BAA6B;AAC7B,4BAA6B;AAE7B;;;;GAIG;AACH;;;;;;;GAOG;AACH;IAyCI;;OAEG;IACH,2DASC;IARG,8CAAsB;IACtB,oDAAoD;IACpD,SADW,gBAAgB,EAAE,CACZ;IACjB,+DAA+D;IAC/D,MADW,MAAM,CACD;IAEhB,iEAAiE;IACjE,MADW,MAAM,CACI;IAWzB;;;;;;;OAOG;IACH,4KAEC;IAED;;;OAGG;IACH,+KAEC;IAcD;;;;;;OAMG;IACH,kHA0BC;IAmLD;;;;OAIG;IACH,qEAMC;IAED;;;;OAIG;IACH,+DAQC;IAED;;OAEG;IACH,oBAyCC;IAED;;OAEG;IACH;eAhXkC,OAAO,kBAAkB,EAAE,KAAK;MAuZjE;IAED,mBAEC;IAED;;OAEG;IACH,oBAFa,mFAA6B,CAOzC;IAED;;;;OAIG;IACH,oBAKC;IAED;;OAEG;IACH,sBAGC;IAUD;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CAwEnB;IAED;;;;;;OAMG;IACH,eAJW,mFAA6B,aAC7B,OAAO,GAAG,MAAM,iBAgD1B;IAED;;;;OAIG;IACH,qBAcC;IAED;;;;;OAKG;IACH,uBAOC;IA8DD;;;OAGG;IACH,aAFa,OAAO,qBAAqB,EAAE,OAAO,CAajD;IAID;;;;;OAKG;IACH,uBAFW,MAAM,yDAUhB;IAED;;OAEG;IACH,iBAFW,MAAM,yDAKhB;IAED;;;OAGG;IACH,6EAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,mHAFa,MAAM,EAAE,CAOpB;;CA6BJ;wIAjyBY;IAAC,IAAI,EAAE,OAAO,eAAe,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAC"}
1
+ {"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.js"],"names":[],"mappings":"AA+7BA;;;;;;;;;;GAUG;AACH,6CAFW,OAAO,WAAW,EAAE,OAAO,GAAG,OAAO,WAAW,EAAE,OAAO,EAAE,QA4BrE;AAv7BD,0CAA2C;AAC3C,gCAAiC;AACjC,gCAAiC;AACjC,4BAA6B;AAC7B,4BAA6B;AAE7B;;;;;;;;GAQG;AACH;;;;;;;GAOG;AACH;IAyCI;;OAEG;IACH,2DASC;IARG,8CAAsB;IACtB,yDAAyD;IACzD,SADW,qBAAqB,EAAE,CACjB;IACjB,0FAA0F;IAC1F,MADW,OAAO,oBAAoB,EAAE,IAAI,CAC5B;IAEhB,iEAAiE;IACjE,MADW,MAAM,CACI;IAWzB;;;;;;;OAOG;IACH,4KAEC;IAED;;;OAGG;IACH,+KAEC;IAcD;;;;;OAKG;IACH,wBAFW,qBAAqB,QA4B/B;IAuLD;;;;OAIG;IACH,qEAgBC;IAED;;;;OAIG;IACH,+DAMC;IAED;;OAEG;IACH,oBAyCC;IAED;;OAEG;IACH;eA3XkC,OAAO,kBAAkB,EAAE,KAAK;MAuajE;IAED,mBAEC;IAED;;OAEG;IACH,oBAFa,mFAA6B,CAOzC;IAED;;;;OAIG;IACH,oBAKC;IAED;;OAEG;IACH,sBAGC;IAUD;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CAwEnB;IAED;;;;;;OAMG;IACH,eAJW,mFAA6B,aAC7B,OAAO,GAAG,MAAM,iBAgD1B;IAED;;;;OAIG;IACH,qBAcC;IAED;;;;;OAKG;IACH,uBAOC;IA8DD;;;OAGG;IACH,aAFa,OAAO,qBAAqB,EAAE,OAAO,CAajD;IAID;;;;;OAKG;IACH,uBAFW,MAAM,yDAUhB;IAED;;OAEG;IACH,iBAFW,MAAM,yDAKhB;IAED;;;OAGG;IACH,6EAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,mHAFa,MAAM,EAAE,CAOpB;;CA2BJ;;;;;UAjzBS,OAAO,eAAe,EAAE,OAAO;aAC/B,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB;qFACd,OAAO,oBAAoB,EAAE,IAAI"}
@@ -21,7 +21,6 @@ import mergeObjects from "../utils/mergeObjects.js";
21
21
  import createScale, { configureScale } from "../scale/scale.js";
22
22
 
23
23
  import {
24
- getChannelDefWithScale,
25
24
  isColorChannel,
26
25
  isDiscreteChannel,
27
26
  isPositionalChannel,
@@ -32,7 +31,7 @@ import {
32
31
  isChromosomalLocus,
33
32
  isChromosomalLocusInterval,
34
33
  } from "../genome/genome.js";
35
- import { NominalDomain } from "../utils/domainArray.js";
34
+ import createDomain, { NominalDomain } from "../utils/domainArray.js";
36
35
  import { easeCubicInOut } from "d3-ease";
37
36
  import { asArray, shallowArrayEquals } from "../utils/arrayUtils.js";
38
37
  import eerp from "../utils/eerp.js";
@@ -52,8 +51,12 @@ export const INDEX = "index";
52
51
 
53
52
  /**
54
53
  * @template {ChannelWithScale}[T=ChannelWithScale]
55
- * @typedef {{view: import("./unitView.js").default, channel: T}} ResolutionMember
56
54
  *
55
+ * @typedef {object} ScaleResolutionMember
56
+ * @prop {import("./unitView.js").default} view TODO: Get rid of the view reference
57
+ * @prop {T} channel
58
+ * @prop {import("../spec/channel.js").ChannelDefWithScale} channelDef
59
+ * @prop {(channel: ChannelWithScale, type: import("../spec/channel.js").Type) => DomainArray} dataDomainSource
57
60
  */
58
61
  /**
59
62
  * Resolution takes care of merging domains and scales from multiple views.
@@ -109,9 +112,9 @@ export default class ScaleResolution {
109
112
  */
110
113
  constructor(channel) {
111
114
  this.channel = channel;
112
- /** @type {ResolutionMember[]} The involved views */
115
+ /** @type {ScaleResolutionMember[]} The involved views */
113
116
  this.members = [];
114
- /** @type {string} Data type (quantitative, nominal, etc...) */
117
+ /** @type {import("../spec/channel.js").Type} Data type (quantitative, nominal, etc...) */
115
118
  this.type = null;
116
119
 
117
120
  /** @type {string} An optional unique identifier for the scale */
@@ -162,11 +165,10 @@ export default class ScaleResolution {
162
165
  * Add a view to this resolution.
163
166
  * N.B. This is expected to be called in depth-first order
164
167
  *
165
- * @param {UnitView} view
166
- * @param {ChannelWithScale} channel
168
+ * @param {ScaleResolutionMember} newMember
167
169
  */
168
- pushUnitView(view, channel) {
169
- const channelDef = getChannelDefWithScale(view, channel);
170
+ pushUnitView(newMember) {
171
+ const { channel, channelDef } = newMember;
170
172
  const type = channelDef.type;
171
173
  const name = channelDef?.scale?.name;
172
174
 
@@ -190,7 +192,7 @@ export default class ScaleResolution {
190
192
  // TODO: Use the same merging logic as in: https://github.com/vega/vega-lite/blob/master/src/scale.ts
191
193
  }
192
194
 
193
- this.members.push({ view, channel });
195
+ this.members.push(newMember);
194
196
  }
195
197
 
196
198
  /**
@@ -227,10 +229,7 @@ export default class ScaleResolution {
227
229
  */
228
230
  #getMergedScaleProps() {
229
231
  const propArray = this.members
230
- .map(
231
- (member) =>
232
- getChannelDefWithScale(member.view, member.channel).scale
233
- )
232
+ .map((member) => member.channelDef.scale)
234
233
  .filter((props) => props !== undefined);
235
234
 
236
235
  // TODO: Disabled scale: https://vega.github.io/vega-lite/docs/scale.html#disable
@@ -241,9 +240,10 @@ export default class ScaleResolution {
241
240
  * Returns the merged scale properties supplemented with inferred properties
242
241
  * and domain.
243
242
  *
243
+ * @param {boolean} [extractDataDomain]
244
244
  * @returns {import("../spec/scale.js").Scale}
245
245
  */
246
- #getScaleProps() {
246
+ #getScaleProps(extractDataDomain = false) {
247
247
  const mergedProps = this.#getMergedScaleProps();
248
248
  if (mergedProps === null || mergedProps.type == "null") {
249
249
  // No scale (pass-thru)
@@ -260,7 +260,7 @@ export default class ScaleResolution {
260
260
  props.type = getDefaultScaleType(this.channel, this.type);
261
261
  }
262
262
 
263
- const domain = this.#getInitialDomain();
263
+ const domain = this.#getInitialDomain(extractDataDomain);
264
264
 
265
265
  if (domain && domain.length > 0) {
266
266
  props.domain = domain;
@@ -360,13 +360,19 @@ export default class ScaleResolution {
360
360
  }
361
361
  }
362
362
 
363
- #getInitialDomain() {
363
+ /**
364
+ *
365
+ * @param {boolean} extractDataDomain
366
+ */
367
+ #getInitialDomain(extractDataDomain = false) {
364
368
  // TODO: intersect the domain with zoom extent (if it's defined)
365
369
  return (
366
370
  this.getConfiguredDomain() ??
367
371
  (this.type == LOCUS
368
372
  ? this.getGenome().getExtent()
369
- : this.getDataDomain())
373
+ : extractDataDomain
374
+ ? this.getDataDomain()
375
+ : [])
370
376
  );
371
377
  }
372
378
 
@@ -376,11 +382,21 @@ export default class ScaleResolution {
376
382
  * @return { DomainArray }
377
383
  */
378
384
  getConfiguredDomain() {
379
- return this.#reduceDomains((member) =>
380
- isSecondaryChannel(member.channel)
381
- ? undefined
382
- : member.view.getConfiguredDomain(member.channel)
383
- );
385
+ const domains = this.members
386
+ .map((member) => member.channelDef)
387
+ .filter((channelDef) => channelDef.scale?.domain)
388
+ .map((channelDef) =>
389
+ // TODO: Handle ExprRefs and Param in domain
390
+ createDomain(
391
+ channelDef.type,
392
+ // Chrom/pos must be linearized first
393
+ this.fromComplexInterval(channelDef.scale.domain)
394
+ )
395
+ );
396
+
397
+ if (domains.length > 0) {
398
+ return domains.reduce((acc, curr) => acc.extendAll(curr));
399
+ }
384
400
  }
385
401
 
386
402
  /**
@@ -392,9 +408,7 @@ export default class ScaleResolution {
392
408
  // TODO: Optimize: extract domain only once if the views share the data.
393
409
  // In fact, this should be a responsibility of collectors.
394
410
  return this.#reduceDomains((member) =>
395
- isSecondaryChannel(member.channel)
396
- ? undefined
397
- : member.view.extractDataDomain(member.channel)
411
+ member.dataDomainSource(member.channel, this.type)
398
412
  );
399
413
  }
400
414
 
@@ -411,7 +425,7 @@ export default class ScaleResolution {
411
425
  const domainWasInitialized = this.#isDomainInitialized();
412
426
  const previousDomain = scale.domain();
413
427
 
414
- const props = this.#getScaleProps();
428
+ const props = this.#getScaleProps(true);
415
429
  configureScale({ ...props, range: undefined }, scale);
416
430
 
417
431
  // Annotate the scale with the new props
@@ -458,6 +472,11 @@ export default class ScaleResolution {
458
472
  // Annotate the scale with props
459
473
  scale.props = props;
460
474
 
475
+ if ("unknown" in scale) {
476
+ // Never allow implicit domain construction
477
+ scale.unknown(null);
478
+ }
479
+
461
480
  this.#scale = scale;
462
481
  this.#configureRange();
463
482
 
@@ -630,7 +649,7 @@ export default class ScaleResolution {
630
649
 
631
650
  // TODO: Intersect the domain with zoom extent
632
651
 
633
- const animator = this.members[0]?.view.context.animator;
652
+ const animator = this.#viewContext.animator;
634
653
 
635
654
  const scale = this.scale;
636
655
  const from = /** @type {number[]} */ (scale.domain());
@@ -770,7 +789,7 @@ export default class ScaleResolution {
770
789
  }
771
790
 
772
791
  // TODO: Support multiple assemblies
773
- const genome = this.members[0].view.context.genomeStore?.getGenome();
792
+ const genome = this.#viewContext.genomeStore?.getGenome();
774
793
  if (!genome) {
775
794
  throw new Error("No genome has been defined!");
776
795
  }
@@ -826,21 +845,19 @@ export default class ScaleResolution {
826
845
  return /** @type {number[]} */ (interval);
827
846
  }
828
847
 
829
- #getViewPaths() {
830
- return this.members.map((v) => v.view.getPathString()).join(", ");
831
- }
832
-
833
848
  /**
834
849
  * Iterate all participanting views and reduce (union) their domains using an accessor.
835
850
  * Accessor may return the an explicitly configured domain or a domain extracted from the data.
836
851
  *
837
- * @param {function(ResolutionMember):DomainArray} domainAccessor
852
+ * @param {function(ScaleResolutionMember):DomainArray} domainAccessor
838
853
  * @returns {DomainArray}
839
854
  */
840
855
  #reduceDomains(domainAccessor) {
841
856
  const domains = this.members
842
857
  .filter(
843
858
  (member) =>
859
+ // View is missing if ScaleResolution is used within tests
860
+ !member.view ||
844
861
  !member.view
845
862
  .getLayoutAncestors()
846
863
  // TODO: Should check until the resolved scale resolution
@@ -0,0 +1,2 @@
1
+ export type Channel = import("../spec/channel.js").Channel;
2
+ //# sourceMappingURL=scaleResolution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleResolution.test.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.test.js"],"names":[],"mappings":"sBAWa,OAAO,oBAAoB,EAAE,OAAO"}
@@ -1,3 +1,5 @@
1
+ // @ts-nocheck
2
+
1
3
  import { describe, expect, test } from "vitest";
2
4
  import { createAndInitialize } from "./testUtils.js";
3
5
  import createDomain, { toRegularArray as r } from "../utils/domainArray.js";
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAeA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAqDvD;AAGS,oEAA8C,QAAQ,2BAA4B,GAAG,EAAE,6BAA6B,OAAO,kBAAkB,EAAE,kBAAkB,cAAe;AAgBhL,iFAA8C,QAAQ,2BAA4B,GAAG,EAAE,kBAAkB,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,cAAe;;;;;uBApFpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAmDvD;AAGS,oEAA8C,QAAQ,2BAA4B,GAAG,EAAE,6BAA6B,OAAO,kBAAkB,EAAE,kBAAkB,cAAe;AAgBhL,iFAA8C,QAAQ,2BAA4B,GAAG,EAAE,kBAAkB,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,cAAe;;;;;uBApFpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
@@ -7,11 +7,13 @@
7
7
  */
8
8
 
9
9
  import { checkForDuplicateScaleNames, initializeData } from "./viewUtils.js";
10
- import AccessorFactory from "../encoder/accessor.js";
11
10
  import DataFlow from "../data/dataFlow.js";
12
11
  import { VIEW_ROOT_NAME, ViewFactory } from "./viewFactory.js";
13
12
  import GenomeStore from "../genome/genomeStore.js";
14
13
  import BmFontManager from "../fonts/bmFontManager.js";
14
+ import { reconfigureScales } from "./scaleResolution.js";
15
+ import UnitView from "./unitView.js";
16
+ import ContainerView from "./containerView.js";
15
17
 
16
18
  /**
17
19
  * @param {import("./viewFactory.js").ViewFactoryOptions} [viewFactoryOptions]
@@ -35,8 +37,6 @@ export function createTestViewContext(viewFactoryOptions = {}) {
35
37
 
36
38
  // @ts-expect-error
37
39
  const c = /** @type {ViewContext} */ ({
38
- accessorFactory: new AccessorFactory(),
39
-
40
40
  createView: function (spec, parent, defaultName) {
41
41
  throw new Error("Not implemented: createView");
42
42
  },
@@ -92,6 +92,18 @@ export async function createAndInitialize(spec, viewClass) {
92
92
  const view = await create(spec, viewClass);
93
93
 
94
94
  checkForDuplicateScaleNames(view);
95
+
96
+ if (view instanceof UnitView) {
97
+ view.mark.initializeEncoders();
98
+ } else if (view instanceof ContainerView) {
99
+ view.visit((v) => {
100
+ if (v instanceof UnitView) {
101
+ v.mark.initializeEncoders();
102
+ }
103
+ });
104
+ }
105
+
95
106
  await initializeData(view, view.context.dataFlow);
107
+ reconfigureScales(view);
96
108
  return view;
97
109
  }
@@ -20,12 +20,6 @@ export default class UnitView extends View {
20
20
  spec: import("../spec/view.js").UnitSpec;
21
21
  /** @type {import("../marks/mark.js").default} */
22
22
  mark: import("../marks/mark.js").default;
23
- /**
24
- * @param {import("./renderingContext/viewRenderingContext.js").default} context
25
- * @param {import("./layout/rectangle.js").default} coords
26
- * @param {import("../types/rendering.js").RenderingOptions} [options]
27
- */
28
- render(context: import("./renderingContext/viewRenderingContext.js").default, coords: import("./layout/rectangle.js").default, options?: import("../types/rendering.js").RenderingOptions): void;
29
23
  getMarkType(): import("../spec/mark.js").MarkType;
30
24
  /**
31
25
  * Pulls scales and axes up in the view hierarcy according to the resolution rules, using dataParents.
@@ -35,21 +29,16 @@ export default class UnitView extends View {
35
29
  */
36
30
  resolve(type?: import("../spec/view.js").ResolutionTarget): void;
37
31
  /**
32
+ * Returns an accessor that accesses a field or an evaluated expression,
33
+ * if there is one.
38
34
  *
39
35
  * @param {Channel} channel
40
36
  */
41
- getAccessor(channel: import("../spec/channel.js").Channel): import("../types/encoder.js").Accessor;
37
+ getDataAccessor(channel: import("../spec/channel.js").Channel): import("../types/encoder.js").Accessor<import("../spec/channel.js").Scalar>;
42
38
  /**
43
39
  * Returns a collector that is associated with this view.
44
40
  */
45
41
  getCollector(): import("../data/collector.js").default;
46
- /**
47
- * Returns the domain of the specified channel of this domain/mark.
48
- *
49
- * @param {import("../spec/channel.js").ChannelWithScale} channel A primary channel
50
- * @returns {DomainArray}
51
- */
52
- getConfiguredDomain(channel: import("../spec/channel.js").ChannelWithScale): import("../utils/domainArray.js").DomainArray;
53
42
  /**
54
43
  * Extracts the domain from the data.
55
44
  *
@@ -61,9 +50,10 @@ export default class UnitView extends View {
61
50
  * (with aggregate and extent).
62
51
  *
63
52
  * @param {Channel} channel
53
+ * @param {import("../spec/channel.js").Type} type
64
54
  * @returns {DomainArray}
65
55
  */
66
- extractDataDomain(channel: import("../spec/channel.js").Channel): import("../utils/domainArray.js").DomainArray;
56
+ extractDataDomain(channel: import("../spec/channel.js").Channel, type: import("../spec/channel.js").Type): import("../utils/domainArray.js").DomainArray;
67
57
  getZoomLevel(): number;
68
58
  /**
69
59
  * @param {string} channel
@@ -1 +1 @@
1
- {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH;QAHkB,MAAM,GAAE,cAAc,kBAAkB,EAAE,OAAO;EASjE;AAEF;IAcI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EA+BzC;IA1BG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAuBlC;;;;OAIG;IACH,gBAJW,OAAO,4CAA4C,EAAE,OAAO,UAC5D,OAAO,uBAAuB,EAAE,OAAO,YACvC,OAAO,uBAAuB,EAAE,gBAAgB,QAY1D;IAED,kDAIC;IAED;;;;;OAKG;IACH,iEAgFC;IAED;;;OAGG;IACH,mGASC;IAkBD;;OAEG;IACH,uDAEC;IAqBD;;;;;OAKG;IACH,6BAHW,OAAO,oBAAoB,EAAE,gBAAgB,iDAkBvD;IAED;;;;;;;;;;;;OAYG;IACH,gHA2CC;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBA/VgB,WAAW"}
1
+ {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH;QAHkB,MAAM,GAAE,cAAc,kBAAkB,EAAE,OAAO;EASjE;AAEF;IAeI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAiCzC;IA5BG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAsFlC,kDAIC;IAED;;;;;OAKG;IACH,iEAmFC;IAED;;;;;OAKG;IACH,4IAEC;IAkBD;;OAEG;IACH,uDAEC;IAED;;;;;;;;;;;;;OAaG;IACH,uEAHW,OAAO,oBAAoB,EAAE,IAAI,iDAqB3C;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBA7UgB,WAAW"}
@@ -6,8 +6,6 @@ import TextMark from "../marks/text.js";
6
6
 
7
7
  import ScaleResolution from "./scaleResolution.js";
8
8
  import {
9
- isSecondaryChannel,
10
- secondaryChannels,
11
9
  isPositionalChannel,
12
10
  isChannelDefWithScale,
13
11
  primaryPositionalChannels,
@@ -18,6 +16,9 @@ import {
18
16
  import createDomain from "../utils/domainArray.js";
19
17
  import AxisResolution from "./axisResolution.js";
20
18
  import View from "./view.js";
19
+ import { createSinglePointSelection } from "../selection/selection.js";
20
+ import { isString } from "vega-util";
21
+ import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
21
22
 
22
23
  /**
23
24
  *
@@ -37,6 +38,7 @@ export default class UnitView extends View {
37
38
  * @typedef {import("../spec/channel.js").Channel} Channel
38
39
  * @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
39
40
  * @typedef {import("../spec/view.js").ResolutionTarget} ResolutionTarget
41
+ * @typedef {((datum: import("../data/flowNode.js").Datum) => import("../spec/channel.js").Scalar) & { fieldDef: import("../spec/channel.js").FieldDef}} FieldAccessor
40
42
  *
41
43
  */
42
44
 
@@ -84,6 +86,52 @@ export default class UnitView extends View {
84
86
  );
85
87
 
86
88
  this.needsAxes = { x: true, y: true };
89
+
90
+ this.#setupPointSelection();
91
+ }
92
+
93
+ #setupPointSelection() {
94
+ for (const [name, param] of this.paramMediator.paramConfigs) {
95
+ if (!("select" in param)) {
96
+ continue;
97
+ }
98
+
99
+ const select = param.select;
100
+ const type = isString(select) ? select : select.type;
101
+ if (type === "point") {
102
+ // Handle projection-free point selections
103
+
104
+ const none = -1;
105
+ let lastId = none;
106
+
107
+ const setter = this.paramMediator.getSetter(name);
108
+
109
+ const getHoveredDatum = () => {
110
+ const h = this.context.getCurrentHover();
111
+ return h?.mark?.unitView === this ? h.datum : null;
112
+ };
113
+
114
+ const on =
115
+ !isString(select) && "on" in select ? select.on : "click";
116
+
117
+ this.addInteractionEventListener(
118
+ ["mouseover", "pointerover"].includes(on)
119
+ ? "mousemove"
120
+ : "click",
121
+ (rect, event) => {
122
+ const datum = getHoveredDatum();
123
+ const id = datum ? datum[UNIQUE_ID_KEY] : none;
124
+ if (id != lastId) {
125
+ lastId = id;
126
+ const selection = createSinglePointSelection(
127
+ getHoveredDatum()
128
+ );
129
+ setter(selection);
130
+ }
131
+ }
132
+ );
133
+ }
134
+ }
87
135
  }
88
136
 
89
137
  /**
@@ -172,10 +220,11 @@ export default class UnitView extends View {
172
220
  targetChannel
173
221
  );
174
222
  }
175
- view.resolutions[type][targetChannel].pushUnitView(
176
- this,
177
- channel
178
- );
223
+ view.resolutions[type][targetChannel].pushUnitView({
224
+ view: this,
225
+ channel,
226
+ channelDef,
227
+ });
179
228
  } else if (type == "scale" && isChannelWithScale(channel)) {
180
229
  if (!view.resolutions[type][targetChannel]) {
181
230
  const resolution = new ScaleResolution(targetChannel);
@@ -189,27 +238,24 @@ export default class UnitView extends View {
189
238
  );
190
239
  });
191
240
  }
192
- view.resolutions[type][targetChannel].pushUnitView(
193
- this,
194
- channel
195
- );
241
+ view.resolutions[type][targetChannel].pushUnitView({
242
+ view: this,
243
+ channel,
244
+ channelDef,
245
+ dataDomainSource: this.extractDataDomain.bind(this),
246
+ });
196
247
  }
197
248
  }
198
249
  }
199
250
 
200
251
  /**
252
+ * Returns an accessor that accesses a field or an evaluated expression,
253
+ * if there is one.
201
254
  *
202
255
  * @param {Channel} channel
203
256
  */
204
- getAccessor(channel) {
205
- return this._cache("accessor/" + channel, () => {
206
- const encoding = this.mark.encoding; // Mark provides encodings with defaults and possible modifications
207
- if (encoding && encoding[channel]) {
208
- return this.context.accessorFactory.createAccessor(
209
- encoding[channel]
210
- );
211
- }
212
- });
257
+ getDataAccessor(channel) {
258
+ return this.mark.encoders[channel]?.dataAccessor;
213
259
  }
214
260
 
215
261
  /**
@@ -220,7 +266,7 @@ export default class UnitView extends View {
220
266
  */
221
267
  getFacetAccessor(whoIsAsking) {
222
268
  // TODO: Rewrite, call getFacetFields
223
- const sampleAccessor = this.getAccessor("sample");
269
+ const sampleAccessor = this.getDataAccessor("sample");
224
270
  if (sampleAccessor) {
225
271
  return sampleAccessor;
226
272
  }
@@ -235,48 +281,6 @@ export default class UnitView extends View {
235
281
  return this.context.dataFlow.findCollectorByKey(this);
236
282
  }
237
283
 
238
- /**
239
- * @param {Channel} channel A primary channel
240
- */
241
- #validateDomainQuery(channel) {
242
- if (isSecondaryChannel(channel)) {
243
- throw new Error(
244
- `getDomain(${channel}), must only be called for primary channels!`
245
- );
246
- }
247
-
248
- const channelDef = this.mark.encoding[channel];
249
- // TODO: Broken. Fix.
250
- if (!isChannelDefWithScale(channelDef)) {
251
- throw new Error("The channel has no scale, cannot get domain!");
252
- }
253
-
254
- return channelDef;
255
- }
256
-
257
- /**
258
- * Returns the domain of the specified channel of this domain/mark.
259
- *
260
- * @param {import("../spec/channel.js").ChannelWithScale} channel A primary channel
261
- * @returns {DomainArray}
262
- */
263
- getConfiguredDomain(channel) {
264
- const channelDef = this.#validateDomainQuery(channel);
265
-
266
- const specDomain =
267
- channelDef && channelDef.scale && channelDef.scale.domain;
268
- if (specDomain) {
269
- const scaleResolution = this.getScaleResolution(
270
- channelDef.resolutionChannel ?? channel
271
- );
272
- return createDomain(
273
- channelDef.type ?? "nominal",
274
- // Chrom/pos must be linearized first
275
- scaleResolution.fromComplexInterval(specDomain)
276
- );
277
- }
278
- }
279
-
280
284
  /**
281
285
  * Extracts the domain from the data.
282
286
  *
@@ -288,49 +292,25 @@ export default class UnitView extends View {
288
292
  * (with aggregate and extent).
289
293
  *
290
294
  * @param {Channel} channel
295
+ * @param {import("../spec/channel.js").Type} type
291
296
  * @returns {DomainArray}
292
297
  */
293
- extractDataDomain(channel) {
294
- const channelDef = this.#validateDomainQuery(channel);
295
- const type = channelDef.type ?? "nominal"; // TODO: Should check that this is a channel without scale
296
-
297
- /** @param {Channel} channel */
298
- const extract = (channel) => {
299
- /** @type {DomainArray} */
300
- let domain;
301
-
302
- const encodingSpec = this.mark.encoding[channel];
303
-
304
- if (encodingSpec) {
305
- const accessor =
306
- this.context.accessorFactory.createAccessor(encodingSpec);
307
- if (accessor) {
308
- domain = createDomain(type);
309
-
310
- if (accessor.constant) {
311
- domain.extend(accessor({}));
312
- } else {
313
- const collector = this.getCollector();
314
- if (collector?.completed) {
315
- collector.visitData((d) =>
316
- domain.extend(accessor(d))
317
- );
318
- }
298
+ extractDataDomain(channel, type) {
299
+ /** @type {DomainArray} */
300
+ let domain = createDomain(type);
301
+
302
+ (this.mark.encoders[channel]?.accessors ?? [])
303
+ .filter((a) => a.scaleChannel)
304
+ .forEach((accessor) => {
305
+ if (accessor.constant) {
306
+ domain.extend(accessor({}));
307
+ } else {
308
+ const collector = this.getCollector();
309
+ if (collector?.completed) {
310
+ collector.visitData((d) => domain.extend(accessor(d)));
319
311
  }
320
312
  }
321
- }
322
- return domain;
323
- };
324
-
325
- let domain = extract(channel);
326
-
327
- const secondaryChannel = secondaryChannels[channel];
328
- if (secondaryChannel) {
329
- const secondaryDomain = extract(secondaryChannel);
330
- if (secondaryDomain) {
331
- domain.extendAll(secondaryDomain);
332
- }
333
- }
313
+ });
334
314
 
335
315
  return domain;
336
316
  }
@@ -205,7 +205,7 @@ export default class View {
205
205
  * pass. The order is depth first, pre order.
206
206
  */
207
207
  onBeforeRender(): void;
208
- render(context: ViewRenderingContext, coords: import("./layout/rectangle.js").default, options?: import("../types/rendering.js").RenderingOptions): void;
208
+ render(context: import("./renderingContext/viewRenderingContext.js").default, coords: import("./layout/rectangle.js").default, options?: import("../types/rendering.js").RenderingOptions): void;
209
209
  /**
210
210
  * Returns the encodings specified in this view combined with the inherited
211
211
  * encodings. However, this does not contain any defaults or inferred/adjusted/fixed