diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dedb920..369d3e61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,54 @@ pip install jupytercad-freecad +## 3.0.0a5 + +([Full Changelog](https://github.com/jupytercad/JupyterCAD/compare/v3.0.0a4...8d0b77fa32ef01ed2b3d7f1d6f806aef3577c18f)) + +### Enhancements made + +- Improve selection logic [#542](https://github.com/jupytercad/JupyterCAD/pull/542) ([@martinRenou](https://github.com/martinRenou)) +- Object properties panel: Use selected object name as the title [#540](https://github.com/jupytercad/JupyterCAD/pull/540) ([@martinRenou](https://github.com/martinRenou)) +- ClipPlane: fix z-fighting artifacts [#539](https://github.com/jupytercad/JupyterCAD/pull/539) ([@martinRenou](https://github.com/martinRenou)) +- Set visible back to True for operator inputs upon removal of the output [#534](https://github.com/jupytercad/JupyterCAD/pull/534) ([@martinRenou](https://github.com/martinRenou)) +- Allow opening JupyterCAD documents with the JSON viewer + Allow opening STL and STEP in JupyterLite [#531](https://github.com/jupytercad/JupyterCAD/pull/531) ([@martinRenou](https://github.com/martinRenou)) +- Grey icon in tabs [#527](https://github.com/jupytercad/JupyterCAD/pull/527) ([@martinRenou](https://github.com/martinRenou)) +- Reorder toolbar icons [#522](https://github.com/jupytercad/JupyterCAD/pull/522) ([@arjxn-py](https://github.com/arjxn-py)) +- Update main logo [#520](https://github.com/jupytercad/JupyterCAD/pull/520) ([@martinRenou](https://github.com/martinRenou)) +- JupyterCAD icons to left and right tabs [#519](https://github.com/jupytercad/JupyterCAD/pull/519) ([@martinRenou](https://github.com/martinRenou)) + +### Bugs fixed + +- Re-add `setColor` api [#552](https://github.com/jupytercad/JupyterCAD/pull/552) ([@arjxn-py](https://github.com/arjxn-py)) +- Prevent getting back to non-wireframe after operator [#549](https://github.com/jupytercad/JupyterCAD/pull/549) ([@arjxn-py](https://github.com/arjxn-py)) +- Fix ui issues [#548](https://github.com/jupytercad/JupyterCAD/pull/548) ([@trungleduc](https://github.com/trungleduc)) +- Fix clip plane controls when switching camera projection [#538](https://github.com/jupytercad/JupyterCAD/pull/538) ([@martinRenou](https://github.com/martinRenou)) +- Revert "Orthographic camera: fix missing near and far parameters" [#536](https://github.com/jupytercad/JupyterCAD/pull/536) ([@martinRenou](https://github.com/martinRenou)) +- Fix context switching for the right panel [#533](https://github.com/jupytercad/JupyterCAD/pull/533) ([@martinRenou](https://github.com/martinRenou)) +- Update CAD app to include missing collaboration tokens [#530](https://github.com/jupytercad/JupyterCAD/pull/530) ([@martinRenou](https://github.com/martinRenou)) +- Set collaborative attribute to False in Jupyterlite [#525](https://github.com/jupytercad/JupyterCAD/pull/525) ([@martinRenou](https://github.com/martinRenou)) +- Cleanup and fix SVG logo [#523](https://github.com/jupytercad/JupyterCAD/pull/523) ([@martinRenou](https://github.com/martinRenou)) +- Fix bounding box on exploded view [#521](https://github.com/jupytercad/JupyterCAD/pull/521) ([@arjxn-py](https://github.com/arjxn-py)) +- Fix handling of theme change [#505](https://github.com/jupytercad/JupyterCAD/pull/505) ([@arjxn-py](https://github.com/arjxn-py)) + +### Maintenance and upkeep improvements + +- Bump jupyter-collaboration v3 [#553](https://github.com/jupytercad/JupyterCAD/pull/553) ([@trungleduc](https://github.com/trungleduc)) +- Unpin jupyterlite-xeus in lite build [#541](https://github.com/jupytercad/JupyterCAD/pull/541) ([@martinRenou](https://github.com/martinRenou)) +- Pin Python in docs build [#528](https://github.com/jupytercad/JupyterCAD/pull/528) ([@martinRenou](https://github.com/martinRenou)) + +### Documentation improvements + +- Pin Python in docs build [#528](https://github.com/jupytercad/JupyterCAD/pull/528) ([@martinRenou](https://github.com/martinRenou)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupytercad/JupyterCAD/graphs/contributors?from=2024-10-21&to=2024-10-29&type=c)) + +[@arjxn-py](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Aarjxn-py+updated%3A2024-10-21..2024-10-29&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Agithub-actions+updated%3A2024-10-21..2024-10-29&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3AmartinRenou+updated%3A2024-10-21..2024-10-29&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3ASylvainCorlay+updated%3A2024-10-21..2024-10-29&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Atrungleduc+updated%3A2024-10-21..2024-10-29&type=Issues) + + + ## 3.0.0a4 ([Full Changelog](https://github.com/jupytercad/JupyterCAD/compare/v3.0.0a3...b6be4f502cf89961d78cbd4afd96b36c0b65e102)) @@ -93,8 +141,6 @@ pip install jupytercad-freecad [@arjxn-py](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Aarjxn-py+updated%3A2024-10-09..2024-10-21&type=Issues) | [@davidbrochart](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Adavidbrochart+updated%3A2024-10-09..2024-10-21&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Agithub-actions+updated%3A2024-10-09..2024-10-21&type=Issues) | [@IsabelParedes](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3AIsabelParedes+updated%3A2024-10-09..2024-10-21&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3AmartinRenou+updated%3A2024-10-09..2024-10-21&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3ASylvainCorlay+updated%3A2024-10-09..2024-10-21&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ajupytercad%2FJupyterCAD+involves%3Atrungleduc+updated%3A2024-10-09..2024-10-21&type=Issues) - - ## 3.0.0a3 ([Full Changelog](https://github.com/jupytercad/JupyterCAD/compare/@jupytercad/base@3.0.0-alpha.2...36bff8b5e9a8534c073008fea5ce1e61dfd5ee94)) diff --git a/examples/Notebook.ipynb b/examples/Notebook.ipynb index edba0072..bc8b994b 100644 --- a/examples/Notebook.ipynb +++ b/examples/Notebook.ipynb @@ -43,7 +43,17 @@ "metadata": {}, "outputs": [], "source": [ - "doc.add_cone().add_sphere(radius=0.8).cut()" + "doc.add_cone().add_sphere(radius=0.8).cut(color='#ff0000')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab3d7be6", + "metadata": {}, + "outputs": [], + "source": [ + "doc.set_color('Cut 1', '#00ff00')" ] }, { diff --git a/package.json b/package.json index 8a2af614..f5f95a82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/jupytercad-root", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "private": true, "homepage": "https://github.com/jupytercad/JupyterCAD", "repository": { @@ -52,8 +52,8 @@ "build:app": "lerna run --ignore @jupytercad/jupytercad-lab build" }, "resolutions": { - "@jupyter/collaboration": "^3.0.0-rc.1", - "@jupyter/ydoc": "^3.0.0-b0", + "@jupyter/collaboration": "^3.0.0", + "@jupyter/ydoc": "^3.0.0", "@jupyterlab/apputils": "^4.0.0", "@lumino/coreutils": "^2.0.0", "@jupyterlab/notebook": "^4.0.0", diff --git a/packages/base/package.json b/packages/base/package.json index b4c407b7..daf75c0c 100644 --- a/packages/base/package.json +++ b/packages/base/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/base", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "A JupyterLab extension for 3D modelling.", "keywords": [ "jupyter", @@ -36,10 +36,10 @@ }, "dependencies": { "@deathbeds/jupyterlab-rjsf": "^1.1.0", - "@jupyter/collaborative-drive": "^3.0.0-rc.1", - "@jupyter/ydoc": "^3.0.0-b0", - "@jupytercad/occ-worker": "^3.0.0-alpha.4", - "@jupytercad/schema": "^3.0.0-alpha.4", + "@jupyter/collaborative-drive": "^3.0.0", + "@jupyter/ydoc": "^3.0.0", + "@jupytercad/occ-worker": "^3.0.0-alpha.5", + "@jupytercad/schema": "^3.0.0-alpha.5", "@jupyterlab/application": "^4.0.0", "@jupyterlab/apputils": "^4.0.0", "@jupyterlab/completer": "^4.2.4", diff --git a/packages/occ-worker/package.json b/packages/occ-worker/package.json index 7669ccd4..3ccae6d9 100644 --- a/packages/occ-worker/package.json +++ b/packages/occ-worker/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/occ-worker", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "Jupytercad opencascade worker package.", "keywords": [ "jupytercad" @@ -36,8 +36,8 @@ "watch": "tsc-watch --onSuccess \"webpack --config worker.webpack.config.js --mode=development\"" }, "dependencies": { - "@jupytercad/opencascade": "^3.0.0-alpha.4", - "@jupytercad/schema": "^3.0.0-alpha.4", + "@jupytercad/opencascade": "^3.0.0-alpha.5", + "@jupytercad/schema": "^3.0.0-alpha.5", "@lumino/coreutils": "^2.0.0", "uuid": "^8.3.2" }, diff --git a/packages/opencascade/package.json b/packages/opencascade/package.json index 1525057b..8a1416d2 100644 --- a/packages/opencascade/package.json +++ b/packages/opencascade/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/opencascade", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "The custom OpenCascade build for JupyterCAD.", "keywords": [ "jupyter", diff --git a/packages/schema/package.json b/packages/schema/package.json index b2f37f0f..abfe779f 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/schema", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "A Jupytercad schema package.", "keywords": [ "jupytercad" @@ -38,7 +38,7 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": "^9.0.9", - "@jupyter/ydoc": "^3.0.0-b0", + "@jupyter/ydoc": "^3.0.0", "@jupyterlab/apputils": "^4.0.0", "@jupyterlab/coreutils": "^6.0.0", "@jupyterlab/docregistry": "^4.0.0", diff --git a/packages/schema/src/interfaces.ts b/packages/schema/src/interfaces.ts index 41cd89d8..f6901290 100644 --- a/packages/schema/src/interfaces.ts +++ b/packages/schema/src/interfaces.ts @@ -8,7 +8,6 @@ import { IWidgetTracker } from '@jupyterlab/apputils'; import { IChangedArgs } from '@jupyterlab/coreutils'; import { DocumentRegistry, IDocumentWidget } from '@jupyterlab/docregistry'; import { User } from '@jupyterlab/services'; -// import { ReactWidget } from '@jupyterlab/ui-components'; import { JSONObject } from '@lumino/coreutils'; import { ISignal, Signal } from '@lumino/signaling'; import { SplitPanel } from '@lumino/widgets'; diff --git a/python/jupytercad/jupytercad/__init__.py b/python/jupytercad/jupytercad/__init__.py index 8c159867..051a98dd 100644 --- a/python/jupytercad/jupytercad/__init__.py +++ b/python/jupytercad/jupytercad/__init__.py @@ -1,3 +1,3 @@ -__version__ = "3.0.0a4" +__version__ = "3.0.0a5" from jupytercad_lab import CadDocument # noqa diff --git a/python/jupytercad/pyproject.toml b/python/jupytercad/pyproject.toml index a729d59f..2faff316 100644 --- a/python/jupytercad/pyproject.toml +++ b/python/jupytercad/pyproject.toml @@ -19,9 +19,9 @@ classifiers = [ "Programming Language :: Python :: 3.12", ] dependencies = [ - "jupytercad_core==3.0.0a4", - "jupytercad_lab==3.0.0a4", - "jupytercad_app==3.0.0a4", + "jupytercad_core==3.0.0a5", + "jupytercad_lab==3.0.0a5", + "jupytercad_app==3.0.0a5", ] dynamic = ["version"] license = {file = "LICENSE"} diff --git a/python/jupytercad_app/package.json b/python/jupytercad_app/package.json index b067d51f..42b22af9 100644 --- a/python/jupytercad_app/package.json +++ b/python/jupytercad_app/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/jupytercad-app", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "A JupyterLab standalone app for 3D modelling.", "keywords": [ "jupyter", @@ -51,12 +51,12 @@ "dependencies": { "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.3", - "@jupyter/collaboration": "^3.0.0-rc.1", - "@jupyter/collaborative-drive": "^3.0.0-rc.1", - "@jupyter/docprovider": "^3.0.0-rc.1", - "@jupyter/ydoc": "^3.0.0-b0", - "@jupytercad/base": "^3.0.0-alpha.4", - "@jupytercad/schema": "^3.0.0-alpha.4", + "@jupyter/collaboration": "^3.0.0", + "@jupyter/collaborative-drive": "^3.0.0", + "@jupyter/docprovider": "^3.0.0", + "@jupyter/ydoc": "^3.0.0", + "@jupytercad/base": "^3.0.0-alpha.5", + "@jupytercad/schema": "^3.0.0-alpha.5", "@jupyterlab/application": "^4.0.0", "@jupyterlab/application-extension": "^4.0.0", "@jupyterlab/apputils": "^4.0.0", diff --git a/python/jupytercad_core/package.json b/python/jupytercad_core/package.json index 9fddd229..869cf3cd 100644 --- a/python/jupytercad_core/package.json +++ b/python/jupytercad_core/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/jupytercad-core", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "JupyterCad core extension", "keywords": [ "jupyter", @@ -53,10 +53,10 @@ "build:worker:prod": "webpack --config worker.webpack.config.js --mode=production" }, "dependencies": { - "@jupyter/collaborative-drive": "^3.0.0-rc.1", - "@jupytercad/base": "^3.0.0-alpha.4", - "@jupytercad/occ-worker": "^3.0.0-alpha.4", - "@jupytercad/schema": "^3.0.0-alpha.4", + "@jupyter/collaborative-drive": "^3.0.0", + "@jupytercad/base": "^3.0.0-alpha.5", + "@jupytercad/occ-worker": "^3.0.0-alpha.5", + "@jupytercad/schema": "^3.0.0-alpha.5", "@jupyterlab/application": "^4.0.0", "@jupyterlab/apputils": "^4.0.0", "@jupyterlab/docregistry": "^4.0.0", diff --git a/python/jupytercad_core/pyproject.toml b/python/jupytercad_core/pyproject.toml index ba87c026..eab4f9c6 100644 --- a/python/jupytercad_core/pyproject.toml +++ b/python/jupytercad_core/pyproject.toml @@ -20,8 +20,8 @@ classifiers = [ ] dependencies = [ "jupyter_server>=2.0.6,<3", - "jupyter_ydoc>=2,<3", - "jupyter-collaboration>=3.0.0b8,<4", + "jupyter_ydoc>=2,<4", + "jupyter-collaboration>=3.0.0,<4", ] dynamic = ["version", "description", "authors", "urls", "keywords"] license = {file = "LICENSE"} diff --git a/python/jupytercad_lab/jupytercad_lab/notebook/cad_document.py b/python/jupytercad_lab/jupytercad_lab/notebook/cad_document.py index 114cd321..d02fe615 100644 --- a/python/jupytercad_lab/jupytercad_lab/notebook/cad_document.py +++ b/python/jupytercad_lab/jupytercad_lab/notebook/cad_document.py @@ -95,6 +95,20 @@ def get_object(self, name: str) -> Optional["PythonJcadObject"]: data = self._get_yobject_by_name(name).to_py() return OBJECT_FACTORY.create_object(data, self) + def _get_color(self, shape_id: str | int) -> str: + """ + Retrieve the color of a shape by its name or index. + + :param shape_id: The name or index of the shape. + :return: The color of the shape in hex format. + """ + shape = self.get_object(shape_id) + if hasattr(shape, "parameters") and hasattr(shape.parameters, "Color"): + color = shape.parameters.Color + return color + else: + return "#808080" + def remove(self, name: str) -> CadDocument: index = self._get_yobject_index_by_name(name) if self._objects_array and index != -1: @@ -252,6 +266,7 @@ def add_box( length: float = 1, width: float = 1, height: float = 1, + color: str = "#808080", position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -263,6 +278,7 @@ def add_box( :param length: The length of the box. :param width: The width of the box. :param height: The height of the box. + :param color: The color of the box in hex format (e.g., "#FF5733") or RGB float list. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -275,6 +291,7 @@ def add_box( "Length": length, "Width": width, "Height": height, + "Color": color, "Placement": { "Position": position, "Axis": rotation_axis, @@ -291,6 +308,7 @@ def add_cone( radius2: float = 0.5, height: float = 1, angle: float = 360, + color: str = "#808080", position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -303,6 +321,7 @@ def add_cone( :param radius2: The top radius of the cone. :param height: The height of the cone. :param angle: The revolution angle of the cone (0: no cone, 180: half cone, 360: full cone). + :param color: The color of the cone in hex format (e.g., "#FF5733") or RGB float list. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -316,6 +335,7 @@ def add_cone( "Radius2": radius2, "Height": height, "Angle": angle, + "Color": color, "Placement": { "Position": position, "Axis": rotation_axis, @@ -331,6 +351,7 @@ def add_cylinder( radius: float = 1, height: float = 1, angle: float = 360, + color: str = "#808080", position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -342,6 +363,7 @@ def add_cylinder( :param radius: The radius of the cylinder. :param height: The height of the cylinder. :param angle: The revolution angle of the cylinder (0: no cylinder, 180: half cylinder, 360: full cylinder). + :param color: The color of the cylinder in hex format (e.g., "#FF5733") or RGB float list. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -354,6 +376,7 @@ def add_cylinder( "Radius": radius, "Height": height, "Angle": angle, + "Color": color, "Placement": { "Position": position, "Axis": rotation_axis, @@ -370,6 +393,7 @@ def add_sphere( angle1: float = -90, angle2: float = 90, angle3: float = 360, + color: str = "#808080", position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -382,6 +406,7 @@ def add_sphere( :param angle1: The revolution angle of the sphere on the X axis (0: no sphere, 180: half sphere, 360: full sphere). :param angle2: The revolution angle of the sphere on the Y axis (0: no sphere, 180: half sphere, 360: full sphere). :param angle3: The revolution angle of the sphere on the Z axis (0: no sphere, 180: half sphere, 360: full sphere). + :param color: The color of the sphere in hex format (e.g., "#FF5733") or RGB float list. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -395,6 +420,7 @@ def add_sphere( "Angle1": angle1, "Angle2": angle2, "Angle3": angle3, + "Color": color, "Placement": { "Position": position, "Axis": rotation_axis, @@ -412,6 +438,7 @@ def add_torus( angle1: float = -180, angle2: float = 180, angle3: float = 360, + color: str = "#808080", position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -425,6 +452,7 @@ def add_torus( :param angle1: The revolution angle of the torus on the X axis (0: no torus, 180: half torus, 360: full torus). :param angle2: The revolution angle of the torus on the Y axis (0: no torus, 180: half torus, 360: full torus). :param angle3: The revolution angle of the torus on the Z axis (0: no torus, 180: half torus, 360: full torus). + :param color: The color of the torus in hex format (e.g., "#FF5733") or RGB float list. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -439,6 +467,7 @@ def add_torus( "Angle1": angle1, "Angle2": angle2, "Angle3": angle3, + "Color": color, "Placement": { "Position": position, "Axis": rotation_axis, @@ -454,6 +483,7 @@ def cut( base: str | int = None, tool: str | int = None, refine: bool = False, + color: Optional[str] = None, position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -465,6 +495,7 @@ def cut( :param base: The base object that will be used for the cut. Can be the name of the object or its index in the objects list. :param tool: The tool object that will be used for the cut. Can be the name of the object or its index in the objects list. :param refine: Whether or not to refine the mesh during the cut computation. + :param color: The color in hex format (e.g., "#FF5733") or RGB float list. Defaults to the base object's color if None. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -472,6 +503,10 @@ def cut( """ # noqa E501 base, tool = self._get_boolean_operands(base, tool) + # Use specified color or fall back to the base object's color + if color is None: + color = self._get_color(base) + data = { "shape": Parts.Part__Cut.value, "name": name if name else self._new_name("Cut"), @@ -479,6 +514,7 @@ def cut( "Base": base, "Tool": tool, "Refine": refine, + "Color": color, "Placement": {"Position": [0, 0, 0], "Axis": [0, 0, 1], "Angle": 0}, }, } @@ -492,6 +528,7 @@ def fuse( shape1: str | int = None, shape2: str | int = None, refine: bool = False, + color: Optional[str] = None, position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -503,6 +540,7 @@ def fuse( :param shape1: The first object used for the union. Can be the name of the object or its index in the objects list. :param shape2: The first object used for the union. Can be the name of the object or its index in the objects list. :param refine: Whether or not to refine the mesh during the union computation. + :param color: The color in hex format (e.g., "#FF5733") or RGB float list. Defaults to the base object's color if None. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -510,6 +548,10 @@ def fuse( """ # noqa E501 shape1, shape2 = self._get_boolean_operands(shape1, shape2) + # Use specified color or fall back to the base object's color + if color is None: + color = self._get_color(shape1) + data = { "shape": Parts.Part__MultiFuse.value, "name": name if name else self._new_name("Fuse"), @@ -529,6 +571,7 @@ def intersect( shape1: str | int = None, shape2: str | int = None, refine: bool = False, + color: Optional[str] = None, position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -541,6 +584,7 @@ def intersect( :param shape1: The first object used for the intersection. Can be the name of the object or its index in the objects list. :param shape2: The first object used for the intersection. Can be the name of the object or its index in the objects list. :param refine: Whether or not to refine the mesh during the intersection computation. + :param color: The color in hex format (e.g., "#FF5733") or RGB float list. Defaults to the base object's color if None. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -548,6 +592,10 @@ def intersect( """ # noqa E501 shape1, shape2 = self._get_boolean_operands(shape1, shape2) + # Use specified color or fall back to the base object's color + if color is None: + color = self._get_color(shape1) + data = { "shape": Parts.Part__MultiCommon.value, "name": name if name else self._new_name("Intersection"), @@ -567,6 +615,7 @@ def chamfer( shape: str | int = None, edge: int = 0, dist: float = 0.1, + color: Optional[str] = None, position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -579,6 +628,7 @@ def chamfer( :param shape: The input object used for the chamfer. Can be the name of the object or its index in the objects list. :param edge: The edge index where to apply chamfer. :param dist: The distance of the chamfer. + :param color: The color in hex format (e.g., "#FF5733") or RGB float list. Defaults to the base object's color if None. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -586,6 +636,10 @@ def chamfer( """ # noqa E501 shape = self._get_operand(shape) + # Use specified color or fall back to the base object's color + if color is None: + color = self._get_color(shape) + data = { "shape": Parts.Part__Chamfer.value, "name": name if name else self._new_name("Chamfer"), @@ -605,6 +659,7 @@ def fillet( shape: str | int = None, edge: int = 0, radius: float = 0.1, + color: Optional[str] = None, position: List[float] = [0, 0, 0], rotation_axis: List[float] = [0, 0, 1], rotation_angle: float = 0, @@ -617,6 +672,7 @@ def fillet( :param shape: The input object used for the fillet. Can be the name of the object or its index in the objects list. :param edge: The edge index where to apply fillet. :param radius: The radius of the fillet. + :param color: The color in hex format (e.g., "#FF5733") or RGB float list. Defaults to the base object's color if None. :param position: The shape 3D position. :param rotation_axis: The 3D axis used for the rotation. :param rotation_angle: The shape rotation angle, in degrees. @@ -624,6 +680,10 @@ def fillet( """ # noqa E501 shape = self._get_operand(shape) + # Use specified color or fall back to the base object's color + if color is None: + color = self._get_color(shape) + data = { "shape": Parts.Part__Fillet.value, "name": name if name else self._new_name("Fillet"), @@ -665,7 +725,16 @@ def set_visible(self, name: str, value): if obj is None: raise RuntimeError(f"No object named {name}") - obj["visible"] = False + obj["visible"] = value + + def set_color(self, name: str, value: str): + obj: Optional[Map] = self._get_yobject_by_name(name) + + if obj is None: + raise RuntimeError(f"No object named {name}") + parameters = obj.get("parameters", {}) + parameters["Color"] = value + obj["parameters"] = parameters def check_exist(self, name: str) -> bool: if self.objects: diff --git a/python/jupytercad_lab/package.json b/python/jupytercad_lab/package.json index 5194f2c0..0c01c940 100644 --- a/python/jupytercad_lab/package.json +++ b/python/jupytercad_lab/package.json @@ -1,6 +1,6 @@ { "name": "@jupytercad/jupytercad-lab", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "JupyterCad Lab extension.", "keywords": [ "jupyter", @@ -51,10 +51,10 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter/collaborative-drive": "^3.0.0-rc.1", - "@jupytercad/base": "^3.0.0-alpha.4", - "@jupytercad/jupytercad-core": "^3.0.0-alpha.4", - "@jupytercad/schema": "^3.0.0-alpha.4", + "@jupyter/collaborative-drive": "^3.0.0", + "@jupytercad/base": "^3.0.0-alpha.5", + "@jupytercad/jupytercad-core": "^3.0.0-alpha.5", + "@jupytercad/schema": "^3.0.0-alpha.5", "@jupyterlab/application": "^4.0.0", "@jupyterlab/apputils": "^4.0.0", "@jupyterlab/coreutils": "^6.0.0", diff --git a/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-0-linux.png b/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-0-linux.png index 749ee0ad..d38f8ef4 100644 Binary files a/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-0-linux.png and b/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-0-linux.png differ diff --git a/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-2-linux.png b/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-2-linux.png index 63e8bfd3..f198656f 100644 Binary files a/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-2-linux.png and b/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-2-linux.png differ diff --git a/ui-tests/tests/ui.spec.ts-snapshots/JCAD-Console-linux.png b/ui-tests/tests/ui.spec.ts-snapshots/JCAD-Console-linux.png index b13703fb..c1a245d7 100644 Binary files a/ui-tests/tests/ui.spec.ts-snapshots/JCAD-Console-linux.png and b/ui-tests/tests/ui.spec.ts-snapshots/JCAD-Console-linux.png differ diff --git a/yarn.lock b/yarn.lock index 845c2440..3790bbc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,154 +29,134 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/code-frame@npm:7.25.7" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/code-frame@npm:7.26.0" dependencies: - "@babel/highlight": ^7.25.7 + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 picocolors: ^1.0.0 - checksum: f235cdf9c5d6f172898a27949bd63731c5f201671f77bcf4c2ad97229bc462d89746c1a7f5671a132aecff5baf43f3d878b93a7ecc6aa71f9612d2b51270c53e + checksum: 2a677369e9b80b956401809485e8c2ae24df5e6076f669cf26a2809fcb88f91c2f6bb1bf3fb799dfe8487b2b7a276b62d14ac230a79d7ac8c7b369090d0a43fc languageName: node linkType: hard -"@babel/generator@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/generator@npm:7.25.7" +"@babel/generator@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/generator@npm:7.26.0" dependencies: - "@babel/types": ^7.25.7 + "@babel/parser": ^7.26.0 + "@babel/types": ^7.26.0 "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^3.0.2 - checksum: f81cf9dc0191ae4411d82978114382ad6e047bfb678f9a95942bac5034a41719d88f047679f5e2f51ba7728b54ebd1cc32a10df7b556215d8a6ab9bdd4f11831 + checksum: 3b1edb8202f39e1600eb1342a04571b8ba66148b7165ec3cf7a072696fa81301f373648e19492289aa832e60a42f3ed367ae4b1ae6ad92968393f11a35dae70c languageName: node linkType: hard "@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.25.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.25.7" + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: - "@babel/types": ^7.25.7 - checksum: 4b3680b31244ee740828cd7537d5e5323dd9858c245a02f5636d54e45956f42d77bbe9e1dd743e6763eb47c25967a8b12823002cc47809f5f7d8bc24eefe0304 + "@babel/types": ^7.25.9 + checksum: 41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c languageName: node linkType: hard "@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.22.5": - version: 7.25.7 - resolution: "@babel/helper-module-imports@npm:7.25.7" + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/traverse": ^7.25.7 - "@babel/types": ^7.25.7 - checksum: a7255755e9799978de4bf72563b94b53cf955e5fc3d2acc67c783d3b84d5d34dd41691e473ecc124a94654483fff573deacd87eccd8bd16b47ac4455b5941b30 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-plugin-utils@npm:7.25.7" - checksum: eef4450361e597f11247d252e69207324dfe0431df9b8bcecc8bef1204358e93fa7776a659c3c4f439e9ee71cd967aeca6c4d6034ebc17a7ae48143bbb580f2f + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 1b411ce4ca825422ef7065dffae7d8acef52023e51ad096351e3e2c05837e9bf9fca2af9ca7f28dc26d596a588863d0fedd40711a88e350b736c619a80e704e6 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-string-parser@npm:7.25.7" - checksum: 0835fda5efe02cdcb5144a939b639acc017ba4aa1cc80524b44032ddb714080d3e40e8f0d3240832b7bd86f5513f0b63d4fe77d8fc52d8c8720ae674182c0753 +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: e19ec8acf0b696756e6d84531f532c5fe508dce57aa68c75572a77798bd04587a844a9a6c8ea7d62d673e21fdc174d091c9097fb29aea1c1b49f9c6eaa80f022 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-validator-identifier@npm:7.25.7" - checksum: 062f55208deead4876eb474dc6fd55155c9eada8d0a505434de3b9aa06c34195562e0f3142b22a08793a38d740238efa2fe00ff42956cdcb8ac03f0b6c542247 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99 languageName: node linkType: hard -"@babel/highlight@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/highlight@npm:7.25.7" - dependencies: - "@babel/helper-validator-identifier": ^7.25.7 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - picocolors: ^1.0.0 - checksum: b6aa45c5bf7ecc16b8204bbed90335706131ac6cacb0f1bfb1b862ada3741539c913b56c9d26beb56cece0c231ffab36f66aa36aac6b04b32669c314705203f2 +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 languageName: node linkType: hard -"@babel/parser@npm:^7.25.7": - version: 7.25.8 - resolution: "@babel/parser@npm:7.25.8" +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0": + version: 7.26.1 + resolution: "@babel/parser@npm:7.26.1" dependencies: - "@babel/types": ^7.25.8 + "@babel/types": ^7.26.0 bin: parser: ./bin/babel-parser.js - checksum: c33f6d26542f156927c5dbe131265c791177d271e582338e960f803903086ec5c152bf25deae5f4c061b7bee14dc0b5fd2882ccb5a21c16ee0738d24fcc0406e + checksum: 354320d1a0a7102b2f25620ceea1bbc809f5225432a73e8a8874009d2f82ed29e2b035fe68fb6d18bb7eafed78df1ec0fa12e8d8226b295d7a020f9b852de653 languageName: node linkType: hard "@babel/plugin-syntax-jsx@npm:^7.22.5": - version: 7.25.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.7" + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": ^7.25.7 + "@babel/helper-plugin-utils": ^7.25.9 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3584566707a1c92e48b3ad2423af73bc4497093fb17fb786977fc5aef6130ae7a2f7856a7848431bed1ac21b4a8d86d2ff4505325b700f76f9bd57b4e95a2297 + checksum: bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2": - version: 7.25.7 - resolution: "@babel/runtime@npm:7.25.7" +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.20.6": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" dependencies: regenerator-runtime: ^0.14.0 - checksum: 1d6133ed1cf1de1533cfe84a4a8f94525271a0d93f6af4f2cdae14884ec3c8a7148664ddf7fd2a14f82cc4485904a1761821a55875ad241c8b4034e95e7134b2 + checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a languageName: node linkType: hard -"@babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.20.6": +"@babel/template@npm:^7.25.9": version: 7.25.9 - resolution: "@babel/runtime@npm:7.25.9" + resolution: "@babel/template@npm:7.25.9" dependencies: - regenerator-runtime: ^0.14.0 - checksum: ce1c87b166ff728eaee91658a67fb7835314ed157b7a36d49602ffdaaa37fb1fcf2784afd00b55fe1672bec53fb38cba622a056c913611af2a44503097216229 + "@babel/code-frame": ^7.25.9 + "@babel/parser": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 103641fea19c7f4e82dc913aa6b6ac157112a96d7c724d513288f538b84bae04fb87b1f1e495ac1736367b1bc30e10f058b30208fb25f66038e1f1eb4e426472 languageName: node linkType: hard -"@babel/template@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/template@npm:7.25.7" - dependencies: - "@babel/code-frame": ^7.25.7 - "@babel/parser": ^7.25.7 - "@babel/types": ^7.25.7 - checksum: 83f025a4a777103965ee41b7c0fa2bb1c847ea7ed2b9f2cb258998ea96dfc580206176b532edf6d723d85237bc06fca26be5c8772e2af7d9e4fe6927e3bed8a3 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.7, @babel/traverse@npm:^7.4.5": - version: 7.25.7 - resolution: "@babel/traverse@npm:7.25.7" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.4.5": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": ^7.25.7 - "@babel/generator": ^7.25.7 - "@babel/parser": ^7.25.7 - "@babel/template": ^7.25.7 - "@babel/types": ^7.25.7 + "@babel/code-frame": ^7.25.9 + "@babel/generator": ^7.25.9 + "@babel/parser": ^7.25.9 + "@babel/template": ^7.25.9 + "@babel/types": ^7.25.9 debug: ^4.3.1 globals: ^11.1.0 - checksum: 4d329b6e7a409a63f4815bbc0a08d0b0cb566c5a2fecd1767661fe1821ced213c554d7d74e6aca048672fed2c8f76071cb0d94f4bd5f120fba8d55a38af63094 + checksum: 901d325662ff1dd9bc51de00862e01055fa6bc374f5297d7e3731f2f0e268bbb1d2141f53fa82860aa308ee44afdcf186a948f16c83153927925804b95a9594d languageName: node linkType: hard -"@babel/types@npm:^7.25.7, @babel/types@npm:^7.25.8": - version: 7.25.8 - resolution: "@babel/types@npm:7.25.8" +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": ^7.25.7 - "@babel/helper-validator-identifier": ^7.25.7 - to-fast-properties: ^2.0.0 - checksum: 93d84858e820dbfa0fc4882b3ba6a421544d224ee61455a58eed0af9fc3518b30dc2166b8ba48cdd2e91083c5885ed773c36acf46d177b7b1fad9c35b6eb7639 + "@babel/helper-string-parser": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + checksum: a3dd37dabac693018872da96edb8c1843a605c1bfacde6c3f504fba79b972426a6f24df70aa646356c0c1b19bdd2c722c623c684a996c002381071680602280d languageName: node linkType: hard @@ -582,20 +562,20 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: ^3.3.0 + eslint-visitor-keys: ^3.4.3 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + checksum: a7ffc838eb6a9ef594cda348458ccf38f34439ac77dc090fa1c120024bcd4eb911dfd74d5ef44d42063e7949fa7c5123ce714a015c4abb917d4124be1bd32bfe languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.4.0": - version: 4.11.1 - resolution: "@eslint-community/regexpp@npm:4.11.1" - checksum: 6986685529d30e33c2640973c3d8e7ddd31bef3cc8cb10ad54ddc1dea12680779a2c23a45562aa1462c488137a3570e672d122fac7da22d82294382d915cec70 + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 languageName: node linkType: hard @@ -780,9 +760,9 @@ __metadata: languageName: node linkType: hard -"@jupyter/collaboration@npm:^3.0.0-rc.1": - version: 3.0.0-rc.1 - resolution: "@jupyter/collaboration@npm:3.0.0-rc.1" +"@jupyter/collaboration@npm:^3.0.0": + version: 3.0.0 + resolution: "@jupyter/collaboration@npm:3.0.0" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.7.0 @@ -798,28 +778,28 @@ __metadata: react: ^18.2.0 y-protocols: ^1.0.5 yjs: ^13.5.40 - checksum: d643a2b8ce73f07ffb533d73bdd85c5ddc04d8e6ff89d31547395de1b3a5ee021c08a93d741b15cf85c36c6afcf6a0576c0ab8a2403d2e986835ce85872716d9 + checksum: 8be72473e32395da724a071812de411c29b46d1c9ca9f97e0a17c53b51b01b3ff3b005b8a1775de68ce38b5cb2ea825bd124bc5dfdb052addec8a5276b21afc5 languageName: node linkType: hard -"@jupyter/collaborative-drive@npm:^3.0.0-rc.1": - version: 3.0.0-rc.1 - resolution: "@jupyter/collaborative-drive@npm:3.0.0-rc.1" +"@jupyter/collaborative-drive@npm:^3.0.0": + version: 3.0.0 + resolution: "@jupyter/collaborative-drive@npm:3.0.0" dependencies: - "@jupyter/ydoc": ^2.0.0 || ^3.0.0-a3 + "@jupyter/ydoc": ^2.0.0 || ^3.0.0 "@jupyterlab/services": ^7.2.0 "@lumino/coreutils": ^2.1.0 "@lumino/disposable": ^2.1.0 - checksum: a487e5b04ce1b318e99deae557999b6cd1159c2adab9d3ea6ae04d431c5f48da8001156dc9f33c3cde7e95e6c9bac97a3a8d7dce1d67d9ab07014ccb3c355627 + checksum: f0ecbe4c323ece6550f1836ef749fe3f5ff3d65ca92dd97729501a782e83bf8394f9a88998a1bbb9a2c1520c17da57bc75e30b54773fcfe62077af85b74b3cca languageName: node linkType: hard -"@jupyter/docprovider@npm:^3.0.0-rc.1": - version: 3.0.0-rc.1 - resolution: "@jupyter/docprovider@npm:3.0.0-rc.1" +"@jupyter/docprovider@npm:^3.0.0": + version: 3.0.0 + resolution: "@jupyter/docprovider@npm:3.0.0" dependencies: - "@jupyter/collaborative-drive": ^3.0.0-rc.1 - "@jupyter/ydoc": ^2.0.0 || ^3.0.0-a3 + "@jupyter/collaborative-drive": ^3.0.0 + "@jupyter/ydoc": ^2.0.0 || ^3.0.0 "@jupyterlab/apputils": ^4.2.0 "@jupyterlab/cells": ^4.2.0 "@jupyterlab/coreutils": ^6.2.0 @@ -833,7 +813,7 @@ __metadata: y-protocols: ^1.0.5 y-websocket: ^1.3.15 yjs: ^13.5.40 - checksum: 317d4a173806a7c1cb34eeae49ddb193d0f0d3ff1376e915a25d1fd57929244dcc0ab9310265fe9bd17531b293889a0a5081ef25c78b50bb86a301a68bebe299 + checksum: 46172250694a83f8bacca5448cf67f9e0accbb7f3a6e821d41f70730651a8c7c923b71fdb2e9d7c87e638b6afdb92f48773f284099d6204f7c17c06bfc82df10 languageName: node linkType: hard @@ -860,9 +840,9 @@ __metadata: languageName: node linkType: hard -"@jupyter/ydoc@npm:^3.0.0-b0": - version: 3.0.0-b0 - resolution: "@jupyter/ydoc@npm:3.0.0-b0" +"@jupyter/ydoc@npm:^3.0.0": + version: 3.0.0 + resolution: "@jupyter/ydoc@npm:3.0.0" dependencies: "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 "@lumino/coreutils": ^1.11.0 || ^2.0.0 @@ -870,20 +850,20 @@ __metadata: "@lumino/signaling": ^1.10.0 || ^2.0.0 y-protocols: ^1.0.5 yjs: ^13.5.40 - checksum: 2c9be60abb580f5b6053c1834f7345eb85138d1102042c105b85a72e0fc96801417e7b78139c62a0c8fcf74bed53eabe981f3847fb0f89cdb7e3a90933c15ae8 + checksum: e9419a461f33d2685db346b19806865fe37f61b2ca33eb39c4ea905d765794a928442adf1bbffda67b665bdeba3be9a082189a57eaab5367aeaf6b57caeda822 languageName: node linkType: hard -"@jupytercad/base@^3.0.0-alpha.4, @jupytercad/base@workspace:packages/base": +"@jupytercad/base@^3.0.0-alpha.5, @jupytercad/base@workspace:packages/base": version: 0.0.0-use.local resolution: "@jupytercad/base@workspace:packages/base" dependencies: "@apidevtools/json-schema-ref-parser": ^9.0.9 "@deathbeds/jupyterlab-rjsf": ^1.1.0 - "@jupyter/collaborative-drive": ^3.0.0-rc.1 - "@jupyter/ydoc": ^3.0.0-b0 - "@jupytercad/occ-worker": ^3.0.0-alpha.4 - "@jupytercad/schema": ^3.0.0-alpha.4 + "@jupyter/collaborative-drive": ^3.0.0 + "@jupyter/ydoc": ^3.0.0 + "@jupytercad/occ-worker": ^3.0.0-alpha.5 + "@jupytercad/schema": ^3.0.0-alpha.5 "@jupyterlab/application": ^4.0.0 "@jupyterlab/apputils": ^4.0.0 "@jupyterlab/completer": ^4.2.4 @@ -923,12 +903,12 @@ __metadata: dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.3 - "@jupyter/collaboration": ^3.0.0-rc.1 - "@jupyter/collaborative-drive": ^3.0.0-rc.1 - "@jupyter/docprovider": ^3.0.0-rc.1 - "@jupyter/ydoc": ^3.0.0-b0 - "@jupytercad/base": ^3.0.0-alpha.4 - "@jupytercad/schema": ^3.0.0-alpha.4 + "@jupyter/collaboration": ^3.0.0 + "@jupyter/collaborative-drive": ^3.0.0 + "@jupyter/docprovider": ^3.0.0 + "@jupyter/ydoc": ^3.0.0 + "@jupytercad/base": ^3.0.0-alpha.5 + "@jupytercad/schema": ^3.0.0-alpha.5 "@jupyterlab/application": ^4.0.0 "@jupyterlab/application-extension": ^4.0.0 "@jupyterlab/apputils": ^4.0.0 @@ -990,14 +970,14 @@ __metadata: languageName: unknown linkType: soft -"@jupytercad/jupytercad-core@^3.0.0-alpha.4, @jupytercad/jupytercad-core@workspace:python/jupytercad_core": +"@jupytercad/jupytercad-core@^3.0.0-alpha.5, @jupytercad/jupytercad-core@workspace:python/jupytercad_core": version: 0.0.0-use.local resolution: "@jupytercad/jupytercad-core@workspace:python/jupytercad_core" dependencies: - "@jupyter/collaborative-drive": ^3.0.0-rc.1 - "@jupytercad/base": ^3.0.0-alpha.4 - "@jupytercad/occ-worker": ^3.0.0-alpha.4 - "@jupytercad/schema": ^3.0.0-alpha.4 + "@jupyter/collaborative-drive": ^3.0.0 + "@jupytercad/base": ^3.0.0-alpha.5 + "@jupytercad/occ-worker": ^3.0.0-alpha.5 + "@jupytercad/schema": ^3.0.0-alpha.5 "@jupyterlab/application": ^4.0.0 "@jupyterlab/apputils": ^4.0.0 "@jupyterlab/builder": ^4.0.0 @@ -1029,10 +1009,10 @@ __metadata: version: 0.0.0-use.local resolution: "@jupytercad/jupytercad-lab@workspace:python/jupytercad_lab" dependencies: - "@jupyter/collaborative-drive": ^3.0.0-rc.1 - "@jupytercad/base": ^3.0.0-alpha.4 - "@jupytercad/jupytercad-core": ^3.0.0-alpha.4 - "@jupytercad/schema": ^3.0.0-alpha.4 + "@jupyter/collaborative-drive": ^3.0.0 + "@jupytercad/base": ^3.0.0-alpha.5 + "@jupytercad/jupytercad-core": ^3.0.0-alpha.5 + "@jupytercad/schema": ^3.0.0-alpha.5 "@jupyterlab/application": ^4.0.0 "@jupyterlab/apputils": ^4.0.0 "@jupyterlab/builder": ^4.0.0 @@ -1081,12 +1061,12 @@ __metadata: languageName: unknown linkType: soft -"@jupytercad/occ-worker@^3.0.0-alpha.4, @jupytercad/occ-worker@workspace:packages/occ-worker": +"@jupytercad/occ-worker@^3.0.0-alpha.5, @jupytercad/occ-worker@workspace:packages/occ-worker": version: 0.0.0-use.local resolution: "@jupytercad/occ-worker@workspace:packages/occ-worker" dependencies: - "@jupytercad/opencascade": ^3.0.0-alpha.4 - "@jupytercad/schema": ^3.0.0-alpha.4 + "@jupytercad/opencascade": ^3.0.0-alpha.5 + "@jupytercad/schema": ^3.0.0-alpha.5 "@lumino/coreutils": ^2.0.0 "@types/node": ^18.15.11 copy-webpack-plugin: ^10.0.0 @@ -1102,7 +1082,7 @@ __metadata: languageName: unknown linkType: soft -"@jupytercad/opencascade@^3.0.0-alpha.4, @jupytercad/opencascade@workspace:packages/opencascade": +"@jupytercad/opencascade@^3.0.0-alpha.5, @jupytercad/opencascade@workspace:packages/opencascade": version: 0.0.0-use.local resolution: "@jupytercad/opencascade@workspace:packages/opencascade" dependencies: @@ -1114,12 +1094,12 @@ __metadata: languageName: unknown linkType: soft -"@jupytercad/schema@^3.0.0-alpha.4, @jupytercad/schema@workspace:packages/schema": +"@jupytercad/schema@^3.0.0-alpha.5, @jupytercad/schema@workspace:packages/schema": version: 0.0.0-use.local resolution: "@jupytercad/schema@workspace:packages/schema" dependencies: "@apidevtools/json-schema-ref-parser": ^9.0.9 - "@jupyter/ydoc": ^3.0.0-b0 + "@jupyter/ydoc": ^3.0.0 "@jupyterlab/apputils": ^4.0.0 "@jupyterlab/coreutils": ^6.0.0 "@jupyterlab/docregistry": ^4.0.0 @@ -2631,12 +2611,12 @@ __metadata: linkType: hard "@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.2.0": - version: 1.3.1 - resolution: "@lezer/markdown@npm:1.3.1" + version: 1.3.2 + resolution: "@lezer/markdown@npm:1.3.2" dependencies: "@lezer/common": ^1.0.0 "@lezer/highlight": ^1.0.0 - checksum: b5cbb857a90411e174e7ad23433756a81cf2ab422ef749e529211e078ed4061b4595fa8cbcca56119919c0b2735e8ecac11ff34768d64cb90e599fde2bc6c730 + checksum: 080c5e6e13ff227d5a1883dd895ef08d6fc8eb9620eb00f93fe1292dd9a740ec50ccf340f2aab2f522843d26ad2ad991ef029fd93cf09f88e00ef470f1142d15 languageName: node linkType: hard @@ -2972,34 +2952,34 @@ __metadata: languageName: node linkType: hard -"@microsoft/fast-element@npm:^1.12.0, @microsoft/fast-element@npm:^1.13.0": - version: 1.13.0 - resolution: "@microsoft/fast-element@npm:1.13.0" - checksum: 1cb7b4cfb7531116a3542d3f59bf1dd35106194f5764205403590250aaff744de79e35a5a1f36b4941c4eda9edc088148d4d629fb80be15fdf25f6be01770f3a +"@microsoft/fast-element@npm:^1.12.0, @microsoft/fast-element@npm:^1.14.0": + version: 1.14.0 + resolution: "@microsoft/fast-element@npm:1.14.0" + checksum: 58765739492997a5c51f7841cf6f334e2d2c4ad2365db4a228c07df1c89d139b026abf6afc6691ac48066070d3c94d09afdea2929bdca25842f778293e19892d languageName: node linkType: hard -"@microsoft/fast-foundation@npm:^2.49.4, @microsoft/fast-foundation@npm:^2.49.6": - version: 2.49.6 - resolution: "@microsoft/fast-foundation@npm:2.49.6" +"@microsoft/fast-foundation@npm:^2.49.4, @microsoft/fast-foundation@npm:^2.50.0": + version: 2.50.0 + resolution: "@microsoft/fast-foundation@npm:2.50.0" dependencies: - "@microsoft/fast-element": ^1.13.0 + "@microsoft/fast-element": ^1.14.0 "@microsoft/fast-web-utilities": ^5.4.1 tabbable: ^5.2.0 tslib: ^1.13.0 - checksum: 15fdf9dd0b910a72a9cff140f765d522304df11f8a78d5a97a815e2bbae25027c2b336e94f89ca31e650d6aabe17b590b7453acc0d2cb7340c219eb76350a942 + checksum: 651501eb8cd5a3e583638f70a4e7c0ad30952fe12adedd5c4c24861515d0aaeec0e83d1f1cd25dece899d2fa1614b415001c461f76bb84b20e1a8e18a3fcf219 languageName: node linkType: hard "@microsoft/fast-react-wrapper@npm:^0.3.22": - version: 0.3.24 - resolution: "@microsoft/fast-react-wrapper@npm:0.3.24" + version: 0.3.25 + resolution: "@microsoft/fast-react-wrapper@npm:0.3.25" dependencies: - "@microsoft/fast-element": ^1.13.0 - "@microsoft/fast-foundation": ^2.49.6 + "@microsoft/fast-element": ^1.14.0 + "@microsoft/fast-foundation": ^2.50.0 peerDependencies: react: ">=16.9.0" - checksum: 1d7a87509c22872bafc9b5c64f66659e52ba0cfdff484d7204125e503dafdea143f5e1bd2a643e2f3fbba6cc7567d916393369433f19dab9f0adcbe7a88b7d98 + checksum: 4c8e597eefd51c3091c25d0df28018b3283139178d6fd759532b40deb189f0422877308894fe55670edb82ed2a5b0138f2be8ef0b3df3ae518c14f75d6d0d577 languageName: node linkType: hard @@ -3478,8 +3458,8 @@ __metadata: linkType: hard "@rjsf/core@npm:^5.13.4": - version: 5.21.2 - resolution: "@rjsf/core@npm:5.21.2" + version: 5.22.2 + resolution: "@rjsf/core@npm:5.22.2" dependencies: lodash: ^4.17.21 lodash-es: ^4.17.21 @@ -3487,15 +3467,15 @@ __metadata: nanoid: ^3.3.7 prop-types: ^15.8.1 peerDependencies: - "@rjsf/utils": ^5.20.x + "@rjsf/utils": ^5.22.x react: ^16.14.0 || >=17 - checksum: ac5c4ff0e0cf74ba8cf6d58df314f8f17de6be5b00bb0ca14f79861347bbaa59f37b8f572d80f30388c5007de1d2dedfc3ff70e419eb874331d58f0ba9eeeb42 + checksum: 349981c7cdd079d641459d24a59b89b64a711254b4993836bf97974735aa1001cec37b1fa857372667c2de61c26cdb666ece6fc88f82d0fe2a34aa048b689022 languageName: node linkType: hard "@rjsf/utils@npm:^5.13.4": - version: 5.21.2 - resolution: "@rjsf/utils@npm:5.21.2" + version: 5.22.2 + resolution: "@rjsf/utils@npm:5.22.2" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -3504,21 +3484,21 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 05460f3c95e1a407001accaf2e9b90c0731433936cfea6a129ac01b49575f56ba336f1ae46e3930f0226580d06c6300c8622d1c3a56354c3e723caf3654f02e1 + checksum: 9e1e14f03313cf075c5f4d6ecffd095fc77db85e561474286686bff02121da4bee256facd9a08c422862798c2b709cea990b197b6e03db2360a684cc05847bdd languageName: node linkType: hard "@rjsf/validator-ajv8@npm:^5.13.4": - version: 5.21.2 - resolution: "@rjsf/validator-ajv8@npm:5.21.2" + version: 5.22.2 + resolution: "@rjsf/validator-ajv8@npm:5.22.2" dependencies: ajv: ^8.12.0 ajv-formats: ^2.1.1 lodash: ^4.17.21 lodash-es: ^4.17.21 peerDependencies: - "@rjsf/utils": ^5.20.x - checksum: 06d34e70e6595c5a0e999a3a2a651fccc7a36dbb2395f5805ce1ac6b47201111e6d84c9e122f3d336bbdbaca61875a90efd65e1839d9da3c9aafe282dcc03086 + "@rjsf/utils": ^5.22.x + checksum: 4499ae87581dda81df26aadf298c0dce2aa3cd8f7bf2f044077b6450c2b69def60c23ece8b52dfeb74673e97e2452fcc049f89dbb3029ac941e11803e2d5dd81 languageName: node linkType: hard @@ -3681,20 +3661,20 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.7.7 - resolution: "@types/node@npm:22.7.7" + version: 22.8.2 + resolution: "@types/node@npm:22.8.2" dependencies: - undici-types: ~6.19.2 - checksum: 70492e46d92bf00b537c8700322ad001c1f8d4fc65fc1627064a91c7edebb8ad18730b95a3c6bdff212dd0252a337a4b92e4cfcbc21c9f08616302e87ea855b8 + undici-types: ~6.19.8 + checksum: 8d57352fe563e8de78311c2f799e8c3805cbec3840dfa54d5168588c30112d1e87a7940ebdbdcebb1f0094e26b7e626dfadd9683f5c60d8a76e9082051fea14a languageName: node linkType: hard "@types/node@npm:^18.15.11": - version: 18.19.57 - resolution: "@types/node@npm:18.19.57" + version: 18.19.60 + resolution: "@types/node@npm:18.19.60" dependencies: undici-types: ~5.26.4 - checksum: d7be072513df5f6b14384dc284561ddf4e6393ce85b8fd3cc9ab0c0a7abd03bfdab6519548dab7c743ec9dfca9ce686dde2db0fbbf1d357e0822b4f99a54b193 + checksum: 3cd21254a9f2175d6f652d9d5b9afc0261903e0dfd54355074bf5bd81d6606738bcfdb5581538037e9bd42886c8f5e96596245409fb8cde7fe13751d07bc1495 languageName: node linkType: hard @@ -3730,12 +3710,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18.0.26": - version: 18.3.11 - resolution: "@types/react@npm:18.3.11" + version: 18.3.12 + resolution: "@types/react@npm:18.3.12" dependencies: "@types/prop-types": "*" csstype: ^3.0.2 - checksum: 6cbf36673b64e758dd61b16c24139d015f58530e0d476777de26ba83f24b55e142fbf64e3b8f6b3c7b05ed9ba548551b2a62d9ffb0f95743d0a368646a619163 + checksum: 4ab1577a8c2105a5e316536f724117c90eee5f4bd5c137fc82a2253d8c1fd299dedaa07e8dfc95d6e2f04a4be3cb8b0e1b06098c6233ebd55c508d88099395b7 languageName: node linkType: hard @@ -4224,11 +4204,11 @@ __metadata: linkType: hard "acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.13.0 - resolution: "acorn@npm:8.13.0" + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: f1541f05eb5d6ff67990d1927290809b1ebb663ac96d9c7057c935cf29c5bcaba6d39f37bd007f4bb814f162f142b0f2b2dd4b14128b8fcfaf9f0508a6f05f1c + checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 languageName: node linkType: hard @@ -4649,16 +4629,16 @@ __metadata: linkType: hard "browserslist@npm:^4.21.10": - version: 4.24.0 - resolution: "browserslist@npm:4.24.0" + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" dependencies: - caniuse-lite: ^1.0.30001663 - electron-to-chromium: ^1.5.28 + caniuse-lite: ^1.0.30001669 + electron-to-chromium: ^1.5.41 node-releases: ^2.0.18 - update-browserslist-db: ^1.1.0 + update-browserslist-db: ^1.1.1 bin: browserslist: cli.js - checksum: de200d3eb8d6ed819dad99719099a28fb6ebeb88016a5ac42fbdc11607e910c236a84ca1b0bbf232477d4b88ab64e8ab6aa67557cdd40a73ca9c2834f92ccce0 + checksum: cf64085f12132d38638f38937a255edb82c7551b164a98577b055dd79719187a816112f7b97b9739e400c4954cd66479c0d7a843cb816e346f4795dc24fd5d97 languageName: node linkType: hard @@ -4839,10 +4819,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001663": - version: 1.0.30001669 - resolution: "caniuse-lite@npm:1.0.30001669" - checksum: 8ed0c69d0c6aa3b1cbc5ba4e5f5330943e7b7165e257f6955b8b73f043d07ad922265261f2b54d9bbaf02886bbdba5e6f5b16662310a13f91f17035af3212de1 +"caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001674 + resolution: "caniuse-lite@npm:1.0.30001674" + checksum: 05bbb4f9823b38ac157678be69c4ec4aa39fbbf6af3ffaffe89c8f5b118a1883d2e7c0065e9a71149061ab653bf332f2fa6256c195b16db85e49651b52f109df languageName: node linkType: hard @@ -4856,7 +4836,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.3.0, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -5843,10 +5823,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.28": - version: 1.5.41 - resolution: "electron-to-chromium@npm:1.5.41" - checksum: 942cc53beabeb0647598d432155e2c21bed0de3dfd46576112aeed4157ea59543875c8a99038c5b05e8843fb3b91f14278ed4ea2bf4943845b26456ec20d2c9b +"electron-to-chromium@npm:^1.5.41": + version: 1.5.49 + resolution: "electron-to-chromium@npm:1.5.49" + checksum: 84d4fde02a6de9464f8de2933e2172253098bf219a368cfd0e1ec71b73f9c0800a9ddf7bfdf57408e5fedef858561eaaf4e30ebbf20d94244a6001d570ce07a9 languageName: node linkType: hard @@ -6203,7 +6183,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 @@ -8871,9 +8851,9 @@ __metadata: linkType: hard "memoize-one@npm:^4.0.0": - version: 4.0.3 - resolution: "memoize-one@npm:4.0.3" - checksum: addd18c046542f57440ba70bf8ebd48663d17626cade681f777522ef70900a87ec72c5041bed8ece4f6d40a2cb58803bae388b50a4b740d64f36bcda20c147b7 + version: 4.1.0 + resolution: "memoize-one@npm:4.1.0" + checksum: 5a0c5a0795c4af01649797dc7a417d441edda6e5933510aebd47b57a1ea84d31c42092aee03b0d1d969c102b57d45ba673b593228cd507c82e577a69847dfbae languageName: node linkType: hard @@ -12244,13 +12224,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -12572,7 +12545,7 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": +"undici-types@npm:~6.19.8": version: 6.19.8 resolution: "undici-types@npm:6.19.8" checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 @@ -12643,7 +12616,7 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": +"update-browserslist-db@npm:^1.1.1": version: 1.1.1 resolution: "update-browserslist-db@npm:1.1.1" dependencies: @@ -13376,8 +13349,8 @@ __metadata: linkType: hard "yjs-widgets@npm:^0.3.7": - version: 0.3.7 - resolution: "yjs-widgets@npm:0.3.7" + version: 0.3.8 + resolution: "yjs-widgets@npm:0.3.8" dependencies: "@jupyter/ydoc": ^2.0.0 || ^3.0.0-a3 "@jupyterlab/application": ^4.0.0 @@ -13393,7 +13366,7 @@ __metadata: uuid: ^9.0.0 webpack: ^5.77.0 webpack-cli: ^5.0.1 - checksum: 3e1336aa1b454e714da44fa071a12b0f0d2a76791fe659eed66dfe17c2015b0b92837cf5b88a077d9f2cd4fda7629e4aeb5954dc973820c28ae1d7eee7ee052e + checksum: 1bd4d2f69a826fd8bf8b58c656afe7c7f246e070dab8676e12804afcf8e0c337ae8f569b4764e22a696db9ab10f3c65cc7778b653bcc98e767d1e9e5e0d0a865 languageName: node linkType: hard