@genome-spy/core 0.74.0 → 0.76.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 (143) hide show
  1. package/dist/bundle/{esm-CgfVIRJ-.js → esm-BimDEpBb.js} +1 -1
  2. package/dist/bundle/{esm-DtE8VqAv.js → esm-Bvlm1uVk.js} +1 -1
  3. package/dist/bundle/{esm-sIoQYZ21.js → esm-CngqBe45.js} +17 -17
  4. package/dist/bundle/{esm-DQiq2Zhd.js → esm-D_euN86T.js} +43 -43
  5. package/dist/bundle/index.es.js +6064 -5756
  6. package/dist/bundle/index.js +104 -103
  7. package/dist/schema.json +572 -12
  8. package/dist/src/config/defaults/markDefaults.d.ts.map +1 -1
  9. package/dist/src/config/defaults/markDefaults.js +1 -12
  10. package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -1
  11. package/dist/src/config/defaults/scaleDefaults.js +1 -0
  12. package/dist/src/config/markConfig.d.ts.map +1 -1
  13. package/dist/src/config/markConfig.js +16 -8
  14. package/dist/src/config/themes.d.ts.map +1 -1
  15. package/dist/src/config/themes.js +15 -2
  16. package/dist/src/data/sources/dataUtils.d.ts +25 -0
  17. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  18. package/dist/src/data/sources/dataUtils.js +23 -0
  19. package/dist/src/data/sources/inlineSource.js +2 -2
  20. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +2 -2
  21. package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts +2 -0
  22. package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts.map +1 -0
  23. package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
  24. package/dist/src/data/sources/lazy/tabixSource.d.ts +7 -0
  25. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/tabixSource.js +18 -0
  27. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +37 -0
  28. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -0
  29. package/dist/src/data/sources/lazy/tabixTsvSource.js +163 -0
  30. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  31. package/dist/src/data/sources/urlSource.js +8 -3
  32. package/dist/src/encoder/encoder.d.ts +2 -2
  33. package/dist/src/encoder/encoder.d.ts.map +1 -1
  34. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  35. package/dist/src/genome/scaleLocus.js +8 -3
  36. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  37. package/dist/src/genomeSpy/interactionController.js +91 -51
  38. package/dist/src/genomeSpyBase.d.ts.map +1 -1
  39. package/dist/src/genomeSpyBase.js +4 -1
  40. package/dist/src/gl/dataToVertices.d.ts +12 -14
  41. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  42. package/dist/src/gl/dataToVertices.js +116 -95
  43. package/dist/src/gl/glslScaleGenerator.d.ts +3 -0
  44. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  45. package/dist/src/gl/glslScaleGenerator.js +10 -8
  46. package/dist/src/gl/vertexRangeIndex.d.ts +23 -0
  47. package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -0
  48. package/dist/src/gl/vertexRangeIndex.js +150 -0
  49. package/dist/src/gl/webGLHelper.d.ts +5 -2
  50. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  51. package/dist/src/gl/webGLHelper.js +20 -3
  52. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +1082 -0
  53. package/dist/src/marks/link.vertex.glsl.js +1 -1
  54. package/dist/src/marks/mark.d.ts +1 -1
  55. package/dist/src/minimal.d.ts.map +1 -1
  56. package/dist/src/minimal.js +5 -4
  57. package/dist/src/paramRuntime/expressionCompiler.d.ts +2 -1
  58. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -1
  59. package/dist/src/paramRuntime/expressionCompiler.js +3 -2
  60. package/dist/src/paramRuntime/expressionRef.d.ts +4 -1
  61. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -1
  62. package/dist/src/paramRuntime/expressionRef.js +10 -3
  63. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -1
  64. package/dist/src/paramRuntime/graphRuntime.js +15 -6
  65. package/dist/src/paramRuntime/paramRuntime.d.ts +8 -2
  66. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -1
  67. package/dist/src/paramRuntime/paramRuntime.js +10 -5
  68. package/dist/src/paramRuntime/types.d.ts +1 -0
  69. package/dist/src/paramRuntime/types.d.ts.map +1 -1
  70. package/dist/src/paramRuntime/types.js +1 -0
  71. package/dist/src/paramRuntime/viewParamRuntime.d.ts +5 -4
  72. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  73. package/dist/src/paramRuntime/viewParamRuntime.js +17 -6
  74. package/dist/src/scale/scale.d.ts.map +1 -1
  75. package/dist/src/scale/scale.js +11 -2
  76. package/dist/src/scales/domainPlanner.d.ts +57 -11
  77. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  78. package/dist/src/scales/domainPlanner.js +183 -84
  79. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  80. package/dist/src/scales/scaleInstanceManager.js +7 -2
  81. package/dist/src/scales/scalePropsResolver.d.ts +3 -3
  82. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  83. package/dist/src/scales/scalePropsResolver.js +28 -5
  84. package/dist/src/scales/scaleResolution.d.ts +12 -1
  85. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  86. package/dist/src/scales/scaleResolution.js +180 -21
  87. package/dist/src/scales/selectionDomainUtils.d.ts +10 -0
  88. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
  89. package/dist/src/scales/selectionDomainUtils.js +32 -3
  90. package/dist/src/screenshotExport.d.ts +23 -0
  91. package/dist/src/screenshotExport.d.ts.map +1 -0
  92. package/dist/src/screenshotExport.js +44 -0
  93. package/dist/src/screenshotHarness.d.ts.map +1 -1
  94. package/dist/src/screenshotHarness.js +26 -24
  95. package/dist/src/spec/axis.d.ts +2 -2
  96. package/dist/src/spec/channel.d.ts +34 -4
  97. package/dist/src/spec/data.d.ts +52 -0
  98. package/dist/src/spec/parameter.d.ts +6 -0
  99. package/dist/src/spec/scale.d.ts +13 -1
  100. package/dist/src/spec/transform.d.ts +6 -0
  101. package/dist/src/utils/expression.d.ts +16 -8
  102. package/dist/src/utils/expression.d.ts.map +1 -1
  103. package/dist/src/utils/expression.js +291 -11
  104. package/dist/src/view/axisGridView.d.ts.map +1 -1
  105. package/dist/src/view/axisGridView.js +2 -1
  106. package/dist/src/view/axisView.d.ts.map +1 -1
  107. package/dist/src/view/axisView.js +2 -1
  108. package/dist/src/view/facetView.d.ts.map +1 -1
  109. package/dist/src/view/facetView.js +2 -1
  110. package/dist/src/view/flowBuilder.d.ts +1 -1
  111. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  112. package/dist/src/view/flowBuilder.js +11 -7
  113. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  114. package/dist/src/view/gridView/gridChild.js +9 -1
  115. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  116. package/dist/src/view/gridView/gridView.js +198 -32
  117. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  118. package/dist/src/view/gridView/scrollbar.js +5 -1
  119. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  120. package/dist/src/view/gridView/selectionRect.js +5 -1
  121. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  122. package/dist/src/view/gridView/separatorView.js +5 -1
  123. package/dist/src/view/resolutionPlanner.d.ts +9 -0
  124. package/dist/src/view/resolutionPlanner.d.ts.map +1 -0
  125. package/dist/src/view/resolutionPlanner.js +302 -0
  126. package/dist/src/view/testUtils.d.ts +30 -3
  127. package/dist/src/view/testUtils.d.ts.map +1 -1
  128. package/dist/src/view/testUtils.js +51 -2
  129. package/dist/src/view/unitView.d.ts +1 -1
  130. package/dist/src/view/unitView.d.ts.map +1 -1
  131. package/dist/src/view/unitView.js +5 -152
  132. package/dist/src/view/view.d.ts.map +1 -1
  133. package/dist/src/view/view.js +2 -1
  134. package/dist/src/view/viewSelectors.d.ts +38 -10
  135. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  136. package/dist/src/view/viewSelectors.js +67 -2
  137. package/dist/src/view/viewUtilTypes.d.ts +15 -0
  138. package/dist/src/view/viewUtils.d.ts.map +1 -1
  139. package/dist/src/view/viewUtils.js +10 -0
  140. package/package.json +2 -2
  141. package/LICENSE +0 -21
  142. /package/dist/bundle/{esm-BDFRLEuD.js → esm-C49STiCR.js} +0 -0
  143. /package/dist/bundle/{esm-CGX-qz1d.js → esm-CuVa5T98.js} +0 -0
@@ -0,0 +1,302 @@
1
+ import ScaleResolution from "../scales/scaleResolution.js";
2
+ import AxisResolution from "../scales/axisResolution.js";
3
+ import {
4
+ isPositionalChannel,
5
+ isChannelDefWithScale,
6
+ getPrimaryChannel,
7
+ isChannelWithScale,
8
+ isPrimaryPositionalChannel,
9
+ isValueDefWithCondition,
10
+ } from "../encoder/encoder.js";
11
+
12
+ /**
13
+ * @typedef {object} ResolutionMember
14
+ * @prop {import("./unitView.js").default} view
15
+ * @prop {import("../spec/channel.js").Channel} channel
16
+ * @prop {import("../spec/channel.js").ChannelDefWithScale} channelDef
17
+ * @prop {import("../spec/channel.js").ChannelWithScale} targetChannel
18
+ */
19
+
20
+ /**
21
+ * @typedef {Map<import("../scales/scaleResolution.js").default, ResolutionMember[]>} ScaleResolutionMemberMap
22
+ */
23
+
24
+ /**
25
+ * @param {unknown} channelDef
26
+ * @returns {import("../spec/channel.js").ChannelDefWithScale | undefined}
27
+ */
28
+ const getChannelDefWithScale = (channelDef) => {
29
+ if (isChannelDefWithScale(channelDef)) {
30
+ return channelDef;
31
+ }
32
+
33
+ if (isValueDefWithCondition(channelDef)) {
34
+ const condition = channelDef.condition;
35
+ if (!Array.isArray(condition) && isChannelDefWithScale(condition)) {
36
+ return condition;
37
+ }
38
+ }
39
+
40
+ return undefined;
41
+ };
42
+
43
+ /**
44
+ * @param {import("./unitView.js").default} view
45
+ * @param {import("../spec/view.js").ResolutionTarget} type
46
+ * @param {import("../spec/channel.js").ChannelWithScale} targetChannel
47
+ * @returns {import("./unitView.js").default}
48
+ */
49
+ const getResolutionView = (view, type, targetChannel) => {
50
+ let resolutionView = view;
51
+ while (
52
+ (resolutionView.getConfiguredOrDefaultResolution(targetChannel, type) ==
53
+ "forced" ||
54
+ (resolutionView.dataParent &&
55
+ ["shared", "excluded", "forced"].includes(
56
+ resolutionView.dataParent.getConfiguredOrDefaultResolution(
57
+ targetChannel,
58
+ type
59
+ )
60
+ ))) &&
61
+ resolutionView.getConfiguredOrDefaultResolution(targetChannel, type) !=
62
+ "excluded"
63
+ ) {
64
+ // @ts-ignore
65
+ resolutionView = resolutionView.dataParent;
66
+ }
67
+
68
+ return resolutionView;
69
+ };
70
+
71
+ /**
72
+ * @param {import("./unitView.js").default} ownerView
73
+ * @param {import("./unitView.js").default} resolutionView
74
+ * @param {import("../spec/channel.js").ChannelWithScale} targetChannel
75
+ * @returns {import("../scales/scaleResolution.js").default}
76
+ */
77
+ const ensureScaleResolution = (ownerView, resolutionView, targetChannel) => {
78
+ if (!resolutionView.resolutions.scale[targetChannel]) {
79
+ const resolution = new ScaleResolution(targetChannel, resolutionView);
80
+ resolutionView.resolutions.scale[targetChannel] = resolution;
81
+
82
+ const updateRangeTexture = (
83
+ /** @type {import("../types/scaleResolutionApi.js").ScaleResolutionEvent} */ event
84
+ ) => {
85
+ ownerView.context.glHelper?.createRangeTexture(
86
+ event.scaleResolution,
87
+ true
88
+ );
89
+ };
90
+ resolution.addEventListener("range", updateRangeTexture);
91
+ resolution.addEventListener("domain", updateRangeTexture);
92
+ ownerView.registerDisposer(() => {
93
+ resolution.removeEventListener("range", updateRangeTexture);
94
+ resolution.removeEventListener("domain", updateRangeTexture);
95
+ });
96
+ }
97
+
98
+ return resolutionView.resolutions.scale[targetChannel];
99
+ };
100
+
101
+ /**
102
+ * @param {import("./unitView.js").default} view
103
+ * @param {import("../spec/view.js").ResolutionTarget} type
104
+ * @param {import("../spec/channel.js").Channel} channel
105
+ * @param {unknown} channelDef
106
+ * @returns {ResolutionMember | undefined}
107
+ */
108
+ const getResolutionMember = (view, type, channel, channelDef) => {
109
+ const channelDefWithScale = getChannelDefWithScale(channelDef);
110
+ if (!channelDefWithScale) {
111
+ return undefined;
112
+ }
113
+
114
+ const targetChannel = getPrimaryChannel(
115
+ channelDefWithScale.resolutionChannel ?? channel
116
+ );
117
+ if (!isChannelWithScale(targetChannel)) {
118
+ return undefined;
119
+ }
120
+
121
+ if (type == "axis" && !isPositionalChannel(targetChannel)) {
122
+ return undefined;
123
+ }
124
+
125
+ return {
126
+ view: getResolutionView(view, type, targetChannel),
127
+ channel,
128
+ channelDef: channelDefWithScale,
129
+ targetChannel,
130
+ };
131
+ };
132
+
133
+ /**
134
+ * @param {import("./unitView.js").default} view
135
+ * @param {(channel: import("../spec/channel.js").Channel, channelDef: unknown) => void} callback
136
+ */
137
+ const forEachEncodedChannel = (view, callback) => {
138
+ for (const [channel, channelDef] of Object.entries(view.mark.encoding)) {
139
+ if (!channelDef || Array.isArray(channelDef)) {
140
+ continue;
141
+ }
142
+
143
+ callback(
144
+ /** @type {import("../spec/channel.js").Channel} */ (channel),
145
+ channelDef
146
+ );
147
+ }
148
+ };
149
+
150
+ /**
151
+ * @param {import("./unitView.js").default} view
152
+ * @returns {ResolutionMember[]}
153
+ */
154
+ const collectAxisResolutionMembers = (view) => {
155
+ /** @type {ResolutionMember[]} */
156
+ const axisMembers = [];
157
+ forEachEncodedChannel(view, (channel, channelDef) => {
158
+ const member = getResolutionMember(view, "axis", channel, channelDef);
159
+ if (member && isPositionalChannel(member.channel)) {
160
+ axisMembers.push(member);
161
+ }
162
+ });
163
+
164
+ return axisMembers;
165
+ };
166
+
167
+ /**
168
+ * @param {import("./unitView.js").default} view
169
+ * @returns {ScaleResolutionMemberMap}
170
+ */
171
+ const collectScaleResolutionMembers = (view) => {
172
+ /** @type {ScaleResolutionMemberMap} */
173
+ const scaleMembersByResolution = new Map();
174
+
175
+ forEachEncodedChannel(view, (channel, channelDef) => {
176
+ const member = getResolutionMember(view, "scale", channel, channelDef);
177
+ if (!member) {
178
+ return;
179
+ }
180
+
181
+ const resolution = ensureScaleResolution(
182
+ view,
183
+ member.view,
184
+ member.targetChannel
185
+ );
186
+ const members = scaleMembersByResolution.get(resolution);
187
+ if (members) {
188
+ members.push(member);
189
+ } else {
190
+ scaleMembersByResolution.set(resolution, [member]);
191
+ }
192
+ });
193
+
194
+ return scaleMembersByResolution;
195
+ };
196
+
197
+ /**
198
+ * @param {import("./unitView.js").default} view
199
+ * @param {ResolutionMember[]} axisMembers
200
+ */
201
+ const registerAxisResolutionMembers = (view, axisMembers) => {
202
+ for (const {
203
+ view: resolutionView,
204
+ channel,
205
+ channelDef,
206
+ targetChannel,
207
+ } of axisMembers) {
208
+ if (
209
+ !isPositionalChannel(channel) ||
210
+ !isPrimaryPositionalChannel(targetChannel)
211
+ ) {
212
+ continue;
213
+ }
214
+
215
+ if (!resolutionView.resolutions.axis[targetChannel]) {
216
+ resolutionView.resolutions.axis[targetChannel] = new AxisResolution(
217
+ targetChannel
218
+ );
219
+ }
220
+ const resolution = resolutionView.resolutions.axis[targetChannel];
221
+ const unregister = resolution.registerMember({
222
+ view,
223
+ channel,
224
+ channelDef,
225
+ });
226
+ view.registerDisposer(() => {
227
+ if (
228
+ unregister() &&
229
+ resolutionView.resolutions.axis[targetChannel] === resolution
230
+ ) {
231
+ delete resolutionView.resolutions.axis[targetChannel];
232
+ }
233
+ });
234
+ }
235
+ };
236
+
237
+ /**
238
+ * @param {import("./unitView.js").default} view
239
+ * @param {ScaleResolutionMemberMap} scaleMembersByResolution
240
+ */
241
+ const registerScaleResolutionMembers = (view, scaleMembersByResolution) => {
242
+ ScaleResolution.registerInBatch(scaleMembersByResolution.keys(), () => {
243
+ for (const [resolution, members] of scaleMembersByResolution) {
244
+ for (const {
245
+ view: resolutionView,
246
+ channel,
247
+ channelDef,
248
+ targetChannel,
249
+ } of members) {
250
+ const scaleChannel =
251
+ /** @type {import("../spec/channel.js").ChannelWithScale} */ (
252
+ targetChannel
253
+ );
254
+
255
+ const contributesToDomain = !view.isDomainInert();
256
+
257
+ const unregister = resolution.registerMember({
258
+ view,
259
+ channel:
260
+ /** @type {import("../spec/channel.js").ChannelWithScale} */ (
261
+ channel
262
+ ),
263
+ channelDef,
264
+ contributesToDomain,
265
+ });
266
+ view.registerDisposer(() => {
267
+ if (
268
+ unregister() &&
269
+ resolutionView.resolutions.scale[scaleChannel] ===
270
+ resolution
271
+ ) {
272
+ resolution.dispose();
273
+ delete resolutionView.resolutions.scale[scaleChannel];
274
+ }
275
+ });
276
+ }
277
+ }
278
+ });
279
+ };
280
+
281
+ /**
282
+ * Resolves scale and axis members for a view.
283
+ *
284
+ * @param {import("./unitView.js").default} view
285
+ * @param {import("../spec/view.js").ResolutionTarget} [type]
286
+ */
287
+ export const resolveViewResolutions = (view, type) => {
288
+ if (!type) {
289
+ resolveViewResolutions(view, "scale");
290
+ resolveViewResolutions(view, "axis");
291
+ return;
292
+ }
293
+
294
+ if (type == "axis") {
295
+ registerAxisResolutionMembers(view, collectAxisResolutionMembers(view));
296
+ } else {
297
+ registerScaleResolutionMembers(
298
+ view,
299
+ collectScaleResolutionMembers(view)
300
+ );
301
+ }
302
+ };
@@ -17,23 +17,50 @@ export function createAndInitialize<V extends import("./view.js").default>(spec:
17
17
  noData: boolean;
18
18
  implicitRoot: boolean;
19
19
  }): Promise<V>;
20
+ /**
21
+ * Renders a view hierarchy into a debugging layout tree that records the
22
+ * rendered view coordinates.
23
+ *
24
+ * @param {View} view
25
+ * @param {import("./layout/rectangle.js").default} [coords]
26
+ */
27
+ export function renderToLayout(view: View, coords?: import("./layout/rectangle.js").default): {
28
+ viewName: string;
29
+ coords: string;
30
+ children: /*elided*/ any[];
31
+ addChild(viewCoords: /*elided*/ any): void;
32
+ };
33
+ /**
34
+ * Creates a wrapped view hierarchy and renders it into a debugging layout tree.
35
+ *
36
+ * @param {RootSpec} spec
37
+ * @param {import("./viewFactory.js").ViewFactoryOptions} [viewFactoryOptions]
38
+ * @param {import("./layout/rectangle.js").default} [coords]
39
+ */
40
+ export function specToLayout(spec: RootSpec, viewFactoryOptions?: import("./viewFactory.js").ViewFactoryOptions, coords?: import("./layout/rectangle.js").default): Promise<{
41
+ viewName: string;
42
+ coords: string;
43
+ children: /*elided*/ any[];
44
+ addChild(viewCoords: /*elided*/ any): void;
45
+ }>;
20
46
  export { createHeadlessEngine };
21
47
  /**
22
- * Utils for Jest tests
48
+ * Utils for tests
23
49
  * TODO: Find a better place and convention
24
50
  */
25
51
  export type RootSpec = import("../spec/root.js").RootSpec;
26
52
  /**
27
- * Utils for Jest tests
53
+ * Utils for tests
28
54
  * TODO: Find a better place and convention
29
55
  */
30
56
  export type ViewContext = import("../types/viewContext.js").default;
31
57
  /**
32
- * Utils for Jest tests
58
+ * Utils for tests
33
59
  * TODO: Find a better place and convention
34
60
  */
35
61
  export type BroadcastingViewContext = ViewContext & {
36
62
  emitBroadcast: (root: import("./view.js").default, type: import("../genomeSpy.js").BroadcastEventType, payload?: any) => void;
37
63
  };
64
+ import View from "./view.js";
38
65
  import { createHeadlessEngine } from "../genomeSpy/headlessBootstrap.js";
39
66
  //# sourceMappingURL=testUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AA4BA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAOvD;AAED;;;GAGG;AACH,uEAHW,OAAO,kBAAkB,EAAE,kBAAkB,GAC3C,uBAAuB,CAmCnC;AAGS,uBAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,uBAAuB,OAAO,kBAAkB,EAAE,kBAAkB,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAqBhL,oCAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,YAAY,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;;;;;;uBA/FpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO;;;;;sCACzC,WAAW,GAAG;IACtB,aAAa,EAAE,CACb,IAAI,EAAE,OAAO,WAAW,EAAE,OAAO,EACjC,IAAI,EAAE,OAAO,iBAAiB,EAAE,kBAAkB,EAClD,OAAO,CAAC,EAAE,GAAG,KACV,IAAI,CAAA;CACV;qCAcG,mCAAmC"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAOvD;AAED;;;GAGG;AACH,uEAHW,OAAO,kBAAkB,EAAE,kBAAkB,GAC3C,uBAAuB,CAmCnC;AAGS,uBAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,uBAAuB,OAAO,kBAAkB,EAAE,kBAAkB,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAqBhL,oCAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,YAAY,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAqBjM;;;;;;GAMG;AACH,qCAHW,IAAI,WACJ,OAAO,uBAAuB,EAAE,OAAO;;;;;EAoBjD;AAED;;;;;;GAMG;AACH,mCAJW,QAAQ,uBACR,OAAO,kBAAkB,EAAE,kBAAkB,WAC7C,OAAO,uBAAuB,EAAE,OAAO;;;;;GASjD;;;;;;uBAnKY,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO;;;;;sCACzC,WAAW,GAAG;IACtB,aAAa,EAAE,CACb,IAAI,EAAE,OAAO,WAAW,EAAE,OAAO,EACjC,IAAI,EAAE,OAAO,iBAAiB,EAAE,kBAAkB,EAClD,OAAO,CAAC,EAAE,GAAG,KACV,IAAI,CAAA;CACV;iBAca,WAAW;qCAMrB,mCAAmC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Utils for Jest tests
2
+ * Utils for tests
3
3
  * TODO: Find a better place and convention
4
4
  *
5
5
  * @typedef {import("../spec/root.js").RootSpec} RootSpec
@@ -13,7 +13,10 @@
13
13
  * }} BroadcastingViewContext
14
14
  */
15
15
 
16
- import { checkForDuplicateScaleNames } from "./viewUtils.js";
16
+ import {
17
+ calculateCanvasSize,
18
+ checkForDuplicateScaleNames,
19
+ } from "./viewUtils.js";
17
20
  import {
18
21
  initializeViewSubtree,
19
22
  loadViewSubtreeData,
@@ -21,6 +24,9 @@ import {
21
24
  import { VIEW_ROOT_NAME } from "./viewFactory.js";
22
25
  import UnitView from "./unitView.js";
23
26
  import ContainerView from "./containerView.js";
27
+ import View from "./view.js";
28
+ import Rectangle from "./layout/rectangle.js";
29
+ import DebugginViewRenderingContext from "./renderingContext/debuggingViewRenderingContext.js";
24
30
  import {
25
31
  createHeadlessEngine,
26
32
  createHeadlessViewContext,
@@ -118,4 +124,47 @@ export async function createAndInitialize(spec, viewClass) {
118
124
  return view;
119
125
  }
120
126
 
127
+ /**
128
+ * Renders a view hierarchy into a debugging layout tree that records the
129
+ * rendered view coordinates.
130
+ *
131
+ * @param {View} view
132
+ * @param {import("./layout/rectangle.js").default} [coords]
133
+ */
134
+ export function renderToLayout(view, coords) {
135
+ const renderingContext = new DebugginViewRenderingContext({});
136
+
137
+ const canvasSize = calculateCanvasSize(view);
138
+ const rect =
139
+ coords ??
140
+ Rectangle.create(
141
+ 0,
142
+ 0,
143
+ canvasSize.width ?? 1500,
144
+ canvasSize.height ?? 1000
145
+ );
146
+
147
+ view.render(renderingContext, rect, {
148
+ firstFacet: true,
149
+ });
150
+
151
+ return renderingContext.getLayout();
152
+ }
153
+
154
+ /**
155
+ * Creates a wrapped view hierarchy and renders it into a debugging layout tree.
156
+ *
157
+ * @param {RootSpec} spec
158
+ * @param {import("./viewFactory.js").ViewFactoryOptions} [viewFactoryOptions]
159
+ * @param {import("./layout/rectangle.js").default} [coords]
160
+ */
161
+ export async function specToLayout(spec, viewFactoryOptions = {}, coords) {
162
+ const view = await create(/** @type {any} */ (spec), View, {
163
+ wrapRoot: true,
164
+ ...viewFactoryOptions,
165
+ });
166
+
167
+ return renderToLayout(view, coords);
168
+ }
169
+
121
170
  export { createHeadlessEngine };
@@ -21,7 +21,7 @@ export default class UnitView<TSpec extends import("../spec/view.js").UnitSpec =
21
21
  constructor(spec: TSpec, context: import("../types/viewContext.js").default, layoutParent: import("./containerView.js").default, dataParent: import("./view.js").default, name: string, options?: import("./view.js").ViewOptions);
22
22
  /** @type {import("../marks/mark.js").default} */
23
23
  mark: import("../marks/mark.js").default;
24
- getMarkType(): "point" | "link" | "text" | "rect" | "rule" | "tick";
24
+ getMarkType(): "text" | "point" | "link" | "rect" | "rule" | "tick";
25
25
  /**
26
26
  * Pulls scales and axes up in the view hierarcy according to the resolution rules, using dataParents.
27
27
  * TODO: legends
@@ -1 +1 @@
1
- {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,wBAHU,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAgB7F;AAEF;;;GAGG;AACH,8BAHmD,KAAK,SAA3C,OAAQ,iBAAiB,EAAE,QAAS;IA2B7C;;;;;;;;OAQG;IACH,kBAPW,KAAK,WACL,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAmDzC;IA1CO,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAiLlC,oEAIC;IAoBD;;;;;OAKG;IACH,iEAoJC;IAUD;;;;;OAKG;IACH,4IAQC;IAED;;;;OAIG;IACH,sBAFa,OAAO,WAAW,EAAE,UAAU,EAAE,CAS5C;IAkBD;;OAEG;IACH,uDAEC;IAED;;OAEG;IACH,oCAsFC;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBA7mBgB,WAAW"}
1
+ {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,wBAHU,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAgB7F;AAEF;;;GAGG;AACH,8BAHmD,KAAK,SAA3C,OAAQ,iBAAiB,EAAE,QAAS;IA2B7C;;;;;;;;OAQG;IACH,kBAPW,KAAK,WACL,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAmDzC;IA1CO,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAiLlC,oEAIC;IAoBD;;;;;OAKG;IACH,iEAOC;IAUD;;;;;OAKG;IACH,4IAQC;IAED;;;;OAIG;IACH,sBAFa,OAAO,WAAW,EAAE,UAAU,EAAE,CAS5C;IAkBD;;OAEG;IACH,uDAEC;IAED;;OAEG;IACH,oCAsFC;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBAjegB,WAAW"}
@@ -4,20 +4,13 @@ import RuleMark from "../marks/rule.js";
4
4
  import LinkMark from "../marks/link.js";
5
5
  import TextMark from "../marks/text.js";
6
6
 
7
- import ScaleResolution from "../scales/scaleResolution.js";
8
7
  import {
9
8
  getEncoderAccessors,
10
9
  getEncoderDataAccessor,
11
- isPositionalChannel,
12
- isChannelDefWithScale,
13
- primaryPositionalChannels,
14
10
  getPrimaryChannel,
15
- isChannelWithScale,
16
- isPrimaryPositionalChannel,
17
- isValueDefWithCondition,
11
+ primaryPositionalChannels,
18
12
  } from "../encoder/encoder.js";
19
13
  import { isScaleAccessor } from "../encoder/accessor.js";
20
- import AxisResolution from "../scales/axisResolution.js";
21
14
  import View from "./view.js";
22
15
  import {
23
16
  asSelectionConfig,
@@ -31,6 +24,7 @@ import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
31
24
  import { createEventFilterFunction } from "../utils/expression.js";
32
25
  import { field } from "../utils/field.js";
33
26
  import { collectDomainSensitiveScaleChannels } from "../data/flowNode.js";
27
+ import { resolveViewResolutions } from "./resolutionPlanner.js";
34
28
 
35
29
  /**
36
30
  *
@@ -102,13 +96,13 @@ export default class UnitView extends View {
102
96
  throw new Error(`No such mark: ${this.getMarkType()}`);
103
97
  }
104
98
 
105
- this.resolve();
106
-
107
99
  this.#zoomLevelSetter = this.paramRuntime.allocateSetter(
108
100
  "zoomLevel",
109
101
  1.0
110
102
  );
111
103
 
104
+ this.resolve();
105
+
112
106
  for (const channel of /** @type {import("../spec/channel.js").ChannelWithScale[]} */ ([
113
107
  "x",
114
108
  "y",
@@ -310,148 +304,7 @@ export default class UnitView extends View {
310
304
  this.resolve("axis");
311
305
  return;
312
306
  }
313
-
314
- // TODO: Complain about nonsensical configuration, e.g. shared parent has independent children.
315
-
316
- const encoding = this.mark.encoding;
317
-
318
- for (const [channel, channelDef] of Object.entries(encoding)) {
319
- if (!channelDef) {
320
- continue;
321
- }
322
-
323
- if (Array.isArray(channelDef)) {
324
- continue;
325
- }
326
-
327
- /** @type {import("../spec/channel.js").ChannelDefWithScale} */
328
- let channelDefWithScale;
329
-
330
- if (isChannelDefWithScale(channelDef)) {
331
- channelDefWithScale = channelDef;
332
- } else {
333
- if (isValueDefWithCondition(channelDef)) {
334
- const condition = channelDef.condition;
335
- if (
336
- !Array.isArray(condition) &&
337
- isChannelDefWithScale(condition)
338
- ) {
339
- // There's a single condition (maybe) with a scale
340
- channelDefWithScale = condition;
341
- } else {
342
- continue;
343
- }
344
- } else {
345
- continue;
346
- }
347
- }
348
-
349
- const targetChannel = getPrimaryChannel(
350
- channelDefWithScale.resolutionChannel ?? channel
351
- );
352
-
353
- if (!isChannelWithScale(targetChannel)) {
354
- continue;
355
- }
356
-
357
- if (type == "axis" && !isPositionalChannel(targetChannel)) {
358
- continue;
359
- }
360
-
361
- let view = this;
362
- while (
363
- (view.getConfiguredOrDefaultResolution(targetChannel, type) ==
364
- "forced" ||
365
- (view.dataParent &&
366
- ["shared", "excluded", "forced"].includes(
367
- view.dataParent.getConfiguredOrDefaultResolution(
368
- targetChannel,
369
- type
370
- )
371
- ))) &&
372
- view.getConfiguredOrDefaultResolution(targetChannel, type) !=
373
- "excluded"
374
- ) {
375
- // @ts-ignore
376
- view = view.dataParent;
377
- }
378
-
379
- // Quite a bit of redundancy, but makes type checker happy.
380
- if (
381
- type == "axis" &&
382
- isPositionalChannel(channel) &&
383
- isPrimaryPositionalChannel(targetChannel)
384
- ) {
385
- if (!view.resolutions[type][targetChannel]) {
386
- view.resolutions[type][targetChannel] = new AxisResolution(
387
- targetChannel
388
- );
389
- }
390
- const resolution = view.resolutions[type][targetChannel];
391
- const unregister = resolution.registerMember({
392
- view: this,
393
- channel,
394
- channelDef: channelDefWithScale,
395
- });
396
- this.registerDisposer(() => {
397
- // Unregister returns true when it removed the last member.
398
- if (
399
- unregister() &&
400
- view.resolutions[type][targetChannel] === resolution
401
- ) {
402
- delete view.resolutions[type][targetChannel];
403
- }
404
- });
405
- } else if (type == "scale" && isChannelWithScale(channel)) {
406
- if (!view.resolutions[type][targetChannel]) {
407
- const resolution = new ScaleResolution(targetChannel);
408
- view.resolutions[type][targetChannel] = resolution;
409
-
410
- const updateRangeTexture = (
411
- /** @type {import("../types/scaleResolutionApi.js").ScaleResolutionEvent} */ event
412
- ) => {
413
- // Create if WebGLHelper is available, i.e., if not running in headless mode.
414
- // Domain changes can alter discrete texture sizes as well.
415
- this.context.glHelper?.createRangeTexture(
416
- event.scaleResolution,
417
- true
418
- );
419
- };
420
- resolution.addEventListener("range", updateRangeTexture);
421
- resolution.addEventListener("domain", updateRangeTexture);
422
- this.registerDisposer(() => {
423
- resolution.removeEventListener(
424
- "range",
425
- updateRangeTexture
426
- );
427
- resolution.removeEventListener(
428
- "domain",
429
- updateRangeTexture
430
- );
431
- });
432
- }
433
-
434
- const contributesToDomain = !this.isDomainInert();
435
-
436
- const resolution = view.resolutions[type][targetChannel];
437
- const unregister = resolution.registerMember({
438
- view: this,
439
- channel,
440
- channelDef: channelDefWithScale,
441
- contributesToDomain,
442
- });
443
- this.registerDisposer(() => {
444
- // Unregister returns true when it removed the last member.
445
- if (
446
- unregister() &&
447
- view.resolutions[type][targetChannel] === resolution
448
- ) {
449
- resolution.dispose();
450
- delete view.resolutions[type][targetChannel];
451
- }
452
- });
453
- }
454
- }
307
+ resolveViewResolutions(this, type);
455
308
  }
456
309
 
457
310
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
@@ -209,7 +209,8 @@ export default class View {
209
209
 
210
210
  /** @type {ViewParamRuntime} */
211
211
  this.paramRuntime = new ViewParamRuntime(
212
- () => this.dataParent?.paramRuntime
212
+ () => this.dataParent?.paramRuntime,
213
+ (channel) => this.getScaleResolution(channel)
213
214
  );
214
215
 
215
216
  if (spec.params) {