@genome-spy/core 0.50.1 → 0.51.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.
@@ -1 +1 @@
1
- {"version":3,"file":"flowOptimizer.d.ts","sourceRoot":"","sources":["../../../src/data/flowOptimizer.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,eAAe,EAAE,OAAO,WAC/B,OAAO,eAAe,EAAE,OAAO,WAczC;AAED;;;;GAIG;AACH,qDAFW,OAAO,eAAe,EAAE,OAAO,iCAgCzC;AAED,kDAEC;AAED,mDAEC;AAmBD;;GAEG;AACH,sDAFW,OAAO,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,QAwB9C;AAED;;;GAGG;AACH,wCAFW,OAAO,eAAe,EAAE,OAAO,QASzC;AAED;;GAEG;AACH,2CAFW,OAAO,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,QAQ9C"}
1
+ {"version":3,"file":"flowOptimizer.d.ts","sourceRoot":"","sources":["../../../src/data/flowOptimizer.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,eAAe,EAAE,OAAO,WAC/B,OAAO,eAAe,EAAE,OAAO,WAczC;AAED;;;;GAIG;AACH,qDAFW,OAAO,eAAe,EAAE,OAAO,iCAgCzC;AAED,kDAEC;AAED,mDAEC;AAmBD;;GAEG;AACH,sDAFW,OAAO,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,QAwB9C;AAED;;;GAGG;AACH,wCAFW,OAAO,eAAe,EAAE,OAAO,QASzC;AAED;;GAEG;AACH,2CAFW,OAAO,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,QAO9C"}
@@ -125,9 +125,8 @@ export function optimizeFlowGraph(root) {
125
125
  * @param {import("./dataFlow.js").default<any>} dataFlow
126
126
  */
127
127
  export function optimizeDataFlow(dataFlow) {
128
+ combineIdenticalDataSources(dataFlow);
128
129
  for (const dataSource of dataFlow.dataSources) {
129
130
  optimizeFlowGraph(dataSource);
130
131
  }
131
-
132
- combineIdenticalDataSources(dataFlow);
133
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"axisTickSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/axisTickSource.js"],"names":[],"mappings":"AAYA;;GAEG;AACH;IAMI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,aAAa,QAC7C,OAAO,uBAAuB,EAAE,OAAO,EAYjD;IAnBD;;OAEG;IACH,OAFU,OAAO,0BAA0B,EAAE,MAAM,EAAE,CAE1C;IAeP,sDAAoB;IAGxB,wBAkCC;CACJ;iCA9DgC,2BAA2B"}
1
+ {"version":3,"file":"axisTickSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/axisTickSource.js"],"names":[],"mappings":"AAYA;;GAEG;AACH;IAMI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,aAAa,QAC7C,OAAO,uBAAuB,EAAE,OAAO,EAYjD;IAnBD;;OAEG;IACH,OAFU,OAAO,0BAA0B,EAAE,MAAM,EAAE,CAE1C;IAeP,sDAAoB;IAUxB,wBAkCC;CACJ;iCArEgC,2BAA2B"}
@@ -35,6 +35,13 @@ export default class AxisTickSource extends SingleAxisLazySource {
35
35
  this.params = params;
36
36
  }
37
37
 
38
+ async load() {
39
+ // Force the ticks to be recalculated. This is needed because the async
40
+ // initialization process and non-deterministic order of events.
41
+ this.ticks = null;
42
+ this.onDomainChanged();
43
+ }
44
+
38
45
  onDomainChanged() {
39
46
  // Note, although this function is async, it is not awaited. Data are updated
40
47
  // synchronously to ensure that the new ticks are available before the next frame is drawn.
@@ -61,7 +68,7 @@ export default class AxisTickSource extends SingleAxisLazySource {
61
68
  ? validTicks(scale, axisParams.values, count)
62
69
  : tickValues(scale, count);
63
70
 
64
- if (!shallowArrayEquals(ticks, this.ticks)) {
71
+ if (this.ticks == null || !shallowArrayEquals(ticks, this.ticks)) {
65
72
  this.ticks = ticks;
66
73
 
67
74
  const format = tickFormat(scale, requestedCount, axisParams.format);
@@ -1 +1 @@
1
- {"version":3,"file":"urlSource.d.ts","sourceRoot":"","sources":["../../../../src/data/sources/urlSource.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH,gCAHW,QAAQ,OAAO,oBAAoB,EAAE,IAAI,CAAC,gDAKpD;AAED;IACI;;;OAGG;IACH,oBAHW,OAAO,oBAAoB,EAAE,OAAO,QACpC,OAAO,oBAAoB,EAAE,OAAO,EAU9C;IALG,6CAEC;IAED,gBAAiC;CA8DxC;uBAxFsB,iBAAiB"}
1
+ {"version":3,"file":"urlSource.d.ts","sourceRoot":"","sources":["../../../../src/data/sources/urlSource.js"],"names":[],"mappings":"AASA;;;GAGG;AACH,gCAHW,QAAQ,OAAO,oBAAoB,EAAE,IAAI,CAAC,gDAKpD;AAED;IACI;;;OAGG;IACH,oBAHW,OAAO,oBAAoB,EAAE,OAAO,QACpC,OAAO,oBAAoB,EAAE,OAAO,EAU9C;IALG,6CAEC;IAED,gBAAiC;CAiExC;uBA5FsB,iBAAiB"}
@@ -1,10 +1,11 @@
1
- import { loader as vegaLoader, read } from "vega-loader";
1
+ import { read } from "vega-loader";
2
2
  import { getFormat } from "./dataUtils.js";
3
3
  import DataSource from "./dataSource.js";
4
4
  import {
5
5
  activateExprRefProps,
6
6
  withoutExprRef,
7
7
  } from "../../view/paramMediator.js";
8
+ import { concatUrl } from "../../utils/url.js";
8
9
 
9
10
  /**
10
11
  * @param {Partial<import("../../spec/data.js").Data>} data
@@ -46,18 +47,21 @@ export default class UrlSource extends DataSource {
46
47
  }
47
48
 
48
49
  /** @param {string} url */
49
- const load = async (url) =>
50
- // TODO: Support chunked loading
51
- /** @type {string} */ (
52
- vegaLoader({
53
- baseURL: this.baseUrl,
54
- })
55
- .load(url)
56
- .catch((/** @type {Error} */ e) => {
57
- // TODO: Include baseurl in the error message. Should be normalized, however.
58
- throw new Error(`${url}: ${e.message}`);
59
- })
60
- );
50
+ const load = async (url) => {
51
+ try {
52
+ const fullUrl = concatUrl(this.baseUrl, url);
53
+ const result = await fetch(fullUrl);
54
+ if (!result.ok) {
55
+ throw new Error(`${result.status} ${result.statusText}`);
56
+ }
57
+ // TODO: what about binary data (for arrow), etc?
58
+ return result.text();
59
+ } catch (e) {
60
+ throw new Error(
61
+ `Could not load data: ${url}. Reason: ${e.message}`
62
+ );
63
+ }
64
+ };
61
65
 
62
66
  /**
63
67
  * @param {string} text
@@ -366,7 +366,7 @@ export default class GenomeSpy {
366
366
  canvasWrapper,
367
367
  () =>
368
368
  this.viewRoot
369
- ? calculateCanvasSize(this.viewRoot.getSize())
369
+ ? calculateCanvasSize(this.viewRoot)
370
370
  : { width: undefined, height: undefined },
371
371
  this.spec.background,
372
372
  { powerPreference: this.options.powerPreference ?? "default" }
@@ -1,5 +1,5 @@
1
1
  /// <reference types="external-typings/filetypes.js" />
2
- export function embed(el: string | HTMLElement, spec: string | import("./spec/root.js").RootSpec, options?: import("./types/embedApi.js").EmbedOptions): import("./types/embedApi.js").EmbedResult;
2
+ export function embed(el: string | HTMLElement, spec: string | import("./spec/root.js").RootSpec, options?: import("./types/embedApi.js").EmbedOptions): import("./types/embedApi.js").EmbedResult; /** @type {HTMLElement} */
3
3
  /**
4
4
  * Loads the spec from the given url and sets the baseUrl if it is not
5
5
  * defined in the spec.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.js"],"names":[],"mappings":";AAawB,mMAGnB;AAyFL;;;;;GAKG;AACH,8BAFW,MAAM,gBAmBhB;sBA5HqB,gBAAgB;qBAFjB,KAAK;iBAGT,kBAAkB;oBACf,6BAA6B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.js"],"names":[],"mappings":";AAaqB,mMAGlB,CAAC,0BAA0B;AAwF9B;;;;;GAKG;AACH,8BAFW,MAAM,gBAuBhB;sBAhIqB,gBAAgB;qBAFjB,KAAK;iBAGT,kBAAkB;oBACf,6BAA6B"}
package/dist/src/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import { isObject, isString } from "vega-util";
2
- import { loader as vegaLoader } from "vega-loader";
3
2
  import { html } from "lit";
4
3
 
5
4
  import GenomeSpy from "./genomeSpy.js";
@@ -113,7 +112,11 @@ export async function loadSpec(url) {
113
112
  let spec;
114
113
 
115
114
  try {
116
- spec = JSON.parse(await vegaLoader().load(url));
115
+ const response = await fetch(url);
116
+ if (!response.ok) {
117
+ throw new Error(`${response.status} ${response.statusText}`);
118
+ }
119
+ spec = await response.json();
117
120
  } catch (e) {
118
121
  throw new Error(
119
122
  `Could not load or parse configuration: ${url}, reason: ${e.message}`
@@ -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);
@@ -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
  );
@@ -75,13 +75,12 @@ export function findDescendantsByPath(root: View, name: string): View[];
75
75
  */
76
76
  export function findUniqueViewNames(root: View): Set<string>;
77
77
  /**
78
- * @param {import("./layout/flexLayout.js").FlexDimensions} viewRootSize
78
+ * @param {import("./view.js").default} viewRoot
79
79
  */
80
- export function calculateCanvasSize(viewRootSize: import("./layout/flexLayout.js").FlexDimensions): {
80
+ export function calculateCanvasSize(viewRoot: import("./view.js").default): {
81
81
  width: number;
82
82
  height: number;
83
83
  };
84
- export function isCustomViewName(name: string): boolean;
85
84
  import View from "./view.js";
86
85
  import UnitView from "./unitView.js";
87
86
  //# sourceMappingURL=viewUtils.d.ts.map
@@ -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,kDAFW,OAAO,wBAAwB,EAAE,cAAc;;;EAczD;AAjBM,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;AAED;;GAEG;AACH,8CAFW,OAAO,WAAW,EAAE,OAAO;;;EAoBrC;iBA3Q4C,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
 
@@ -240,23 +249,24 @@ export function findUniqueViewNames(root) {
240
249
  }
241
250
 
242
251
  /**
243
- * @param {string} name
252
+ * @param {import("./view.js").default} viewRoot
244
253
  */
245
- export const isCustomViewName = (name) => !/^(layer|concat)\d+$/.test(name);
254
+ export function calculateCanvasSize(viewRoot) {
255
+ const size = viewRoot.getSize();
256
+ const padding = viewRoot.getPadding();
246
257
 
247
- /**
248
- * @param {import("./layout/flexLayout.js").FlexDimensions} viewRootSize
249
- */
250
- export function calculateCanvasSize(viewRootSize) {
251
258
  // If a dimension has an absolutely specified size (in pixels), use it for the canvas size.
252
259
  // However, if the dimension has a growing component, the canvas should be fit to the
253
260
  // container.
254
261
  // TODO: Enforce the minimum size (in case of both absolute and growing components).
255
262
 
256
- /** @param {import("./layout/flexLayout.js").SizeDef} dim */
257
- const f = (dim) => (dim.grow > 0 ? undefined : dim.px);
263
+ /**
264
+ * @param {import("./layout/flexLayout.js").SizeDef} dim
265
+ * @param {number} totalPad
266
+ */
267
+ const f = (dim, totalPad) => (dim.grow > 0 ? undefined : dim.px + totalPad);
258
268
  return {
259
- width: f(viewRootSize.width),
260
- height: f(viewRootSize.height),
269
+ width: f(size.width, padding.horizontalTotal),
270
+ height: f(size.height, padding.verticalTotal),
261
271
  };
262
272
  }
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.50.1",
10
+ "version": "0.51.0",
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": "f21b0f12e961366c12c1d514017c6270246801cc"
70
+ "gitHead": "c2522b73298c0cc4cf38cca795b35e97c5c292d4"
71
71
  }