Skip to content

Commit cbd54ba

Browse files
authored
feat: add vega interpreter as dependency and support custom interpreter (#747)
1 parent 8d15fe1 commit cbd54ba

File tree

7 files changed

+1075
-970
lines changed

7 files changed

+1075
-970
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ var opt = {
161161
timeFormatLocale: ...,
162162

163163
ast: ...,
164+
expr: ...,
164165

165166
i18n: {
166167
COMPILED_ACTION: ...,
@@ -197,7 +198,8 @@ var opt = {
197198
| `downloadFileName` | String | Sets the file name (default: `visualization`) for charts downloaded using the `png` or `svg` action. |
198199
| `formatLocale` | Object | Sets the default locale definition for number formatting. See the [d3-format locale collection](https://github.com/d3/d3-format/tree/master/locale) for definition files for a variety of languages. Note that this is a global setting. |
199200
| `timeFormatLocale` | Object | Sets the default locale definition for date/time formatting. See the [d3-time-format locale collection](https://github.com/d3/d3-time-format/tree/master/locale) for definition files for a variety of languages. Note that this is a global setting. |
200-
| `ast` | Boolean | Generate an [Abstract Syntax Tree (AST)](https://en.wikipedia.org/wiki/Abstract_syntax_tree) instead of expressions and use an interpreter instead of native evaluation. While the interpreter is slower, it adds support for Vega expressions that are [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)-compliant. In addition to enabling the `ast` option, you need to load the Vega interpreter module before loading Vega. See https://github.com/vega/vega/pull/2658 for details. |
201+
| `ast` | Boolean | Generate an [Abstract Syntax Tree (AST)](https://en.wikipedia.org/wiki/Abstract_syntax_tree) instead of expressions and use an interpreter instead of native evaluation. While the interpreter is slower, it adds support for Vega expressions that are [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)-compliant. |
202+
| `expr` | Object | Custom Vega Expression interpreter. |
201203
| `viewClass` | Class | Class which extends [Vega `View`](https://vega.github.io/vega/docs/api/view/#view) for custom rendering. |
202204

203205
## Common questions

package.json

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,32 +43,33 @@
4343
"@auto-it/first-time-contributor": "^10.32.0",
4444
"@rollup/plugin-commonjs": "20.0.0",
4545
"@rollup/plugin-json": "^4.1.0",
46-
"@rollup/plugin-node-resolve": "^13.0.2",
47-
"@types/semver": "^7.3.7",
46+
"@rollup/plugin-node-resolve": "^13.0.4",
47+
"@types/semver": "^7.3.8",
4848
"@wessberg/rollup-plugin-ts": "^1.3.14",
4949
"auto": "^10.32.0",
50-
"browser-sync": "^2.27.4",
51-
"concurrently": "^6.2.0",
50+
"browser-sync": "^2.27.5",
51+
"concurrently": "^6.2.1",
5252
"del-cli": "^4.0.1",
5353
"jest-canvas-mock": "^2.3.1",
5454
"node-sass": "^6.0.1",
55-
"rollup": "2.56.3",
5655
"rollup-plugin-bundle-size": "^1.0.3",
5756
"rollup-plugin-terser": "^7.0.2",
58-
"typescript": "^4.3.5",
59-
"vega": "^5.19.1",
57+
"rollup": "2.56.3",
58+
"typescript": "^4.4.3",
59+
"vega-interpreter": "^1.0.4",
60+
"vega-lite-dev-config": "^0.18.0",
6061
"vega-lite": "^5.0.0",
61-
"vega-lite-dev-config": "^0.18.0"
62+
"vega": "^5.19.1"
6263
},
6364
"peerDependencies": {
64-
"vega": "^5.13.0",
65+
"vega": "^5.20.2",
6566
"vega-lite": "*"
6667
},
6768
"dependencies": {
68-
"fast-json-patch": "^3.0.0-1",
69+
"fast-json-patch": "^3.1.0",
6970
"json-stringify-pretty-compact": "^3.0.0",
7071
"semver": "^7.3.5",
71-
"tslib": "^2.3.0",
72+
"tslib": "^2.3.1",
7273
"vega-schema-url-parser": "^2.2.0",
7374
"vega-themes": "^2.10.0",
7475
"vega-tooltip": "^0.27.0"

src/embed.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
TooltipHandler,
1717
View,
1818
} from 'vega';
19+
import {expressionInterpreter} from 'vega-interpreter';
1920
import * as vegaLiteImport from 'vega-lite';
2021
import {Config as VlConfig, TopLevelSpec as VlSpec} from 'vega-lite';
2122
import schemaParser from 'vega-schema-url-parser';
@@ -87,6 +88,7 @@ export interface EmbedOptions<S = string, R = Renderers> {
8788
formatLocale?: Record<string, unknown>;
8889
timeFormatLocale?: Record<string, unknown>;
8990
ast?: boolean;
91+
expr?: typeof expressionInterpreter;
9092
viewClass?: typeof View;
9193
}
9294

@@ -354,7 +356,7 @@ async function _embed(
354356
loader,
355357
logLevel,
356358
renderer,
357-
...(ast ? {expr: (vega as any).expressionInterpreter} : {}),
359+
...(ast ? {expr: (vega as any).expressionInterpreter ?? opts.expr ?? expressionInterpreter} : {}),
358360
});
359361

360362
view.addSignalListener('autosize', (_, autosize: Exclude<AutoSize, string>) => {

test-csp.html

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<meta http-equiv="Content-Security-Policy" content="default-src https://cdn.jsdelivr.net/ 'self' 'unsafe-inline'" />
7+
<title>Vega-Embed for Vega-Lite</title>
8+
9+
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
10+
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
11+
<script src="build/vega-embed.js"></script>
12+
</head>
13+
14+
<body>
15+
<div id="vis"></div>
16+
<script>
17+
async function run() {
18+
const spec = {
19+
$schema: "https://vega.github.io/schema/vega-lite/v4.json",
20+
data: {
21+
values: [
22+
{ a: "A", b: 28 },
23+
{ a: "B", b: 55 },
24+
{ a: "C", b: 43 },
25+
{ a: "D", b: 91 },
26+
{ a: "E", b: 81 },
27+
{ a: "F", b: 53 },
28+
{ a: "G", b: 19 },
29+
{ a: "H", b: 87 },
30+
{ a: "I", b: 52 },
31+
],
32+
},
33+
mark: "bar",
34+
encoding: {
35+
x: { field: "a", type: "nominal" },
36+
y: { field: "b", type: "quantitative" },
37+
},
38+
};
39+
40+
const result = await vegaEmbed("#vis", spec, {
41+
ast: true,
42+
});
43+
}
44+
run();
45+
</script>
46+
</body>
47+
</html>

test-vl.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<title>Vega-Embed for Vega-Lite</title>
77

88
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
9-
<script src="https://cdn.jsdelivr.net/npm/vega-lite@4"></script>
9+
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
1010
<script src="build/vega-embed.js"></script>
1111
</head>
1212

test/embed.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vega from 'vega';
22
import {View} from 'vega';
3+
import {expressionInterpreter} from 'vega-interpreter';
34
import * as vl from 'vega-lite';
45
import {compile, TopLevelSpec} from 'vega-lite';
56
import embed, {guessMode, Mode} from '../src/embed';
@@ -259,6 +260,14 @@ test('can set ast option', async () => {
259260
expect(result).toBeTruthy();
260261
});
261262

263+
test('can set expr option', async () => {
264+
const el = document.createElement('div');
265+
const result = await embed(el, vlSpec, {
266+
expr: expressionInterpreter,
267+
});
268+
expect(result).toBeTruthy();
269+
});
270+
262271
test('can change i18n strings', async () => {
263272
const el = document.createElement('div');
264273
await embed(el, vlSpec, {

0 commit comments

Comments
 (0)