From b148af5e911bc5377f80f1d5d8eb2a4dd0763a26 Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sat, 16 Nov 2024 12:49:15 -0500 Subject: [PATCH] Release 2.0.0-rc1 (#546) * standardize on "comm_plan" * Add jupyter widget features section * image * Add 2.0 release post * bump version to 2.0.0-rc1 --- Cargo.lock | 12 +- docs/source/_static/widget_output.svg | 1 + docs/source/features/features.md | 1 + docs/source/features/jupyter_widget.md | 162 ++++++++++++++++++ .../posts/2024/2024-11-13_Release_2.0.0.md | 43 ++++- examples/python-examples/chart_state.py | 2 +- vegafusion-common/Cargo.toml | 2 +- vegafusion-core/Cargo.toml | 4 +- vegafusion-python/Cargo.toml | 8 +- vegafusion-python/pyproject.toml | 10 +- vegafusion-python/src/lib.rs | 6 +- .../vegafusion/jupyter/__init__.py | 14 +- vegafusion-python/vegafusion/runtime.py | 27 ++- vegafusion-runtime/Cargo.toml | 6 +- vegafusion-server/Cargo.toml | 8 +- vegafusion-wasm/Cargo.toml | 8 +- vegafusion-wasm/package-lock.json | 2 +- vegafusion-wasm/package.json | 2 +- 18 files changed, 271 insertions(+), 47 deletions(-) create mode 100644 docs/source/_static/widget_output.svg create mode 100644 docs/source/features/jupyter_widget.md diff --git a/Cargo.lock b/Cargo.lock index 7c82d61b..c5dc64a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4525,7 +4525,7 @@ dependencies = [ [[package]] name = "vegafusion" -version = "2.0.0-a0" +version = "2.0.0-rc1" dependencies = [ "arrow", "async-trait", @@ -4549,7 +4549,7 @@ dependencies = [ [[package]] name = "vegafusion-common" -version = "2.0.0-a0" +version = "2.0.0-rc1" dependencies = [ "ahash", "arrow", @@ -4574,7 +4574,7 @@ dependencies = [ [[package]] name = "vegafusion-core" -version = "2.0.0-a0" +version = "2.0.0-rc1" dependencies = [ "ahash", "async-trait", @@ -4607,7 +4607,7 @@ dependencies = [ [[package]] name = "vegafusion-runtime" -version = "2.0.0-a0" +version = "2.0.0-rc1" dependencies = [ "async-lock", "async-mutex", @@ -4663,7 +4663,7 @@ dependencies = [ [[package]] name = "vegafusion-server" -version = "2.0.0-a0" +version = "2.0.0-rc1" dependencies = [ "assert_cmd", "clap 4.5.20", @@ -4687,7 +4687,7 @@ dependencies = [ [[package]] name = "vegafusion-wasm" -version = "2.0.0-a0" +version = "2.0.0-rc1" dependencies = [ "async-trait", "chrono", diff --git a/docs/source/_static/widget_output.svg b/docs/source/_static/widget_output.svg new file mode 100644 index 00000000..7e05e7bf --- /dev/null +++ b/docs/source/_static/widget_output.svg @@ -0,0 +1 @@ +050100150200Horsepower05101520253035404550Miles_per_Gallon10203040Count \ No newline at end of file diff --git a/docs/source/features/features.md b/docs/source/features/features.md index bdc789d4..7c7ed791 100644 --- a/docs/source/features/features.md +++ b/docs/source/features/features.md @@ -15,5 +15,6 @@ chart_state inline_datasets grpc embed +jupyter_widget vega-lite ``` diff --git a/docs/source/features/jupyter_widget.md b/docs/source/features/jupyter_widget.md new file mode 100644 index 00000000..87941b06 --- /dev/null +++ b/docs/source/features/jupyter_widget.md @@ -0,0 +1,162 @@ +# Jupyter Widget +The `VegaFusionWidget` is a Jupyter widget for rendering Vega specs backed by VegaFusion. It is based on [AnyWidget](https://github.com/manzt/anywidget), and is compatible with a wide range of Jupyter-based environments. + +:::{note} +The `VegaFusionWidget` is only compatible with Vega specifications, not with Vega-Lite. For Vega-Lite, either use the [JupyterChart](https://altair-viz.github.io/user_guide/jupyter_chart.html) widget from the Vega-Altair project, or convert the Vega-Lite spec to Vega using [vl-convert](https://github.com/vega/vl-convert). +::: + +## Construction +Construct a VegaFusionWidget from a Vega specification dictionary: + +```python +import vegafusion as vf +import json +from vegafusion.jupyter import VegaFusionWidget + +vega_spec = json.loads(r""" +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "description": "A binned scatter plot example showing aggregate counts per binned cell.", + "width": 200, + "height": 200, + "padding": 5, + "autosize": "pad", + + "data": [ + { + "name": "source", + "url": "data/cars.json", + "transform": [ + { + "type": "filter", + "expr": "datum['Horsepower'] != null && datum['Miles_per_Gallon'] != null && datum['Acceleration'] != null" + } + ] + }, + { + "name": "summary", + "source": "source", + "transform": [ + { + "type": "extent", "field": "Horsepower", + "signal": "hp_extent" + }, + { + "type": "bin", "field": "Horsepower", "maxbins": 10, + "extent": {"signal": "hp_extent"}, + "as": ["hp0", "hp1"] + }, + { + "type": "extent", "field": "Miles_per_Gallon", + "signal": "mpg_extent" + }, + { + "type": "bin", "field": "Miles_per_Gallon", "maxbins": 10, + "extent": {"signal": "mpg_extent"}, + "as": ["mpg0", "mpg1"] + }, + { + "type": "aggregate", + "groupby": ["hp0", "hp1", "mpg0", "mpg1"] + } + ] + } + ], + + "scales": [ + { + "name": "x", + "type": "linear", + "round": true, + "nice": true, + "zero": true, + "domain": {"data": "source", "field": "Horsepower"}, + "range": "width" + }, + { + "name": "y", + "type": "linear", + "round": true, + "nice": true, + "zero": true, + "domain": {"data": "source", "field": "Miles_per_Gallon"}, + "range": "height" + }, + { + "name": "size", + "type": "linear", + "zero": true, + "domain": {"data": "summary", "field": "count"}, + "range": [0,360] + } + ], + + "axes": [ + { + "scale": "x", + "grid": true, + "domain": false, + "orient": "bottom", + "tickCount": 5, + "title": "Horsepower" + }, + { + "scale": "y", + "grid": true, + "domain": false, + "orient": "left", + "titlePadding": 5, + "title": "Miles_per_Gallon" + } + ], + + "legends": [ + { + "size": "size", + "title": "Count", + "format": "s", + "symbolFillColor": "#4682b4", + "symbolStrokeColor": "transparent", + "symbolType": "circle" + } + ], + + "marks": [ + { + "name": "marks", + "type": "symbol", + "from": {"data": "summary"}, + "encode": { + "update": { + "x": {"scale": "x", "signal": "(datum.hp0 + datum.hp1) / 2"}, + "y": {"scale": "y", "signal": "(datum.mpg0 + datum.mpg1) / 2"}, + "size": {"scale": "size", "field": "count"}, + "shape": {"value": "circle"}, + "fill": {"value": "#4682b4"} + } + } + } + ] +} +""") +VegaFusionWidget(vega_spec) +``` + +Screen Shot 2022-01-10 at 10 03 15 AM + + +## Debouncing +The `VegaFusionWidget` provides configurable [debouncing](https://css-tricks.com/debouncing-throttling-explained-examples/) to control how frequently user interaction updates are sent from the browser to the Python kernel. + +The widget's `debounce_wait` and `debounce_max_wait` properties correspond to the `wait` and `max_wait` properties of the [lodash debounce](https://lodash.com/docs/#debounce) function. VegaFusion uses sensible defaults (`debounce_wait` of 30ms and `debounce_max_wait` of 60ms), but it can be useful to increase the default values to handle interactions on large datasets. + +## Planner Results +The `VegaFusionWidget` also supports displaying the results of the planner. See [How it Works](../about/how_it_works.md) for more details. + +The following properties are available: + + - `widget.spec`: This is the original Vega specification + - `widget.transformed_spec`: This is the initial transformed Vega specification produced by VegaFusion + - `widget.server_spec`: This is the portion of the full Vega spec that was planned to run on the server (The Python kernel in this case) + - `widget.client_spec`: This is the portion of the full Vega spec that was planned to run on the client and be rendered by the Vega JavaScript Library. + - `widget.comm_plan`: This is the specification of which signals and datasets must be transfered between the client and server in order to preserve the interactive behavior of the original specification. diff --git a/docs/source/posts/2024/2024-11-13_Release_2.0.0.md b/docs/source/posts/2024/2024-11-13_Release_2.0.0.md index d3a98f48..7c981e4e 100644 --- a/docs/source/posts/2024/2024-11-13_Release_2.0.0.md +++ b/docs/source/posts/2024/2024-11-13_Release_2.0.0.md @@ -5,18 +5,55 @@ author: Jon Mease --- # VegaFusion 2.0 -**A new era: Building blocks for scaling Vega visualizations:** +**A new era: Building blocks for analyzing, accelerating, andscaling Vega visualizations:** By: Jon Mease --- -Details to follow... +The VegaFusion team is excited to announce the release of VegaFusion 2.0. This major release represents a significant evolution in VegaFusion's architecture and target audience. The focus has been on simplification - making VegaFusion easier to maintain and easier to integrate into larger Vega systems to accelerate and scale Vega visualizations. + +## Modernized Rust Core +The core Rust implementation has been significantly simplified by taking advantage of modern DataFusion functionality: + + - New `get_column_usage()` utility function for analyzing the column dependencies of datasets in a Vega spec. + - Custom User Defined Functions (UDFs) have been largely replaced with DataFusion's native capabilities. + - Vega transforms are now implemented directly against the DataFusion DataFrame API, rather than using the circuitous SQL generation approach of VegaFusion 1. + - Updated to DataFusion 43 and Arrow 52.3 for improved performance and bug fixes. + +## JavaScript / WebAssembly +The JavaScript integration has been simplified while maintaining full functionality: + - Removed the separate `vegafusion-embed` package as the `vegafusion-wasm` package now renders charts using vega-embed. + - The full VegaFusion runtime is now compiled to WebAssembly as part of the `vegafusion-wasm` pacakge, making it possible to run VegaFusion entirely in the browser without requiring an external server. + - Connecting to external VegaFusion servers via gRPC-Web remains supported. + +## Python: Removal of Upstreamed Vega-Altair Integration +All the VegaFusion 1.x logic for integrating with Vega-Altair has been upstreamed into the Vega-Altair project itself. So this functionality has been removed in VegaFusion 2.0. + +In particular: + - To use VegaFusion with Vega-Altair, activate the [`"vegafusion"` data transformer](https://altair-viz.github.io/user_guide/large_datasets.html#vegafusion-data-transformer). + - The `vegafusion-jupyter` package has been retired in favor of using Altair's built-in `JupyterChart` for Altair charts and Vega-Lite specs. For Vega specs, the new [AnyWidget](https://anywidget.dev/)-based `VegaFusionWidget` is included in the `vegafusion` package. + - `vf.enable()` has been removed. Instead, use the `"vegafusion"` data transformer along with any of Altair's built-in renderers + - `vf.save()` has been removed. Instead, use Altair's native `chart.save()` method with the `"vegafusion"` data transformer enabeld. + - `vf.transformed_data()` has been removed. Instead, use Altair's native `chart.transformed_data()` method. + +## Python: Enhanced DataFrame Compatibility +VegaFusion 2.0 brings improved DataFrame compatibility: + - Support for any [Narwhals](https://narwhals-dev.github.io/narwhals/)-compatible DataFrame type as inline datasets. + - Zero-copy sharing of Arrow data from Polars to VegaFusion's DataFusion runtime is now supported thanks to the [arro3](https://github.com/kylebarron/arro3) project.. + - The DuckDB SQL connection has been removed, but DuckDB relations are now directly supported as inline datasets, with automatic column pruning prior to conversion to Arrow. + - Reduced Python dependencies. VegaFusion now requires only [`arrow3-core`](https://pypi.org/project/arro3-core/), [`packaging`](https://pypi.org/project/packaging/), and [`narwhals`](https://pypi.org/project/narwhals/). In particular, `pyarrow` and `pandas` are no longer required dependencies. + +## New Documentation +VegaFusion 2.0 launches with completely revamped documentation: + - New PyData Sphinx theme at [vegafusion.io](http://vegafusion.io/v2/) + - Standalone examples in Python and Rust + - Comprehensive support tables for Vega transforms and expressions ## Learn more Check out these resources to learn more: - [2.0.0 Changelog](https://github.com/hex-inc/vegafusion/releases/tag/v2.0.0) - - [VegaFusion Documentation](https://vegafusion.io/) + - [VegaFusion Documentation](https://vegafusion.io/v2) - [VegaFusion GitHub](https://github.com/hex-inc/vegafusion) - [Report and Issue](https://github.com/hex-inc/vegafusion/issues) - [Start a Discussions](https://github.com/hex-inc/vegafusion/discussions) \ No newline at end of file diff --git a/examples/python-examples/chart_state.py b/examples/python-examples/chart_state.py index fc150d3e..722fd98e 100644 --- a/examples/python-examples/chart_state.py +++ b/examples/python-examples/chart_state.py @@ -16,7 +16,7 @@ def main(): # Get the watch plan, which includes which signals and data variables that should be listened to # and relayed from the displayed vega chart back to the chart state. - watch_plan = chart_state.get_watch_plan() + watch_plan = chart_state.get_comm_plan() print("Watch Plan:\n" + json.dumps(watch_plan, indent=2), end="\n\n") # Report an update to the maxbins signal. Update will return the signal and dataset updates that should diff --git a/vegafusion-common/Cargo.toml b/vegafusion-common/Cargo.toml index 348e2ccd..9029f3b5 100644 --- a/vegafusion-common/Cargo.toml +++ b/vegafusion-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vegafusion-common" -version = "2.0.0-a0" +version = "2.0.0-rc1" edition = "2021" description = "Common components required by multiple VegaFusion crates" license = "BSD-3-Clause" diff --git a/vegafusion-core/Cargo.toml b/vegafusion-core/Cargo.toml index 279bf32e..9b8c73bd 100644 --- a/vegafusion-core/Cargo.toml +++ b/vegafusion-core/Cargo.toml @@ -2,7 +2,7 @@ name = "vegafusion-core" license = "BSD-3-Clause" edition = "2021" -version = "2.0.0-a0" +version = "2.0.0-rc1" description = "Core components required by multiple VegaFusion crates, with WASM compatibility" [features] @@ -51,7 +51,7 @@ features = ["preserve_order"] [dependencies.vegafusion-common] path = "../vegafusion-common" features = ["json", "sqlparser"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.datafusion-common] workspace = true diff --git a/vegafusion-python/Cargo.toml b/vegafusion-python/Cargo.toml index bb56dc5e..b867dc77 100644 --- a/vegafusion-python/Cargo.toml +++ b/vegafusion-python/Cargo.toml @@ -2,7 +2,7 @@ name = "vegafusion" license = "BSD-3-Clause" edition = "2021" -version = "2.0.0-a0" +version = "2.0.0-rc1" description = "VegaFusion Python interface" [lib] @@ -47,16 +47,16 @@ workspace = true [dependencies.vegafusion-common] path = "../vegafusion-common" features = ["pyo3", "base64"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-core] path = "../vegafusion-core" features = ["py", "tonic_support"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-runtime] path = "../vegafusion-runtime" -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.tokio] workspace = true diff --git a/vegafusion-python/pyproject.toml b/vegafusion-python/pyproject.toml index cb07e310..f02511bf 100644 --- a/vegafusion-python/pyproject.toml +++ b/vegafusion-python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "vegafusion" -version = "2.0.0-a0" +version = "2.0.0-rc1" description = "Core tools for using VegaFusion from Python" readme = "README.md" requires-python = ">=3.9" @@ -30,10 +30,8 @@ Homepage = "https://vegafusion.io" Repository = "https://github.com/hex-inc/vegafusion" Documentation = "https://vegafusion.io" -[tool.maturin] -module-name = "vegafusion._vegafusion" - [project.optional-dependencies] -# For backward compatibility with older versions that used this extra to -# install vegafusion-python-embed embed = [] + +[tool.maturin] +module-name = "vegafusion._vegafusion" diff --git a/vegafusion-python/src/lib.rs b/vegafusion-python/src/lib.rs index 540dde51..ff797b7c 100644 --- a/vegafusion-python/src/lib.rs +++ b/vegafusion-python/src/lib.rs @@ -127,9 +127,9 @@ impl PyChartState { } /// Get ChartState's watch plan - pub fn get_watch_plan(&self, py: Python) -> PyResult { - let watch_plan = WatchPlan::from(self.state.get_comm_plan().clone()); - Ok(pythonize(py, &watch_plan)?.into()) + pub fn get_comm_plan(&self, py: Python) -> PyResult { + let comm_plan = WatchPlan::from(self.state.get_comm_plan().clone()); + Ok(pythonize(py, &comm_plan)?.into()) } /// Get list of transform warnings diff --git a/vegafusion-python/vegafusion/jupyter/__init__.py b/vegafusion-python/vegafusion/jupyter/__init__.py index 59689695..78e00294 100644 --- a/vegafusion-python/vegafusion/jupyter/__init__.py +++ b/vegafusion-python/vegafusion/jupyter/__init__.py @@ -31,6 +31,11 @@ class VegaFusionWidget(anywidget.AnyWidget): # Public traitlets spec = traitlets.Dict(allow_none=True) transformed_spec = traitlets.Dict(allow_none=True).tag(sync=True) + server_spec = traitlets.Dict(allow_none=True).tag(sync=False) + client_spec = traitlets.Dict(allow_none=True).tag(sync=False) + comm_plan = traitlets.Dict(allow_none=True).tag(sync=False) + warnings = traitlets.Dict(allow_none=True).tag(sync=False) + inline_datasets = traitlets.Dict(default_value=None, allow_none=True) debounce_wait = traitlets.Float(default_value=10).tag(sync=True) max_wait = traitlets.Bool(default_value=True).tag(sync=True) @@ -156,6 +161,10 @@ def _on_change_spec(self, change: dict[str, Any]) -> None: # Clear state with self.hold_sync(): self.transformed_spec = None + self.server_spec = None + self.client_spec = None + self.comm_plan = None + self.warnings = None self._chart_state = None self._js_watch_plan = None return @@ -220,10 +229,13 @@ def _init_chart_state(self, local_tz: str) -> None: ) # Get the watch plan and transformed spec - self._js_watch_plan = self._chart_state.get_watch_plan()[ + self._js_watch_plan = self._chart_state.get_comm_plan()[ "client_to_server" ] self.transformed_spec = self._chart_state.get_transformed_spec() + self.server_spec = self._chart_state.get_server_spec() + self.client_spec = self._chart_state.get_client_spec() + self.comm_plan = self._chart_state.get_comm_plan() self.warnings = self._chart_state.get_warnings() diff --git a/vegafusion-python/vegafusion/runtime.py b/vegafusion-python/vegafusion/runtime.py index 63e4b50c..840b9d7f 100644 --- a/vegafusion-python/vegafusion/runtime.py +++ b/vegafusion-python/vegafusion/runtime.py @@ -68,15 +68,15 @@ class VariableUpdate(TypedDict): value: Any -class Watch(TypedDict): +class Variable(TypedDict): name: str namespace: Literal["data", "signal"] scope: list[int] -class WatchPlan(TypedDict): - client_to_server: list[Watch] - server_to_client: list[Watch] +class CommPlan(TypedDict): + client_to_server: list[Variable] + server_to_client: list[Variable] class PreTransformWarning(TypedDict): @@ -103,16 +103,29 @@ def update(self, client_updates: list[VariableUpdate]) -> list[VariableUpdate]: """ return cast(list[VariableUpdate], self._chart_state.update(client_updates)) - def get_watch_plan(self) -> WatchPlan: + def get_comm_plan(self) -> CommPlan: """ - Get ChartState's watch plan. + Get ChartState's communication plan. Returns: WatchPlan specifying the signals and datasets that should be communicated between ChartState and client to preserve the input Vega spec's interactivity. """ - return cast(WatchPlan, self._chart_state.get_watch_plan()) + return cast(CommPlan, self._chart_state.get_comm_plan()) + + def get_watch_plan(self) -> CommPlan: + """ + Get ChartState's communication plan. + + Alias for get_comm_plan() for backwards compatibility. + + Returns: + WatchPlan specifying the signals and datasets that should be communicated + between ChartState and client to preserve the input Vega spec's + interactivity. + """ + return self.get_comm_plan() def get_transformed_spec(self) -> dict[str, Any]: """ diff --git a/vegafusion-runtime/Cargo.toml b/vegafusion-runtime/Cargo.toml index 12b5ad5e..549784c9 100644 --- a/vegafusion-runtime/Cargo.toml +++ b/vegafusion-runtime/Cargo.toml @@ -6,7 +6,7 @@ harness = false name = "vegafusion-runtime" license = "BSD-3-Clause" edition = "2021" -version = "2.0.0-a0" +version = "2.0.0-rc1" description = "VegaFusion Runtime" [features] @@ -100,12 +100,12 @@ workspace = true [dependencies.vegafusion-common] path = "../vegafusion-common" features = ["json", "sqlparser", "prettyprint", "object_store", "url"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-core] path = "../vegafusion-core" features = ["sqlparser"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.serde] version = "1.0.137" diff --git a/vegafusion-server/Cargo.toml b/vegafusion-server/Cargo.toml index 31fff45d..e7c31141 100644 --- a/vegafusion-server/Cargo.toml +++ b/vegafusion-server/Cargo.toml @@ -5,7 +5,7 @@ path = "src/main.rs" [package] name = "vegafusion-server" license = "BSD-3-Clause" -version = "2.0.0-a0" +version = "2.0.0-rc1" edition = "2021" description = "VegaFusion Server" repository = "https://github.com/vega/vegafusion" @@ -31,16 +31,16 @@ workspace = true [dependencies.vegafusion-common] path = "../vegafusion-common" -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-core] path = "../vegafusion-core" features = ["tonic_support"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-runtime] path = "../vegafusion-runtime" -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.tokio] workspace = true diff --git a/vegafusion-wasm/Cargo.toml b/vegafusion-wasm/Cargo.toml index 5be02773..d5bca930 100644 --- a/vegafusion-wasm/Cargo.toml +++ b/vegafusion-wasm/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "vegafusion-wasm" license = "BSD-3-Clause" -version = "2.0.0-a0" +version = "2.0.0-rc1" edition = "2021" description = "VegaFusion WASM package for embedding Vega charts in the browser with a connection to a VegaFusion Runtime" @@ -33,15 +33,15 @@ workspace = true [dependencies.vegafusion-common] path = "../vegafusion-common" features = ["json"] -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-core] path = "../vegafusion-core" -version = "2.0.0-a0" +version = "2.0.0-rc1" [dependencies.vegafusion-runtime] path = "../vegafusion-runtime" -version = "2.0.0-a0" +version = "2.0.0-rc1" default-features = false features = ["http-wasm"] diff --git a/vegafusion-wasm/package-lock.json b/vegafusion-wasm/package-lock.json index edbc1cef..d781047a 100644 --- a/vegafusion-wasm/package-lock.json +++ b/vegafusion-wasm/package-lock.json @@ -1,6 +1,6 @@ { "name": "vegafusion-wasm", - "version": "2.0.0-a0", + "version": "2.0.0-rc1", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/vegafusion-wasm/package.json b/vegafusion-wasm/package.json index 8e48ad03..27d9bd29 100644 --- a/vegafusion-wasm/package.json +++ b/vegafusion-wasm/package.json @@ -1,6 +1,6 @@ { "name": "vegafusion-wasm", - "version": "2.0.0-a0", + "version": "2.0.0-rc1", "author": "Jon Mease (https://jonmmease.dev)", "license": "BSD-3-Clause", "description": "Wasm library for interfacing with VegaFusion",