@genome-spy/core 0.50.0 → 0.50.2

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 (40) hide show
  1. package/dist/bundle/index.es.js +3560 -3524
  2. package/dist/bundle/index.js +86 -86
  3. package/dist/schema.json +339 -256
  4. package/dist/src/data/flowOptimizer.d.ts.map +1 -1
  5. package/dist/src/data/flowOptimizer.js +1 -2
  6. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  7. package/dist/src/data/sources/lazy/axisTickSource.js +8 -1
  8. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  9. package/dist/src/data/sources/urlSource.js +17 -13
  10. package/dist/src/genomeSpy.d.ts.map +1 -1
  11. package/dist/src/genomeSpy.js +12 -8
  12. package/dist/src/index.d.ts +1 -1
  13. package/dist/src/index.d.ts.map +1 -1
  14. package/dist/src/index.js +5 -2
  15. package/dist/src/marks/mark.d.ts +1 -0
  16. package/dist/src/marks/mark.d.ts.map +1 -1
  17. package/dist/src/marks/mark.js +7 -4
  18. package/dist/src/spec/mark.d.ts +43 -9
  19. package/dist/src/spec/view.d.ts +113 -32
  20. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  21. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  22. package/dist/src/styles/genome-spy.css.js +1 -0
  23. package/dist/src/styles/genome-spy.scss +1 -0
  24. package/dist/src/utils/url.d.ts +9 -2
  25. package/dist/src/utils/url.d.ts.map +1 -1
  26. package/dist/src/utils/url.js +29 -6
  27. package/dist/src/utils/url.test.d.ts +2 -0
  28. package/dist/src/utils/url.test.d.ts.map +1 -0
  29. package/dist/src/utils/url.test.js +28 -0
  30. package/dist/src/view/axisResolution.d.ts.map +1 -1
  31. package/dist/src/view/axisResolution.js +7 -1
  32. package/dist/src/view/layout/flexLayout.d.ts +6 -0
  33. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  34. package/dist/src/view/layout/flexLayout.js +9 -0
  35. package/dist/src/view/view.d.ts.map +1 -1
  36. package/dist/src/view/view.js +3 -3
  37. package/dist/src/view/viewUtils.d.ts +2 -6
  38. package/dist/src/view/viewUtils.d.ts.map +1 -1
  39. package/dist/src/view/viewUtils.js +41 -33
  40. package/package.json +2 -2
@@ -11,6 +11,7 @@ const css = `
11
11
  overflow: hidden;
12
12
  }
13
13
  .genome-spy canvas {
14
+ display: block;
14
15
  transform: scale(1, 1);
15
16
  opacity: 1;
16
17
  transition: transform 0.6s, opacity 0.6s;
@@ -20,6 +20,7 @@ $font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
20
20
  }
21
21
 
22
22
  canvas {
23
+ display: block;
23
24
  transform: scale(1, 1);
24
25
  opacity: 1;
25
26
  transition: transform 0.6s, opacity 0.6s;
@@ -2,8 +2,15 @@
2
2
  * Append a relative or absolute url to a base url.
3
3
  * The base part is omitted if the append part is absolute.
4
4
  *
5
- * @param {function():string} baseAccessor
5
+ * If the base part has no trailing slash, it is assumed to be a file and
6
+ * only the directory part is used.
7
+ *
8
+ * @param {string | (() => string)} base
6
9
  * @param {string} append
7
10
  */
8
- export function appendToBaseUrl(baseAccessor: () => string, append: string): string;
11
+ export function concatUrl(base: string | (() => string), append: string): string;
12
+ /**
13
+ * @param {string} url
14
+ */
15
+ export function getDirectory(url: string): string;
9
16
  //# sourceMappingURL=url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/utils/url.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,oDAHsB,MAAM,UACjB,MAAM,UAchB"}
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/utils/url.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,gCAHW,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UACvB,MAAM,UAsBhB;AAED;;GAEG;AACH,kCAFW,MAAM,UAShB"}
@@ -4,19 +4,42 @@ const protoRe = /^([A-Za-z]+:)?\/\//;
4
4
  * Append a relative or absolute url to a base url.
5
5
  * The base part is omitted if the append part is absolute.
6
6
  *
7
- * @param {function():string} baseAccessor
7
+ * If the base part has no trailing slash, it is assumed to be a file and
8
+ * only the directory part is used.
9
+ *
10
+ * @param {string | (() => string)} base
8
11
  * @param {string} append
9
12
  */
10
- export function appendToBaseUrl(baseAccessor, append) {
13
+ export function concatUrl(base, append) {
11
14
  if (append && protoRe.test(append)) {
12
15
  return append;
13
16
  }
14
17
 
15
- const base = baseAccessor();
18
+ const baseString = typeof base == "function" ? base() : base;
19
+ if (!baseString) {
20
+ return append;
21
+ }
22
+ if (!append) {
23
+ return baseString;
24
+ }
16
25
 
17
- if (base && append) {
18
- return base.endsWith("/") ? base + append : base + "/" + append;
26
+ if (/[#?]/.test(baseString)) {
27
+ throw new Error(
28
+ `Cannot append to a url with query or hash. Append: ${append}, base: ${baseString}`
29
+ );
19
30
  }
20
31
 
21
- return base ?? append;
32
+ return getDirectory(baseString) + append;
33
+ }
34
+
35
+ /**
36
+ * @param {string} url
37
+ */
38
+ export function getDirectory(url) {
39
+ const directory = url.replace(/[^/]*$/, "");
40
+ return directory === ""
41
+ ? undefined
42
+ : directory.endsWith("://")
43
+ ? url + "/"
44
+ : directory;
22
45
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=url.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.test.d.ts","sourceRoot":"","sources":["../../../src/utils/url.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { expect, test } from "vitest";
2
+ import { concatUrl, getDirectory } from "./url.js";
3
+
4
+ test("getDirectory", () => {
5
+ expect(getDirectory("foo")).toBeUndefined();
6
+ expect(getDirectory("foo/")).toBe("foo/");
7
+ expect(getDirectory("foo/index")).toBe("foo/");
8
+ expect(getDirectory("http://example.com")).toBe("http://example.com/");
9
+ expect(getDirectory("http://example.com/")).toBe("http://example.com/");
10
+ expect(getDirectory("http://example.com/a")).toBe("http://example.com/");
11
+ expect(getDirectory("http://example.com/a/")).toBe("http://example.com/a/");
12
+ });
13
+
14
+ test("concatUrl", () => {
15
+ expect(concatUrl("http://example.com", "foo")).toEqual(
16
+ "http://example.com/foo"
17
+ );
18
+ expect(concatUrl(() => "http://example.com", "foo")).toEqual(
19
+ "http://example.com/foo"
20
+ );
21
+ expect(concatUrl("http://example.com/", "http://genomespy.app/")).toEqual(
22
+ "http://genomespy.app/"
23
+ );
24
+ expect(concatUrl("foo/", "bar")).toEqual("foo/bar");
25
+ expect(concatUrl("foo/baz", "bar")).toEqual("foo/bar");
26
+ expect(concatUrl(undefined, "bar")).toEqual("bar");
27
+ expect(concatUrl("bar", undefined)).toEqual("bar");
28
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"axisResolution.d.ts","sourceRoot":"","sources":["../../../src/view/axisResolution.js"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH;IACI;;;OAGG;IAEH;;OAEG;IACH,qBAFW,OAAO,oBAAoB,EAAE,wBAAwB,EAM/D;IAHG,+DAAsB;IACtB,wDAAwD;IACxD,SADW,oBAAoB,EAAE,CAChB;IAGrB,8DAEC;IAED;;;;;OAKG;IACH,qBAFW,oBAAoB,QAkB9B;IAED,qDAuBC;IAED,mBAyDC;CACJ;;UAlIS,OAAO,eAAe,EAAE,OAAO;aAC/B,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB"}
1
+ {"version":3,"file":"axisResolution.d.ts","sourceRoot":"","sources":["../../../src/view/axisResolution.js"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH;IACI;;;OAGG;IAEH;;OAEG;IACH,qBAFW,OAAO,oBAAoB,EAAE,wBAAwB,EAM/D;IAHG,+DAAsB;IACtB,wDAAwD;IACxD,SADW,oBAAoB,EAAE,CAChB;IAGrB,8DAEC;IAED;;;;;OAKG;IACH,qBAFW,oBAAoB,QAwB9B;IAED,qDAuBC;IAED,mBAyDC;CACJ;;UAxIS,OAAO,eAAe,EAAE,OAAO;aAC/B,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB"}
@@ -58,7 +58,13 @@ export default class AxisResolution {
58
58
  this.scaleResolution &&
59
59
  newScaleResolution !== this.scaleResolution
60
60
  ) {
61
- throw new Error("Shared axes must have a shared scale!");
61
+ throw new Error(
62
+ `Shared axes must have a shared scale! Channel: ${
63
+ this.channel
64
+ }, existing views: [${this.members
65
+ .map((m) => m.view.getPathString())
66
+ .join(", ")}], new view: ${view.getPathString()}.`
67
+ );
62
68
  }
63
69
 
64
70
  this.members.push(newMember);
@@ -123,6 +123,12 @@ export class FlexDimensions {
123
123
  * @param {import("./padding.js").default} padding
124
124
  */
125
125
  subtractPadding(padding: import("./padding.js").default): FlexDimensions;
126
+ /**
127
+ * Returns true if either of the dimensions is growing
128
+ *
129
+ * @returns {boolean}
130
+ */
131
+ isGrowing(): boolean;
126
132
  #private;
127
133
  }
128
134
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"flexLayout.d.ts","sourceRoot":"","sources":["../../../../src/view/layout/flexLayout.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wCALW,OAAO,EAAE,iBACT,MAAM,mDACN,WAAW,GACT,OAAO,EAAE,CAqGrB;AAED;;;;;GAKG;AACH,sCAHW,SAAS,OAAO,CAAC,gBACjB,WAAW,UAQrB;AAED;;;GAGG;AACH,sCAHW,SAAS,OAAO,CAAC,GACf,OAAO,CAWnB;AAED;;;GAGG;AACH,oCAFW,OAAO,EAAE,WAInB;AAED;;;GAGG;AACH,sCAFW,OAAO,EAAE;;;EASnB;AAmED;;;;GAIG;AACH,uCAFW,OAAO,WAIjB;AAWD;;;;GAIG;AACH,sDAEC;AAED;;;;GAIG;AACH,mCAHW,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,oBAAoB,EAAE,IAAI,GAChE,OAAO,CAiBnB;AAID;;;;;;;GAOG;AACH,0CALW,OAAO,MACP,OAAO,eACI,MAAM,GACf,OAAO,CA4BnB;AAED;;;;;;GAMG;AACH,0CAJW,OAAO,UACP,MAAM,UAAc,MAAM,CAAA,GACxB,OAAO,CAanB;AAED;;;;;;GAMG;AACH,sCAJW,OAAO,UACP,MAAM,UAAc,MAAM,CAAA,GACxB,OAAO,CAanB;AAED;;;GAGG;AACH,yCAHW,OAAO,SACP,MAAM,WAIhB;AAtMD;IACI;;;;OAIG;IACH,mBAHW,OAAO,UACP,OAAO,EAQjB;IAJG,gBAAgB;IAChB,wBAAkB;IAClB,gBAAgB;IAChB,yBAAoB;IAGxB;;;;OAIG;IACH,oBAFW,OAAO,cAAc,EAAE,OAAO,kBAIxC;IAED;;;;OAIG;IACH,yBAFW,OAAO,cAAc,EAAE,OAAO,kBAIxC;;CAkBJ;AAED;;;;GAIG;AACH,2BAFU,OAAO,CAKd;AAEH,iDAGE;;;;;;;;SAzOQ,MAAM;;;;WACN,MAAM;;;;;;cAGN,MAAM;UACN,MAAM;;;;;;;;;;;;;;cAGN,MAAM;;;;;uBACN,MAAM;;;;aAEN,MAAM;;;;cACN,OAAO"}
1
+ {"version":3,"file":"flexLayout.d.ts","sourceRoot":"","sources":["../../../../src/view/layout/flexLayout.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wCALW,OAAO,EAAE,iBACT,MAAM,mDACN,WAAW,GACT,OAAO,EAAE,CAqGrB;AAED;;;;;GAKG;AACH,sCAHW,SAAS,OAAO,CAAC,gBACjB,WAAW,UAQrB;AAED;;;GAGG;AACH,sCAHW,SAAS,OAAO,CAAC,GACf,OAAO,CAWnB;AAED;;;GAGG;AACH,oCAFW,OAAO,EAAE,WAInB;AAED;;;GAGG;AACH,sCAFW,OAAO,EAAE;;;EASnB;AA4ED;;;;GAIG;AACH,uCAFW,OAAO,WAIjB;AAWD;;;;GAIG;AACH,sDAEC;AAED;;;;GAIG;AACH,mCAHW,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,oBAAoB,EAAE,IAAI,GAChE,OAAO,CAiBnB;AAID;;;;;;;GAOG;AACH,0CALW,OAAO,MACP,OAAO,eACI,MAAM,GACf,OAAO,CA4BnB;AAED;;;;;;GAMG;AACH,0CAJW,OAAO,UACP,MAAM,UAAc,MAAM,CAAA,GACxB,OAAO,CAanB;AAED;;;;;;GAMG;AACH,sCAJW,OAAO,UACP,MAAM,UAAc,MAAM,CAAA,GACxB,OAAO,CAanB;AAED;;;GAGG;AACH,yCAHW,OAAO,SACP,MAAM,WAIhB;AA/MD;IACI;;;;OAIG;IACH,mBAHW,OAAO,UACP,OAAO,EAQjB;IAJG,gBAAgB;IAChB,wBAAkB;IAClB,gBAAgB;IAChB,yBAAoB;IAGxB;;;;OAIG;IACH,oBAFW,OAAO,cAAc,EAAE,OAAO,kBAIxC;IAED;;;;OAIG;IACH,yBAFW,OAAO,cAAc,EAAE,OAAO,kBAIxC;IAmBD;;;;OAIG;IACH,aAFa,OAAO,CAInB;;CACJ;AAED;;;;GAIG;AACH,2BAFU,OAAO,CAKd;AAEH,iDAGE;;;;;;;;SAlPQ,MAAM;;;;WACN,MAAM;;;;;;cAGN,MAAM;UACN,MAAM;;;;;;;;;;;;;;cAGN,MAAM;;;;;uBACN,MAAM;;;;aAEN,MAAM;;;;cACN,OAAO"}
@@ -228,6 +228,15 @@ export class FlexDimensions {
228
228
  }
229
229
  );
230
230
  }
231
+
232
+ /**
233
+ * Returns true if either of the dimensions is growing
234
+ *
235
+ * @returns {boolean}
236
+ */
237
+ isGrowing() {
238
+ return !!(this.width.grow || this.height.grow);
239
+ }
231
240
  }
232
241
 
233
242
  /**
@@ -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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"}
@@ -12,7 +12,7 @@ import {
12
12
  import { isNumber, isString, span } from "vega-util";
13
13
  import { scaleLog } from "d3-scale";
14
14
  import { isFieldDef, getPrimaryChannel } from "../encoder/encoder.js";
15
- import { appendToBaseUrl } from "../utils/url.js";
15
+ import { concatUrl } from "../utils/url.js";
16
16
  import { isDiscrete, bandSpace } from "vega-scale";
17
17
  import { peek } from "../utils/arrayUtils.js";
18
18
  import ViewError from "./viewError.js";
@@ -645,7 +645,7 @@ export default class View {
645
645
  * @returns {string}
646
646
  */
647
647
  getBaseUrl() {
648
- return appendToBaseUrl(
648
+ return concatUrl(
649
649
  () => this.dataParent?.getBaseUrl(),
650
650
  this.spec.baseUrl
651
651
  );
@@ -732,7 +732,7 @@ function isDynamicOpacity(opacity) {
732
732
  * @returns {function(number):number}
733
733
  */
734
734
  function createViewOpacityFunction(view) {
735
- const opacityDef = view.spec.opacity;
735
+ const opacityDef = "opacity" in view.spec ? view.spec.opacity : undefined;
736
736
 
737
737
  if (opacityDef !== undefined) {
738
738
  if (isNumber(opacityDef)) {
@@ -75,13 +75,9 @@ export function findDescendantsByPath(root: View, name: string): View[];
75
75
  */
76
76
  export function findUniqueViewNames(root: View): Set<string>;
77
77
  /**
78
- * @param {View} viewRoot
78
+ * @param {import("./view.js").default} viewRoot
79
79
  */
80
- export function calculateViewRootSize(viewRoot: View): import("./layout/flexLayout.js").FlexDimensions;
81
- /**
82
- * @param {import("./layout/flexLayout.js").FlexDimensions} viewRootSize
83
- */
84
- export function calculateCanvasSize(viewRootSize: import("./layout/flexLayout.js").FlexDimensions): {
80
+ export function calculateCanvasSize(viewRoot: import("./view.js").default): {
85
81
  width: number;
86
82
  height: number;
87
83
  };
@@ -1 +1 @@
1
- {"version":3,"file":"viewUtils.d.ts","sourceRoot":"","sources":["../../../src/view/viewUtils.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,qCAHW,OAAO,oBAAoB,EAAE,UAAU,GAAG,OAAO,iBAAiB,EAAE,YAAY,yBAK1F;AAED;;;;GAIG;AACH,oCAHW,OAAO,oBAAoB,EAAE,aAAa,GAAG,OAAO,iBAAiB,EAAE,YAAY,wBAQ7F;AAED;;;GAGG;AACH,+BAFW,IAAI,6EAMd;AAED;;;;GAIG;AACH,wCAFW,IAAI,UASd;AAED;;GAEG;AACH,kDAFW,IAAI,QAiBd;AAED;;;;;;;GAOG;AACH,4CAFW,IAAI,QAUd;AAED;;;;GAIG;AACH,qCAJW,IAAI,iBACJ,OAAO,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,wDAcrD;AAED;;;GAGG;AACH,wCAFW,IAAI;UAGO,QAAQ;aAAW,OAAO,oBAAoB,EAAE,OAAO;WAAS,OAAO,oBAAoB,EAAE,KAAK;UAAQ,OAAO,oBAAoB,EAAE,IAAI;IAqBhK;AAED;;;;;GAKG;AACH,2CALW,OAAO,iBAAiB,EAAE,UAAU,WACpC,MAAM,eACN,OAAO,yBAAyB,EAAE,OAAO,GACvC,QAAQ,OAAO,iBAAiB,EAAE,QAAQ,CAAC,CA6BvD;AAED;;GAEG;AACH,gDAFoB,IAAI,QAAE,IAAI,EAAE,KAAE,IAAI,+BAkBrC;AAED;;;;;;GAMG;AACH,4CAJW,IAAI,QACJ,MAAM,GACJ,IAAI,EAAE,CAalB;AAED;;;GAGG;AACH,0CAFW,IAAI,eAqBd;AAOD;;GAEG;AACH,gDAFW,IAAI,mDAId;AAED;;GAEG;AACH,kDAFW,OAAO,wBAAwB,EAAE,cAAc;;;EAczD;AAxBM,uCAFI,MAAM,WAE0D;iBA/O9B,WAAW;qBAFnC,eAAe"}
1
+ {"version":3,"file":"viewUtils.d.ts","sourceRoot":"","sources":["../../../src/view/viewUtils.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,qCAHW,OAAO,oBAAoB,EAAE,UAAU,GAAG,OAAO,iBAAiB,EAAE,YAAY,yBAK1F;AAED;;;;GAIG;AACH,oCAHW,OAAO,oBAAoB,EAAE,aAAa,GAAG,OAAO,iBAAiB,EAAE,YAAY,wBAQ7F;AAED;;;GAGG;AACH,+BAFW,IAAI,6EAMd;AAED;;;;GAIG;AACH,wCAFW,IAAI,UASd;AAED;;GAEG;AACH,kDAFW,IAAI,QAiBd;AAED;;;;;;;GAOG;AACH,4CAFW,IAAI,QAUd;AAED;;;;GAIG;AACH,qCAJW,IAAI,iBACJ,OAAO,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,wDAcrD;AAED;;;GAGG;AACH,wCAFW,IAAI;UAGO,QAAQ;aAAW,OAAO,oBAAoB,EAAE,OAAO;WAAS,OAAO,oBAAoB,EAAE,KAAK;UAAQ,OAAO,oBAAoB,EAAE,IAAI;IAqBhK;AAED;;;;;GAKG;AACH,2CALW,OAAO,iBAAiB,EAAE,UAAU,WACpC,MAAM,eACN,OAAO,yBAAyB,EAAE,OAAO,GACvC,QAAQ,OAAO,iBAAiB,EAAE,QAAQ,CAAC,CAsCvD;AAED;;GAEG;AACH,gDAFoB,IAAI,QAAE,IAAI,EAAE,KAAE,IAAI,+BAkBrC;AAED;;;;;;GAMG;AACH,4CAJW,IAAI,QACJ,MAAM,GACJ,IAAI,EAAE,CAalB;AAED;;;GAGG;AACH,0CAFW,IAAI,eAqBd;AAOD;;GAEG;AACH,8CAFW,OAAO,WAAW,EAAE,OAAO;;;EAoBrC;AAvBM,uCAFI,MAAM,WAE0D;iBAzP9B,WAAW;qBAFnC,eAAe"}
@@ -1,5 +1,4 @@
1
1
  import { isObject, isString } from "vega-util";
2
- import { loader as vegaLoader } from "vega-loader";
3
2
 
4
3
  import UnitView from "./unitView.js";
5
4
  // eslint-disable-next-line no-unused-vars
@@ -8,6 +7,7 @@ import { buildDataFlow } from "./flowBuilder.js";
8
7
  import { optimizeDataFlow } from "../data/flowOptimizer.js";
9
8
  import { isFieldDef, primaryPositionalChannels } from "../encoder/encoder.js";
10
9
  import { rollup } from "d3-array";
10
+ import { concatUrl, getDirectory } from "../utils/url.js";
11
11
 
12
12
  /**
13
13
  *
@@ -146,30 +146,39 @@ export function findEncodedFields(view) {
146
146
  */
147
147
  export async function loadExternalViewSpec(spec, baseUrl, viewContext) {
148
148
  const importParam = spec.import;
149
- if ("url" in importParam) {
150
- const loader = vegaLoader({ baseURL: baseUrl });
151
- const url = importParam.url;
149
+ if (!("url" in importParam)) {
150
+ throw new Error("Not an url import: " + JSON.stringify(importParam));
151
+ }
152
152
 
153
- const importedSpec = JSON.parse(
154
- await loader.load(url).catch((/** @type {Error} */ e) => {
155
- throw new Error(
156
- `Could not load imported view spec: ${url} \nReason: ${e.message}`
157
- );
158
- })
159
- );
153
+ const url = concatUrl(baseUrl, importParam.url);
154
+
155
+ /** @type {import("../spec/view.js").ViewSpec} */
156
+ let importedSpec;
160
157
 
161
- if (viewContext.isViewSpec(importedSpec)) {
162
- importedSpec.baseUrl = url.match(/^[^?#]*\//)?.[0];
163
- return importedSpec;
164
- } else {
165
- throw new Error(
166
- `The imported spec "${url}" is not a view spec: ${JSON.stringify(
167
- spec
168
- )}`
169
- );
158
+ try {
159
+ const result = await fetch(url);
160
+ if (!result.ok) {
161
+ throw new Error(`${result.status} ${result.statusText}`);
170
162
  }
163
+ importedSpec = await result.json();
164
+ } catch (e) {
165
+ throw new Error(
166
+ `Could not load imported view spec: ${url}. Reason: ${e.message}`
167
+ );
168
+ }
169
+
170
+ if (viewContext.isViewSpec(importedSpec)) {
171
+ importedSpec.baseUrl = concatUrl(
172
+ getDirectory(importParam.url),
173
+ importedSpec.baseUrl
174
+ );
175
+ return importedSpec;
171
176
  } else {
172
- throw new Error("Not an url import: " + JSON.stringify(importParam));
177
+ throw new Error(
178
+ `The imported spec "${url}" is not a view spec: ${JSON.stringify(
179
+ spec
180
+ )}`
181
+ );
173
182
  }
174
183
  }
175
184
 
@@ -245,25 +254,24 @@ export function findUniqueViewNames(root) {
245
254
  export const isCustomViewName = (name) => !/^(layer|concat)\d+$/.test(name);
246
255
 
247
256
  /**
248
- * @param {View} viewRoot
257
+ * @param {import("./view.js").default} viewRoot
249
258
  */
250
- export function calculateViewRootSize(viewRoot) {
251
- return viewRoot.getSize().addPadding(viewRoot.getOverhang());
252
- }
259
+ export function calculateCanvasSize(viewRoot) {
260
+ const size = viewRoot.getSize();
261
+ const padding = viewRoot.getPadding();
253
262
 
254
- /**
255
- * @param {import("./layout/flexLayout.js").FlexDimensions} viewRootSize
256
- */
257
- export function calculateCanvasSize(viewRootSize) {
258
263
  // If a dimension has an absolutely specified size (in pixels), use it for the canvas size.
259
264
  // However, if the dimension has a growing component, the canvas should be fit to the
260
265
  // container.
261
266
  // TODO: Enforce the minimum size (in case of both absolute and growing components).
262
267
 
263
- /** @param {import("./layout/flexLayout.js").SizeDef} dim */
264
- const f = (dim) => (dim.grow > 0 ? undefined : dim.px);
268
+ /**
269
+ * @param {import("./layout/flexLayout.js").SizeDef} dim
270
+ * @param {number} totalPad
271
+ */
272
+ const f = (dim, totalPad) => (dim.grow > 0 ? undefined : dim.px + totalPad);
265
273
  return {
266
- width: f(viewRootSize.width),
267
- height: f(viewRootSize.height),
274
+ width: f(size.width, padding.horizontalTotal),
275
+ height: f(size.height, padding.verticalTotal),
268
276
  };
269
277
  }
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.50.0",
10
+ "version": "0.50.2",
11
11
  "jsdelivr": "dist/bundle/index.js",
12
12
  "unpkg": "dist/bundle/index.js",
13
13
  "browser": "dist/bundle/index.js",
@@ -67,5 +67,5 @@
67
67
  "devDependencies": {
68
68
  "@types/long": "^4.0.1"
69
69
  },
70
- "gitHead": "39de1ffdcfdaefe9f34a4d6e092378ccffd267c9"
70
+ "gitHead": "4d37043854a961111612b046d8e49e285db81ee0"
71
71
  }