diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index 6ebeea9c3f..4e5bdbb7b9 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -331,6 +331,11 @@ async function buildAll() { path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'dataframeRenderer', 'dataframeRenderer.js'), { target: 'web', watch: isWatchMode } ), + build( + path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'vega-renderer', 'index.ts'), + path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'vegaRenderer', 'vegaRenderer.js'), + { target: 'web', watch: isWatchMode } + ), build( path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'variable-view', 'index.tsx'), path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'viewers', 'variableView.js'), diff --git a/package-lock.json b/package-lock.json index f88bc83ced..b982708381 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,12 +29,14 @@ "bootstrap-less": "^3.3.8", "clsx": "^2.1.1", "cross-fetch": "^3.1.5", + "d3-format": "^3.1.0", "encoding": "^0.1.13", "fast-deep-equal": "^2.0.1", "format-util": "^1.0.5", "fs-extra": "^4.0.3", "glob": "^7.1.2", "iconv-lite": "^0.6.3", + "immer": "^10.1.3", "inversify": "^6.0.1", "isomorphic-ws": "^4.0.1", "jquery": "^3.6.0", @@ -54,6 +56,7 @@ "react-redux": "^7.1.1", "react-svg-pan-zoom": "3.9.0", "react-svgmt": "1.1.11", + "react-vega": "^7.7.1", "react-virtualized": "^9.21.1", "redux": "^4.0.4", "redux-logger": "^3.0.6", @@ -70,6 +73,9 @@ "tcp-port-used": "^1.0.1", "tmp": "^0.2.4", "url-parse": "^1.5.10", + "vega": "^5.33.0", + "vega-embed": "^6.25.0", + "vega-lite": "^5.21.0", "vscode-debugprotocol": "^1.41.0", "vscode-languageclient": "8.0.2-next.5", "vscode-tas-client": "^0.1.84", @@ -90,6 +96,7 @@ "@types/chai-arrays": "^2.0.1", "@types/chai-as-promised": "^7.1.6", "@types/cors": "^2.8.6", + "@types/d3-format": "^3.0.4", "@types/debug": "^4.1.5", "@types/dedent": "^0.7.0", "@types/del": "^4.0.0", @@ -2800,12 +2807,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/@playwright/browser-chromium": { "version": "1.54.1", "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.54.1.tgz", @@ -2848,6 +2849,19 @@ "react": "^16.14.0 || >=17" } }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -3232,6 +3246,13 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -3270,12 +3291,10 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "optional": true, - "peer": true + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, "node_modules/@types/event-stream": { "version": "3.3.34", @@ -3301,6 +3320,12 @@ "@types/node": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.4", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", + "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==", + "license": "MIT" + }, "node_modules/@types/get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", @@ -4495,7 +4520,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6208,9 +6232,7 @@ "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/comment-parser": { "version": "1.4.0", @@ -6720,6 +6742,18 @@ "type": "^1.0.1" } }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -6728,15 +6762,136 @@ "node": ">=12" } }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/d3-ease": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "license": "ISC", + "dependencies": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6749,6 +6904,89 @@ "d3-color": "1" } }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", @@ -7105,6 +7343,15 @@ "rimraf": "bin.js" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -7844,7 +8091,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "engines": { "node": ">=6" } @@ -8807,6 +9053,12 @@ "node": ">= 6" } }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -9244,7 +9496,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -10312,6 +10563,16 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, + "node_modules/immer": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -10385,6 +10646,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/inversify": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", @@ -10626,7 +10896,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -11447,6 +11716,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -15040,6 +15315,80 @@ "react-dom": "^16.3.0" } }, + "node_modules/react-vega": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/react-vega/-/react-vega-7.7.1.tgz", + "integrity": "sha512-Dj7n1LkfJEkY/FdwQfOZqIQ+wGUcJNwlTuWhYcuQtbBpTgvtI4wwqOvJ0QWBE19nXMU7t9HmP8sqQO5v6soOlg==", + "license": "Apache-2.0", + "dependencies": { + "@types/react": "*", + "fast-deep-equal": "^3.1.1", + "prop-types": "^15.8.1", + "vega-embed": "6.5.1" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18 || ^19", + "vega": "*", + "vega-lite": "*" + } + }, + "node_modules/react-vega/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/react-vega/node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==", + "license": "MIT" + }, + "node_modules/react-vega/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-vega/node_modules/vega-embed": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.5.1.tgz", + "integrity": "sha512-yz/L1bN3+fLOpgXVb/8sCRv4GlZpD2/ngeKJAFRiHTIRm5zK6W0KuqZZvyGaO7E4s7RuYjW1TWhRIOqh5rS5hA==", + "license": "BSD-3-Clause", + "dependencies": { + "fast-json-patch": "^3.0.0-1", + "json-stringify-pretty-compact": "^2.0.0", + "semver": "^7.1.3", + "vega-schema-url-parser": "^1.1.0", + "vega-themes": "^2.8.2", + "vega-tooltip": "^0.22.0" + }, + "peerDependencies": { + "vega": "^5.8.0", + "vega-lite": "*" + } + }, + "node_modules/react-vega/node_modules/vega-schema-url-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz", + "integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==", + "license": "BSD-3-Clause" + }, + "node_modules/react-vega/node_modules/vega-tooltip": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.22.1.tgz", + "integrity": "sha512-mPmzxwvi6+2ZgbZ/+mNC7XbSu5I6Ckon8zdgUfH9neb+vV7CKlV/FYypMdVN/9iDMFUqGzybYdqNOiSPPIxFEQ==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-util": "^1.13.1" + } + }, "node_modules/react-virtualized": { "version": "9.22.6", "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", @@ -15205,7 +15554,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15508,6 +15856,12 @@ "inherits": "^2.0.1" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, "node_modules/run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -15602,6 +15956,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -16291,7 +16651,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16325,8 +16684,7 @@ "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.matchall": { "version": "4.0.10", @@ -16397,7 +16755,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16967,6 +17324,20 @@ "node": ">=0.6" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, "node_modules/transformation-matrix": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.11.1.tgz", @@ -17054,9 +17425,10 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tslint": { "version": "6.1.3", @@ -17743,21 +18115,533 @@ "node": ">= 0.8" } }, - "node_modules/vinyl-contents": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", - "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", - "dev": true, + "node_modules/vega": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.33.0.tgz", + "integrity": "sha512-jNAGa7TxLojOpMMMrKMXXBos4K6AaLJbCgGDOw1YEkLRjUkh12pcf65J2lMSdEHjcEK47XXjKiOUVZ8L+MniBA==", + "license": "BSD-3-Clause", "dependencies": { - "bl": "^5.0.0", - "vinyl": "^3.0.0" - }, - "engines": { - "node": ">=10.13.0" - } + "vega-crossfilter": "~4.1.3", + "vega-dataflow": "~5.7.7", + "vega-encode": "~4.10.2", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.2.0", + "vega-force": "~4.2.2", + "vega-format": "~1.1.3", + "vega-functions": "~5.18.0", + "vega-geo": "~4.4.3", + "vega-hierarchy": "~4.1.3", + "vega-label": "~1.3.1", + "vega-loader": "~4.5.3", + "vega-parser": "~6.6.0", + "vega-projection": "~1.6.2", + "vega-regression": "~1.3.1", + "vega-runtime": "~6.2.1", + "vega-scale": "~7.4.2", + "vega-scenegraph": "~4.13.1", + "vega-statistics": "~1.9.0", + "vega-time": "~2.1.3", + "vega-transforms": "~4.12.1", + "vega-typings": "~1.5.0", + "vega-util": "~1.17.2", + "vega-view": "~5.16.0", + "vega-view-transforms": "~4.6.1", + "vega-voronoi": "~4.2.4", + "vega-wordcloud": "~4.1.6" + } + }, + "node_modules/vega-canvas": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.7.tgz", + "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==", + "license": "BSD-3-Clause" }, - "node_modules/vinyl-contents/node_modules/clone": { - "version": "2.1.2", + "node_modules/vega-crossfilter": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.1.3.tgz", + "integrity": "sha512-nyPJAXAUABc3EocUXvAL1J/IWotZVsApIcvOeZaUdEQEtZ7bt8VtP2nj3CLbHBA8FZZVV+K6SmdwvCOaAD4wFQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-dataflow": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.7.tgz", + "integrity": "sha512-R2NX2HvgXL+u4E6u+L5lKvvRiCtnE6N6l+umgojfi53suhhkFP+zB+2UAQo4syxuZ4763H1csfkKc4xpqLzKnw==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-format": "^1.1.3", + "vega-loader": "^4.5.3", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-embed": { + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.29.0.tgz", + "integrity": "sha512-PmlshTLtLFLgWtF/b23T1OwX53AugJ9RZ3qPE2c01VFAbgt3/GSNI/etzA/GzdrkceXFma+FDHNXUppKuM0U6Q==", + "license": "BSD-3-Clause", + "dependencies": { + "fast-json-patch": "^3.1.1", + "json-stringify-pretty-compact": "^4.0.0", + "semver": "^7.6.3", + "tslib": "^2.8.1", + "vega-interpreter": "^1.0.5", + "vega-schema-url-parser": "^2.2.0", + "vega-themes": "^2.15.0", + "vega-tooltip": "^0.35.2" + }, + "peerDependencies": { + "vega": "^5.21.0", + "vega-lite": "*" + } + }, + "node_modules/vega-embed/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vega-encode": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.10.2.tgz", + "integrity": "sha512-fsjEY1VaBAmqwt7Jlpz0dpPtfQFiBdP9igEefvumSpy7XUxOJmDQcRDnT3Qh9ctkv3itfPfI9g8FSnGcv2b4jQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "vega-dataflow": "^5.7.7", + "vega-scale": "^7.4.2", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-encode/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-expression": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.2.0.tgz", + "integrity": "sha512-WRMa4ny3iZIVAzDlBh3ipY2QUuLk2hnJJbfbncPgvTF7BUgbIbKq947z+JicWksYbokl8n1JHXJoqi3XvpG0Zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-force": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.2.2.tgz", + "integrity": "sha512-cHZVaY2VNNIG2RyihhSiWniPd2W9R9kJq0znxzV602CgUVgxEfTKtx/lxnVCn8nNrdKAYrGiqIsBzIeKG1GWHw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-force": "^3.0.0", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-format": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.3.tgz", + "integrity": "sha512-wQhw7KR46wKJAip28FF/CicW+oiJaPAwMKdrxlnTA0Nv8Bf7bloRlc+O3kON4b4H1iALLr9KgRcYTOeXNs2MOA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-format": "^3.1.0", + "d3-time-format": "^4.1.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-functions": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.18.0.tgz", + "integrity": "sha512-+D+ey4bDAhZA2CChh7bRZrcqRUDevv05kd2z8xH+il7PbYQLrhi6g1zwvf8z3KpgGInFf5O13WuFK5DQGkz5lQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-dataflow": "^5.7.7", + "vega-expression": "^5.2.0", + "vega-scale": "^7.4.2", + "vega-scenegraph": "^4.13.1", + "vega-selections": "^5.6.0", + "vega-statistics": "^1.9.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-geo": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.3.tgz", + "integrity": "sha512-+WnnzEPKIU1/xTFUK3EMu2htN35gp9usNZcC0ZFg2up1/Vqu6JyZsX0PIO51oXSIeXn9bwk6VgzlOmJUcx92tA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.7", + "vega-projection": "^1.6.2", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-hierarchy": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.3.tgz", + "integrity": "sha512-0Z+TYKRgOEo8XYXnJc2HWg1EGpcbNAhJ9Wpi9ubIbEyEHqIgjCIyFVN8d4nSfsJOcWDzsSmRqohBztxAhOCSaw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-interpreter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-1.2.0.tgz", + "integrity": "sha512-p408/0IPevyR/bIKdXGNzOixkTYCkH83zNhGypRqDxd/qVrdJVrh9RcECOYx1MwEc6JTB1BeK2lArHiGGuG7Hw==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-label": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-1.3.1.tgz", + "integrity": "sha512-Emx4b5s7pvuRj3fBkAJ/E2snCoZACfKAwxVId7f/4kYVlAYLb5Swq6W8KZHrH4M9Qds1XJRUYW9/Y3cceqzEFA==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.7", + "vega-scenegraph": "^4.13.1", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-lite": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.23.0.tgz", + "integrity": "sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==", + "license": "BSD-3-Clause", + "dependencies": { + "json-stringify-pretty-compact": "~4.0.0", + "tslib": "~2.8.1", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.1", + "vega-util": "~1.17.2", + "yargs": "~17.7.2" + }, + "bin": { + "vl2pdf": "bin/vl2pdf", + "vl2png": "bin/vl2png", + "vl2svg": "bin/vl2svg", + "vl2vg": "bin/vl2vg" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vega": "^5.24.0" + } + }, + "node_modules/vega-lite/node_modules/vega-expression": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.2.tgz", + "integrity": "sha512-fFeDTh4UtOxlZWL54jf1ZqJHinyerWq/ROiqrQxqLkNJRJ86RmxYTgXwt65UoZ/l4VUv9eAd2qoJeDEf610Umw==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-loader": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.3.tgz", + "integrity": "sha512-dUfIpxTLF2magoMaur+jXGvwMxjtdlDZaIS8lFj6N7IhUST6nIvBzuUlRM+zLYepI5GHtCLOnqdKU4XV0NggCA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.3", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-parser": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.6.0.tgz", + "integrity": "sha512-jltyrwCTtWeidi/6VotLCybhIl+ehwnzvFWYOdWNUP0z/EskdB64YmawNwjCjzTBMemeiQtY6sJPPbewYqe3Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^5.7.7", + "vega-event-selector": "^3.0.1", + "vega-functions": "^5.18.0", + "vega-scale": "^7.4.2", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-projection": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.6.2.tgz", + "integrity": "sha512-3pcVaQL9R3Zfk6PzopLX6awzrQUeYOXJzlfLGP2Xd93mqUepBa6m/reVrTUoSFXA3v9lfK4W/PS2AcVzD/MIcQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-geo": "^3.1.0", + "d3-geo-projection": "^4.0.0", + "vega-scale": "^7.4.2" + } + }, + "node_modules/vega-regression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.3.1.tgz", + "integrity": "sha512-AmccF++Z9uw4HNZC/gmkQGe6JsRxTG/R4QpbcSepyMvQN1Rj5KtVqMcmVFP1r3ivM4dYGFuPlzMWvuqp0iKMkQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.7", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-runtime": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.2.1.tgz", + "integrity": "sha512-b4eot3tWKCk++INWqot+6sLn3wDTj/HE+tRSbiaf8aecuniPMlwJEK7wWuhVGeW2Ae5n8fI/8TeTViaC94bNHA==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-scale": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.4.2.tgz", + "integrity": "sha512-o6Hl76aU1jlCK7Q8DPYZ8OGsp4PtzLdzI6nGpLt8rxoE78QuB3GBGEwGAQJitp4IF7Lb2rL5oAXEl3ZP6xf9jg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-scale-chromatic": "^3.1.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-scale/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-scenegraph": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.13.1.tgz", + "integrity": "sha512-LFY9+sLIxRfdDI9ZTKjLoijMkIAzPLBWHpPkwv4NPYgdyx+0qFmv+puBpAUGUY9VZqAZ736Uj5NJY9zw+/M3yQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.3", + "vega-scale": "^7.4.2", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-schema-url-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz", + "integrity": "sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-selections": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.6.0.tgz", + "integrity": "sha512-UE2w78rUUbaV3Ph+vQbQDwh8eywIJYRxBiZdxEG/Tr/KtFMLdy2BDgNZuuDO1Nv8jImPJwONmqjNhNDYwM0VJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "3.2.4", + "vega-expression": "^5.2.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-statistics": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", + "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2" + } + }, + "node_modules/vega-themes": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.15.0.tgz", + "integrity": "sha512-DicRAKG9z+23A+rH/3w3QjJvKnlGhSbbUXGjBvYGseZ1lvj9KQ0BXZ2NS/+MKns59LNpFNHGi9us/wMlci4TOA==", + "license": "BSD-3-Clause", + "peerDependencies": { + "vega": "*", + "vega-lite": "*" + } + }, + "node_modules/vega-time": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-2.1.3.tgz", + "integrity": "sha512-hFcWPdTV844IiY0m97+WUoMLADCp+8yUQR1NStWhzBzwDDA7QEGGwYGxALhdMOaDTwkyoNj3V/nox2rQAJD/vQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-time": "^3.1.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-tooltip": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.35.2.tgz", + "integrity": "sha512-kuYcsAAKYn39ye5wKf2fq1BAxVcjoz0alvKp/G+7BWfIb94J0PHmwrJ5+okGefeStZnbXxINZEOKo7INHaj9GA==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-util": "^1.17.2" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.24.4" + } + }, + "node_modules/vega-transforms": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.12.1.tgz", + "integrity": "sha512-Qxo+xeEEftY1jYyKgzOGc9NuW4/MqGm1YPZ5WrL9eXg2G0410Ne+xL/MFIjHF4hRX+3mgFF4Io2hPpfy/thjLg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.7", + "vega-statistics": "^1.9.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-typings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-1.5.0.tgz", + "integrity": "sha512-tcZ2HwmiQEOXIGyBMP8sdCnoFoVqHn4KQ4H0MQiHwzFU1hb1EXURhfc+Uamthewk4h/9BICtAM3AFQMjBGpjQA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/geojson": "7946.0.4", + "vega-event-selector": "^3.0.1", + "vega-expression": "^5.2.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-util": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.3.tgz", + "integrity": "sha512-nSNpZLUrRvFo46M5OK4O6x6f08WD1yOcEzHNlqivF+sDLSsVpstaF6fdJYwrbf/debFi2L9Tkp4gZQtssup9iQ==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-view": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.16.0.tgz", + "integrity": "sha512-Nxp1MEAY+8bphIm+7BeGFzWPoJnX9+hgvze6wqCAPoM69YiyVR0o0VK8M2EESIL+22+Owr0Fdy94hWHnmon5tQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-timer": "^3.0.1", + "vega-dataflow": "^5.7.7", + "vega-format": "^1.1.3", + "vega-functions": "^5.18.0", + "vega-runtime": "^6.2.1", + "vega-scenegraph": "^4.13.1", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-view-transforms": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.6.1.tgz", + "integrity": "sha512-RYlyMJu5kZV4XXjmyTQKADJWDB25SMHsiF+B1rbE1p+pmdQPlp5tGdPl9r5dUJOp3p8mSt/NGI8GPGucmPMxtw==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^5.7.7", + "vega-scenegraph": "^4.13.1", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-view/node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-voronoi": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.4.tgz", + "integrity": "sha512-lWNimgJAXGeRFu2Pz8axOUqVf1moYhD+5yhBzDSmckE9I5jLOyZc/XvgFTXwFnsVkMd1QW1vxJa+y9yfUblzYw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-delaunay": "^6.0.2", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-wordcloud": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.6.tgz", + "integrity": "sha512-lFmF3u9/ozU0P+WqPjeThQfZm0PigdbXDwpIUCxczrCXKYJLYFmZuZLZR7cxtmpZ0/yuvRvAJ4g123LXbSZF8A==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.7", + "vega-scale": "^7.4.2", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vinyl-contents": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", + "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "dev": true, + "dependencies": { + "bl": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-contents/node_modules/clone": { + "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, @@ -17999,7 +18883,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18067,7 +18950,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18082,7 +18964,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18093,8 +18974,7 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrappy": { "version": "1.0.2", @@ -18158,7 +19038,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -18184,7 +19063,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -18202,7 +19080,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -18250,7 +19127,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -20268,14 +21144,6 @@ "open": "^9.1.0", "picocolors": "^1.0.0", "tslib": "^2.6.0" - }, - "dependencies": { - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - } } }, "@playwright/browser-chromium": { @@ -20305,6 +21173,12 @@ "react-is": "^18.2.0" } }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "optional": true + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -20555,6 +21429,12 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true + }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -20592,12 +21472,9 @@ } }, "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "optional": true, - "peer": true + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, "@types/event-stream": { "version": "3.3.34", @@ -20623,6 +21500,11 @@ "@types/node": "*" } }, + "@types/geojson": { + "version": "7946.0.4", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", + "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==" + }, "@types/get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", @@ -21532,8 +22414,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -22783,9 +23664,7 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "comment-parser": { "version": "1.4.0", @@ -23205,21 +24084,99 @@ "type": "^1.0.1" } }, + "d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "requires": { + "internmap": "1 - 2" + } + }, "d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" }, + "d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, "d3-ease": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, "d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" }, + "d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "requires": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, + "d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" + }, "d3-interpolate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", @@ -23228,6 +24185,61 @@ "d3-color": "3.1.0" } }, + "d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "requires": { + "d3-color": "3.1.0", + "d3-interpolate": "1 - 3" + } + }, + "d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "requires": { + "d3-path": "^3.1.0" + } + }, + "d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "requires": { + "d3-time": "1 - 3" + } + }, "d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", @@ -23479,6 +24491,14 @@ } } }, + "delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "requires": { + "robust-predicates": "^3.0.2" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -24093,8 +25113,7 @@ "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "escape-html": { "version": "1.0.3", @@ -24805,6 +25824,11 @@ } } }, + "fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -25126,8 +26150,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-east-asian-width": { "version": "1.4.0", @@ -25896,6 +26919,11 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, + "immer": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==" + }, "immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -25954,6 +26982,11 @@ "side-channel": "^1.0.4" } }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "inversify": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", @@ -26120,8 +27153,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-function": { "version": "1.0.10", @@ -26698,6 +27730,11 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -29293,6 +30330,60 @@ "react-move": "^2.7.0" } }, + "react-vega": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/react-vega/-/react-vega-7.7.1.tgz", + "integrity": "sha512-Dj7n1LkfJEkY/FdwQfOZqIQ+wGUcJNwlTuWhYcuQtbBpTgvtI4wwqOvJ0QWBE19nXMU7t9HmP8sqQO5v6soOlg==", + "requires": { + "@types/react": "*", + "fast-deep-equal": "^3.1.1", + "prop-types": "^15.8.1", + "vega-embed": "6.5.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + }, + "vega-embed": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.5.1.tgz", + "integrity": "sha512-yz/L1bN3+fLOpgXVb/8sCRv4GlZpD2/ngeKJAFRiHTIRm5zK6W0KuqZZvyGaO7E4s7RuYjW1TWhRIOqh5rS5hA==", + "requires": { + "fast-json-patch": "^3.0.0-1", + "json-stringify-pretty-compact": "^2.0.0", + "semver": "^7.1.3", + "vega-schema-url-parser": "^1.1.0", + "vega-themes": "^2.8.2", + "vega-tooltip": "^0.22.0" + } + }, + "vega-schema-url-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz", + "integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==" + }, + "vega-tooltip": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.22.1.tgz", + "integrity": "sha512-mPmzxwvi6+2ZgbZ/+mNC7XbSu5I6Ckon8zdgUfH9neb+vV7CKlV/FYypMdVN/9iDMFUqGzybYdqNOiSPPIxFEQ==", + "requires": { + "vega-util": "^1.13.1" + } + } + } + }, "react-virtualized": { "version": "9.22.6", "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", @@ -29423,8 +30514,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -29628,6 +30718,11 @@ "inherits": "^2.0.1" } }, + "robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -29686,6 +30781,11 @@ "queue-microtask": "^1.2.2" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -30254,7 +31354,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -30264,8 +31363,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" } } }, @@ -30342,7 +31440,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -30781,6 +31878,14 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + }, "transformation-matrix": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.11.1.tgz", @@ -30849,9 +31954,9 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tslint": { "version": "6.1.3", @@ -31384,6 +32489,451 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vega": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.33.0.tgz", + "integrity": "sha512-jNAGa7TxLojOpMMMrKMXXBos4K6AaLJbCgGDOw1YEkLRjUkh12pcf65J2lMSdEHjcEK47XXjKiOUVZ8L+MniBA==", + "requires": { + "vega-crossfilter": "~4.1.3", + "vega-dataflow": "~5.7.7", + "vega-encode": "~4.10.2", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.2.0", + "vega-force": "~4.2.2", + "vega-format": "~1.1.3", + "vega-functions": "~5.18.0", + "vega-geo": "~4.4.3", + "vega-hierarchy": "~4.1.3", + "vega-label": "~1.3.1", + "vega-loader": "~4.5.3", + "vega-parser": "~6.6.0", + "vega-projection": "~1.6.2", + "vega-regression": "~1.3.1", + "vega-runtime": "~6.2.1", + "vega-scale": "~7.4.2", + "vega-scenegraph": "~4.13.1", + "vega-statistics": "~1.9.0", + "vega-time": "~2.1.3", + "vega-transforms": "~4.12.1", + "vega-typings": "~1.5.0", + "vega-util": "~1.17.2", + "vega-view": "~5.16.0", + "vega-view-transforms": "~4.6.1", + "vega-voronoi": "~4.2.4", + "vega-wordcloud": "~4.1.6" + } + }, + "vega-canvas": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.7.tgz", + "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==" + }, + "vega-crossfilter": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.1.3.tgz", + "integrity": "sha512-nyPJAXAUABc3EocUXvAL1J/IWotZVsApIcvOeZaUdEQEtZ7bt8VtP2nj3CLbHBA8FZZVV+K6SmdwvCOaAD4wFQ==", + "requires": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "vega-dataflow": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.7.tgz", + "integrity": "sha512-R2NX2HvgXL+u4E6u+L5lKvvRiCtnE6N6l+umgojfi53suhhkFP+zB+2UAQo4syxuZ4763H1csfkKc4xpqLzKnw==", + "requires": { + "vega-format": "^1.1.3", + "vega-loader": "^4.5.3", + "vega-util": "^1.17.3" + } + }, + "vega-embed": { + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.29.0.tgz", + "integrity": "sha512-PmlshTLtLFLgWtF/b23T1OwX53AugJ9RZ3qPE2c01VFAbgt3/GSNI/etzA/GzdrkceXFma+FDHNXUppKuM0U6Q==", + "requires": { + "fast-json-patch": "^3.1.1", + "json-stringify-pretty-compact": "^4.0.0", + "semver": "^7.6.3", + "tslib": "^2.8.1", + "vega-interpreter": "^1.0.5", + "vega-schema-url-parser": "^2.2.0", + "vega-themes": "^2.15.0", + "vega-tooltip": "^0.35.2" + }, + "dependencies": { + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + } + } + }, + "vega-encode": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.10.2.tgz", + "integrity": "sha512-fsjEY1VaBAmqwt7Jlpz0dpPtfQFiBdP9igEefvumSpy7XUxOJmDQcRDnT3Qh9ctkv3itfPfI9g8FSnGcv2b4jQ==", + "requires": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "vega-dataflow": "^5.7.7", + "vega-scale": "^7.4.2", + "vega-util": "^1.17.3" + }, + "dependencies": { + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "3.1.0" + } + } + } + }, + "vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==" + }, + "vega-expression": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.2.0.tgz", + "integrity": "sha512-WRMa4ny3iZIVAzDlBh3ipY2QUuLk2hnJJbfbncPgvTF7BUgbIbKq947z+JicWksYbokl8n1JHXJoqi3XvpG0Zw==", + "requires": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.3" + } + }, + "vega-force": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.2.2.tgz", + "integrity": "sha512-cHZVaY2VNNIG2RyihhSiWniPd2W9R9kJq0znxzV602CgUVgxEfTKtx/lxnVCn8nNrdKAYrGiqIsBzIeKG1GWHw==", + "requires": { + "d3-force": "^3.0.0", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "vega-format": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.3.tgz", + "integrity": "sha512-wQhw7KR46wKJAip28FF/CicW+oiJaPAwMKdrxlnTA0Nv8Bf7bloRlc+O3kON4b4H1iALLr9KgRcYTOeXNs2MOA==", + "requires": { + "d3-array": "^3.2.2", + "d3-format": "^3.1.0", + "d3-time-format": "^4.1.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "vega-functions": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.18.0.tgz", + "integrity": "sha512-+D+ey4bDAhZA2CChh7bRZrcqRUDevv05kd2z8xH+il7PbYQLrhi6g1zwvf8z3KpgGInFf5O13WuFK5DQGkz5lQ==", + "requires": { + "d3-array": "^3.2.2", + "d3-color": "3.1.0", + "d3-geo": "^3.1.0", + "vega-dataflow": "^5.7.7", + "vega-expression": "^5.2.0", + "vega-scale": "^7.4.2", + "vega-scenegraph": "^4.13.1", + "vega-selections": "^5.6.0", + "vega-statistics": "^1.9.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "vega-geo": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.3.tgz", + "integrity": "sha512-+WnnzEPKIU1/xTFUK3EMu2htN35gp9usNZcC0ZFg2up1/Vqu6JyZsX0PIO51oXSIeXn9bwk6VgzlOmJUcx92tA==", + "requires": { + "d3-array": "^3.2.2", + "d3-color": "3.1.0", + "d3-geo": "^3.1.0", + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.7", + "vega-projection": "^1.6.2", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.3" + } + }, + "vega-hierarchy": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.3.tgz", + "integrity": "sha512-0Z+TYKRgOEo8XYXnJc2HWg1EGpcbNAhJ9Wpi9ubIbEyEHqIgjCIyFVN8d4nSfsJOcWDzsSmRqohBztxAhOCSaw==", + "requires": { + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "vega-interpreter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-1.2.0.tgz", + "integrity": "sha512-p408/0IPevyR/bIKdXGNzOixkTYCkH83zNhGypRqDxd/qVrdJVrh9RcECOYx1MwEc6JTB1BeK2lArHiGGuG7Hw==", + "requires": { + "vega-util": "^1.17.3" + } + }, + "vega-label": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-1.3.1.tgz", + "integrity": "sha512-Emx4b5s7pvuRj3fBkAJ/E2snCoZACfKAwxVId7f/4kYVlAYLb5Swq6W8KZHrH4M9Qds1XJRUYW9/Y3cceqzEFA==", + "requires": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.7", + "vega-scenegraph": "^4.13.1", + "vega-util": "^1.17.3" + } + }, + "vega-lite": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.23.0.tgz", + "integrity": "sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==", + "requires": { + "json-stringify-pretty-compact": "~4.0.0", + "tslib": "~2.8.1", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.1", + "vega-util": "~1.17.2", + "yargs": "~17.7.2" + }, + "dependencies": { + "vega-expression": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.2.tgz", + "integrity": "sha512-fFeDTh4UtOxlZWL54jf1ZqJHinyerWq/ROiqrQxqLkNJRJ86RmxYTgXwt65UoZ/l4VUv9eAd2qoJeDEf610Umw==", + "requires": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.3" + } + } + } + }, + "vega-loader": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.3.tgz", + "integrity": "sha512-dUfIpxTLF2magoMaur+jXGvwMxjtdlDZaIS8lFj6N7IhUST6nIvBzuUlRM+zLYepI5GHtCLOnqdKU4XV0NggCA==", + "requires": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.3", + "vega-util": "^1.17.3" + } + }, + "vega-parser": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.6.0.tgz", + "integrity": "sha512-jltyrwCTtWeidi/6VotLCybhIl+ehwnzvFWYOdWNUP0z/EskdB64YmawNwjCjzTBMemeiQtY6sJPPbewYqe3Vg==", + "requires": { + "vega-dataflow": "^5.7.7", + "vega-event-selector": "^3.0.1", + "vega-functions": "^5.18.0", + "vega-scale": "^7.4.2", + "vega-util": "^1.17.3" + } + }, + "vega-projection": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.6.2.tgz", + "integrity": "sha512-3pcVaQL9R3Zfk6PzopLX6awzrQUeYOXJzlfLGP2Xd93mqUepBa6m/reVrTUoSFXA3v9lfK4W/PS2AcVzD/MIcQ==", + "requires": { + "d3-geo": "^3.1.0", + "d3-geo-projection": "^4.0.0", + "vega-scale": "^7.4.2" + } + }, + "vega-regression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.3.1.tgz", + "integrity": "sha512-AmccF++Z9uw4HNZC/gmkQGe6JsRxTG/R4QpbcSepyMvQN1Rj5KtVqMcmVFP1r3ivM4dYGFuPlzMWvuqp0iKMkQ==", + "requires": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.7", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.3" + } + }, + "vega-runtime": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.2.1.tgz", + "integrity": "sha512-b4eot3tWKCk++INWqot+6sLn3wDTj/HE+tRSbiaf8aecuniPMlwJEK7wWuhVGeW2Ae5n8fI/8TeTViaC94bNHA==", + "requires": { + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "vega-scale": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.4.2.tgz", + "integrity": "sha512-o6Hl76aU1jlCK7Q8DPYZ8OGsp4PtzLdzI6nGpLt8rxoE78QuB3GBGEwGAQJitp4IF7Lb2rL5oAXEl3ZP6xf9jg==", + "requires": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-scale-chromatic": "^3.1.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + }, + "dependencies": { + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "3.1.0" + } + } + } + }, + "vega-scenegraph": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.13.1.tgz", + "integrity": "sha512-LFY9+sLIxRfdDI9ZTKjLoijMkIAzPLBWHpPkwv4NPYgdyx+0qFmv+puBpAUGUY9VZqAZ736Uj5NJY9zw+/M3yQ==", + "requires": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.3", + "vega-scale": "^7.4.2", + "vega-util": "^1.17.3" + } + }, + "vega-schema-url-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz", + "integrity": "sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==" + }, + "vega-selections": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.6.0.tgz", + "integrity": "sha512-UE2w78rUUbaV3Ph+vQbQDwh8eywIJYRxBiZdxEG/Tr/KtFMLdy2BDgNZuuDO1Nv8jImPJwONmqjNhNDYwM0VJQ==", + "requires": { + "d3-array": "3.2.4", + "vega-expression": "^5.2.0", + "vega-util": "^1.17.3" + } + }, + "vega-statistics": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", + "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "requires": { + "d3-array": "^3.2.2" + } + }, + "vega-themes": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.15.0.tgz", + "integrity": "sha512-DicRAKG9z+23A+rH/3w3QjJvKnlGhSbbUXGjBvYGseZ1lvj9KQ0BXZ2NS/+MKns59LNpFNHGi9us/wMlci4TOA==", + "requires": {} + }, + "vega-time": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-2.1.3.tgz", + "integrity": "sha512-hFcWPdTV844IiY0m97+WUoMLADCp+8yUQR1NStWhzBzwDDA7QEGGwYGxALhdMOaDTwkyoNj3V/nox2rQAJD/vQ==", + "requires": { + "d3-array": "^3.2.2", + "d3-time": "^3.1.0", + "vega-util": "^1.17.3" + } + }, + "vega-tooltip": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.35.2.tgz", + "integrity": "sha512-kuYcsAAKYn39ye5wKf2fq1BAxVcjoz0alvKp/G+7BWfIb94J0PHmwrJ5+okGefeStZnbXxINZEOKo7INHaj9GA==", + "requires": { + "@rollup/rollup-linux-x64-gnu": "^4.24.4", + "vega-util": "^1.17.2" + } + }, + "vega-transforms": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.12.1.tgz", + "integrity": "sha512-Qxo+xeEEftY1jYyKgzOGc9NuW4/MqGm1YPZ5WrL9eXg2G0410Ne+xL/MFIjHF4hRX+3mgFF4Io2hPpfy/thjLg==", + "requires": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.7", + "vega-statistics": "^1.9.0", + "vega-time": "^2.1.3", + "vega-util": "^1.17.3" + } + }, + "vega-typings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-1.5.0.tgz", + "integrity": "sha512-tcZ2HwmiQEOXIGyBMP8sdCnoFoVqHn4KQ4H0MQiHwzFU1hb1EXURhfc+Uamthewk4h/9BICtAM3AFQMjBGpjQA==", + "requires": { + "@types/geojson": "7946.0.4", + "vega-event-selector": "^3.0.1", + "vega-expression": "^5.2.0", + "vega-util": "^1.17.3" + } + }, + "vega-util": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.3.tgz", + "integrity": "sha512-nSNpZLUrRvFo46M5OK4O6x6f08WD1yOcEzHNlqivF+sDLSsVpstaF6fdJYwrbf/debFi2L9Tkp4gZQtssup9iQ==" + }, + "vega-view": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.16.0.tgz", + "integrity": "sha512-Nxp1MEAY+8bphIm+7BeGFzWPoJnX9+hgvze6wqCAPoM69YiyVR0o0VK8M2EESIL+22+Owr0Fdy94hWHnmon5tQ==", + "requires": { + "d3-array": "^3.2.2", + "d3-timer": "^3.0.1", + "vega-dataflow": "^5.7.7", + "vega-format": "^1.1.3", + "vega-functions": "^5.18.0", + "vega-runtime": "^6.2.1", + "vega-scenegraph": "^4.13.1", + "vega-util": "^1.17.3" + }, + "dependencies": { + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + } + } + }, + "vega-view-transforms": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.6.1.tgz", + "integrity": "sha512-RYlyMJu5kZV4XXjmyTQKADJWDB25SMHsiF+B1rbE1p+pmdQPlp5tGdPl9r5dUJOp3p8mSt/NGI8GPGucmPMxtw==", + "requires": { + "vega-dataflow": "^5.7.7", + "vega-scenegraph": "^4.13.1", + "vega-util": "^1.17.3" + } + }, + "vega-voronoi": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.4.tgz", + "integrity": "sha512-lWNimgJAXGeRFu2Pz8axOUqVf1moYhD+5yhBzDSmckE9I5jLOyZc/XvgFTXwFnsVkMd1QW1vxJa+y9yfUblzYw==", + "requires": { + "d3-delaunay": "^6.0.2", + "vega-dataflow": "^5.7.7", + "vega-util": "^1.17.3" + } + }, + "vega-wordcloud": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.6.tgz", + "integrity": "sha512-lFmF3u9/ozU0P+WqPjeThQfZm0PigdbXDwpIUCxczrCXKYJLYFmZuZLZR7cxtmpZ0/yuvRvAJ4g123LXbSZF8A==", + "requires": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.7", + "vega-scale": "^7.4.2", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.3" + } + }, "vinyl-contents": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", @@ -31585,7 +33135,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -31596,7 +33145,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -31605,7 +33153,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -31613,8 +33160,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -31702,8 +33248,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -31719,7 +33264,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -31734,7 +33278,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -31746,8 +33289,7 @@ "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index fa6929a48a..9c62003e38 100644 --- a/package.json +++ b/package.json @@ -1847,6 +1847,15 @@ "application/vnd.deepnote.dataframe.v3+json" ], "requiresMessaging": "optional" + }, + { + "id": "deepnote-vega-renderer", + "displayName": "Deepnote Vega Chart Renderer", + "entrypoint": "./dist/webviews/webview-side/vegaRenderer/vegaRenderer.js", + "mimeTypes": [ + "application/vnd.vega.v5+json" + ], + "requiresMessaging": "optional" } ], "viewsContainers": { @@ -2162,12 +2171,14 @@ "bootstrap-less": "^3.3.8", "clsx": "^2.1.1", "cross-fetch": "^3.1.5", + "d3-format": "^3.1.0", "encoding": "^0.1.13", "fast-deep-equal": "^2.0.1", "format-util": "^1.0.5", "fs-extra": "^4.0.3", "glob": "^7.1.2", "iconv-lite": "^0.6.3", + "immer": "^10.1.3", "inversify": "^6.0.1", "isomorphic-ws": "^4.0.1", "jquery": "^3.6.0", @@ -2187,6 +2198,7 @@ "react-redux": "^7.1.1", "react-svg-pan-zoom": "3.9.0", "react-svgmt": "1.1.11", + "react-vega": "^7.7.1", "react-virtualized": "^9.21.1", "redux": "^4.0.4", "redux-logger": "^3.0.6", @@ -2203,6 +2215,9 @@ "tcp-port-used": "^1.0.1", "tmp": "^0.2.4", "url-parse": "^1.5.10", + "vega": "^5.33.0", + "vega-embed": "^6.25.0", + "vega-lite": "^5.21.0", "vscode-debugprotocol": "^1.41.0", "vscode-languageclient": "8.0.2-next.5", "vscode-tas-client": "^0.1.84", @@ -2223,6 +2238,7 @@ "@types/chai-arrays": "^2.0.1", "@types/chai-as-promised": "^7.1.6", "@types/cors": "^2.8.6", + "@types/d3-format": "^3.0.4", "@types/debug": "^4.1.5", "@types/dedent": "^0.7.0", "@types/del": "^4.0.0", diff --git a/src/kernels/execution/cellExecution.ts b/src/kernels/execution/cellExecution.ts index c069cddaec..8e8a2d79f1 100644 --- a/src/kernels/execution/cellExecution.ts +++ b/src/kernels/execution/cellExecution.ts @@ -32,8 +32,8 @@ import { KernelError } from '../errors/kernelError'; import { getCachedSysPrefix } from '../../platform/interpreter/helpers'; import { getCellMetadata } from '../../platform/common/utils'; import { NotebookCellExecutionState, notebookCellExecutions } from '../../platform/notebooks/cellExecutionStateService'; -import { createBlockFromPocket } from '../../notebooks/deepnote/pocket'; import { createPythonCode } from '@deepnote/blocks'; +import { DeepnoteDataConverter } from '../../notebooks/deepnote/deepnoteDataConverter'; /** * Factory for CellExecution objects. @@ -416,10 +416,11 @@ export class CellExecution implements ICellExecution, IDisposable { metadata: this.cell.metadata, outputs: [...(this.cell.outputs || [])] }; - const deepnoteBlock = createBlockFromPocket(cellData, this.cell.index); - // Use createPythonCode to generate code with table state already included - logger.info(`Cell ${this.cell.index}: Using createPythonCode to generate execution code with table state`); + const dataConverter = new DeepnoteDataConverter(); + const deepnoteBlock = dataConverter.convertCellToBlock(cellData, this.cell.index); + + logger.info(`Cell ${this.cell.index}: Using createPythonCode for ${deepnoteBlock.type} block`); code = createPythonCode(deepnoteBlock); // Generate metadata from our cell (some kernels expect this.) diff --git a/src/notebooks/deepnote/converters/visualizationBlockConverter.ts b/src/notebooks/deepnote/converters/visualizationBlockConverter.ts new file mode 100644 index 0000000000..e3c7baac82 --- /dev/null +++ b/src/notebooks/deepnote/converters/visualizationBlockConverter.ts @@ -0,0 +1,95 @@ +import { NotebookCellData, NotebookCellKind } from 'vscode'; + +import type { BlockConverter } from './blockConverter'; +import type { DeepnoteBlock } from '../deepnoteTypes'; + +type DataframeFilter = { + column: string; + operator: + | 'is-equal' + | 'is-not-equal' + | 'is-one-of' + | 'is-not-one-of' + | 'is-not-null' + | 'is-null' + | 'text-contains' + | 'text-does-not-contain' + | 'greater-than' + | 'greater-than-or-equal' + | 'less-than' + | 'less-than-or-equal' + | 'between' + | 'outside-of' + | 'is-relative-today' + | 'is-after' + | 'is-before' + | 'is-on'; + comparativeValues: string[]; +}; + +interface FilterMetadata { + /** @deprecated Use advancedFilters instead */ + filter?: unknown; + advancedFilters?: DataframeFilter[]; +} + +interface VisualizationCellMetadata { + deepnote_variable_name?: string; + deepnote_visualization_spec?: Record; + deepnote_chart_filter?: FilterMetadata; +} + +/** + * Converter for Deepnote visualization blocks (chart blocks). + * Displays blocks as editable JSON with variable name, spec, and filters. + * The JSON is converted to Python code at execution time. + */ +export class VisualizationBlockConverter implements BlockConverter { + applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { + block.content = ''; + + // Parse the JSON from the cell to update metadata + try { + const config = JSON.parse(cell.value || '{}'); + + block.metadata = { + ...block.metadata, + deepnote_variable_name: config.variable || '', + deepnote_visualization_spec: config.spec || {}, + deepnote_chart_filter: { + advancedFilters: config.filters || [] + } + }; + } catch (error) { + // If JSON parsing fails, leave metadata unchanged + console.warn('Failed to parse visualization JSON:', error); + } + } + + canConvert(blockType: string): boolean { + return blockType.toLowerCase() === 'visualization'; + } + + convertToCell(block: DeepnoteBlock): NotebookCellData { + const metadata = block.metadata as VisualizationCellMetadata | undefined; + const variableName = metadata?.deepnote_variable_name || 'df'; + const spec = metadata?.deepnote_visualization_spec || {}; + const filters = metadata?.deepnote_chart_filter?.advancedFilters || []; + + // Create a clean JSON representation that users can edit + const config = { + variable: variableName, + spec: spec, + filters: filters + }; + + const jsonContent = JSON.stringify(config, null, 2); + const cell = new NotebookCellData(NotebookCellKind.Code, jsonContent, 'JSON'); + + return cell; + } + + getSupportedTypes(): string[] { + return ['visualization']; + } +} diff --git a/src/notebooks/deepnote/converters/visualizationBlockConverter.unit.test.ts b/src/notebooks/deepnote/converters/visualizationBlockConverter.unit.test.ts new file mode 100644 index 0000000000..db0936e11b --- /dev/null +++ b/src/notebooks/deepnote/converters/visualizationBlockConverter.unit.test.ts @@ -0,0 +1,311 @@ +import { assert } from 'chai'; +import { NotebookCellData, NotebookCellKind } from 'vscode'; + +import type { DeepnoteBlock } from '../deepnoteTypes'; +import { VisualizationBlockConverter } from './visualizationBlockConverter'; + +suite('VisualizationBlockConverter', () => { + let converter: VisualizationBlockConverter; + + setup(() => { + converter = new VisualizationBlockConverter(); + }); + + suite('canConvert and getSupportedTypes', () => { + test('returns true for visualization (case-insensitive) and false for other types', () => { + assert.isTrue(converter.canConvert('visualization')); + assert.isTrue(converter.canConvert('VISUALIZATION')); + assert.isTrue(converter.canConvert('Visualization')); + assert.isFalse(converter.canConvert('code')); + assert.isFalse(converter.canConvert('markdown')); + assert.deepStrictEqual(converter.getSupportedTypes(), ['visualization']); + }); + }); + + suite('convertToCell', () => { + test('converts block with full metadata to properly formatted JSON cell', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz1', + type: 'visualization', + content: '', + sortingKey: 'a0', + metadata: { + deepnote_variable_name: 'sales_data', + deepnote_visualization_spec: { + mark: 'bar', + encoding: { + x: { field: 'category', type: 'nominal' }, + y: { field: 'value', type: 'quantitative' } + } + }, + deepnote_chart_filter: { + advancedFilters: [ + { + column: 'status', + operator: 'is-equal', + comparativeValues: ['active'] + }, + { + column: 'age', + operator: 'greater-than', + comparativeValues: ['18'] + } + ] + } + } + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'JSON'); + assert.include(cell.value, '\n'); + assert.match(cell.value, /{\n "variable"/); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.variable, 'sales_data'); + assert.deepStrictEqual(config.spec, { + mark: 'bar', + encoding: { + x: { field: 'category', type: 'nominal' }, + y: { field: 'value', type: 'quantitative' } + } + }); + assert.strictEqual(config.filters.length, 2); + assert.strictEqual(config.filters[0].column, 'status'); + assert.strictEqual(config.filters[1].operator, 'greater-than'); + }); + + test('uses defaults when metadata is missing or empty', () => { + const blockWithEmptyMetadata: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz2', + type: 'visualization', + content: '', + sortingKey: 'a0', + metadata: {} + }; + + const blockWithNoMetadata: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz3', + type: 'visualization', + content: '', + sortingKey: 'a0' + }; + + const cell1 = converter.convertToCell(blockWithEmptyMetadata); + const config1 = JSON.parse(cell1.value); + assert.strictEqual(config1.variable, 'df'); + assert.deepStrictEqual(config1.spec, {}); + assert.deepStrictEqual(config1.filters, []); + + const cell2 = converter.convertToCell(blockWithNoMetadata); + const config2 = JSON.parse(cell2.value); + assert.strictEqual(config2.variable, 'df'); + assert.deepStrictEqual(config2.spec, {}); + assert.deepStrictEqual(config2.filters, []); + }); + }); + + suite('applyChangesToBlock', () => { + test('updates block metadata from valid JSON and clears content', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz1', + type: 'visualization', + content: 'old content', + sortingKey: 'a0', + metadata: { + other_field: 'should be preserved', + deepnote_chart_height: 500 + } + }; + + const cell = new NotebookCellData( + NotebookCellKind.Code, + JSON.stringify({ + variable: 'my_data', + spec: { mark: 'point' }, + filters: [ + { column: 'status', operator: 'is-equal', comparativeValues: ['active'] }, + { column: 'date', operator: 'between', comparativeValues: ['2023-01-01', '2023-12-31'] } + ] + }), + 'python' + ); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'my_data'); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, { mark: 'point' }); + assert.strictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters?.length, 2); + assert.strictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters?.[0].column, 'status'); + assert.strictEqual(block.metadata?.other_field, 'should be preserved'); + assert.strictEqual(block.metadata?.deepnote_chart_height, 500); + }); + + test('sets empty values for missing fields in JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz2', + type: 'visualization', + content: '', + sortingKey: 'a0', + metadata: { + deepnote_variable_name: 'existing_var', + deepnote_visualization_spec: { mark: 'line' }, + deepnote_chart_filter: { + advancedFilters: [{ column: 'old', operator: 'is-equal', comparativeValues: ['value'] }] + }, + other_field: 'preserved' + } + }; + + const cellWithOnlyVariable = new NotebookCellData( + NotebookCellKind.Code, + JSON.stringify({ variable: 'updated_var', spec: {}, filters: [] }), + 'python' + ); + converter.applyChangesToBlock(block, cellWithOnlyVariable); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'updated_var'); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, {}); + assert.deepStrictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters, []); + assert.strictEqual(block.metadata?.other_field, 'preserved'); + + const cellWithOnlySpec = new NotebookCellData( + NotebookCellKind.Code, + JSON.stringify({ variable: 'var2', spec: { mark: 'bar' }, filters: [] }), + 'python' + ); + converter.applyChangesToBlock(block, cellWithOnlySpec); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'var2'); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, { mark: 'bar' }); + assert.deepStrictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters, []); + }); + + test('creates metadata and chart_filter objects when they do not exist', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz3', + type: 'visualization', + content: '', + sortingKey: 'a0' + }; + + const cell = new NotebookCellData( + NotebookCellKind.Code, + JSON.stringify({ + variable: 'new_var', + spec: { mark: 'area' }, + filters: [{ column: 'category', operator: 'is-not-null', comparativeValues: [] }] + }), + 'python' + ); + + converter.applyChangesToBlock(block, cell); + + assert.isDefined(block.metadata); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'new_var'); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, { mark: 'area' }); + assert.isDefined(block.metadata?.deepnote_chart_filter); + assert.strictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters?.length, 1); + }); + + test('handles invalid, empty, and undefined JSON gracefully', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz4', + type: 'visualization', + content: '', + sortingKey: 'a0', + metadata: { + deepnote_variable_name: 'original', + deepnote_visualization_spec: { mark: 'original' }, + other_field: 'preserved' + } + }; + + const invalidCell = new NotebookCellData(NotebookCellKind.Code, 'not valid json {', 'python'); + assert.doesNotThrow(() => converter.applyChangesToBlock(block, invalidCell)); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'original'); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, { mark: 'original' }); + assert.strictEqual(block.metadata?.other_field, 'preserved'); + + const emptyCell = new NotebookCellData(NotebookCellKind.Code, '', 'python'); + converter.applyChangesToBlock(block, emptyCell); + assert.strictEqual(block.metadata?.deepnote_variable_name, ''); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, {}); + assert.deepStrictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters, []); + assert.strictEqual(block.metadata?.other_field, 'preserved'); + + const undefinedCell = new NotebookCellData(NotebookCellKind.Code, '', 'python'); + undefinedCell.value = undefined as unknown as string; + converter.applyChangesToBlock(block, undefinedCell); + assert.strictEqual(block.metadata?.deepnote_variable_name, ''); + assert.deepStrictEqual(block.metadata?.deepnote_visualization_spec, {}); + assert.deepStrictEqual(block.metadata?.deepnote_chart_filter?.advancedFilters, []); + assert.strictEqual(block.metadata?.other_field, 'preserved'); + }); + }); + + suite('round trip conversion', () => { + test('block -> cell -> block preserves data', () => { + const originalBlock: DeepnoteBlock = { + blockGroup: 'test-group', + id: 'viz1', + type: 'visualization', + content: '', + sortingKey: 'a0', + metadata: { + deepnote_variable_name: 'sales_data', + deepnote_visualization_spec: { + mark: 'bar', + encoding: { + x: { field: 'category', type: 'nominal' }, + y: { field: 'value', type: 'quantitative' } + } + }, + deepnote_chart_filter: { + advancedFilters: [ + { + column: 'status', + operator: 'is-equal', + comparativeValues: ['active'] + } + ] + }, + deepnote_chart_height: 400 + } + }; + + const cell = converter.convertToCell(originalBlock); + + const roundTripBlock: DeepnoteBlock = { + blockGroup: originalBlock.blockGroup, + id: originalBlock.id, + type: originalBlock.type, + content: originalBlock.content, + sortingKey: originalBlock.sortingKey, + metadata: { ...originalBlock.metadata } + }; + + converter.applyChangesToBlock(roundTripBlock, cell); + + assert.strictEqual( + roundTripBlock.metadata?.deepnote_variable_name, + originalBlock.metadata?.deepnote_variable_name + ); + assert.deepStrictEqual( + roundTripBlock.metadata?.deepnote_visualization_spec, + originalBlock.metadata?.deepnote_visualization_spec + ); + assert.deepStrictEqual( + roundTripBlock.metadata?.deepnote_chart_filter?.advancedFilters, + originalBlock.metadata?.deepnote_chart_filter?.advancedFilters + ); + }); + }); +}); diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 2759988fac..1567e91ab4 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -3,11 +3,17 @@ import { NotebookCellData, NotebookCellKind, NotebookCellOutput, NotebookCellOut import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes'; import { generateBlockId, generateSortingKey } from './dataConversionUtils'; import { ConverterRegistry } from './converters/converterRegistry'; +import { BlockConverter } from './converters/blockConverter'; import { CodeBlockConverter } from './converters/codeBlockConverter'; import { addPocketToCellMetadata, createBlockFromPocket } from './pocket'; import { MarkdownBlockConverter } from './converters/markdownBlockConverter'; +import { VisualizationBlockConverter } from './converters/visualizationBlockConverter'; +import { compile as convertVegaLiteSpecToVega } from 'vega-lite'; +import { produce } from 'immer'; import { SqlBlockConverter } from './converters/sqlBlockConverter'; import { TextBlockConverter } from './converters/textBlockConverter'; +import type { Field } from 'vega-lite/build/src/channeldef'; +import type { LayerSpec, TopLevel } from 'vega-lite/build/src/spec'; /** * Utility class for converting between Deepnote block structures and VS Code notebook cells. @@ -21,6 +27,16 @@ export class DeepnoteDataConverter { this.registry.register(new MarkdownBlockConverter()); this.registry.register(new SqlBlockConverter()); this.registry.register(new TextBlockConverter()); + this.registry.register(new VisualizationBlockConverter()); + } + + /** + * Finds a converter for the given block type. + * @param blockType The type of block to find a converter for + * @returns The converter if found, undefined otherwise + */ + public findConverter(blockType: string): BlockConverter | undefined { + return this.registry.findConverter(blockType); } /** @@ -67,6 +83,39 @@ export class DeepnoteDataConverter { }); } + convertCellToBlock(cell: NotebookCellData, index: number): DeepnoteBlock { + const block = createBlockFromPocket(cell, index); + + const converter = this.registry.findConverter(block.type); + + if (!converter) { + return this.createFallbackBlock(cell, index); + } + + converter.applyChangesToBlock(block, cell); + + // Convert VS Code outputs to Deepnote format + // Outputs are managed by VS Code natively, not stored in the pocket + // Preserve outputs when they exist (including newly produced outputs) + // Only set if not already set to avoid overwriting converter-managed outputs + const hadOutputs = cell.metadata?.__hadOutputs; + if (!block.outputs) { + // Set outputs if: + // 1. The cell has non-empty outputs, OR + // 2. The block originally had outputs (even if empty) + if ((cell.outputs && cell.outputs.length > 0) || hadOutputs) { + block.outputs = cell.outputs ? this.transformOutputsForDeepnote(cell.outputs) : []; + } + } + + // Clean up internal tracking flags from metadata + if (block.metadata && '__hadOutputs' in block.metadata) { + delete block.metadata.__hadOutputs; + } + + return block; + } + /** * Converts VS Code notebook cells back to Deepnote blocks. * Generates missing IDs and sorting keys as needed. @@ -74,38 +123,7 @@ export class DeepnoteDataConverter { * @returns Array of Deepnote blocks */ convertCellsToBlocks(cells: NotebookCellData[]): DeepnoteBlock[] { - return cells.map((cell, index) => { - const block = createBlockFromPocket(cell, index); - - const converter = this.registry.findConverter(block.type); - - if (!converter) { - return this.createFallbackBlock(cell, index); - } - - converter.applyChangesToBlock(block, cell); - - // Convert VS Code outputs to Deepnote format - // Outputs are managed by VS Code natively, not stored in the pocket - // Preserve outputs when they exist (including newly produced outputs) - // Only set if not already set to avoid overwriting converter-managed outputs - const hadOutputs = cell.metadata?.__hadOutputs; - if (!block.outputs) { - // Set outputs if: - // 1. The cell has non-empty outputs, OR - // 2. The block originally had outputs (even if empty) - if ((cell.outputs && cell.outputs.length > 0) || hadOutputs) { - block.outputs = cell.outputs ? this.transformOutputsForDeepnote(cell.outputs) : []; - } - } - - // Clean up internal tracking flags from metadata - if (block.metadata && '__hadOutputs' in block.metadata) { - delete block.metadata.__hadOutputs; - } - - return block; - }); + return cells.map((cell, index) => this.convertCellToBlock(cell, index)); } private base64ToUint8Array(base64: string): Uint8Array { @@ -200,6 +218,8 @@ export class DeepnoteDataConverter { data['application/vnd.deepnote.dataframe.v3+json'] = JSON.parse( new TextDecoder().decode(item.data) ); + } else if (item.mime === 'application/vnd.vega.v5+json') { + data['application/vnd.vega.v5+json'] = JSON.parse(new TextDecoder().decode(item.data)); } } @@ -276,6 +296,35 @@ export class DeepnoteDataConverter { ); } + if (data['application/vnd.vega.v5+json']) { + items.push( + NotebookCellOutputItem.json( + data['application/vnd.vega.v5+json'], + 'application/vnd.vega.v5+json' + ) + ); + } + + if (data['application/vnd.vegalite.v5+json']) { + const patchedVegaLiteSpec = produce( + data['application/vnd.vegalite.v5+json'] as TopLevel>, + (draft) => { + draft.height = 'container'; + draft.width = 'container'; + + draft.autosize = { + type: 'fit' + }; + if (!draft.config) { + draft.config = {}; + } + draft.config.customFormatTypes = true; + } + ); + const vegaSpec = convertVegaLiteSpecToVega(patchedVegaLiteSpec).spec; + items.push(NotebookCellOutputItem.json(vegaSpec, 'application/vnd.vega.v5+json')); + } + if (data['application/json']) { items.push(NotebookCellOutputItem.json(data['application/json'], 'application/json')); } diff --git a/src/platform/common/constants.ts b/src/platform/common/constants.ts index 3217b95cc4..33c0dac054 100644 --- a/src/platform/common/constants.ts +++ b/src/platform/common/constants.ts @@ -125,6 +125,7 @@ export const LanguagesSupportedByPythonkernel = [ 'sql', // %%sql 'perl', // %%perl 'qsharp', // %%qsharp + 'JSON', //JSON cells for custom block types 'raw' // raw cells (no formatting) ]; export const jupyterLanguageToMonacoLanguageMapping = new Map([ diff --git a/src/webviews/webview-side/vega-renderer/VegaRenderer.tsx b/src/webviews/webview-side/vega-renderer/VegaRenderer.tsx new file mode 100644 index 0000000000..8077285108 --- /dev/null +++ b/src/webviews/webview-side/vega-renderer/VegaRenderer.tsx @@ -0,0 +1,45 @@ +import { chartColors10, chartColors20, deepnoteBlues } from './colors'; +import React, { memo, useLayoutEffect } from 'react'; +import { Vega } from 'react-vega'; +import { vega } from 'vega-embed'; + +import { numberFormats } from './number-formats'; + +export interface VegaRendererProps { + spec: Record; + renderer?: 'svg' | 'canvas'; +} + +export const VegaRenderer = memo(function VegaRenderer(props: VegaRendererProps) { + const { renderer, spec } = props; + + useLayoutEffect(function registerCustomVegaConfigsOnce() { + if (vega.expressionFunction('numberFormatFromNumberType')) { + return; + } + + vega.expressionFunction( + 'numberFormatFromNumberType', + (value: number, params: { type: string; decimals: number | null }) => { + // NOTE: default params.type to "default" value to ensure that eg "Sum of" labels are displayed in custom tooltip + return numberFormats[params?.type ?? 'default']?.formatter(value, params?.decimals); + } + ); + + vega.scheme('deepnote10', chartColors10); + vega.scheme('deepnote20', chartColors20); + vega.scheme('deepnote_blues', deepnoteBlues); + }, []); + + return ( + + ); +}); diff --git a/src/webviews/webview-side/vega-renderer/colors.ts b/src/webviews/webview-side/vega-renderer/colors.ts new file mode 100644 index 0000000000..9f95ff2a1c --- /dev/null +++ b/src/webviews/webview-side/vega-renderer/colors.ts @@ -0,0 +1,38 @@ +export const chartColors10 = [ + '#2266D3', + '#CC8BFF', + '#0E9384', + '#8DCA4C', + '#F9732C', + '#C8338A', + '#EEC026', + '#61646C', + '#4E2B89', + '#6E7BA4' +] as const; + +// this 20-color palette has the same colors as the 10-color one, but with an extra color inserted at every second position +export const chartColors20 = [ + '#2266D3', + '#83AFF6', + '#CC8BFF', + '#8018D3', + '#0E9384', + '#5FD9C3', + '#8DCA4C', + '#BDEB92', + '#F9732C', + '#FEBD89', + '#C8338A', + '#EEB7DD', + '#EEC026', + '#F8E996', + '#61646C', + '#CECFD2', + '#4E2B89', + '#BFC6E1', + '#6E7BA4', + '#B8ABF1' +] as const; + +export const deepnoteBlues = ['#D1E0FF', '#2266D3', '#07419D']; diff --git a/src/webviews/webview-side/vega-renderer/index.ts b/src/webviews/webview-side/vega-renderer/index.ts new file mode 100644 index 0000000000..7212aef95c --- /dev/null +++ b/src/webviews/webview-side/vega-renderer/index.ts @@ -0,0 +1,58 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; +import { VegaRenderer } from './VegaRenderer'; + +interface Metadata { + cellId?: string; + cellIndex?: number; + executionCount?: number; + outputType?: string; +} + +/** + * Renderer for Vega charts (application/vnd.vega.v5+json). + */ +export const activate: ActivationFunction = (_context: RendererContext) => { + const elementsCache: Record = {}; + return { + renderOutputItem(outputItem: OutputItem, element: HTMLElement) { + console.log(`Vega renderer - rendering output item: ${outputItem.id}`); + try { + const spec = outputItem.json(); + + console.log(`Vega renderer - received spec with ${Object.keys(spec).length} keys`); + + const metadata = outputItem.metadata as Metadata | undefined; + + console.log('[VegaRenderer] Full metadata', metadata); + + const root = document.createElement('div'); + root.style.height = '500px'; + + element.appendChild(root); + elementsCache[outputItem.id] = root; + ReactDOM.render( + React.createElement(VegaRenderer, { + spec: spec + }), + root + ); + } catch (error) { + console.error(`Error rendering Vega chart: ${error}`); + const errorDiv = document.createElement('div'); + errorDiv.style.padding = '10px'; + errorDiv.style.color = 'var(--vscode-errorForeground)'; + errorDiv.textContent = `Error rendering chart: ${error}`; + element.appendChild(errorDiv); + } + }, + + disposeOutputItem(id?: string) { + if (id && elementsCache[id]) { + ReactDOM.unmountComponentAtNode(elementsCache[id]); + elementsCache[id] = undefined; + } + } + }; +}; diff --git a/src/webviews/webview-side/vega-renderer/number-formats.ts b/src/webviews/webview-side/vega-renderer/number-formats.ts new file mode 100644 index 0000000000..b865050c25 --- /dev/null +++ b/src/webviews/webview-side/vega-renderer/number-formats.ts @@ -0,0 +1,17 @@ +import { format } from 'd3-format'; + +export const numberFormats: Record< + string, + { + label: string; + formatter: (value: number | null, decimals: number | null) => string | null; + } +> = { + default: { label: 'Default', formatter: (value) => value?.toString() ?? null }, + number: { label: 'Number', formatter: (value, decimals) => (value ? format(`.${decimals ?? 2}f`)(value) : null) }, + scientific: { + label: 'Scientific', + formatter: (value, decimals) => (value ? format(`.${decimals ?? 2}e`)(value) : null) + }, + percent: { label: 'Percent', formatter: (value, decimals) => (value ? format(`.${decimals ?? 0}%`)(value) : null) } +};