Line data Source code
1 : /// The modules that render Vega-Lite charts, loaded on first use to keep them out of the startup bundle.
2 : export interface VegaModules {
3 : /// Embed a Vega-Lite spec into an element
4 : embed: typeof import('vega-embed').default;
5 : /// The Vega runtime, e.g. to build changesets
6 : vega: typeof import('vega-embed').vega;
7 : /// The Vega-Lite compiler, e.g. to check specs
8 : vegaLite: typeof import('vega-embed').vegaLite;
9 : /// The expression interpreter, it avoids the `Function()` eval of Vega that CSP forbids
10 : expressionInterpreter: typeof import('vega-interpreter').expressionInterpreter;
11 : }
12 :
13 1 : let loading: Promise<VegaModules> | null = null;
14 :
15 : /// Load the Vega modules once
16 1 : export function loadVega(): Promise<VegaModules> {
17 1 : loading ??= Promise.all([import('vega-embed'), import('vega-interpreter')])
18 1 : .then(([embed, interpreter]) => ({
19 1 : embed: embed.default,
20 1 : vega: embed.vega,
21 1 : vegaLite: embed.vegaLite,
22 1 : expressionInterpreter: interpreter.expressionInterpreter,
23 1 : }))
24 1 : .catch(error => {
25 0 : loading = null;
26 0 : throw error;
27 1 : });
28 1 : return loading;
29 1 : }
|