From d48292749a6ae7f56320047018a3762f6bbfa9a0 Mon Sep 17 00:00:00 2001 From: liamb27 <157428166+liamb27@users.noreply.github.com> Date: Sun, 31 Mar 2024 23:57:39 -0700 Subject: [PATCH 01/48] Update Widget List.ipynb Example for FloatLogSlider labeled min and max in reverse order; changed it so it is correct. --- docs/source/examples/Widget List.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/examples/Widget List.ipynb b/docs/source/examples/Widget List.ipynb index 57164f6015..9df098100d 100644 --- a/docs/source/examples/Widget List.ipynb +++ b/docs/source/examples/Widget List.ipynb @@ -169,8 +169,8 @@ "widgets.FloatLogSlider(\n", " value=10,\n", " base=10,\n", - " min=-10, # max exponent of base\n", - " max=10, # min exponent of base\n", + " min=-10, # min exponent of base\n", + " max=10, # max exponent of base\n", " step=0.2, # exponent step\n", " description='Log Slider'\n", ")" From 3fec38a0e44e95664c6822322a803f925249f9eb Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 26 May 2024 10:07:46 +1000 Subject: [PATCH 02/48] Update package imports 1. @lumino/messaging ^2.1 should be ^2.0.1 2. @lumino/messaging ^2.1 should be ^2.0.1 3. istanbul-instrumenter-loader is not maintaned for 6 years --- packages/base-manager/package.json | 1 - packages/base/package.json | 3 +-- packages/controls/package.json | 7 +++---- packages/html-manager/package.json | 2 +- python/jupyterlab_widgets/package.json | 11 +++++++++++ python/widgetsnbextension/package.json | 2 +- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/base-manager/package.json b/packages/base-manager/package.json index 41dcbd1f21..3921c38873 100644 --- a/packages/base-manager/package.json +++ b/packages/base-manager/package.json @@ -50,7 +50,6 @@ "chai": "^4.0.0", "chai-as-promised": "^7.0.0", "expect.js": "^0.3.1", - "istanbul-instrumenter-loader": "^3.0.1", "karma": "^6.3.3", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", diff --git a/packages/base/package.json b/packages/base/package.json index bc576c14f7..54e434f145 100644 --- a/packages/base/package.json +++ b/packages/base/package.json @@ -35,7 +35,7 @@ "dependencies": { "@jupyterlab/services": "^6.0.0 || ^7.0.0", "@lumino/coreutils": "^1.11.1 || ^2.1", - "@lumino/messaging": "^1.10.1 || ^2.1", + "@lumino/messaging": "^1.10.1 || ^2.0.1", "@lumino/widgets": "^1.30.0 || ^2.1", "@types/backbone": "1.4.14", "@types/lodash": "^4.14.134", @@ -55,7 +55,6 @@ "chai": "^4.0.0", "chai-as-promised": "^7.0.0", "expect.js": "^0.3.1", - "istanbul-instrumenter-loader": "^3.0.1", "karma": "^6.3.3", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", diff --git a/packages/controls/package.json b/packages/controls/package.json index 8c1d90f663..3ad03c66a2 100644 --- a/packages/controls/package.json +++ b/packages/controls/package.json @@ -34,10 +34,10 @@ "test:unit:ie": "npm run test:unit:default -- --browsers=IE" }, "dependencies": { - "@jupyter-widgets/base": "^6.0.8", - "@lumino/algorithm": "^1.9.1 || ^2.1", + "@jupyter-widgets/base": "^6.0.7", + "@lumino/algorithm": "^1.9.2 || ^2.0.1", "@lumino/domutils": "^1.8.1 || ^2.1", - "@lumino/messaging": "^1.10.1 || ^2.1", + "@lumino/messaging": "^1.10.1 || ^2.0.1", "@lumino/signaling": "^1.10.1 || ^2.1", "@lumino/widgets": "^1.30.0 || ^2.1", "d3-color": "^3.0.1", @@ -57,7 +57,6 @@ "chai": "^4.0.0", "css-loader": "^6.5.1", "expect.js": "^0.3.1", - "istanbul-instrumenter-loader": "^3.0.1", "karma": "^6.3.3", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", diff --git a/packages/html-manager/package.json b/packages/html-manager/package.json index aed9619ec9..8fbc380345 100644 --- a/packages/html-manager/package.json +++ b/packages/html-manager/package.json @@ -44,7 +44,7 @@ "@jupyterlab/outputarea": "^3.0.0 || ^4.0.0", "@jupyterlab/rendermime": "^3.0.0 || ^4.0.0", "@jupyterlab/rendermime-interfaces": "^3.0.0 || ^4.0.0", - "@lumino/messaging": "^1.10.1 || ^2.1", + "@lumino/messaging": "^1.10.1 || ^2.0.1", "@lumino/widgets": "^1.30.0 || ^2.1", "ajv": "^8.6.0", "jquery": "^3.1.1" diff --git a/python/jupyterlab_widgets/package.json b/python/jupyterlab_widgets/package.json index 71fafd5410..412c8b463a 100644 --- a/python/jupyterlab_widgets/package.json +++ b/python/jupyterlab_widgets/package.json @@ -93,5 +93,16 @@ "extension": true, "outputDir": "labextension", "schemaDir": "./schema" + }, + "optionalDependencies": { + "react": "^18.3.1" + }, + "peerDependencies": { + "react": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } } diff --git a/python/widgetsnbextension/package.json b/python/widgetsnbextension/package.json index 502030aa7f..f5610f081d 100644 --- a/python/widgetsnbextension/package.json +++ b/python/widgetsnbextension/package.json @@ -28,7 +28,7 @@ "@jupyter-widgets/html-manager": "^1.0.11", "@jupyter-widgets/output": "^6.0.8", "@jupyterlab/services": "^6.0.0 || ^7.0.0", - "@lumino/messaging": "^1.10.1 || ^2.1", + "@lumino/messaging": "^1.10.1 || ^2.0.1", "@lumino/widgets": "^1.30.0 || ^2.1", "backbone": "1.4.0" }, From 2baf3d663ee8c9c33b805fe96ceea6534702960b Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 26 May 2024 10:25:17 +1000 Subject: [PATCH 03/48] Fix/unify tooltips. --- packages/base/src/widget.ts | 10 ++++++++-- packages/controls/src/widget_bool.ts | 13 +++++-------- packages/controls/src/widget_description.ts | 3 ++- packages/controls/src/widget_selection.ts | 8 ++------ packages/controls/src/widget_string.ts | 16 ++++------------ .../ipywidgets/widgets/widget_output.py | 1 + 6 files changed, 22 insertions(+), 29 deletions(-) diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index aea060fc8d..f4e450b341 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -1096,14 +1096,20 @@ export class DOMWidgetView extends WidgetView { } updateTooltip(): void { - const title = this.model.get('tooltip'); + const title = this.tooltip; if (!title) { this.el.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { + } else if (!this.model.get('description')) { this.el.setAttribute('title', title); } } + get tooltip() { + return ( + this.model.get('tooltip') ?? (this.model.get('description')) + ); + } + /** * Update the DOM classes applied to an element, default to this.el. */ diff --git a/packages/controls/src/widget_bool.ts b/packages/controls/src/widget_bool.ts index a08d9ff693..bb7e0ee72a 100644 --- a/packages/controls/src/widget_bool.ts +++ b/packages/controls/src/widget_bool.ts @@ -153,8 +153,7 @@ export class CheckboxView extends DescriptionView { this.descriptionSpan.textContent = description; } this.typeset(this.descriptionSpan); - this.descriptionSpan.title = description; - this.checkbox.title = description; + this.updateTooltip(); } /** @@ -181,13 +180,11 @@ export class CheckboxView extends DescriptionView { } updateTooltip(): void { + super.updateTooltip(); if (!this.checkbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.checkbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.checkbox.setAttribute('title', title); - } + const title = this.tooltip; + this.checkbox.setAttribute('title', title); + this.descriptionSpan.setAttribute('title', title); } events(): { [e: string]: string } { diff --git a/packages/controls/src/widget_description.ts b/packages/controls/src/widget_description.ts index 2b0ccdcf7f..67aec82c32 100644 --- a/packages/controls/src/widget_description.ts +++ b/packages/controls/src/widget_description.ts @@ -98,8 +98,9 @@ export class DescriptionView extends DOMWidgetView { } updateTooltip(): void { + super.updateTooltip(); if (!this.label) return; - this.label.title = this.model.get('tooltip'); + this.label.title = this.tooltip; } label: HTMLLabelElement; diff --git a/packages/controls/src/widget_selection.ts b/packages/controls/src/widget_selection.ts index 11174799cd..5eb37e2752 100644 --- a/packages/controls/src/widget_selection.ts +++ b/packages/controls/src/widget_selection.ts @@ -68,13 +68,9 @@ export class SelectionView extends DescriptionView { } updateTooltip(): void { + super.updateTooltip(); if (!this.listbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.listbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.listbox.setAttribute('title', title); - } + this.listbox.setAttribute('title', this.tooltip); } listbox: HTMLSelectElement; diff --git a/packages/controls/src/widget_string.ts b/packages/controls/src/widget_string.ts index 4bdef6c28d..3c708398d8 100644 --- a/packages/controls/src/widget_string.ts +++ b/packages/controls/src/widget_string.ts @@ -379,13 +379,9 @@ export class TextareaView extends StringView { } updateTooltip(): void { + super.updateTooltip(); if (!this.textbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.textbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.textbox.setAttribute('title', title); - } + this.textbox.setAttribute('title', this.tooltip); } events(): { [e: string]: string } { @@ -505,13 +501,9 @@ export class TextView extends StringView { } updateTooltip(): void { + super.updateTooltip(); if (!this.textbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.textbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.textbox.setAttribute('title', title); - } + this.textbox.setAttribute('title', this.tooltip); } update(options?: any): void { diff --git a/python/ipywidgets/ipywidgets/widgets/widget_output.py b/python/ipywidgets/ipywidgets/widgets/widget_output.py index 150ac93471..c8729d9fed 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget_output.py +++ b/python/ipywidgets/ipywidgets/widgets/widget_output.py @@ -59,6 +59,7 @@ def func(): msg_id = Unicode('', help="Parent message id of messages to capture").tag(sync=True) outputs = TypedTuple(trait=Dict(), help="The output messages synced from the frontend.").tag(sync=True) + tooltip = Unicode('', allow_none=True, help="A tooltip caption.").tag(sync=True) __counter = 0 From 53adf7572c494f9d74a1c064aae505a38ab2fc75 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 26 May 2024 10:28:06 +1000 Subject: [PATCH 04/48] DirectionalLinkModel - remove link to source and target on cleanup. --- packages/controls/src/widget_link.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/controls/src/widget_link.ts b/packages/controls/src/widget_link.ts index 2b90330e41..7de1904898 100644 --- a/packages/controls/src/widget_link.ts +++ b/packages/controls/src/widget_link.ts @@ -85,9 +85,12 @@ export class DirectionalLinkModel extends CoreWidgetModel { undefined ); this.stopListening(this.sourceModel, 'destroy', undefined); + this.set('source', [null, '']); } if (this.targetModel) { this.stopListening(this.targetModel, 'destroy', undefined); + this.set('target', [null, '']); + this.save_changes(); } } From b9d043e1bb4b2ff48d35843e44eeeb79485c94c7 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 26 May 2024 10:39:20 +1000 Subject: [PATCH 05/48] Add weakref with opt in automatic widget deletion using 'enable_weakreference'. --- .../ipywidgets/ipywidgets/widgets/__init__.py | 2 +- .../ipywidgets/widgets/tests/test_widget.py | 173 +++++++++++++++++- .../widgets/tests/test_widget_box.py | 92 ++++++++-- .../ipywidgets/ipywidgets/widgets/widget.py | 159 ++++++++++------ 4 files changed, 350 insertions(+), 76 deletions(-) diff --git a/python/ipywidgets/ipywidgets/widgets/__init__.py b/python/ipywidgets/ipywidgets/widgets/__init__.py index b90d3ee111..0951bad905 100644 --- a/python/ipywidgets/ipywidgets/widgets/__init__.py +++ b/python/ipywidgets/ipywidgets/widgets/__init__.py @@ -1,7 +1,7 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -from .widget import Widget, CallbackDispatcher, register, widget_serialization +from .widget import Widget, CallbackDispatcher, register, widget_serialization, enable_weakreference, disable_weakreference from .domwidget import DOMWidget from .valuewidget import ValueWidget diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py index c5aa36048a..34fd9402a2 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py @@ -3,17 +3,21 @@ """Test Widget.""" +import copy +import gc import inspect +import weakref import pytest from IPython.core.interactiveshell import InteractiveShell from IPython.display import display from IPython.utils.capture import capture_output +import ipywidgets as ipw + from .. import widget from ..widget import Widget from ..widget_button import Button -import copy def test_no_widget_view(): @@ -88,4 +92,169 @@ def test_widget_copy(): with pytest.raises(NotImplementedError): copy.copy(button) with pytest.raises(NotImplementedError): - copy.deepcopy(button) \ No newline at end of file + copy.deepcopy(button) + + +def test_widget_open(): + button = Button() + model_id = button.model_id + assert model_id in widget._instances + spec = button.get_view_spec() + assert list(spec) == ["version_major", "version_minor", "model_id"] + assert spec["model_id"] + button.close() + assert model_id not in widget._instances + with pytest.raises(RuntimeError, match="Widget is closed"): + button.open() + with pytest.raises(RuntimeError, match="Widget is closed"): + button.get_view_spec() + + +@pytest.mark.parametrize( + "class_name", + [ + "Accordion", + "AppLayout", + "Audio", + "BoundedFloatText", + "BoundedIntText", + "Box", + "Button", + "ButtonStyle", + "Checkbox", + "ColorPicker", + "ColorsInput", + "Combobox", + "Controller", + "CoreWidget", + "DOMWidget", + "DatePicker", + "DatetimePicker", + "Dropdown", + "FileUpload", + "FloatLogSlider", + "FloatProgress", + "FloatRangeSlider", + "FloatSlider", + "FloatText", + "FloatsInput", + "GridBox", + "HBox", + "HTML", + "HTMLMath", + "Image", + "IntProgress", + "IntRangeSlider", + "IntSlider", + "IntText", + "IntsInput", + "Label", + "Layout", + "NaiveDatetimePicker", + "Output", + "Password", + "Play", + "RadioButtons", + "Select", + "SelectMultiple", + "SelectionRangeSlider", + "SelectionSlider", + "SliderStyle", + "Stack", + "Style", + "Tab", + "TagsInput", + "Text", + "Textarea", + "TimePicker", + "ToggleButton", + "ToggleButtons", + "ToggleButtonsStyle", + "TwoByTwoLayout", + "VBox", + "Valid", + "ValueWidget", + "Video", + "Widget", + ], +) +@pytest.mark.parametrize("enable_weakref", [True, False]) +def test_weakreference(class_name, enable_weakref): + # Ensure the base instance of all widgets can be deleted / garbage collected. + if enable_weakref: + ipw.enable_weakreference() + cls = getattr(ipw, class_name) + if class_name in ['SelectionRangeSlider', 'SelectionSlider']: + kwgs = {"options": [1, 2, 4]} + else: + kwgs = {} + try: + w = cls(**kwgs) + deleted = False + def on_delete(): + nonlocal deleted + deleted = True + weakref.finalize(w, on_delete) + # w should be the only strong ref to the widget. + # calling `del` should invoke its immediate deletion calling the `__del__` method. + if not enable_weakref: + w.close() + del w + gc.collect() + assert deleted + finally: + if enable_weakref: + ipw.disable_weakreference() + + +@pytest.mark.parametrize("weakref_enabled", [True, False]) +def test_button_weakreference(weakref_enabled: bool): + try: + click_count = 0 + deleted = False + + def on_delete(): + nonlocal deleted + deleted = True + + class TestButton(Button): + def my_click(self, b): + nonlocal click_count + click_count += 1 + + b = TestButton(description="button") + weakref.finalize(b, on_delete) + b_ref = weakref.ref(b) + assert b in widget._instances.values() + + b.on_click(b.my_click) + b.on_click(lambda x: setattr(x, "clicked", True)) + + b.click() + assert click_count == 1 + + if weakref_enabled: + ipw.enable_weakreference() + assert b in widget._instances.values(), "Instances not transferred" + ipw.disable_weakreference() + assert b in widget._instances.values(), "Instances not transferred" + ipw.enable_weakreference() + assert b in widget._instances.values(), "Instances not transferred" + + b.click() + assert click_count == 2 + assert getattr(b, "clicked") + + del b + gc.collect() + if weakref_enabled: + assert deleted + else: + assert not deleted + assert b_ref() in widget._instances.values() + b_ref().close() + gc.collect() + assert deleted, "Closing should remove the last strong reference." + + finally: + ipw.disable_weakreference() diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py index 551f68dcc4..5d50324d08 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py @@ -1,33 +1,85 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -from unittest import TestCase +import gc +import weakref +import pytest from traitlets import TraitError import ipywidgets as widgets -class TestBox(TestCase): +def test_box_construction(): + box = widgets.Box() + assert box.get_state()["children"] == [] - def test_construction(self): - box = widgets.Box() - assert box.get_state()['children'] == [] - def test_construction_with_children(self): - html = widgets.HTML('some html') - slider = widgets.IntSlider() - box = widgets.Box([html, slider]) - children_state = box.get_state()['children'] - assert children_state == [ - widgets.widget._widget_to_json(html, None), - widgets.widget._widget_to_json(slider, None), - ] +def test_box_construction_with_children(): + html = widgets.HTML("some html") + slider = widgets.IntSlider() + box = widgets.Box([html, slider]) + children_state = box.get_state()["children"] + assert children_state == [ + widgets.widget._widget_to_json(html, None), + widgets.widget._widget_to_json(slider, None), + ] - def test_construction_style(self): - box = widgets.Box(box_style='warning') - assert box.get_state()['box_style'] == 'warning' - def test_construction_invalid_style(self): - with self.assertRaises(TraitError): - widgets.Box(box_style='invalid') +def test_box_construction_style(): + box = widgets.Box(box_style="warning") + assert box.get_state()["box_style"] == "warning" + + +def test_construction_invalid_style(): + with pytest.raises(TraitError): + widgets.Box(box_style="invalid") + + +def test_box_validate_mode(): + slider = widgets.IntSlider() + closed_button = widgets.Button() + closed_button.close() + with pytest.raises(TraitError, match="Invalid or closed items found.*"): + widgets.Box( + children=[closed_button, slider, "Not a widget"] + ) + box = widgets.Box( + children=[closed_button, slider, "Not a widget"], + validate_mode="log_error", + ) + assert len (box.children) == 1, "Invalid items should be dropped." + assert slider in box.children + + box.validate_mode = "raise" + with pytest.raises(TraitError): + box.children += ("Not a widget", closed_button) + + +def test_box_gc(): + widgets.VBox._active_widgets + widgets.enable_weakreference() + # Test Box gc collected and children lifecycle managed. + try: + deleted = False + + class TestButton(widgets.Button): + def my_click(self, b): + pass + + button = TestButton(description="button") + button.on_click(button.my_click) + + b = widgets.VBox(children=[button]) + + def on_delete(): + nonlocal deleted + deleted = True + + weakref.finalize(b, on_delete) + del b + gc.collect() + assert deleted + widgets.VBox._active_widgets + finally: + widgets.disable_weakreference() diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index 2dc674097d..e90cdfea5d 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -6,13 +6,13 @@ in the Jupyter notebook front-end. """ import os -import sys import typing +import weakref from contextlib import contextmanager from collections.abc import Iterable from IPython import get_ipython from traitlets import ( - Any, HasTraits, Unicode, Dict, Instance, List, Int, Set, Bytes, observe, default, Container, + Any, HasTraits, Unicode, Dict, Instance, List, Int, Set, observe, default, Container, Undefined) from json import loads as jsonloads, dumps as jsondumps from .. import comm @@ -41,17 +41,39 @@ def envset(name, default): PROTOCOL_VERSION_MAJOR = __protocol_version__.split('.')[0] CONTROL_PROTOCOL_VERSION_MAJOR = __control_protocol_version__.split('.')[0] JUPYTER_WIDGETS_ECHO = envset('JUPYTER_WIDGETS_ECHO', default=True) -# we keep a strong reference for every widget created, for a discussion on using weak references see: +# for a discussion on using weak references see: # https://github.com/jupyter-widgets/ipywidgets/issues/1345 _instances : typing.MutableMapping[str, "Widget"] = {} +def enable_weakreference(): + """Use a WeakValueDictionary instead of a standard dictionary to map + `comm_id` to `widget` for every widget instance. + + By default widgets are mapped using a standard dictionary. Use this feature + to permit widget garbage collection. + """ + global _instances + if not isinstance(_instances, weakref.WeakValueDictionary): + _instances = weakref.WeakValueDictionary(_instances) + +def disable_weakreference(): + """Use a Dictionary to map `comm_id` to `widget` for every widget instance. + + Note: this is the default setting and maintains a strong reference to the + the widget preventing automatic garbage collection. If the close method + is called, the widget will remove itself enabling garbage collection. + """ + global _instances + if isinstance(_instances, weakref.WeakValueDictionary): + _instances = dict(_instances) + def _widget_to_json(x, obj): - if isinstance(x, dict): - return {k: _widget_to_json(v, obj) for k, v in x.items()} + if isinstance(x, Widget): + return f"IPY_MODEL_{x.model_id}" elif isinstance(x, (list, tuple)): return [_widget_to_json(v, obj) for v in x] - elif isinstance(x, Widget): - return "IPY_MODEL_" + x.model_id + elif isinstance(x, dict): + return {k: _widget_to_json(v, obj) for k, v in x.items()} else: return x @@ -215,18 +237,6 @@ def register_callback(self, callback, remove=False): elif not remove and callback not in self.callbacks: self.callbacks.append(callback) -def _show_traceback(method): - """decorator for showing tracebacks""" - def m(self, *args, **kwargs): - try: - return(method(self, *args, **kwargs)) - except Exception as e: - ip = get_ipython() - if ip is None: - self.log.warning("Exception in widget method %s: %s", method, e, exc_info=True) - else: - ip.showtraceback() - return m class WidgetRegistry: @@ -304,7 +314,7 @@ class Widget(LoggingHasTraits): #------------------------------------------------------------------------- _widget_construction_callback = None _control_comm = None - + @_staticproperty def widgets(): # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user @@ -461,7 +471,7 @@ def _get_embed_state(self, drop_defaults=False): return state def get_view_spec(self): - return dict(version_major=2, version_minor=0, model_id=self._model_id) + return {"version_major":2, "version_minor":0, "model_id": self._model_id} #------------------------------------------------------------------------- # Traits @@ -499,11 +509,12 @@ def _default_keys(self): #------------------------------------------------------------------------- def __init__(self, **kwargs): """Public constructor""" - self._model_id = kwargs.pop('model_id', None) + if 'model_id' in kwargs: + self.comm = self._create_comm(kwargs.pop('model_id')) super().__init__(**kwargs) + self.open() Widget._call_widget_constructed(self) - self.open() def __copy__(self): raise NotImplementedError("Widgets cannot be copied; custom implementation required") @@ -519,53 +530,84 @@ def __del__(self): # Properties #------------------------------------------------------------------------- - def open(self): - """Open a comm to the frontend if one isn't already open.""" - if self.comm is None: - state, buffer_paths, buffers = _remove_buffers(self.get_state()) - args = dict(target_name='jupyter.widget', - data={'state': state, 'buffer_paths': buffer_paths}, - buffers=buffers, - metadata={'version': __protocol_version__} - ) - if self._model_id is not None: - args['comm_id'] = self._model_id + @default('comm') + def _default_comm(self): + return self._create_comm() - self.comm = comm.create_comm(**args) + def open(self): + """Open a comm to the frontend if one isn't already open.""" + assert self._model_id + + + def _create_comm(self, comm_id=None): + """Open a new comm to the frontend.""" + state, buffer_paths, buffers = _remove_buffers(self.get_state()) + self.comm = comm_ = comm.create_comm( + target_name="jupyter.widget", + data={"state": state, "buffer_paths": buffer_paths}, + buffers=buffers, + metadata={"version": __protocol_version__}, + comm_id=comm_id, + ) + return comm_ + @observe('comm') def _comm_changed(self, change): """Called when the comm is changed.""" - if change['new'] is None: - return - self._model_id = self.model_id + if change['old']: + change['old'].on_msg(None) + change['old'].close() + # On python shutdown _instances can be None + if isinstance(_instances, dict): + _instances.pop(change['old'].comm_id, None) + if change['new']: + if isinstance(_instances, dict): + _instances[change['new'].comm_id] = self + + # prevent memory leaks by using a weak reference to self. + ref = weakref.ref(self) + def _handle_msg(msg): + self_ = ref() + if self_ is not None: + try: + self_._handle_msg(msg) + except Exception as e: + self_._show_traceback(self_._handle_msg, e) + + change['new'].on_msg(_handle_msg) + - self.comm.on_msg(self._handle_msg) - _instances[self.model_id] = self @property def model_id(self): + return self._model_id + + @property + def _model_id(self): """Gets the model id of this widget. If a Comm doesn't exist yet, a Comm will be created automagically.""" - return self.comm.comm_id + if not self._repr_mimebundle_: + # a closed widget will not be found at the frontend so raise an error here. + msg = f"Widget is closed: {self!r}" + raise RuntimeError(msg) + return getattr(self.comm, "comm_id", None) + #------------------------------------------------------------------------- # Methods #------------------------------------------------------------------------- def close(self): - """Close method. + """Permanently close the widget. Closes the underlying comm. When the comm is closed, all of the widget views are automatically removed from the front-end.""" - if self.comm is not None: - _instances.pop(self.model_id, None) - self.comm.close() - self.comm = None - self._repr_mimebundle_ = None + self._repr_mimebundle_ = None + self.comm = None def send_state(self, key=None): """Sends the widget state, or a piece of it, to the front-end, if it exists. @@ -693,15 +735,18 @@ def notify_change(self, change): # Send the state to the frontend before the user-registered callbacks # are called. name = change['name'] - if self.comm is not None and getattr(self.comm, 'kernel', True) is not None: + comm = self._trait_values.get('comm') + if comm and getattr(comm, 'kernel', None): # Make sure this isn't information that the front-end just sent us. - if name in self.keys and self._should_send_property(name, getattr(self, name)): + if name in self.keys and self._should_send_property(name, change['new']): # Send new state to front-end self.send_state(key=name) super().notify_change(change) def __repr__(self): - return self._gen_repr_from_keys(self._repr_keys()) + if not self._repr_mimebundle_: + return f'' + return self._gen_repr_from_keys(self._repr_keys()) #------------------------------------------------------------------------- # Support methods @@ -759,7 +804,6 @@ def _should_send_property(self, key, value): return True # Event handlers - @_show_traceback def _handle_msg(self, msg): """Called when a msg is received from the front-end""" data = msg['content']['data'] @@ -785,6 +829,14 @@ def _handle_msg(self, msg): else: self.log.error('Unknown front-end to back-end widget msg with method "%s"' % method) + def _show_traceback(self, method, e:Exception): + ip = get_ipython() + if ip is None: + self.log.warning("Exception in widget method %s: %s", method, e, exc_info=True) + else: + ip.showtraceback() + + def _handle_custom_msg(self, content, buffers): """Called when a custom msg is received.""" self._msg_callbacks(self, content, buffers) @@ -821,8 +873,9 @@ def _repr_mimebundle_(self, **kwargs): def _send(self, msg, buffers=None): """Sends a message to the model in the front-end.""" - if self.comm is not None and (self.comm.kernel is not None if hasattr(self.comm, "kernel") else True): - self.comm.send(data=msg, buffers=buffers) + comm = self.comm + if comm is not None and getattr(comm, "kernel", True): + comm.send(data=msg, buffers=buffers) def _repr_keys(self): traits = self.traits() From cf8ef63c360504f0f5f0ad4664a20ff884ef4fbe Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 26 May 2024 10:55:27 +1000 Subject: [PATCH 06/48] Add Children for Box (and subclasses) to support validation of any type of iterable plus a configurable option to omit invalid items (including closed widgets) and log a warning or error. --- .../ipywidgets/widgets/widget_box.py | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/python/ipywidgets/ipywidgets/widgets/widget_box.py b/python/ipywidgets/ipywidgets/widgets/widget_box.py index 740e54cb1a..598bb40ef2 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/widget_box.py @@ -1,3 +1,4 @@ + # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. @@ -7,14 +8,16 @@ group other widgets together and control their relative layouts. """ +from __future__ import annotations + +import typing + +from traitlets import CaselessStrEnum, TraitError, TraitType, Unicode -from .widget import register, widget_serialization, Widget +from .docutils import doc_subst from .domwidget import DOMWidget +from .widget import Widget, register, widget_serialization from .widget_core import CoreWidget -from .docutils import doc_subst -from .trait_types import TypedTuple -from traitlets import Unicode, CaselessStrEnum, Instance - _doc_snippets = {} _doc_snippets['box_params'] = """ @@ -25,8 +28,35 @@ one of 'success', 'info', 'warning' or 'danger', or ''. Applies a predefined style to the box. Defaults to '', which applies no pre-defined style. + + validate_mode: str + one of 'raise', 'warning', error'. + How invalid children will be treated. + 'raise' will raise a trait error. + 'warning' and 'error' will log an error using box.log dropping + the invalid items from children. """ +class Children(TraitType['tuple[Widget,...]', typing.Iterable[Widget]]): + default_value = () + + def validate(self, obj: Box, value: typing.Iterable[Widget]): + valid, invalid = [], [] + for v in value: + if isinstance(v, Widget) and v._repr_mimebundle_: + valid.append(v) + else: + invalid.append(v) + if invalid: + msg = f'Invalid or closed items found: {invalid}' + if obj.validate_mode == 'log_warning': + obj.log.warning(msg) + elif obj.validate_mode == 'log_error': + obj.log.error(msg) + else: + raise TraitError(msg) + return tuple(valid) + @register @doc_subst(_doc_snippets) @@ -48,19 +78,23 @@ class Box(DOMWidget, CoreWidget): """ _model_name = Unicode('BoxModel').tag(sync=True) _view_name = Unicode('BoxView').tag(sync=True) + tooltip = Unicode('', allow_none=True, help='A tooltip caption.').tag(sync=True) + validate_mode = CaselessStrEnum(['raise', 'log_warning', 'log_error'], 'raise') # Child widgets in the container. # Using a tuple here to force reassignment to update the list. # When a proper notifying-list trait exists, use that instead. - children = TypedTuple(trait=Instance(Widget), help="List of widget children").tag( - sync=True, **widget_serialization) + children = Children(help='List of widget children').tag( + sync=True, **widget_serialization + ) box_style = CaselessStrEnum( values=['success', 'info', 'warning', 'danger', ''], default_value='', help="""Use a predefined styling for the box.""").tag(sync=True) - + def __init__(self, children=(), **kwargs): - kwargs['children'] = children + if children: + kwargs['children'] = children super().__init__(**kwargs) @register From 54bd2c67b49326d1db202fb22b239436d42632c7 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 26 May 2024 11:00:32 +1000 Subject: [PATCH 07/48] Update yarn.lock (ran jlpm dlx yarn-berry-deduplicate). --- yarn.lock | 630 ++++-------------------------------------------------- 1 file changed, 45 insertions(+), 585 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3cf819b206..96205a8920 100644 --- a/yarn.lock +++ b/yarn.lock @@ -751,7 +751,6 @@ __metadata: chai: ^4.0.0 chai-as-promised: ^7.0.0 expect.js: ^0.3.1 - istanbul-instrumenter-loader: ^3.0.1 karma: ^6.3.3 karma-chrome-launcher: ^3.1.0 karma-coverage: ^2.0.3 @@ -777,7 +776,7 @@ __metadata: dependencies: "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/coreutils": ^1.11.1 || ^2.1 - "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.0.1 "@lumino/widgets": ^1.30.0 || ^2.1 "@types/backbone": 1.4.14 "@types/base64-js": ^1.2.5 @@ -793,7 +792,6 @@ __metadata: chai: ^4.0.0 chai-as-promised: ^7.0.0 expect.js: ^0.3.1 - istanbul-instrumenter-loader: ^3.0.1 jquery: ^3.1.1 karma: ^6.3.3 karma-chrome-launcher: ^3.1.0 @@ -820,9 +818,9 @@ __metadata: dependencies: "@jupyter-widgets/base": ^6.0.7 "@jupyterlab/services": ^6.0.0 || ^7.0.0 - "@lumino/algorithm": ^1.9.1 || ^2.1 + "@lumino/algorithm": ^1.9.2 || ^2.0.1 "@lumino/domutils": ^1.8.1 || ^2.1 - "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.0.1 "@lumino/signaling": ^1.10.1 || ^2.1 "@lumino/widgets": ^1.30.0 || ^2.1 "@types/d3-color": ^3.0.2 @@ -837,7 +835,6 @@ __metadata: d3-color: ^3.0.1 d3-format: ^3.0.1 expect.js: ^0.3.1 - istanbul-instrumenter-loader: ^3.0.1 jquery: ^3.1.1 karma: ^6.3.3 karma-chrome-launcher: ^3.1.0 @@ -948,7 +945,7 @@ __metadata: "@jupyterlab/outputarea": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime-interfaces": ^3.0.0 || ^4.0.0 - "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.0.1 "@lumino/widgets": ^1.30.0 || ^2.1 "@types/jquery": ^3.5.16 "@types/mocha": ^9.0.0 @@ -1017,10 +1014,19 @@ __metadata: jquery: ^3.1.1 npm-run-all: ^4.1.5 prettier: ^2.3.2 + react: ^18.3.1 rimraf: ^3.0.2 semver: ^7.3.5 source-map-loader: ^4.0.1 typescript: ~4.9.4 + peerDependencies: + react: "*" + dependenciesMeta: + react: + optional: true + peerDependenciesMeta: + react: + optional: true languageName: unknown linkType: soft @@ -1034,7 +1040,7 @@ __metadata: "@jupyter-widgets/html-manager": ^1.0.10 "@jupyter-widgets/output": ^6.0.7 "@jupyterlab/services": ^6.0.0 || ^7.0.0 - "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.0.1 "@lumino/widgets": ^1.30.0 || ^2.1 backbone: 1.4.0 css-loader: ^6.5.1 @@ -2755,20 +2761,13 @@ __metadata: languageName: node linkType: hard -"@lumino/algorithm@npm:^1.11.1 || ^2.0.0, @lumino/algorithm@npm:^2.0.1": +"@lumino/algorithm@npm:^1.11.1 || ^2.0.0, @lumino/algorithm@npm:^1.9.2 || ^2.0.1, @lumino/algorithm@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/algorithm@npm:2.0.1" checksum: cbf7fcf6ee6b785ea502cdfddc53d61f9d353dcb9659343511d5cd4b4030be2ff2ca4c08daec42f84417ab0318a3d9972a17319fa5231693e109ab112dcf8000 languageName: node linkType: hard -"@lumino/algorithm@npm:^1.9.1 || ^2.1, @lumino/algorithm@npm:^1.9.2": - version: 1.9.2 - resolution: "@lumino/algorithm@npm:1.9.2" - checksum: a89e7c63504236119634858e271db1cc649684d30ced5a6ebe2788af7c0837f1e05a6fd3047d8525eb756c42ce137f76b3688f75fd3ef915b71cd4f213dfbb96 - languageName: node - linkType: hard - "@lumino/application@npm:^2.3.1": version: 2.3.1 resolution: "@lumino/application@npm:2.3.1" @@ -2780,15 +2779,6 @@ __metadata: languageName: node linkType: hard -"@lumino/collections@npm:^1.9.3": - version: 1.9.3 - resolution: "@lumino/collections@npm:1.9.3" - dependencies: - "@lumino/algorithm": ^1.9.2 - checksum: 1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 - languageName: node - linkType: hard - "@lumino/collections@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/collections@npm:2.0.1" @@ -2860,17 +2850,7 @@ __metadata: languageName: node linkType: hard -"@lumino/messaging@npm:^1.10.1 || ^2.1": - version: 1.10.3 - resolution: "@lumino/messaging@npm:1.10.3" - dependencies: - "@lumino/algorithm": ^1.9.2 - "@lumino/collections": ^1.9.3 - checksum: 1131e80379fa9b8a9b5d3418c90e25d4be48e2c92ec711518190772f9e8845a695bef45daddd06a129168cf6f158c8ad80ae86cb245f566e9195bbd9a0843b7a - languageName: node - linkType: hard - -"@lumino/messaging@npm:^2.0.1": +"@lumino/messaging@npm:^1.10.1 || ^2.0.1, @lumino/messaging@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/messaging@npm:2.0.1" dependencies: @@ -3758,14 +3738,7 @@ __metadata: languageName: node linkType: hard -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - -"@types/minimatch@npm:^3.0.3": +"@types/minimatch@npm:*, @types/minimatch@npm:^3.0.3": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 @@ -3786,16 +3759,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 20.12.12 - resolution: "@types/node@npm:20.12.12" - dependencies: - undici-types: ~5.26.4 - checksum: 5373983874b9af7c216e7ca5d26b32a8d9829c703a69f1e66f2113598b5be8582c0e009ca97369f1ec9a6282b3f92812208d06eb1e9fc3bd9b939b022303d042 - languageName: node - linkType: hard - -"@types/node@npm:^17.0.2": +"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:^17.0.2": version: 17.0.45 resolution: "@types/node@npm:17.0.45" checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 @@ -3868,16 +3832,7 @@ __metadata: languageName: node linkType: hard -"@types/sinon@npm:*": - version: 17.0.3 - resolution: "@types/sinon@npm:17.0.3" - dependencies: - "@types/sinonjs__fake-timers": "*" - checksum: c8e9956d9c90fe1ec1cc43085ae48897f93f9ea86e909ab47f255ea71f5229651faa070393950fb6923aef426c84e92b375503f9f8886ef44668b82a8ee49e9a - languageName: node - linkType: hard - -"@types/sinon@npm:^10.0.2": +"@types/sinon@npm:*, @types/sinon@npm:^10.0.2": version: 10.0.20 resolution: "@types/sinon@npm:10.0.20" dependencies: @@ -4808,7 +4763,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.12.0": +"ajv@npm:8.12.0, ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -4820,18 +4775,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^5.0.0": - version: 5.5.2 - resolution: "ajv@npm:5.5.2" - dependencies: - co: ^4.6.0 - fast-deep-equal: ^1.0.0 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.3.0 - checksum: a69645c843e1676b0ae1c5192786e546427f808f386d26127c6585479378066c64341ceec0b127b6789d79628e71d2a732d402f575b98f9262db230d7b715a94 - languageName: node - linkType: hard - "ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -4844,32 +4787,13 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": - version: 8.13.0 - resolution: "ajv@npm:8.13.0" - dependencies: - fast-deep-equal: ^3.1.3 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.4.1 - checksum: 6de82d0b2073e645ca3300561356ddda0234f39b35d2125a8700b650509b296f41c00ab69f53178bbe25ad688bd6ac3747ab44101f2f4bd245952e8fd6ccc3c1 - languageName: node - linkType: hard - -"ansi-colors@npm:4.1.1": +"ansi-colors@npm:4.1.1, ansi-colors@npm:^4.1.1": version: 4.1.1 resolution: "ansi-colors@npm:4.1.1" checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 languageName: node linkType: hard -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e - languageName: node - linkType: hard - "ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -4879,13 +4803,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1 - languageName: node - linkType: hard - "ansi-regex@npm:^3.0.0": version: 3.0.1 resolution: "ansi-regex@npm:3.0.1" @@ -4914,13 +4831,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -5202,43 +5112,7 @@ __metadata: languageName: node linkType: hard -"babel-code-frame@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-code-frame@npm:6.26.0" - dependencies: - chalk: ^1.1.3 - esutils: ^2.0.2 - js-tokens: ^3.0.2 - checksum: 9410c3d5a921eb02fa409675d1a758e493323a49e7b9dddb7a2a24d47e61d39ab1129dd29f9175836eac9ce8b1d4c0a0718fcdc57ce0b865b529fd250dbab313 - languageName: node - linkType: hard - -"babel-generator@npm:^6.18.0": - version: 6.26.1 - resolution: "babel-generator@npm:6.26.1" - dependencies: - babel-messages: ^6.23.0 - babel-runtime: ^6.26.0 - babel-types: ^6.26.0 - detect-indent: ^4.0.0 - jsesc: ^1.3.0 - lodash: ^4.17.4 - source-map: ^0.5.7 - trim-right: ^1.0.1 - checksum: 5397f4d4d1243e7157e3336be96c10fcb1f29f73bf2d9842229c71764d9a6431397d249483a38c4d8b1581459e67be4df6f32d26b1666f02d0f5bfc2c2f25193 - languageName: node - linkType: hard - -"babel-messages@npm:^6.23.0": - version: 6.23.0 - resolution: "babel-messages@npm:6.23.0" - dependencies: - babel-runtime: ^6.22.0 - checksum: c8075c17587a33869e1a5bd0a5b73bbe395b68188362dacd5418debbc7c8fd784bcd3295e81ee7e410dc2c2655755add6af03698c522209f6a68334c15e6d6ca - languageName: node - linkType: hard - -"babel-runtime@npm:^6.22.0, babel-runtime@npm:^6.23.0, babel-runtime@npm:^6.26.0": +"babel-runtime@npm:^6.23.0": version: 6.26.0 resolution: "babel-runtime@npm:6.26.0" dependencies: @@ -5248,57 +5122,6 @@ __metadata: languageName: node linkType: hard -"babel-template@npm:^6.16.0": - version: 6.26.0 - resolution: "babel-template@npm:6.26.0" - dependencies: - babel-runtime: ^6.26.0 - babel-traverse: ^6.26.0 - babel-types: ^6.26.0 - babylon: ^6.18.0 - lodash: ^4.17.4 - checksum: 028dd57380f09b5641b74874a19073c53c4fb3f1696e849575aae18f8c80eaf21db75209057db862f3b893ce2cd9b795d539efa591b58f4a0fb011df0a56fbed - languageName: node - linkType: hard - -"babel-traverse@npm:^6.18.0, babel-traverse@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-traverse@npm:6.26.0" - dependencies: - babel-code-frame: ^6.26.0 - babel-messages: ^6.23.0 - babel-runtime: ^6.26.0 - babel-types: ^6.26.0 - babylon: ^6.18.0 - debug: ^2.6.8 - globals: ^9.18.0 - invariant: ^2.2.2 - lodash: ^4.17.4 - checksum: fca037588d2791ae0409f1b7aa56075b798699cccc53ea04d82dd1c0f97b9e7ab17065f7dd3ecd69101d7874c9c8fd5e0f88fa53abbae1fe94e37e6b81ebcb8d - languageName: node - linkType: hard - -"babel-types@npm:^6.18.0, babel-types@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-types@npm:6.26.0" - dependencies: - babel-runtime: ^6.26.0 - esutils: ^2.0.2 - lodash: ^4.17.4 - to-fast-properties: ^1.0.3 - checksum: d16b0fa86e9b0e4c2623be81d0a35679faff24dd2e43cde4ca58baf49f3e39415a011a889e6c2259ff09e1228e4c3a3db6449a62de59e80152fe1ce7398fde76 - languageName: node - linkType: hard - -"babylon@npm:^6.18.0": - version: 6.18.0 - resolution: "babylon@npm:6.18.0" - bin: - babylon: ./bin/babylon.js - checksum: 0777ae0c735ce1cbfc856d627589ed9aae212b84fb0c03c368b55e6c5d3507841780052808d0ad46e18a2ba516e93d55eeed8cd967f3b2938822dfeccfb2a16d - languageName: node - linkType: hard - "backbone@npm:1.4.0": version: 1.4.0 resolution: "backbone@npm:1.4.0" @@ -5731,19 +5554,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: ^2.2.1 - escape-string-regexp: ^1.0.2 - has-ansi: ^2.0.0 - strip-ansi: ^3.0.0 - supports-color: ^2.0.0 - checksum: 9d2ea6b98fc2b7878829eec223abcf404622db6c48396a9b9257f6d0ead2acf18231ae368d6a664a83f272b0679158da12e97b5229f794939e555cc574478acd - languageName: node - linkType: hard - "chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -5798,7 +5608,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3": +"chokidar@npm:3.5.3, chokidar@npm:^3.3.0, chokidar@npm:^3.5.1": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -5817,25 +5627,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.3.0, chokidar@npm:^3.5.1": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -5880,20 +5671,13 @@ __metadata: languageName: node linkType: hard -"cli-spinners@npm:2.6.1": +"cli-spinners@npm:2.6.1, cli-spinners@npm:^2.5.0": version: 2.6.1 resolution: "cli-spinners@npm:2.6.1" checksum: 423409baaa7a58e5104b46ca1745fbfc5888bbd0b0c5a626e052ae1387060839c8efd512fb127e25769b3dc9562db1dc1b5add6e0b93b7ef64f477feb6416a45 languageName: node linkType: hard -"cli-spinners@npm:^2.5.0": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c - languageName: node - linkType: hard - "cli-truncate@npm:^2.1.0": version: 2.1.0 resolution: "cli-truncate@npm:2.1.0" @@ -6008,13 +5792,6 @@ __metadata: languageName: node linkType: hard -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 - languageName: node - linkType: hard - "codemirror@npm:^5.48.0": version: 5.65.16 resolution: "codemirror@npm:5.65.16" @@ -6397,13 +6174,6 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.5.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 - languageName: node - linkType: hard - "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -6462,20 +6232,13 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:1.0.2": +"core-util-is@npm:1.0.2, core-util-is@npm:~1.0.0": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab languageName: node linkType: hard -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - "cors@npm:2.8.5, cors@npm:~2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" @@ -6596,20 +6359,13 @@ __metadata: languageName: node linkType: hard -"csstype@npm:3.0.10": +"csstype@npm:3.0.10, csstype@npm:^3.0.2": version: 3.0.10 resolution: "csstype@npm:3.0.10" checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 - languageName: node - linkType: hard - "custom-event@npm:~1.0.0": version: 1.0.1 resolution: "custom-event@npm:1.0.1" @@ -6712,7 +6468,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.8": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -6918,15 +6674,6 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "detect-indent@npm:4.0.0" - dependencies: - repeating: ^2.0.0 - checksum: 328f273915c1610899bc7d4784ce874413d0a698346364cd3ee5d79afba1c5cf4dbc97b85a801e20f4d903c0598bd5096af32b800dfb8696b81464ccb3dfda2c - languageName: node - linkType: hard - "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -7451,7 +7198,7 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 @@ -7788,27 +7535,13 @@ __metadata: languageName: node linkType: hard -"extsprintf@npm:1.3.0": +"extsprintf@npm:1.3.0, extsprintf@npm:^1.2.0": version: 1.3.0 resolution: "extsprintf@npm:1.3.0" checksum: cee7a4a1e34cffeeec18559109de92c27517e5641991ec6bab849aa64e3081022903dd53084f2080d0d2530803aa5ee84f1e9de642c365452f9e67be8f958ce2 languageName: node linkType: hard -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: a2f29b241914a8d2bad64363de684821b6b1609d06ae68d5b539e4de6b28659715b5bea94a7265201603713b7027d35399d10b0548f09071c5513e65e8323d33 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-deep-equal@npm:1.1.0" - checksum: 69b4c9534d9805f13a341aa72f69641d0b9ae3cc8beb25c64e68a257241c7bb34370266db27ae4fc3c4da0518448c01a5f587a096a211471c86a38facd9a1486 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -8469,7 +8202,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.2.0": +"glob@npm:7.2.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.7": version: 7.2.0 resolution: "glob@npm:7.2.0" dependencies: @@ -8511,20 +8244,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.7": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - "glob@npm:^8.0.1": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -8568,13 +8287,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^9.18.0": - version: 9.18.0 - resolution: "globals@npm:9.18.0" - checksum: e9c066aecfdc5ea6f727344a4246ecc243aaf66ede3bffee10ddc0c73351794c25e727dd046090dcecd821199a63b9de6af299a6e3ba292c8b22f0a80ea32073 - languageName: node - linkType: hard - "globalthis@npm:^1.0.3": version: 1.0.4 resolution: "globalthis@npm:1.0.4" @@ -8723,15 +8435,6 @@ __metadata: languageName: node linkType: hard -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: ^2.0.0 - checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec - languageName: node - linkType: hard - "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" @@ -9246,15 +8949,6 @@ __metadata: languageName: node linkType: hard -"invariant@npm:^2.2.2": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: ^1.0.0 - checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 - languageName: node - linkType: hard - "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -9385,13 +9079,6 @@ __metadata: languageName: node linkType: hard -"is-finite@npm:^1.0.0": - version: 1.1.0 - resolution: "is-finite@npm:1.1.0" - checksum: 532b97ed3d03e04c6bd203984d9e4ba3c0c390efee492bad5d1d1cd1802a68ab27adbd3ef6382f6312bed6c8bb1bd3e325ea79a8dc8fe080ed7a06f5f97b93e7 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -9683,27 +9370,6 @@ __metadata: languageName: node linkType: hard -"istanbul-instrumenter-loader@npm:^3.0.1": - version: 3.0.1 - resolution: "istanbul-instrumenter-loader@npm:3.0.1" - dependencies: - convert-source-map: ^1.5.0 - istanbul-lib-instrument: ^1.7.3 - loader-utils: ^1.1.0 - schema-utils: ^0.3.0 - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 6b2eb9987f79dd451c43e0fcc6fa77bf0f7ac91f3237b7833a07ad6f35e15a6bff579e943edfc2dee203408b6c3a2b4b11f3028b8628cb7304df3decc7552831 - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^1.2.1": - version: 1.2.1 - resolution: "istanbul-lib-coverage@npm:1.2.1" - checksum: 72bfeaa9212f5a6abb243cbce4933712599ba9a6fbdee819f4f5a4cf87ed15cb92772fcab219e93c3712c578774d6d8e54084440423356b3da5d9f8ecaba9888 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -9711,21 +9377,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^1.7.3": - version: 1.10.2 - resolution: "istanbul-lib-instrument@npm:1.10.2" - dependencies: - babel-generator: ^6.18.0 - babel-template: ^6.16.0 - babel-traverse: ^6.18.0 - babel-types: ^6.18.0 - babylon: ^6.18.0 - istanbul-lib-coverage: ^1.2.1 - semver: ^5.3.0 - checksum: c299d73820b0ac93d1c53f436181da09579083dc4a0febadbda93f598f9a5591fe4888c3071a913eede36148d6481fdf163fa0b6ec7156fffe2a95cff965fc51 - languageName: node - linkType: hard - "istanbul-lib-instrument@npm:^5.1.0": version: 5.2.1 resolution: "istanbul-lib-instrument@npm:5.2.1" @@ -9823,13 +9474,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^3.0.2": - version: 3.0.2 - resolution: "js-tokens@npm:3.0.2" - checksum: ff24cf90e6e4ac446eba56e604781c1aaf3bdaf9b13a00596a0ebd972fa3b25dc83c0f0f67289c33252abb4111e0d14e952a5d9ffb61f5c22532d555ebd8d8a9 - languageName: node - linkType: hard - "js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -9867,15 +9511,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^1.3.0": - version: 1.3.0 - resolution: "jsesc@npm:1.3.0" - bin: - jsesc: bin/jsesc - checksum: 9384cc72bf8ef7f2eb75fea64176b8b0c1c5e77604854c72cb4670b7072e112e3baaa69ef134be98cb078834a7812b0bfe676ad441ccd749a59427f5ed2127f1 - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -9926,13 +9561,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^0.3.0": - version: 0.3.1 - resolution: "json-schema-traverse@npm:0.3.1" - checksum: a685c36222023471c25c86cddcff506306ecb8f8941922fd356008419889c41c38e1c16d661d5499d0a561b34f417693e9bb9212ba2b2b2f8f8a345a49e4ec1a - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -9975,17 +9603,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": - version: 1.0.2 - resolution: "json5@npm:1.0.2" - dependencies: - minimist: ^1.2.0 - bin: - json5: lib/cli.js - checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 - languageName: node - linkType: hard - "json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -9995,20 +9612,13 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:3.2.0": +"jsonc-parser@npm:3.2.0, jsonc-parser@npm:^3.2.0": version: 3.2.0 resolution: "jsonc-parser@npm:3.2.0" checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.2.1 - resolution: "jsonc-parser@npm:3.2.1" - checksum: 656d9027b91de98d8ab91b3aa0d0a4cab7dc798a6830845ca664f3e76c82d46b973675bbe9b500fae1de37fd3e81aceacbaa2a57884bf2f8f29192150d2d1ef7 - languageName: node - linkType: hard - "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -10402,20 +10012,13 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.0.5": +"lilconfig@npm:2.0.5, lilconfig@npm:^2.0.5": version: 2.0.5 resolution: "lilconfig@npm:2.0.5" checksum: f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1 languageName: node linkType: hard -"lilconfig@npm:^2.0.5": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -10506,17 +10109,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^1.1.0": - version: 1.4.2 - resolution: "loader-utils@npm:1.4.2" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^1.0.1 - checksum: eb6fb622efc0ffd1abdf68a2022f9eac62bef8ec599cf8adb75e94d1d338381780be6278534170e99edc03380a6d29bc7eb1563c89ce17c5fed3a0b17f1ad804 - languageName: node - linkType: hard - "loader-utils@npm:^2.0.0": version: 2.0.4 resolution: "loader-utils@npm:2.0.4" @@ -10747,7 +10339,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -11100,7 +10692,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -11109,7 +10701,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.0.5": +"minimatch@npm:3.0.5, minimatch@npm:~3.0.4": version: 3.0.5 resolution: "minimatch@npm:3.0.5" dependencies: @@ -11154,15 +10746,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:~3.0.4": - version: 3.0.8 - resolution: "minimatch@npm:3.0.8" - dependencies: - brace-expansion: ^1.1.7 - checksum: 850cca179cad715133132693e6963b0db64ab0988c4d211415b087fc23a3e46321e2c5376a01bf5623d8782aba8bdf43c571e2e902e51fdce7175c7215c29f8b - languageName: node - linkType: hard - "minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -13426,7 +13009,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": +"qs@npm:6.11.0, qs@npm:^6.4.0": version: 6.11.0 resolution: "qs@npm:6.11.0" dependencies: @@ -13435,15 +13018,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.4.0": - version: 6.12.1 - resolution: "qs@npm:6.12.1" - dependencies: - side-channel: ^1.0.6 - checksum: aa761d99e65b6936ba2dd2187f2d9976afbcda38deb3ff1b3fe331d09b0c578ed79ca2abdde1271164b5be619c521ec7db9b34c23f49a074e5921372d16242d5 - languageName: node - linkType: hard - "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -13547,7 +13121,7 @@ __metadata: languageName: node linkType: hard -"react@npm:>=17.0.0 <19.0.0, react@npm:^18.2.0": +"react@npm:>=17.0.0 <19.0.0, react@npm:^18.2.0, react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: @@ -13823,15 +13397,6 @@ __metadata: languageName: node linkType: hard -"repeating@npm:^2.0.0": - version: 2.0.1 - resolution: "repeating@npm:2.0.1" - dependencies: - is-finite: ^1.0.0 - checksum: d2db0b69c5cb0c14dd750036e0abcd6b3c3f7b2da3ee179786b755cf737ca15fa0fff417ca72de33d6966056f4695440e680a352401fc02c95ade59899afbdd0 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -14113,21 +13678,7 @@ __metadata: languageName: node linkType: hard -"sanitize-html@npm:^2.3": - version: 2.13.0 - resolution: "sanitize-html@npm:2.13.0" - dependencies: - deepmerge: ^4.2.2 - escape-string-regexp: ^4.0.0 - htmlparser2: ^8.0.0 - is-plain-object: ^5.0.0 - parse-srcset: ^1.0.2 - postcss: ^8.3.11 - checksum: d88602328306dbbddb9c5e2a5798783a3b38977a7ef40bf81dae31220d7fb583149c1046a33ec6817e9d96d172b1aaa9ea159776eb1ee08f6a0571150114c9bf - languageName: node - linkType: hard - -"sanitize-html@npm:~2.12.1": +"sanitize-html@npm:^2.3, sanitize-html@npm:~2.12.1": version: 2.12.1 resolution: "sanitize-html@npm:2.12.1" dependencies: @@ -14157,15 +13708,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^0.3.0": - version: 0.3.0 - resolution: "schema-utils@npm:0.3.0" - dependencies: - ajv: ^5.0.0 - checksum: 441fa4bd4900afb19eb9da1d8d6271056b71ce3d8b1b73bbece791de1d4c90ac7e97ffc9787607aa53611aaf2996711af7c18ba8669f06b084b218cab1e701e3 - languageName: node - linkType: hard - "schema-utils@npm:^2.7.0": version: 2.7.1 resolution: "schema-utils@npm:2.7.1" @@ -14207,7 +13749,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -14407,7 +13949,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": +"side-channel@npm:^1.0.4": version: 1.0.6 resolution: "side-channel@npm:1.0.6" dependencies: @@ -14586,7 +14128,7 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:3.8.0": +"sonic-boom@npm:3.8.0, sonic-boom@npm:^3.7.0": version: 3.8.0 resolution: "sonic-boom@npm:3.8.0" dependencies: @@ -14604,15 +14146,6 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:^3.7.0": - version: 3.8.1 - resolution: "sonic-boom@npm:3.8.1" - dependencies: - atomic-sleep: ^1.0.0 - checksum: 79c90d7a2f928489fd3d4b68d8f8d747a426ca6ccf83c3b102b36f899d4524463dd310982ab7ab6d6bcfd34b7c7c281ad25e495ad71fbff8fd6fa86d6273fc6b - languageName: node - linkType: hard - "sort-keys@npm:^2.0.0": version: 2.0.0 resolution: "sort-keys@npm:2.0.0" @@ -14723,13 +14256,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.7": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d - languageName: node - linkType: hard - "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" @@ -14992,15 +14518,6 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^3.0.0": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: ^2.0.0 - checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 - languageName: node - linkType: hard - "strip-ansi@npm:^4.0.0": version: 4.0.0 resolution: "strip-ansi@npm:4.0.0" @@ -15101,13 +14618,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 602538c5812b9006404370b5a4b885d3e2a1f6567d314f8b4a41974ffe7d08e525bf92ae0f9c7030e3b4c78e4e34ace55d6a67a74f1571bc205959f5972f88f0 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0, supports-color@npm:^5.4.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -15312,13 +14822,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^1.0.3": - version: 1.0.3 - resolution: "to-fast-properties@npm:1.0.3" - checksum: bd0abb58c4722851df63419de3f6d901d5118f0440d3f71293ed776dd363f2657edaaf2dc470e3f6b7b48eb84aa411193b60db8a4a552adac30de9516c5cc580 - languageName: node - linkType: hard - "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -15398,13 +14901,6 @@ __metadata: languageName: node linkType: hard -"trim-right@npm:^1.0.1": - version: 1.0.1 - resolution: "trim-right@npm:1.0.1" - checksum: 9120af534e006a7424a4f9358710e6e707887b6ccf7ea69e50d6ac6464db1fe22268400def01752f09769025d480395159778153fb98d4a2f6f40d4cf5d4f3b6 - languageName: node - linkType: hard - "tsconfig-paths@npm:^4.1.2": version: 4.2.0 resolution: "tsconfig-paths@npm:4.2.0" @@ -15688,13 +15184,6 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 - languageName: node - linkType: hard - "union@npm:~0.5.0": version: 0.5.0 resolution: "union@npm:0.5.0" @@ -15820,7 +15309,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": +"uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -16070,7 +15559,7 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:8.2.0": +"vscode-jsonrpc@npm:8.2.0, vscode-jsonrpc@npm:^8.0.2": version: 8.2.0 resolution: "vscode-jsonrpc@npm:8.2.0" checksum: f302a01e59272adc1ae6494581fa31c15499f9278df76366e3b97b2236c7c53ebfc71efbace9041cfd2caa7f91675b9e56f2407871a1b3c7f760a2e2ee61484a @@ -16084,13 +15573,6 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:^8.0.2": - version: 8.2.1 - resolution: "vscode-jsonrpc@npm:8.2.1" - checksum: 2af2c333d73f6587896a7077978b8d4b430e55c674d5dbb90597a84a6647057c1655a3bff398a9b08f1f8ba57dbd2deabf05164315829c297b0debba3b8bc19e - languageName: node - linkType: hard - "vscode-languageserver-protocol@npm:^3.17.0": version: 3.17.5 resolution: "vscode-languageserver-protocol@npm:3.17.5" @@ -16585,22 +16067,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.11.0": - version: 8.17.0 - resolution: "ws@npm:8.17.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 147ef9eab0251364e1d2c55338ad0efb15e6913923ccbfdf20f7a8a6cb8f88432bcd7f4d8f66977135bfad35575644f9983201c1a361019594a4e53977bf6d4e - languageName: node - linkType: hard - -"ws@npm:~8.11.0": +"ws@npm:^8.11.0, ws@npm:~8.11.0": version: 8.11.0 resolution: "ws@npm:8.11.0" peerDependencies: @@ -16661,7 +16128,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:20.2.4": +"yargs-parser@npm:20.2.4, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.4 resolution: "yargs-parser@npm:20.2.4" checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 @@ -16675,13 +16142,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - "yargs-unparser@npm:2.0.0": version: 2.0.0 resolution: "yargs-unparser@npm:2.0.0" From 75da2f96764c282db49d6a6617b1c96fa3c2e8d3 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Tue, 28 May 2024 18:40:16 +1000 Subject: [PATCH 08/48] Run lint. --- packages/base/src/widget.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index f4e450b341..44b341f662 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -1105,9 +1105,7 @@ export class DOMWidgetView extends WidgetView { } get tooltip() { - return ( - this.model.get('tooltip') ?? (this.model.get('description')) - ); + return this.model.get('tooltip') ?? this.model.get('description'); } /** From 0c1dafedeaad9e587690de4386dbed286d0a1009 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 9 Jun 2024 15:34:23 +1000 Subject: [PATCH 09/48] Fix tests that need dummy comm & update yarn.lock. --- packages/controls/package.json | 2 +- .../widgets/tests/test_send_state.py | 8 ++- .../widgets/tests/test_set_state.py | 30 ++++----- .../ipywidgets/widgets/tests/utils.py | 11 ++++ yarn.lock | 66 +++++++++---------- 5 files changed, 65 insertions(+), 52 deletions(-) diff --git a/packages/controls/package.json b/packages/controls/package.json index 3ad03c66a2..e1acc3a3c7 100644 --- a/packages/controls/package.json +++ b/packages/controls/package.json @@ -34,7 +34,7 @@ "test:unit:ie": "npm run test:unit:default -- --browsers=IE" }, "dependencies": { - "@jupyter-widgets/base": "^6.0.7", + "@jupyter-widgets/base": "^6.0.8", "@lumino/algorithm": "^1.9.2 || ^2.0.1", "@lumino/domutils": "^1.8.1 || ^2.1", "@lumino/messaging": "^1.10.1 || ^2.0.1", diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py b/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py index ec18ae4af1..7a7018f0e2 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py @@ -3,12 +3,14 @@ from traitlets import Bool, Tuple, List -from .utils import setup, teardown, DummyComm + +from .utils import dummy_comm_fixture from ..widget import Widget from ..._version import __control_protocol_version__ + # A widget with simple traits class SimpleWidget(Widget): a = Bool().tag(sync=True) @@ -18,13 +20,13 @@ class SimpleWidget(Widget): c = List(Bool()).tag(sync=True) -def test_empty_send_state(): +def test_empty_send_state(dummy_comm_fixture): w = SimpleWidget() w.send_state([]) assert w.comm.messages == [] -def test_empty_hold_sync(): +def test_empty_hold_sync(dummy_comm_fixture): w = SimpleWidget() with w.hold_sync(): pass diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py b/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py index 82ecbd9311..133b39d3d6 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py @@ -6,7 +6,7 @@ from traitlets import Bool, Tuple, List, Instance, CFloat, CInt, Float, Int, TraitError, observe -from .utils import setup, teardown +from .utils import dummy_comm_fixture # noqa: F401 import ipywidgets from ipywidgets import Widget @@ -81,7 +81,7 @@ class TruncateDataWidget(SimpleWidget): # Actual tests: # -def test_set_state_simple(echo): +def test_set_state_simple(echo, dummy_comm_fixture): w = SimpleWidget() w.set_state(dict( a=True, @@ -92,7 +92,7 @@ def test_set_state_simple(echo): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_transformer(echo): +def test_set_state_transformer(echo, dummy_comm_fixture): w = TransformerWidget() w.set_state(dict( d=[True, False, True] @@ -119,7 +119,7 @@ def test_set_state_transformer(echo): assert w.comm.messages == expected -def test_set_state_data(echo): +def test_set_state_data(echo, dummy_comm_fixture): w = DataWidget() data = memoryview(b'x'*30) w.set_state(dict( @@ -129,7 +129,7 @@ def test_set_state_data(echo): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_data_truncate(echo): +def test_set_state_data_truncate(echo, dummy_comm_fixture): w = TruncateDataWidget() data = memoryview(b'x'*30) w.set_state(dict( @@ -153,7 +153,7 @@ def test_set_state_data_truncate(echo): assert buffers[0] == data[:20].tobytes() -def test_set_state_numbers_int(echo): +def test_set_state_numbers_int(echo, dummy_comm_fixture): # JS does not differentiate between float/int. # Instead, it formats exact floats as ints in JSON (1.0 -> '1'). @@ -169,7 +169,7 @@ def test_set_state_numbers_int(echo): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_numbers_float(echo): +def test_set_state_numbers_float(echo, dummy_comm_fixture): w = NumberWidget() # Set floats to int-like floats w.set_state(dict( @@ -181,7 +181,7 @@ def test_set_state_numbers_float(echo): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_float_to_float(echo): +def test_set_state_float_to_float(echo, dummy_comm_fixture): w = NumberWidget() # Set floats to float w.set_state(dict( @@ -192,7 +192,7 @@ def test_set_state_float_to_float(echo): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_cint_to_float(echo): +def test_set_state_cint_to_float(echo, dummy_comm_fixture): w = NumberWidget() # Set CInt to float @@ -223,7 +223,7 @@ def _x_test_set_state_int_to_int_like(): assert len(w.comm.messages) == 0 -def test_set_state_int_to_float(echo): +def test_set_state_int_to_float(echo, dummy_comm_fixture): w = NumberWidget() # Set Int to float @@ -232,7 +232,7 @@ def test_set_state_int_to_float(echo): i = 3.5 )) -def test_property_lock(echo): +def test_property_lock(echo, dummy_comm_fixture): # when this widget's value is set to 42, it sets itself to 2, and then back to 42 again (and then stops) class AnnoyingWidget(Widget): value = Float().tag(sync=True) @@ -262,7 +262,7 @@ def _propagate_value(self, change): calls = [] widget._send.assert_has_calls(calls) -def test_hold_sync(echo): +def test_hold_sync(echo, dummy_comm_fixture): # when this widget's value is set to 42, it sets the value to 2, and also sets a different trait value class AnnoyingWidget(Widget): value = Float().tag(sync=True) @@ -298,7 +298,7 @@ def _propagate_value(self, change): -def test_echo(): +def test_echo(dummy_comm_fixture): # we always echo values back to the frontend class ValueWidget(Widget): value = Float().tag(sync=True) @@ -319,7 +319,7 @@ class ValueWidget(Widget): widget._send.assert_has_calls(calls) -def test_echo_single(): +def test_echo_single(dummy_comm_fixture): # we always echo multiple changes back in 1 update class ValueWidget(Widget): value = Float().tag(sync=True) @@ -359,7 +359,7 @@ def _square(self, change): widget._send.assert_has_calls(calls) -def test_no_echo(echo): +def test_no_echo(dummy_comm_fixture): # in cases where values coming from the frontend are 'heavy', we might want to opt out class ValueWidget(Widget): value = Float().tag(sync=True, echo_update=False) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/utils.py b/python/ipywidgets/ipywidgets/widgets/tests/utils.py index 260485e3f8..20592b4a22 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/utils.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/utils.py @@ -1,6 +1,8 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. +import pytest + from ipywidgets import Widget import ipywidgets.widgets.widget @@ -95,3 +97,12 @@ def teardown(): def call_method(method, *args, **kwargs): method(*args, **kwargs) + + +@pytest.fixture +def dummy_comm_fixture(): + setup() + try: + yield + finally: + teardown() \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 96205a8920..b6242c157e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -732,11 +732,11 @@ __metadata: languageName: node linkType: hard -"@jupyter-widgets/base-manager@^1.0.8, @jupyter-widgets/base-manager@workspace:packages/base-manager": +"@jupyter-widgets/base-manager@^1.0.9, @jupyter-widgets/base-manager@workspace:packages/base-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/base-manager@workspace:packages/base-manager" dependencies: - "@jupyter-widgets/base": ^6.0.7 + "@jupyter-widgets/base": ^6.0.8 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/coreutils": ^1.11.1 || ^2 "@types/base64-js": ^1.2.5 @@ -770,7 +770,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/base@^6.0.7, @jupyter-widgets/base@workspace:packages/base": +"@jupyter-widgets/base@^6.0.8, @jupyter-widgets/base@workspace:packages/base": version: 0.0.0-use.local resolution: "@jupyter-widgets/base@workspace:packages/base" dependencies: @@ -812,11 +812,11 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/controls@^5.0.8, @jupyter-widgets/controls@workspace:packages/controls": +"@jupyter-widgets/controls@^5.0.9, @jupyter-widgets/controls@workspace:packages/controls": version: 0.0.0-use.local resolution: "@jupyter-widgets/controls@workspace:packages/controls" dependencies: - "@jupyter-widgets/base": ^6.0.7 + "@jupyter-widgets/base": ^6.0.8 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/algorithm": ^1.9.2 || ^2.0.1 "@lumino/domutils": ^1.8.1 || ^2.1 @@ -866,9 +866,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web1@workspace:examples/web1" dependencies: - "@jupyter-widgets/base": ^6.0.7 - "@jupyter-widgets/base-manager": ^1.0.8 - "@jupyter-widgets/controls": ^5.0.8 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 chai: ^4.0.0 css-loader: ^6.5.1 karma: ^6.3.3 @@ -887,9 +887,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web2@workspace:examples/web2" dependencies: - "@jupyter-widgets/base": ^6.0.7 - "@jupyter-widgets/base-manager": ^1.0.8 - "@jupyter-widgets/controls": ^5.0.8 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 codemirror: ^5.48.0 css-loader: ^6.5.1 font-awesome: ^4.7.0 @@ -902,9 +902,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web3@workspace:examples/web3" dependencies: - "@jupyter-widgets/base": ^6.0.7 - "@jupyter-widgets/controls": ^5.0.8 - "@jupyter-widgets/html-manager": ^1.0.10 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/html-manager": ^1.0.11 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@types/codemirror": ^5.60.0 "@types/node": ^17.0.2 @@ -924,7 +924,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web4@workspace:examples/web4" dependencies: - "@jupyter-widgets/html-manager": ^1.0.10 + "@jupyter-widgets/html-manager": ^1.0.11 css-loader: ^6.5.1 font-awesome: ^4.7.0 style-loader: ^3.3.1 @@ -932,16 +932,16 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/html-manager@^1.0.10, @jupyter-widgets/html-manager@workspace:packages/html-manager": +"@jupyter-widgets/html-manager@^1.0.11, @jupyter-widgets/html-manager@workspace:packages/html-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/html-manager@workspace:packages/html-manager" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyter-widgets/base": ^6.0.7 - "@jupyter-widgets/base-manager": ^1.0.8 - "@jupyter-widgets/controls": ^5.0.8 - "@jupyter-widgets/output": ^6.0.7 - "@jupyter-widgets/schema": ^0.5.4 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/output": ^6.0.8 + "@jupyter-widgets/schema": ^0.5.5 "@jupyterlab/outputarea": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime-interfaces": ^3.0.0 || ^4.0.0 @@ -978,10 +978,10 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/jupyterlab-manager@workspace:python/jupyterlab_widgets" dependencies: - "@jupyter-widgets/base": ^6.0.7 - "@jupyter-widgets/base-manager": ^1.0.8 - "@jupyter-widgets/controls": ^5.0.8 - "@jupyter-widgets/output": ^6.0.7 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/output": ^6.0.8 "@jupyterlab/application": ^3.0.0 || ^4.0.0 "@jupyterlab/apputils": ^3.0.0 || ^4.0.0 "@jupyterlab/builder": ^3.0.0 || ^4.0.0 @@ -1034,11 +1034,11 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/notebook-manager@workspace:python/widgetsnbextension" dependencies: - "@jupyter-widgets/base": ^6.0.7 - "@jupyter-widgets/base-manager": ^1.0.8 - "@jupyter-widgets/controls": ^5.0.8 - "@jupyter-widgets/html-manager": ^1.0.10 - "@jupyter-widgets/output": ^6.0.7 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/html-manager": ^1.0.11 + "@jupyter-widgets/output": ^6.0.8 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/messaging": ^1.10.1 || ^2.0.1 "@lumino/widgets": ^1.30.0 || ^2.1 @@ -1052,17 +1052,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/output@^6.0.7, @jupyter-widgets/output@workspace:packages/output": +"@jupyter-widgets/output@^6.0.8, @jupyter-widgets/output@workspace:packages/output": version: 0.0.0-use.local resolution: "@jupyter-widgets/output@workspace:packages/output" dependencies: - "@jupyter-widgets/base": ^6.0.7 + "@jupyter-widgets/base": ^6.0.8 rimraf: ^3.0.2 typescript: ~4.9.4 languageName: unknown linkType: soft -"@jupyter-widgets/schema@^0.5.4, @jupyter-widgets/schema@workspace:packages/schema": +"@jupyter-widgets/schema@^0.5.5, @jupyter-widgets/schema@workspace:packages/schema": version: 0.0.0-use.local resolution: "@jupyter-widgets/schema@workspace:packages/schema" languageName: unknown From 3e49c8e82af35e5dc10e7665a12a3de888461ce3 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 31 Aug 2024 10:53:40 +1000 Subject: [PATCH 10/48] Fix tests and lock file. --- .../widgets/tests/test_send_state.py | 4 +- .../widgets/tests/test_set_state.py | 28 ++-- .../ipywidgets/widgets/tests/utils.py | 18 +- yarn.lock | 158 ++++++++++++++---- 4 files changed, 152 insertions(+), 56 deletions(-) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py b/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py index 2e8408b44e..ad1335e52d 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py @@ -17,13 +17,13 @@ class SimpleWidget(Widget): c = List(Bool()).tag(sync=True) -def test_empty_send_state(dummy_comm_fixture): +def test_empty_send_state(): w = SimpleWidget() w.send_state([]) assert w.comm.messages == [] -def test_empty_hold_sync(dummy_comm_fixture): +def test_empty_hold_sync(): w = SimpleWidget() with w.hold_sync(): pass diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py b/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py index 157b6b9af2..c19ff57cde 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py @@ -89,7 +89,7 @@ class TruncateDataWidget(SimpleWidget): # -def test_set_state_simple(echo, dummy_comm_fixture): +def test_set_state_simple(echo): w = SimpleWidget() w.set_state( dict( @@ -102,7 +102,7 @@ def test_set_state_simple(echo, dummy_comm_fixture): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_transformer(echo, dummy_comm_fixture): +def test_set_state_transformer(echo): w = TransformerWidget() w.set_state(dict(d=[True, False, True])) # Since the deserialize step changes the state, this should send an update @@ -137,7 +137,7 @@ def test_set_state_transformer(echo, dummy_comm_fixture): assert w.comm.messages == expected -def test_set_state_data(echo, dummy_comm_fixture): +def test_set_state_data(echo): w = DataWidget() data = memoryview(b"x" * 30) w.set_state( @@ -149,7 +149,7 @@ def test_set_state_data(echo, dummy_comm_fixture): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_data_truncate(echo, dummy_comm_fixture): +def test_set_state_data_truncate(echo): w = TruncateDataWidget() data = memoryview(b"x" * 30) w.set_state( @@ -170,7 +170,7 @@ def test_set_state_data_truncate(echo, dummy_comm_fixture): assert buffers[0] == data[:20].tobytes() -def test_set_state_numbers_int(echo, dummy_comm_fixture): +def test_set_state_numbers_int(echo): # JS does not differentiate between float/int. # Instead, it formats exact floats as ints in JSON (1.0 -> '1'). @@ -188,7 +188,7 @@ def test_set_state_numbers_int(echo, dummy_comm_fixture): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_numbers_float(echo, dummy_comm_fixture): +def test_set_state_numbers_float(echo): w = NumberWidget() # Set floats to int-like floats w.set_state(dict(f=1.0, cf=2.0, ci=4.0)) @@ -196,7 +196,7 @@ def test_set_state_numbers_float(echo, dummy_comm_fixture): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_float_to_float(echo, dummy_comm_fixture): +def test_set_state_float_to_float(echo): w = NumberWidget() # Set floats to float w.set_state( @@ -209,7 +209,7 @@ def test_set_state_float_to_float(echo, dummy_comm_fixture): assert len(w.comm.messages) == (1 if echo else 0) -def test_set_state_cint_to_float(echo, dummy_comm_fixture): +def test_set_state_cint_to_float(echo): w = NumberWidget() # Set CInt to float @@ -236,7 +236,7 @@ def _x_test_set_state_int_to_int_like(): assert len(w.comm.messages) == 0 -def test_set_state_int_to_float(echo, dummy_comm_fixture): +def test_set_state_int_to_float(echo): w = NumberWidget() # Set Int to float @@ -244,7 +244,7 @@ def test_set_state_int_to_float(echo, dummy_comm_fixture): w.set_state(dict(i=3.5)) -def test_property_lock(echo, dummy_comm_fixture): +def test_property_lock(echo): # when this widget's value is set to 42, it sets itself to 2, and then back to 42 again (and then stops) class AnnoyingWidget(Widget): value = Float().tag(sync=True) @@ -275,7 +275,7 @@ def _propagate_value(self, change): widget._send.assert_has_calls(calls) -def test_hold_sync(echo, dummy_comm_fixture): +def test_hold_sync(echo): # when this widget's value is set to 42, it sets the value to 2, and also sets a different trait value class AnnoyingWidget(Widget): value = Float().tag(sync=True) @@ -310,7 +310,7 @@ def _propagate_value(self, change): widget._send.assert_has_calls(calls) -def test_echo(dummy_comm_fixture): +def test_echo(): # we always echo values back to the frontend class ValueWidget(Widget): value = Float().tag(sync=True) @@ -331,7 +331,7 @@ class ValueWidget(Widget): widget._send.assert_has_calls(calls) -def test_echo_single(dummy_comm_fixture): +def test_echo_single(): # we always echo multiple changes back in 1 update class ValueWidget(Widget): value = Float().tag(sync=True) @@ -373,7 +373,7 @@ def _square(self, change): widget._send.assert_has_calls(calls) -def test_no_echo(dummy_comm_fixture): +def test_no_echo(): # in cases where values coming from the frontend are 'heavy', we might want to opt out class ValueWidget(Widget): value = Float().tag(sync=True, echo_update=False) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/utils.py b/python/ipywidgets/ipywidgets/widgets/tests/utils.py index 97b5aa3fe4..d3d7016b6a 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/utils.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/utils.py @@ -9,6 +9,7 @@ # The new comm package is not available in our Python 3.7 CI (older ipykernel version) try: import comm + NEW_COMM_PACKAGE = True except ImportError: NEW_COMM_PACKAGE = False @@ -16,9 +17,10 @@ import ipykernel.comm import pytest -class DummyComm(): - comm_id = 'a-b-c-d' - kernel = 'Truthy' + +class DummyComm: + comm_id = "a-b-c-d" + kernel = "Truthy" def __init__(self, *args, **kwargs): super().__init__() @@ -59,6 +61,7 @@ def dummy_get_comm_manager(**kwargs): orig_create_comm = comm.create_comm orig_get_comm_manager = comm.get_comm_manager + def setup_test_comm(): if NEW_COMM_PACKAGE: comm.create_comm = dummy_create_comm @@ -68,11 +71,14 @@ def setup_test_comm(): ipykernel.comm.Comm = DummyComm Widget.comm.klass = DummyComm ipywidgets.widgets.widget.Comm = DummyComm - _widget_attrs['_repr_mimebundle_'] = Widget._repr_mimebundle_ + _widget_attrs["_repr_mimebundle_"] = Widget._repr_mimebundle_ + def raise_not_implemented(*args, **kwargs): raise NotImplementedError() + Widget._repr_mimebundle_ = raise_not_implemented + def teardown_test_comm(): if NEW_COMM_PACKAGE: comm.create_comm = orig_create_comm @@ -89,12 +95,14 @@ def teardown_test_comm(): setattr(Widget, attr, value) _widget_attrs.clear() + @pytest.fixture(autouse=True) def setup(): setup_test_comm() yield teardown_test_comm() + def call_method(method, *args, **kwargs): method(*args, **kwargs) @@ -105,4 +113,4 @@ def dummy_comm_fixture(): try: yield finally: - teardown() \ No newline at end of file + teardown_test_comm() diff --git a/yarn.lock b/yarn.lock index 0afe9c6969..decb4c3e96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -732,11 +732,11 @@ __metadata: languageName: node linkType: hard -"@jupyter-widgets/base-manager@^1.0.9, @jupyter-widgets/base-manager@workspace:packages/base-manager": +"@jupyter-widgets/base-manager@^1.0.11, @jupyter-widgets/base-manager@workspace:packages/base-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/base-manager@workspace:packages/base-manager" dependencies: - "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base": ^6.0.10 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/coreutils": ^1.11.1 || ^2 "@types/base64-js": ^1.2.5 @@ -770,7 +770,25 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/base@^6.0.8, @jupyter-widgets/base@workspace:packages/base": +"@jupyter-widgets/base7@npm:@jupyter-widgets/base@4.1.6, @jupyter-widgets/base@npm:^4.1.6": + version: 4.1.6 + resolution: "@jupyter-widgets/base@npm:4.1.6" + dependencies: + "@jupyterlab/services": ^6.0.0 + "@lumino/coreutils": ^1.2.0 + "@lumino/messaging": ^1.2.1 + "@lumino/widgets": ^1.3.0 + "@types/backbone": ^1.4.1 + "@types/lodash": ^4.14.134 + backbone: 1.2.3 + base64-js: ^1.2.1 + jquery: ^3.1.1 + lodash: ^4.17.4 + checksum: cdd11e8fd480a44b9e9f5a37529361c407456d9e2d2a09f35b8f067b65e915c132aaaaab8d8523f3c8c624e3403215d6eb56a21337f57213b75ebb377a26c208 + languageName: node + linkType: hard + +"@jupyter-widgets/base@^6.0.10, @jupyter-widgets/base@workspace:packages/base": version: 0.0.0-use.local resolution: "@jupyter-widgets/base@workspace:packages/base" dependencies: @@ -812,11 +830,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/controls@^5.0.9, @jupyter-widgets/controls@workspace:packages/controls": +"@jupyter-widgets/controls7@npm:@jupyter-widgets/controls@3.1.6": + version: 3.1.6 + resolution: "@jupyter-widgets/controls@npm:3.1.6" + dependencies: + "@jupyter-widgets/base": ^4.1.6 + "@lumino/algorithm": ^1.1.0 + "@lumino/domutils": ^1.1.0 + "@lumino/messaging": ^1.2.1 + "@lumino/signaling": ^1.2.0 + "@lumino/widgets": ^1.3.0 + d3-format: ^1.3.0 + jquery: ^3.1.1 + jquery-ui: ^1.12.1 + underscore: ^1.8.3 + checksum: 9c69ebe9ce22d7e7cf3cd66dc849505c1433da4424d8daa7411d85f41027d5600c20c2350d703fe582fd44a4b5d11ad8b404fe058b686f17cd47bafd41547646 + languageName: node + linkType: hard + +"@jupyter-widgets/controls@^5.0.11, @jupyter-widgets/controls@workspace:packages/controls": version: 0.0.0-use.local resolution: "@jupyter-widgets/controls@workspace:packages/controls" dependencies: - "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base": ^6.0.10 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/algorithm": ^1.9.2 || ^2.0.1 "@lumino/domutils": ^1.8.1 || ^2.1 @@ -866,9 +902,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web1@workspace:examples/web1" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/base-manager": ^1.0.11 + "@jupyter-widgets/controls": ^5.0.11 chai: ^4.0.0 css-loader: ^6.5.1 karma: ^6.3.3 @@ -887,9 +923,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web2@workspace:examples/web2" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/base-manager": ^1.0.11 + "@jupyter-widgets/controls": ^5.0.11 codemirror: ^5.48.0 css-loader: ^6.5.1 font-awesome: ^4.7.0 @@ -902,9 +938,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web3@workspace:examples/web3" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/html-manager": ^1.0.11 + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/controls": ^5.0.11 + "@jupyter-widgets/html-manager": ^1.0.13 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@types/codemirror": ^5.60.0 "@types/node": ^17.0.2 @@ -924,7 +960,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web4@workspace:examples/web4" dependencies: - "@jupyter-widgets/html-manager": ^1.0.11 + "@jupyter-widgets/html-manager": ^1.0.13 css-loader: ^6.5.1 font-awesome: ^4.7.0 style-loader: ^3.3.1 @@ -932,16 +968,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/html-manager@^1.0.11, @jupyter-widgets/html-manager@workspace:packages/html-manager": +"@jupyter-widgets/html-manager@^1.0.13, @jupyter-widgets/html-manager@workspace:packages/html-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/html-manager@workspace:packages/html-manager" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/output": ^6.0.8 - "@jupyter-widgets/schema": ^0.5.5 + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/base-manager": ^1.0.11 + "@jupyter-widgets/base7": "npm:@jupyter-widgets/base@4.1.6" + "@jupyter-widgets/controls": ^5.0.11 + "@jupyter-widgets/controls7": "npm:@jupyter-widgets/controls@3.1.6" + "@jupyter-widgets/output": ^6.0.10 + "@jupyter-widgets/schema": ^0.5.6 "@jupyterlab/outputarea": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime-interfaces": ^3.0.0 || ^4.0.0 @@ -979,10 +1017,10 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/jupyterlab-manager@workspace:python/jupyterlab_widgets" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/output": ^6.0.8 + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/base-manager": ^1.0.11 + "@jupyter-widgets/controls": ^5.0.11 + "@jupyter-widgets/output": ^6.0.10 "@jupyterlab/application": ^3.0.0 || ^4.0.0 "@jupyterlab/apputils": ^3.0.0 || ^4.0.0 "@jupyterlab/builder": ^3.0.0 || ^4.0.0 @@ -1035,11 +1073,11 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/notebook-manager@workspace:python/widgetsnbextension" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/html-manager": ^1.0.11 - "@jupyter-widgets/output": ^6.0.8 + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/base-manager": ^1.0.11 + "@jupyter-widgets/controls": ^5.0.11 + "@jupyter-widgets/html-manager": ^1.0.13 + "@jupyter-widgets/output": ^6.0.10 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/messaging": ^1.10.1 || ^2.0.1 "@lumino/widgets": ^1.30.0 || ^2.1 @@ -1053,17 +1091,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/output@^6.0.8, @jupyter-widgets/output@workspace:packages/output": +"@jupyter-widgets/output@^6.0.10, @jupyter-widgets/output@workspace:packages/output": version: 0.0.0-use.local resolution: "@jupyter-widgets/output@workspace:packages/output" dependencies: - "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base": ^6.0.10 rimraf: ^3.0.2 typescript: ~4.9.4 languageName: unknown linkType: soft -"@jupyter-widgets/schema@^0.5.5, @jupyter-widgets/schema@workspace:packages/schema": +"@jupyter-widgets/schema@^0.5.6, @jupyter-widgets/schema@workspace:packages/schema": version: 0.0.0-use.local resolution: "@jupyter-widgets/schema@workspace:packages/schema" languageName: unknown @@ -2847,6 +2885,13 @@ __metadata: languageName: node linkType: hard +"@lumino/algorithm@npm:^1.1.0, @lumino/algorithm@npm:^1.9.0, @lumino/algorithm@npm:^1.9.2": + version: 1.9.2 + resolution: "@lumino/algorithm@npm:1.9.2" + checksum: a89e7c63504236119634858e271db1cc649684d30ced5a6ebe2788af7c0837f1e05a6fd3047d8525eb756c42ce137f76b3688f75fd3ef915b71cd4f213dfbb96 + languageName: node + linkType: hard + "@lumino/algorithm@npm:^1.11.1 || ^2.0.0, @lumino/algorithm@npm:^1.9.2 || ^2.0.1, @lumino/algorithm@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/algorithm@npm:2.0.1" @@ -2865,6 +2910,15 @@ __metadata: languageName: node linkType: hard +"@lumino/collections@npm:^1.9.3": + version: 1.9.3 + resolution: "@lumino/collections@npm:1.9.3" + dependencies: + "@lumino/algorithm": ^1.9.2 + checksum: 1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 + languageName: node + linkType: hard + "@lumino/collections@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/collections@npm:2.0.1" @@ -2987,6 +3041,16 @@ __metadata: languageName: node linkType: hard +"@lumino/messaging@npm:^1.10.0, @lumino/messaging@npm:^1.10.3, @lumino/messaging@npm:^1.2.1": + version: 1.10.3 + resolution: "@lumino/messaging@npm:1.10.3" + dependencies: + "@lumino/algorithm": ^1.9.2 + "@lumino/collections": ^1.9.3 + checksum: 1131e80379fa9b8a9b5d3418c90e25d4be48e2c92ec711518190772f9e8845a695bef45daddd06a129168cf6f158c8ad80ae86cb245f566e9195bbd9a0843b7a + languageName: node + linkType: hard + "@lumino/messaging@npm:^1.10.1 || ^2.0.1, @lumino/messaging@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/messaging@npm:2.0.1" @@ -4978,7 +5042,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -5325,6 +5389,15 @@ __metadata: languageName: node linkType: hard +"backbone@npm:1.2.3": + version: 1.2.3 + resolution: "backbone@npm:1.2.3" + dependencies: + underscore: ">=1.7.0" + checksum: 7e460e9e951bcba0907334d41ccc4bd84b5d17658e72fc61f4c7e1057c238e82f97d3545582cfa0501cb824ee2d44f78a45cd18f735d869e6b71430a0c183073 + languageName: node + linkType: hard + "backbone@npm:1.4.0": version: 1.4.0 resolution: "backbone@npm:1.4.0" @@ -9822,7 +9895,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.1.1, json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -16300,6 +16373,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.4.6": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb + languageName: node + linkType: hard + "ws@npm:^8.11.0, ws@npm:~8.11.0": version: 8.11.0 resolution: "ws@npm:8.11.0" From 7fa9cba62169062eb4ef1e1856c55742a3a45c1c Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Tue, 10 Sep 2024 19:29:16 +1000 Subject: [PATCH 11/48] Simplify tooltips to work everywhere --- packages/base/src/widget.ts | 12 ++++-------- packages/controls/src/widget_bool.ts | 8 -------- packages/controls/src/widget_description.ts | 6 ------ packages/controls/src/widget_selection.ts | 6 ------ packages/controls/src/widget_string.ts | 12 ------------ 5 files changed, 4 insertions(+), 40 deletions(-) diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index 46c6b0d9c7..bcd7d64f7a 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -1101,18 +1101,14 @@ export class DOMWidgetView extends WidgetView { } updateTooltip(): void { - const title = this.tooltip; - if (!title) { - this.el.removeAttribute('title'); - } else if (!this.model.get('description')) { + const title = this.model.get('tooltip') ?? this.model.get('description'); + if (title) { this.el.setAttribute('title', title); + } else { + this.el.removeAttribute('title'); } } - get tooltip() { - return this.model.get('tooltip') ?? this.model.get('description'); - } - /** * Update the DOM classes applied to an element, default to this.el. */ diff --git a/packages/controls/src/widget_bool.ts b/packages/controls/src/widget_bool.ts index bb7e0ee72a..8f2a67b521 100644 --- a/packages/controls/src/widget_bool.ts +++ b/packages/controls/src/widget_bool.ts @@ -179,14 +179,6 @@ export class CheckboxView extends DescriptionView { } } - updateTooltip(): void { - super.updateTooltip(); - if (!this.checkbox) return; // we might be constructing the parent - const title = this.tooltip; - this.checkbox.setAttribute('title', title); - this.descriptionSpan.setAttribute('title', title); - } - events(): { [e: string]: string } { return { 'click input[type="checkbox"]': '_handle_click', diff --git a/packages/controls/src/widget_description.ts b/packages/controls/src/widget_description.ts index 67aec82c32..fba21c7422 100644 --- a/packages/controls/src/widget_description.ts +++ b/packages/controls/src/widget_description.ts @@ -97,12 +97,6 @@ export class DescriptionView extends DOMWidgetView { } } - updateTooltip(): void { - super.updateTooltip(); - if (!this.label) return; - this.label.title = this.tooltip; - } - label: HTMLLabelElement; } diff --git a/packages/controls/src/widget_selection.ts b/packages/controls/src/widget_selection.ts index 8269b61fbf..050723c9c3 100644 --- a/packages/controls/src/widget_selection.ts +++ b/packages/controls/src/widget_selection.ts @@ -67,12 +67,6 @@ export class SelectionView extends DescriptionView { } } - updateTooltip(): void { - super.updateTooltip(); - if (!this.listbox) return; // we might be constructing the parent - this.listbox.setAttribute('title', this.tooltip); - } - listbox: HTMLSelectElement; } diff --git a/packages/controls/src/widget_string.ts b/packages/controls/src/widget_string.ts index 3c708398d8..bf00a3f34b 100644 --- a/packages/controls/src/widget_string.ts +++ b/packages/controls/src/widget_string.ts @@ -378,12 +378,6 @@ export class TextareaView extends StringView { } } - updateTooltip(): void { - super.updateTooltip(); - if (!this.textbox) return; // we might be constructing the parent - this.textbox.setAttribute('title', this.tooltip); - } - events(): { [e: string]: string } { return { 'keydown input': 'handleKeyDown', @@ -500,12 +494,6 @@ export class TextView extends StringView { } } - updateTooltip(): void { - super.updateTooltip(); - if (!this.textbox) return; // we might be constructing the parent - this.textbox.setAttribute('title', this.tooltip); - } - update(options?: any): void { /** * Update the contents of this view From 234752c512b3bc1b149740793180a81b0c08719e Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Wed, 11 Sep 2024 18:39:19 +1000 Subject: [PATCH 12/48] Remove unnecessary code. --- python/ipywidgets/ipywidgets/widgets/tests/utils.py | 10 ---------- python/ipywidgets/ipywidgets/widgets/widget_box.py | 3 +-- python/ipywidgets/ipywidgets/widgets/widget_output.py | 1 - 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/utils.py b/python/ipywidgets/ipywidgets/widgets/tests/utils.py index d3d7016b6a..f382742fd4 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/utils.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/utils.py @@ -1,7 +1,6 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -import pytest from ipywidgets import Widget import ipywidgets.widgets.widget @@ -105,12 +104,3 @@ def setup(): def call_method(method, *args, **kwargs): method(*args, **kwargs) - - -@pytest.fixture -def dummy_comm_fixture(): - setup() - try: - yield - finally: - teardown_test_comm() diff --git a/python/ipywidgets/ipywidgets/widgets/widget_box.py b/python/ipywidgets/ipywidgets/widgets/widget_box.py index 598bb40ef2..50804bb28c 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/widget_box.py @@ -77,8 +77,7 @@ class Box(DOMWidget, CoreWidget): >>> widgets.Box([title_widget, slider]) """ _model_name = Unicode('BoxModel').tag(sync=True) - _view_name = Unicode('BoxView').tag(sync=True) - tooltip = Unicode('', allow_none=True, help='A tooltip caption.').tag(sync=True) + _view_name = Unicode("BoxView").tag(sync=True) validate_mode = CaselessStrEnum(['raise', 'log_warning', 'log_error'], 'raise') # Child widgets in the container. diff --git a/python/ipywidgets/ipywidgets/widgets/widget_output.py b/python/ipywidgets/ipywidgets/widgets/widget_output.py index c8729d9fed..150ac93471 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget_output.py +++ b/python/ipywidgets/ipywidgets/widgets/widget_output.py @@ -59,7 +59,6 @@ def func(): msg_id = Unicode('', help="Parent message id of messages to capture").tag(sync=True) outputs = TypedTuple(trait=Dict(), help="The output messages synced from the frontend.").tag(sync=True) - tooltip = Unicode('', allow_none=True, help="A tooltip caption.").tag(sync=True) __counter = 0 From 9d5a482a4cbc3bcc19d4ce3ad5be22f23b99cc97 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Thu, 12 Sep 2024 18:13:28 +1000 Subject: [PATCH 13/48] Update the widget model specification for 'Children'. --- docs/source/dev_install.md | 1 + .../schema/jupyterwidgetmodels.latest.json | 42 ++++--------------- packages/schema/jupyterwidgetmodels.latest.md | 14 +++---- 3 files changed, 15 insertions(+), 42 deletions(-) diff --git a/docs/source/dev_install.md b/docs/source/dev_install.md index ad90794b4b..56d2bd90a8 100644 --- a/docs/source/dev_install.md +++ b/docs/source/dev_install.md @@ -90,6 +90,7 @@ To update the widget model specification with changes, do something like this in ``` python ./packages/schema/generate-spec.py -f json-pretty packages/schema/jupyterwidgetmodels.latest.json python ./packages/schema/generate-spec.py -f markdown packages/schema/jupyterwidgetmodels.latest.md +jlpm prettier ``` ## Releasing new versions diff --git a/packages/schema/jupyterwidgetmodels.latest.json b/packages/schema/jupyterwidgetmodels.latest.json index 0cefeb25bf..6a2b37ccef 100644 --- a/packages/schema/jupyterwidgetmodels.latest.json +++ b/packages/schema/jupyterwidgetmodels.latest.json @@ -441,12 +441,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -935,12 +931,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -3753,12 +3745,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -3850,12 +3838,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -6643,12 +6627,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -6756,12 +6736,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -7914,12 +7890,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", diff --git a/packages/schema/jupyterwidgetmodels.latest.md b/packages/schema/jupyterwidgetmodels.latest.md index eb7e7147b8..bc061245f2 100644 --- a/packages/schema/jupyterwidgetmodels.latest.md +++ b/packages/schema/jupyterwidgetmodels.latest.md @@ -76,7 +76,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'AccordionView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `selected_index` | `null` or number (integer) | `null` | The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | @@ -163,7 +163,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'BoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | @@ -663,7 +663,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'GridBoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | @@ -680,7 +680,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'HBoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | @@ -1179,7 +1179,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'StackView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `selected_index` | `null` or number (integer) | `null` | The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | @@ -1198,7 +1198,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'TabView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `selected_index` | `null` or number (integer) | `null` | The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | @@ -1402,7 +1402,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'VBoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | From 8286c7c402223a81bc8c3d2a707d86f2d4618733 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 26 Oct 2024 18:39:49 +1100 Subject: [PATCH 14/48] Make _model_id a property --- .../ipywidgets/ipywidgets/widgets/widget.py | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index 1034f43e69..6eda43e809 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -471,7 +471,7 @@ def _get_embed_state(self, drop_defaults=False): return state def get_view_spec(self): - return {"version_major":2, "version_minor":0, "model_id": self._model_id} + return {"version_major": 2, "version_minor": 0, "model_id": self.model_id} #------------------------------------------------------------------------- # Traits @@ -495,6 +495,8 @@ def get_view_spec(self): keys = List(help="The traits which are synced.") + _model_id: None | str = None + @default('keys') def _default_keys(self): return [name for name in self.traits(sync=True)] @@ -537,7 +539,7 @@ def _default_comm(self): def open(self): """Open a comm to the frontend if one isn't already open.""" - assert self._model_id + assert self.model_id def _create_comm(self, comm_id=None): @@ -564,7 +566,8 @@ def _comm_changed(self, change): _instances.pop(change['old'].comm_id, None) if change['new']: if isinstance(_instances, dict): - _instances[change['new'].comm_id] = self + _instances[change["new"].comm_id] = self + self._model_id = change["new"].comm_id # prevent memory leaks by using a weak reference to self. ref = weakref.ref(self) @@ -578,14 +581,8 @@ def _handle_msg(msg): change['new'].on_msg(_handle_msg) - - @property def model_id(self): - return self._model_id - - @property - def _model_id(self): """Gets the model id of this widget. If a Comm doesn't exist yet, a Comm will be created automagically.""" @@ -864,10 +861,10 @@ def _repr_mimebundle_(self, **kwargs): # http://tools.ietf.org/html/rfc6838 # and the currently registered mimetypes at # http://www.iana.org/assignments/media-types/media-types.xhtml. - data['application/vnd.jupyter.widget-view+json'] = { - 'version_major': 2, - 'version_minor': 0, - 'model_id': self._model_id + data["application/vnd.jupyter.widget-view+json"] = { + "version_major": 2, + "version_minor": 0, + "model_id": self.model_id, } return data From ca3d0cb0964e7ad333515399eb1600bcbe03c248 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Tue, 5 Nov 2024 08:16:29 +1100 Subject: [PATCH 15/48] Change _instances from 'global' variable to class variable. --- python/ipywidgets/ipywidgets/embed.py | 6 +- .../ipywidgets/ipywidgets/tests/test_embed.py | 4 +- .../ipywidgets/widgets/tests/test_widget.py | 39 ++------ .../widgets/tests/test_widget_box.py | 2 - .../ipywidgets/ipywidgets/widgets/widget.py | 96 +++++-------------- python/ipywidgets/setup.cfg | 2 + 6 files changed, 41 insertions(+), 108 deletions(-) diff --git a/python/ipywidgets/ipywidgets/embed.py b/python/ipywidgets/ipywidgets/embed.py index ca58880092..e9bffbfd65 100644 --- a/python/ipywidgets/ipywidgets/embed.py +++ b/python/ipywidgets/ipywidgets/embed.py @@ -12,7 +12,7 @@ import json import re -from .widgets import Widget, DOMWidget, widget as widget_module +from .widgets import Widget, DOMWidget from .widgets.widget_link import Link from .widgets.docutils import doc_subst from ._version import __html_manager_version__ @@ -129,7 +129,7 @@ def _get_recursive_state(widget, store=None, drop_defaults=False): def add_resolved_links(store, drop_defaults): """Adds the state of any link models between two models in store""" - for widget_id, widget in widget_module._instances.items(): # go over all widgets + for widget_id, widget in Widget._instances.items(): # go over all widgets if isinstance(widget, Link) and widget_id not in store: if widget.source[0].model_id in store and widget.target[0].model_id in store: store[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) @@ -207,7 +207,7 @@ def embed_data(views, drop_defaults=True, state=None): view_specs: a list of widget view specs """ if views is None: - views = [w for w in widget_module._instances.values() if isinstance(w, DOMWidget)] + views = [w for w in Widget._instances.values() if isinstance(w, DOMWidget)] else: try: views[0] diff --git a/python/ipywidgets/ipywidgets/tests/test_embed.py b/python/ipywidgets/ipywidgets/tests/test_embed.py index a295442455..c5e6b97aa1 100644 --- a/python/ipywidgets/ipywidgets/tests/test_embed.py +++ b/python/ipywidgets/ipywidgets/tests/test_embed.py @@ -9,7 +9,7 @@ import traitlets -from ..widgets import IntSlider, IntText, Text, Widget, jslink, HBox, widget_serialization, widget as widget_module +from ..widgets import IntSlider, IntText, Text, Widget, jslink, HBox, widget_serialization from ..embed import embed_data, embed_snippet, embed_minimal_html, dependency_state @@ -29,7 +29,7 @@ class CaseWidget(Widget): class TestEmbed: def teardown(self): - for w in tuple(widget_module._instances.values()): + for w in tuple(Widget._instances.values()): w.close() def test_embed_data_simple(self): diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py index 34fd9402a2..dbd949dd10 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py @@ -5,7 +5,6 @@ import copy import gc -import inspect import weakref import pytest @@ -15,7 +14,6 @@ import ipywidgets as ipw -from .. import widget from ..widget import Widget from ..widget_button import Button @@ -62,29 +60,12 @@ def test_close_all(): # create a couple of widgets widgets = [Button() for i in range(10)] - assert len(widget._instances) > 0, "expect active widgets" - assert widget._instances[widgets[0].model_id] is widgets[0] + assert len(Widget._instances) > 0, "expect active widgets" + assert Widget._instances[widgets[0].model_id] is widgets[0] # close all the widgets Widget.close_all() - assert len(widget._instances) == 0, "active widgets should be cleared" - - -def test_compatibility(): - button = Button() - assert widget._instances[button.model_id] is button - with pytest.deprecated_call() as record: - assert widget._instances is widget.Widget.widgets - assert widget._instances is widget.Widget._active_widgets - assert widget._registry is widget.Widget.widget_types - assert widget._registry is widget.Widget._widget_types - - Widget.close_all() - assert not widget.Widget.widgets - assert not widget.Widget._active_widgets - caller_path = inspect.stack(context=0)[1].filename - assert all(x.filename == caller_path for x in record) - assert len(record) == 6 + assert len(Widget._instances) == 0, "active widgets should be cleared" def test_widget_copy(): @@ -98,12 +79,12 @@ def test_widget_copy(): def test_widget_open(): button = Button() model_id = button.model_id - assert model_id in widget._instances + assert model_id in Widget._instances spec = button.get_view_spec() assert list(spec) == ["version_major", "version_minor", "model_id"] assert spec["model_id"] button.close() - assert model_id not in widget._instances + assert model_id not in Widget._instances with pytest.raises(RuntimeError, match="Widget is closed"): button.open() with pytest.raises(RuntimeError, match="Widget is closed"): @@ -225,7 +206,7 @@ def my_click(self, b): b = TestButton(description="button") weakref.finalize(b, on_delete) b_ref = weakref.ref(b) - assert b in widget._instances.values() + assert b in Widget._instances.values() b.on_click(b.my_click) b.on_click(lambda x: setattr(x, "clicked", True)) @@ -235,11 +216,11 @@ def my_click(self, b): if weakref_enabled: ipw.enable_weakreference() - assert b in widget._instances.values(), "Instances not transferred" + assert b in Widget._instances.values(), "Instances not transferred" ipw.disable_weakreference() - assert b in widget._instances.values(), "Instances not transferred" + assert b in Widget._instances.values(), "Instances not transferred" ipw.enable_weakreference() - assert b in widget._instances.values(), "Instances not transferred" + assert b in Widget._instances.values(), "Instances not transferred" b.click() assert click_count == 2 @@ -251,7 +232,7 @@ def my_click(self, b): assert deleted else: assert not deleted - assert b_ref() in widget._instances.values() + assert b_ref() in Widget._instances.values() b_ref().close() gc.collect() assert deleted, "Closing should remove the last strong reference." diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py index 5d50324d08..021e3f4c78 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py @@ -57,7 +57,6 @@ def test_box_validate_mode(): def test_box_gc(): - widgets.VBox._active_widgets widgets.enable_weakreference() # Test Box gc collected and children lifecycle managed. try: @@ -80,6 +79,5 @@ def on_delete(): del b gc.collect() assert deleted - widgets.VBox._active_widgets finally: widgets.disable_weakreference() diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index 6eda43e809..c95850132b 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -19,8 +19,6 @@ from base64 import standard_b64encode -from .utils import deprecation, _get_frame - from .._version import __protocol_version__, __control_protocol_version__, __jupyter_widgets_base_version__ import inspect @@ -43,29 +41,24 @@ def envset(name, default): JUPYTER_WIDGETS_ECHO = envset('JUPYTER_WIDGETS_ECHO', default=True) # for a discussion on using weak references see: # https://github.com/jupyter-widgets/ipywidgets/issues/1345 -_instances : typing.MutableMapping[str, "Widget"] = {} def enable_weakreference(): - """Use a WeakValueDictionary instead of a standard dictionary to map - `comm_id` to `widget` for every widget instance. + """Use a WeakValueDictionary to store references to Widget instances. - By default widgets are mapped using a standard dictionary. Use this feature - to permit widget garbage collection. + A strong reference must be kept to widgets. """ - global _instances - if not isinstance(_instances, weakref.WeakValueDictionary): - _instances = weakref.WeakValueDictionary(_instances) + if not isinstance(Widget._instances, weakref.WeakValueDictionary): + Widget._instances = weakref.WeakValueDictionary(Widget._instances) def disable_weakreference(): - """Use a Dictionary to map `comm_id` to `widget` for every widget instance. - - Note: this is the default setting and maintains a strong reference to the - the widget preventing automatic garbage collection. If the close method - is called, the widget will remove itself enabling garbage collection. + """Use a standard dictionary to store references to Widget instances (default behavior). + + Note: this is the default setting and maintains a strong reference to the + the widget preventing automatic garbage collection. When the widget is closed + it can be garbage collected. """ - global _instances - if isinstance(_instances, weakref.WeakValueDictionary): - _instances = dict(_instances) + if isinstance(Widget._instances, weakref.WeakValueDictionary): + Widget._instances = dict(Widget._instances) def _widget_to_json(x, obj): if isinstance(x, Widget): @@ -82,8 +75,8 @@ def _json_to_widget(x, obj): return {k: _json_to_widget(v, obj) for k, v in x.items()} elif isinstance(x, (list, tuple)): return [_json_to_widget(v, obj) for v in x] - elif isinstance(x, str) and x.startswith('IPY_MODEL_') and x[10:] in _instances: - return _instances[x[10:]] + elif isinstance(x, str) and x.startswith("IPY_MODEL_") and x[10:] in Widget._instances: + return Widget._instances[x[10:]] else: return x @@ -314,50 +307,12 @@ class Widget(LoggingHasTraits): #------------------------------------------------------------------------- _widget_construction_callback = None _control_comm = None - - @_staticproperty - def widgets(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget.widgets is deprecated.") - return _instances - - @_staticproperty - def _active_widgets(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget._active_widgets is deprecated.") - return _instances - - @_staticproperty - def _widget_types(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget._widget_types is deprecated.") - return _registry - - @_staticproperty - def widget_types(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget.widget_types is deprecated.") - return _registry + + _instances: typing.ClassVar[typing.MutableMapping[str, "Widget"]] = {} @classmethod def close_all(cls): - for widget in list(_instances.values()): + for widget in list(Widget._instances.values()): widget.close() @staticmethod @@ -399,7 +354,7 @@ def _handle_control_comm_msg(cls, msg): if method == 'request_states': # Send back the full widgets state cls.get_manager_state() - widgets = _instances.values() + widgets = cls._instances.values() full_state = {} drop_defaults = False for widget in widgets: @@ -440,8 +395,8 @@ def handle_comm_opened(comm, msg): _put_buffers(state, data['buffer_paths'], msg['buffers']) widget.set_state(state) - @staticmethod - def get_manager_state(drop_defaults=False, widgets=None): + @classmethod + def get_manager_state(cls, drop_defaults=False, widgets=None): """Returns the full state for a widget manager for embedding :param drop_defaults: when True, it will not include default value @@ -450,7 +405,7 @@ def get_manager_state(drop_defaults=False, widgets=None): """ state = {} if widgets is None: - widgets = _instances.values() + widgets = cls._instances.values() for widget in widgets: state[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) return {'version_major': 2, 'version_minor': 0, 'state': state} @@ -561,14 +516,11 @@ def _comm_changed(self, change): if change['old']: change['old'].on_msg(None) change['old'].close() - # On python shutdown _instances can be None - if isinstance(_instances, dict): - _instances.pop(change['old'].comm_id, None) + self._instances.pop(change['old'].comm_id, None) if change['new']: - if isinstance(_instances, dict): - _instances[change["new"].comm_id] = self - self._model_id = change["new"].comm_id - + self._instances[change["new"].comm_id] = self + self._model_id = change["new"].comm_id + # prevent memory leaks by using a weak reference to self. ref = weakref.ref(self) def _handle_msg(msg): diff --git a/python/ipywidgets/setup.cfg b/python/ipywidgets/setup.cfg index 36fbdf847c..c3fb6a9fda 100644 --- a/python/ipywidgets/setup.cfg +++ b/python/ipywidgets/setup.cfg @@ -23,6 +23,8 @@ classifiers = Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 + Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 Programming Language :: Python :: 3 :: Only Framework :: Jupyter From 525e3ef3c01e0443ed30dd8bdb4e3b2aba10ac88 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Mon, 27 May 2024 21:37:01 +1000 Subject: [PATCH 16/48] Per-kernel widget manager. --- python/jupyterlab_widgets/src/manager.ts | 320 +++++++++++++++---- python/jupyterlab_widgets/src/output.ts | 31 +- python/jupyterlab_widgets/src/plugin.ts | 355 ++++------------------ python/jupyterlab_widgets/src/renderer.ts | 21 +- 4 files changed, 347 insertions(+), 380 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index fec2cb3e4e..4451a131e6 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -2,20 +2,20 @@ // Distributed under the terms of the Modified BSD License. import { - shims, + ExportData, + ExportMap, + ICallbacks, IClassicComm, IWidgetRegistryData, - ExportMap, - ExportData, WidgetModel, WidgetView, - ICallbacks, + shims, } from '@jupyter-widgets/base'; import { + IStateOptions, ManagerBase, serialize_state, - IStateOptions, } from '@jupyter-widgets/base-manager'; import { IDisposable } from '@lumino/disposable'; @@ -26,6 +26,12 @@ import { INotebookModel } from '@jupyterlab/notebook'; import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; +import { ObservableList, ObservableMap } from '@jupyterlab/observables'; + +import * as nbformat from '@jupyterlab/nbformat'; + +import { ILoggerRegistry, LogLevel } from '@jupyterlab/logconsole'; + import { Kernel, KernelMessage, Session } from '@jupyterlab/services'; import { DocumentRegistry } from '@jupyterlab/docregistry'; @@ -36,6 +42,11 @@ import { valid } from 'semver'; import { SemVerCache } from './semvercache'; +import Backbone from 'backbone'; + +import * as base from '@jupyter-widgets/base'; +import { WidgetRenderer } from './renderer'; + /** * The mime type for a widget view. */ @@ -330,25 +341,40 @@ export abstract class LabWidgetManager this, KernelMessage.IIOPubMessage >(this); + static WIDGET_REGISTRY = new ObservableList(); } /** - * A widget manager that returns Lumino widgets. + * A singleton widget manager per kernel for the lifecycle of the kernel. */ export class KernelWidgetManager extends LabWidgetManager { constructor( kernel: Kernel.IKernelConnection, rendermime: IRenderMimeRegistry ) { + const instance = Private.kernelWidgetManagers.get(kernel.id); + if (instance) { + instance.attachToRendermime(rendermime); + return instance; + } super(rendermime); + this.attachToRendermime(rendermime); + Private.kernelWidgetManagers.set(kernel.id, this); this._kernel = kernel; - - kernel.statusChanged.connect((sender, args) => { - this._handleKernelStatusChange(args); - }); - kernel.connectionStatusChanged.connect((sender, args) => { - this._handleKernelConnectionStatusChange(args); - }); + this.loadCustomWidgetDefinitions(); + LabWidgetManager.WIDGET_REGISTRY.changed.connect(() => + this.loadCustomWidgetDefinitions() + ); + this._kernel.registerCommTarget( + this.comm_target_name, + this._handleCommOpen + ); + + this._kernel.statusChanged.connect(this._handleKernelStatusChange, this); + this._kernel.connectionStatusChanged.connect( + this._handleKernelConnectionStatusChange, + this + ); this._handleKernelChanged({ name: 'kernel', @@ -358,18 +384,29 @@ export class KernelWidgetManager extends LabWidgetManager { this.restoreWidgets(); } - _handleKernelConnectionStatusChange(status: Kernel.ConnectionStatus): void { - if (status === 'connected') { - // Only restore if we aren't currently trying to restore from the kernel - // (for example, in our initial restore from the constructor). - if (!this._kernelRestoreInProgress) { - this.restoreWidgets(); - } + _handleKernelConnectionStatusChange( + sender: Kernel.IKernelConnection, + status: Kernel.ConnectionStatus + ): void { + switch (status) { + case 'connected': + // Only restore if we aren't currently trying to restore from the kernel + // (for example, in our initial restore from the constructor). + if (!this._kernelRestoreInProgress) { + this.restoreWidgets(); + } + break; + case 'disconnected': + this.dispose(); } } - _handleKernelStatusChange(status: Kernel.Status): void { + _handleKernelStatusChange( + sender: Kernel.IKernelConnection, + status: Kernel.Status + ): void { if (status === 'restarting') { + this.clear_state(); this.disconnect(); } } @@ -405,56 +442,80 @@ export class KernelWidgetManager extends LabWidgetManager { return this._kernel; } + loadCustomWidgetDefinitions() { + for (const data of LabWidgetManager.WIDGET_REGISTRY) { + this.register(data); + } + } + + filterModelState(serialized_state: any): any { + return this.filterExistingModelState(serialized_state); + } + + attachToRendermime(rendermime: IRenderMimeRegistry) { + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: (options) => new WidgetRenderer(options, this), + }, + -10 + ); + } + private _kernel: Kernel.IKernelConnection; + protected _kernelRestoreInProgress = false; } /** - * A widget manager that returns phosphor widgets. + * Monitor kernel of the Context swapping the kernel manager on demand. + * A better name would be `NotebookManagerSwitcher'. */ -export class WidgetManager extends LabWidgetManager { +export class WidgetManager extends Backbone.Model implements IDisposable { constructor( context: DocumentRegistry.IContext, rendermime: IRenderMimeRegistry, settings: WidgetManager.Settings ) { - super(rendermime); + super(); + this._rendermime = rendermime; this._context = context; + this._settings = settings; - context.sessionContext.kernelChanged.connect((sender, args) => { - this._handleKernelChanged(args); - }); + context.sessionContext.kernelChanged.connect( + this._handleKernelChange, + this + ); - context.sessionContext.statusChanged.connect((sender, args) => { - this._handleKernelStatusChange(args); - }); + context.sessionContext.statusChanged.connect( + this._handleStatusChange, + this + ); - context.sessionContext.connectionStatusChanged.connect((sender, args) => { - this._handleKernelConnectionStatusChange(args); - }); + context.sessionContext.connectionStatusChanged.connect( + this._handleConnectionStatusChange, + this + ); - if (context.sessionContext.session?.kernel) { - this._handleKernelChanged({ - name: 'kernel', - oldValue: null, - newValue: context.sessionContext.session?.kernel, - }); - } + this.updateWidgetManager(); + this.setDirty(); this.restoreWidgets(this._context!.model); - - this._settings = settings; - context.saveState.connect((sender, saveState) => { - if (saveState === 'started' && settings.saveState) { - this._saveState(); - } - }); + if (context?.saveState) { + context.saveState.connect((sender, saveState) => { + if (saveState === 'started' && settings.saveState) { + this._saveState(); + } + }); + } } /** * Save the widget state to the context model. */ private _saveState(): void { - const state = this.get_state_sync({ drop_defaults: true }); + const state = this.widgetManager.get_state_sync({ drop_defaults: true }); if (this._context.model.setMetadata) { this._context.model.setMetadata('widgets', { 'application/vnd.jupyter.widget-state+json': state, @@ -468,7 +529,48 @@ export class WidgetManager extends LabWidgetManager { } } - _handleKernelConnectionStatusChange(status: Kernel.ConnectionStatus): void { + updateWidgetManager() { + if (this._widgetManager) { + this.widgetManager.onUnhandledIOPubMessage.disconnect( + this.onUnhandledIOPubMessage, + this + ); + } + if (this.kernel) { + this._widgetManager = getWidgetManager(this.kernel, this.rendermime); + this._widgetManager.onUnhandledIOPubMessage.connect( + this.onUnhandledIOPubMessage, + this + ); + } + } + + onUnhandledIOPubMessage( + sender: LabWidgetManager, + msg: KernelMessage.IIOPubMessage + ) { + if (WidgetManager.loggerRegistry) { + const logger = WidgetManager.loggerRegistry.getLogger(this.context.path); + let level: LogLevel = 'warning'; + if ( + KernelMessage.isErrorMsg(msg) || + (KernelMessage.isStreamMsg(msg) && msg.content.name === 'stderr') + ) { + level = 'error'; + } + const data: nbformat.IOutput = { + ...msg.content, + output_type: msg.header.msg_type, + }; + // logger.rendermime = this.content.rendermime; + logger.log({ type: 'output', data, level }); + } + } + + _handleConnectionStatusChange( + sender: any, + status: Kernel.ConnectionStatus + ): void { if (status === 'connected') { // Only restore if we aren't currently trying to restore from the kernel // (for example, in our initial restore from the constructor). @@ -482,10 +584,46 @@ export class WidgetManager extends LabWidgetManager { } } - _handleKernelStatusChange(status: Kernel.Status): void { - if (status === 'restarting') { - this.disconnect(); + _handleKernelChange(sender: any, kernel: any): void { + this.updateWidgetManager(); + this.setDirty(); + } + _handleStatusChange(sender: any, status: Kernel.Status): void { + this.setDirty(); + } + + get widgetManager(): KernelWidgetManager { + return this._widgetManager; + } + + /** + * A signal emitted when state is restored to the widget manager. + * + * #### Notes + * This indicates that previously-unavailable widget models might be available now. + */ + get restored(): ISignal { + return this._restored; + } + + /** + * Whether the state has been restored yet or not. + */ + get restoredStatus(): boolean { + return this._restoredStatus; + } + + /** + * + * @param renderers + */ + updateWidgetRenderers(renderers: IterableIterator) { + if (this.kernel) { + for (const r of renderers) { + r.manager = this.widgetManager; + } } + // Do we need to handle for if there isn't a kernel? } /** @@ -500,7 +638,6 @@ export class WidgetManager extends LabWidgetManager { if (loadKernel) { try { this._kernelRestoreInProgress = true; - await this._loadFromKernel(); } finally { this._kernelRestoreInProgress = false; } @@ -529,11 +666,21 @@ export class WidgetManager extends LabWidgetManager { // Restore any widgets from saved state that are not live if (widget_md && widget_md[WIDGET_STATE_MIMETYPE]) { let state = widget_md[WIDGET_STATE_MIMETYPE]; - state = this.filterExistingModelState(state); - await this.set_state(state); + state = this.widgetManager.filterModelState(state); + await this.widgetManager.set_state(state); } } + /** + * Get whether the manager is disposed. + * + * #### Notes + * This is a read-only property. + */ + get isDisposed(): boolean { + return this._isDisposed; + } + /** * Dispose the resources held by the manager. */ @@ -543,7 +690,6 @@ export class WidgetManager extends LabWidgetManager { } this._context = null!; - super.dispose(); } /** @@ -562,11 +708,15 @@ export class WidgetManager extends LabWidgetManager { return this._context.sessionContext?.session?.kernel ?? null; } + get rendermime(): IRenderMimeRegistry { + return this._rendermime; + } + /** * Register a widget model. */ register_model(model_id: string, modelPromise: Promise): void { - super.register_model(model_id, modelPromise); + this.widgetManager.register_model(model_id, modelPromise); this.setDirty(); } @@ -575,7 +725,7 @@ export class WidgetManager extends LabWidgetManager { * @return Promise that resolves when the widget state is cleared. */ async clear_state(): Promise { - await super.clear_state(); + // await this.widgetManager.clear_state(); this.setDirty(); } @@ -589,9 +739,15 @@ export class WidgetManager extends LabWidgetManager { this._context!.model.dirty = true; } } - + static loggerRegistry: ILoggerRegistry | null; + protected _restored = new Signal(this); + protected _restoredStatus = false; + private _isDisposed = false; private _context: DocumentRegistry.IContext; + private _rendermime: IRenderMimeRegistry; private _settings: WidgetManager.Settings; + private _widgetManager: KernelWidgetManager; + protected _kernelRestoreInProgress = false; } export namespace WidgetManager { @@ -599,3 +755,49 @@ export namespace WidgetManager { saveState: boolean; }; } + +/** + * Get the widget manager for the kernel. Calling this will ensure + * widgets work in a kernel (providing the kerenel provides comms). + * With the widgetManager use the method `widgetManager.attachToRendermime` + * against any rendermime. + * @param kernel A kernel connection to which the widget manager is associated. + * @returns LabWidgetManager + */ +export function getWidgetManager( + kernel: Kernel.IKernelConnection, + rendermime: IRenderMimeRegistry +): KernelWidgetManager { + if (!Private.kernelWidgetManagers.has(kernel.id)) { + new KernelWidgetManager(kernel, rendermime); + } + const wManager = Private.kernelWidgetManagers.get(kernel.id); + if (!wManager) { + throw new Error('Failed to create KernelWidgetManager'); + } + if (wManager.rendermime !== rendermime) { + wManager.attachToRendermime(rendermime); + } + return wManager; +} + +/** + * Get the widgetManager that owns the model id=model_id. + * @param model_id An existing model_id + * @returns KernelWidgetManager + */ +export function findWidgetManager(model_id: string): KernelWidgetManager { + for (const wManager of Private.kernelWidgetManagers.values()) { + if (wManager.has_model(model_id)) { + return wManager; + } + } + throw new Error(`A widget manager was not found for model_id ${model_id}'`); +} + +/** + * A namespace for private data + */ +namespace Private { + export const kernelWidgetManagers = new ObservableMap(); +} diff --git a/python/jupyterlab_widgets/src/output.ts b/python/jupyterlab_widgets/src/output.ts index 37793bf193..ee559437da 100644 --- a/python/jupyterlab_widgets/src/output.ts +++ b/python/jupyterlab_widgets/src/output.ts @@ -7,13 +7,15 @@ import { JupyterLuminoPanelWidget } from '@jupyter-widgets/base'; import { Panel } from '@lumino/widgets'; -import { LabWidgetManager, WidgetManager } from './manager'; +import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; + +import { LabWidgetManager } from './manager'; import { OutputAreaModel, OutputArea } from '@jupyterlab/outputarea'; import * as nbformat from '@jupyterlab/nbformat'; -import { KernelMessage, Session } from '@jupyterlab/services'; +import { KernelMessage } from '@jupyterlab/services'; import $ from 'jquery'; @@ -33,32 +35,11 @@ export class OutputModel extends outputBase.OutputModel { return false; }; - // if the context is available, react on kernel changes - if (this.widget_manager instanceof WidgetManager) { - this.widget_manager.context.sessionContext.kernelChanged.connect( - (sender, args) => { - this._handleKernelChanged(args); - } - ); - } this.listenTo(this, 'change:msg_id', this.reset_msg_id); this.listenTo(this, 'change:outputs', this.setOutputs); this.setOutputs(); } - /** - * Register a new kernel - */ - _handleKernelChanged({ - oldValue, - }: Session.ISessionConnection.IKernelChangedArgs): void { - const msgId = this.get('msg_id'); - if (msgId && oldValue) { - oldValue.removeMessageHook(msgId, this._msgHook); - this.set('msg_id', null); - } - } - /** * Reset the message id. */ @@ -121,6 +102,7 @@ export class OutputModel extends outputBase.OutputModel { private _msgHook: (msg: KernelMessage.IIOPubMessage) => boolean; private _outputs: OutputAreaModel; + static rendermime: IRenderMimeRegistry; } export class OutputView extends outputBase.OutputView { @@ -145,10 +127,11 @@ export class OutputView extends outputBase.OutputView { render(): void { super.render(); this._outputView = new OutputArea({ - rendermime: this.model.widget_manager.rendermime, + rendermime: OutputModel.rendermime, contentFactory: OutputArea.defaultContentFactory, model: this.model.outputs, }); + // TODO: why is this a readonly property now? // this._outputView.model = this.model.outputs; // TODO: why is this on the model now? diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 6c3a569582..6a044a5fc0 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -5,12 +5,10 @@ import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { DocumentRegistry } from '@jupyterlab/docregistry'; -import * as nbformat from '@jupyterlab/nbformat'; - import { - IConsoleTracker, CodeConsole, ConsolePanel, + IConsoleTracker, } from '@jupyterlab/console'; import { @@ -21,15 +19,15 @@ import { } from '@jupyterlab/notebook'; import { - JupyterFrontEndPlugin, JupyterFrontEnd, + JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { IMainMenu } from '@jupyterlab/mainmenu'; import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; -import { ILoggerRegistry, LogLevel } from '@jupyterlab/logconsole'; +import { ILoggerRegistry } from '@jupyterlab/logconsole'; import { CodeCell } from '@jupyterlab/cells'; @@ -37,15 +35,17 @@ import { filter } from '@lumino/algorithm'; import { DisposableDelegate } from '@lumino/disposable'; +import { AttachedProperty } from '@lumino/properties'; + import { WidgetRenderer } from './renderer'; import { - WidgetManager, + LabWidgetManager, WIDGET_VIEW_MIMETYPE, - KernelWidgetManager, + WidgetManager, } from './manager'; -import { OutputModel, OutputView, OUTPUT_WIDGET_VERSION } from './output'; +import { OUTPUT_WIDGET_VERSION, OutputModel, OutputView } from './output'; import * as base from '@jupyter-widgets/base'; @@ -55,34 +55,7 @@ import { JUPYTER_CONTROLS_VERSION } from '@jupyter-widgets/controls/lib/version' import '@jupyter-widgets/base/css/index.css'; import '@jupyter-widgets/controls/css/widgets-base.css'; -import { KernelMessage } from '@jupyterlab/services'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; -import { ISessionContext } from '@jupyterlab/apputils'; -import { ISignal, Signal } from '@lumino/signaling'; - -class WidgetRegistry { - get widgets(): base.IWidgetRegistryData[] { - return [...this._registry]; - } - - push(data: base.IWidgetRegistryData) { - this._registry.push(data); - this._widgetRegistered.emit(data); - } - - get widgetRegistered(): ISignal { - return this._widgetRegistered; - } - - private _widgetRegistered = new Signal< - WidgetRegistry, - base.IWidgetRegistryData - >(this); - - private _registry: base.IWidgetRegistryData[] = []; -} - -const WIDGET_REGISTRY = new WidgetRegistry(); /** * The cached settings. @@ -161,141 +134,20 @@ function* chain( } } -/** - * Get the kernel id of current notebook or console panel, this value - * is used as key for `Private.widgetManagerProperty` to store the widget - * manager of current notebook or console panel. - * - * @param {ISessionContext} sessionContext The session context of notebook or - * console panel. - */ -async function getWidgetManagerOwner( - sessionContext: ISessionContext -): Promise { - await sessionContext.ready; - return sessionContext.session!.kernel!.id; -} - -/** - * Common handler for registering both notebook and console - * `WidgetManager` - * - * @param {(Notebook | CodeConsole)} content Context of panel. - * @param {ISessionContext} sessionContext Session context of panel. - * @param {IRenderMimeRegistry} rendermime Rendermime of panel. - * @param {IterableIterator} renderers Iterator of - * `WidgetRenderer` inside panel - * @param {(() => WidgetManager | KernelWidgetManager)} widgetManagerFactory - * function to create widget manager. - */ -async function registerWidgetHandler( - content: Notebook | CodeConsole, - sessionContext: ISessionContext, - rendermime: IRenderMimeRegistry, - renderers: IterableIterator, - widgetManagerFactory: () => WidgetManager | KernelWidgetManager -): Promise { - const wManagerOwner = await getWidgetManagerOwner(sessionContext); - let wManager = Private.widgetManagerProperty.get(wManagerOwner); - let currentOwner: string; - - if (!wManager) { - wManager = widgetManagerFactory(); - WIDGET_REGISTRY.widgets.forEach((data) => wManager!.register(data)); - WIDGET_REGISTRY.widgetRegistered.connect((_, data) => { - wManager!.register(data); - }); - Private.widgetManagerProperty.set(wManagerOwner, wManager); - currentOwner = wManagerOwner; - content.disposed.connect((_) => { - const currentwManager = Private.widgetManagerProperty.get(currentOwner); - if (currentwManager) { - Private.widgetManagerProperty.delete(currentOwner); - } - }); - - sessionContext.kernelChanged.connect((_, args) => { - const { newValue } = args; - if (newValue) { - const newKernelId = newValue.id; - const oldwManager = Private.widgetManagerProperty.get(currentOwner); - - if (oldwManager) { - Private.widgetManagerProperty.delete(currentOwner); - Private.widgetManagerProperty.set(newKernelId, oldwManager); - } - currentOwner = newKernelId; - } - }); - } - - for (const r of renderers) { - r.manager = wManager; - } - - // Replace the placeholder widget renderer with one bound to this widget - // manager. - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options) => new WidgetRenderer(options, wManager), - }, - -10 - ); - - return new DisposableDelegate(() => { - if (rendermime) { - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - } - wManager!.dispose(); - }); -} - -// Kept for backward compat ipywidgets<=8, but not used here anymore export function registerWidgetManager( context: DocumentRegistry.IContext, rendermime: IRenderMimeRegistry, renderers: IterableIterator ): DisposableDelegate { - let wManager: WidgetManager; - const managerReady = getWidgetManagerOwner(context.sessionContext).then( - (wManagerOwner) => { - const currentManager = Private.widgetManagerProperty.get( - wManagerOwner - ) as WidgetManager; - if (!currentManager) { - wManager = new WidgetManager(context, rendermime, SETTINGS); - WIDGET_REGISTRY.widgets.forEach((data) => wManager!.register(data)); - WIDGET_REGISTRY.widgetRegistered.connect((_, data) => { - wManager!.register(data); - }); - Private.widgetManagerProperty.set(wManagerOwner, wManager); - } else { - wManager = currentManager; - } - - for (const r of renderers) { - r.manager = wManager; - } - - // Replace the placeholder widget renderer with one bound to this widget - // manager. - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options) => new WidgetRenderer(options, wManager), - }, - -10 - ); - } - ); - - return new DisposableDelegate(async () => { - await managerReady; + let wManager = Private.widgetManagerProperty.get(context); + if (!wManager) { + wManager = new WidgetManager(context, rendermime, SETTINGS); + Private.widgetManagerProperty.set(context, wManager); + } + if (wManager.kernel) { + wManager.updateWidgetRenderers(renderers); + } + return new DisposableDelegate(() => { if (rendermime) { rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); } @@ -303,43 +155,27 @@ export function registerWidgetManager( }); } -export async function registerNotebookWidgetManager( - panel: NotebookPanel, - renderers: IterableIterator -): Promise { - const content = panel.content; - const context = panel.context; - const sessionContext = context.sessionContext; - const rendermime = content.rendermime; - const widgetManagerFactory = () => - new WidgetManager(context, rendermime, SETTINGS); - - return registerWidgetHandler( - content, - sessionContext, - rendermime, - renderers, - widgetManagerFactory - ); -} - -export async function registerConsoleWidgetManager( - panel: ConsolePanel, - renderers: IterableIterator -): Promise { - const content = panel.console; - const sessionContext = content.sessionContext; - const rendermime = content.rendermime; - const widgetManagerFactory = () => - new KernelWidgetManager(sessionContext.session!.kernel!, rendermime); - - return registerWidgetHandler( - content, - sessionContext, - rendermime, - renderers, - widgetManagerFactory - ); +function attachWidgetManagerToPanel( + panel: NotebookPanel | ConsolePanel, + app: JupyterFrontEnd +) { + if (panel instanceof NotebookPanel) { + registerWidgetManager( + panel.context, + panel.content.rendermime, + chain( + notebookWidgetRenderers(panel.content), + outputViews(app, panel.context.path) + ) + ); + } else if (panel instanceof ConsolePanel) { + // A bit of a hack to make this a 'context' + registerWidgetManager( + panel.console as any, + panel.console.rendermime, + chain(consoleWidgetRenderers(panel.console)) + ); + } } /** @@ -372,7 +208,7 @@ function updateSettings(settings: ISettingRegistry.ISettings): void { function activateWidgetExtension( app: JupyterFrontEnd, rendermime: IRenderMimeRegistry, - tracker: INotebookTracker | null, + widgetTracker: INotebookTracker | null, consoleTracker: IConsoleTracker | null, settingRegistry: ISettingRegistry | null, menu: IMainMenu | null, @@ -382,41 +218,6 @@ function activateWidgetExtension( const { commands } = app; const trans = (translator ?? nullTranslator).load('jupyterlab_widgets'); - const bindUnhandledIOPubMessageSignal = async ( - nb: NotebookPanel - ): Promise => { - if (!loggerRegistry) { - return; - } - const wManagerOwner = await getWidgetManagerOwner( - nb.context.sessionContext - ); - const wManager = Private.widgetManagerProperty.get(wManagerOwner); - - if (wManager) { - wManager.onUnhandledIOPubMessage.connect( - ( - sender: WidgetManager | KernelWidgetManager, - msg: KernelMessage.IIOPubMessage - ) => { - const logger = loggerRegistry.getLogger(nb.context.path); - let level: LogLevel = 'warning'; - if ( - KernelMessage.isErrorMsg(msg) || - (KernelMessage.isStreamMsg(msg) && msg.content.name === 'stderr') - ) { - level = 'error'; - } - const data: nbformat.IOutput = { - ...msg.content, - output_type: msg.header.msg_type, - }; - logger.rendermime = nb.content.rendermime; - logger.log({ type: 'output', data, level }); - } - ); - } - }; if (settingRegistry !== null) { settingRegistry .load(managerPlugin.id) @@ -428,7 +229,7 @@ function activateWidgetExtension( console.error(reason.message); }); } - + WidgetManager.loggerRegistry = loggerRegistry; // Add a placeholder widget renderer. rendermime.addFactory( { @@ -438,33 +239,13 @@ function activateWidgetExtension( }, -10 ); - - if (tracker !== null) { - const rendererIterator = (panel: NotebookPanel) => - chain( - notebookWidgetRenderers(panel.content), - outputViews(app, panel.context.path) + for (const tracker of [widgetTracker, consoleTracker]) { + if (tracker !== null) { + tracker.forEach((panel) => attachWidgetManagerToPanel(panel, app)); + tracker.widgetAdded.connect((sender, panel) => + attachWidgetManagerToPanel(panel, app) ); - tracker.forEach(async (panel) => { - await registerNotebookWidgetManager(panel, rendererIterator(panel)); - bindUnhandledIOPubMessageSignal(panel); - }); - tracker.widgetAdded.connect(async (sender, panel) => { - await registerNotebookWidgetManager(panel, rendererIterator(panel)); - bindUnhandledIOPubMessageSignal(panel); - }); - } - - if (consoleTracker !== null) { - const rendererIterator = (panel: ConsolePanel) => - chain(consoleWidgetRenderers(panel.console)); - - consoleTracker.forEach(async (panel) => { - await registerConsoleWidgetManager(panel, rendererIterator(panel)); - }); - consoleTracker.widgetAdded.connect(async (sender, panel) => { - await registerConsoleWidgetManager(panel, rendererIterator(panel)); - }); + } } if (settingRegistry !== null) { // Add a command for automatically saving (jupyter-)widget state. @@ -491,7 +272,7 @@ function activateWidgetExtension( return { registerWidget(data: base.IWidgetRegistryData): void { - WIDGET_REGISTRY.push(data); + LabWidgetManager.WIDGET_REGISTRY.push(data); }, }; } @@ -563,17 +344,19 @@ export const controlWidgetsPlugin: JupyterFrontEndPlugin = { */ export const outputWidgetPlugin: JupyterFrontEndPlugin = { id: `@jupyter-widgets/jupyterlab-manager:output-${OUTPUT_WIDGET_VERSION}`, - requires: [base.IJupyterWidgetRegistry], + requires: [base.IJupyterWidgetRegistry, IRenderMimeRegistry], autoStart: true, activate: ( app: JupyterFrontEnd, - registry: base.IJupyterWidgetRegistry + registry: base.IJupyterWidgetRegistry, + rendermime: IRenderMimeRegistry ): void => { - registry.registerWidget({ - name: '@jupyter-widgets/output', - version: OUTPUT_WIDGET_VERSION, - exports: { OutputModel, OutputView }, - }); + (OutputModel.rendermime = rendermime), + registry.registerWidget({ + name: '@jupyter-widgets/output', + version: OUTPUT_WIDGET_VERSION, + exports: { OutputModel, OutputView }, + }); }, }; @@ -585,23 +368,13 @@ export default [ ]; namespace Private { /** - * A type alias for keys of `widgetManagerProperty` . + * A private attached property for a widget manager. */ - export type IWidgetManagerOwner = string; - - /** - * A type alias for values of `widgetManagerProperty` . - */ - export type IWidgetManagerValue = - | WidgetManager - | KernelWidgetManager - | undefined; - - /** - * A private map for a widget manager. - */ - export const widgetManagerProperty = new Map< - IWidgetManagerOwner, - IWidgetManagerValue - >(); + export const widgetManagerProperty = new AttachedProperty< + DocumentRegistry.Context, + WidgetManager | undefined + >({ + name: 'widgetManager', + create: (owner: DocumentRegistry.Context): undefined => undefined, + }); } diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index ce0d257625..e6e15c245a 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -5,13 +5,14 @@ import { PromiseDelegate } from '@lumino/coreutils'; import { IDisposable } from '@lumino/disposable'; -import { Panel, Widget as LuminoWidget } from '@lumino/widgets'; +import { Widget as LuminoWidget, Panel } from '@lumino/widgets'; import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; -import { LabWidgetManager } from './manager'; import { DOMWidgetModel } from '@jupyter-widgets/base'; +import { LabWidgetManager, findWidgetManager } from './manager'; + /** * A renderer for widgets. */ @@ -36,14 +37,22 @@ export class WidgetRenderer set manager(value: LabWidgetManager) { value.restored.connect(this._rerender, this); this._manager.resolve(value); + this._manager_set = true; } async renderModel(model: IRenderMime.IMimeModel): Promise { const source: any = model.data[this.mimeType]; - // Let's be optimistic, and hope the widget state will come later. this.node.textContent = 'Loading widget...'; - + if (!this._manager_set) { + try { + this.manager = findWidgetManager(source.model_id); + } catch (err) { + this.node.textContent = `widget model not found for ${model.data['text/plain']}`; + console.error(err); + return Promise.resolve(); + } + } const manager = await this._manager.promise; // If there is no model id, the view was removed, so hide the node. if (source.model_id === '') { @@ -61,12 +70,11 @@ export class WidgetRenderer this.node.textContent = 'Error displaying widget: model not found'; this.addClass('jupyter-widgets'); console.error(err); - return; } // Store the model for a possible rerender this._rerenderMimeModel = model; - return; + return Promise.resolve(); } // Successful getting the model, so we don't need to try to rerender. @@ -122,5 +130,6 @@ export class WidgetRenderer */ readonly mimeType: string; private _manager = new PromiseDelegate(); + private _manager_set = false; private _rerenderMimeModel: IRenderMime.IMimeModel | null = null; } From 02b37f6f42d7dfc11111fb0242f4f76c58598ec4 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Wed, 29 May 2024 19:37:49 +1000 Subject: [PATCH 17/48] Add attachToRendermime function. --- python/jupyterlab_widgets/src/manager.ts | 83 ++++++++++++------------ python/jupyterlab_widgets/src/plugin.ts | 4 +- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 4451a131e6..a84c98c3b6 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -326,6 +326,8 @@ export abstract class LabWidgetManager await this.handle_comm_open(oldComm, msg); }; + static globalRendermime: IRenderMimeRegistry; + protected _restored = new Signal(this); protected _restoredStatus = false; protected _kernelRestoreInProgress = false; @@ -346,20 +348,24 @@ export abstract class LabWidgetManager /** * A singleton widget manager per kernel for the lifecycle of the kernel. + * If a rendermime isn't provided the global singleton will be used. */ export class KernelWidgetManager extends LabWidgetManager { constructor( kernel: Kernel.IKernelConnection, - rendermime: IRenderMimeRegistry + rendermime: IRenderMimeRegistry | null ) { + if (!rendermime) { + rendermime = LabWidgetManager.globalRendermime; + } const instance = Private.kernelWidgetManagers.get(kernel.id); if (instance) { - instance.attachToRendermime(rendermime); + attachToRendermime(rendermime, instance); return instance; } super(rendermime); - this.attachToRendermime(rendermime); Private.kernelWidgetManagers.set(kernel.id, this); + attachToRendermime(rendermime, this); this._kernel = kernel; this.loadCustomWidgetDefinitions(); LabWidgetManager.WIDGET_REGISTRY.changed.connect(() => @@ -433,7 +439,8 @@ export class KernelWidgetManager extends LabWidgetManager { if (this.isDisposed) { return; } - + attachToRendermime(this.rendermime); + Private.kernelWidgetManagers.delete(this.kernel.id); this._kernel = null!; super.dispose(); } @@ -452,18 +459,6 @@ export class KernelWidgetManager extends LabWidgetManager { return this.filterExistingModelState(serialized_state); } - attachToRendermime(rendermime: IRenderMimeRegistry) { - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options) => new WidgetRenderer(options, this), - }, - -10 - ); - } - private _kernel: Kernel.IKernelConnection; protected _kernelRestoreInProgress = false; } @@ -537,7 +532,10 @@ export class WidgetManager extends Backbone.Model implements IDisposable { ); } if (this.kernel) { - this._widgetManager = getWidgetManager(this.kernel, this.rendermime); + this._widgetManager = new KernelWidgetManager( + this.kernel, + this.rendermime + ); this._widgetManager.onUnhandledIOPubMessage.connect( this.onUnhandledIOPubMessage, this @@ -756,31 +754,6 @@ export namespace WidgetManager { }; } -/** - * Get the widget manager for the kernel. Calling this will ensure - * widgets work in a kernel (providing the kerenel provides comms). - * With the widgetManager use the method `widgetManager.attachToRendermime` - * against any rendermime. - * @param kernel A kernel connection to which the widget manager is associated. - * @returns LabWidgetManager - */ -export function getWidgetManager( - kernel: Kernel.IKernelConnection, - rendermime: IRenderMimeRegistry -): KernelWidgetManager { - if (!Private.kernelWidgetManagers.has(kernel.id)) { - new KernelWidgetManager(kernel, rendermime); - } - const wManager = Private.kernelWidgetManagers.get(kernel.id); - if (!wManager) { - throw new Error('Failed to create KernelWidgetManager'); - } - if (wManager.rendermime !== rendermime) { - wManager.attachToRendermime(rendermime); - } - return wManager; -} - /** * Get the widgetManager that owns the model id=model_id. * @param model_id An existing model_id @@ -795,6 +768,32 @@ export function findWidgetManager(model_id: string): KernelWidgetManager { throw new Error(`A widget manager was not found for model_id ${model_id}'`); } +/** + * Will define wManager as a renderer for rendermime if rendermime + * is not the global rendermime or there is only one wManager. + * If wManager is not provided, it will make the rendermine more general. + */ +function attachToRendermime( + rendermime: IRenderMimeRegistry, + wManager?: KernelWidgetManager +) { + const wManager_ = + rendermime === LabWidgetManager.globalRendermime && + Private.kernelWidgetManagers.size > 1 + ? undefined + : wManager; + + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: (options) => new WidgetRenderer(options, wManager_), + }, + -10 + ); +} + /** * A namespace for private data */ diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 6a044a5fc0..ddffb3c498 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -148,9 +148,6 @@ export function registerWidgetManager( wManager.updateWidgetRenderers(renderers); } return new DisposableDelegate(() => { - if (rendermime) { - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - } wManager!.dispose(); }); } @@ -230,6 +227,7 @@ function activateWidgetExtension( }); } WidgetManager.loggerRegistry = loggerRegistry; + LabWidgetManager.globalRendermime = rendermime; // Add a placeholder widget renderer. rendermime.addFactory( { From 245c9b292bc1fbd05fbd30e3c7df62c44a953890 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Wed, 29 May 2024 21:48:11 +1000 Subject: [PATCH 18/48] Update lock file. --- yarn.lock | 108 ++++++++++++++++++------------------------------------ 1 file changed, 35 insertions(+), 73 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4342d47db0..f650a5e1bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -687,13 +687,13 @@ __metadata: languageName: node linkType: hard -"@jupyter-widgets/base-manager@^1.0.12, @jupyter-widgets/base-manager@workspace:packages/base-manager": +"@jupyter-widgets/base-manager@^1.0.9, @jupyter-widgets/base-manager@workspace:packages/base-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/base-manager@workspace:packages/base-manager" dependencies: - "@jupyter-widgets/base": ^6.0.11 - "@jupyterlab/services": ^6 || ^7 - "@lumino/coreutils": ^1 || ^2 + "@jupyter-widgets/base": ^6.0.8 + "@jupyterlab/services": ^6.0.0 || ^7.0.0 + "@lumino/coreutils": ^1.11.1 || ^2 "@types/base64-js": ^1.2.5 "@types/chai": ^4.1.7 "@types/chai-as-promised": ^7.1.0 @@ -726,25 +726,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/base7@npm:@jupyter-widgets/base@4.1.7, @jupyter-widgets/base@npm:^4.1.7": - version: 4.1.7 - resolution: "@jupyter-widgets/base@npm:4.1.7" - dependencies: - "@jupyterlab/services": ^6 || ^7 - "@lumino/coreutils": ^1 || ^2 - "@lumino/messaging": ^1 || ^2 - "@lumino/widgets": ^1 || ^2 - "@types/backbone": ^1.4.1 - "@types/lodash": ^4.14.134 - backbone: 1.2.3 - base64-js: ^1.2.1 - jquery: ^3.1.1 - lodash: ^4.17.4 - checksum: ae9fea4352a9a9174da589a611274a7652e9b9f31593da1c0b38892f71ed81ab394d16a75c62e0c6fc5c96b50c090b91219957e3614b325b81171c61da4f0afd - languageName: node - linkType: hard - -"@jupyter-widgets/base@^6.0.11, @jupyter-widgets/base@workspace:packages/base": +"@jupyter-widgets/base@^6.0.8, @jupyter-widgets/base@workspace:packages/base": version: 0.0.0-use.local resolution: "@jupyter-widgets/base@workspace:packages/base" dependencies: @@ -787,29 +769,11 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/controls7@npm:@jupyter-widgets/controls@3.1.8": - version: 3.1.8 - resolution: "@jupyter-widgets/controls@npm:3.1.8" - dependencies: - "@jupyter-widgets/base": ^4.1.7 - "@lumino/algorithm": ^1 || ^2 - "@lumino/domutils": ^1 || ^2 - "@lumino/messaging": ^1 || ^2 - "@lumino/signaling": ^1 || ^2 - "@lumino/widgets": ^1 || ^2 - d3-format: ^1.3.0 - jquery: ^3.1.1 - jquery-ui: ^1.12.1 - underscore: ^1.8.3 - checksum: 483c9af59f0f1c3d2a56b8b99141f3dfa756b7c9601a64b22649a0e89ae63399ecaad672573f3c0c96a33fbf510ed3e6523c311c237456f623a9242acfce9e26 - languageName: node - linkType: hard - -"@jupyter-widgets/controls@^5.0.12, @jupyter-widgets/controls@workspace:packages/controls": +"@jupyter-widgets/controls@^5.0.9, @jupyter-widgets/controls@workspace:packages/controls": version: 0.0.0-use.local resolution: "@jupyter-widgets/controls@workspace:packages/controls" dependencies: - "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base": ^6.0.8 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/algorithm": ^1 || ^2 "@lumino/domutils": ^1 || ^2 @@ -860,9 +824,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web1@workspace:examples/web1" dependencies: - "@jupyter-widgets/base": ^6.0.11 - "@jupyter-widgets/base-manager": ^1.0.12 - "@jupyter-widgets/controls": ^5.0.12 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 chai: ^4.0.0 css-loader: ^6.5.1 karma: ^6.3.3 @@ -881,9 +845,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web2@workspace:examples/web2" dependencies: - "@jupyter-widgets/base": ^6.0.11 - "@jupyter-widgets/base-manager": ^1.0.12 - "@jupyter-widgets/controls": ^5.0.12 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 codemirror: ^5.48.0 css-loader: ^6.5.1 font-awesome: ^4.7.0 @@ -896,9 +860,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web3@workspace:examples/web3" dependencies: - "@jupyter-widgets/base": ^6.0.11 - "@jupyter-widgets/controls": ^5.0.12 - "@jupyter-widgets/html-manager": ^1.0.14 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/html-manager": ^1.0.11 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@types/codemirror": ^5.60.0 "@types/node": ^17.0.2 @@ -918,7 +882,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web4@workspace:examples/web4" dependencies: - "@jupyter-widgets/html-manager": ^1.0.14 + "@jupyter-widgets/html-manager": ^1.0.11 css-loader: ^6.5.1 font-awesome: ^4.7.0 style-loader: ^3.3.1 @@ -926,18 +890,16 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/html-manager@^1.0.14, @jupyter-widgets/html-manager@workspace:packages/html-manager": +"@jupyter-widgets/html-manager@^1.0.11, @jupyter-widgets/html-manager@workspace:packages/html-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/html-manager@workspace:packages/html-manager" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyter-widgets/base": ^6.0.11 - "@jupyter-widgets/base-manager": ^1.0.12 - "@jupyter-widgets/base7": "npm:@jupyter-widgets/base@4.1.7" - "@jupyter-widgets/controls": ^5.0.12 - "@jupyter-widgets/controls7": "npm:@jupyter-widgets/controls@3.1.8" - "@jupyter-widgets/output": ^6.0.11 - "@jupyter-widgets/schema": ^0.5.6 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/output": ^6.0.8 + "@jupyter-widgets/schema": ^0.5.5 "@jupyterlab/outputarea": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime-interfaces": ^3.0.0 || ^4.0.0 @@ -975,10 +937,10 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/jupyterlab-manager@workspace:python/jupyterlab_widgets" dependencies: - "@jupyter-widgets/base": ^6.0.11 - "@jupyter-widgets/base-manager": ^1.0.12 - "@jupyter-widgets/controls": ^5.0.12 - "@jupyter-widgets/output": ^6.0.11 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/output": ^6.0.8 "@jupyterlab/application": ^3.0.0 || ^4.0.0 "@jupyterlab/apputils": ^3.0.0 || ^4.0.0 "@jupyterlab/builder": ^3.0.0 || ^4.0.0 @@ -1022,11 +984,11 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/notebook-manager@workspace:python/widgetsnbextension" dependencies: - "@jupyter-widgets/base": ^6.0.11 - "@jupyter-widgets/base-manager": ^1.0.12 - "@jupyter-widgets/controls": ^5.0.12 - "@jupyter-widgets/html-manager": ^1.0.14 - "@jupyter-widgets/output": ^6.0.11 + "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base-manager": ^1.0.9 + "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/html-manager": ^1.0.11 + "@jupyter-widgets/output": ^6.0.8 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/messaging": ^1 || ^2 "@lumino/widgets": ^1 || ^2 @@ -1040,17 +1002,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/output@^6.0.11, @jupyter-widgets/output@workspace:packages/output": +"@jupyter-widgets/output@^6.0.8, @jupyter-widgets/output@workspace:packages/output": version: 0.0.0-use.local resolution: "@jupyter-widgets/output@workspace:packages/output" dependencies: - "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base": ^6.0.8 rimraf: ^3.0.2 typescript: ~4.9.4 languageName: unknown linkType: soft -"@jupyter-widgets/schema@^0.5.6, @jupyter-widgets/schema@workspace:packages/schema": +"@jupyter-widgets/schema@^0.5.5, @jupyter-widgets/schema@workspace:packages/schema": version: 0.0.0-use.local resolution: "@jupyter-widgets/schema@workspace:packages/schema" languageName: unknown From bc5a447d81a411b7c4957950ca1000adbdcd23d0 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Fri, 31 May 2024 18:33:00 +1000 Subject: [PATCH 19/48] WidgetModel: set comm_live to false when comm closed and remove redundant comm_closed argument. --- packages/base/src/widget.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index 389b9db538..a44b10fb83 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -214,17 +214,15 @@ export class WidgetModel extends Backbone.Model { /** * Close model * - * @param comm_closed - true if the comm is already being closed. If false, the comm will be closed. - * * @returns - a promise that is fulfilled when all the associated views have been removed. */ - close(comm_closed = false): Promise { + close(): Promise { // can only be closed once. if (this._closed) { return Promise.resolve(); } this._closed = true; - if (this.comm && !comm_closed) { + if (this.comm && this.comm_live) { this.comm.close(); } this.stopListening(); @@ -249,8 +247,11 @@ export class WidgetModel extends Backbone.Model { * Handle when a widget comm is closed. */ _handle_comm_closed(msg: KernelMessage.ICommCloseMsg): void { + this.comm_live = false; + if (this._closed) { + this.close(); + } this.trigger('comm:close'); - this.close(true); } /** From d735e582a10a74b70dde3525e76c595442eeb480 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Fri, 31 May 2024 19:15:37 +1000 Subject: [PATCH 20/48] Improve ManagerBase_loadFromKernel --- packages/base-manager/src/manager-base.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index c8e3ee9964..fe569a5213 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -383,6 +383,7 @@ export abstract class ManagerBase implements IWidgetManager { // Try fetching all widget states through the control comm let data: any; let buffers: any; + let timeoutID: number | undefined; try { const initComm = await this._create_comm( CONTROL_COMM_TARGET, @@ -390,8 +391,8 @@ export abstract class ManagerBase implements IWidgetManager { {}, { version: CONTROL_COMM_PROTOCOL_VERSION } ); - await new Promise((resolve, reject) => { + let succeeded = false; initComm.on_msg((msg: any) => { data = msg['content']['data']; @@ -409,24 +410,31 @@ export abstract class ManagerBase implements IWidgetManager { return new DataView(b instanceof ArrayBuffer ? b : b.buffer); } }); - + succeeded = true; + clearTimeout(timeoutID); resolve(null); }); - initComm.on_close(() => reject('Control comm was closed too early')); + initComm.on_close(() => { + if (!succeeded) reject('Control comm was closed too early'); + }); // Send a states request msg initComm.send({ method: 'request_states' }, {}); // Reject if we didn't get a response in time - setTimeout( + timeoutID = window.setTimeout( () => reject('Control comm did not respond in time'), CONTROL_COMM_TIMEOUT ); }); - initComm.close(); } catch (error) { + console.warn( + 'Failed to fetch ipywidgets through the "jupyter.widget.control" comm channel, fallback to fetching individual model state. Reason:', + error + ); + clearTimeout(timeoutID); // Fall back to the old implementation for old ipywidgets backend versions (ipywidgets<=7.6) return this._loadFromKernelModels(); } From 4f21fb76dcf5aecfea3ff29173841f4a9d676123 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Fri, 31 May 2024 19:17:15 +1000 Subject: [PATCH 21/48] Update jupyterlab_widgets package.json --- python/jupyterlab_widgets/package.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/python/jupyterlab_widgets/package.json b/python/jupyterlab_widgets/package.json index 83938e8950..959022483c 100644 --- a/python/jupyterlab_widgets/package.json +++ b/python/jupyterlab_widgets/package.json @@ -51,24 +51,25 @@ "@jupyter-widgets/controls": "^5.0.12", "@jupyter-widgets/output": "^6.0.11", "@jupyterlab/application": "^3.0.0 || ^4.0.0", - "@jupyterlab/apputils": "^3.0.0 || ^4.0.0", "@jupyterlab/console": "^3.0.0 || ^4.0.0", "@jupyterlab/docregistry": "^3.0.0 || ^4.0.0", "@jupyterlab/logconsole": "^3.0.0 || ^4.0.0", "@jupyterlab/mainmenu": "^3.0.0 || ^4.0.0", "@jupyterlab/nbformat": "^3.0.0 || ^4.0.0", "@jupyterlab/notebook": "^3.0.0 || ^4.0.0", + "@jupyterlab/observables": "^5.2.1", "@jupyterlab/outputarea": "^3.0.0 || ^4.0.0", "@jupyterlab/rendermime": "^3.0.0 || ^4.0.0", "@jupyterlab/rendermime-interfaces": "^3.0.0 || ^4.0.0", "@jupyterlab/services": "^6.0.0 || ^7.0.0", "@jupyterlab/settingregistry": "^3.0.0 || ^4.0.0", "@jupyterlab/translation": "^3.0.0 || ^4.0.0", - "@lumino/algorithm": "^1 || ^2", - "@lumino/coreutils": "^1 || ^2", - "@lumino/disposable": "^1 || ^2", - "@lumino/signaling": "^1 || ^2", - "@lumino/widgets": "^1 || ^2", + "@lumino/algorithm": "^1.11.1 || ^2.0.0", + "@lumino/coreutils": "^1.11.1 || ^2.1", + "@lumino/disposable": "^1.10.1 || ^2.1", + "@lumino/properties": "^2.0.1", + "@lumino/signaling": "^1.10.1 || ^2.1", + "@lumino/widgets": "^1.30.0 || ^2.1", "@types/backbone": "1.4.14", "jquery": "^3.1.1", "semver": "^7.3.5" From 55e89c3245ff31c557dc4d6d38af402c9d8692f6 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Fri, 31 May 2024 23:19:11 +1000 Subject: [PATCH 22/48] Improved restoring widgets when opening and closing of notebooks. --- python/jupyterlab_widgets/src/manager.ts | 289 ++++++++++++---------- python/jupyterlab_widgets/src/plugin.ts | 5 +- python/jupyterlab_widgets/src/renderer.ts | 49 ++-- yarn.lock | 19 +- 4 files changed, 204 insertions(+), 158 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index a84c98c3b6..ddcbc46a2f 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -26,7 +26,7 @@ import { INotebookModel } from '@jupyterlab/notebook'; import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; -import { ObservableList, ObservableMap } from '@jupyterlab/observables'; +import { ObservableList } from '@jupyterlab/observables'; import * as nbformat from '@jupyterlab/nbformat'; @@ -116,7 +116,6 @@ export abstract class LabWidgetManager // A "load" for a kernel that does not handle comms does nothing. return; } - return super._loadFromKernel(); } @@ -177,6 +176,7 @@ export abstract class LabWidgetManager return; } this._isDisposed = true; + this._rendermime = null!; if (this._commRegistration) { this._commRegistration.dispose(); @@ -348,7 +348,8 @@ export abstract class LabWidgetManager /** * A singleton widget manager per kernel for the lifecycle of the kernel. - * If a rendermime isn't provided the global singleton will be used. + * The factory of the rendermime will be update to use the widgetManager + * directly if it isn't the globalRendermime. */ export class KernelWidgetManager extends LabWidgetManager { constructor( @@ -360,34 +361,84 @@ export class KernelWidgetManager extends LabWidgetManager { } const instance = Private.kernelWidgetManagers.get(kernel.id); if (instance) { - attachToRendermime(rendermime, instance); + KernelWidgetManager.updateManagerKernel(instance, kernel); + KernelWidgetManager.attachToRendermime(rendermime, instance); return instance; } - super(rendermime); + if (!kernel.handleComms) { + throw new Error('Kernel does not have handleComms enabled'); + } + super(LabWidgetManager.globalRendermime); Private.kernelWidgetManagers.set(kernel.id, this); - attachToRendermime(rendermime, this); - this._kernel = kernel; this.loadCustomWidgetDefinitions(); LabWidgetManager.WIDGET_REGISTRY.changed.connect(() => this.loadCustomWidgetDefinitions() ); - this._kernel.registerCommTarget( - this.comm_target_name, - this._handleCommOpen - ); - - this._kernel.statusChanged.connect(this._handleKernelStatusChange, this); - this._kernel.connectionStatusChanged.connect( - this._handleKernelConnectionStatusChange, - this - ); + KernelWidgetManager.updateManagerKernel(this, kernel); + KernelWidgetManager.attachToRendermime(rendermime, this); + } - this._handleKernelChanged({ + static updateManagerKernel( + manager: KernelWidgetManager, + kernel: Kernel.IKernelConnection + ) { + if (!kernel.handleComms) { + return; + } + manager._handleKernelChanged({ name: 'kernel', - oldValue: null, + oldValue: manager._kernel, newValue: kernel, }); - this.restoreWidgets(); + if (manager._kernel) { + manager._kernel.statusChanged.disconnect( + manager._handleKernelStatusChange, + manager + ); + manager._kernel.connectionStatusChanged.disconnect( + manager._handleKernelConnectionStatusChange, + manager + ); + } + manager._kernel = kernel; + manager._kernel.statusChanged.connect( + manager._handleKernelStatusChange, + manager + ); + manager._kernel.connectionStatusChanged.connect( + manager._handleKernelConnectionStatusChange, + manager + ); + manager._restoredStatus = false; + manager._kernelRestoreInProgress = true; + manager.clear_state().then(() => manager.restoreWidgets()); + } + + /** + * Will define wManager as a renderer for rendermime if rendermime + * is not the global rendermime or there is only one wManager. + * If wManager is not provided, it will make the rendermine more general. + */ + static attachToRendermime( + rendermime: IRenderMimeRegistry, + wManager?: KernelWidgetManager + ) { + const wManager_ = + rendermime === LabWidgetManager.globalRendermime && + Private.kernelWidgetManagers.size > 1 + ? undefined + : wManager; + const pendingManagerMessage = wManager ? 'Loading widget ...' : ''; + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: (options) => + new WidgetRenderer(options, wManager_, pendingManagerMessage), + }, + -10 + ); } _handleKernelConnectionStatusChange( @@ -403,7 +454,8 @@ export class KernelWidgetManager extends LabWidgetManager { } break; case 'disconnected': - this.dispose(); + this.disconnect(); + break; } } @@ -411,25 +463,24 @@ export class KernelWidgetManager extends LabWidgetManager { sender: Kernel.IKernelConnection, status: Kernel.Status ): void { - if (status === 'restarting') { - this.clear_state(); - this.disconnect(); + switch (status) { + case 'restarting': + case 'dead': + this.disconnect(); + break; } } - /** - * Restore widgets from kernel and saved state. + * Restore widgets from kernel. */ async restoreWidgets(): Promise { try { - this._kernelRestoreInProgress = true; await this._loadFromKernel(); - this._restoredStatus = true; - this._restored.emit(); } catch (err) { // Do nothing } - this._kernelRestoreInProgress = false; + this._restoredStatus = true; + this._restored.emit(); } /** @@ -439,10 +490,16 @@ export class KernelWidgetManager extends LabWidgetManager { if (this.isDisposed) { return; } - attachToRendermime(this.rendermime); + super.dispose(); + KernelWidgetManager.attachToRendermime(this.rendermime); Private.kernelWidgetManagers.delete(this.kernel.id); + this._handleKernelChanged({ + name: 'kernel', + oldValue: this._kernel, + newValue: null, + }); this._kernel = null!; - super.dispose(); + this.clear_state(); } get kernel(): Kernel.IKernelConnection { @@ -471,12 +528,14 @@ export class WidgetManager extends Backbone.Model implements IDisposable { constructor( context: DocumentRegistry.IContext, rendermime: IRenderMimeRegistry, - settings: WidgetManager.Settings + settings: WidgetManager.Settings, + renderers?: IterableIterator ) { super(); this._rendermime = rendermime; this._context = context; this._settings = settings; + this._renderers = renderers; context.sessionContext.kernelChanged.connect( this._handleKernelChange, @@ -492,11 +551,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable { this._handleConnectionStatusChange, this ); - - this.updateWidgetManager(); - this.setDirty(); - - this.restoreWidgets(this._context!.model); if (context?.saveState) { context.saveState.connect((sender, saveState) => { if (saveState === 'started' && settings.saveState) { @@ -504,12 +558,30 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } }); } + if (rendermime !== LabWidgetManager.globalRendermime) { + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: (options) => + new WidgetRenderer(options, undefined, 'Waiting for kernel'), + }, + -10 + ); + } + if (this.kernel) { + this.updateWidgetManager(); + } } /** * Save the widget state to the context model. */ private _saveState(): void { + if (!this.widgetManager) { + return; + } const state = this.widgetManager.get_state_sync({ drop_defaults: true }); if (this._context.model.setMetadata) { this._context.model.setMetadata('widgets', { @@ -524,22 +596,37 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } } - updateWidgetManager() { + async updateWidgetManager() { if (this._widgetManager) { - this.widgetManager.onUnhandledIOPubMessage.disconnect( + this._widgetManager.onUnhandledIOPubMessage.disconnect( this.onUnhandledIOPubMessage, this ); } if (this.kernel) { - this._widgetManager = new KernelWidgetManager( - this.kernel, - this.rendermime - ); + await this.context.sessionContext.ready; + this._widgetManager = new KernelWidgetManager(this.kernel, null); this._widgetManager.onUnhandledIOPubMessage.connect( this.onUnhandledIOPubMessage, this ); + if (!this._widgetManager.restoredStatus) { + await new Promise((resolve) => { + this._widgetManager?.restored.connect(resolve); + }); + if (!this.restored) { + this.restoreWidgets(this._context!.model); + } + } + KernelWidgetManager.attachToRendermime( + this.rendermime, + this._widgetManager + ); + if (this._renderers) { + for (const r of this._renderers) { + r.manager = this._widgetManager; + } + } } } @@ -569,17 +656,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { sender: any, status: Kernel.ConnectionStatus ): void { - if (status === 'connected') { - // Only restore if we aren't currently trying to restore from the kernel - // (for example, in our initial restore from the constructor). - if (!this._kernelRestoreInProgress) { - // We only want to restore widgets from the kernel, not ones saved in the notebook. - this.restoreWidgets(this._context!.model, { - loadKernel: true, - loadNotebook: false, - }); - } - } + null; } _handleKernelChange(sender: any, kernel: any): void { @@ -590,7 +667,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { this.setDirty(); } - get widgetManager(): KernelWidgetManager { + get widgetManager(): KernelWidgetManager | null { return this._widgetManager; } @@ -612,34 +689,13 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } /** - * - * @param renderers - */ - updateWidgetRenderers(renderers: IterableIterator) { - if (this.kernel) { - for (const r of renderers) { - r.manager = this.widgetManager; - } - } - // Do we need to handle for if there isn't a kernel? - } - - /** - * Restore widgets from kernel and saved state. + * Restore widgets from notebook and saved state. */ async restoreWidgets( notebook: INotebookModel, - { loadKernel, loadNotebook } = { loadKernel: true, loadNotebook: true } + { loadNotebook } = { loadNotebook: true } ): Promise { try { - await this.context.sessionContext.ready; - if (loadKernel) { - try { - this._kernelRestoreInProgress = true; - } finally { - this._kernelRestoreInProgress = false; - } - } if (loadNotebook) { await this._loadFromNotebook(notebook); } @@ -656,15 +712,32 @@ export class WidgetManager extends Backbone.Model implements IDisposable { * Load widget state from notebook metadata */ async _loadFromNotebook(notebook: INotebookModel): Promise { + if (!this.widgetManager) { + return; + } const widget_md = notebook.getMetadata ? (notebook.getMetadata('widgets') as any) : // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore JupyterLab 3 support notebook.metadata.get('widgets'); - // Restore any widgets from saved state that are not live if (widget_md && widget_md[WIDGET_STATE_MIMETYPE]) { let state = widget_md[WIDGET_STATE_MIMETYPE]; state = this.widgetManager.filterModelState(state); + + // Ensure the kernel has been restored. + let timeoutID; + const restored = this.widgetManager.restored; + if (!this.widgetManager.restoredStatus) { + await new Promise((resolve, reject) => { + restored.connect(resolve); + timeoutID = window.setTimeout( + () => reject('Timeout waiting for '), + 4000 + ); + }); + } + clearTimeout(timeoutID); + // Restore any widgets from saved state that are not live await this.widgetManager.set_state(state); } } @@ -686,8 +759,11 @@ export class WidgetManager extends Backbone.Model implements IDisposable { if (this.isDisposed) { return; } - this._context = null!; + this._renderers = undefined; + this._context = null!; + this._rendermime = null!; + this._settings = null!; } /** @@ -710,23 +786,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable { return this._rendermime; } - /** - * Register a widget model. - */ - register_model(model_id: string, modelPromise: Promise): void { - this.widgetManager.register_model(model_id, modelPromise); - this.setDirty(); - } - - /** - * Close all widgets and empty the widget state. - * @return Promise that resolves when the widget state is cleared. - */ - async clear_state(): Promise { - // await this.widgetManager.clear_state(); - this.setDirty(); - } - /** * Set the dirty state of the notebook model if applicable. * @@ -744,8 +803,8 @@ export class WidgetManager extends Backbone.Model implements IDisposable { private _context: DocumentRegistry.IContext; private _rendermime: IRenderMimeRegistry; private _settings: WidgetManager.Settings; - private _widgetManager: KernelWidgetManager; - protected _kernelRestoreInProgress = false; + private _widgetManager: KernelWidgetManager | null; + private _renderers: IterableIterator | undefined; } export namespace WidgetManager { @@ -765,38 +824,12 @@ export function findWidgetManager(model_id: string): KernelWidgetManager { return wManager; } } - throw new Error(`A widget manager was not found for model_id ${model_id}'`); -} - -/** - * Will define wManager as a renderer for rendermime if rendermime - * is not the global rendermime or there is only one wManager. - * If wManager is not provided, it will make the rendermine more general. - */ -function attachToRendermime( - rendermime: IRenderMimeRegistry, - wManager?: KernelWidgetManager -) { - const wManager_ = - rendermime === LabWidgetManager.globalRendermime && - Private.kernelWidgetManagers.size > 1 - ? undefined - : wManager; - - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options) => new WidgetRenderer(options, wManager_), - }, - -10 - ); + throw new Error(`A widget manager was not found for model_id: '${model_id}'`); } /** * A namespace for private data */ namespace Private { - export const kernelWidgetManagers = new ObservableMap(); + export const kernelWidgetManagers = new Map(); } diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index ddffb3c498..8a6e9ffc6e 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -141,12 +141,9 @@ export function registerWidgetManager( ): DisposableDelegate { let wManager = Private.widgetManagerProperty.get(context); if (!wManager) { - wManager = new WidgetManager(context, rendermime, SETTINGS); + wManager = new WidgetManager(context, rendermime, SETTINGS, renderers); Private.widgetManagerProperty.set(context, wManager); } - if (wManager.kernel) { - wManager.updateWidgetRenderers(renderers); - } return new DisposableDelegate(() => { wManager!.dispose(); }); diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index e6e15c245a..cb3f6d7b01 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -15,6 +15,19 @@ import { LabWidgetManager, findWidgetManager } from './manager'; /** * A renderer for widgets. + * + * Default behavior is to search for the manager, unless the manager + * has already been set. + * + * If `pendingManagerMessage` is a non-empty string, no attempt will + * be made to search for the wiget manager, and the manager must be + * waiting for a manager to be set. + * + * pendingManagerMessage: A message to post when rendering whilst + * awaiting the when manager. + * + * Omitting a message means a manager will be searched for. + * */ export class WidgetRenderer extends Panel @@ -22,10 +35,12 @@ export class WidgetRenderer { constructor( options: IRenderMime.IRendererOptions, - manager?: LabWidgetManager + manager?: LabWidgetManager, + pendingManagerMessage = '' ) { super(); this.mimeType = options.mimeType; + this._pendingManagerMessage = pendingManagerMessage; if (manager) { this.manager = manager; } @@ -37,35 +52,35 @@ export class WidgetRenderer set manager(value: LabWidgetManager) { value.restored.connect(this._rerender, this); this._manager.resolve(value); - this._manager_set = true; + this._managerIsSet = true; } async renderModel(model: IRenderMime.IMimeModel): Promise { const source: any = model.data[this.mimeType]; - this.node.textContent = 'Loading widget...'; - if (!this._manager_set) { - try { - this.manager = findWidgetManager(source.model_id); - } catch (err) { - this.node.textContent = `widget model not found for ${model.data['text/plain']}`; - console.error(err); - return Promise.resolve(); - } - } - const manager = await this._manager.promise; // If there is no model id, the view was removed, so hide the node. if (source.model_id === '') { this.hide(); return Promise.resolve(); } - + let manager; + if (!this._pendingManagerMessage && !this._managerIsSet) { + manager = findWidgetManager(source.model_id); + } + this.node.textContent = `${ + this._pendingManagerMessage || model.data['text/plain'] + }`; + if (!manager) { + manager = await this._manager.promise; + } let wModel: DOMWidgetModel; try { // Presume we have a DOMWidgetModel. Should we check for sure? wModel = (await manager.get_model(source.model_id)) as DOMWidgetModel; } catch (err) { - if (manager.restoredStatus) { + if (!manager.restoredStatus) { + this._rerenderMimeModel = model; + } else { // The manager has been restored, so this error won't be going away. this.node.textContent = 'Error displaying widget: model not found'; this.addClass('jupyter-widgets'); @@ -73,7 +88,6 @@ export class WidgetRenderer } // Store the model for a possible rerender - this._rerenderMimeModel = model; return Promise.resolve(); } @@ -130,6 +144,7 @@ export class WidgetRenderer */ readonly mimeType: string; private _manager = new PromiseDelegate(); - private _manager_set = false; + private _managerIsSet = false; + private _pendingManagerMessage: string; private _rerenderMimeModel: IRenderMime.IMimeModel | null = null; } diff --git a/yarn.lock b/yarn.lock index f650a5e1bd..65339d2899 100644 --- a/yarn.lock +++ b/yarn.lock @@ -942,7 +942,6 @@ __metadata: "@jupyter-widgets/controls": ^5.0.9 "@jupyter-widgets/output": ^6.0.8 "@jupyterlab/application": ^3.0.0 || ^4.0.0 - "@jupyterlab/apputils": ^3.0.0 || ^4.0.0 "@jupyterlab/builder": ^3.0.0 || ^4.0.0 "@jupyterlab/cells": ^3.0.0 || ^4.0.0 "@jupyterlab/console": ^3.0.0 || ^4.0.0 @@ -951,17 +950,19 @@ __metadata: "@jupyterlab/mainmenu": ^3.0.0 || ^4.0.0 "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0 "@jupyterlab/notebook": ^3.0.0 || ^4.0.0 + "@jupyterlab/observables": ^5.2.1 "@jupyterlab/outputarea": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime-interfaces": ^3.0.0 || ^4.0.0 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@jupyterlab/settingregistry": ^3.0.0 || ^4.0.0 "@jupyterlab/translation": ^3.0.0 || ^4.0.0 - "@lumino/algorithm": ^1 || ^2 - "@lumino/coreutils": ^1 || ^2 - "@lumino/disposable": ^1 || ^2 - "@lumino/signaling": ^1 || ^2 - "@lumino/widgets": ^1 || ^2 + "@lumino/algorithm": ^1.11.1 || ^2.0.0 + "@lumino/coreutils": ^1.11.1 || ^2.1 + "@lumino/disposable": ^1.10.1 || ^2.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^1.10.1 || ^2.1 + "@lumino/widgets": ^1.30.0 || ^2.1 "@types/backbone": 1.4.14 "@types/jquery": ^3.5.16 "@types/semver": ^7.3.6 @@ -1083,9 +1084,9 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/apputils@npm:^3.0.0 || ^4.0.0, @jupyterlab/apputils@npm:^4.3.5": - version: 4.3.5 - resolution: "@jupyterlab/apputils@npm:4.3.5" +"@jupyterlab/apputils@npm:^4.3.1": + version: 4.3.1 + resolution: "@jupyterlab/apputils@npm:4.3.1" dependencies: "@jupyterlab/coreutils": ^6.2.5 "@jupyterlab/observables": ^5.2.5 From cbf6c40b10ed9c4fd6f009b37dc0809888bbbd5d Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 1 Jun 2024 14:07:12 +1000 Subject: [PATCH 23/48] manager and render code refactoring. --- python/jupyterlab_widgets/src/manager.ts | 127 ++++++++++++---------- python/jupyterlab_widgets/src/plugin.ts | 2 +- python/jupyterlab_widgets/src/renderer.ts | 9 +- 3 files changed, 74 insertions(+), 64 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index ddcbc46a2f..f753a2e77d 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -20,6 +20,8 @@ import { import { IDisposable } from '@lumino/disposable'; +import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; + import { ReadonlyPartialJSONValue } from '@lumino/coreutils'; import { INotebookModel } from '@jupyterlab/notebook'; @@ -44,9 +46,10 @@ import { SemVerCache } from './semvercache'; import Backbone from 'backbone'; -import * as base from '@jupyter-widgets/base'; import { WidgetRenderer } from './renderer'; +import * as base from '@jupyter-widgets/base'; + /** * The mime type for a widget view. */ @@ -354,15 +357,20 @@ export abstract class LabWidgetManager export class KernelWidgetManager extends LabWidgetManager { constructor( kernel: Kernel.IKernelConnection, - rendermime: IRenderMimeRegistry | null + rendermime: IRenderMimeRegistry | null, + pendingManagerMessage = 'Loading widget ...' ) { if (!rendermime) { rendermime = LabWidgetManager.globalRendermime; } const instance = Private.kernelWidgetManagers.get(kernel.id); if (instance) { - KernelWidgetManager.updateManagerKernel(instance, kernel); - KernelWidgetManager.attachToRendermime(rendermime, instance); + instance._useKernel(kernel); + KernelWidgetManager.configureRendermime( + rendermime, + instance, + pendingManagerMessage + ); return instance; } if (!kernel.handleComms) { @@ -374,68 +382,72 @@ export class KernelWidgetManager extends LabWidgetManager { LabWidgetManager.WIDGET_REGISTRY.changed.connect(() => this.loadCustomWidgetDefinitions() ); - KernelWidgetManager.updateManagerKernel(this, kernel); - KernelWidgetManager.attachToRendermime(rendermime, this); + this._useKernel(kernel); + KernelWidgetManager.configureRendermime( + rendermime, + this, + pendingManagerMessage + ); } - static updateManagerKernel( - manager: KernelWidgetManager, - kernel: Kernel.IKernelConnection - ) { + _useKernel(this: KernelWidgetManager, kernel: Kernel.IKernelConnection) { if (!kernel.handleComms) { return; } - manager._handleKernelChanged({ + this._handleKernelChanged({ name: 'kernel', - oldValue: manager._kernel, + oldValue: this._kernel, newValue: kernel, }); - if (manager._kernel) { - manager._kernel.statusChanged.disconnect( - manager._handleKernelStatusChange, - manager + if (this._kernel) { + this._kernel.statusChanged.disconnect( + this._handleKernelStatusChange, + this ); - manager._kernel.connectionStatusChanged.disconnect( - manager._handleKernelConnectionStatusChange, - manager + this._kernel.connectionStatusChanged.disconnect( + this._handleKernelConnectionStatusChange, + this ); } - manager._kernel = kernel; - manager._kernel.statusChanged.connect( - manager._handleKernelStatusChange, - manager - ); - manager._kernel.connectionStatusChanged.connect( - manager._handleKernelConnectionStatusChange, - manager + this._kernel = kernel; + this._kernel.statusChanged.connect(this._handleKernelStatusChange, this); + this._kernel.connectionStatusChanged.connect( + this._handleKernelConnectionStatusChange, + this ); - manager._restoredStatus = false; - manager._kernelRestoreInProgress = true; - manager.clear_state().then(() => manager.restoreWidgets()); + this._restoredStatus = false; + this._kernelRestoreInProgress = true; + this.clear_state().then(() => this.restoreWidgets()); } /** - * Will define wManager as a renderer for rendermime if rendermime - * is not the global rendermime or there is only one wManager. - * If wManager is not provided, it will make the rendermine more general. + * Configure a non-global rendermime. Passing the global rendermine will do + * nothing. + * + * @param rendermime + * @param manager The manager to use with WidgetRenderer. + * @param pendingManagerMessage A message that is displayed while the manager + * has not been provided. If manager is not provided here a non-empty string + * assumes the manager will be provided at some time in the future. + * + * The default will search for a manager once. + * @returns */ - static attachToRendermime( + static configureRendermime( rendermime: IRenderMimeRegistry, - wManager?: KernelWidgetManager + manager?: KernelWidgetManager, + pendingManagerMessage = '' ) { - const wManager_ = - rendermime === LabWidgetManager.globalRendermime && - Private.kernelWidgetManagers.size > 1 - ? undefined - : wManager; - const pendingManagerMessage = wManager ? 'Loading widget ...' : ''; + if (rendermime === LabWidgetManager.globalRendermime) { + return; + } rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); rendermime.addFactory( { safe: false, mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options) => - new WidgetRenderer(options, wManager_, pendingManagerMessage), + createRenderer: (options: IRenderMime.IRendererOptions) => + new WidgetRenderer(options, manager, pendingManagerMessage), }, -10 ); @@ -491,7 +503,7 @@ export class KernelWidgetManager extends LabWidgetManager { return; } super.dispose(); - KernelWidgetManager.attachToRendermime(this.rendermime); + KernelWidgetManager.configureRendermime(this.rendermime); Private.kernelWidgetManagers.delete(this.kernel.id); this._handleKernelChanged({ name: 'kernel', @@ -559,15 +571,11 @@ export class WidgetManager extends Backbone.Model implements IDisposable { }); } if (rendermime !== LabWidgetManager.globalRendermime) { - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options) => - new WidgetRenderer(options, undefined, 'Waiting for kernel'), - }, - -10 + // Instruct the renderer to wait for the widgetManager. + KernelWidgetManager.configureRendermime( + rendermime, + undefined, + 'Waiting for kernel' ); } if (this.kernel) { @@ -618,9 +626,10 @@ export class WidgetManager extends Backbone.Model implements IDisposable { this.restoreWidgets(this._context!.model); } } - KernelWidgetManager.attachToRendermime( + KernelWidgetManager.configureRendermime( this.rendermime, - this._widgetManager + this._widgetManager, + 'Loading widget ...' ); if (this._renderers) { for (const r of this._renderers) { @@ -814,17 +823,15 @@ export namespace WidgetManager { } /** - * Get the widgetManager that owns the model id=model_id. - * @param model_id An existing model_id - * @returns KernelWidgetManager + * Get the widgetManager that owns the model. */ -export function findWidgetManager(model_id: string): KernelWidgetManager { +export function getWidgetManager(model_id: string): KernelWidgetManager | null { for (const wManager of Private.kernelWidgetManagers.values()) { if (wManager.has_model(model_id)) { return wManager; } } - throw new Error(`A widget manager was not found for model_id: '${model_id}'`); + return null; } /** diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 8a6e9ffc6e..c475e07436 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -225,7 +225,7 @@ function activateWidgetExtension( } WidgetManager.loggerRegistry = loggerRegistry; LabWidgetManager.globalRendermime = rendermime; - // Add a placeholder widget renderer. + // Add a default widget renderer. rendermime.addFactory( { safe: false, diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index cb3f6d7b01..8d200813af 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -11,7 +11,7 @@ import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; import { DOMWidgetModel } from '@jupyter-widgets/base'; -import { LabWidgetManager, findWidgetManager } from './manager'; +import { LabWidgetManager, getWidgetManager } from './manager'; /** * A renderer for widgets. @@ -65,7 +65,7 @@ export class WidgetRenderer } let manager; if (!this._pendingManagerMessage && !this._managerIsSet) { - manager = findWidgetManager(source.model_id); + manager = getWidgetManager(source.model_id); } this.node.textContent = `${ this._pendingManagerMessage || model.data['text/plain'] @@ -80,13 +80,16 @@ export class WidgetRenderer } catch (err) { if (!manager.restoredStatus) { this._rerenderMimeModel = model; + } else if (this._pendingManagerMessage === 'Waiting for kernel') { + this.node.textContent = `Widget not found in this kernel: ${ + model.data['text/plain'] || source.model_id + }`; } else { // The manager has been restored, so this error won't be going away. this.node.textContent = 'Error displaying widget: model not found'; this.addClass('jupyter-widgets'); console.error(err); } - // Store the model for a possible rerender return Promise.resolve(); } From 390b25b14bf823bab67b219cf3237557d94673eb Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 1 Jun 2024 14:13:20 +1000 Subject: [PATCH 24/48] Avoid generating a warning "Failed to fetch ipywidgets through the "jupyter.widget.control" comm channel ..." when loading a kernel where ipywidgets hasn't been imported yet. --- packages/base-manager/src/manager-base.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index fe569a5213..0806fa2b74 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -384,6 +384,11 @@ export abstract class ManagerBase implements IWidgetManager { let data: any; let buffers: any; let timeoutID: number | undefined; + const comm_ids = await this._get_comm_info(); + if (Object.keys(comm_ids).length === 0) { + // There is nothing to load, either a new kernel or no widgets in the kernel. + return Promise.resolve(); + } try { const initComm = await this._create_comm( CONTROL_COMM_TARGET, From 2b83783e9be42dd70becfc097d93ffda7a043d04 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 2 Jun 2024 10:36:30 +1000 Subject: [PATCH 25/48] WidgetModel.close - catch any error when closing comm to ensure closing runs to completion. --- packages/base/src/widget.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index a44b10fb83..9a660bb25b 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -214,16 +214,22 @@ export class WidgetModel extends Backbone.Model { /** * Close model * + * @param comm_closed - true if the comm is already being closed. If false, the comm will be closed. + * * @returns - a promise that is fulfilled when all the associated views have been removed. */ - close(): Promise { + close(comm_closed = false): Promise { // can only be closed once. if (this._closed) { return Promise.resolve(); } this._closed = true; - if (this.comm && this.comm_live) { - this.comm.close(); + if (this.comm && !comm_closed && this.comm_live) { + try { + this.comm.close(); + } catch (err) { + // Do Nothing + } } this.stopListening(); this.trigger('destroy', this); @@ -248,10 +254,10 @@ export class WidgetModel extends Backbone.Model { */ _handle_comm_closed(msg: KernelMessage.ICommCloseMsg): void { this.comm_live = false; - if (this._closed) { - this.close(); - } this.trigger('comm:close'); + if (!this._closed) { + this.close(true); + } } /** From 3b5f4d7ba26b6e8d926c3c2a65e70c768aa9c7ab Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 2 Jun 2024 17:35:19 +1000 Subject: [PATCH 26/48] Improved manager logic and re-rendering when the kernel is re-connected. --- python/jupyterlab_widgets/src/manager.ts | 193 ++++++++++------------ python/jupyterlab_widgets/src/renderer.ts | 43 ++--- 2 files changed, 107 insertions(+), 129 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index f753a2e77d..0895122fb3 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -24,7 +24,7 @@ import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; import { ReadonlyPartialJSONValue } from '@lumino/coreutils'; -import { INotebookModel } from '@jupyterlab/notebook'; +import { INotebookModel, NotebookModel } from '@jupyterlab/notebook'; import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; @@ -353,24 +353,20 @@ export abstract class LabWidgetManager * A singleton widget manager per kernel for the lifecycle of the kernel. * The factory of the rendermime will be update to use the widgetManager * directly if it isn't the globalRendermime. + * + * Note: The rendermime of the instance is always the global rendermime. */ export class KernelWidgetManager extends LabWidgetManager { constructor( kernel: Kernel.IKernelConnection, - rendermime: IRenderMimeRegistry | null, + rendermime?: IRenderMimeRegistry, pendingManagerMessage = 'Loading widget ...' ) { - if (!rendermime) { - rendermime = LabWidgetManager.globalRendermime; - } const instance = Private.kernelWidgetManagers.get(kernel.id); if (instance) { instance._useKernel(kernel); - KernelWidgetManager.configureRendermime( - rendermime, - instance, - pendingManagerMessage - ); + configureRendermime(rendermime, instance, pendingManagerMessage); + instance._firstLoad = false; return instance; } if (!kernel.handleComms) { @@ -383,15 +379,11 @@ export class KernelWidgetManager extends LabWidgetManager { this.loadCustomWidgetDefinitions() ); this._useKernel(kernel); - KernelWidgetManager.configureRendermime( - rendermime, - this, - pendingManagerMessage - ); + configureRendermime(rendermime, this, pendingManagerMessage); } _useKernel(this: KernelWidgetManager, kernel: Kernel.IKernelConnection) { - if (!kernel.handleComms) { + if (!kernel.handleComms || this._kernel === kernel) { return; } this._handleKernelChanged({ @@ -420,39 +412,6 @@ export class KernelWidgetManager extends LabWidgetManager { this.clear_state().then(() => this.restoreWidgets()); } - /** - * Configure a non-global rendermime. Passing the global rendermine will do - * nothing. - * - * @param rendermime - * @param manager The manager to use with WidgetRenderer. - * @param pendingManagerMessage A message that is displayed while the manager - * has not been provided. If manager is not provided here a non-empty string - * assumes the manager will be provided at some time in the future. - * - * The default will search for a manager once. - * @returns - */ - static configureRendermime( - rendermime: IRenderMimeRegistry, - manager?: KernelWidgetManager, - pendingManagerMessage = '' - ) { - if (rendermime === LabWidgetManager.globalRendermime) { - return; - } - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options: IRenderMime.IRendererOptions) => - new WidgetRenderer(options, manager, pendingManagerMessage), - }, - -10 - ); - } - _handleKernelConnectionStatusChange( sender: Kernel.IKernelConnection, status: Kernel.ConnectionStatus @@ -482,6 +441,7 @@ export class KernelWidgetManager extends LabWidgetManager { break; } } + /** * Restore widgets from kernel. */ @@ -503,7 +463,7 @@ export class KernelWidgetManager extends LabWidgetManager { return; } super.dispose(); - KernelWidgetManager.configureRendermime(this.rendermime); + configureRendermime(this.rendermime); Private.kernelWidgetManagers.delete(this.kernel.id); this._handleKernelChanged({ name: 'kernel', @@ -518,6 +478,10 @@ export class KernelWidgetManager extends LabWidgetManager { return this._kernel; } + get firstLoad() { + return this._firstLoad; + } + loadCustomWidgetDefinitions() { for (const data of LabWidgetManager.WIDGET_REGISTRY) { this.register(data); @@ -527,7 +491,7 @@ export class KernelWidgetManager extends LabWidgetManager { filterModelState(serialized_state: any): any { return this.filterExistingModelState(serialized_state); } - + private _firstLoad = true; private _kernel: Kernel.IKernelConnection; protected _kernelRestoreInProgress = false; } @@ -570,17 +534,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } }); } - if (rendermime !== LabWidgetManager.globalRendermime) { - // Instruct the renderer to wait for the widgetManager. - KernelWidgetManager.configureRendermime( - rendermime, - undefined, - 'Waiting for kernel' - ); - } - if (this.kernel) { - this.updateWidgetManager(); - } + this.updateWidgetManager(); } /** @@ -605,38 +559,45 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } async updateWidgetManager() { + let wManager: KernelWidgetManager | undefined; + if (!this.kernel) { + //'No kernel' is matched in WidgetRenderer to supress 'model not found errors'. + configureRendermime(this.rendermime, undefined, 'No kernel'); + } else { + await this.context.sessionContext.ready; + wManager = new KernelWidgetManager(this.kernel); + } + if (wManager === this._widgetManager) { + return; + } if (this._widgetManager) { this._widgetManager.onUnhandledIOPubMessage.disconnect( this.onUnhandledIOPubMessage, this ); } - if (this.kernel) { - await this.context.sessionContext.ready; - this._widgetManager = new KernelWidgetManager(this.kernel, null); - this._widgetManager.onUnhandledIOPubMessage.connect( - this.onUnhandledIOPubMessage, - this - ); - if (!this._widgetManager.restoredStatus) { - await new Promise((resolve) => { - this._widgetManager?.restored.connect(resolve); - }); - if (!this.restored) { - this.restoreWidgets(this._context!.model); - } + this._widgetManager = wManager; + if (!wManager) { + return; + } + if (wManager.firstLoad) { + await new Promise((resolve) => { + this._widgetManager?.restored.connect(resolve); + }); + if (!this.restored) { + this.restoreWidgets(this._context!.model); } - KernelWidgetManager.configureRendermime( - this.rendermime, - this._widgetManager, - 'Loading widget ...' - ); - if (this._renderers) { - for (const r of this._renderers) { - r.manager = this._widgetManager; - } + } + if (this._renderers) { + for (const r of this._renderers) { + r.manager = wManager; } } + configureRendermime(this.rendermime, wManager, 'Loading widget ...'); + wManager.onUnhandledIOPubMessage.connect( + this.onUnhandledIOPubMessage, + this + ); } onUnhandledIOPubMessage( @@ -676,7 +637,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { this.setDirty(); } - get widgetManager(): KernelWidgetManager | null { + get widgetManager(): KernelWidgetManager | undefined { return this._widgetManager; } @@ -698,17 +659,13 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } /** - * Restore widgets from notebook and saved state. + * Restore widgets from model. */ - async restoreWidgets( - notebook: INotebookModel, - { loadNotebook } = { loadNotebook: true } - ): Promise { + async restoreWidgets(model: INotebookModel): Promise { try { - if (loadNotebook) { - await this._loadFromNotebook(notebook); + if (model instanceof NotebookModel) { + await this._loadFromNotebook(model); } - // If the restore worked above, then update our state. this._restoredStatus = true; this._restored.emit(); @@ -733,19 +690,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable { let state = widget_md[WIDGET_STATE_MIMETYPE]; state = this.widgetManager.filterModelState(state); - // Ensure the kernel has been restored. - let timeoutID; - const restored = this.widgetManager.restored; - if (!this.widgetManager.restoredStatus) { - await new Promise((resolve, reject) => { - restored.connect(resolve); - timeoutID = window.setTimeout( - () => reject('Timeout waiting for '), - 4000 - ); - }); - } - clearTimeout(timeoutID); // Restore any widgets from saved state that are not live await this.widgetManager.set_state(state); } @@ -812,7 +756,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { private _context: DocumentRegistry.IContext; private _rendermime: IRenderMimeRegistry; private _settings: WidgetManager.Settings; - private _widgetManager: KernelWidgetManager | null; + private _widgetManager: KernelWidgetManager | undefined; private _renderers: IterableIterator | undefined; } @@ -822,6 +766,39 @@ export namespace WidgetManager { }; } +/** + * Configure a non-global rendermime. Passing the global rendermine will do + * nothing. + * + * @param rendermime + * @param manager The manager to use with WidgetRenderer. + * @param pendingManagerMessage A message that is displayed while the manager + * has not been provided. If manager is not provided here a non-empty string + * assumes the manager will be provided at some time in the future. + * + * The default will search for a manager once prior to waiting for a manager. + * @returns + */ +function configureRendermime( + rendermime?: IRenderMimeRegistry, + manager?: KernelWidgetManager, + pendingManagerMessage = '' +) { + if (!rendermime || rendermime === LabWidgetManager.globalRendermime) { + return; + } + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: (options: IRenderMime.IRendererOptions) => + new WidgetRenderer(options, manager, pendingManagerMessage), + }, + -10 + ); +} + /** * Get the widgetManager that owns the model. */ diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index 8d200813af..a5529f4bdb 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -48,11 +48,20 @@ export class WidgetRenderer /** * The widget manager. + * + * Will accept the first non-null manager and ignore anything afterwards. */ - set manager(value: LabWidgetManager) { - value.restored.connect(this._rerender, this); - this._manager.resolve(value); - this._managerIsSet = true; + + set manager(value: LabWidgetManager | null) { + if (value && !this._managerIsSet) { + // Can only set the manager once + this._manager.resolve(value); + this._managerIsSet = true; + value.restored.connect(this._rerender, this); + this.disposed.connect(() => + value.restored.disconnect(this._rerender, this) + ); + } } async renderModel(model: IRenderMime.IMimeModel): Promise { @@ -63,28 +72,23 @@ export class WidgetRenderer this.hide(); return Promise.resolve(); } - let manager; if (!this._pendingManagerMessage && !this._managerIsSet) { - manager = getWidgetManager(source.model_id); + this.manager = getWidgetManager(source.model_id); } this.node.textContent = `${ this._pendingManagerMessage || model.data['text/plain'] }`; - if (!manager) { - manager = await this._manager.promise; - } + const manager: LabWidgetManager = await this._manager.promise; + this._rerenderMimeModel = model; + let wModel: DOMWidgetModel; try { // Presume we have a DOMWidgetModel. Should we check for sure? wModel = (await manager.get_model(source.model_id)) as DOMWidgetModel; } catch (err) { - if (!manager.restoredStatus) { - this._rerenderMimeModel = model; - } else if (this._pendingManagerMessage === 'Waiting for kernel') { - this.node.textContent = `Widget not found in this kernel: ${ - model.data['text/plain'] || source.model_id - }`; - } else { + if (this._pendingManagerMessage === 'No kernel') { + this.node.textContent = 'Model not found in new kernel'; + } else if (manager.restoredStatus) { // The manager has been restored, so this error won't be going away. this.node.textContent = 'Error displaying widget: model not found'; this.addClass('jupyter-widgets'); @@ -93,10 +97,6 @@ export class WidgetRenderer // Store the model for a possible rerender return Promise.resolve(); } - - // Successful getting the model, so we don't need to try to rerender. - this._rerenderMimeModel = null; - let widget: LuminoWidget; try { const view = await manager.create_view(wModel); @@ -111,12 +111,12 @@ export class WidgetRenderer // Clear any previous loading message. this.node.textContent = ''; this.addWidget(widget); + this.show(); // When the widget is disposed, hide this container and make sure we // change the output model to reflect the view was closed. widget.disposed.connect(() => { this.hide(); - source.model_id = ''; }); } @@ -128,6 +128,7 @@ export class WidgetRenderer return; } this._manager = null!; + this._rerenderMimeModel = null; super.dispose(); } From 23667a9ea485491fb9c228e081fa1949ffb953cc Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 2 Jun 2024 21:18:15 +1000 Subject: [PATCH 27/48] Added delays for getWidgetManager and get_model if the model isn't immediately available. --- packages/base-manager/src/manager-base.ts | 7 ++++++- python/jupyterlab_widgets/src/manager.ts | 13 +++++++++---- python/jupyterlab_widgets/src/renderer.ts | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index 0806fa2b74..aa63ab24ed 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -215,9 +215,13 @@ export abstract class ManagerBase implements IWidgetManager { * If you would like to synchronously test if a model exists, use .has_model(). */ async get_model(model_id: string): Promise { + let i = 0; + while (!this._models[model_id] && i < this._sleepTimes.length) { + new Promise((r) => setTimeout(r, this._sleepTimes[i++])) + } const modelPromise = this._models[model_id]; if (modelPromise === undefined) { - throw new Error('widget model not found'); + throw new Error(`widget model '${model_id}' not found`); } return modelPromise; } @@ -874,6 +878,7 @@ export abstract class ManagerBase implements IWidgetManager { /** * Dictionary of model ids and model instance promises */ + private _sleepTimes = [2, 50, 200, 800]; private _models: { [key: string]: Promise } = Object.create(null); } diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 0895122fb3..a1d9d73d97 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -802,10 +802,15 @@ function configureRendermime( /** * Get the widgetManager that owns the model. */ -export function getWidgetManager(model_id: string): KernelWidgetManager | null { - for (const wManager of Private.kernelWidgetManagers.values()) { - if (wManager.has_model(model_id)) { - return wManager; +export async function getWidgetManager( + model_id: string +): Promise { + for (const sleepTime of [0, 50, 1000]) { + await new Promise((r) => setTimeout(r, sleepTime)); + for (const wManager of Private.kernelWidgetManagers.values()) { + if (wManager.has_model(model_id)) { + return wManager; + } } } return null; diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index a5529f4bdb..257b985522 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -73,7 +73,7 @@ export class WidgetRenderer return Promise.resolve(); } if (!this._pendingManagerMessage && !this._managerIsSet) { - this.manager = getWidgetManager(source.model_id); + this.manager = await getWidgetManager(source.model_id); } this.node.textContent = `${ this._pendingManagerMessage || model.data['text/plain'] From 09a10209f40b18cdb7bfab55d4399185266d522f Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Mon, 3 Jun 2024 22:01:20 +1000 Subject: [PATCH 28/48] Manager, WidgetManager and plugin refactoring (simplification) . Warning: some signature changes. --- packages/base-manager/src/manager-base.ts | 2 +- python/jupyterlab_widgets/package.json | 2 - python/jupyterlab_widgets/src/manager.ts | 283 ++++++++++++---------- python/jupyterlab_widgets/src/plugin.ts | 143 +---------- python/jupyterlab_widgets/src/renderer.ts | 17 +- yarn.lock | 99 +++++--- 6 files changed, 236 insertions(+), 310 deletions(-) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index aa63ab24ed..7f578fd9ed 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -217,7 +217,7 @@ export abstract class ManagerBase implements IWidgetManager { async get_model(model_id: string): Promise { let i = 0; while (!this._models[model_id] && i < this._sleepTimes.length) { - new Promise((r) => setTimeout(r, this._sleepTimes[i++])) + new Promise((resolve) => setTimeout(resolve, this._sleepTimes[i++])); } const modelPromise = this._models[model_id]; if (modelPromise === undefined) { diff --git a/python/jupyterlab_widgets/package.json b/python/jupyterlab_widgets/package.json index 959022483c..768dd8c4a4 100644 --- a/python/jupyterlab_widgets/package.json +++ b/python/jupyterlab_widgets/package.json @@ -64,7 +64,6 @@ "@jupyterlab/services": "^6.0.0 || ^7.0.0", "@jupyterlab/settingregistry": "^3.0.0 || ^4.0.0", "@jupyterlab/translation": "^3.0.0 || ^4.0.0", - "@lumino/algorithm": "^1.11.1 || ^2.0.0", "@lumino/coreutils": "^1.11.1 || ^2.1", "@lumino/disposable": "^1.10.1 || ^2.1", "@lumino/properties": "^2.0.1", @@ -76,7 +75,6 @@ }, "devDependencies": { "@jupyterlab/builder": "^3.0.0 || ^4.0.0", - "@jupyterlab/cells": "^3.0.0 || ^4.0.0", "@types/jquery": "^3.5.16", "@types/semver": "^7.3.6", "@typescript-eslint/eslint-plugin": "^5.8.0", diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index a1d9d73d97..9bd5ed42fb 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -20,6 +20,8 @@ import { import { IDisposable } from '@lumino/disposable'; +import { AttachedProperty } from '@lumino/properties'; + import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; import { ReadonlyPartialJSONValue } from '@lumino/coreutils'; @@ -351,7 +353,7 @@ export abstract class LabWidgetManager /** * A singleton widget manager per kernel for the lifecycle of the kernel. - * The factory of the rendermime will be update to use the widgetManager + * The factory of the rendermime will be updated to use the widgetManager * directly if it isn't the globalRendermime. * * Note: The rendermime of the instance is always the global rendermime. @@ -365,8 +367,11 @@ export class KernelWidgetManager extends LabWidgetManager { const instance = Private.kernelWidgetManagers.get(kernel.id); if (instance) { instance._useKernel(kernel); - configureRendermime(rendermime, instance, pendingManagerMessage); - instance._firstLoad = false; + KernelWidgetManager.configureRendermime( + rendermime, + instance, + pendingManagerMessage + ); return instance; } if (!kernel.handleComms) { @@ -379,7 +384,11 @@ export class KernelWidgetManager extends LabWidgetManager { this.loadCustomWidgetDefinitions() ); this._useKernel(kernel); - configureRendermime(rendermime, this, pendingManagerMessage); + KernelWidgetManager.configureRendermime( + rendermime, + this, + pendingManagerMessage + ); } _useKernel(this: KernelWidgetManager, kernel: Kernel.IKernelConnection) { @@ -412,6 +421,38 @@ export class KernelWidgetManager extends LabWidgetManager { this.clear_state().then(() => this.restoreWidgets()); } + /** + * Configure a non-global rendermime. Passing the global rendermine will do + * nothing. + * + * @param rendermime + * @param manager The manager to use with WidgetRenderer. + * @param pendingManagerMessage A message that is displayed while the manager + * has not been provided. If manager is not provided here a non-empty string + * assumes the manager will be provided at some time in the future. + * + * The default will search for a manager once prior to waiting for a manager. + * @returns + */ + static configureRendermime( + rendermime?: IRenderMimeRegistry, + manager?: KernelWidgetManager, + pendingManagerMessage = '' + ) { + if (!rendermime || rendermime === LabWidgetManager.globalRendermime) { + return; + } + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: (options: IRenderMime.IRendererOptions) => + new WidgetRenderer(options, manager, pendingManagerMessage), + }, + -10 + ); + } _handleKernelConnectionStatusChange( sender: Kernel.IKernelConnection, status: Kernel.ConnectionStatus @@ -451,10 +492,13 @@ export class KernelWidgetManager extends LabWidgetManager { } catch (err) { // Do nothing } + this.triggerRestored(); + } + + triggerRestored() { this._restoredStatus = true; this._restored.emit(); } - /** * Dispose the resources held by the manager. */ @@ -463,7 +507,7 @@ export class KernelWidgetManager extends LabWidgetManager { return; } super.dispose(); - configureRendermime(this.rendermime); + KernelWidgetManager.configureRendermime(this.rendermime); Private.kernelWidgetManagers.delete(this.kernel.id); this._handleKernelChanged({ name: 'kernel', @@ -478,10 +522,6 @@ export class KernelWidgetManager extends LabWidgetManager { return this._kernel; } - get firstLoad() { - return this._firstLoad; - } - loadCustomWidgetDefinitions() { for (const data of LabWidgetManager.WIDGET_REGISTRY) { this.register(data); @@ -491,27 +531,34 @@ export class KernelWidgetManager extends LabWidgetManager { filterModelState(serialized_state: any): any { return this.filterExistingModelState(serialized_state); } - private _firstLoad = true; + private _kernel: Kernel.IKernelConnection; protected _kernelRestoreInProgress = false; } /** - * Monitor kernel of the Context swapping the kernel manager on demand. - * A better name would be `NotebookManagerSwitcher'. + * A single 'WidgetManager' per context. + * It monitors the kernel of the context swapping the kernel manager when the + * kernel is changed. + * A better name would be `WidgetManagerChanger'. TODO: change name and context. */ export class WidgetManager extends Backbone.Model implements IDisposable { constructor( - context: DocumentRegistry.IContext, + context: DocumentRegistry.Context, rendermime: IRenderMimeRegistry, - settings: WidgetManager.Settings, - renderers?: IterableIterator + settings?: WidgetManager.Settings ) { + const instance = Private.widgetManagerProperty.get(context); + if (instance) { + WidgetManager._rendermimeSetFactory(rendermime, instance); + return instance; + } super(); - this._rendermime = rendermime; + Private.widgetManagerProperty.set(context, this); this._context = context; this._settings = settings; - this._renderers = renderers; + this._renderers = new Set(); + WidgetManager._rendermimeSetFactory(rendermime, this); context.sessionContext.kernelChanged.connect( this._handleKernelChange, @@ -529,7 +576,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { ); if (context?.saveState) { context.saveState.connect((sender, saveState) => { - if (saveState === 'started' && settings.saveState) { + if (saveState === 'started' && settings?.saveState) { this._saveState(); } }); @@ -545,26 +592,36 @@ export class WidgetManager extends Backbone.Model implements IDisposable { return; } const state = this.widgetManager.get_state_sync({ drop_defaults: true }); - if (this._context.model.setMetadata) { - this._context.model.setMetadata('widgets', { - 'application/vnd.jupyter.widget-state+json': state, - }); - } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore JupyterLab 3 support - this._context.model.metadata.set('widgets', { + const model = this._context.model; + if (model instanceof NotebookModel) { + model.setMetadata('widgets', { 'application/vnd.jupyter.widget-state+json': state, }); } } + static _rendermimeSetFactory( + rendermime: IRenderMimeRegistry, + manager: WidgetManager + ) { + if (rendermime === LabWidgetManager.globalRendermime) { + throw new Error('Using global rendermime is not permitted!'); + } + rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); + rendermime.addFactory( + { + safe: false, + mimeTypes: [WIDGET_VIEW_MIMETYPE], + createRenderer: manager._newWidgetRenderer.bind(manager), + }, + -10 + ); + } + async updateWidgetManager() { let wManager: KernelWidgetManager | undefined; - if (!this.kernel) { - //'No kernel' is matched in WidgetRenderer to supress 'model not found errors'. - configureRendermime(this.rendermime, undefined, 'No kernel'); - } else { - await this.context.sessionContext.ready; + await this.context.sessionContext.ready; + if (this.kernel) { wManager = new KernelWidgetManager(this.kernel); } if (wManager === this._widgetManager) { @@ -580,28 +637,38 @@ export class WidgetManager extends Backbone.Model implements IDisposable { if (!wManager) { return; } - if (wManager.firstLoad) { + wManager.onUnhandledIOPubMessage.connect( + this.onUnhandledIOPubMessage, + this + ); + if (!wManager.restored) { await new Promise((resolve) => { this._widgetManager?.restored.connect(resolve); }); - if (!this.restored) { - this.restoreWidgets(this._context!.model); - } } - if (this._renderers) { - for (const r of this._renderers) { - r.manager = wManager; - } + this._renderers.forEach( + (renderer: WidgetRenderer) => (renderer.manager = wManager) + ); + if (await this._restoreWidgets(this._context!.model)) { + wManager.triggerRestored(); } - configureRendermime(this.rendermime, wManager, 'Loading widget ...'); - wManager.onUnhandledIOPubMessage.connect( - this.onUnhandledIOPubMessage, - this + } + + _newWidgetRenderer(options: IRenderMime.IRendererOptions) { + const renderer = new WidgetRenderer( + options, + this.widgetManager, + this.widgetManager ? 'Loading widget ...' : 'No kernel' + ); + this._renderers.add(renderer); + renderer.disposed.connect((renderer_: WidgetRenderer) => + this._renderers.delete(renderer_) ); + return renderer; } onUnhandledIOPubMessage( - sender: LabWidgetManager, + sender: KernelWidgetManager, msg: KernelMessage.IIOPubMessage ) { if (WidgetManager.loggerRegistry) { @@ -641,34 +708,16 @@ export class WidgetManager extends Backbone.Model implements IDisposable { return this._widgetManager; } - /** - * A signal emitted when state is restored to the widget manager. - * - * #### Notes - * This indicates that previously-unavailable widget models might be available now. - */ - get restored(): ISignal { - return this._restored; - } - - /** - * Whether the state has been restored yet or not. - */ - get restoredStatus(): boolean { - return this._restoredStatus; - } - /** * Restore widgets from model. */ - async restoreWidgets(model: INotebookModel): Promise { + async _restoreWidgets( + model: DocumentRegistry.IModel + ): Promise { try { if (model instanceof NotebookModel) { - await this._loadFromNotebook(model); + return await this._loadFromNotebook(model); } - // If the restore worked above, then update our state. - this._restoredStatus = true; - this._restored.emit(); } catch (err) { // Do nothing if the restore did not work. } @@ -677,22 +726,25 @@ export class WidgetManager extends Backbone.Model implements IDisposable { /** * Load widget state from notebook metadata */ - async _loadFromNotebook(notebook: INotebookModel): Promise { - if (!this.widgetManager) { - return; - } - const widget_md = notebook.getMetadata - ? (notebook.getMetadata('widgets') as any) - : // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore JupyterLab 3 support - notebook.metadata.get('widgets'); - if (widget_md && widget_md[WIDGET_STATE_MIMETYPE]) { - let state = widget_md[WIDGET_STATE_MIMETYPE]; - state = this.widgetManager.filterModelState(state); - - // Restore any widgets from saved state that are not live - await this.widgetManager.set_state(state); + async _loadFromNotebook(notebook: INotebookModel): Promise { + if (this.widgetManager) { + const widget_md = notebook.getMetadata + ? (notebook.getMetadata('widgets') as any) + : // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore JupyterLab 3 support + notebook.metadata.get('widgets'); + if (widget_md && widget_md[WIDGET_STATE_MIMETYPE]) { + let state = widget_md[WIDGET_STATE_MIMETYPE]; + state = this.widgetManager.filterModelState(state); + const n = Object.keys(state?.state || {}).length; + if (n) { + // Restore any widgets from saved state that are not live + await this.widgetManager.set_state(state); + } + return n; + } } + return 0; } /** @@ -712,8 +764,11 @@ export class WidgetManager extends Backbone.Model implements IDisposable { if (this.isDisposed) { return; } + // Remove the custom factory from the rendermime. TODO: de-register the rendermime factory for this object + KernelWidgetManager.configureRendermime(this.rendermime); + this._renderers.forEach((renderer) => renderer.dispose()); + this._renderers = null!; this._context = null!; - this._renderers = undefined; this._context = null!; this._rendermime = null!; this._settings = null!; @@ -727,7 +782,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { return this.context.urlResolver.getDownloadUrl(partial); } - get context(): DocumentRegistry.IContext { + get context(): DocumentRegistry.Context { return this._context; } @@ -745,19 +800,19 @@ export class WidgetManager extends Backbone.Model implements IDisposable { * TODO: perhaps should also set dirty when any model changes any data */ setDirty(): void { - if (this._settings.saveState) { - this._context!.model.dirty = true; + if (this._settings?.saveState && this._context?.model) { + this._context.model.dirty = true; } } static loggerRegistry: ILoggerRegistry | null; - protected _restored = new Signal(this); - protected _restoredStatus = false; + // protected _restored = new Signal(this); + // protected _restoredStatus = false; private _isDisposed = false; - private _context: DocumentRegistry.IContext; + private _context: DocumentRegistry.Context; private _rendermime: IRenderMimeRegistry; - private _settings: WidgetManager.Settings; + private _settings: WidgetManager.Settings | undefined; private _widgetManager: KernelWidgetManager | undefined; - private _renderers: IterableIterator | undefined; + _renderers: Set; } export namespace WidgetManager { @@ -766,54 +821,21 @@ export namespace WidgetManager { }; } -/** - * Configure a non-global rendermime. Passing the global rendermine will do - * nothing. - * - * @param rendermime - * @param manager The manager to use with WidgetRenderer. - * @param pendingManagerMessage A message that is displayed while the manager - * has not been provided. If manager is not provided here a non-empty string - * assumes the manager will be provided at some time in the future. - * - * The default will search for a manager once prior to waiting for a manager. - * @returns - */ -function configureRendermime( - rendermime?: IRenderMimeRegistry, - manager?: KernelWidgetManager, - pendingManagerMessage = '' -) { - if (!rendermime || rendermime === LabWidgetManager.globalRendermime) { - return; - } - rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); - rendermime.addFactory( - { - safe: false, - mimeTypes: [WIDGET_VIEW_MIMETYPE], - createRenderer: (options: IRenderMime.IRendererOptions) => - new WidgetRenderer(options, manager, pendingManagerMessage), - }, - -10 - ); -} - /** * Get the widgetManager that owns the model. */ export async function getWidgetManager( model_id: string -): Promise { +): Promise { for (const sleepTime of [0, 50, 1000]) { - await new Promise((r) => setTimeout(r, sleepTime)); + await new Promise((resolve) => setTimeout(resolve, sleepTime)); for (const wManager of Private.kernelWidgetManagers.values()) { if (wManager.has_model(model_id)) { return wManager; } } } - return null; + return undefined; } /** @@ -821,4 +843,11 @@ export async function getWidgetManager( */ namespace Private { export const kernelWidgetManagers = new Map(); + export const widgetManagerProperty = new AttachedProperty< + DocumentRegistry.Context, + WidgetManager | undefined + >({ + name: 'widgetManager', + create: (owner: DocumentRegistry.Context): undefined => undefined, + }); } diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index c475e07436..932d564338 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -5,18 +5,9 @@ import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { DocumentRegistry } from '@jupyterlab/docregistry'; -import { - CodeConsole, - ConsolePanel, - IConsoleTracker, -} from '@jupyterlab/console'; +import { ConsolePanel, IConsoleTracker } from '@jupyterlab/console'; -import { - INotebookModel, - INotebookTracker, - Notebook, - NotebookPanel, -} from '@jupyterlab/notebook'; +import { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook'; import { JupyterFrontEnd, @@ -29,14 +20,8 @@ import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; import { ILoggerRegistry } from '@jupyterlab/logconsole'; -import { CodeCell } from '@jupyterlab/cells'; - -import { filter } from '@lumino/algorithm'; - import { DisposableDelegate } from '@lumino/disposable'; -import { AttachedProperty } from '@lumino/properties'; - import { WidgetRenderer } from './renderer'; import { @@ -62,113 +47,19 @@ import { ITranslator, nullTranslator } from '@jupyterlab/translation'; */ const SETTINGS: WidgetManager.Settings = { saveState: false }; -/** - * Iterate through all widget renderers in a notebook. - */ -function* notebookWidgetRenderers( - nb: Notebook -): Generator { - for (const cell of nb.widgets) { - if (cell.model.type === 'code') { - for (const codecell of (cell as CodeCell).outputArea.widgets) { - // We use Array.from instead of using Lumino 2 (JLab 4) iterator - // This is to support Lumino 1 (JLab 3) as well - for (const output of Array.from(codecell.children())) { - if (output instanceof WidgetRenderer) { - yield output; - } - } - } - } - } -} - -/** - * Iterate through all widget renderers in a console. - */ -function* consoleWidgetRenderers( - console: CodeConsole -): Generator { - for (const cell of Array.from(console.cells)) { - if (cell.model.type === 'code') { - for (const codecell of (cell as unknown as CodeCell).outputArea.widgets) { - for (const output of Array.from(codecell.children())) { - if (output instanceof WidgetRenderer) { - yield output; - } - } - } - } - } -} - -/** - * Iterate through all matching linked output views - */ -function* outputViews( - app: JupyterFrontEnd, - path: string -): Generator { - const linkedViews = filter( - app.shell.widgets(), - (w) => w.id.startsWith('LinkedOutputView-') && (w as any).path === path - ); - // We use Array.from instead of using Lumino 2 (JLab 4) iterator - // This is to support Lumino 1 (JLab 3) as well - for (const view of Array.from(linkedViews)) { - for (const outputs of Array.from(view.children())) { - for (const output of Array.from(outputs.children())) { - if (output instanceof WidgetRenderer) { - yield output; - } - } - } - } -} - -function* chain( - ...args: IterableIterator[] -): Generator { - for (const it of args) { - yield* it; - } -} - export function registerWidgetManager( - context: DocumentRegistry.IContext, - rendermime: IRenderMimeRegistry, - renderers: IterableIterator + context: DocumentRegistry.Context, + rendermime: IRenderMimeRegistry ): DisposableDelegate { - let wManager = Private.widgetManagerProperty.get(context); - if (!wManager) { - wManager = new WidgetManager(context, rendermime, SETTINGS, renderers); - Private.widgetManagerProperty.set(context, wManager); - } - return new DisposableDelegate(() => { - wManager!.dispose(); - }); + const wManager = new WidgetManager(context, rendermime, SETTINGS); + return new DisposableDelegate(() => wManager!.dispose()); } -function attachWidgetManagerToPanel( - panel: NotebookPanel | ConsolePanel, - app: JupyterFrontEnd -) { +function attachWidgetManager(panel: NotebookPanel | ConsolePanel) { if (panel instanceof NotebookPanel) { - registerWidgetManager( - panel.context, - panel.content.rendermime, - chain( - notebookWidgetRenderers(panel.content), - outputViews(app, panel.context.path) - ) - ); + new WidgetManager(panel.context, panel.content.rendermime, SETTINGS); } else if (panel instanceof ConsolePanel) { - // A bit of a hack to make this a 'context' - registerWidgetManager( - panel.console as any, - panel.console.rendermime, - chain(consoleWidgetRenderers(panel.console)) - ); + new WidgetManager(panel.console as any, panel.console.rendermime); } } @@ -236,9 +127,9 @@ function activateWidgetExtension( ); for (const tracker of [widgetTracker, consoleTracker]) { if (tracker !== null) { - tracker.forEach((panel) => attachWidgetManagerToPanel(panel, app)); + tracker.forEach((panel) => attachWidgetManager(panel)); tracker.widgetAdded.connect((sender, panel) => - attachWidgetManagerToPanel(panel, app) + attachWidgetManager(panel) ); } } @@ -361,15 +252,3 @@ export default [ controlWidgetsPlugin, outputWidgetPlugin, ]; -namespace Private { - /** - * A private attached property for a widget manager. - */ - export const widgetManagerProperty = new AttachedProperty< - DocumentRegistry.Context, - WidgetManager | undefined - >({ - name: 'widgetManager', - create: (owner: DocumentRegistry.Context): undefined => undefined, - }); -} diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index 257b985522..0a2eb29f7b 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -41,9 +41,7 @@ export class WidgetRenderer super(); this.mimeType = options.mimeType; this._pendingManagerMessage = pendingManagerMessage; - if (manager) { - this.manager = manager; - } + this.manager = manager; } /** @@ -52,14 +50,14 @@ export class WidgetRenderer * Will accept the first non-null manager and ignore anything afterwards. */ - set manager(value: LabWidgetManager | null) { + set manager(value: LabWidgetManager | undefined) { if (value && !this._managerIsSet) { // Can only set the manager once this._manager.resolve(value); this._managerIsSet = true; - value.restored.connect(this._rerender, this); + value.restored.connect(this.rerender, this); this.disposed.connect(() => - value.restored.disconnect(this._rerender, this) + value.restored.disconnect(this.rerender, this) ); } } @@ -87,7 +85,7 @@ export class WidgetRenderer wModel = (await manager.get_model(source.model_id)) as DOMWidgetModel; } catch (err) { if (this._pendingManagerMessage === 'No kernel') { - this.node.textContent = 'Model not found in new kernel'; + this.node.textContent = `Model not found for this kernel: ${model.data['text/plain']}`; } else if (manager.restoredStatus) { // The manager has been restored, so this error won't be going away. this.node.textContent = 'Error displaying widget: model not found'; @@ -132,8 +130,9 @@ export class WidgetRenderer super.dispose(); } - private _rerender(): void { - if (this._rerenderMimeModel) { + rerender(): void { + // TODO: Add conditions for when re-rendering should occur. + if (this._rerenderMimeModel && !this.children.length) { // Clear the error message this.node.textContent = ''; this.removeClass('jupyter-widgets'); diff --git a/yarn.lock b/yarn.lock index 65339d2899..f3a22d3063 100644 --- a/yarn.lock +++ b/yarn.lock @@ -943,7 +943,6 @@ __metadata: "@jupyter-widgets/output": ^6.0.8 "@jupyterlab/application": ^3.0.0 || ^4.0.0 "@jupyterlab/builder": ^3.0.0 || ^4.0.0 - "@jupyterlab/cells": ^3.0.0 || ^4.0.0 "@jupyterlab/console": ^3.0.0 || ^4.0.0 "@jupyterlab/docregistry": ^3.0.0 || ^4.0.0 "@jupyterlab/logconsole": ^3.0.0 || ^4.0.0 @@ -957,7 +956,6 @@ __metadata: "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@jupyterlab/settingregistry": ^3.0.0 || ^4.0.0 "@jupyterlab/translation": ^3.0.0 || ^4.0.0 - "@lumino/algorithm": ^1.11.1 || ^2.0.0 "@lumino/coreutils": ^1.11.1 || ^2.1 "@lumino/disposable": ^1.10.1 || ^2.1 "@lumino/properties": ^2.0.1 @@ -1201,9 +1199,9 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/cells@npm:^3.0.0 || ^4.0.0, @jupyterlab/cells@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/cells@npm:4.2.5" +"@jupyterlab/cells@npm:^4.2.1": + version: 4.2.1 + resolution: "@jupyterlab/cells@npm:4.2.1" dependencies: "@codemirror/state": ^6.4.1 "@codemirror/view": ^6.26.0 @@ -2703,60 +2701,83 @@ __metadata: languageName: node linkType: hard -"@lumino/algorithm@npm:^1 || ^2, @lumino/algorithm@npm:^2.0.1, @lumino/algorithm@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/algorithm@npm:2.0.2" - checksum: 34b25684b845f1bdbf78ca45ebd99a97b67b2992440c9643aafe5fc5a99fae1ddafa9e5890b246b233dc3a12d9f66aa84afe4a2aac44cf31071348ed217740db +"@ljharb/through@npm:^2.3.13": + version: 2.3.13 + resolution: "@ljharb/through@npm:2.3.13" + dependencies: + call-bind: ^1.0.7 + checksum: 0255464a0ec7901b08cff3e99370b87e66663f46249505959c0cb4f6121095d533bbb7c7cda338063d3e134cbdd721e2705bc18eac7611b4f9ead6e7935d13ba + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^1.9.1 || ^2.1, @lumino/algorithm@npm:^1.9.2": + version: 1.9.2 + resolution: "@lumino/algorithm@npm:1.9.2" + checksum: a89e7c63504236119634858e271db1cc649684d30ced5a6ebe2788af7c0837f1e05a6fd3047d8525eb756c42ce137f76b3688f75fd3ef915b71cd4f213dfbb96 + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/algorithm@npm:2.0.1" + checksum: cbf7fcf6ee6b785ea502cdfddc53d61f9d353dcb9659343511d5cd4b4030be2ff2ca4c08daec42f84417ab0318a3d9972a17319fa5231693e109ab112dcf8000 languageName: node linkType: hard "@lumino/application@npm:^2.3.1": - version: 2.4.1 - resolution: "@lumino/application@npm:2.4.1" + version: 2.3.1 + resolution: "@lumino/application@npm:2.3.1" dependencies: - "@lumino/commands": ^2.3.1 - "@lumino/coreutils": ^2.2.0 - "@lumino/widgets": ^2.5.0 - checksum: b7166d1bf4f0e3cc945d984b4057a4cd106d38df6cb4c6f1259c75484e2b976018aca55f169fa4af7dd174ce7117be1920966bef0fb7cba756f503f0df1d211e + "@lumino/commands": ^2.3.0 + "@lumino/coreutils": ^2.1.2 + "@lumino/widgets": ^2.3.2 + checksum: c112789d99baf62e5c2cee98834bc3efb5027bbca1aac81f10ea8855c0cd2538ec0a7c56c3f5dd42dce244e6892ef5bf8ef356f97e1cd4c161b99eb2068c195c languageName: node linkType: hard -"@lumino/collections@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/collections@npm:2.0.2" +"@lumino/collections@npm:^1.9.3": + version: 1.9.3 + resolution: "@lumino/collections@npm:1.9.3" dependencies: - "@lumino/algorithm": ^2.0.2 - checksum: e8bb2068a3741940e0dd396fa729c3c9d12458b41b7c2a9d171c5c034e69fb5834116a824094a8aa4182397e13abace06025ed5032a755ea85b976eae74ee9a9 + "@lumino/algorithm": ^1.9.2 + checksum: 1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 languageName: node linkType: hard -"@lumino/commands@npm:^2.3.0, @lumino/commands@npm:^2.3.1": - version: 2.3.1 - resolution: "@lumino/commands@npm:2.3.1" +"@lumino/collections@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/collections@npm:2.0.1" dependencies: - "@lumino/algorithm": ^2.0.2 - "@lumino/coreutils": ^2.2.0 - "@lumino/disposable": ^2.1.3 - "@lumino/domutils": ^2.0.2 - "@lumino/keyboard": ^2.0.2 - "@lumino/signaling": ^2.1.3 - "@lumino/virtualdom": ^2.0.2 - checksum: 83bc6d66de37e58582b00f70ce66e797c9fcf84e36041c6881631ed0d281305e2a49927f5b2fe6c5c965733f3cd6fb4a233c7b7967fc050497024a941659bd65 + "@lumino/algorithm": ^2.0.1 + checksum: 8a29b7973a388a33c5beda0819dcd2dc2aad51a8406dcfd4581b055a9f77a39dc5800f7a8b4ae3c0bb97ae7b56a7a869e2560ffb7a920a28e93b477ba05907d6 languageName: node linkType: hard -"@lumino/coreutils@npm:^1 || ^2, @lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.2, @lumino/coreutils@npm:^2.1.2, @lumino/coreutils@npm:^2.2.0": - version: 2.2.0 - resolution: "@lumino/coreutils@npm:2.2.0" +"@lumino/commands@npm:^2.3.0": + version: 2.3.0 + resolution: "@lumino/commands@npm:2.3.0" dependencies: - "@lumino/algorithm": ^2.0.2 - checksum: 345fcd5d7493d745831dd944edfbd8eda06cc59a117e71023fc97ce53badd697be2bd51671f071f5ff0064f75f104575d9695f116a07517bafbedd38e5c7a785 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/keyboard": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + checksum: a9b83bbfcc0421ff501e818dd234c65db438a8abb450628db0dea9ee05e8077d10b2275e7e2289f6df9c20dc26d2af458b1db88ccf43ec69f185eb207dbad419 languageName: node linkType: hard -"@lumino/disposable@npm:^1 || ^2, @lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^2.1.2, @lumino/disposable@npm:^2.1.3": - version: 2.1.3 - resolution: "@lumino/disposable@npm:2.1.3" +"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.2, @lumino/coreutils@npm:^1.11.1 || ^2, @lumino/coreutils@npm:^1.11.1 || ^2.1, @lumino/coreutils@npm:^2.1.2": + version: 2.1.2 + resolution: "@lumino/coreutils@npm:2.1.2" + checksum: 7865317ac0676b448d108eb57ab5d8b2a17c101995c0f7a7106662d9fe6c859570104525f83ee3cda12ae2e326803372206d6f4c1f415a5b59e4158a7b81066f + languageName: node + linkType: hard + +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^1.10.1 || ^2.1, @lumino/disposable@npm:^2.1.2": + version: 2.1.2 + resolution: "@lumino/disposable@npm:2.1.2" dependencies: "@lumino/signaling": ^2.1.3 checksum: b9a346fa2752b3cd1b053cb637ee173501d33082a73423429070e8acc508b034ea0babdae0549b923cbdd287ee1fc7f6159f0539c9fff7574393a214eef07c57 From fdf69949df7509c0acb8780d28e31cfe09d6c5cf Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Tue, 4 Jun 2024 18:52:56 +1000 Subject: [PATCH 29/48] Change packaging workflow to jupyterlab~4.0. --- .github/workflows/packaging.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index e09f62e2aa..6d58cb021e 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -134,7 +134,7 @@ jobs: - name: Check the JupyterLab extension is installed if: matrix.dist != 'widgetsnbextension*.tar.gz' run: | - python -m pip install jupyterlab~=3.0 + python -m pip install jupyterlab~=4.0 jupyter labextension list jupyter labextension list 2>&1 | grep -ie "@jupyter-widgets/jupyterlab-manager.*enabled.*ok" - From 0b3340fe30fca41c774646cbc5a6bb36f0b43bc2 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 9 Jun 2024 14:22:13 +1000 Subject: [PATCH 30/48] WidgetManager - do nothing if rendermime is the global rendermime instead of raising an error. --- python/jupyterlab_widgets/src/manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 9bd5ed42fb..355f00ab02 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -605,7 +605,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { manager: WidgetManager ) { if (rendermime === LabWidgetManager.globalRendermime) { - throw new Error('Using global rendermime is not permitted!'); + return; } rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); rendermime.addFactory( From dded2e3ab4aaa72406e25efe5d39a518479671c0 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 9 Jun 2024 14:23:31 +1000 Subject: [PATCH 31/48] Fix not awaiting delay promise in get_model. --- packages/base-manager/src/manager-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index 7f578fd9ed..fb7fbcd303 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -217,7 +217,7 @@ export abstract class ManagerBase implements IWidgetManager { async get_model(model_id: string): Promise { let i = 0; while (!this._models[model_id] && i < this._sleepTimes.length) { - new Promise((resolve) => setTimeout(resolve, this._sleepTimes[i++])); + await new Promise((resolve) => setTimeout(resolve, this._sleepTimes[i++])); } const modelPromise = this._models[model_id]; if (modelPromise === undefined) { From 4ef40e469cb610d1a1a17dc529632433a8549481 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 31 Aug 2024 11:04:49 +1000 Subject: [PATCH 32/48] Update yarn.lock --- yarn.lock | 245 +++++++++--------------------------------------------- 1 file changed, 39 insertions(+), 206 deletions(-) diff --git a/yarn.lock b/yarn.lock index f3a22d3063..339a7d2ef4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2717,6 +2717,7 @@ __metadata: languageName: node linkType: hard +"@lumino/algorithm@npm:^2.0.1": "@lumino/algorithm@npm:^2.0.1": version: 2.0.1 resolution: "@lumino/algorithm@npm:2.0.1" @@ -3515,7 +3516,7 @@ __metadata: languageName: node linkType: hard -"@types/backbone@npm:1.4.14": +"@types/backbone@npm:1.4.14, @types/backbone@npm:^1.4.1": version: 1.4.14 resolution: "@types/backbone@npm:1.4.14" dependencies: @@ -3525,16 +3526,6 @@ __metadata: languageName: node linkType: hard -"@types/backbone@npm:^1.4.1": - version: 1.4.22 - resolution: "@types/backbone@npm:1.4.22" - dependencies: - "@types/jquery": "*" - "@types/underscore": "*" - checksum: 095959d89abfdbf01071c8389f8638cf941e235c7ba7b03d2500cea34c8c313830605c3c87b2bb8630760bb9ed8ca54114344c1721947ce6992016482b295c6c - languageName: node - linkType: hard - "@types/base64-js@npm:^1.2.5": version: 1.3.2 resolution: "@types/base64-js@npm:1.3.2" @@ -3693,14 +3684,7 @@ __metadata: languageName: node linkType: hard -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - -"@types/minimatch@npm:^3.0.3": +"@types/minimatch@npm:*, @types/minimatch@npm:^3.0.3": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 @@ -3721,16 +3705,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 22.7.8 - resolution: "@types/node@npm:22.7.8" - dependencies: - undici-types: ~6.19.2 - checksum: c1dd36bd0bf82588e61f82edb29a792f21ce902f90cc5485591f9fd60cec3ea9172e044bf7b1c0849e7cf3a5a01da39516db260cb65cb0b94904010e00634a1c - languageName: node - linkType: hard - -"@types/node@npm:^17.0.2": +"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:^17.0.2": version: 17.0.45 resolution: "@types/node@npm:17.0.45" checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 @@ -3803,16 +3778,7 @@ __metadata: languageName: node linkType: hard -"@types/sinon@npm:*": - version: 17.0.3 - resolution: "@types/sinon@npm:17.0.3" - dependencies: - "@types/sinonjs__fake-timers": "*" - checksum: c8e9956d9c90fe1ec1cc43085ae48897f93f9ea86e909ab47f255ea71f5229651faa070393950fb6923aef426c84e92b375503f9f8886ef44668b82a8ee49e9a - languageName: node - linkType: hard - -"@types/sinon@npm:^10.0.2": +"@types/sinon@npm:*, @types/sinon@npm:^10.0.2": version: 10.0.20 resolution: "@types/sinon@npm:10.0.20" dependencies: @@ -4744,9 +4710,9 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.17.1, ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" +"ajv@npm:8.12.0, ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" dependencies: fast-deep-equal: ^3.1.3 fast-uri: ^3.0.1 @@ -4780,20 +4746,13 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:4.1.1": +"ansi-colors@npm:4.1.1, ansi-colors@npm:^4.1.1": version: 4.1.1 resolution: "ansi-colors@npm:4.1.1" checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 languageName: node linkType: hard -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e - languageName: node - linkType: hard - "ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -5754,7 +5713,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3": +"chokidar@npm:3.5.3, chokidar@npm:^3.3.0, chokidar@npm:^3.5.1": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -5773,25 +5732,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.3.0, chokidar@npm:^3.5.1": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -5836,20 +5776,13 @@ __metadata: languageName: node linkType: hard -"cli-spinners@npm:2.6.1": +"cli-spinners@npm:2.6.1, cli-spinners@npm:^2.5.0": version: 2.6.1 resolution: "cli-spinners@npm:2.6.1" checksum: 423409baaa7a58e5104b46ca1745fbfc5888bbd0b0c5a626e052ae1387060839c8efd512fb127e25769b3dc9562db1dc1b5add6e0b93b7ef64f477feb6416a45 languageName: node linkType: hard -"cli-spinners@npm:^2.5.0": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c - languageName: node - linkType: hard - "cli-truncate@npm:^2.1.0": version: 2.1.0 resolution: "cli-truncate@npm:2.1.0" @@ -6411,20 +6344,13 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:1.0.2": +"core-util-is@npm:1.0.2, core-util-is@npm:~1.0.0": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab languageName: node linkType: hard -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - "cors@npm:2.8.5, cors@npm:~2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" @@ -6545,20 +6471,13 @@ __metadata: languageName: node linkType: hard -"csstype@npm:3.0.10": +"csstype@npm:3.0.10, csstype@npm:^3.0.2": version: 3.0.10 resolution: "csstype@npm:3.0.10" checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 - languageName: node - linkType: hard - "custom-event@npm:~1.0.0": version: 1.0.1 resolution: "custom-event@npm:1.0.1" @@ -7747,20 +7666,13 @@ __metadata: languageName: node linkType: hard -"extsprintf@npm:1.3.0": +"extsprintf@npm:1.3.0, extsprintf@npm:^1.2.0": version: 1.3.0 resolution: "extsprintf@npm:1.3.0" checksum: cee7a4a1e34cffeeec18559109de92c27517e5641991ec6bab849aa64e3081022903dd53084f2080d0d2530803aa5ee84f1e9de642c365452f9e67be8f958ce2 languageName: node linkType: hard -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: a2f29b241914a8d2bad64363de684821b6b1609d06ae68d5b539e4de6b28659715b5bea94a7265201603713b7027d35399d10b0548f09071c5513e65e8323d33 - languageName: node - linkType: hard - "fast-deep-equal@npm:^1.0.0": version: 1.1.0 resolution: "fast-deep-equal@npm:1.1.0" @@ -8442,7 +8354,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.2.0": +"glob@npm:7.2.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.7": version: 7.2.0 resolution: "glob@npm:7.2.0" dependencies: @@ -8485,20 +8397,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.7": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - "glob@npm:^8.0.1": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -10005,20 +9903,13 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:3.2.0": +"jsonc-parser@npm:3.2.0, jsonc-parser@npm:^3.2.0": version: 3.2.0 resolution: "jsonc-parser@npm:3.2.0" checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.3.1 - resolution: "jsonc-parser@npm:3.3.1" - checksum: 81ef19d98d9c6bd6e4a37a95e2753c51c21705cbeffd895e177f4b542cca9cda5fda12fb942a71a2e824a9132cf119dc2e642e9286386055e1365b5478f49a47 - languageName: node - linkType: hard - "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -10412,20 +10303,13 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.0.5": +"lilconfig@npm:2.0.5, lilconfig@npm:^2.0.5": version: 2.0.5 resolution: "lilconfig@npm:2.0.5" checksum: f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1 languageName: node linkType: hard -"lilconfig@npm:^2.0.5": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -11117,7 +11001,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -11126,7 +11010,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.0.5": +"minimatch@npm:3.0.5, minimatch@npm:~3.0.4": version: 3.0.5 resolution: "minimatch@npm:3.0.5" dependencies: @@ -11171,15 +11055,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:~3.0.4": - version: 3.0.8 - resolution: "minimatch@npm:3.0.8" - dependencies: - brace-expansion: ^1.1.7 - checksum: 850cca179cad715133132693e6963b0db64ab0988c4d211415b087fc23a3e46321e2c5376a01bf5623d8782aba8bdf43c571e2e902e51fdce7175c7215c29f8b - languageName: node - linkType: hard - "minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -13482,12 +13357,12 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.13.0, qs@npm:^6.4.0": - version: 6.13.0 - resolution: "qs@npm:6.13.0" +"qs@npm:6.11.0, qs@npm:^6.4.0": + version: 6.11.0 + resolution: "qs@npm:6.11.0" dependencies: - side-channel: ^1.0.6 - checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 + side-channel: ^1.0.4 + checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 languageName: node linkType: hard @@ -14160,21 +14035,7 @@ __metadata: languageName: node linkType: hard -"sanitize-html@npm:^2.3": - version: 2.13.1 - resolution: "sanitize-html@npm:2.13.1" - dependencies: - deepmerge: ^4.2.2 - escape-string-regexp: ^4.0.0 - htmlparser2: ^8.0.0 - is-plain-object: ^5.0.0 - parse-srcset: ^1.0.2 - postcss: ^8.3.11 - checksum: 645381375fcb9c70070644b02538f1d43d35db6c9761eba32ec5f0ea919fdc70aa19e186ae949e6e21de767cbf11ced3e6a31b322a6c705593dc9a902a257d7a - languageName: node - linkType: hard - -"sanitize-html@npm:~2.12.1": +"sanitize-html@npm:^2.3, sanitize-html@npm:~2.12.1": version: 2.12.1 resolution: "sanitize-html@npm:2.12.1" dependencies: @@ -14443,7 +14304,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": +"side-channel@npm:^1.0.4": version: 1.0.6 resolution: "side-channel@npm:1.0.6" dependencies: @@ -14622,7 +14483,7 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:3.8.0": +"sonic-boom@npm:3.8.0, sonic-boom@npm:^3.7.0": version: 3.8.0 resolution: "sonic-boom@npm:3.8.0" dependencies: @@ -14640,15 +14501,6 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:^3.7.0": - version: 3.8.1 - resolution: "sonic-boom@npm:3.8.1" - dependencies: - atomic-sleep: ^1.0.0 - checksum: 79c90d7a2f928489fd3d4b68d8f8d747a426ca6ccf83c3b102b36f899d4524463dd310982ab7ab6d6bcfd34b7c7c281ad25e495ad71fbff8fd6fa86d6273fc6b - languageName: node - linkType: hard - "sort-keys@npm:^2.0.0": version: 2.0.0 resolution: "sort-keys@npm:2.0.0" @@ -15752,6 +15604,7 @@ __metadata: languageName: node linkType: hard +"underscore@npm:>=1.7.0, underscore@npm:>=1.8.3, underscore@npm:^1.8.3": "underscore@npm:>=1.7.0, underscore@npm:>=1.8.3, underscore@npm:^1.8.3": version: 1.13.7 resolution: "underscore@npm:1.13.7" @@ -15759,13 +15612,6 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 - languageName: node - linkType: hard - "union@npm:~0.5.0": version: 0.5.0 resolution: "union@npm:0.5.0" @@ -15891,6 +15737,7 @@ __metadata: languageName: node linkType: hard +"uri-js@npm:^4.2.2": "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -16131,7 +15978,7 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:8.2.0": +"vscode-jsonrpc@npm:8.2.0, vscode-jsonrpc@npm:^8.0.2": version: 8.2.0 resolution: "vscode-jsonrpc@npm:8.2.0" checksum: f302a01e59272adc1ae6494581fa31c15499f9278df76366e3b97b2236c7c53ebfc71efbace9041cfd2caa7f91675b9e56f2407871a1b3c7f760a2e2ee61484a @@ -16145,13 +15992,6 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:^8.0.2": - version: 8.2.1 - resolution: "vscode-jsonrpc@npm:8.2.1" - checksum: 2af2c333d73f6587896a7077978b8d4b430e55c674d5dbb90597a84a6647057c1655a3bff398a9b08f1f8ba57dbd2deabf05164315829c297b0debba3b8bc19e - languageName: node - linkType: hard - "vscode-languageserver-protocol@npm:^3.17.0": version: 3.17.5 resolution: "vscode-languageserver-protocol@npm:3.17.5" @@ -16645,24 +16485,24 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.11.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" +"ws@npm:^7.4.6": + version: 7.5.10 + resolution: "ws@npm:7.5.10" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb languageName: node linkType: hard -"ws@npm:~8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" +"ws@npm:^8.11.0, ws@npm:~8.11.0": + version: 8.11.0 + resolution: "ws@npm:8.11.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -16721,7 +16561,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:20.2.4": +"yargs-parser@npm:20.2.4, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.4 resolution: "yargs-parser@npm:20.2.4" checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 @@ -16735,13 +16575,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - "yargs-unparser@npm:2.0.0": version: 2.0.0 resolution: "yargs-unparser@npm:2.0.0" From 0b1a7f1843e036943235d28143f77165f306335d Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 8 Sep 2024 10:39:36 +1000 Subject: [PATCH 33/48] Add kernel monitoring. --- python/jupyterlab_widgets/src/manager.ts | 8 ++++++++ python/jupyterlab_widgets/src/plugin.ts | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 355f00ab02..8c5fc9840f 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -112,6 +112,9 @@ export abstract class LabWidgetManager super.disconnect(); this._restoredStatus = false; } + get disconnected() { + return !this._restoredStatus; + } protected async _loadFromKernel(): Promise { if (!this.kernel) { @@ -471,6 +474,11 @@ export class KernelWidgetManager extends LabWidgetManager { } } + static existsWithActiveKenel(id: string) { + const widgetManager = Private.kernelWidgetManagers.get(id); + return !widgetManager?.disconnected; + } + _handleKernelStatusChange( sender: Kernel.IKernelConnection, status: Kernel.Status diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index 932d564338..e816c6f38b 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -25,6 +25,7 @@ import { DisposableDelegate } from '@lumino/disposable'; import { WidgetRenderer } from './renderer'; import { + KernelWidgetManager, LabWidgetManager, WIDGET_VIEW_MIMETYPE, WidgetManager, @@ -103,6 +104,22 @@ function activateWidgetExtension( const { commands } = app; const trans = (translator ?? nullTranslator).load('jupyterlab_widgets'); + app.serviceManager.kernels.runningChanged.connect((models) => { + for (const model of models.running()) { + if ( + model && + model.name === 'python3' && + model.execution_state !== 'starting' && + !KernelWidgetManager.existsWithActiveKenel(model.id) + ) { + const kernel = app.serviceManager.kernels.connectTo({ model: model }); + if (kernel.handleComms) { + new KernelWidgetManager(kernel); + } + } + } + }); + if (settingRegistry !== null) { settingRegistry .load(managerPlugin.id) From 70c31250894353b72f9e7af4cc4df8aef0785b03 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Wed, 25 Sep 2024 13:02:41 +1000 Subject: [PATCH 34/48] Changed getWidgetManager to be a static method of KernelWidgetManager and renamed to getManager. --- packages/base-manager/src/manager-base.ts | 7 ++-- python/jupyterlab_widgets/src/index.ts | 6 +-- python/jupyterlab_widgets/src/manager.ts | 48 ++++++++++++----------- python/jupyterlab_widgets/src/renderer.ts | 23 ++++++----- 4 files changed, 44 insertions(+), 40 deletions(-) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index fb7fbcd303..dce7998123 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -214,10 +214,10 @@ export abstract class ManagerBase implements IWidgetManager { * * If you would like to synchronously test if a model exists, use .has_model(). */ - async get_model(model_id: string): Promise { + async get_model(model_id: string, delays = [500]): Promise { let i = 0; - while (!this._models[model_id] && i < this._sleepTimes.length) { - await new Promise((resolve) => setTimeout(resolve, this._sleepTimes[i++])); + while (!this._models[model_id] && i < delays.length) { + await new Promise((resolve) => setTimeout(resolve, delays[i++])); } const modelPromise = this._models[model_id]; if (modelPromise === undefined) { @@ -878,7 +878,6 @@ export abstract class ManagerBase implements IWidgetManager { /** * Dictionary of model ids and model instance promises */ - private _sleepTimes = [2, 50, 200, 800]; private _models: { [key: string]: Promise } = Object.create(null); } diff --git a/python/jupyterlab_widgets/src/index.ts b/python/jupyterlab_widgets/src/index.ts index eb40b5522f..e8e25c3af0 100644 --- a/python/jupyterlab_widgets/src/index.ts +++ b/python/jupyterlab_widgets/src/index.ts @@ -8,11 +8,7 @@ export default WidgetManagerProvider; export { registerWidgetManager } from './plugin'; -export { - KernelWidgetManager, - LabWidgetManager, - WidgetManager, -} from './manager'; +export { KernelWidgetManager, WidgetManager } from './manager'; export { WidgetRenderer } from './renderer'; diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 8c5fc9840f..8b591a0ba1 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -367,7 +367,7 @@ export class KernelWidgetManager extends LabWidgetManager { rendermime?: IRenderMimeRegistry, pendingManagerMessage = 'Loading widget ...' ) { - const instance = Private.kernelWidgetManagers.get(kernel.id); + const instance = Private.managers.get(kernel.id); if (instance) { instance._useKernel(kernel); KernelWidgetManager.configureRendermime( @@ -381,7 +381,7 @@ export class KernelWidgetManager extends LabWidgetManager { throw new Error('Kernel does not have handleComms enabled'); } super(LabWidgetManager.globalRendermime); - Private.kernelWidgetManagers.set(kernel.id, this); + Private.managers.set(kernel.id, this); this.loadCustomWidgetDefinitions(); LabWidgetManager.WIDGET_REGISTRY.changed.connect(() => this.loadCustomWidgetDefinitions() @@ -475,10 +475,30 @@ export class KernelWidgetManager extends LabWidgetManager { } static existsWithActiveKenel(id: string) { - const widgetManager = Private.kernelWidgetManagers.get(id); + const widgetManager = Private.managers.get(id); return !widgetManager?.disconnected; } + /** + * Get the KernelWidgetManager that owns the model. + */ + static async getManager( + model_id: string, + delays = [100, 1000] + ): Promise { + for (const sleepTime of delays) { + for (const wManager of Private.managers.values()) { + if (wManager.has_model(model_id)) { + return wManager; + } + } + await new Promise((resolve) => setTimeout(resolve, sleepTime)); + } + throw new Error( + `Failed to locate the KernelWidgetManager for model_id='${model_id}'` + ); + } + _handleKernelStatusChange( sender: Kernel.IKernelConnection, status: Kernel.Status @@ -516,7 +536,7 @@ export class KernelWidgetManager extends LabWidgetManager { } super.dispose(); KernelWidgetManager.configureRendermime(this.rendermime); - Private.kernelWidgetManagers.delete(this.kernel.id); + Private.managers.delete(this.kernel.id); this._handleKernelChanged({ name: 'kernel', oldValue: this._kernel, @@ -829,28 +849,12 @@ export namespace WidgetManager { }; } -/** - * Get the widgetManager that owns the model. - */ -export async function getWidgetManager( - model_id: string -): Promise { - for (const sleepTime of [0, 50, 1000]) { - await new Promise((resolve) => setTimeout(resolve, sleepTime)); - for (const wManager of Private.kernelWidgetManagers.values()) { - if (wManager.has_model(model_id)) { - return wManager; - } - } - } - return undefined; -} - /** * A namespace for private data */ namespace Private { - export const kernelWidgetManagers = new Map(); + export const managers = new Map(); + export const widgetManagerProperty = new AttachedProperty< DocumentRegistry.Context, WidgetManager | undefined diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index 0a2eb29f7b..b510ae9346 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -11,7 +11,7 @@ import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; import { DOMWidgetModel } from '@jupyter-widgets/base'; -import { LabWidgetManager, getWidgetManager } from './manager'; +import { KernelWidgetManager } from './manager'; /** * A renderer for widgets. @@ -35,7 +35,7 @@ export class WidgetRenderer { constructor( options: IRenderMime.IRendererOptions, - manager?: LabWidgetManager, + manager?: KernelWidgetManager, pendingManagerMessage = '' ) { super(); @@ -50,7 +50,7 @@ export class WidgetRenderer * Will accept the first non-null manager and ignore anything afterwards. */ - set manager(value: LabWidgetManager | undefined) { + set manager(value: KernelWidgetManager | undefined) { if (value && !this._managerIsSet) { // Can only set the manager once this._manager.resolve(value); @@ -68,15 +68,20 @@ export class WidgetRenderer // If there is no model id, the view was removed, so hide the node. if (source.model_id === '') { this.hide(); - return Promise.resolve(); + return; } if (!this._pendingManagerMessage && !this._managerIsSet) { - this.manager = await getWidgetManager(source.model_id); + try { + this.manager = await KernelWidgetManager.getManager(source.model_id); + } catch { + this.node.textContent = `KernelWidgetManager not found for model: ${model.data['text/plain']}`; + return; + } } this.node.textContent = `${ this._pendingManagerMessage || model.data['text/plain'] }`; - const manager: LabWidgetManager = await this._manager.promise; + const manager = await this._manager.promise; this._rerenderMimeModel = model; let wModel: DOMWidgetModel; @@ -85,7 +90,7 @@ export class WidgetRenderer wModel = (await manager.get_model(source.model_id)) as DOMWidgetModel; } catch (err) { if (this._pendingManagerMessage === 'No kernel') { - this.node.textContent = `Model not found for this kernel: ${model.data['text/plain']}`; + this.node.textContent = `Model not found: ${model.data['text/plain']}`; } else if (manager.restoredStatus) { // The manager has been restored, so this error won't be going away. this.node.textContent = 'Error displaying widget: model not found'; @@ -93,7 +98,7 @@ export class WidgetRenderer console.error(err); } // Store the model for a possible rerender - return Promise.resolve(); + return; } let widget: LuminoWidget; try { @@ -146,7 +151,7 @@ export class WidgetRenderer * The mimetype being rendered. */ readonly mimeType: string; - private _manager = new PromiseDelegate(); + private _manager = new PromiseDelegate(); private _managerIsSet = false; private _pendingManagerMessage: string; private _rerenderMimeModel: IRenderMime.IMimeModel | null = null; From 1040d278b3499006e56737f58ce57211ff4d1df9 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 2 Nov 2024 17:35:31 +1100 Subject: [PATCH 35/48] Tweak restoration --- python/jupyterlab_widgets/src/manager.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 8b591a0ba1..4919a447d1 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -112,9 +112,6 @@ export abstract class LabWidgetManager super.disconnect(); this._restoredStatus = false; } - get disconnected() { - return !this._restoredStatus; - } protected async _loadFromKernel(): Promise { if (!this.kernel) { @@ -419,9 +416,7 @@ export class KernelWidgetManager extends LabWidgetManager { this._handleKernelConnectionStatusChange, this ); - this._restoredStatus = false; - this._kernelRestoreInProgress = true; - this.clear_state().then(() => this.restoreWidgets()); + this.restoreWidgets(); } /** @@ -476,7 +471,7 @@ export class KernelWidgetManager extends LabWidgetManager { static existsWithActiveKenel(id: string) { const widgetManager = Private.managers.get(id); - return !widgetManager?.disconnected; + return widgetManager?._restoredStatus; } /** @@ -515,7 +510,10 @@ export class KernelWidgetManager extends LabWidgetManager { * Restore widgets from kernel. */ async restoreWidgets(): Promise { + this._restoredStatus = false; + this._kernelRestoreInProgress = true; try { + await this.clear_state(); await this._loadFromKernel(); } catch (err) { // Do nothing From 1e8256a6cee4c6f0afcd141a0ce5e3932aa2b502 Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sun, 3 Nov 2024 20:33:28 +1100 Subject: [PATCH 36/48] Improved KernelWidgetManager creation and kernel restoration. --- python/jupyterlab_widgets/src/manager.ts | 137 +++++++++++----------- python/jupyterlab_widgets/src/output.ts | 6 +- python/jupyterlab_widgets/src/plugin.ts | 23 +--- python/jupyterlab_widgets/src/renderer.ts | 2 +- 4 files changed, 72 insertions(+), 96 deletions(-) diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 4919a447d1..8708430f9b 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -66,15 +66,7 @@ export const WIDGET_STATE_MIMETYPE = /** * A widget manager that returns Lumino widgets. */ -export abstract class LabWidgetManager - extends ManagerBase - implements IDisposable -{ - constructor(rendermime: IRenderMimeRegistry) { - super(); - this._rendermime = rendermime; - } - +abstract class LabWidgetManager extends ManagerBase implements IDisposable { /** * Default callback handler to emit unhandled kernel messages. */ @@ -181,7 +173,6 @@ export abstract class LabWidgetManager return; } this._isDisposed = true; - this._rendermime = null!; if (this._commRegistration) { this._commRegistration.dispose(); @@ -245,10 +236,6 @@ export abstract class LabWidgetManager abstract get kernel(): Kernel.IKernelConnection | null; - get rendermime(): IRenderMimeRegistry { - return this._rendermime; - } - /** * A signal emitted when state is restored to the widget manager. * @@ -298,6 +285,7 @@ export abstract class LabWidgetManager * @return Promise that resolves when the widget state is cleared. */ async clear_state(): Promise { + this._restoredStatus = false; await super.clear_state(); this._modelsSync = new Map(); } @@ -331,15 +319,13 @@ export abstract class LabWidgetManager await this.handle_comm_open(oldComm, msg); }; - static globalRendermime: IRenderMimeRegistry; + static rendermime: IRenderMimeRegistry; protected _restored = new Signal(this); protected _restoredStatus = false; - protected _kernelRestoreInProgress = false; private _isDisposed = false; private _registry: SemVerCache = new SemVerCache(); - private _rendermime: IRenderMimeRegistry; private _commRegistration: IDisposable; @@ -352,46 +338,31 @@ export abstract class LabWidgetManager } /** - * A singleton widget manager per kernel for the lifecycle of the kernel. - * The factory of the rendermime will be updated to use the widgetManager - * directly if it isn't the globalRendermime. - * - * Note: The rendermime of the instance is always the global rendermime. + * KernelWidgetManager is singleton widget manager per kernel.id. + * This class should not be created directly or subclassed, instead use + * the class method `KernelWidgetManager.getManager(kernel)`. */ export class KernelWidgetManager extends LabWidgetManager { - constructor( - kernel: Kernel.IKernelConnection, - rendermime?: IRenderMimeRegistry, - pendingManagerMessage = 'Loading widget ...' - ) { - const instance = Private.managers.get(kernel.id); - if (instance) { - instance._useKernel(kernel); - KernelWidgetManager.configureRendermime( - rendermime, - instance, - pendingManagerMessage - ); - return instance; + constructor(kernel: Kernel.IKernelConnection) { + if (Private.managers.has(kernel.id)) { + throw new Error('A manager already exists!'); } if (!kernel.handleComms) { throw new Error('Kernel does not have handleComms enabled'); } - super(LabWidgetManager.globalRendermime); + super(); Private.managers.set(kernel.id, this); this.loadCustomWidgetDefinitions(); LabWidgetManager.WIDGET_REGISTRY.changed.connect(() => this.loadCustomWidgetDefinitions() ); - this._useKernel(kernel); - KernelWidgetManager.configureRendermime( - rendermime, - this, - pendingManagerMessage - ); + this._updateKernel(kernel); } - _useKernel(this: KernelWidgetManager, kernel: Kernel.IKernelConnection) { + private _updateKernel( + this: KernelWidgetManager, + kernel: Kernel.IKernelConnection + ) { if (!kernel.handleComms || this._kernel === kernel) { return; } @@ -409,13 +380,15 @@ export class KernelWidgetManager extends LabWidgetManager { this._handleKernelConnectionStatusChange, this ); + this._kernel.disposed.disconnect(this._onKernelDisposed, this); } this._kernel = kernel; - this._kernel.statusChanged.connect(this._handleKernelStatusChange, this); - this._kernel.connectionStatusChanged.connect( + kernel.statusChanged.connect(this._handleKernelStatusChange, this); + kernel.connectionStatusChanged.connect( this._handleKernelConnectionStatusChange, this ); + kernel.disposed.connect(this._onKernelDisposed, this); this.restoreWidgets(); } @@ -437,7 +410,7 @@ export class KernelWidgetManager extends LabWidgetManager { manager?: KernelWidgetManager, pendingManagerMessage = '' ) { - if (!rendermime || rendermime === LabWidgetManager.globalRendermime) { + if (!rendermime || rendermime === LabWidgetManager.rendermime) { return; } rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); @@ -457,11 +430,7 @@ export class KernelWidgetManager extends LabWidgetManager { ): void { switch (status) { case 'connected': - // Only restore if we aren't currently trying to restore from the kernel - // (for example, in our initial restore from the constructor). - if (!this._kernelRestoreInProgress) { - this.restoreWidgets(); - } + this.restoreWidgets(); break; case 'disconnected': this.disconnect(); @@ -469,15 +438,10 @@ export class KernelWidgetManager extends LabWidgetManager { } } - static existsWithActiveKenel(id: string) { - const widgetManager = Private.managers.get(id); - return widgetManager?._restoredStatus; - } - /** - * Get the KernelWidgetManager that owns the model. + * Find the KernelWidgetManager that owns the model. */ - static async getManager( + static async findManager( model_id: string, delays = [100, 1000] ): Promise { @@ -494,6 +458,28 @@ export class KernelWidgetManager extends LabWidgetManager { ); } + /** + * The correct way to get a KernelWidgetManager + * @param kernel IKernelConnection + * @returns + */ + static async getManager( + kernel: Kernel.IKernelConnection + ): Promise { + let manager = Private.managers.get(kernel.id); + if (!manager) { + manager = new KernelWidgetManager(kernel); + } + if (kernel.handleComms) { + manager._updateKernel(kernel); + if (!manager.restoredStatus) { + const restored = manager.restored; + await new Promise((resolve) => restored.connect(resolve)); + } + } + return manager; + } + _handleKernelStatusChange( sender: Kernel.IKernelConnection, status: Kernel.Status @@ -506,23 +492,36 @@ export class KernelWidgetManager extends LabWidgetManager { } } + async _onKernelDisposed() { + const model = await KernelWidgetManager.kernels.findById(this.kernel?.id); + if (model) { + const kernel = KernelWidgetManager.kernels.connectTo({ model }); + this._updateKernel(kernel); + } + } + /** * Restore widgets from kernel. */ async restoreWidgets(): Promise { + if (this._kernelRestoreInProgress) { + return; + } this._restoredStatus = false; this._kernelRestoreInProgress = true; try { await this.clear_state(); await this._loadFromKernel(); - } catch (err) { - // Do nothing + } catch { + /* empty */ + } finally { + this._restoredStatus = true; + this._kernelRestoreInProgress = false; + this.triggerRestored(); } - this.triggerRestored(); } triggerRestored() { - this._restoredStatus = true; this._restored.emit(); } /** @@ -533,7 +532,6 @@ export class KernelWidgetManager extends LabWidgetManager { return; } super.dispose(); - KernelWidgetManager.configureRendermime(this.rendermime); Private.managers.delete(this.kernel.id); this._handleKernelChanged({ name: 'kernel', @@ -557,9 +555,9 @@ export class KernelWidgetManager extends LabWidgetManager { filterModelState(serialized_state: any): any { return this.filterExistingModelState(serialized_state); } - + static kernels: Kernel.IManager; private _kernel: Kernel.IKernelConnection; - protected _kernelRestoreInProgress = false; + private _kernelRestoreInProgress = false; } /** @@ -630,7 +628,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { rendermime: IRenderMimeRegistry, manager: WidgetManager ) { - if (rendermime === LabWidgetManager.globalRendermime) { + if (rendermime === LabWidgetManager.rendermime) { return; } rendermime.removeMimeType(WIDGET_VIEW_MIMETYPE); @@ -648,7 +646,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable { let wManager: KernelWidgetManager | undefined; await this.context.sessionContext.ready; if (this.kernel) { - wManager = new KernelWidgetManager(this.kernel); + wManager = await KernelWidgetManager.getManager(this.kernel); } if (wManager === this._widgetManager) { return; @@ -796,7 +794,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable { this._renderers = null!; this._context = null!; this._context = null!; - this._rendermime = null!; this._settings = null!; } @@ -831,8 +828,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable { } } static loggerRegistry: ILoggerRegistry | null; - // protected _restored = new Signal(this); - // protected _restoredStatus = false; private _isDisposed = false; private _context: DocumentRegistry.Context; private _rendermime: IRenderMimeRegistry; diff --git a/python/jupyterlab_widgets/src/output.ts b/python/jupyterlab_widgets/src/output.ts index ee559437da..a71032defe 100644 --- a/python/jupyterlab_widgets/src/output.ts +++ b/python/jupyterlab_widgets/src/output.ts @@ -9,7 +9,7 @@ import { Panel } from '@lumino/widgets'; import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; -import { LabWidgetManager } from './manager'; +import { KernelWidgetManager } from './manager'; import { OutputAreaModel, OutputArea } from '@jupyterlab/outputarea'; @@ -44,7 +44,7 @@ export class OutputModel extends outputBase.OutputModel { * Reset the message id. */ reset_msg_id(): void { - const kernel = this.widget_manager.kernel; + const kernel = (this.widget_manager as KernelWidgetManager).kernel; const msgId = this.get('msg_id'); const oldMsgId = this.previous('msg_id'); @@ -98,8 +98,6 @@ export class OutputModel extends outputBase.OutputModel { } } - widget_manager: LabWidgetManager; - private _msgHook: (msg: KernelMessage.IIOPubMessage) => boolean; private _outputs: OutputAreaModel; static rendermime: IRenderMimeRegistry; diff --git a/python/jupyterlab_widgets/src/plugin.ts b/python/jupyterlab_widgets/src/plugin.ts index e816c6f38b..f0805871fc 100644 --- a/python/jupyterlab_widgets/src/plugin.ts +++ b/python/jupyterlab_widgets/src/plugin.ts @@ -26,7 +26,6 @@ import { WidgetRenderer } from './renderer'; import { KernelWidgetManager, - LabWidgetManager, WIDGET_VIEW_MIMETYPE, WidgetManager, } from './manager'; @@ -103,23 +102,7 @@ function activateWidgetExtension( ): base.IJupyterWidgetRegistry { const { commands } = app; const trans = (translator ?? nullTranslator).load('jupyterlab_widgets'); - - app.serviceManager.kernels.runningChanged.connect((models) => { - for (const model of models.running()) { - if ( - model && - model.name === 'python3' && - model.execution_state !== 'starting' && - !KernelWidgetManager.existsWithActiveKenel(model.id) - ) { - const kernel = app.serviceManager.kernels.connectTo({ model: model }); - if (kernel.handleComms) { - new KernelWidgetManager(kernel); - } - } - } - }); - + KernelWidgetManager.kernels = app.serviceManager.kernels; if (settingRegistry !== null) { settingRegistry .load(managerPlugin.id) @@ -132,7 +115,7 @@ function activateWidgetExtension( }); } WidgetManager.loggerRegistry = loggerRegistry; - LabWidgetManager.globalRendermime = rendermime; + KernelWidgetManager.rendermime = rendermime; // Add a default widget renderer. rendermime.addFactory( { @@ -175,7 +158,7 @@ function activateWidgetExtension( return { registerWidget(data: base.IWidgetRegistryData): void { - LabWidgetManager.WIDGET_REGISTRY.push(data); + KernelWidgetManager.WIDGET_REGISTRY.push(data); }, }; } diff --git a/python/jupyterlab_widgets/src/renderer.ts b/python/jupyterlab_widgets/src/renderer.ts index b510ae9346..258b11b5ea 100644 --- a/python/jupyterlab_widgets/src/renderer.ts +++ b/python/jupyterlab_widgets/src/renderer.ts @@ -72,7 +72,7 @@ export class WidgetRenderer } if (!this._pendingManagerMessage && !this._managerIsSet) { try { - this.manager = await KernelWidgetManager.getManager(source.model_id); + this.manager = await KernelWidgetManager.findManager(source.model_id); } catch { this.node.textContent = `KernelWidgetManager not found for model: ${model.data['text/plain']}`; return; From af38ecaab9520267f43222d66b3cd0d3e456b4fe Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Sat, 9 Nov 2024 09:43:01 +1100 Subject: [PATCH 37/48] Create new comm for existing models when restoring from kernel. --- packages/base-manager/src/manager-base.ts | 7 ++- packages/base/src/errorwidget.ts | 4 +- packages/base/src/widget.ts | 56 ++++++++++------------- packages/base/test/src/widget_test.ts | 14 +++--- python/jupyterlab_widgets/src/manager.ts | 4 +- 5 files changed, 42 insertions(+), 43 deletions(-) diff --git a/packages/base-manager/src/manager-base.ts b/packages/base-manager/src/manager-base.ts index dce7998123..c9b9a41d16 100644 --- a/packages/base-manager/src/manager-base.ts +++ b/packages/base-manager/src/manager-base.ts @@ -504,6 +504,9 @@ export abstract class ManagerBase implements IWidgetManager { model.constructor as typeof WidgetModel )._deserialize_state(state.state, this); model!.set_state(deserializedState); + if (!model.comm_live) { + model.comm = await this._create_comm('jupyter.widget', widget_id); + } } } catch (error) { // Failed to create a widget model, we continue creating other models so that @@ -755,12 +758,12 @@ export abstract class ManagerBase implements IWidgetManager { /** * Disconnect the widget manager from the kernel, setting each model's comm - * as dead. + * as undefined. */ disconnect(): void { Object.keys(this._models).forEach((i) => { this._models[i].then((model) => { - model.comm_live = false; + model.comm = undefined; }); }); } diff --git a/packages/base/src/errorwidget.ts b/packages/base/src/errorwidget.ts index 1e6a837c93..818466acdf 100644 --- a/packages/base/src/errorwidget.ts +++ b/packages/base/src/errorwidget.ts @@ -24,7 +24,9 @@ export function createErrorWidgetModel( error: error, }; super(attributes, options); - this.comm_live = true; + } + get comm_live(): boolean { + return true; } } return ErrorWidget; diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index 9a660bb25b..55a6f31ab5 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -160,7 +160,7 @@ export class WidgetModel extends Backbone.Model { // Attributes should be initialized here, since user initialization may depend on it this.widget_manager = options.widget_manager; this.model_id = options.model_id; - const comm = options.comm; + this.comm = options.comm; this.views = Object.create(null); this.state_change = Promise.resolve(); @@ -174,27 +174,23 @@ export class WidgetModel extends Backbone.Model { // _buffered_state_diff must be created *after* the super.initialize // call above. See the note in the set() method below. this._buffered_state_diff = {}; + } - if (comm) { - // Remember comm associated with the model. - this.comm = comm; + get comm() { + return this._comm; + } - // Hook comm messages up to model. + set comm(comm: IClassicComm | undefined) { + this._comm = comm; + if (comm) { comm.on_close(this._handle_comm_closed.bind(this)); comm.on_msg(this._handle_comm_msg.bind(this)); - - this.comm_live = true; - } else { - this.comm_live = false; } + this.trigger('comm_live_update'); } - get comm_live(): boolean { - return this._comm_live; - } - set comm_live(x) { - this._comm_live = x; - this.trigger('comm_live_update'); + get comm_live() { + return Boolean(this.comm); } /** @@ -218,42 +214,42 @@ export class WidgetModel extends Backbone.Model { * * @returns - a promise that is fulfilled when all the associated views have been removed. */ - close(comm_closed = false): Promise { + async close(comm_closed = false): Promise { // can only be closed once. if (this._closed) { - return Promise.resolve(); + return; } this._closed = true; - if (this.comm && !comm_closed && this.comm_live) { + if (this._comm && !comm_closed) { try { - this.comm.close(); + this._comm.close(); } catch (err) { // Do Nothing } } this.stopListening(); this.trigger('destroy', this); - if (this.comm) { - delete this.comm; - } + delete this._comm; + // Delete all views of this model if (this.views) { const views = Object.keys(this.views).map((id: string) => { return this.views![id].then((view) => view.remove()); }); delete this.views; - return Promise.all(views).then(() => { - return; - }); + await Promise.all(views); + return; } - return Promise.resolve(); } /** * Handle when a widget comm is closed. */ _handle_comm_closed(msg: KernelMessage.ICommCloseMsg): void { - this.comm_live = false; + if (!this.comm) { + return; + } + this.comm = undefined; this.trigger('comm:close'); if (!this._closed) { this.close(true); @@ -642,7 +638,7 @@ export class WidgetModel extends Backbone.Model { * This invokes a Backbone.Sync. */ save_changes(callbacks?: {}): void { - if (this.comm_live) { + if (this.comm) { const options: any = { patch: true }; if (callbacks) { options.callbacks = callbacks; @@ -728,11 +724,9 @@ export class WidgetModel extends Backbone.Model { model_id: string; views?: { [key: string]: Promise }; state_change: Promise; - comm?: IClassicComm; name: string; module: string; - - private _comm_live: boolean; + private _comm?: IClassicComm; private _closed: boolean; private _state_lock: any; private _buffered_state_diff: any; diff --git a/packages/base/test/src/widget_test.ts b/packages/base/test/src/widget_test.ts index 911f130127..6f2a3492fb 100644 --- a/packages/base/test/src/widget_test.ts +++ b/packages/base/test/src/widget_test.ts @@ -194,15 +194,15 @@ describe('WidgetModel', function () { }); }); - it('sets the widget_manager, id, comm, and comm_live properties', function () { - const widgetDead = new WidgetModel({}, { - model_id: 'widgetDead', + it('sets the widget_manager, id, comm, properties', function () { + const widgetNoComm = new WidgetModel({}, { + model_id: 'noComm', widget_manager: this.manager, } as IBackboneModelOptions); - expect(widgetDead.model_id).to.equal('widgetDead'); - expect(widgetDead.widget_manager).to.equal(this.manager); - expect(widgetDead.comm).to.be.undefined; - expect(widgetDead.comm_live).to.be.false; + expect(widgetNoComm.model_id).to.equal('noComm'); + expect(widgetNoComm.widget_manager).to.equal(this.manager); + expect(widgetNoComm.comm).to.be.undefined; + expect(widgetNoComm.comm_live).to.be.false; const comm = new MockComm(); const widgetLive = new WidgetModel({}, { diff --git a/python/jupyterlab_widgets/src/manager.ts b/python/jupyterlab_widgets/src/manager.ts index 8708430f9b..4bd1fa2096 100644 --- a/python/jupyterlab_widgets/src/manager.ts +++ b/python/jupyterlab_widgets/src/manager.ts @@ -302,7 +302,7 @@ abstract class LabWidgetManager extends ManagerBase implements IDisposable { get_state_sync(options: IStateOptions = {}): ReadonlyPartialJSONValue { const models = []; for (const model of this._modelsSync.values()) { - if (model.comm_live) { + if (model.comm) { models.push(model); } } @@ -488,6 +488,7 @@ export class KernelWidgetManager extends LabWidgetManager { case 'restarting': case 'dead': this.disconnect(); + this.clear_state(); break; } } @@ -510,7 +511,6 @@ export class KernelWidgetManager extends LabWidgetManager { this._restoredStatus = false; this._kernelRestoreInProgress = true; try { - await this.clear_state(); await this._loadFromKernel(); } catch { /* empty */ From dfedfa606ace615d31d059b2921c4be24b2a9751 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Wed, 15 Oct 2025 22:15:48 +1100 Subject: [PATCH 38/48] Remove istanbul-instrumenter-loaderjl --- packages/base-manager/package.json | 1 - packages/base/package.json | 1 - packages/controls/package.json | 1 - ui-tests/yarn.lock | 27 +- yarn.lock | 5548 +++++++++++++++------------- 5 files changed, 3017 insertions(+), 2561 deletions(-) diff --git a/packages/base-manager/package.json b/packages/base-manager/package.json index e74405c2df..1149e4fbc4 100644 --- a/packages/base-manager/package.json +++ b/packages/base-manager/package.json @@ -52,7 +52,6 @@ "chai": "^4.0.0", "chai-as-promised": "^7.0.0", "expect.js": "^0.3.1", - "istanbul-instrumenter-loader": "^3.0.1", "karma": "^6.3.3", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", diff --git a/packages/base/package.json b/packages/base/package.json index 14feb2533d..2ff2e2d661 100644 --- a/packages/base/package.json +++ b/packages/base/package.json @@ -57,7 +57,6 @@ "chai": "^4.0.0", "chai-as-promised": "^7.0.0", "expect.js": "^0.3.1", - "istanbul-instrumenter-loader": "^3.0.1", "karma": "^6.3.3", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", diff --git a/packages/controls/package.json b/packages/controls/package.json index d072f1b3f8..6efa7c5f36 100644 --- a/packages/controls/package.json +++ b/packages/controls/package.json @@ -59,7 +59,6 @@ "chai": "^4.0.0", "css-loader": "^6.5.1", "expect.js": "^0.3.1", - "istanbul-instrumenter-loader": "^3.0.1", "karma": "^6.3.3", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", diff --git a/ui-tests/yarn.lock b/ui-tests/yarn.lock index cfa3dde1c0..00e563ef01 100644 --- a/ui-tests/yarn.lock +++ b/ui-tests/yarn.lock @@ -2087,20 +2087,13 @@ __metadata: languageName: node linkType: hard -"csstype@npm:3.0.10": +"csstype@npm:3.0.10, csstype@npm:^3.0.2": version: 3.0.10 resolution: "csstype@npm:3.0.10" checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 - languageName: node - linkType: hard - "d3-array@npm:1 - 3, d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3.2.4, d3-array@npm:^3.2.2": version: 3.2.4 resolution: "d3-array@npm:3.2.4" @@ -2606,20 +2599,13 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2.0.3": +"inherits@npm:2.0.3, inherits@npm:~2.0.3": version: 2.0.3 resolution: "inherits@npm:2.0.3" checksum: 78cb8d7d850d20a5e9a7f3620db31483aa00ad5f722ce03a55b110e5a723539b3716a3b463e2b96ce3fe286f33afc7c131fa2f91407528ba80cea98a7545d4c0 languageName: node linkType: hard -"inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - "internmap@npm:1 - 2": version: 2.0.3 resolution: "internmap@npm:2.0.3" @@ -4062,7 +4048,7 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:8.2.0": +"vscode-jsonrpc@npm:8.2.0, vscode-jsonrpc@npm:^8.0.2": version: 8.2.0 resolution: "vscode-jsonrpc@npm:8.2.0" checksum: f302a01e59272adc1ae6494581fa31c15499f9278df76366e3b97b2236c7c53ebfc71efbace9041cfd2caa7f91675b9e56f2407871a1b3c7f760a2e2ee61484a @@ -4076,13 +4062,6 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:^8.0.2": - version: 8.2.1 - resolution: "vscode-jsonrpc@npm:8.2.1" - checksum: 2af2c333d73f6587896a7077978b8d4b430e55c674d5dbb90597a84a6647057c1655a3bff398a9b08f1f8ba57dbd2deabf05164315829c297b0debba3b8bc19e - languageName: node - linkType: hard - "vscode-languageserver-protocol@npm:^3.17.0": version: 3.17.5 resolution: "vscode-languageserver-protocol@npm:3.17.5" diff --git a/yarn.lock b/yarn.lock index 339a7d2ef4..d5c3f37e7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,16 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.24 - checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 - languageName: node - linkType: hard - "@arcanis/slice-ansi@npm:^1.1.1": version: 1.1.1 resolution: "@arcanis/slice-ansi@npm:1.1.1" @@ -24,251 +14,231 @@ __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.12.13, @babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" dependencies: - "@babel/highlight": ^7.25.7 - picocolors: ^1.0.0 - checksum: f235cdf9c5d6f172898a27949bd63731c5f201671f77bcf4c2ad97229bc462d89746c1a7f5671a132aecff5baf43f3d878b93a7ecc6aa71f9612d2b51270c53e + "@babel/helper-validator-identifier": ^7.27.1 + js-tokens: ^4.0.0 + picocolors: ^1.1.1 + checksum: 5874edc5d37406c4a0bb14cf79c8e51ad412fb0423d176775ac14fc0259831be1bf95bdda9c2aa651126990505e09a9f0ed85deaa99893bc316d2682c5115bdc languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.7": - version: 7.25.8 - resolution: "@babel/compat-data@npm:7.25.8" - checksum: 7ac648b110ec0fcd3a3d3fc62c69c0325b536b3c97bafea8a4392dfc68d9ea9ab1f36d1b2f231d404473fc81f503b4a630425677fc9a3cce2ee33d74842ea109 +"@babel/compat-data@npm:^7.27.2": + version: 7.28.4 + resolution: "@babel/compat-data@npm:7.28.4" + checksum: 9f6f5289bbe5a29e3f9c737577a797205a91f19371b50af8942257d9cb590d44eb950154e4f2a3d5de4105f97a49d6fbc8daebe0db1e6eee04f5a4bf73536bfc languageName: node linkType: hard "@babel/core@npm:^7.12.3": - version: 7.25.8 - resolution: "@babel/core@npm:7.25.8" - dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.25.7 - "@babel/generator": ^7.25.7 - "@babel/helper-compilation-targets": ^7.25.7 - "@babel/helper-module-transforms": ^7.25.7 - "@babel/helpers": ^7.25.7 - "@babel/parser": ^7.25.8 - "@babel/template": ^7.25.7 - "@babel/traverse": ^7.25.7 - "@babel/types": ^7.25.8 + version: 7.28.4 + resolution: "@babel/core@npm:7.28.4" + dependencies: + "@babel/code-frame": ^7.27.1 + "@babel/generator": ^7.28.3 + "@babel/helper-compilation-targets": ^7.27.2 + "@babel/helper-module-transforms": ^7.28.3 + "@babel/helpers": ^7.28.4 + "@babel/parser": ^7.28.4 + "@babel/template": ^7.27.2 + "@babel/traverse": ^7.28.4 + "@babel/types": ^7.28.4 + "@jridgewell/remapping": ^2.3.5 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 77ddf693faf6997915e7bbe16e9f21ca1c0e58bc60ace9eac51c373b21d1b46ce50de650195c136a594b0e5fcb901ca17bb57c2d20bf175b3c325211138bcfde + checksum: f55b90b2c61a6461f5c0ccab74d32af9c67448c43c629529ba7ec3c61d87fa8c408cc9305bfb1f5b09e671d25436d44eaf75c48dee5dc0a5c5e21c01290f5134 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.28.3": + version: 7.28.3 + resolution: "@babel/generator@npm:7.28.3" dependencies: - "@babel/types": ^7.25.7 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 + "@babel/parser": ^7.28.3 + "@babel/types": ^7.28.2 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 jsesc: ^3.0.2 - checksum: f81cf9dc0191ae4411d82978114382ad6e047bfb678f9a95942bac5034a41719d88f047679f5e2f51ba7728b54ebd1cc32a10df7b556215d8a6ab9bdd4f11831 + checksum: e2202bf2b9c8a94f7e7a0a049fda0ee037d055c46922e85afa3bbc53309113f859b8193894f991045d7865226028b8f4f06152ed315ab414451932016dba5e42 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-compilation-targets@npm:7.25.7" +"@babel/helper-compilation-targets@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: - "@babel/compat-data": ^7.25.7 - "@babel/helper-validator-option": ^7.25.7 + "@babel/compat-data": ^7.27.2 + "@babel/helper-validator-option": ^7.27.1 browserslist: ^4.24.0 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: 5b57e7d4b9302c07510ad3318763c053c3d46f2d40a45c2ea0c59160ccf9061a34975ae62f36a32f15d8d03497ecd5ca43a96417c1fd83eb8c035e77a69840ef + checksum: 7b95328237de85d7af1dea010a4daa28e79f961dda48b652860d5893ce9b136fc8b9ea1f126d8e0a24963b09ba5c6631dcb907b4ce109b04452d34a6ae979807 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-module-imports@npm:7.25.7" - dependencies: - "@babel/traverse": ^7.25.7 - "@babel/types": ^7.25.7 - checksum: a7255755e9799978de4bf72563b94b53cf955e5fc3d2acc67c783d3b84d5d34dd41691e473ecc124a94654483fff573deacd87eccd8bd16b47ac4455b5941b30 +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: d8d7b91c12dad1ee747968af0cb73baf91053b2bcf78634da2c2c4991fb45ede9bd0c8f9b5f3254881242bc0921218fcb7c28ae885477c25177147e978ce4397 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-module-transforms@npm:7.25.7" +"@babel/helper-module-imports@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" dependencies: - "@babel/helper-module-imports": ^7.25.7 - "@babel/helper-simple-access": ^7.25.7 - "@babel/helper-validator-identifier": ^7.25.7 - "@babel/traverse": ^7.25.7 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: b1daeded78243da969d90b105a564ed918dcded66fba5cd24fe09cb13f7ee9e84d9b9dee789d60237b9a674582d9831a35dbaf6f0a92a3af5f035234a5422814 + "@babel/traverse": ^7.27.1 + "@babel/types": ^7.27.1 + checksum: 92d01c71c0e4aacdc2babce418a9a1a27a8f7d770a210ffa0f3933f321befab18b655bc1241bebc40767516731de0b85639140c42e45a8210abe1e792f115b28 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-simple-access@npm:7.25.7" +"@babel/helper-module-transforms@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-module-transforms@npm:7.28.3" dependencies: - "@babel/traverse": ^7.25.7 - "@babel/types": ^7.25.7 - checksum: 684d0b0330c42d62834355f127df3ed78f16e6f1f66213c72adb7b3b0bcd6283ea8792f5b172868b3ca6518c479b54e18adac564219519072dda9053cca210bd - 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-module-imports": ^7.27.1 + "@babel/helper-validator-identifier": ^7.27.1 + "@babel/traverse": ^7.28.3 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7cf7b79da0fa626d6c84bfc7b35c079a2559caecaa2ff645b0f1db0d741507aa4df6b5b98a3283e8ac4e89094af271d805bf5701e5c4f916e622797b7c8cbb18 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.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 0a8464adc4b39b138aedcb443b09f4005d86207d7126e5e079177e05c3116107d856ec08282b365e9a79a9872f40f4092a6127f8d74c8a01c1ef789dacfc25d6 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-validator-option@npm:7.25.7" - checksum: 87b801fe7d8337699f2fba5323243dd974ea214d27cf51faf2f0063da6dc5bb67c9bb7867fd337573870f9ab498d2788a75bcf9685442bd9430611c62b0195d1 +"@babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 3c7e8391e59d6c85baeefe9afb86432f2ab821c6232b00ea9082a51d3e7e95a2f3fb083d74dc1f49ac82cf238e1d2295dafcb001f7b0fab479f3f56af5eaaa47 languageName: node linkType: hard -"@babel/helpers@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helpers@npm:7.25.7" - dependencies: - "@babel/template": ^7.25.7 - "@babel/types": ^7.25.7 - checksum: a73242850915ef2956097431fbab3a840b7d6298555ad4c6f596db7d1b43cf769181716e7b65f8f7015fe48748b9c454d3b9c6cf4506cb840b967654463b0819 +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 languageName: node linkType: hard -"@babel/highlight@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/highlight@npm:7.25.7" +"@babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: - "@babel/helper-validator-identifier": ^7.25.7 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - picocolors: ^1.0.0 - checksum: b6aa45c5bf7ecc16b8204bbed90335706131ac6cacb0f1bfb1b862ada3741539c913b56c9d26beb56cece0c231ffab36f66aa36aac6b04b32669c314705203f2 + "@babel/template": ^7.27.2 + "@babel/types": ^7.28.4 + checksum: a8706219e0bd60c18bbb8e010aa122e9b14e7e7e67c21cc101e6f1b5e79dcb9a18d674f655997f85daaf421aa138cf284710bb04371a2255a0a3137f097430b4 languageName: node linkType: hard -"@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.25.7, @babel/parser@npm:^7.25.8": - version: 7.25.8 - resolution: "@babel/parser@npm:7.25.8" +"@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/parser@npm:7.28.4" dependencies: - "@babel/types": ^7.25.8 + "@babel/types": ^7.28.4 bin: parser: ./bin/babel-parser.js - checksum: c33f6d26542f156927c5dbe131265c791177d271e582338e960f803903086ec5c152bf25deae5f4c061b7bee14dc0b5fd2882ccb5a21c16ee0738d24fcc0406e + checksum: d95e283fe1153039b396926ef567ca1ab114afb5c732a23bbcbbd0465ac59971aeb6a63f37593ce7671a52d34ec52b23008c999d68241b42d26928c540464063 languageName: node linkType: hard -"@babel/template@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/template@npm:7.25.7" +"@babel/template@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/template@npm:7.27.2" dependencies: - "@babel/code-frame": ^7.25.7 - "@babel/parser": ^7.25.7 - "@babel/types": ^7.25.7 - checksum: 83f025a4a777103965ee41b7c0fa2bb1c847ea7ed2b9f2cb258998ea96dfc580206176b532edf6d723d85237bc06fca26be5c8772e2af7d9e4fe6927e3bed8a3 + "@babel/code-frame": ^7.27.1 + "@babel/parser": ^7.27.2 + "@babel/types": ^7.27.1 + checksum: ff5628bc066060624afd970616090e5bba91c6240c2e4b458d13267a523572cbfcbf549391eec8217b94b064cf96571c6273f0c04b28a8567b96edc675c28e27 languageName: node linkType: hard -"@babel/traverse@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/traverse@npm:7.25.7" +"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/traverse@npm:7.28.4" 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.27.1 + "@babel/generator": ^7.28.3 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.28.4 + "@babel/template": ^7.27.2 + "@babel/types": ^7.28.4 debug: ^4.3.1 - globals: ^11.1.0 - checksum: 4d329b6e7a409a63f4815bbc0a08d0b0cb566c5a2fecd1767661fe1821ced213c554d7d74e6aca048672fed2c8f76071cb0d94f4bd5f120fba8d55a38af63094 + checksum: d603b8ce4e55ba4fc7b28d3362cc2b1b20bc887e471c8a59fe87b2578c26803c9ef8fcd118081dd8283ea78e0e9a6df9d88c8520033c6aaf81eec30d2a669151 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.27.1, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/types@npm:7.28.4" 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.27.1 + "@babel/helper-validator-identifier": ^7.27.1 + checksum: a369b4fb73415a2ed902a15576b49696ae9777ddee394a7a904c62e6fbb31f43906b0147ae0b8f03ac17f20c248eac093df349e33c65c94617b12e524b759694 languageName: node linkType: hard -"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.15.0, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.7.1": - version: 6.18.1 - resolution: "@codemirror/autocomplete@npm:6.18.1" +"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.18.6, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.7.1": + version: 6.19.0 + resolution: "@codemirror/autocomplete@npm:6.19.0" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.17.0 "@lezer/common": ^1.0.0 - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - checksum: d488b3f76c330cc3776ef3c766347c178aa0773afd1791d2d8a7b72c4cd8a75c413bc47daba7ec29eedab954966b11ebb7c0085d12f814999ec192f060c884a9 + checksum: 137c1709855e9dc7629b7eb58f2ff6bbaca4ebbcee03ee111848dd4a781299cc5d1b8932e536222fbdb0c2aaa25f3966d9d08e963f1aafef4834ff3acf0ea5f1 languageName: node linkType: hard -"@codemirror/commands@npm:^6.3.3": - version: 6.7.1 - resolution: "@codemirror/commands@npm:6.7.1" +"@codemirror/commands@npm:^6.8.1": + version: 6.9.0 + resolution: "@codemirror/commands@npm:6.9.0" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.4.0 "@codemirror/view": ^6.27.0 "@lezer/common": ^1.1.0 - checksum: 507ae0cc7f3a7bd869bca0de7e942ecb2bc0bd95a42484e5b06835ebf8caf7626c39d2bea26cefab99d07ab83ba5934afd2d07ce00dac4190aca014523f3c97e + checksum: 385538f2a1eb9d89de57140e6c1f2d472678097b5261f815357de7f73674919a2a452ff727751aeeea493e787adf094c7dc41076418a85c324fd9af2c5ee9e89 languageName: node linkType: hard "@codemirror/lang-cpp@npm:^6.0.2": - version: 6.0.2 - resolution: "@codemirror/lang-cpp@npm:6.0.2" + version: 6.0.3 + resolution: "@codemirror/lang-cpp@npm:6.0.3" dependencies: "@codemirror/language": ^6.0.0 "@lezer/cpp": ^1.0.0 - checksum: bb9eba482cca80037ce30c7b193cf45eff19ccbb773764fddf2071756468ecc25aa53c777c943635054f89095b0247b9b50c339e107e41e68d34d12a7295f9a9 + checksum: 982b9a9624367a0086520e1d499b7ad2fba2a14bdd57df88520bac279bd980e12154fd281659226fbcfa530edb5dd72edd114481365e6224bf53e97bc972f3b8 languageName: node linkType: hard -"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.2.1": - version: 6.3.0 - resolution: "@codemirror/lang-css@npm:6.3.0" +"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.3.1": + version: 6.3.1 + resolution: "@codemirror/lang-css@npm:6.3.1" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 "@lezer/common": ^1.0.2 "@lezer/css": ^1.1.7 - checksum: e98e89fa436f0a27c95323efbb6a1c43a52ca0b9253ab3c12af16f38cb93670d42f8a63cc566e2f6b0348af2cdfa1a6c03cf045af2d6cb253b27b2efdce9b2b2 + checksum: ed175d75d75bc0a059d1e60b3dcd8464d570da14fc97388439943c9c43e1e9146e37b83fe2ccaad9cd387420b7b411ea1d24ede78ecd1f2045a38acbb4dd36bc languageName: node linkType: hard -"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.8": - version: 6.4.9 - resolution: "@codemirror/lang-html@npm:6.4.9" +"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.9": + version: 6.4.11 + resolution: "@codemirror/lang-html@npm:6.4.11" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/lang-css": ^6.0.0 @@ -278,24 +248,24 @@ __metadata: "@codemirror/view": ^6.17.0 "@lezer/common": ^1.0.0 "@lezer/css": ^1.1.0 - "@lezer/html": ^1.3.0 - checksum: ac8c3ceb0396f2e032752c5079bd950124dca708bc64e96fc147dc5fe7133e5cee0814fe951abdb953ec1d11fa540e4b30a712b5149d9a36016a197a28de45d7 + "@lezer/html": ^1.3.12 + checksum: 31a16cc6be4daa58c6765274b9b7ba1bb54a4b0858d33d8ad1c7ec1bcb85920e3715a891f8cb27f5d9dfe87bbe00f0ddfbac5b04011374e15380b9cec7ba3c69 languageName: node linkType: hard "@codemirror/lang-java@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-java@npm:6.0.1" + version: 6.0.2 + resolution: "@codemirror/lang-java@npm:6.0.2" dependencies: "@codemirror/language": ^6.0.0 "@lezer/java": ^1.0.0 - checksum: 4679104683cbffcd224ac04c7e5d144b787494697b26470b07017259035b7bb3fa62609d9a61bfbc566f1756d9f972f9f26d96a3c1362dd48881c1172f9a914d + checksum: ed884f5e1a90c0d487bc4e5073c6154f3abf51b0b652c3d015e8cb322e171a38307427a85ecc16d5be82bd3243577e77e202325d84394a9c5ac356ee358c56c9 languageName: node linkType: hard -"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.2.2": - version: 6.2.2 - resolution: "@codemirror/lang-javascript@npm:6.2.2" +"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.2.3": + version: 6.2.4 + resolution: "@codemirror/lang-javascript@npm:6.2.4" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.6.0 @@ -304,23 +274,23 @@ __metadata: "@codemirror/view": ^6.17.0 "@lezer/common": ^1.0.0 "@lezer/javascript": ^1.0.0 - checksum: 66379942a8347dff2bd76d10ed7cf313bca83872f8336fdd3e14accfef23e7b690cd913c9d11a3854fba2b32299da07fc3275995327642c9ee43c2a8e538c19d + checksum: 0350e9ac2df155c4ecf75d556f40b677c284c1d320620dc7228e2aa458e258dd1145c86e5ebf3451347ed6ef528f72c2eb60f5d3f6bd10af8aabb2819109e21a languageName: node linkType: hard "@codemirror/lang-json@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-json@npm:6.0.1" + version: 6.0.2 + resolution: "@codemirror/lang-json@npm:6.0.2" dependencies: "@codemirror/language": ^6.0.0 "@lezer/json": ^1.0.0 - checksum: e9e87d50ff7b81bd56a6ab50740b1dd54e9a93f1be585e1d59d0642e2148842ea1528ac7b7221eb4ddc7fe84bbc28065144cc3ab86f6e06c6aeb2d4b4e62acf1 + checksum: ccdf71a4f339b9e40310c40c4677c31b8bf2284291becc056b7d5b30382107cd7ab65f1a3c108331c0fc7b5fc7ec2e3fe6e5029957ff978d7b7bfb759f68d921 languageName: node linkType: hard -"@codemirror/lang-markdown@npm:^6.2.4": - version: 6.3.0 - resolution: "@codemirror/lang-markdown@npm:6.3.0" +"@codemirror/lang-markdown@npm:^6.3.2": + version: 6.4.0 + resolution: "@codemirror/lang-markdown@npm:6.4.0" dependencies: "@codemirror/autocomplete": ^6.7.1 "@codemirror/lang-html": ^6.0.0 @@ -329,49 +299,49 @@ __metadata: "@codemirror/view": ^6.0.0 "@lezer/common": ^1.2.1 "@lezer/markdown": ^1.0.0 - checksum: 8f3a231a0008d6b6834e58d44eac3c383cf472083ef2a68de66f9b4209bb4de1fb14f167e6e04236dbf58444299bce74715df372b1e97c9b4f207cc65daf6285 + checksum: 4b6a28695f1c7157303b85a4f49658f432ef8e6165ffdb9d0830d0401cb0f760e9b7d0f77821d1e9da60e19a8673963c3fe7563d7434ad5c5495aa09e6720e9c languageName: node linkType: hard "@codemirror/lang-php@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-php@npm:6.0.1" + version: 6.0.2 + resolution: "@codemirror/lang-php@npm:6.0.2" dependencies: "@codemirror/lang-html": ^6.0.0 "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 "@lezer/common": ^1.0.0 "@lezer/php": ^1.0.0 - checksum: c003a29a426486453fdfddbf7302982fa2aa7f059bf6f1ce4cbf08341b0162eee5e2f50e0d71c418dcd358491631780156d846fe352754d042576172c5d86721 + checksum: e0cb6287c5a8898dc5637dadfbbd591ed6c2aaef1fc4db1426646ab0f8e48e4c7254899fc9c1864ee1f1e917d5888e447d1ab87300d896de2b9472f5ad6a888d languageName: node linkType: hard -"@codemirror/lang-python@npm:^6.1.4": - version: 6.1.6 - resolution: "@codemirror/lang-python@npm:6.1.6" +"@codemirror/lang-python@npm:^6.2.0": + version: 6.2.1 + resolution: "@codemirror/lang-python@npm:6.2.1" dependencies: "@codemirror/autocomplete": ^6.3.2 "@codemirror/language": ^6.8.0 "@codemirror/state": ^6.0.0 "@lezer/common": ^1.2.1 "@lezer/python": ^1.1.4 - checksum: eb1faabd332bb95d0f3e227eb19ac5a31140cf238905bbe73e061040999f5680a012f9145fb3688bc2fcbb1908c957511edc8eeb8a9aa88d27d4fa55ad451e95 + checksum: 977ce444ab7c68261107c40e8a46d3480a239ac5a093f39fad7da0644fc08cb4b90552c8b7fad396f936e34b5bbac510533ea7b4229d3b8271774a1af1e717aa languageName: node linkType: hard "@codemirror/lang-rust@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-rust@npm:6.0.1" + version: 6.0.2 + resolution: "@codemirror/lang-rust@npm:6.0.2" dependencies: "@codemirror/language": ^6.0.0 "@lezer/rust": ^1.0.0 - checksum: 8a439944cb22159b0b3465ca4fa4294c69843219d5d30e278ae6df8e48f30a7a9256129723c025ec9b5e694d31a3560fb004300b125ffcd81c22d13825845170 + checksum: 4cb7528c723ec3f421bd82a5324c56d836f3675e3b28e2b2d3c9d251e8f206bf9d932d52696c310dca51d71644063441fb8330d5ad1278c68002f8598b4bc067 languageName: node linkType: hard -"@codemirror/lang-sql@npm:^6.6.1": - version: 6.8.0 - resolution: "@codemirror/lang-sql@npm:6.8.0" +"@codemirror/lang-sql@npm:^6.8.0": + version: 6.10.0 + resolution: "@codemirror/lang-sql@npm:6.10.0" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.0.0 @@ -379,7 +349,7 @@ __metadata: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 1b5a3c8129b09f24039d8c0906fc4cb8d0f706a424a1d56721057bd1e647797c2b1240bb53eed9bf2bac5806a4e0363e555a3963f04c478efa05829890c537f7 + checksum: c37ba6778f5f34f174a387ff530f19844fccc1e5ff65c58205b8861c19b6e39e4b3298ec63f50bd6c860befba3491db40d0d20b463a77021a9e9f20979fa2369 languageName: node linkType: hard @@ -409,9 +379,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.10.1, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0": - version: 6.10.3 - resolution: "@codemirror/language@npm:6.10.3" +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.11.0, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0": + version: 6.11.3 + resolution: "@codemirror/language@npm:6.11.3" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.23.0 @@ -419,56 +389,59 @@ __metadata: "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: 53fb72299500f63706f78c888d6b5fd81043ea11ea2fa4c72c13c6d4794bb6f4ec29450208c56b4f40e839984b3dc73505262803fa61416baf588da389a7c577 + checksum: 9ad560fb90ccb8e5660ee162b7ca36323b0cc0fe2c2885a93f052763c177e10118930aae5cdea410e90cf2a6a2b86438a7503fcc6d1f550c8d75a6757e31f3bf languageName: node linkType: hard -"@codemirror/legacy-modes@npm:^6.3.3": - version: 6.4.1 - resolution: "@codemirror/legacy-modes@npm:6.4.1" +"@codemirror/legacy-modes@npm:^6.5.1": + version: 6.5.2 + resolution: "@codemirror/legacy-modes@npm:6.5.2" dependencies: "@codemirror/language": ^6.0.0 - checksum: 3947842c5f06db49a152bf7dd03a626806c5f2e80abfa9840927396fef08ff8bc2dfb228e7231bd8d0b7bb1a84b7ef582df8361b2bef77419e0e04bf43cc6b7d + checksum: 2ae75e40d4357e65d0b3b1ebcb28a85a7700f8a39e5ae2dcc8dece00a4070a800d797c9297e7a4beb398d63e4c69c3e69992b4fb20ab84f748625c7590a82636 languageName: node linkType: hard "@codemirror/lint@npm:^6.0.0": - version: 6.8.2 - resolution: "@codemirror/lint@npm:6.8.2" + version: 6.9.0 + resolution: "@codemirror/lint@npm:6.9.0" dependencies: "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 + "@codemirror/view": ^6.35.0 crelt: ^1.0.5 - checksum: 714fe911c2d600350ea8ca0f65ceb2de25ace511e71bf174a550ba0aefc9884ec4e099f0f500b55bfd0fccbd7fe3a342a0048ff5a49c8c20020ea16cc8bff3c3 + checksum: 0a1f2a64c1377b491a4050c0e20cc1ab7eb2cb6e1cc8a57a4be24af9f4a3700fefeb983ed879ca63fc6642de3f50edf4f953de43cfba3eea99fb98c23f99a281 languageName: node linkType: hard -"@codemirror/search@npm:^6.5.6": - version: 6.5.6 - resolution: "@codemirror/search@npm:6.5.6" +"@codemirror/search@npm:^6.5.10": + version: 6.5.11 + resolution: "@codemirror/search@npm:6.5.11" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 crelt: ^1.0.5 - checksum: 19dc88d09fc750563347001e83c6194bbb2a25c874bd919d2d81809e1f98d6330222ddbd284aa9758a09eeb41fd153ec7c2cf810b2ee51452c25963d7f5833d5 + checksum: 4d418f176bd93705bc51c82a2f1c0e41fecc0368dc43c415635c4dfdd763aa05ebdf7f000bc9ca0083c1887e6d305b89482ec1f4db8b8765c6f38de324187476 languageName: node linkType: hard -"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.4.1": - version: 6.4.1 - resolution: "@codemirror/state@npm:6.4.1" - checksum: b81b55574091349eed4d32fc0eadb0c9688f1f7c98b681318f59138ee0f527cb4c4a97831b70547c0640f02f3127647838ae6730782de4a3dd2cc58836125d01 +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.5.0, @codemirror/state@npm:^6.5.2": + version: 6.5.2 + resolution: "@codemirror/state@npm:6.5.2" + dependencies: + "@marijn/find-cluster-break": ^1.0.0 + checksum: 4473a79475070d73f2e72f2eaaee5b69d2833b5020faa9714609d95dd03f0e5ad02cad8031a541dcd748436842a300332a2925317b39ffa09e3b4831145d98bc languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.26.0, @codemirror/view@npm:^6.27.0": - version: 6.34.1 - resolution: "@codemirror/view@npm:6.34.1" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.35.0, @codemirror/view@npm:^6.38.1": + version: 6.38.6 + resolution: "@codemirror/view@npm:6.38.6" dependencies: - "@codemirror/state": ^6.4.0 + "@codemirror/state": ^6.5.0 + crelt: ^1.0.6 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 5c7bf199f0b45a3cc192f08c2ac89e5ab972f313cb4f2c979edf6e05b27bccd60c6cb42d5dacb6813ef3a928d75476eb0a00ffdeffd7431c8e9f44bab4f6e12e + checksum: cd68f603d7bcaa9a28900a380d6fd1fb9dd91f4a2110b97fb339dcf7de6915a1caca6f15a7a900f86db5f2e14e3943e7ba87d111d63995c6c1f12d3233f8b860 languageName: node linkType: hard @@ -479,9 +452,9 @@ __metadata: languageName: node linkType: hard -"@cypress/request@npm:3.0.1": - version: 3.0.1 - resolution: "@cypress/request@npm:3.0.1" +"@cypress/request@npm:3.0.6": + version: 3.0.6 + resolution: "@cypress/request@npm:3.0.6" dependencies: aws-sign2: ~0.7.0 aws4: ^1.8.0 @@ -489,19 +462,19 @@ __metadata: combined-stream: ~1.0.6 extend: ~3.0.2 forever-agent: ~0.6.1 - form-data: ~2.3.2 - http-signature: ~1.3.6 + form-data: ~4.0.0 + http-signature: ~1.4.0 is-typedarray: ~1.0.0 isstream: ~0.1.2 json-stringify-safe: ~5.0.1 mime-types: ~2.1.19 performance-now: ^2.1.0 - qs: 6.10.4 + qs: 6.13.0 safe-buffer: ^5.1.2 - tough-cookie: ^4.1.3 + tough-cookie: ^5.0.0 tunnel-agent: ^0.6.0 uuid: ^8.3.2 - checksum: 7175522ebdbe30e3c37973e204c437c23ce659e58d5939466615bddcd58d778f3a8ea40f087b965ae8b8138ea8d102b729c6eb18c6324f121f3778f4a2e8e727 + checksum: 017e1898123eca7af4b95b89fa5a03ed6cb5e841b8ed926cb709b5ad88b5f55b713436e74bce6f13752f80d0399c01cd5b0b3212aaa972e064967f5c78237ebb languageName: node linkType: hard @@ -513,20 +486,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.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" 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: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": - 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 @@ -600,10 +573,25 @@ __metadata: languageName: node linkType: hard +"@inquirer/external-editor@npm:^1.0.0, @inquirer/external-editor@npm:^1.0.2": + version: 1.0.2 + resolution: "@inquirer/external-editor@npm:1.0.2" + dependencies: + chardet: ^2.1.0 + iconv-lite: ^0.7.0 + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 57f32889969e0128561beb2b1225f0320a55fe90356dcf679804b3405534b0f909024e446d61b812d91b85d3e85ac6f762f29d34243d022fd68eecfd85483c1a + languageName: node + linkType: hard + "@inquirer/figures@npm:^1.0.3": - version: 1.0.7 - resolution: "@inquirer/figures@npm:1.0.7" - checksum: 82edc998d0ace2f147eb332177f451c02e6a4a6e829d47817f5a4b3341c12cd0850b92ee3187d483328cce5824b870ed75e868850b6ac819447b9d56501f01cb + version: 1.0.14 + resolution: "@inquirer/figures@npm:1.0.14" + checksum: 37eec986f119eabb6c231c8c1481c6a48ab2347e9f57b2d6442161f7b83936678221fccb7ead60582026c2ae20d457467d0727c485ff53aee2cf965077b0f51b languageName: node linkType: hard @@ -621,6 +609,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: ^7.0.4 + checksum: 5d36d289960e886484362d9eb6a51d1ea28baed5f5d0140bbe62b99bac52eaf06cc01c2bc0d3575977962f84f6b2c4387b043ee632216643d4787b0999465bf2 + languageName: node + linkType: hard + "@isaacs/string-locale-compare@npm:^1.1.0": version: 1.1.0 resolution: "@isaacs/string-locale-compare@npm:1.1.0" @@ -635,14 +632,72 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/node": "*" + jest-mock: ^29.7.0 + checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: - "@jridgewell/set-array": ^1.2.1 - "@jridgewell/sourcemap-codec": ^1.4.10 + "@sinclair/typebox": ^0.27.8 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": ^29.6.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 "@jridgewell/trace-mapping": ^0.3.24 - checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: 4a66a7397c3dc9c6b5c14a0024b1f98c5e1d90a0dbc1e5955b5038f2db339904df2a0ee8a66559fafb4fc23ff33700a2639fd40bbdd2e9e82b58b3bdf83738e3 languageName: node linkType: hard @@ -653,47 +708,40 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.25 - checksum: c9dc7d899397df95e3c9ec287b93c0b56f8e4453cd20743e2b9c8e779b1949bc3cccf6c01bb302779e46560eb45f62ea38d19fedd25370d814734268450a9f30 + checksum: c8a0011cc67e701f270fa042e32b312f382c413bcc70ca9c03684687cbf5b64d5eed87d4afa36dddaabe60ab3da6db4935f878febd9cfc7f82724ea1a114d344 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + checksum: af8fda2431348ad507fbddf8e25f5d08c79ecc94594061ce402cf41bc5aba1a7b3e59bf0fd70a619b35f33983a3f488ceeba8faf56bff784f98bb5394a8b7d47 languageName: node linkType: hard -"@jupyter-widgets/base-manager@^1.0.9, @jupyter-widgets/base-manager@workspace:packages/base-manager": +"@jupyter-widgets/base-manager@^1.0.12, @jupyter-widgets/base-manager@workspace:packages/base-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/base-manager@workspace:packages/base-manager" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyterlab/services": ^6.0.0 || ^7.0.0 - "@lumino/coreutils": ^1.11.1 || ^2 + "@jupyter-widgets/base": ^6.0.11 + "@jupyterlab/services": ^6 || ^7 + "@lumino/coreutils": ^1 || ^2 "@types/base64-js": ^1.2.5 "@types/chai": ^4.1.7 "@types/chai-as-promised": ^7.1.0 @@ -706,7 +754,6 @@ __metadata: chai: ^4.0.0 chai-as-promised: ^7.0.0 expect.js: ^0.3.1 - istanbul-instrumenter-loader: ^3.0.1 karma: ^6.3.3 karma-chrome-launcher: ^3.1.0 karma-coverage: ^2.0.3 @@ -726,7 +773,25 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/base@^6.0.8, @jupyter-widgets/base@workspace:packages/base": +"@jupyter-widgets/base7@npm:@jupyter-widgets/base@4.1.7, @jupyter-widgets/base@npm:^4.1.7": + version: 4.1.7 + resolution: "@jupyter-widgets/base@npm:4.1.7" + dependencies: + "@jupyterlab/services": ^6 || ^7 + "@lumino/coreutils": ^1 || ^2 + "@lumino/messaging": ^1 || ^2 + "@lumino/widgets": ^1 || ^2 + "@types/backbone": ^1.4.1 + "@types/lodash": ^4.14.134 + backbone: 1.2.3 + base64-js: ^1.2.1 + jquery: ^3.1.1 + lodash: ^4.17.4 + checksum: ae9fea4352a9a9174da589a611274a7652e9b9f31593da1c0b38892f71ed81ab394d16a75c62e0c6fc5c96b50c090b91219957e3614b325b81171c61da4f0afd + languageName: node + linkType: hard + +"@jupyter-widgets/base@^6.0.11, @jupyter-widgets/base@workspace:packages/base": version: 0.0.0-use.local resolution: "@jupyter-widgets/base@workspace:packages/base" dependencies: @@ -748,7 +813,6 @@ __metadata: chai: ^4.0.0 chai-as-promised: ^7.0.0 expect.js: ^0.3.1 - istanbul-instrumenter-loader: ^3.0.1 jquery: ^3.1.1 karma: ^6.3.3 karma-chrome-launcher: ^3.1.0 @@ -769,11 +833,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/controls@^5.0.9, @jupyter-widgets/controls@workspace:packages/controls": +"@jupyter-widgets/controls7@npm:@jupyter-widgets/controls@3.1.8": + version: 3.1.8 + resolution: "@jupyter-widgets/controls@npm:3.1.8" + dependencies: + "@jupyter-widgets/base": ^4.1.7 + "@lumino/algorithm": ^1 || ^2 + "@lumino/domutils": ^1 || ^2 + "@lumino/messaging": ^1 || ^2 + "@lumino/signaling": ^1 || ^2 + "@lumino/widgets": ^1 || ^2 + d3-format: ^1.3.0 + jquery: ^3.1.1 + jquery-ui: ^1.12.1 + underscore: ^1.8.3 + checksum: 483c9af59f0f1c3d2a56b8b99141f3dfa756b7c9601a64b22649a0e89ae63399ecaad672573f3c0c96a33fbf510ed3e6523c311c237456f623a9242acfce9e26 + languageName: node + linkType: hard + +"@jupyter-widgets/controls@^5.0.12, @jupyter-widgets/controls@workspace:packages/controls": version: 0.0.0-use.local resolution: "@jupyter-widgets/controls@workspace:packages/controls" dependencies: - "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base": ^6.0.11 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/algorithm": ^1 || ^2 "@lumino/domutils": ^1 || ^2 @@ -792,7 +874,6 @@ __metadata: d3-color: ^3.0.1 d3-format: ^3.0.1 expect.js: ^0.3.1 - istanbul-instrumenter-loader: ^3.0.1 jquery: ^3.1.1 karma: ^6.3.3 karma-chrome-launcher: ^3.1.0 @@ -824,9 +905,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web1@workspace:examples/web1" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base-manager": ^1.0.12 + "@jupyter-widgets/controls": ^5.0.12 chai: ^4.0.0 css-loader: ^6.5.1 karma: ^6.3.3 @@ -845,9 +926,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web2@workspace:examples/web2" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 + "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base-manager": ^1.0.12 + "@jupyter-widgets/controls": ^5.0.12 codemirror: ^5.48.0 css-loader: ^6.5.1 font-awesome: ^4.7.0 @@ -860,9 +941,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web3@workspace:examples/web3" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/html-manager": ^1.0.11 + "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/controls": ^5.0.12 + "@jupyter-widgets/html-manager": ^1.0.14 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@types/codemirror": ^5.60.0 "@types/node": ^17.0.2 @@ -882,7 +963,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/example-web4@workspace:examples/web4" dependencies: - "@jupyter-widgets/html-manager": ^1.0.11 + "@jupyter-widgets/html-manager": ^1.0.14 css-loader: ^6.5.1 font-awesome: ^4.7.0 style-loader: ^3.3.1 @@ -890,16 +971,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/html-manager@^1.0.11, @jupyter-widgets/html-manager@workspace:packages/html-manager": +"@jupyter-widgets/html-manager@^1.0.14, @jupyter-widgets/html-manager@workspace:packages/html-manager": version: 0.0.0-use.local resolution: "@jupyter-widgets/html-manager@workspace:packages/html-manager" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/output": ^6.0.8 - "@jupyter-widgets/schema": ^0.5.5 + "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base-manager": ^1.0.12 + "@jupyter-widgets/base7": "npm:@jupyter-widgets/base@4.1.7" + "@jupyter-widgets/controls": ^5.0.12 + "@jupyter-widgets/controls7": "npm:@jupyter-widgets/controls@3.1.8" + "@jupyter-widgets/output": ^6.0.11 + "@jupyter-widgets/schema": ^0.5.6 "@jupyterlab/outputarea": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime": ^3.0.0 || ^4.0.0 "@jupyterlab/rendermime-interfaces": ^3.0.0 || ^4.0.0 @@ -937,10 +1020,10 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/jupyterlab-manager@workspace:python/jupyterlab_widgets" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/output": ^6.0.8 + "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base-manager": ^1.0.12 + "@jupyter-widgets/controls": ^5.0.12 + "@jupyter-widgets/output": ^6.0.11 "@jupyterlab/application": ^3.0.0 || ^4.0.0 "@jupyterlab/builder": ^3.0.0 || ^4.0.0 "@jupyterlab/console": ^3.0.0 || ^4.0.0 @@ -983,11 +1066,11 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyter-widgets/notebook-manager@workspace:python/widgetsnbextension" dependencies: - "@jupyter-widgets/base": ^6.0.8 - "@jupyter-widgets/base-manager": ^1.0.9 - "@jupyter-widgets/controls": ^5.0.9 - "@jupyter-widgets/html-manager": ^1.0.11 - "@jupyter-widgets/output": ^6.0.8 + "@jupyter-widgets/base": ^6.0.11 + "@jupyter-widgets/base-manager": ^1.0.12 + "@jupyter-widgets/controls": ^5.0.12 + "@jupyter-widgets/html-manager": ^1.0.14 + "@jupyter-widgets/output": ^6.0.11 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/messaging": ^1 || ^2 "@lumino/widgets": ^1 || ^2 @@ -1001,48 +1084,47 @@ __metadata: languageName: unknown linkType: soft -"@jupyter-widgets/output@^6.0.8, @jupyter-widgets/output@workspace:packages/output": +"@jupyter-widgets/output@^6.0.11, @jupyter-widgets/output@workspace:packages/output": version: 0.0.0-use.local resolution: "@jupyter-widgets/output@workspace:packages/output" dependencies: - "@jupyter-widgets/base": ^6.0.8 + "@jupyter-widgets/base": ^6.0.11 rimraf: ^3.0.2 typescript: ~4.9.4 languageName: unknown linkType: soft -"@jupyter-widgets/schema@^0.5.5, @jupyter-widgets/schema@workspace:packages/schema": +"@jupyter-widgets/schema@^0.5.6, @jupyter-widgets/schema@workspace:packages/schema": version: 0.0.0-use.local resolution: "@jupyter-widgets/schema@workspace:packages/schema" languageName: unknown linkType: soft -"@jupyter/react-components@npm:^0.15.3": - version: 0.15.3 - resolution: "@jupyter/react-components@npm:0.15.3" +"@jupyter/react-components@npm:^0.16.6": + version: 0.16.7 + resolution: "@jupyter/react-components@npm:0.16.7" dependencies: - "@jupyter/web-components": ^0.15.3 - "@microsoft/fast-react-wrapper": ^0.3.22 + "@jupyter/web-components": ^0.16.7 react: ">=17.0.0 <19.0.0" - checksum: 1a6b256314259c6465c4b6d958575710536b82234a7bf0fba3e889a07e1f19ff8ab321450be354359876f92c45dbcc9d21a840237ff4a619806d9de696f55496 + checksum: 37894347e63ebb528725e8b8b4038d138019823f5c9e28e3f6abb93b46d771b2ee3cc004d5ff7d9a06a93f2d90e41000bd2abae14364be34ba99c5e05864810e languageName: node linkType: hard -"@jupyter/web-components@npm:^0.15.3": - version: 0.15.3 - resolution: "@jupyter/web-components@npm:0.15.3" +"@jupyter/web-components@npm:^0.16.6, @jupyter/web-components@npm:^0.16.7": + version: 0.16.7 + resolution: "@jupyter/web-components@npm:0.16.7" dependencies: "@microsoft/fast-colors": ^5.3.1 "@microsoft/fast-element": ^1.12.0 "@microsoft/fast-foundation": ^2.49.4 "@microsoft/fast-web-utilities": ^5.4.1 - checksum: a0980af934157bfdbdb6cc169c0816c1b2e57602d524c56bdcef746a4c25dfeb8f505150d83207c8695ed89b5486cf53d35a3382584d25ef64db666e4e16e45b + checksum: ec3336247bbabb2e2587c2cf8b9d0e80786b454916dd600b3d6791bf08c3d1e45a7ec1becf366a5491ab56b0be020baa8c50a5b6067961faf5ec904de31243aa languageName: node linkType: hard -"@jupyter/ydoc@npm:^2.0.1": - version: 2.1.3 - resolution: "@jupyter/ydoc@npm:2.1.3" +"@jupyter/ydoc@npm:^3.1.0": + version: 3.1.0 + resolution: "@jupyter/ydoc@npm:3.1.0" dependencies: "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 "@lumino/coreutils": ^1.11.0 || ^2.0.0 @@ -1050,97 +1132,97 @@ __metadata: "@lumino/signaling": ^1.10.0 || ^2.0.0 y-protocols: ^1.0.5 yjs: ^13.5.40 - checksum: 61b38e3f89accebc8060eb0aacc11bf812befb9b1cec085d1b0153be851037a3a26b5576d58e5bc65d8c0697ef9f1e535afa73af1b1deef0523d749ff4ac0ac9 + checksum: 7f2423752395ec590ed46754c10c87db4f5b804aa9608ef2869f52872e9a29cb5f9e32908325efb221d9ce4fad642a1f7e0dbb8f2ee40c352b8380e46ccba93d languageName: node linkType: hard "@jupyterlab/application@npm:^3.0.0 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/application@npm:4.2.5" + version: 4.4.9 + resolution: "@jupyterlab/application@npm:4.4.9" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/docregistry": ^4.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/application": ^2.3.1 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 - checksum: c424ea191ef4da45eeae44e366e2b3cb23426cc72c0321226c83000c02b91fa7c4bc54978aa0b0e9416211cce9c17469204fc2b133cb2bec3d8896a0b2f75ce1 - languageName: node - linkType: hard - -"@jupyterlab/apputils@npm:^4.3.1": - version: 4.3.1 - resolution: "@jupyterlab/apputils@npm:4.3.1" - dependencies: - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/settingregistry": ^4.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@jupyterlab/statusbar": ^4.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.2 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/docregistry": ^4.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/application": ^2.4.4 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 + checksum: 60b6eb5c90bda06cfab7a188b0703c176f3f42cc0f1189035ff46419ab4856e4007e108b340976c8dc4da4011161928d9ed60cda96d76d93fd25550f0aae782b + languageName: node + linkType: hard + +"@jupyterlab/apputils@npm:^4.5.9": + version: 4.5.9 + resolution: "@jupyterlab/apputils@npm:4.5.9" + dependencies: + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/settingregistry": ^4.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@jupyterlab/statusbar": ^4.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/domutils": ^2.0.3 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + "@lumino/widgets": ^2.7.1 "@types/react": ^18.0.26 react: ^18.2.0 sanitize-html: ~2.12.1 - checksum: a2307657bfab1aff687eccfdb7a2c378a40989beea618ad6e5a811dbd250753588ea704a11250ddef42a551c8360717c1fe4c8827c5e2c3bfff1e84fc7fdc836 + checksum: 19c75e607ca9c5422cb0128d8c4c279d7c75d3d9681c9d45112e0291323279034550f19754a203ed0c09c3dc51b3eb16ee2c0c29be1777dddcf499ef4e6d4b5f languageName: node linkType: hard -"@jupyterlab/attachments@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/attachments@npm:4.2.5" +"@jupyterlab/attachments@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/attachments@npm:4.4.9" dependencies: - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 - checksum: f49fc50f9889de9c7da88e004ae4dd562460da050ff373c946ec54863fcf293dacb5e15de57dbfb0b01141648989a873188a00b898cbb491bbd6c50140a0392c + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 + checksum: e4f5b90ba4f7ce8285bdf9b7a70052c9e8df352e0fb4de4235cec27468ea572b4b2cfe12d4a46ffaec50b084d35d5dabaf6ea404c27b11936a9e28b802749830 languageName: node linkType: hard "@jupyterlab/builder@npm:^3.0.0 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/builder@npm:4.2.5" - dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/application": ^2.3.1 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/dragdrop": ^2.1.4 - "@lumino/messaging": ^2.0.1 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.2 + version: 4.4.9 + resolution: "@jupyterlab/builder@npm:4.4.9" + dependencies: + "@lumino/algorithm": ^2.0.3 + "@lumino/application": ^2.4.4 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/domutils": ^2.0.3 + "@lumino/dragdrop": ^2.1.6 + "@lumino/messaging": ^2.0.3 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + "@lumino/widgets": ^2.7.1 ajv: ^8.12.0 commander: ^9.4.1 css-loader: ^6.7.1 @@ -1162,13 +1244,13 @@ __metadata: worker-loader: ^3.0.2 bin: build-labextension: lib/build-labextension.js - checksum: 67d7150a52cd647cfb1a1b1217223389dd2ce1169bf7aa3a5ea8b7d73e2589e6699181cfd488de88362ff8f46682a4e875c545836733d37b19217ae3068d876c + checksum: 6106ab85c74f1bba6099df5ecc45b7706cff43d3850f47442609ecaf055efb016215269381ee10194c01dcb535cab1a132bc64a7046b324964b05ec118402a7a languageName: node linkType: hard "@jupyterlab/buildutils@npm:^3.5.2 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/buildutils@npm:4.2.5" + version: 4.4.9 + resolution: "@jupyterlab/buildutils@npm:4.4.9" dependencies: "@yarnpkg/core": ^4.0.3 "@yarnpkg/parsers": ^3.0.0 @@ -1184,10 +1266,10 @@ __metadata: package-json: ^7.0.0 prettier: ~2.6.0 process: ^0.11.10 - semver: ^7.3.2 + semver: ^7.5.2 sort-package-json: ~1.53.1 - typescript: ~5.1.6 - verdaccio: ^5.25.0 + typescript: ~5.5.4 + verdaccio: ^5.33.0 bin: get-dependency: lib/get-dependency.js local-repository: lib/local-repository.js @@ -1195,540 +1277,542 @@ __metadata: update-dependency: lib/update-dependency.js update-dist-tag: lib/update-dist-tag.js update-staging-lock: lib/update-staging-lock.js - checksum: 29a0705b6db6729fa77964757a46d46628636306cf9507158e9ad1d6c79e30e349578c2f3608b61f11fdb366aa4634453334559354eb9800402f60781091df3c - languageName: node - linkType: hard - -"@jupyterlab/cells@npm:^4.2.1": - version: 4.2.1 - resolution: "@jupyterlab/cells@npm:4.2.1" - dependencies: - "@codemirror/state": ^6.4.1 - "@codemirror/view": ^6.26.0 - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/attachments": ^4.2.5 - "@jupyterlab/codeeditor": ^4.2.5 - "@jupyterlab/codemirror": ^4.2.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/documentsearch": ^4.2.5 - "@jupyterlab/filebrowser": ^4.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/outputarea": ^4.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/toc": ^6.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/dragdrop": ^2.1.4 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.2 + checksum: 7dcda8a5054a6323888913689c35c60c103709a362d405163ebc69a1d06d1a5f9c7a6df366cebca4059ce0d976b90891e62e7f98cc7cf5489ebb084ea574439b + languageName: node + linkType: hard + +"@jupyterlab/cells@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/cells@npm:4.4.9" + dependencies: + "@codemirror/state": ^6.5.2 + "@codemirror/view": ^6.38.1 + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/attachments": ^4.4.9 + "@jupyterlab/codeeditor": ^4.4.9 + "@jupyterlab/codemirror": ^4.4.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/documentsearch": ^4.4.9 + "@jupyterlab/filebrowser": ^4.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/outputarea": ^4.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/toc": ^6.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/domutils": ^2.0.3 + "@lumino/dragdrop": ^2.1.6 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + "@lumino/widgets": ^2.7.1 react: ^18.2.0 - checksum: 6b2f84c0036dbc8808eb6f5057d07dae00d8000fac2f91568ca3f9b6abe30e6724d1be7ce53f085f6e8a93850817316f4e9e2c0e4fb81c3b29e104908a570d3b - languageName: node - linkType: hard - -"@jupyterlab/codeeditor@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/codeeditor@npm:4.2.5" - dependencies: - "@codemirror/state": ^6.4.1 - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/statusbar": ^4.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/dragdrop": ^2.1.4 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 + checksum: 16da413964f0b7aedf25f92a35a07815f2db1e0d0e1a995296012b62f28de8dff0784939dbf5823686f2fba1a70638a9edb7b60e5c1cbb37542020e46dee1888 + languageName: node + linkType: hard + +"@jupyterlab/codeeditor@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/codeeditor@npm:4.4.9" + dependencies: + "@codemirror/state": ^6.5.2 + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/statusbar": ^4.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/dragdrop": ^2.1.6 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 react: ^18.2.0 - checksum: 0b6f3f7a1fe02d2bb0b07571e03c6be645d58e182f3e1fcc5452e79dee8eab2097e13544eb461ff2bed72337bd335c539b8cb7cfe5f7bfd840163cc26d200c58 + checksum: 1e1e374a3fadf12c30b6239b20d19c00e704403c5ac1dc70f9a168f460bf67610525b4f3c4da606ada17eff5940fe28cf022415d6bd3aa1714751e00a0eddfe4 languageName: node linkType: hard -"@jupyterlab/codemirror@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/codemirror@npm:4.2.5" +"@jupyterlab/codemirror@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/codemirror@npm:4.4.9" dependencies: - "@codemirror/autocomplete": ^6.15.0 - "@codemirror/commands": ^6.3.3 + "@codemirror/autocomplete": ^6.18.6 + "@codemirror/commands": ^6.8.1 "@codemirror/lang-cpp": ^6.0.2 - "@codemirror/lang-css": ^6.2.1 - "@codemirror/lang-html": ^6.4.8 + "@codemirror/lang-css": ^6.3.1 + "@codemirror/lang-html": ^6.4.9 "@codemirror/lang-java": ^6.0.1 - "@codemirror/lang-javascript": ^6.2.2 + "@codemirror/lang-javascript": ^6.2.3 "@codemirror/lang-json": ^6.0.1 - "@codemirror/lang-markdown": ^6.2.4 + "@codemirror/lang-markdown": ^6.3.2 "@codemirror/lang-php": ^6.0.1 - "@codemirror/lang-python": ^6.1.4 + "@codemirror/lang-python": ^6.2.0 "@codemirror/lang-rust": ^6.0.1 - "@codemirror/lang-sql": ^6.6.1 + "@codemirror/lang-sql": ^6.8.0 "@codemirror/lang-wast": ^6.0.2 "@codemirror/lang-xml": ^6.1.0 - "@codemirror/language": ^6.10.1 - "@codemirror/legacy-modes": ^6.3.3 - "@codemirror/search": ^6.5.6 - "@codemirror/state": ^6.4.1 - "@codemirror/view": ^6.26.0 - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/codeeditor": ^4.2.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/documentsearch": ^4.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/translation": ^4.2.5 + "@codemirror/language": ^6.11.0 + "@codemirror/legacy-modes": ^6.5.1 + "@codemirror/search": ^6.5.10 + "@codemirror/state": ^6.5.2 + "@codemirror/view": ^6.38.1 + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/codeeditor": ^4.4.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/documentsearch": ^4.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/translation": ^4.4.9 "@lezer/common": ^1.2.1 "@lezer/generator": ^1.7.0 "@lezer/highlight": ^1.2.0 - "@lezer/markdown": ^1.2.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 + "@lezer/markdown": ^1.3.0 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 yjs: ^13.5.40 - checksum: 6c612c861dbc6a6acdc1887e7dd25d5029d1a40cda20735fb3f009867e27aacd0e2d05e9b01c71b3a6f9a35218d881159954e679806b118df24d90565b9c16c4 + checksum: 68cc6f265c990e33b2fd4122ca28cc7fc5b039d8a829a7513415ac7245ce9a9ff0183515e48b1bac0085507bddfd5666e45ae8fbfef6de90347a421d4341e4a4 languageName: node linkType: hard "@jupyterlab/console@npm:^3.0.0 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/console@npm:4.2.5" - dependencies: - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/cells": ^4.2.5 - "@jupyterlab/codeeditor": ^4.2.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/dragdrop": ^2.1.4 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 - checksum: 4f716339479f240fdebd74d05e7c90ed5b3c540861cce3c7bcbb3d0680d9581db5b8bfb63a7bb62fa45c7b054b6ef948632b6e877a7c058bb1bdbae0d966efe1 - languageName: node - linkType: hard - -"@jupyterlab/coreutils@npm:^6.2.5": - version: 6.2.5 - resolution: "@jupyterlab/coreutils@npm:6.2.5" - dependencies: - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 + version: 4.4.9 + resolution: "@jupyterlab/console@npm:4.4.9" + dependencies: + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/cells": ^4.4.9 + "@jupyterlab/codeeditor": ^4.4.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/dragdrop": ^2.1.6 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 + checksum: b33ea91c2c5b7887f8c4969b3919d7054cbdc260969d46bdf9dcaba7212d043a7b9667cc94860a8352dc2c2fa481de68268babaf34894a6b3f4b2494a7bd0950 + languageName: node + linkType: hard + +"@jupyterlab/coreutils@npm:^6.4.9": + version: 6.4.9 + resolution: "@jupyterlab/coreutils@npm:6.4.9" + dependencies: + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 minimist: ~1.2.0 path-browserify: ^1.0.0 url-parse: ~1.5.4 - checksum: 3b6a10b117ee82a437b6535801fe012bb5af7769a850be95c8ffa666ee2d6f7c29041ba546c9cfca0ab32b65f91c661570541f4f785f48af9022d08407c0a3e5 - languageName: node - linkType: hard - -"@jupyterlab/docmanager@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/docmanager@npm:4.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/docregistry": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@jupyterlab/statusbar": ^4.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 + checksum: 50c92dca8750c3a6bbe16c3a8af150db786636f15b0a0eba1e1f5ed2c0ae8ce06884cc7a580991c9d5f141000616c0fc5aa537e70974b0e19ad981a5cf21886b + languageName: node + linkType: hard + +"@jupyterlab/docmanager@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/docmanager@npm:4.4.9" + dependencies: + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/docregistry": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@jupyterlab/statusbar": ^4.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 react: ^18.2.0 - checksum: 0fa3fcbdccab2dfc5d9075dbd7fdf9a15c912843a3ed18c83248fd867d6f4c493c40f88964a406396fc335f60dc71e99df7465f38a94e7210bbdd209ae752d0c - languageName: node - linkType: hard - -"@jupyterlab/docregistry@npm:^3.0.0 || ^4.0.0, @jupyterlab/docregistry@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/docregistry@npm:4.2.5" - dependencies: - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/codeeditor": ^4.2.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 + checksum: afc18d693959975e36ca314454cd43411f97c04c4e7a7aad2756eb969485bf6744d7e8c5fb5bca4243c23a685d8c2c16c2bf37334be3a4259b1ee074808a1158 + languageName: node + linkType: hard + +"@jupyterlab/docregistry@npm:^3.0.0 || ^4.0.0, @jupyterlab/docregistry@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/docregistry@npm:4.4.9" + dependencies: + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/codeeditor": ^4.4.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 react: ^18.2.0 - checksum: 7e93987f4c6cd82058231c10c69a66aba38913c73f425a01c565a45e330e20dcb6f80489d3bd35d78b5b36a7798ed50485635fae3317b5c87d75ce30a144827e + checksum: d02e1f530166b50232dca590185bc9d19b75944624dc59e3abf4cfdfba3f8bc4de7f37283301f98721ebaacb93c7b3e017357de9f4d586ef475a42c13c3d2762 languageName: node linkType: hard -"@jupyterlab/documentsearch@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/documentsearch@npm:4.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 +"@jupyterlab/documentsearch@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/documentsearch@npm:4.4.9" + dependencies: + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 react: ^18.2.0 - checksum: 9f9726b4e779f04c29f5e3dea56c410152607f9c00f60eb1ece03cdcea4bf84d0ab0cfe6500496d9d8da33dbac187df5eda5eafbd840d173953de9b2173e9706 - languageName: node - linkType: hard - -"@jupyterlab/filebrowser@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/filebrowser@npm:4.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/docmanager": ^4.2.5 - "@jupyterlab/docregistry": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@jupyterlab/statusbar": ^4.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/dragdrop": ^2.1.4 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.2 + checksum: a2a8e5016300cd3c88dbd931a148a5394d0f20ab638b26dd43eb131a72b14d820fe2f955dc9f7afd01383ce0d8b4cb8cd1e1642e298c9f8044b7e2e54124b937 + languageName: node + linkType: hard + +"@jupyterlab/filebrowser@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/filebrowser@npm:4.4.9" + dependencies: + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/docmanager": ^4.4.9 + "@jupyterlab/docregistry": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@jupyterlab/statusbar": ^4.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/domutils": ^2.0.3 + "@lumino/dragdrop": ^2.1.6 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + "@lumino/widgets": ^2.7.1 + jest-environment-jsdom: ^29.3.0 react: ^18.2.0 - checksum: bce079263a141c76ec0a28be0d662c0a627ceaa12bcbe13be97a40f99abf37838fc87284701da1f6a7dce0be82f7322c8530f9fd9b3d1f4f253da5ddfa2e04ff + checksum: c58fcdddc370f254cca88c5d589e2c2d49b78d0d5d69a13344b65e68a6ef71f4c9e8d58b09e47dae815461df6a9c943707a24fe4d1966d2392aef0f6952e43cf languageName: node linkType: hard "@jupyterlab/logconsole@npm:^3.0.0 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/logconsole@npm:4.2.5" - dependencies: - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/outputarea": ^4.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/translation": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 - checksum: 20bf2cb330743b3356bf56d53cda61ab080bc3c77272076197c7f259e3382f0affde75cf2035b91343dbb11d8e4e32c36892f171cd535b4eb66e95c0d7e4f577 - languageName: node - linkType: hard - -"@jupyterlab/lsp@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/lsp@npm:4.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/codeeditor": ^4.2.5 - "@jupyterlab/codemirror": ^4.2.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/docregistry": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/translation": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 + version: 4.4.9 + resolution: "@jupyterlab/logconsole@npm:4.4.9" + dependencies: + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/outputarea": ^4.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/translation": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 + checksum: e9261c88403ee04fb59a8d90772982000f038220272233a8bc1b1629cb848ba65b25f5703b9f6e3ecd61f7d3cb5665f4379c40d82f84cb770ebd5dfa8e0eea67 + languageName: node + linkType: hard + +"@jupyterlab/lsp@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/lsp@npm:4.4.9" + dependencies: + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/codeeditor": ^4.4.9 + "@jupyterlab/codemirror": ^4.4.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/docregistry": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/translation": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 lodash.mergewith: ^4.6.1 vscode-jsonrpc: ^6.0.0 vscode-languageserver-protocol: ^3.17.0 vscode-ws-jsonrpc: ~1.0.2 - checksum: 8dfaeb330a6b72b32f8eae6b5d4c3c0ff64203fe5fd69dbfbe15e22c46851a9fbc8c968608e4a6cd887760e194d4e4bb757135aff2df4eaee31acf248d603e9a + checksum: c89fb34f14ce7e6cbfba931eb4c60060a12ef1e4acb72c8d46a3e05ca931e30fd63f67d80cc392c1327802756246c34637965ae18ffad54160208f6f33527406 languageName: node linkType: hard "@jupyterlab/mainmenu@npm:^3.0.0 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/mainmenu@npm:4.2.5" + version: 4.4.9 + resolution: "@jupyterlab/mainmenu@npm:4.4.9" dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/widgets": ^2.3.2 - checksum: 7da87425108d707d14d3d29fdd5b4d9334eb61a2b38ec98ee790a8436c780959742c09bb1047fe3c7cb2408e29d0e89dcdd979baa0f71d6a6b240480baa4650d + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/widgets": ^2.7.1 + checksum: 7ef4885ef8189ab42eb39f76f44ebcd82d11ceec42ca561465a11d94f8ffd7225db8b5ca4b2dbce4b984a5f900a91ee7544c2a6d1baf1937ca5bc560f4a16132 languageName: node linkType: hard -"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0, @jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/nbformat@npm:4.2.5" +"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0, @jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/nbformat@npm:4.4.9" dependencies: - "@lumino/coreutils": ^2.1.2 - checksum: b3ad2026969bfa59f8cfb7b1a991419f96f7e6dc8c4acf4ac166c210d7ab99631350c785e9b04350095488965d2824492c8adbff24a2e26db615457545426b3c + "@lumino/coreutils": ^2.2.1 + checksum: 59c73ac19ebd8d121e85916af91fc2b42e71f24d52bb7b1ac3efe58965d279edd8050934bc1079d7986c1fc061aae007e741e6889ea9a4e2f58f56b8e9c42e83 languageName: node linkType: hard "@jupyterlab/notebook@npm:^3.0.0 || ^4.0.0": - version: 4.2.5 - resolution: "@jupyterlab/notebook@npm:4.2.5" - dependencies: - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/cells": ^4.2.5 - "@jupyterlab/codeeditor": ^4.2.5 - "@jupyterlab/codemirror": ^4.2.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/docregistry": ^4.2.5 - "@jupyterlab/documentsearch": ^4.2.5 - "@jupyterlab/lsp": ^4.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/settingregistry": ^4.2.5 - "@jupyterlab/statusbar": ^4.2.5 - "@jupyterlab/toc": ^6.2.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/dragdrop": ^2.1.4 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.2 + version: 4.4.9 + resolution: "@jupyterlab/notebook@npm:4.4.9" + dependencies: + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/cells": ^4.4.9 + "@jupyterlab/codeeditor": ^4.4.9 + "@jupyterlab/codemirror": ^4.4.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/docregistry": ^4.4.9 + "@jupyterlab/documentsearch": ^4.4.9 + "@jupyterlab/lsp": ^4.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/settingregistry": ^4.4.9 + "@jupyterlab/statusbar": ^4.4.9 + "@jupyterlab/toc": ^6.4.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/domutils": ^2.0.3 + "@lumino/dragdrop": ^2.1.6 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + "@lumino/widgets": ^2.7.1 react: ^18.2.0 - checksum: 1c91b42e890407574451903af7d48db8c216fa9e27ecc4e60ee76366572029ff73be3974085427b72eaedf67e718a7d4f93207f7b66dd3cf27a0b51172ca7727 + checksum: aa385be275f7268fb718b565a5e0cd713d121f8f9279ae69cbcb7f27189ac8137f2ce5ccbea568a29625daf12631b2e5d1cf14f7b80389c27acb0441103a4479 languageName: node linkType: hard -"@jupyterlab/observables@npm:^5.2.5": - version: 5.2.5 - resolution: "@jupyterlab/observables@npm:5.2.5" +"@jupyterlab/observables@npm:^5.2.1, @jupyterlab/observables@npm:^5.4.9": + version: 5.4.9 + resolution: "@jupyterlab/observables@npm:5.4.9" dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - checksum: 21fd2828463c08a770714692ff44aeca500f8ea8f3a743ad203a61fbf04cfa81921a47b432d8e65f4935fb45c08fce2b8858cb7e2198cc9bf0fa51f482ec37bd + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + checksum: ce7705d469bb1d1358c15c8797cb89cb4a5f22171c17f503cfab72f19e6c73ebeae627d8b26b0e75b68a7b749c463357ea32ee8fdb9689608d03da68d501e88d languageName: node linkType: hard -"@jupyterlab/outputarea@npm:^3.0.0 || ^4.0.0, @jupyterlab/outputarea@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/outputarea@npm:4.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/translation": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 - checksum: 0e2834244dfc12491d7207e9749c92caaa44424e5541cb227f5933a61884e6d42c67791f5c8982cbefebf6b7ce94fe595e633571d9ebc381dd130616899a4291 +"@jupyterlab/outputarea@npm:^3.0.0 || ^4.0.0, @jupyterlab/outputarea@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/outputarea@npm:4.4.9" + dependencies: + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/translation": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 + checksum: 90834b8130d08282c623903a79becd87e1d909320501fa849101d1882b7cdf0addcaa51e30550e0840f70b37e9ec5f77e5c3845c6b0b7fc334ad5c908ebe89f5 languageName: node linkType: hard -"@jupyterlab/rendermime-interfaces@npm:^3.0.0 || ^4.0.0, @jupyterlab/rendermime-interfaces@npm:^3.10.5": - version: 3.10.5 - resolution: "@jupyterlab/rendermime-interfaces@npm:3.10.5" +"@jupyterlab/rendermime-interfaces@npm:^3.0.0 || ^4.0.0, @jupyterlab/rendermime-interfaces@npm:^3.12.9": + version: 3.12.9 + resolution: "@jupyterlab/rendermime-interfaces@npm:3.12.9" dependencies: - "@lumino/coreutils": ^1.11.0 || ^2.1.2 - "@lumino/widgets": ^1.37.2 || ^2.3.2 - checksum: acfb10315a3ed4d0b0ef664437b33f8938968c61993351fd4067b0eaf6cb6ccd4c5caf50ae050d184a34b35b88d844eee6689d00244e54a02b228c02eab544b4 + "@lumino/coreutils": ^1.11.0 || ^2.2.1 + "@lumino/widgets": ^1.37.2 || ^2.7.1 + checksum: c0db30ed6ea584d59d397857bb61ef36a15b166bbdaf80eafdf1a731c5a95589663ed7c3a7de698397b16348251b22e23dc90399a41d19d4993fba98964d4dea languageName: node linkType: hard -"@jupyterlab/rendermime@npm:^3.0.0 || ^4.0.0, @jupyterlab/rendermime@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/rendermime@npm:4.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/translation": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 +"@jupyterlab/rendermime@npm:^3.0.0 || ^4.0.0, @jupyterlab/rendermime@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/rendermime@npm:4.4.9" + dependencies: + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/translation": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 lodash.escape: ^4.0.1 - checksum: e3e68c66306dc4bc7d4497d017e9e32cbfacfdc3ba14da6dfa6d7dbd328a3e8d5b710260365a06cd508209393e21985e7a69d0a160e239e4fdc1f0eb0874f35c + checksum: 1d32ab4deb855b35d4827143daea939b16e69b03c66490aea8472de9bab383de29c81ef8d5cd3a5a2e5e185f0b747b2091ab02344abcdc99dbc5a565501b2af2 languageName: node linkType: hard -"@jupyterlab/services@npm:^6 || ^7, @jupyterlab/services@npm:^6.0.0 || ^7.0.0, @jupyterlab/services@npm:^7.2.5": - version: 7.2.5 - resolution: "@jupyterlab/services@npm:7.2.5" +"@jupyterlab/services@npm:^6 || ^7, @jupyterlab/services@npm:^6.0.0 || ^7.0.0, @jupyterlab/services@npm:^7.4.9": + version: 7.4.9 + resolution: "@jupyterlab/services@npm:7.4.9" dependencies: - "@jupyter/ydoc": ^2.0.1 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/settingregistry": ^4.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/settingregistry": ^4.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/polling": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 ws: ^8.11.0 - checksum: 72d7578a86af1277b574095423fafb4176bc66373662fdc0e243a7d20e4baf8f291377b6c80300841dba6486767f16664f0e893174c2761658aedb74024e1db6 + checksum: b1af994a2b752ed0ea60e5a53b85da3bb8a1d702407029a2ea747877a36aed142bc1d605bdef8e8f2002dc3d1ed516c2d77945dc9906cfcb58b957b9b2f6de22 languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^3.0.0 || ^4.0.0, @jupyterlab/settingregistry@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/settingregistry@npm:4.2.5" - dependencies: - "@jupyterlab/nbformat": ^4.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 +"@jupyterlab/settingregistry@npm:^3.0.0 || ^4.0.0, @jupyterlab/settingregistry@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/settingregistry@npm:4.4.9" + dependencies: + "@jupyterlab/nbformat": ^4.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 "@rjsf/utils": ^5.13.4 ajv: ^8.12.0 json5: ^2.2.3 peerDependencies: react: ">=16" - checksum: 2403e3198f2937fb9e4c12f96121e8bfc4f2a9ed47a9ad64182c88c8c19d59fcdf7443d0bf7d04527e89ac06378ceb39d6b4196c7f575c2a21fea23283ad3892 + checksum: f1937b8ba0486d2ebd1a7c5573c8b1cdf42aaacdfd644f1697e30c3c6d36c66faf6218908102287571d095b4e4c5d647feb1364290213c9d3f9a3ff4c74f3c73 languageName: node linkType: hard -"@jupyterlab/statedb@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/statedb@npm:4.2.5" +"@jupyterlab/statedb@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/statedb@npm:4.4.9" dependencies: - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - checksum: 236e7628070971af167eb4fdeac96a0090b2256cfa14b6a75aee5ef23b156cd57a8b25518125fbdc58dea09490f8f473740bc4b454d8ad7c23949f64a61b757e + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + checksum: ec53df2570c03f3ba7e40fb0a30eb2da441c196d6261a7f347529e211b71775fa90e9174d8d3f473a0af6bc1a4e269f3edceffe5755f7f0f0557a7a645ace8be languageName: node linkType: hard -"@jupyterlab/statusbar@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/statusbar@npm:4.2.5" - dependencies: - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 - react: ^18.2.0 - checksum: fa429b88a5bcd6889b9ac32b5f2500cb10a968cc636ca8dede17972535cc47454cb7fc96518fc8def76935f826b66b071752d0fd26afdacba579f6f3785e97b2 - languageName: node - linkType: hard - -"@jupyterlab/toc@npm:^6.2.5": - version: 6.2.5 - resolution: "@jupyterlab/toc@npm:6.2.5" - dependencies: - "@jupyterlab/apputils": ^4.3.5 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/docregistry": ^4.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime": ^4.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/translation": ^4.2.5 - "@jupyterlab/ui-components": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.2 - react: ^18.2.0 - checksum: 49e856b710369308bdf2cc00c9025fa4c9942d221e8a97c548843113e321e78f4f0ef44115605ba01331732b2f4c2574c0e42ba7b53466c8c52a89ecbf00feb0 - languageName: node - linkType: hard - -"@jupyterlab/translation@npm:^3.0.0 || ^4.0.0, @jupyterlab/translation@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/translation@npm:4.2.5" +"@jupyterlab/statusbar@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/statusbar@npm:4.4.9" dependencies: - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/services": ^7.2.5 - "@jupyterlab/statedb": ^4.2.5 - "@lumino/coreutils": ^2.1.2 - checksum: 8983efad2b0d54381cb94799a10eab30f284a87103f93e844bd87106e2df3c304e260b9c95540317819cc2b2520c74ad78cb724816c81e0c315fdb43d0bdaab3 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 + react: ^18.2.0 + checksum: c74382d378990e34323ad046d79985da7885af154d6bdaaad1c8e12175058978c9b2698956bad32a9592d6d543968567af1cd1eb7412d594e8ee3279675617fc languageName: node linkType: hard -"@jupyterlab/ui-components@npm:^4.2.5": - version: 4.2.5 - resolution: "@jupyterlab/ui-components@npm:4.2.5" - dependencies: - "@jupyter/react-components": ^0.15.3 - "@jupyter/web-components": ^0.15.3 - "@jupyterlab/coreutils": ^6.2.5 - "@jupyterlab/observables": ^5.2.5 - "@jupyterlab/rendermime-interfaces": ^3.10.5 - "@jupyterlab/translation": ^4.2.5 - "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.2 +"@jupyterlab/toc@npm:^6.4.9": + version: 6.4.9 + resolution: "@jupyterlab/toc@npm:6.4.9" + dependencies: + "@jupyter/react-components": ^0.16.6 + "@jupyterlab/apputils": ^4.5.9 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/docregistry": ^4.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/translation": ^4.4.9 + "@jupyterlab/ui-components": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/widgets": ^2.7.1 + react: ^18.2.0 + checksum: e548f940cef829fafa0c5f71ba5c7574967ab9b5df4c7dcc223795c303b74e3fc5f710194a405987dd41c0aae658c57e7413ff362750369656beb6d39b5a9f11 + languageName: node + linkType: hard + +"@jupyterlab/translation@npm:^3.0.0 || ^4.0.0, @jupyterlab/translation@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/translation@npm:4.4.9" + dependencies: + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/services": ^7.4.9 + "@jupyterlab/statedb": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + checksum: 9747def9f9d6d0cf4400e615ac837ccc759e0a43adc87a97e4fa91220215bfd5ce88f3af777f9bbc9fe07f950fb85714c7ff555f2df02dc8aa30a2dcda71e3c1 + languageName: node + linkType: hard + +"@jupyterlab/ui-components@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/ui-components@npm:4.4.9" + dependencies: + "@jupyter/react-components": ^0.16.6 + "@jupyter/web-components": ^0.16.6 + "@jupyterlab/coreutils": ^6.4.9 + "@jupyterlab/observables": ^5.4.9 + "@jupyterlab/rendermime-interfaces": ^3.12.9 + "@jupyterlab/translation": ^4.4.9 + "@lumino/algorithm": ^2.0.3 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/polling": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + "@lumino/widgets": ^2.7.1 "@rjsf/core": ^5.13.4 "@rjsf/utils": ^5.13.4 react: ^18.2.0 @@ -1736,7 +1820,7 @@ __metadata: typestyle: ^2.0.4 peerDependencies: react: ^18.2.0 - checksum: 9d2b887910a3b0d41645388c5ac6183d6fd2f3af4567de9b077b2492b1a9380f98c4598a4ae6d1c3186624ed4f956bedf8ba37adb5f772c96555761384a93e1e + checksum: 84c3e71b27a4a8031963c1e0f27b2409b781a1bc2ade569fa08e05a1263172ef7cd2664fe8e670ce3f704e2bec7a56fd21ecff1b6616062d34ddd632f049d606 languageName: node linkType: hard @@ -2552,36 +2636,36 @@ __metadata: linkType: hard "@lezer/cpp@npm:^1.0.0": - version: 1.1.2 - resolution: "@lezer/cpp@npm:1.1.2" + version: 1.1.3 + resolution: "@lezer/cpp@npm:1.1.3" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: a319cd46fd32affc07c9432e9b2b9954becf7766be0361176c525d03474bb794cc051aad9932f48c9df33833eee1d6bfdccab12e571f2b137b4ca765c60c75de + checksum: 87b48d89f3cd60c5a5c4368ea394fe7e27abb6ec9e6f8b7b4d005e3dd4d5268eb4e1c3a8a58807f63d18043ccfdc864965b9787c1274260999167d447cf562c3 languageName: node linkType: hard "@lezer/css@npm:^1.1.0, @lezer/css@npm:^1.1.7": - version: 1.1.9 - resolution: "@lezer/css@npm:1.1.9" + version: 1.3.0 + resolution: "@lezer/css@npm:1.3.0" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 - "@lezer/lr": ^1.0.0 - checksum: 25c63475061a3c9f87961a7f85c5f547f14fb7e81b0864675d2206999a874a0559d676145c74c6ccde39519dbc8aa33e216265f5366d08060507b6c9e875fe0f + "@lezer/lr": ^1.3.0 + checksum: 952cdbee844c1cd6097c3de4ee073861d05ea1edf10815a58c1d29ee8337fd053b7758944bd48dd418c13bc204ab8666554c3be0560ecb31a65cc438e52e0590 languageName: node linkType: hard "@lezer/generator@npm:^1.7.0": - version: 1.7.1 - resolution: "@lezer/generator@npm:1.7.1" + version: 1.8.0 + resolution: "@lezer/generator@npm:1.8.0" dependencies: "@lezer/common": ^1.1.0 "@lezer/lr": ^1.3.0 bin: lezer-generator: src/lezer-generator.cjs - checksum: e46df5a31252fb036ea17fce820acdf47672bb5405b2a38e26a430182b9a50b8513fde37d9a43d8334cde3bb2f2106ce7a5ab1a01e244876ce3217c4db59e627 + checksum: 2c4e6550bd282efd190100887d107d9e3e4cd87ba47cdb5488f84919f35b2cbb2fb845798017204f2fb3bb5dad6b6300fa45612731f8122960bd7a5346c785a5 languageName: node linkType: hard @@ -2594,14 +2678,14 @@ __metadata: languageName: node linkType: hard -"@lezer/html@npm:^1.3.0": - version: 1.3.10 - resolution: "@lezer/html@npm:1.3.10" +"@lezer/html@npm:^1.3.12": + version: 1.3.12 + resolution: "@lezer/html@npm:1.3.12" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: cce391aab9259704ae3079b3209f74b2f248594dd8b851c28aaff26765e00ebb890a5ff1fe600f2d03aaf4ade0e36de8048d9632b12bfbccd47b3e649c3b0ecd + checksum: 894b547555cd7d3dbf17c7022c4067a207241d6d493728ae2f79f6b9245803c1acec98fe89e593289ddcce9e9b6a90d8090be1a7090367bdbc38930aa9ee19a0 languageName: node linkType: hard @@ -2617,24 +2701,24 @@ __metadata: linkType: hard "@lezer/javascript@npm:^1.0.0": - version: 1.4.19 - resolution: "@lezer/javascript@npm:1.4.19" + version: 1.5.4 + resolution: "@lezer/javascript@npm:1.5.4" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.1.3 "@lezer/lr": ^1.3.0 - checksum: e305680dea6659570b88eded0d03eba3d33bb8860f8646b457798da955742916dd9cbe17fe6dd867bdb7767ef6c00717aadd45e520ee0b416bdc5e39046e6459 + checksum: 0b126907d5850fb2b29d199af67fc9c4864141f4d46b222878609dffb80f2a012028d9b3495d992f30d73fbc7ffe57ed2e35ff9cc1807cb512b807a51d4d0a03 languageName: node linkType: hard "@lezer/json@npm:^1.0.0": - version: 1.0.2 - resolution: "@lezer/json@npm:1.0.2" + version: 1.0.3 + resolution: "@lezer/json@npm:1.0.3" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: f899d13765d95599c9199fc3404cb57969031dc40ce07de30f4e648979153966581f0bee02e2f8f70463b0a5322206a97c2fe8d5d14f218888c72a6dcedf90ef + checksum: 48e7b945fdfa2b5b6f862e27bc31f3991cba93f18df7fed0059b25f119b64dedd50bbc709d279e16e2b3eee10e7758d7d80c6d98d21bc15c284809d268837897 languageName: node linkType: hard @@ -2647,35 +2731,35 @@ __metadata: languageName: node 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" +"@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.3.0": + version: 1.4.3 + resolution: "@lezer/markdown@npm:1.4.3" dependencies: "@lezer/common": ^1.0.0 "@lezer/highlight": ^1.0.0 - checksum: b5cbb857a90411e174e7ad23433756a81cf2ab422ef749e529211e078ed4061b4595fa8cbcca56119919c0b2735e8ecac11ff34768d64cb90e599fde2bc6c730 + checksum: d730c5b273f0fc9df0658c338f007e00838aa87d7ecdda181eb5def5253cf76aaac0671ef03e7459fd179128e77c2e8d74c2dc43402ee21cebb4fb9dd7db89c7 languageName: node linkType: hard "@lezer/php@npm:^1.0.0": - version: 1.0.2 - resolution: "@lezer/php@npm:1.0.2" + version: 1.0.5 + resolution: "@lezer/php@npm:1.0.5" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.1.0 - checksum: c85ef18571d37826b687dd141a0fe110f5814adaf9d1a391e7e482020d7f81df189ca89ec0dd141c1433d48eff4c6e53648b46f008dea8ad2dc574f35f1d4d79 + checksum: 68375ddc7b8c37165e454d3c5d17c7da9de60866aa0ffa137a76d0c1eadacd1fdeefa793a053e48407d762bc75abd10c828e7d851f18a7fbbcd9b94bd506ae50 languageName: node linkType: hard "@lezer/python@npm:^1.1.4": - version: 1.1.14 - resolution: "@lezer/python@npm:1.1.14" + version: 1.1.18 + resolution: "@lezer/python@npm:1.1.18" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 1608187f698e972d11b340dfdfd79e15b1359641e386e386befd37d5e5839620b45a5a39c5616792a24da29ef1d99d11ea0dad52b9617f1767e7ea6a11c2fed3 + checksum: 774d5bee83106b586159e3330452e9a3a72706d98d77929c44480a653ed560a80db2aa8f2f270858d176ac8e7187f0c585109fdac579deca115173dcaee13f9f languageName: node linkType: hard @@ -2691,187 +2775,170 @@ __metadata: linkType: hard "@lezer/xml@npm:^1.0.0": - version: 1.0.5 - resolution: "@lezer/xml@npm:1.0.5" + version: 1.0.6 + resolution: "@lezer/xml@npm:1.0.6" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: a0a077b9e455b03593b93a7fdff2a4eab2cb7b230c8e1b878a8bebe80184632b9cc75ca018f1f9e2acb3a26e1386f4777385ab6e87aea70ccf479cde5ca268ee - languageName: node - linkType: hard - -"@ljharb/through@npm:^2.3.13": - version: 2.3.13 - resolution: "@ljharb/through@npm:2.3.13" - dependencies: - call-bind: ^1.0.7 - checksum: 0255464a0ec7901b08cff3e99370b87e66663f46249505959c0cb4f6121095d533bbb7c7cda338063d3e134cbdd721e2705bc18eac7611b4f9ead6e7935d13ba + checksum: 71217d49b9207bd19d69ae98ad406d0c7ff395b6ad118528f3f81455f973e01597cac1ffa2741f2c6739d4ede17edb49573eaa3246f8f5a6da4d97dcb940309d languageName: node linkType: hard -"@lumino/algorithm@npm:^1.9.1 || ^2.1, @lumino/algorithm@npm:^1.9.2": - version: 1.9.2 - resolution: "@lumino/algorithm@npm:1.9.2" - checksum: a89e7c63504236119634858e271db1cc649684d30ced5a6ebe2788af7c0837f1e05a6fd3047d8525eb756c42ce137f76b3688f75fd3ef915b71cd4f213dfbb96 +"@lumino/algorithm@npm:^1 || ^2, @lumino/algorithm@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/algorithm@npm:2.0.3" + checksum: 03932cdc39d612a00579ee40bafb0b1d8bf5f8a12449f777a1ae7201843ddefb557bc3f9260aa6b9441d87bfc43e53cced854e71c4737de59e32cd00d4ac1394 languageName: node linkType: hard -"@lumino/algorithm@npm:^2.0.1": -"@lumino/algorithm@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/algorithm@npm:2.0.1" - checksum: cbf7fcf6ee6b785ea502cdfddc53d61f9d353dcb9659343511d5cd4b4030be2ff2ca4c08daec42f84417ab0318a3d9972a17319fa5231693e109ab112dcf8000 +"@lumino/application@npm:^2.4.4": + version: 2.4.4 + resolution: "@lumino/application@npm:2.4.4" + dependencies: + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/widgets": ^2.7.1 + checksum: 3223d145172d2d7a793e038631463fdb8c70d46f8343512d452a90f54ac70c6004462ded66edba3313038888f8271ad186feb63918620b27bde500eaa9f33d95 languageName: node linkType: hard -"@lumino/application@npm:^2.3.1": - version: 2.3.1 - resolution: "@lumino/application@npm:2.3.1" +"@lumino/collections@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/collections@npm:2.0.3" dependencies: - "@lumino/commands": ^2.3.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/widgets": ^2.3.2 - checksum: c112789d99baf62e5c2cee98834bc3efb5027bbca1aac81f10ea8855c0cd2538ec0a7c56c3f5dd42dce244e6892ef5bf8ef356f97e1cd4c161b99eb2068c195c + "@lumino/algorithm": ^2.0.3 + checksum: 1c7aca239731e6c7379ce593318fd3f646b38c1903e81e884e36ed01f61017498f6699ba58848c43191f4825a9968b7f9c94e9355f1614c9baee84ce9ea6221f languageName: node linkType: hard -"@lumino/collections@npm:^1.9.3": - version: 1.9.3 - resolution: "@lumino/collections@npm:1.9.3" +"@lumino/commands@npm:^2.3.2": + version: 2.3.2 + resolution: "@lumino/commands@npm:2.3.2" dependencies: - "@lumino/algorithm": ^1.9.2 - checksum: 1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/domutils": ^2.0.3 + "@lumino/keyboard": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + checksum: 090454bcc07aeb71f0791d6ca86ca4857b16bb6286a47ab6e59c3046e7f99cd3ef27c36d2dd35de7cf2bdeeaf5fc00ae8f29246a39e276eac2d186ae3cd7023e languageName: node linkType: hard -"@lumino/collections@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/collections@npm:2.0.1" +"@lumino/coreutils@npm:^1 || ^2, @lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.2.1, @lumino/coreutils@npm:^1.11.1 || ^2.1, @lumino/coreutils@npm:^2.2.1": + version: 2.2.1 + resolution: "@lumino/coreutils@npm:2.2.1" dependencies: - "@lumino/algorithm": ^2.0.1 - checksum: 8a29b7973a388a33c5beda0819dcd2dc2aad51a8406dcfd4581b055a9f77a39dc5800f7a8b4ae3c0bb97ae7b56a7a869e2560ffb7a920a28e93b477ba05907d6 + "@lumino/algorithm": ^2.0.3 + checksum: d08570d1ebcf6bca973ba3af0836fb19a5a7a5b24979e90aab0fb4acb245e9619a0db356a78d67f618ae565435bb2aaf7c158c5bc0ae1ef9e9f1638ebfa05484 languageName: node linkType: hard -"@lumino/commands@npm:^2.3.0": - version: 2.3.0 - resolution: "@lumino/commands@npm:2.3.0" +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^1.10.1 || ^2.1, @lumino/disposable@npm:^2.1.4": + version: 2.1.4 + resolution: "@lumino/disposable@npm:2.1.4" dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/keyboard": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - checksum: a9b83bbfcc0421ff501e818dd234c65db438a8abb450628db0dea9ee05e8077d10b2275e7e2289f6df9c20dc26d2af458b1db88ccf43ec69f185eb207dbad419 + "@lumino/signaling": ^2.1.4 + checksum: 0274c1cd81683f0d37c79795ed683fe49929452e6f075b9027b62dee376b5c6aa5f27b279236c4e1621bcbdcb844d5be0bbde3a065ab39159deb995244d1d2a7 languageName: node linkType: hard -"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.2, @lumino/coreutils@npm:^1.11.1 || ^2, @lumino/coreutils@npm:^1.11.1 || ^2.1, @lumino/coreutils@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/coreutils@npm:2.1.2" - checksum: 7865317ac0676b448d108eb57ab5d8b2a17c101995c0f7a7106662d9fe6c859570104525f83ee3cda12ae2e326803372206d6f4c1f415a5b59e4158a7b81066f +"@lumino/domutils@npm:^1 || ^2, @lumino/domutils@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/domutils@npm:2.0.3" + checksum: 46cbcbd38f6abb53eab1b6de0a2ea8a9fa5e28b0f5aa4b058c35f2380cb8ec881fe7616c7468ba200b785f95357ac8cbac6b64512f9945f5973d1d425864b163 languageName: node linkType: hard -"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^1.10.1 || ^2.1, @lumino/disposable@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/disposable@npm:2.1.2" +"@lumino/dragdrop@npm:^2.1.6": + version: 2.1.6 + resolution: "@lumino/dragdrop@npm:2.1.6" dependencies: - "@lumino/signaling": ^2.1.3 - checksum: b9a346fa2752b3cd1b053cb637ee173501d33082a73423429070e8acc508b034ea0babdae0549b923cbdd287ee1fc7f6159f0539c9fff7574393a214eef07c57 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + checksum: 5a746ee0644e2fa02cba47d6ef45f3fb09ebc3391ac0f478f6f3073864a9637e13fcee666038c751ab8f17bc69c55299c85a88f526ea645cc3240a367490c8ca languageName: node linkType: hard -"@lumino/domutils@npm:^1 || ^2, @lumino/domutils@npm:^2.0.1, @lumino/domutils@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/domutils@npm:2.0.2" - checksum: 037b8d0b62af43887fd7edd506fa551e2af104a4b46d62e6fef256e16754dba40d351513beb5083834d468b2c7806aae0fe205fd6aac8ef24759451ee998bbd9 +"@lumino/keyboard@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/keyboard@npm:2.0.3" + checksum: ca648cf978ddcf15fe3af2b8c8beb8aff153dfe616099df5a8bc7f43124420f77c358dbd33a988911b82f68debe07268d630c1777618b182ef7b520962d653e7 languageName: node linkType: hard -"@lumino/dragdrop@npm:^2.1.4, @lumino/dragdrop@npm:^2.1.5": - version: 2.1.5 - resolution: "@lumino/dragdrop@npm:2.1.5" +"@lumino/messaging@npm:^1 || ^2, @lumino/messaging@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/messaging@npm:2.0.3" dependencies: - "@lumino/coreutils": ^2.2.0 - "@lumino/disposable": ^2.1.3 - checksum: 48e34bea73186dcde4565fa68cd25067b7f5fe910813d28da9ab3c5392bfaa0b26aab1290635dc953d85bbb139da7ac1ffc040a5d5777d58fd087975dd4b5ef7 - languageName: node - linkType: hard - -"@lumino/keyboard@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/keyboard@npm:2.0.2" - checksum: 198e8c17825c9a831fa0770f58a71574b936acb0f0bbbe7f8feb73d89686dda7ff41fcb02d12b401f5d462b45fe0bba24f7f38befb7cefe0826576559f0bee6d + "@lumino/algorithm": ^2.0.3 + "@lumino/collections": ^2.0.3 + checksum: 9c2bea2a31d3922a29276df751b651e6bd41d1ed3a5f61ba94d3e90d454c53f07fc4dac7d435867fb8480415222a3d45d74188dd73e9c89c43110ebbee0ff301 languageName: node linkType: hard -"@lumino/messaging@npm:^1 || ^2, @lumino/messaging@npm:^2.0.1, @lumino/messaging@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/messaging@npm:2.0.2" +"@lumino/polling@npm:^2.1.4": + version: 2.1.4 + resolution: "@lumino/polling@npm:2.1.4" dependencies: - "@lumino/algorithm": ^2.0.2 - "@lumino/collections": ^2.0.2 - checksum: 66abd8c473026123589dc22f2ce8f85da10e0b1a05c05ed9b2011035721da5f751cc7ef63b628877f446a78a4287e26ad1450efbeaf0c2e03b1d08be9abaca4d + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 + checksum: e08d07d11eb030fed83bea232dba91af4ea40ef8f6ec7b8fe61722ebbd29faba10c67d269596c19c515c920f607c73bb64cdc9319af9ecef4619cddfd92ea764 languageName: node linkType: hard -"@lumino/polling@npm:^2.1.2": - version: 2.1.3 - resolution: "@lumino/polling@npm:2.1.3" - dependencies: - "@lumino/coreutils": ^2.2.0 - "@lumino/disposable": ^2.1.3 - "@lumino/signaling": ^2.1.3 - checksum: 2c94dbc2339dd06b3b89a3a690d23576ce095f92bf1f614557dcaeb1c1a8a707b2a18d78c03e5fd7376a43e3f393cc4fec42a65580ae4b67c6630ea86cecbac6 +"@lumino/properties@npm:^2.0.1, @lumino/properties@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/properties@npm:2.0.3" + checksum: a575d821f994090907abb567d3af21a828f528ae5f329ada92719eba9818bbb2b0955e675b91bd392043a5d835c345d7b500994a77157c5ea317f36442ce570e languageName: node linkType: hard -"@lumino/properties@npm:^2.0.1, @lumino/properties@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/properties@npm:2.0.2" - checksum: cbe802bd49ced7e13e50b1d89b82e0f03fb44a590c704e6b9343226498b21d8abfe119b024209e79876b4fc0938dbf85e964c6c4cd5bbdd4d7ba41ce0fb69f3f +"@lumino/signaling@npm:^1 || ^2, @lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^1.10.1 || ^2.1, @lumino/signaling@npm:^2.1.4": + version: 2.1.4 + resolution: "@lumino/signaling@npm:2.1.4" + dependencies: + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + checksum: 554a5135c8742ed3f61a4923b1f26cb29b55447ca5939df70033449cfb654a37048d7a3e2fd0932497099cd24501a3819b85cd1fdf4e76023ba0af747c171d53 languageName: node linkType: hard -"@lumino/signaling@npm:^1 || ^2, @lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.2, @lumino/signaling@npm:^2.1.3": - version: 2.1.3 - resolution: "@lumino/signaling@npm:2.1.3" +"@lumino/virtualdom@npm:^2.0.3": + version: 2.0.3 + resolution: "@lumino/virtualdom@npm:2.0.3" dependencies: - "@lumino/algorithm": ^2.0.2 - "@lumino/coreutils": ^2.2.0 - checksum: ce59383bd75fe30df5800e0442dbc4193cc6778e2530b9be0f484d159f1d8668be5c6ee92cee9df36d5a0c3dbd9126d0479a82581dee1df889d5c9f922d3328d + "@lumino/algorithm": ^2.0.3 + checksum: 66c18494fdfc1b87e76286140cd256b3616aede262641912646a18395226e200048ddeaa6d1644dff3f597b1cde8e583968cb973d64a9e9d4f45e2b24c1e2c7c languageName: node linkType: hard -"@lumino/virtualdom@npm:^2.0.1, @lumino/virtualdom@npm:^2.0.2": - version: 2.0.2 - resolution: "@lumino/virtualdom@npm:2.0.2" +"@lumino/widgets@npm:^1 || ^2, @lumino/widgets@npm:^1.30.0 || ^2.1, @lumino/widgets@npm:^1.37.2 || ^2.7.1, @lumino/widgets@npm:^2.7.1": + version: 2.7.1 + resolution: "@lumino/widgets@npm:2.7.1" dependencies: - "@lumino/algorithm": ^2.0.2 - checksum: 0e1220d5b3b2441e7668f3542a6341e015bdbea0c8bd6d4be962009386c034336540732596d5dedcd54ca57fbde61c2942549129a3e1b0fccb1aa143685fcd15 + "@lumino/algorithm": ^2.0.3 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/domutils": ^2.0.3 + "@lumino/dragdrop": ^2.1.6 + "@lumino/keyboard": ^2.0.3 + "@lumino/messaging": ^2.0.3 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + "@lumino/virtualdom": ^2.0.3 + checksum: c57f7e6cfbaddbd830e14db55242dcbdf531524cdf8641214ce737f43a6684004219eb58a572838f99f78af433bb8f9f19fd2ac6f0ffab4a635bd20164b75cec languageName: node linkType: hard -"@lumino/widgets@npm:^1 || ^2, @lumino/widgets@npm:^1.37.2 || ^2.3.2, @lumino/widgets@npm:^2.3.2, @lumino/widgets@npm:^2.5.0": - version: 2.5.0 - resolution: "@lumino/widgets@npm:2.5.0" - dependencies: - "@lumino/algorithm": ^2.0.2 - "@lumino/commands": ^2.3.1 - "@lumino/coreutils": ^2.2.0 - "@lumino/disposable": ^2.1.3 - "@lumino/domutils": ^2.0.2 - "@lumino/dragdrop": ^2.1.5 - "@lumino/keyboard": ^2.0.2 - "@lumino/messaging": ^2.0.2 - "@lumino/properties": ^2.0.2 - "@lumino/signaling": ^2.1.3 - "@lumino/virtualdom": ^2.0.2 - checksum: c5055e42b0b7d5d9a0c29d14c7053478cbdef057525e262ccd59c987971364d5462ed1a59d5008b889cf5ecc6810e90c681364239500b9c8ee0ae4624d60df84 +"@marijn/find-cluster-break@npm:^1.0.0": + version: 1.0.2 + resolution: "@marijn/find-cluster-break@npm:1.0.2" + checksum: 0d836de25e04d58325813401ef3c2d34caf040da985a5935fcbc9d84e7b47a21bdb15f57d70c2bf0960bd29ed3dbbb1afd00cdd0fc4fafbee7fd0ffe7d508ae1 languageName: node linkType: hard @@ -2882,34 +2949,22 @@ __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": + 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 - 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" - dependencies: - "@microsoft/fast-element": ^1.13.0 - "@microsoft/fast-foundation": ^2.49.6 - peerDependencies: - react: ">=16.9.0" - checksum: 1d7a87509c22872bafc9b5c64f66659e52ba0cfdff484d7204125e503dafdea143f5e1bd2a643e2f3fbba6cc7567d916393369433f19dab9f0adcbe7a88b7d98 + checksum: 651501eb8cd5a3e583638f70a4e7c0ad30952fe12adedd5c4c24861515d0aaeec0e83d1f1cd25dece899d2fa1614b415001c461f76bb84b20e1a8e18a3fcf219 languageName: node linkType: hard @@ -2949,16 +3004,16 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" dependencies: agent-base: ^7.1.0 http-proxy-agent: ^7.0.0 https-proxy-agent: ^7.0.1 lru-cache: ^10.0.1 socks-proxy-agent: ^8.0.3 - checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 + checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f languageName: node linkType: hard @@ -3016,12 +3071,12 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" dependencies: semver: ^7.3.5 - checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 + checksum: 68951c589e9a4328698a35fd82fe71909a257d6f2ede0434d236fa55634f0fbcad9bb8755553ce5849bd25ee6f019f4d435921ac715c853582c4a7f5983c8d4a languageName: node linkType: hard @@ -3402,24 +3457,23 @@ __metadata: linkType: hard "@rjsf/core@npm:^5.13.4": - version: 5.22.1 - resolution: "@rjsf/core@npm:5.22.1" + version: 5.24.13 + resolution: "@rjsf/core@npm:5.24.13" dependencies: lodash: ^4.17.21 lodash-es: ^4.17.21 markdown-to-jsx: ^7.4.1 - nanoid: ^3.3.7 prop-types: ^15.8.1 peerDependencies: - "@rjsf/utils": ^5.22.x + "@rjsf/utils": ^5.24.x react: ^16.14.0 || >=17 - checksum: c6bda6ecb2ea948d14b30fd8a0cedcc1caa8d527bde353a958f4f78304a6ecdbccf1982424e3fbe324bccdc77fed22823a9240e937a07c8e477845b97002b2bb + checksum: ca48357014bad1e2e64bcce3f1c4a473745c933463db3749f4038143634ca7192a65b1d3194c9f6b999319c4d7ecd6e8244cf5a3f1e23d0500b40f48a0a39c72 languageName: node linkType: hard "@rjsf/utils@npm:^5.13.4": - version: 5.22.1 - resolution: "@rjsf/utils@npm:5.22.1" + version: 5.24.13 + resolution: "@rjsf/utils@npm:5.24.13" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -3428,7 +3482,14 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: d6a059e72afe3c86a22a7a49df15e2458e6a853645b75081757dee7afff1c2d5935fc87ca4f031502bf4629d403a3425375339e5e163cb94634aa462568b1aef + checksum: 40bb315a6e0b2e635dd6998a1ce82ce9fda2c8f57206f952006abc80e48d54790fa4298b167c0fdbc28a5a278573dbdb5bc68ec1da99c49a6b6c45fc7b61cdf5 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 languageName: node linkType: hard @@ -3457,6 +3518,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": ^3.0.0 + checksum: 614d30cb4d5201550c940945d44c9e0b6d64a888ff2cd5b357f95ad6721070d6b8839cd10e15b76bf5e14af0bcc1d8f9ec00d49a46318f1f669a4bec1d7f3148 + languageName: node + linkType: hard + "@sinonjs/fake-timers@npm:^11.2.2": version: 11.3.1 resolution: "@sinonjs/fake-timers@npm:11.3.1" @@ -3554,14 +3624,7 @@ __metadata: languageName: node linkType: hard -"@types/chai@npm:*": - version: 5.0.0 - resolution: "@types/chai@npm:5.0.0" - checksum: ae3d63d8e84b4fc7fce5b0e68d0000834e709e19378e569c9ab97503a1b38f582ff69db6299528a849ec336954690a905225cb0dd9648d823c291f53ae93b458 - languageName: node - linkType: hard - -"@types/chai@npm:^4.1.7": +"@types/chai@npm:*, @types/chai@npm:^4.1.7": version: 4.3.20 resolution: "@types/chai@npm:4.3.20" checksum: 7c5b0c9148f1a844a8d16cb1e16c64f2e7749cab2b8284155b9e494a6b34054846e22fb2b38df6b290f9bf57e6beebb2e121940c5896bc086ad7bab7ed429f06 @@ -3569,27 +3632,20 @@ __metadata: linkType: hard "@types/codemirror@npm:^5.60.0": - version: 5.60.15 - resolution: "@types/codemirror@npm:5.60.15" + version: 5.60.16 + resolution: "@types/codemirror@npm:5.60.16" dependencies: "@types/tern": "*" - checksum: cfad3f569de48fba3efa44fdfeba77933e231486a52cc80cff7ce6eeeed5b447a5bc2b11e2226bc00ccee332c661e53e35a15cf14eb835f434a6a402d9462f5f - languageName: node - linkType: hard - -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 3275534ed69a76c68eb1a77d547d75f99fedc80befb75a3d1d03662fb08d697e6f8b1274e12af1a74c6896071b11510631ba891f64d30c78528d0ec45a9c1a18 + checksum: 119a3b640d1d256a1e2e2bbc9d8614caeccbb0870dacd9f2480f38a7a11e85497e88b9eebdaa3d9aea86408e4af2ffe5d5babd6b3e8196d235de262bf96fa252 languageName: node linkType: hard "@types/cors@npm:^2.8.12": - version: 2.8.17 - resolution: "@types/cors@npm:2.8.17" + version: 2.8.19 + resolution: "@types/cors@npm:2.8.19" dependencies: "@types/node": "*" - checksum: 469bd85e29a35977099a3745c78e489916011169a664e97c4c3d6538143b0a16e4cc72b05b407dc008df3892ed7bf595f9b7c0f1f4680e169565ee9d64966bde + checksum: 9545cc532c9218754443f48a0c98c1a9ba4af1fe54a3425c95de75ff3158147bb39e666cb7c6bf98cc56a9c6dc7b4ce5b2cbdae6b55d5942e50c81b76ed6b825 languageName: node linkType: hard @@ -3608,16 +3664,36 @@ __metadata: linkType: hard "@types/emscripten@npm:^1.39.6": - version: 1.39.13 - resolution: "@types/emscripten@npm:1.39.13" - checksum: 6a50f43a90db981e088c76219578a8e9eea0add3ed99d2daed3dfe8f8b755557b89ea5aea0166db2e9399882e109971f1724636101850a46cee51dc4c9337b1f + version: 1.41.2 + resolution: "@types/emscripten@npm:1.41.2" + checksum: b0321eb7211f23801e886a7fbbd12e105b357eea5bb32ab13617d8cd04946a48a80b34ee7fe075344e76859753af2279969f7a322dda23bfd328bcfdf339a100 languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.5": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "*" + "@types/estree": "*" + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: c286e79707ab604b577cf8ce51d9bbb9780e3d6a68b38a83febe13fa05b8012c92de17c28532fac2b03d3c460123f5055d603a579685325246ca1c86828223e0 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: bd93e2e415b6f182ec4da1074e1f36c480f1d26add3e696d54fb30c09bc470897e41361c8fd957bf0985024f8fbf1e6e2aff977d79352ef7eb93a5c6dcff6c11 languageName: node linkType: hard @@ -3645,16 +3721,52 @@ __metadata: languageName: node linkType: hard +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: 93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 + languageName: node + linkType: hard + "@types/jquery@npm:*, @types/jquery@npm:^3.5.16": - version: 3.5.31 - resolution: "@types/jquery@npm:3.5.31" + version: 3.5.33 + resolution: "@types/jquery@npm:3.5.33" dependencies: "@types/sizzle": "*" - checksum: 14a682a6a00e5b0bfe7afbb359ea2ada51b6fdbd962f8ba2b6077989935bd41f395b920581538d218d3ac81e6e3929acb86db9ccb8aa55a67066da9ed55db775 + checksum: 63a654cb5a141f794f8d2704891b851742bf40d1ef9c8ce7c38900b6e6aedded9324273d52a7a8ab5ddc17b395991b51e566119d4c14b160fef11342bdf18b3a languageName: node linkType: hard -"@types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "*" + "@types/tough-cookie": "*" + parse5: ^7.0.0 + checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -3671,9 +3783,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.134": - version: 4.17.12 - resolution: "@types/lodash@npm:4.17.12" - checksum: 7b564e4114f09ce5ae31a2e9493592baf20bb498507f3705c5d91cf838c2298b4f6a06f2d6c8dc608fcac63e210a2b7b13388c7a5e220e15688f813521030127 + version: 4.17.20 + resolution: "@types/lodash@npm:4.17.20" + checksum: dc7bb4653514dd91117a4c4cec2c37e2b5a163d7643445e4757d76a360fabe064422ec7a42dde7450c5e7e0e7e678d5e6eae6d2a919abcddf581d81e63e63839 languageName: node linkType: hard @@ -3727,19 +3839,19 @@ __metadata: linkType: hard "@types/prop-types@npm:*": - version: 15.7.13 - resolution: "@types/prop-types@npm:15.7.13" - checksum: 8935cad87c683c665d09a055919d617fe951cb3b2d5c00544e3a913f861a2bd8d2145b51c9aa6d2457d19f3107ab40784c40205e757232f6a80cc8b1c815513c + version: 15.7.15 + resolution: "@types/prop-types@npm:15.7.15" + checksum: 31aa2f59b28f24da6fb4f1d70807dae2aedfce090ec63eaf9ea01727a9533ef6eaf017de5bff99fbccad7d1c9e644f52c6c2ba30869465dd22b1a7221c29f356 languageName: node linkType: hard "@types/react@npm:^18.0.26": - version: 18.3.11 - resolution: "@types/react@npm:18.3.11" + version: 18.3.26 + resolution: "@types/react@npm:18.3.26" dependencies: "@types/prop-types": "*" csstype: ^3.0.2 - checksum: 6cbf36673b64e758dd61b16c24139d015f58530e0d476777de26ba83f24b55e142fbf64e3b8f6b3c7b05ed9ba548551b2a62d9ffb0f95743d0a368646a619163 + checksum: ecff0da9f9a1d1663152ffd1283a6e3f20e1255dedc99259d535f01ac0916535f7bcd0fd1783f6cec1729fe5cfe4a79e78eb9a4b1447af81ae86561a1bc66f6d languageName: node linkType: hard @@ -3753,18 +3865,18 @@ __metadata: linkType: hard "@types/sanitize-html@npm:^2.6.0": - version: 2.13.0 - resolution: "@types/sanitize-html@npm:2.13.0" + version: 2.16.0 + resolution: "@types/sanitize-html@npm:2.16.0" dependencies: htmlparser2: ^8.0.0 - checksum: a32c67bdf86048efa8ee5cdc1a68351758bae888956010eea58e694c1f9fc580632d1ce0478d31984559e0b03282d130ffe3e87479838c8da92cf1ac06626edc + checksum: 988cbdecce06b858fc5c92ed5573eb984852234be4ea4001ad703a9f0a00a491d788cfb0e3002b2cc01180e2598e7c8f9e5836fbe795601740aa91df3345d564 languageName: node linkType: hard "@types/semver@npm:^7.1.0, @types/semver@npm:^7.3.12, @types/semver@npm:^7.3.6": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 + version: 7.7.1 + resolution: "@types/semver@npm:7.7.1" + checksum: 76d218e414482a398148d5c28f2bfa017108869f3fc18cda379c9d8d062348f8b9653ae2fa8642d3b5b52e211928fe8be34f22da4e1f08245c84e0e51e040673 languageName: node linkType: hard @@ -3795,9 +3907,9 @@ __metadata: linkType: hard "@types/sizzle@npm:*": - version: 2.3.8 - resolution: "@types/sizzle@npm:2.3.8" - checksum: 2ac62443dc917f5f903cbd9afc51c7d6cc1c6569b4e1a15faf04aea5b13b486e7f208650014c3dc4fed34653eded3e00fe5abffe0e6300cbf0e8a01beebf11a6 + version: 2.3.10 + resolution: "@types/sizzle@npm:2.3.10" + checksum: 7898ae8c147d6804e1eb7811664bf6e58c382840b03a56976c668f17fbc76f752c4086bddb0d6c6d54e279a9259cf4fbb61a6ee968dac98615c42350f6f57d6a languageName: node linkType: hard @@ -3808,6 +3920,13 @@ __metadata: languageName: node linkType: hard +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 + languageName: node + linkType: hard + "@types/tern@npm:*": version: 0.23.9 resolution: "@types/tern@npm:0.23.9" @@ -3817,6 +3936,13 @@ __metadata: languageName: node linkType: hard +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: f19409d0190b179331586365912920d192733112a195e870c7f18d20ac8adb7ad0b0ff69dad430dba8bc2be09593453a719cfea92dc3bda19748fd158fe1498d + languageName: node + linkType: hard + "@types/treeify@npm:^1.0.0": version: 1.0.3 resolution: "@types/treeify@npm:1.0.3" @@ -3842,6 +3968,22 @@ __metadata: languageName: node linkType: hard +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: ef236c27f9432983e91432d974243e6c4cdae227cb673740320eff32d04d853eed59c92ca6f1142a335cfdc0e17cccafa62e95886a8154ca8891cc2dec4ee6fc + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "*" + checksum: ee013f257472ab643cb0584cf3e1ff9b0c44bca1c9ba662395300a7f1a6c55fa9d41bd40ddff42d99f5d95febb3907c9ff600fbcb92dadbec22c6a76de7e1236 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.48.2, @typescript-eslint/eslint-plugin@npm:^5.8.0": version: 5.62.0 resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" @@ -3971,9 +4113,9 @@ __metadata: linkType: hard "@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc languageName: node linkType: hard @@ -4210,154 +4352,154 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" dependencies: - "@webassemblyjs/helper-numbers": 1.11.6 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - checksum: 31bcc64147236bd7b1b6d29d1f419c1f5845c785e1e42dc9e3f8ca2e05a029e9393a271b84f3a5bff2a32d35f51ff59e2181a6e5f953fe88576acd6750506202 + "@webassemblyjs/helper-numbers": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + checksum: f9154ad9ea14f6f2374ebe918c221fd69a4d4514126a1acc6fa4966e8d27ab28cb550a5e6880032cf620e19640578658a7e5a55bd2aad1e3db4e9d598b8f2099 languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: c3ffb723024130308db608e86e2bdccd4868bbb62dffb0a9a1530606496f79c87f8565bd8e02805ce64912b71f1a70ee5fb00307258b0c082c3abf961d097eca +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: b611e981dfd6a797c3d8fc3a772de29a6e55033737c2c09c31bb66c613bdbb2d25f915df1dee62a602c6acc057ca71128432fa8c3e22a893e1219dc454f14ede languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.6 - "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/floating-point-hex-parser": 1.13.2 + "@webassemblyjs/helper-api-error": 1.13.2 "@xtuc/long": 4.2.2 - checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 + checksum: 49e2c9bf9b66997e480f6b44d80f895b3cde4de52ac135921d28e144565edca6903a519f627f4089b5509de1d7f9e5023f0e1a94ff78a36c9e2eb30e7c18ffd2 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 8e059e1c1f0294f4fc3df8e4eaff3c5ef6e2e1358f34ebc118eaf5070ed59e56ed7fc92b28be734ebde17c8d662d5d27e06ade686c282445135da083ae11c128 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-buffer": 1.12.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/wasm-gen": 1.12.1 - checksum: c19810cdd2c90ff574139b6d8c0dda254d42d168a9e5b3d353d1bc085f1d7164ccd1b3c05592a45a939c47f7e403dc8d03572bb686642f06a3d02932f6f0bc8f + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/wasm-gen": 1.14.1 + checksum: 0a08d454a63192cd66abf91b6f060ac4b466cef341262246e9dcc828dd4c8536195dea9b46a1244b1eac65b59b8b502164a771a190052a92ff0a0a2ded0f8f53 languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" dependencies: "@xtuc/ieee754": ^1.2.0 - checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de + checksum: d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" dependencies: "@xtuc/long": 4.2.2 - checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 + checksum: 64083507f7cff477a6d71a9e325d95665cea78ec8df99ca7c050e1cfbe300fbcf0842ca3dcf3b4fa55028350135588a4f879398d3dd2b6a8de9913ce7faf5333 languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 95ec6052f30eefa8d50c9b2a3394d08b17d53a4aa52821451d41d774c126fa8f39b988fbf5bff56da86852a87c16d676e576775a4071e5e5ccf020cc85a4b281 languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-buffer": 1.12.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/helper-wasm-section": 1.12.1 - "@webassemblyjs/wasm-gen": 1.12.1 - "@webassemblyjs/wasm-opt": 1.12.1 - "@webassemblyjs/wasm-parser": 1.12.1 - "@webassemblyjs/wast-printer": 1.12.1 - checksum: ae23642303f030af888d30c4ef37b08dfec7eab6851a9575a616e65d1219f880d9223913a39056dd654e49049d76e97555b285d1f7e56935047abf578cce0692 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/helper-wasm-section": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-opt": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 + "@webassemblyjs/wast-printer": 1.14.1 + checksum: 9341c3146bb1b7863f03d6050c2a66990f20384ca137388047bbe1feffacb599e94fca7b7c18287d17e2449ffb4005fdc7f41f674a6975af9ad8522756f8ffff languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/ieee754": 1.11.6 - "@webassemblyjs/leb128": 1.11.6 - "@webassemblyjs/utf8": 1.11.6 - checksum: 5787626bb7f0b033044471ddd00ce0c9fe1ee4584e8b73e232051e3a4c99ba1a102700d75337151c8b6055bae77eefa4548960c610a5e4a504e356bd872138ff + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 + checksum: 401b12bec7431c4fc29d9414bbe40d3c6dc5be04d25a116657c42329f5481f0129f3b5834c293f26f0e42681ceac9157bf078ce9bdb6a7f78037c650373f98b2 languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-buffer": 1.12.1 - "@webassemblyjs/wasm-gen": 1.12.1 - "@webassemblyjs/wasm-parser": 1.12.1 - checksum: 0e8fa8a0645304a1e18ff40d3db5a2e9233ebaa169b19fcc651d6fc9fe2cac0ce092ddee927318015ae735d9cd9c5d97c0cafb6a51dcd2932ac73587b62df991 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 + checksum: 60c697a9e9129d8d23573856df0791ba33cea4a3bc2339044cae73128c0983802e5e50a42157b990eeafe1237eb8e7653db6de5f02b54a0ae7b81b02dcdf2ae9 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-api-error": 1.11.6 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/ieee754": 1.11.6 - "@webassemblyjs/leb128": 1.11.6 - "@webassemblyjs/utf8": 1.11.6 - checksum: 176015de3551ac068cd4505d837414f258d9ade7442bd71efb1232fa26c9f6d7d4e11a5c816caeed389943f409af7ebff6899289a992d7a70343cb47009d21a8 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-api-error": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 + checksum: 93f1fe2676da465b4e824419d9812a3d7218de4c3addd4e916c04bc86055fa134416c1b67e4b7cbde8d728c0dce2721d06cc0bfe7a7db7c093a0898009937405 languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" dependencies: - "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/ast": 1.14.1 "@xtuc/long": 4.2.2 - checksum: 2974b5dda8d769145ba0efd886ea94a601e61fb37114c14f9a9a7606afc23456799af652ac3052f284909bd42edc3665a76bc9b50f95f0794c053a8a1757b713 + checksum: 517881a0554debe6945de719d100b2d8883a2d24ddf47552cdeda866341e2bb153cd824a864bc7e2a61190a4b66b18f9899907e0074e9e820d2912ac0789ea60 languageName: node linkType: hard @@ -4442,26 +4584,27 @@ __metadata: linkType: hard "@yarnpkg/core@npm:^4.0.3": - version: 4.1.4 - resolution: "@yarnpkg/core@npm:4.1.4" + version: 4.4.4 + resolution: "@yarnpkg/core@npm:4.4.4" dependencies: "@arcanis/slice-ansi": ^1.1.1 "@types/semver": ^7.1.0 "@types/treeify": ^1.0.0 - "@yarnpkg/fslib": ^3.1.0 - "@yarnpkg/libzip": ^3.1.0 - "@yarnpkg/parsers": ^3.0.2 - "@yarnpkg/shell": ^4.1.0 + "@yarnpkg/fslib": ^3.1.3 + "@yarnpkg/libzip": ^3.2.2 + "@yarnpkg/parsers": ^3.0.3 + "@yarnpkg/shell": ^4.1.3 camelcase: ^5.3.1 - chalk: ^3.0.0 + chalk: ^4.1.2 ci-info: ^4.0.0 clipanion: ^4.0.0-rc.2 - cross-spawn: 7.0.3 + cross-spawn: ^7.0.3 diff: ^5.1.0 dotenv: ^16.3.1 + es-toolkit: ^1.39.7 fast-glob: ^3.2.2 got: ^11.7.0 - lodash: ^4.17.15 + hpagent: ^1.2.0 micromatch: ^4.0.2 p-limit: ^2.2.0 semver: ^7.1.2 @@ -4470,30 +4613,29 @@ __metadata: tinylogic: ^2.0.0 treeify: ^1.1.0 tslib: ^2.4.0 - tunnel: ^0.0.6 - checksum: 83c068e1567bb893748df78469ebb1856878b59572a4cf1b383efb4fba8adf924c57b75172450a92dd6d1c7986cf1a5784d98d55ae922eee3c8213aafe143c04 + checksum: 0ed1c0fa9cb590de700b26c50ee021af19a29c7b4d04a0d121864ca1a47ce09280c56619eb947a28454731a0d7eec4ab08b7dda6eba68782f12a5e88e05bebc6 languageName: node linkType: hard -"@yarnpkg/fslib@npm:^3.1.0": - version: 3.1.0 - resolution: "@yarnpkg/fslib@npm:3.1.0" +"@yarnpkg/fslib@npm:^3.1.2, @yarnpkg/fslib@npm:^3.1.3": + version: 3.1.3 + resolution: "@yarnpkg/fslib@npm:3.1.3" dependencies: tslib: ^2.4.0 - checksum: 5274c63731cb30283a93e1446d6796b890fc56c55ed046156b2963a527465bc3add091a1e7f471b7533c8b1aa67b8532960e64589787014dee2cf3d97a9304f6 + checksum: 8d9bc2f40bf49d2bec1e0218b142a5504e5bbe1dec6b36000f58c0b0a048c8b00785370a19f0563d8a50d9c7ca6b09df6e7c68900d35ebb127734d65faa31618 languageName: node linkType: hard -"@yarnpkg/libzip@npm:^3.1.0": - version: 3.1.0 - resolution: "@yarnpkg/libzip@npm:3.1.0" +"@yarnpkg/libzip@npm:^3.2.2": + version: 3.2.2 + resolution: "@yarnpkg/libzip@npm:3.2.2" dependencies: "@types/emscripten": ^1.39.6 - "@yarnpkg/fslib": ^3.1.0 + "@yarnpkg/fslib": ^3.1.3 tslib: ^2.4.0 peerDependencies: - "@yarnpkg/fslib": ^3.1.0 - checksum: 2bb7c10b41184a079906ec4ebdadda69e4cd3b101d11aae965c08934254dbd303e51e9869fd8d799c5f58d59214cd13d67d454ad96e1c76ce9384816d58da08c + "@yarnpkg/fslib": ^3.1.3 + checksum: 68736d731ef18f54720ed0b26e24dd0a69adcf26ef5d1f1a2e7ac89c096e2fc50373ff7467158b3a3b3cc7579bbb8ab7e72ee79f2c9044bda0dac52fbf40819b languageName: node linkType: hard @@ -4514,31 +4656,31 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/parsers@npm:^3.0.0, @yarnpkg/parsers@npm:^3.0.2": - version: 3.0.2 - resolution: "@yarnpkg/parsers@npm:3.0.2" +"@yarnpkg/parsers@npm:^3.0.0, @yarnpkg/parsers@npm:^3.0.3": + version: 3.0.3 + resolution: "@yarnpkg/parsers@npm:3.0.3" dependencies: js-yaml: ^3.10.0 tslib: ^2.4.0 - checksum: fb40a87ae7c9f3fc0b2a6b7d84375d1c69ae8304daf598c089b52966bfb4ac94fbd2dcd87ed041970416e03d34359cb5ff16be5f5601f48d1f936213a8edaf4d + checksum: d6f78ec15b36732a88aeb090d012756d03a855a301a29f0f4f725ac05186f2d2e26400ea5636016481bdca7d4a013f70d61141bc1add2048cf1c2e5132b9ecf8 languageName: node linkType: hard -"@yarnpkg/shell@npm:^4.1.0": - version: 4.1.0 - resolution: "@yarnpkg/shell@npm:4.1.0" +"@yarnpkg/shell@npm:^4.1.3": + version: 4.1.3 + resolution: "@yarnpkg/shell@npm:4.1.3" dependencies: - "@yarnpkg/fslib": ^3.1.0 - "@yarnpkg/parsers": ^3.0.2 - chalk: ^3.0.0 + "@yarnpkg/fslib": ^3.1.2 + "@yarnpkg/parsers": ^3.0.3 + chalk: ^4.1.2 clipanion: ^4.0.0-rc.2 - cross-spawn: 7.0.3 + cross-spawn: ^7.0.3 fast-glob: ^3.2.2 micromatch: ^4.0.2 tslib: ^2.4.0 bin: shell: ./lib/cli.js - checksum: d5ad721cadc6d6f1411ad98b5d8362c2c804be4e4e9ed9799debbaa96fd2413fc5beaf011e30e69f54ab66b66779ba916125dc40efcf104a4e99053b3a8c645b + checksum: bb5a122b157d6a1652331542b26d07f63b1f796f264708b0126b3c5a87877150927e8e838bcf631f80469799c4b331b02c62b7ecb19325276590e28e2fe45557 languageName: node linkType: hard @@ -4565,7 +4707,7 @@ __metadata: languageName: node linkType: hard -"abab@npm:^2.0.3": +"abab@npm:^2.0.3, abab@npm:^2.0.6": version: 2.0.6 resolution: "abab@npm:2.0.6" checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e @@ -4579,10 +4721,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 +"abbrev@npm:^3.0.0": + version: 3.0.1 + resolution: "abbrev@npm:3.0.1" + checksum: e70b209f5f408dd3a3bbd0eec4b10a2ffd64704a4a3821d0969d84928cc490a8eb60f85b78a95622c1841113edac10161c62e52f5e7d0027aa26786a8136e02e languageName: node linkType: hard @@ -4595,7 +4737,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:~1.3.4, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -4605,12 +4747,22 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + +"acorn-import-phases@npm:^1.0.3": + version: 1.0.4 + resolution: "acorn-import-phases@npm:1.0.4" peerDependencies: - acorn: ^8 - checksum: 1c0c49b6a244503964ae46ae850baccf306e84caf99bc2010ed6103c69a423987b07b520a6c619f075d215388bd4923eccac995886a54309eda049ab78a4be95 + acorn: ^8.14.0 + checksum: e669cccfb6711af305150fcbfddcf4485fffdc4547a0ecabebe94103b47124cc02bfd186240061c00ac954cfb0461b4ecc3e203e138e43042b7af32063fa9510 languageName: node linkType: hard @@ -4623,12 +4775,21 @@ __metadata: languageName: node 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" +"acorn-walk@npm:^8.0.2": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: ^8.11.0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c + languageName: node + linkType: hard + +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.8.1, acorn@npm:^8.9.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: f1541f05eb5d6ff67990d1927290809b1ebb663ac96d9c7057c935cf29c5bcaba6d39f37bd007f4bb814f162f142b0f2b2dd4b14128b8fcfaf9f0508a6f05f1c + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 languageName: node linkType: hard @@ -4648,21 +4809,19 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: ^4.3.4 - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 86a7f542af277cfbd77dd61e7df8422f90bac512953709003a1c530171a9d019d072e2400eab2b59f84b49ab9dd237be44315ca663ac73e82b3922d10ea5eafa languageName: node linkType: hard "agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" dependencies: humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + checksum: b3cdd10efca04876defda3c7671163523fcbce20e8ef7a8f9f30919a242e32b846791c0f1a8a0269718a585805a2cdcd031779ff7b9927a1a8dd8586f8c2e8c5 languageName: node linkType: hard @@ -4710,9 +4869,9 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.12.0, ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" +"ajv@npm:8.17.1, ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: fast-deep-equal: ^3.1.3 fast-uri: ^3.0.1 @@ -4722,18 +4881,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^5.0.0": - version: 5.5.2 - resolution: "ajv@npm:5.5.2" - dependencies: - co: ^4.6.0 - fast-deep-equal: ^1.0.0 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.3.0 - checksum: a69645c843e1676b0ae1c5192786e546427f808f386d26127c6585479378066c64341ceec0b127b6789d79628e71d2a732d402f575b98f9262db230d7b715a94 - languageName: node - linkType: hard - "ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -4762,13 +4909,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1 - languageName: node - linkType: hard - "ansi-regex@npm:^3.0.0": version: 3.0.1 resolution: "ansi-regex@npm:3.0.1" @@ -4784,23 +4924,16 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 9b17ce2c6daecc75bcd5966b9ad672c23b184dc3ed9bf3c98a0702f0d2f736c15c10d461913568f2cf527a5e64291c7473358885dd493305c84a1cfed66ba94f languageName: node linkType: hard "ansi-sequence-parser@npm:^1.1.0": - version: 1.1.1 - resolution: "ansi-sequence-parser@npm:1.1.1" - checksum: ead5b15c596e8e85ca02951a844366c6776769dcc9fd1bd3a0db11bb21364554822c6a439877fb599e7e1ffa0b5f039f1e5501423950457f3dcb2f480c30b188 - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c + version: 1.1.3 + resolution: "ansi-sequence-parser@npm:1.1.3" + checksum: 98e516176fa9177d501a49a12b96dd26359eaa1c6cee9d6261ebd36540cd4d33a9acd5a8cf43ed3e4508f1cf8b28fcc17643abd49bdf017471e840d98d1c036d languageName: node linkType: hard @@ -4822,10 +4955,17 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + "ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: f1b0829cf048cce870a305819f65ce2adcebc097b6d6479e12e955fd6225df9b9eb8b497083b764df796d94383ff20016cc4dbbae5b40f36138fb65a9d33c2e2 languageName: node linkType: hard @@ -4847,9 +4987,9 @@ __metadata: linkType: hard "aproba@npm:^1.0.3 || ^2.0.0, aproba@npm:^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + version: 2.1.0 + resolution: "aproba@npm:2.1.0" + checksum: 667c77755e8dd4c67f0a1a903d6879cac8c11e385758893eba518cced0448e2eba9996f2d93fe5187306ba85bce73d709bce4be809e0f51be0d24ff12db547fe languageName: node linkType: hard @@ -4879,13 +5019,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - call-bind: ^1.0.5 - is-array-buffer: ^3.0.4 - checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + call-bound: ^1.0.3 + is-array-buffer: ^3.0.5 + checksum: 0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 languageName: node linkType: hard @@ -4924,19 +5064,18 @@ __metadata: languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: array-buffer-byte-length: ^1.0.1 - call-bind: ^1.0.5 + call-bind: ^1.0.8 define-properties: ^1.2.1 - es-abstract: ^1.22.3 - es-errors: ^1.2.1 - get-intrinsic: ^1.2.3 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 is-array-buffer: ^3.0.4 - is-shared-array-buffer: ^1.0.2 - checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 languageName: node linkType: hard @@ -4991,30 +5130,28 @@ __metadata: languageName: node linkType: hard -"async@npm:3.2.4": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 9102e246d1ed9b37ac36f57f0a6ca55226876553251a31fc80677e71471f463a54c872dc78d5d7f80740c8ba624395cccbe8b60f7b690c4418f487d8e9fd1106 languageName: node linkType: hard -"async@npm:3.2.5": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 5ec77f1312301dee02d62140a6b1f7ee0edd2a0f983b6fd2b0849b969f245225b990b47b8243e7b9ad16451a53e7f68e753700385b706198ced888beedba3af4 +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 74a71a4a2dd7afd06ebb612f6d612c7f4766a351bedffde466023bf6dae629e46b0d2cd38786239e0fbf245de0c7df76035465e16d1213774a0efb22fec0d713 languageName: node linkType: hard -"async@npm:^2.6.4": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: ^4.17.14 - checksum: a52083fb32e1ebe1d63e5c5624038bb30be68ff07a6c8d7dfe35e47c93fc144bd8652cbec869e0ac07d57dde387aa5f1386be3559cdee799cb1f789678d88e19 +"async@npm:3.2.4": + version: 3.2.4 + resolution: "async@npm:3.2.4" + checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 languageName: node linkType: hard -"async@npm:^3.2.3": +"async@npm:3.2.6, async@npm:^3.2.6": version: 3.2.6 resolution: "async@npm:3.2.6" checksum: ee6eb8cd8a0ab1b58bd2a3ed6c415e93e773573a91d31df9d5ef559baafa9dab37d3b096fa7993e84585cac3697b2af6ddb9086f45d3ac8cae821bb2aab65682 @@ -5082,60 +5219,29 @@ __metadata: linkType: hard "axios@npm:^1.0.0": - version: 1.7.7 - resolution: "axios@npm:1.7.7" + version: 1.12.2 + resolution: "axios@npm:1.12.2" dependencies: follow-redirects: ^1.15.6 - form-data: ^4.0.0 + form-data: ^4.0.4 proxy-from-env: ^1.1.0 - checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe + checksum: f0331594fe053a4bbff04104edb073973a3aabfad2e56b0aa18de82428aa63f6f0839ca3d837258ec739cb4528014121793b1649a21e5115ffb2bf8237eadca3 languageName: node linkType: hard "b4a@npm:^1.6.4": - version: 1.6.7 - resolution: "b4a@npm:1.6.7" - checksum: afe4e239b49c0ef62236fe0d788ac9bd9d7eac7e9855b0d1835593cd0efcc7be394f9cc28a747a2ed2cdcb0a48c3528a551a196f472eb625457c711169c9efa2 - languageName: node - linkType: hard - -"babel-code-frame@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-code-frame@npm:6.26.0" - dependencies: - chalk: ^1.1.3 - esutils: ^2.0.2 - js-tokens: ^3.0.2 - checksum: 9410c3d5a921eb02fa409675d1a758e493323a49e7b9dddb7a2a24d47e61d39ab1129dd29f9175836eac9ce8b1d4c0a0718fcdc57ce0b865b529fd250dbab313 - languageName: node - linkType: hard - -"babel-generator@npm:^6.18.0": - version: 6.26.1 - resolution: "babel-generator@npm:6.26.1" - dependencies: - babel-messages: ^6.23.0 - babel-runtime: ^6.26.0 - babel-types: ^6.26.0 - detect-indent: ^4.0.0 - jsesc: ^1.3.0 - lodash: ^4.17.4 - source-map: ^0.5.7 - trim-right: ^1.0.1 - checksum: 5397f4d4d1243e7157e3336be96c10fcb1f29f73bf2d9842229c71764d9a6431397d249483a38c4d8b1581459e67be4df6f32d26b1666f02d0f5bfc2c2f25193 - languageName: node - linkType: hard - -"babel-messages@npm:^6.23.0": - version: 6.23.0 - resolution: "babel-messages@npm:6.23.0" - dependencies: - babel-runtime: ^6.22.0 - checksum: c8075c17587a33869e1a5bd0a5b73bbe395b68188362dacd5418debbc7c8fd784bcd3295e81ee7e410dc2c2655755add6af03698c522209f6a68334c15e6d6ca + version: 1.7.3 + resolution: "b4a@npm:1.7.3" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: b2e5f572bb2024b612eddedfbfce9626e103fd523da3d7bb8267f345bca6d7d4772ed00310527c7a629fc54184d5b1b47b73f8dd976d713aea7e16d2af38aecf languageName: node linkType: hard -"babel-runtime@npm:^6.22.0, babel-runtime@npm:^6.23.0, babel-runtime@npm:^6.26.0": +"babel-runtime@npm:^6.23.0": version: 6.26.0 resolution: "babel-runtime@npm:6.26.0" dependencies: @@ -5145,57 +5251,6 @@ __metadata: languageName: node linkType: hard -"babel-template@npm:^6.16.0": - version: 6.26.0 - resolution: "babel-template@npm:6.26.0" - dependencies: - babel-runtime: ^6.26.0 - babel-traverse: ^6.26.0 - babel-types: ^6.26.0 - babylon: ^6.18.0 - lodash: ^4.17.4 - checksum: 028dd57380f09b5641b74874a19073c53c4fb3f1696e849575aae18f8c80eaf21db75209057db862f3b893ce2cd9b795d539efa591b58f4a0fb011df0a56fbed - languageName: node - linkType: hard - -"babel-traverse@npm:^6.18.0, babel-traverse@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-traverse@npm:6.26.0" - dependencies: - babel-code-frame: ^6.26.0 - babel-messages: ^6.23.0 - babel-runtime: ^6.26.0 - babel-types: ^6.26.0 - babylon: ^6.18.0 - debug: ^2.6.8 - globals: ^9.18.0 - invariant: ^2.2.2 - lodash: ^4.17.4 - checksum: fca037588d2791ae0409f1b7aa56075b798699cccc53ea04d82dd1c0f97b9e7ab17065f7dd3ecd69101d7874c9c8fd5e0f88fa53abbae1fe94e37e6b81ebcb8d - languageName: node - linkType: hard - -"babel-types@npm:^6.18.0, babel-types@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-types@npm:6.26.0" - dependencies: - babel-runtime: ^6.26.0 - esutils: ^2.0.2 - lodash: ^4.17.4 - to-fast-properties: ^1.0.3 - checksum: d16b0fa86e9b0e4c2623be81d0a35679faff24dd2e43cde4ca58baf49f3e39415a011a889e6c2259ff09e1228e4c3a3db6449a62de59e80152fe1ce7398fde76 - languageName: node - linkType: hard - -"babylon@npm:^6.18.0": - version: 6.18.0 - resolution: "babylon@npm:6.18.0" - bin: - babylon: ./bin/babylon.js - checksum: 0777ae0c735ce1cbfc856d627589ed9aae212b84fb0c03c368b55e6c5d3507841780052808d0ad46e18a2ba516e93d55eeed8cd967f3b2938822dfeccfb2a16d - languageName: node - linkType: hard - "backbone@npm:1.2.3": version: 1.2.3 resolution: "backbone@npm:1.2.3" @@ -5235,10 +5290,15 @@ __metadata: languageName: node linkType: hard -"bare-events@npm:^2.2.0": - version: 2.5.0 - resolution: "bare-events@npm:2.5.0" - checksum: 5aa10716e7f33c5dfc471fd657eee2a33f2db0f78b3c83b5cdd1a45a7e7871114a69460ea96cd838807c55eb470b9e53dd0dfda8c83cced1352cc8253cebff48 +"bare-events@npm:^2.7.0": + version: 2.8.0 + resolution: "bare-events@npm:2.8.0" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: e7debb8d6a668232b07e645895ee569b15005bd99a60966800301dc45e9a687c8a403460dad69ec4b3200d623250210e3ac81181e2f024591ee13c698e77477c languageName: node linkType: hard @@ -5256,6 +5316,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.9": + version: 2.8.16 + resolution: "baseline-browser-mapping@npm:2.8.16" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 929b3f2b5f4beb3b9e02b660a4a8b24f62e43cc7efdc38a726ef061137f9529d3372e1c70298eacde191ac70f5defd21ae4a29ff9e470c4c2b7fd7be68320241 + languageName: node + linkType: hard + "basic-auth@npm:^2.0.1": version: 2.0.1 resolution: "basic-auth@npm:2.0.1" @@ -5348,21 +5417,21 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" dependencies: balanced-match: ^1.0.0 concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + checksum: 12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562 languageName: node linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + checksum: 01dff195e3646bc4b0d27b63d9bab84d2ebc06121ff5013ad6e5356daa5a9d6b60fa26cf73c74797f2dc3fbec112af13578d51f75228c1112b26c790a87b0488 languageName: node linkType: hard @@ -5403,21 +5472,22 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.24.0": - version: 4.24.2 - resolution: "browserslist@npm:4.24.2" +"browserslist@npm:^4.24.0, browserslist@npm:^4.26.3": + version: 4.26.3 + resolution: "browserslist@npm:4.26.3" dependencies: - caniuse-lite: ^1.0.30001669 - electron-to-chromium: ^1.5.41 - node-releases: ^2.0.18 - update-browserslist-db: ^1.1.1 + baseline-browser-mapping: ^2.8.9 + caniuse-lite: ^1.0.30001746 + electron-to-chromium: ^1.5.227 + node-releases: ^2.0.21 + update-browserslist-db: ^1.1.3 bin: browserslist: cli.js - checksum: cf64085f12132d38638f38937a255edb82c7551b164a98577b055dd79719187a816112f7b97b9739e400c4954cd66479c0d7a843cb816e346f4795dc24fd5d97 + checksum: aa5bbcda9db1eeb9952b4c2f11f9a5a2247da7bcce7fa14d3cc215e67246a93394eda2f86378a41c3f73e6e1a1561bf0e7eade93c5392cb6d37bc66f70d0c53f languageName: node linkType: hard -"buffer-equal-constant-time@npm:1.0.1": +"buffer-equal-constant-time@npm:^1.0.1": version: 1.0.1 resolution: "buffer-equal-constant-time@npm:1.0.1" checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab @@ -5474,13 +5544,6 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.0.0": - version: 3.0.0 - resolution: "bytes@npm:3.0.0" - checksum: a2b386dd8188849a5325f58eef69c3b73c51801c08ffc6963eddc9be244089ba32d19347caf6d145c86f315ae1b1fc7061a32b0c1aa6379e6a719090287ed101 - languageName: node - linkType: hard - "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -5514,11 +5577,11 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - "@npmcli/fs": ^3.1.0 + "@npmcli/fs": ^4.0.0 fs-minipass: ^3.0.0 glob: ^10.2.2 lru-cache: ^10.0.1 @@ -5526,11 +5589,11 @@ __metadata: minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2 + p-map: ^7.0.2 + ssri: ^12.0.0 + tar: ^7.4.3 + unique-filename: ^4.0.0 + checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 languageName: node linkType: hard @@ -5556,16 +5619,35 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - es-define-property: ^1.0.0 es-errors: ^1.3.0 function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 get-intrinsic: ^1.2.4 - set-function-length: ^1.2.1 - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 languageName: node linkType: hard @@ -5613,10 +5695,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1, caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30000792, caniuse-lite@npm:^1.0.30000805, caniuse-lite@npm:^1.0.30001669": - version: 1.0.30001669 - resolution: "caniuse-lite@npm:1.0.30001669" - checksum: 8ed0c69d0c6aa3b1cbc5ba4e5f5330943e7b7165e257f6955b8b73f043d07ad922265261f2b54d9bbaf02886bbdba5e6f5b16662310a13f91f17035af3212de1 +"caniuse-lite@npm:^1, caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30000792, caniuse-lite@npm:^1.0.30000805, caniuse-lite@npm:^1.0.30001746": + version: 1.0.30001750 + resolution: "caniuse-lite@npm:1.0.30001750" + checksum: 4a50a24ceed75cde8a8cd8b370a8c044463c26cc171eb30d1e738cd55b328c599b6e2602ec79e3e9d3b15d56e3cc980f02dd2f82784f91410544fa49c6d09cad languageName: node linkType: hard @@ -5653,20 +5735,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: ^2.2.1 - escape-string-regexp: ^1.0.2 - has-ansi: ^2.0.0 - strip-ansi: ^3.0.0 - supports-color: ^2.0.0 - checksum: 9d2ea6b98fc2b7878829eec223abcf404622db6c48396a9b9257f6d0ead2acf18231ae368d6a664a83f272b0679158da12e97b5229f794939e555cc574478acd - languageName: node - linkType: hard - -"chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.3.0, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -5677,17 +5746,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^3.0.0": - version: 3.0.0 - resolution: "chalk@npm:3.0.0" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -5697,10 +5756,10 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d +"chardet@npm:^2.1.0": + version: 2.1.0 + resolution: "chardet@npm:2.1.0" + checksum: 491f8ea54ed3693598c98cb8785531b94b71e59b04ef8dd2b6fea4947f785297fb5c2ae1109adca6fdd453a8a7181cfc4a85c07dbbe96a156d0908f4188a6b9a languageName: node linkType: hard @@ -5739,6 +5798,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: fd73a4bab48b79e66903fe1cafbdc208956f41ea4f856df883d0c7277b7ab29fd33ee65f93b2ec9192fc0169238f2f8307b7735d27c155821d886b84aa97aa8d + languageName: node + linkType: hard + "chrome-trace-event@npm:^1.0.2": version: 1.0.4 resolution: "chrome-trace-event@npm:1.0.4" @@ -5753,10 +5819,17 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 + languageName: node + linkType: hard + "ci-info@npm:^4.0.0": - version: 4.0.0 - resolution: "ci-info@npm:4.0.0" - checksum: 122fe41c5eb8d0b5fa0ab6fd674c5ddcf2dc59766528b062a0144ff0d913cfb210ef925ec52110e7c2a7f4e603d5f0e8b91cfe68867e196e9212fa0b94d0a08a + version: 4.3.1 + resolution: "ci-info@npm:4.3.1" + checksum: 66c159d92648e8a07acab0a3a0681bff6ccc39aa44916263208c4d97bbbeedbbc886d7611fd30c21df1aa624ce3c6fcdfde982e74689e3e014e064e1d0805f94 languageName: node linkType: hard @@ -5817,18 +5890,7 @@ __metadata: languageName: node linkType: hard -"clipanion@npm:4.0.0-rc.3": - version: 4.0.0-rc.3 - resolution: "clipanion@npm:4.0.0-rc.3" - dependencies: - typanion: ^3.8.0 - peerDependencies: - typanion: "*" - checksum: a5e6201e5a7fdb93dbe5f61d158d3e3d23e3164c38a7c679c7dcc599e10ee339d249c33fd8729ba8ffd0a376206ed14aac2e5472624ecaf79041fac3baa73b9b - languageName: node - linkType: hard - -"clipanion@npm:^4.0.0-rc.2": +"clipanion@npm:4.0.0-rc.4, clipanion@npm:^4.0.0-rc.2": version: 4.0.0-rc.4 resolution: "clipanion@npm:4.0.0-rc.4" dependencies: @@ -5897,17 +5959,10 @@ __metadata: languageName: node linkType: hard -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 - languageName: node - linkType: hard - "codemirror@npm:^5.48.0": - version: 5.65.18 - resolution: "codemirror@npm:5.65.18" - checksum: 950015d587e0790cceae157423bbc70bf1da8256050c8f6739fe967045b050e22c63b332de6388ed6d9526d253a834806ace76c875006fc8078e2c15c9f275a7 + version: 5.65.20 + resolution: "codemirror@npm:5.65.20" + checksum: 8fa3871ff8147e5aa48ee3b0f3e3ce4e545bc14d669377c479dcfdf0705976f9a545d8198357b25ca3ae9f36fcd204ffcba9e6d073a4bbb31c6785f91a32fd16 languageName: node linkType: hard @@ -6019,7 +6074,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -6073,7 +6128,7 @@ __metadata: languageName: node linkType: hard -"compressible@npm:~2.0.16": +"compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" dependencies: @@ -6082,18 +6137,18 @@ __metadata: languageName: node linkType: hard -"compression@npm:1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" +"compression@npm:1.7.5": + version: 1.7.5 + resolution: "compression@npm:1.7.5" dependencies: - accepts: ~1.3.5 - bytes: 3.0.0 - compressible: ~2.0.16 + bytes: 3.1.2 + compressible: ~2.0.18 debug: 2.6.9 + negotiator: ~0.6.4 on-headers: ~1.0.2 - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 vary: ~1.1.2 - checksum: 35c0f2eb1f28418978615dc1bc02075b34b1568f7f56c62d60f4214d4b7cc00d0f6d282b5f8a954f59872396bd770b6b15ffd8aa94c67d4bce9b8887b906999b + checksum: d624b5562492518eee82c4f1381ea36f69f1f10b4283bfc2dcafd7d4d7eeed17c3f0e8f2951798594b7064db7ac5a6198df34816bde2d56bb7c75ce1570880e9 languageName: node linkType: hard @@ -6286,13 +6341,6 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.5.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 - languageName: node - linkType: hard - "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -6314,6 +6362,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: cec5e425549b3650eb5c3498a9ba3cde0b9cd419e3b36e4b92739d30b4d89e0b678b98c1ddc209ce7cf958cd3215671fd6ac47aec21f10c2a0cc68abd399d8a7 + languageName: node + linkType: hard + "cookie@npm:~0.7.2": version: 0.7.2 resolution: "cookie@npm:0.7.2" @@ -6381,34 +6436,34 @@ __metadata: languageName: node linkType: hard -"crelt@npm:^1.0.5": +"crelt@npm:^1.0.5, crelt@npm:^1.0.6": version: 1.0.6 resolution: "crelt@npm:1.0.6" checksum: dad842093371ad702afbc0531bfca2b0a8dd920b23a42f26e66dabbed9aad9acd5b9030496359545ef3937c3aced0fd4ac39f7a2d280a23ddf9eb7fdcb94a69f languageName: node linkType: hard -"cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - "cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" dependencies: nice-try: ^1.0.4 path-key: ^2.0.1 semver: ^5.5.0 shebang-command: ^1.2.0 which: ^1.2.9 - checksum: f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 + checksum: a6e2e5b04a0e0f806c1df45f92cd079b65f95fbe5a7650ee1ab60318c33a6c156a8a2f8b6898f57764f7363ec599a0625e9855dfa78d52d2d73dbd32eb11c25e + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b languageName: node linkType: hard @@ -6471,6 +6526,29 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: ~0.3.6 + checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3 + languageName: node + linkType: hard + "csstype@npm:3.0.10, csstype@npm:^3.0.2": version: 3.0.10 resolution: "csstype@npm:3.0.10" @@ -6533,36 +6611,47 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + is-data-view: ^1.0.2 + checksum: 1e1cd509c3037ac0f8ba320da3d1f8bf1a9f09b0be09394b5e40781b8cc15ff9834967ba7c9f843a425b34f9fe14ce44cf055af6662c44263424c1eb8d65659b languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - call-bind: ^1.0.7 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + is-data-view: ^1.0.2 + checksum: 3600c91ced1cfa935f19ef2abae11029e01738de8d229354d3b2a172bf0d7e4ed08ff8f53294b715569fdf72dfeaa96aa7652f479c0f60570878d88e7e8bddf6 languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.2 es-errors: ^1.3.0 is-data-view: ^1.0.1 - checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + checksum: 8dd492cd51d19970876626b5b5169fbb67ca31ec1d1d3238ee6a71820ca8b80cafb141c485999db1ee1ef02f2cc3b99424c5eda8d59e852d9ebb79ab290eb5ee languageName: node linkType: hard @@ -6587,7 +6676,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.8": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -6596,7 +6685,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.7, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": +"debug@npm:4, debug@npm:4.3.7, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -6632,7 +6721,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.2.7": +"debug@npm:^3.1.0": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -6672,6 +6761,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.2": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 9302b990cd6f4da1c7602200002e40e15d15660374432963421d3cd6d81cc6e27e0a488356b030fee64650947e32e78bdbea245d596dadfeeeb02e146d485999 + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -6752,7 +6848,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -6805,15 +6901,6 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "detect-indent@npm:4.0.0" - dependencies: - repeating: ^2.0.0 - checksum: 328f273915c1610899bc7d4784ce874413d0a698346364cd3ee5d79afba1c5cf4dbc97b85a801e20f4d903c0598bd5096af32b800dfb8696b81464ccb3dfda2c - languageName: node - linkType: hard - "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -6829,9 +6916,9 @@ __metadata: linkType: hard "detect-indent@npm:^7.0.1": - version: 7.0.1 - resolution: "detect-indent@npm:7.0.1" - checksum: cbf3f0b1c3c881934ca94428e1179b26ab2a587e0d719031d37a67fb506d49d067de54ff057cb1e772e75975fed5155c01cd4518306fee60988b1486e3fc7768 + version: 7.0.2 + resolution: "detect-indent@npm:7.0.2" + checksum: ef215d1b55a14f677ce03e840973b25362b6f8cd3f566bc82831fa1abb2be6a95423729bc573dc2334b1371ad7be18d9ec67e1a9611b71a04cb6d63f0d8e54cc languageName: node linkType: hard @@ -6928,6 +7015,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + "domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": version: 5.0.3 resolution: "domhandler@npm:5.0.3" @@ -6938,13 +7034,13 @@ __metadata: linkType: hard "domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" + version: 3.2.2 + resolution: "domutils@npm:3.2.2" dependencies: dom-serializer: ^2.0.0 domelementtype: ^2.3.0 domhandler: ^5.0.3 - checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 + checksum: ae941d56f03d857077d55dde9297e960a625229fc2b933187cc4123084d7c2d2517f58283a7336567127029f1e008449bac8ac8506d44341e29e3bb18e02f906 languageName: node linkType: hard @@ -6967,9 +7063,9 @@ __metadata: linkType: hard "dotenv@npm:^16.3.1": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c + version: 16.6.1 + resolution: "dotenv@npm:16.6.1" + checksum: e8bd63c9a37f57934f7938a9cf35de698097fadf980cb6edb61d33b3e424ceccfe4d10f37130b904a973b9038627c2646a3365a904b4406514ea94d7f1816b69 languageName: node linkType: hard @@ -6980,6 +7076,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + "duplexer@npm:^0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -7067,10 +7174,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.3.30, electron-to-chromium@npm:^1.5.41": - version: 1.5.42 - resolution: "electron-to-chromium@npm:1.5.42" - checksum: 8527f6e050b7f869d0135869587b3273fefa1cc2cbb9799bff552e10586b61860139758ee9824c803cdce632e24d4897bb7f67dcecf1c2bef279977fdfa9afa1 +"electron-to-chromium@npm:^1.3.30, electron-to-chromium@npm:^1.5.227": + version: 1.5.237 + resolution: "electron-to-chromium@npm:1.5.237" + checksum: 5905e2808dc6243ced0a83537afbafedec20c063feb6403a678b612a7855d79bc6ecb7d094bdab71f54173cf2ae5d1d8070b0c31572025001c94de62af84f5f8 languageName: node linkType: hard @@ -7119,11 +7226,11 @@ __metadata: linkType: hard "end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" dependencies: once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + checksum: 1e0cfa6e7f49887544e03314f9dfc56a8cb6dde910cbb445983ecc2ff426fc05946df9d75d8a21a3a64f2cecfe1bf88f773952029f46756b2ed64a24e95b1fb8 languageName: node linkType: hard @@ -7135,10 +7242,9 @@ __metadata: linkType: hard "engine.io@npm:~6.6.0": - version: 6.6.2 - resolution: "engine.io@npm:6.6.2" + version: 6.6.4 + resolution: "engine.io@npm:6.6.4" dependencies: - "@types/cookie": ^0.4.1 "@types/cors": ^2.8.12 "@types/node": ">=10.0.0" accepts: ~1.3.4 @@ -7148,17 +7254,17 @@ __metadata: debug: ~4.3.1 engine.io-parser: ~5.2.1 ws: ~8.17.1 - checksum: c474feff30fe8c816cccf1642b2f4980cacbff51afcda53c522cbeec4d0ed4047dfbcbeaff694bd88a5de51b3df832fbfb58293bbbf8ddba85459cb45be5f9da + checksum: e2d98ed3adc2fe6cdcee7208a95114bc12d3792f69abedcaeaf7cd21aec478f82b84d36f2e59b03af5f6ffae028923c0e799774400c008a768c8ceb17610a7c4 languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" +"enhanced-resolve@npm:^5.17.3": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 + checksum: e2b2188a7f9b68616984b5ce1f43b97bef3c5fde4d193c24ea4cfdb4eb784a700093f049f14155733a3cb3ae1204550590aa37dda7e742022c8f447f618a4816 languageName: node linkType: hard @@ -7172,11 +7278,14 @@ __metadata: linkType: hard "ent@npm:~2.2.0": - version: 2.2.1 - resolution: "ent@npm:2.2.1" + version: 2.2.2 + resolution: "ent@npm:2.2.2" dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 punycode: ^1.4.1 - checksum: 1db6470dd21d2659b6b6edec3c857843722579bbe25ea7f6a802ec9730b8673f2d8d6dc14af2a0c580eec83309a9cf9ee0442ba2c6b7738c7d69a1d64723451f + safe-regex-test: ^1.1.0 + checksum: f356c7894c0a2f02b9c1a81dcca17dd87a9000c015e754b9a00fa42bc5d554f231f481bde035a605a7a95150aacac9c545de75842a8cba67c9777b0d07d9319b languageName: node linkType: hard @@ -7187,6 +7296,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 937b952e81aca641660a6a07f70001c6821973dea3ae7f6a5013eadce94620f3ed2e9c745832d503c8811ce6e97704d8a0396159580c0e567d815234de7fdecf + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -7194,16 +7310,7 @@ __metadata: languageName: node linkType: hard -"envinfo@npm:7.13.0": - version: 7.13.0 - resolution: "envinfo@npm:7.13.0" - bin: - envinfo: dist/cli.js - checksum: 822fc30f53bd0be67f0e25be96eb6a2562b8062f3058846bbd7ec471bd4b7835fca6436ee72c4029c8ae4a3d8f8cddbe2ee725b22291f015232d20a682bee732 - languageName: node - linkType: hard - -"envinfo@npm:^7.7.3, envinfo@npm:^7.7.4": +"envinfo@npm:7.14.0, envinfo@npm:^7.7.3, envinfo@npm:^7.7.4": version: 7.14.0 resolution: "envinfo@npm:7.14.0" bin: @@ -7231,78 +7338,84 @@ __metadata: linkType: hard "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + checksum: 25136c0984569c8d68417036a9a1624804314296f24675199a391e5d20b2e26fe6d9304d40901293fa86900603a229983c9a8921ea7f1d16f814c2db946ff4ef languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" dependencies: - array-buffer-byte-length: ^1.0.1 - arraybuffer.prototype.slice: ^1.0.3 + array-buffer-byte-length: ^1.0.2 + arraybuffer.prototype.slice: ^1.0.4 available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - data-view-buffer: ^1.0.1 - data-view-byte-length: ^1.0.1 - data-view-byte-offset: ^1.0.0 - es-define-property: ^1.0.0 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + data-view-buffer: ^1.0.2 + data-view-byte-length: ^1.0.2 + data-view-byte-offset: ^1.0.1 + es-define-property: ^1.0.1 es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - es-set-tostringtag: ^2.0.3 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.4 - get-symbol-description: ^1.0.2 - globalthis: ^1.0.3 - gopd: ^1.0.1 + es-object-atoms: ^1.1.1 + es-set-tostringtag: ^2.1.0 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.8 + get-intrinsic: ^1.3.0 + get-proto: ^1.0.1 + get-symbol-description: ^1.1.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 hasown: ^2.0.2 - internal-slot: ^1.0.7 - is-array-buffer: ^3.0.4 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.5 is-callable: ^1.2.7 - is-data-view: ^1.0.1 + is-data-view: ^1.0.2 is-negative-zero: ^2.0.3 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.3 - is-string: ^1.0.7 - is-typed-array: ^1.1.13 - is-weakref: ^1.0.2 - object-inspect: ^1.13.1 + is-regex: ^1.2.1 + is-set: ^2.0.3 + is-shared-array-buffer: ^1.0.4 + is-string: ^1.1.1 + is-typed-array: ^1.1.15 + is-weakref: ^1.1.1 + math-intrinsics: ^1.1.0 + object-inspect: ^1.13.4 object-keys: ^1.1.1 - object.assign: ^4.1.5 - regexp.prototype.flags: ^1.5.2 - safe-array-concat: ^1.1.2 - safe-regex-test: ^1.0.3 - string.prototype.trim: ^1.2.9 - string.prototype.trimend: ^1.0.8 + object.assign: ^4.1.7 + own-keys: ^1.0.1 + regexp.prototype.flags: ^1.5.4 + safe-array-concat: ^1.1.3 + safe-push-apply: ^1.0.0 + safe-regex-test: ^1.1.0 + set-proto: ^1.0.0 + stop-iteration-iterator: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 string.prototype.trimstart: ^1.0.8 - typed-array-buffer: ^1.0.2 - typed-array-byte-length: ^1.0.1 - typed-array-byte-offset: ^1.0.2 - typed-array-length: ^1.0.6 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.15 - checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae + typed-array-buffer: ^1.0.3 + typed-array-byte-length: ^1.0.3 + typed-array-byte-offset: ^1.0.4 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.1.0 + which-typed-array: ^1.1.19 + checksum: 06b3d605e56e3da9d16d4db2629a42dac1ca31f2961a41d15c860422a266115e865b43e82d6b9da81a0fabbbb65ebc12fb68b0b755bc9dbddacb6bf7450e96df languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: ^1.2.4 - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a languageName: node linkType: hard -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 @@ -7310,40 +7423,53 @@ __metadata: linkType: hard "es-module-lexer@npm:^1.2.1": - version: 1.5.4 - resolution: "es-module-lexer@npm:1.5.4" - checksum: a0cf04fb92d052647ac7d818d1913b98d3d3d0f5b9d88f0eafb993436e4c3e2c958599db68839d57f2dfa281fdf0f60e18d448eb78fc292c33c0f25635b6854f + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 7858bb76ae387fdbf8a6fccc951bf18919768309850587553eca34698b9193fbc65fab03d3d9f69163d860321fbf66adf89d5821e7f4148c7cb7d7b997259211 languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: ^1.3.0 - checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - get-intrinsic: ^1.2.4 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 has-tostringtag: ^1.0.2 - hasown: ^2.0.1 - checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 + languageName: node + linkType: hard + +"es-toolkit@npm:^1.39.7": + version: 1.40.0 + resolution: "es-toolkit@npm:1.40.0" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 4afe2de2d73fc8d59f259b001e96bc49adb6a191480c37f745703726cc8f06d4502dfdfdb5dd3e4ed47d5eff4de73c94c9d837ad8ff7074564c1922579181e98 languageName: node linkType: hard @@ -7368,27 +7494,52 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 languageName: node linkType: hard +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"escodegen@npm:^2.0.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 + languageName: node + linkType: hard + "eslint-config-prettier@npm:^8.3.0, eslint-config-prettier@npm:^8.6.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" + version: 8.10.2 + resolution: "eslint-config-prettier@npm:8.10.2" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + checksum: a92b7e8a996e65adf79de1579524235687e9d3552d088cfab4f170da60d23762addb4276169c8ca3a9551329dda8408c59f7e414101b238a6385379ac1bc3b16 languageName: node linkType: hard "eslint-plugin-prettier@npm:^4.0.0, eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" + version: 4.2.5 + resolution: "eslint-plugin-prettier@npm:4.2.5" dependencies: prettier-linter-helpers: ^1.0.0 peerDependencies: @@ -7397,7 +7548,7 @@ __metadata: peerDependenciesMeta: eslint-config-prettier: optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + checksum: 22c29ba685f18516e3b1595e062849ccc108996a759da6067ff5d876519a5f81c8ba92c0c5623a1c62b593d417619ba44ab3b6ec1450ca753c078fd92970b883 languageName: node linkType: hard @@ -7487,7 +7638,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -7557,6 +7708,15 @@ __metadata: languageName: node linkType: hard +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: ^2.7.0 + checksum: fb8451c98535bde30585004303a368d55c38e5bc3ed6aa9b5d29fecaabaf8ec276a33ff77dcc1d1c05eecf83b8161f184cabc9a03b76a06c10e9a4ce827a6abc + languageName: node + linkType: hard + "events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -7596,9 +7756,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 471fdb70fd3d2c08a74a026973bdd4105b7832911f610ca67bbb74e39279411c1eed2f2a110c9d41c2edd89459ba58fdaba1c174beed73e7a42d773882dcff82 languageName: node linkType: hard @@ -7648,6 +7808,45 @@ __metadata: languageName: node linkType: hard +"express@npm:4.21.1": + version: 4.21.1 + resolution: "express@npm:4.21.1" + dependencies: + accepts: ~1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: ~1.0.4 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: ~2.0.0 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: ~1.1.2 + on-finished: 2.4.1 + parseurl: ~1.3.3 + path-to-regexp: 0.1.10 + proxy-addr: ~2.0.7 + qs: 6.13.0 + range-parser: ~1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: ~1.6.18 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: 5ac2b26d8aeddda5564fc0907227d29c100f90c0ead2ead9d474dc5108e8fb306c2de2083c4e3ba326e0906466f2b73417dbac16961f4075ff9f03785fd940fe + languageName: node + linkType: hard + "extend@npm:^3.0.0, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -7655,17 +7854,6 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.0.3, external-editor@npm:^3.1.0": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - "extsprintf@npm:1.3.0, extsprintf@npm:^1.2.0": version: 1.3.0 resolution: "extsprintf@npm:1.3.0" @@ -7673,13 +7861,6 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-deep-equal@npm:1.1.0" - checksum: 69b4c9534d9805f13a341aa72f69641d0b9ae3cc8beb25c64e68a257241c7bb34370266db27ae4fc3c4da0518448c01a5f587a096a211471c86a38facd9a1486 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -7714,16 +7895,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": ^2.0.2 "@nodelib/fs.walk": ^1.2.3 glob-parent: ^5.1.2 merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + micromatch: ^4.0.8 + checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd languageName: node linkType: hard @@ -7756,9 +7937,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.3 - resolution: "fast-uri@npm:3.0.3" - checksum: c52e6c86465f5c240e84a4485fb001088cc743d261a4b54b0050ce4758b1648bdbe53da1328ef9620149dca1435e3de64184f226d7c0a3656cb5837b3491e149 + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: daab0efd3548cc53d0db38ecc764d125773f8bd70c34552ff21abdc6530f26fa4cb1771f944222ca5e61a0a1a85d01a104848ff88c61736de445d97bd616ea7e languageName: node linkType: hard @@ -7770,11 +7951,23 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: ^1.0.4 - checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 + checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6 + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: bd537daa9d3cd53887eed35efa0eab2dbb1ca408790e10e024120e7a36c6e9ae2b33710cb8381e35def01bc9c1d7eaba746f886338413e68ff6ebaee07b9a6e8 languageName: node linkType: hard @@ -7901,9 +8094,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.7, flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard @@ -7915,12 +8108,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 + checksum: 20bf55e9504f59e6cc3743ba27edb2ebf41edea1baab34799408f2c050f73f0c612728db21c691276296d2795ea8a812dc532a98e8793619fcab91abe06d017f languageName: node linkType: hard @@ -7931,22 +8124,22 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: ^7.0.0 + cross-spawn: ^7.0.6 signal-exit: ^4.0.1 - checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 + checksum: b2c1a6fc0bf0233d645d9fefdfa999abf37db1b33e5dab172b3cbfb0662b88bfbd2c9e7ab853533d199050ec6b65c03fcf078fc212d26e4990220e98c6930eef languageName: node linkType: hard @@ -7957,25 +8150,16 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.1 - resolution: "form-data@npm:4.0.1" +"form-data@npm:^4.0.0, form-data@npm:^4.0.4, form-data@npm:~4.0.0": + version: 4.0.4 + resolution: "form-data@npm:4.0.4" dependencies: asynckit: ^0.4.0 combined-stream: ^1.0.8 + es-set-tostringtag: ^2.1.0 + hasown: ^2.0.2 mime-types: ^2.1.12 - checksum: ccee458cd5baf234d6b57f349fe9cc5f9a2ea8fd1af5ecda501a18fd1572a6dd3bf08a49f00568afd995b6a65af34cb8dec083cf9d582c4e621836499498dd84 - languageName: node - linkType: hard - -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 10c1780fa13dbe1ff3100114c2ce1f9307f8be10b14bf16e103815356ff567b6be39d70fc4a40f8990b9660012dc24b0f5e1dde1b6426166eb23a445ba068ca3 + checksum: 9b7788836df9fa5a6999e0c02515b001946b2a868cfe53f026c69e2c537a2ff9fbfb8e9d2b678744628f3dc7a2d6e14e4e45dfaf68aa6239727f0bdb8ce0abf2 languageName: node linkType: hard @@ -8019,13 +8203,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" + version: 11.3.2 + resolution: "fs-extra@npm:11.3.2" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 + checksum: 24a7a6e09668add7f74bf6884086b860ce39c7883d94f564623d4ca5c904ff9e5e33fa6333bd3efbf3528333cdedf974e49fa0723e9debf952f0882e6553d81e languageName: node linkType: hard @@ -8103,15 +8287,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 functions-have-names: ^1.2.3 - checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 + hasown: ^2.0.2 + is-callable: ^1.2.7 + checksum: 3a366535dc08b25f40a322efefa83b2da3cd0f6da41db7775f2339679120ef63b6c7e967266182609e655b8f0a8f65596ed21c7fd72ad8bd5621c2340edd4010 languageName: node linkType: hard @@ -8138,6 +8324,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 3bf87f7b0230de5d74529677e6c3ceb3b7b5d9618b5a22d92b45ce3876defbaf5a77791b25a61b0fa7d13f95675b5ff67a7769f3b9af33f096e34653519e873d + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -8159,16 +8352,24 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" dependencies: + async-function: ^1.0.0 + async-generator-function: ^1.0.0 + call-bind-apply-helpers: ^1.0.2 + es-define-property: ^1.0.1 es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 function-bind: ^1.1.2 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + generator-function: ^2.0.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + math-intrinsics: ^1.1.0 + checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a languageName: node linkType: hard @@ -8193,6 +8394,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stdin@npm:^9.0.0": version: 9.0.0 resolution: "get-stdin@npm:9.0.0" @@ -8216,14 +8427,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: ^1.0.5 + call-bound: ^1.0.3 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 + get-intrinsic: ^1.2.6 + checksum: 655ed04db48ee65ef2ddbe096540d4405e79ba0a7f54225775fef43a7e2afcb93a77d141c5f05fdef0afce2eb93bcbfb3597142189d562ac167ff183582683cd languageName: node linkType: hard @@ -8244,9 +8455,9 @@ __metadata: linkType: hard "git-hooks-list@npm:^3.0.0": - version: 3.1.0 - resolution: "git-hooks-list@npm:3.1.0" - checksum: 05cbdb29e1e14f3b6fde78c876a34383e4476b1be32e8486ad03293f01add884c1a8df8c2dce2ca5d99119c94951b2ff9fa9cbd51d834ae6477b6813cefb998f + version: 3.2.0 + resolution: "git-hooks-list@npm:3.2.0" + checksum: 1bc1ecd9d68c56523e96109581a7e8d2cfefc9320171dff67b0010dcc3611deff9ea32720f3eb65abfc4ba971372658f5dd118d7de458161939ba88ac8824f4f languageName: node linkType: hard @@ -8368,7 +8579,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.2.4, glob@npm:^10.3.10, glob@npm:^10.3.7": +"glob@npm:^10.2.2, glob@npm:^10.2.4, glob@npm:^10.3.7": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -8424,13 +8635,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -8440,14 +8644,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^9.18.0": - version: 9.18.0 - resolution: "globals@npm:9.18.0" - checksum: e9c066aecfdc5ea6f727344a4246ecc243aaf66ede3bffee10ddc0c73351794c25e727dd046090dcecd821199a63b9de6af299a6e3ba292c8b22f0a80ea32073 - languageName: node - linkType: hard - -"globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -8501,25 +8698,10 @@ __metadata: languageName: node linkType: hard -"globby@npm:^13.1.2": - version: 13.2.2 - resolution: "globby@npm:13.2.2" - dependencies: - dir-glob: ^3.0.1 - fast-glob: ^3.3.0 - ignore: ^5.2.4 - merge2: ^1.4.1 - slash: ^4.0.0 - checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 languageName: node linkType: hard @@ -8542,7 +8724,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -8611,19 +8793,10 @@ __metadata: languageName: node linkType: hard -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: ^2.0.0 - checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 79730518ae02c77e4af6a1d1a0b6a2c3e1509785532771f9baf0241e83e36329542c3d7a0e723df8cbc85f74eff4f177828a2265a01ba576adbdc2d40d86538b languageName: node linkType: hard @@ -8650,21 +8823,23 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: ^1.0.0 + checksum: f55010cb94caa56308041d77967c72a02ffd71386b23f9afa8447e58bc92d49d15c19bf75173713468e92fe3fb1680b03b115da39c21c32c74886d1d50d3e7ff languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -8680,7 +8855,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -8732,6 +8907,13 @@ __metadata: languageName: node linkType: hard +"hpagent@npm:^1.2.0": + version: 1.2.0 + resolution: "hpagent@npm:1.2.0" + checksum: b029da695edae438cee4da2a437386f9db4ac27b3ceb7306d02e1b586c9c194741ed2e943c8a222e0cfefaf27ee3f863aca7ba1721b0950a2a19bf25bc0d85e2 + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^3.0.0": version: 3.0.0 resolution: "html-encoding-sniffer@npm:3.0.0" @@ -8761,9 +8943,9 @@ __metadata: linkType: hard "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 7a7246ddfce629f96832791176fd643589d954e6f3b49548dadb4290451961237fab8fcea41cd2008fe819d95b41c1e8b97f47d088afc0a1c81705287b4ddbcc languageName: node linkType: hard @@ -8835,14 +9017,14 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.3.6": - version: 1.3.6 - resolution: "http-signature@npm:1.3.6" +"http-signature@npm:~1.4.0": + version: 1.4.0 + resolution: "http-signature@npm:1.4.0" dependencies: assert-plus: ^1.0.0 jsprim: ^2.0.2 - sshpk: ^1.14.1 - checksum: 10be2af4764e71fee0281392937050201ee576ac755c543f570d6d87134ce5e858663fe999a7adb3e4e368e1e356d0d7fec6b9542295b875726ff615188e7a0c + sshpk: ^1.18.0 + checksum: f07f4cc0481e4461c68b9b7d1a25bf2ec4cef8e0061812b989c1e64f504b4b11f75f88022102aea05d25d47a87789599f1a310b1f8a56945a50c93e54c7ee076 languageName: node linkType: hard @@ -8870,7 +9052,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -8881,12 +9063,12 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: ^7.0.2 + agent-base: ^7.1.2 debug: 4 - checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 + checksum: b882377a120aa0544846172e5db021fa8afbf83fea2a897d397bd2ddd8095ab268c24bc462f40a15f2a8c600bf4aa05ce52927f70038d4014e68aefecfa94e8d languageName: node linkType: hard @@ -8915,7 +9097,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": +"iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -8933,6 +9115,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.7.0": + version: 0.7.0 + resolution: "iconv-lite@npm:0.7.0" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: f362a8befb95e37f29be1d1290c17e0c9d0d4ad4fa62fcfd813cc9c937ab89401abed9a011f83e10651a267abb2aa231ec7da91d843570bec873bd98489b5bf8 + languageName: node + linkType: hard + "icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": version: 5.1.0 resolution: "icss-utils@npm:5.1.0" @@ -8958,7 +9149,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.0.4, ignore@npm:^5.1.1, ignore@npm:^5.1.9, ignore@npm:^5.2.0, ignore@npm:^5.2.4": +"ignore@npm:^5.0.4, ignore@npm:^5.1.1, ignore@npm:^5.1.9, ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be @@ -8975,12 +9166,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: ^1.0.0 resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -9064,14 +9255,14 @@ __metadata: linkType: hard "inquirer@npm:^8.2.4": - version: 8.2.6 - resolution: "inquirer@npm:8.2.6" + version: 8.2.7 + resolution: "inquirer@npm:8.2.7" dependencies: + "@inquirer/external-editor": ^1.0.0 ansi-escapes: ^4.2.1 chalk: ^4.1.1 cli-cursor: ^3.1.0 cli-width: ^3.0.0 - external-editor: ^3.0.3 figures: ^3.0.0 lodash: ^4.17.21 mute-stream: 0.0.8 @@ -9082,18 +9273,18 @@ __metadata: strip-ansi: ^6.0.0 through: ^2.3.6 wrap-ansi: ^6.0.1 - checksum: 387ffb0a513559cc7414eb42c57556a60e302f820d6960e89d376d092e257a919961cd485a1b4de693dbb5c0de8bc58320bfd6247dfd827a873aa82a4215a240 + checksum: b7e39a04da31207826f675e2ff491bd35bb28efbe336e8fb49641d8353d4a312943514452fb0a23702e64f70c7e44188586880c902d67541aae579cd6564c3fb languageName: node linkType: hard "inquirer@npm:^9.1.4": - version: 9.3.7 - resolution: "inquirer@npm:9.3.7" + version: 9.3.8 + resolution: "inquirer@npm:9.3.8" dependencies: + "@inquirer/external-editor": ^1.0.2 "@inquirer/figures": ^1.0.3 ansi-escapes: ^4.3.2 cli-width: ^4.1.0 - external-editor: ^3.1.0 mute-stream: 1.0.0 ora: ^5.4.1 run-async: ^3.0.0 @@ -9102,18 +9293,18 @@ __metadata: strip-ansi: ^6.0.1 wrap-ansi: ^6.2.0 yoctocolors-cjs: ^2.1.2 - checksum: 4d6e2f51b80051a6b9cc583ed5143e0a2c5e51938ffc0e91bbf8038216090566990f36ccb7856038390891fa69ea8d43ec389c70dcd097b67d351dc365dfc345 + checksum: 7afda58051660abd72d46a904df5295a16e8936f85fe99cb3138837777e71239591e6ed085f6cbfd28c51962d1d04386d5cc53a399060e30252ef5f991c58c13 languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: es-errors: ^1.3.0 - hasown: ^2.0.0 - side-channel: ^1.0.4 - checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb + hasown: ^2.0.2 + side-channel: ^1.1.0 + checksum: 8e0991c2d048cc08dab0a91f573c99f6a4215075887517ea4fa32203ce8aea60fa03f95b177977fa27eb502e5168366d0f3e02c762b799691411d49900611861 languageName: node linkType: hard @@ -9131,22 +9322,10 @@ __metadata: languageName: node linkType: hard -"invariant@npm:^2.2.2": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: ^1.0.0 - checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: 1.1.0 - sprintf-js: ^1.1.3 - checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc +"ip-address@npm:^10.0.1": + version: 10.0.1 + resolution: "ip-address@npm:10.0.1" + checksum: 525d5391cfd31a91f80f5857e98487aeaa8474e860a6725a0b6461ac8e436c7f8c869774dece391c8f8e7486306a34a4d1c094778c4c583a3f1f2cd905e5ed50 languageName: node linkType: hard @@ -9157,13 +9336,14 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: f137a2a6e77af682cdbffef1e633c140cf596f72321baf8bba0f4ef22685eb4339dde23dfe9e9ca430b5f961dee4d46577dcf12b792b68518c8449b134fb9156 languageName: node linkType: hard @@ -9175,18 +9355,31 @@ __metadata: linkType: hard "is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + version: 0.3.4 + resolution: "is-arrayish@npm:0.3.4" + checksum: 09816634eb7b6e357067f6b49c7656b4aff6d8b25486553d086bab53ce0f929c0293906539503b2a317f3137b5a5cd7e9ea01305f6090c0037c4340d9121420d languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: ^1.0.0 + call-bound: ^1.0.3 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 9bece45133da26636488ca127d7686b85ad3ca18927e2850cff1937a650059e90be1c71a48623f8791646bb7a241b0cabf602a0b9252dcfa5ab273f2399000e6 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + has-bigints: ^1.0.2 + checksum: ee1544f0e664f253306786ed1dce494b8cf242ef415d6375d8545b4d8816b0f054bd9f948a8988ae2c6325d1c28260dd02978236b2f7b8fb70dfc4838a6c9fa7 languageName: node linkType: hard @@ -9199,17 +9392,17 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 0415b181e8f1bfd5d3f8a20f8108e64d372a72131674eea9c2923f39d065b6ad08d654765553bdbffbd92c3746f1007986c34087db1bd89a31f71be8359ccdaa languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac @@ -9227,30 +9420,33 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": - version: 2.15.1 - resolution: "is-core-module@npm:2.15.1" +"is-core-module@npm:^2.16.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: hasown: ^2.0.2 - checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 + checksum: 6ec5b3c42d9cbf1ac23f164b16b8a140c3cec338bf8f884c076ca89950c7cc04c33e78f02b8cae7ff4751f3247e3174b2330f1fe4de194c7210deb8b1ea316a7 languageName: node linkType: hard -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 is-typed-array: ^1.1.13 - checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + checksum: 31600dd19932eae7fd304567e465709ffbfa17fa236427c9c864148e1b54eb2146357fcf3aed9b686dee13c217e1bb5a649cb3b9c479e1004c0648e9febde1b2 languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: d6c36ab9d20971d65f3fc64cef940d57a4900a2ac85fb488a46d164c2072a33da1cb51eefcc039e3e5c208acbce343d3480b84ab5ff0983f617512da2742562a languageName: node linkType: hard @@ -9277,10 +9473,12 @@ __metadata: languageName: node linkType: hard -"is-finite@npm:^1.0.0": - version: 1.1.0 - resolution: "is-finite@npm:1.1.0" - checksum: 532b97ed3d03e04c6bd203984d9e4ba3c0c390efee492bad5d1d1cd1802a68ab27adbd3ef6382f6312bed6c8bb1bd3e325ea79a8dc8fe080ed7a06f5f97b93e7 +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + checksum: 38c646c506e64ead41a36c182d91639833311970b6b6c6268634f109eef0a1a9d2f1f2e499ef4cb43c744a13443c4cdd2f0812d5afdcee5e9b65b72b28c48557 languageName: node linkType: hard @@ -9298,6 +9496,19 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" + dependencies: + call-bound: ^1.0.4 + generator-function: ^2.0.0 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 0b81c613752a5e534939e5b3835ff722446837a5b94c3a3934af5ded36a651d9aa31c3f11f8a3453884b9658bf26dbfb7eb855e744d920b07f084bd890a43414 + languageName: node + linkType: hard + "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -9328,6 +9539,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: e6ce5f6380f32b141b3153e6ba9074892bbbbd655e92e7ba5ff195239777e767a976dcd4e22f864accaf30e53ebf961ab1995424aef91af68788f0591b7396cc + languageName: node + linkType: hard + "is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" @@ -9335,12 +9553,13 @@ __metadata: languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 6517f0a0e8c4b197a21afb45cd3053dc711e79d45d8878aa3565de38d0102b130ca8732485122c7b336e98c27dacd5236854e3e6526e0eb30cae64956535662f languageName: node linkType: hard @@ -9402,6 +9621,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + "is-promise@npm:^2.1.0": version: 2.2.2 resolution: "is-promise@npm:2.2.2" @@ -9409,31 +9635,40 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: ^1.0.7 - checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 + call-bound: ^1.0.3 + checksum: 1611fedc175796eebb88f4dfc393dd969a4a8e6c69cadaff424ee9d4464f9f026399a5f84a90f7c62d6d7ee04e3626a912149726de102b0bd6c1ee6a9868fa5a languageName: node linkType: hard "is-ssh@npm:^1.4.0": - version: 1.4.0 - resolution: "is-ssh@npm:1.4.0" + version: 1.4.1 + resolution: "is-ssh@npm:1.4.1" dependencies: protocols: ^2.0.1 - checksum: 75eaa17b538bee24b661fbeb0f140226ac77e904a6039f787bea418431e2162f1f9c4c4ccad3bd169e036cd701cc631406e8c505d9fa7e20164e74b47f86f40f + checksum: 005b461ac444398eb8b7cd2f489288e49dd18c8b6cbf1eb20767f9b79f330ab6e3308b2dac8ec6ca2a950d2a368912e0e992e2474bc1b5204693abb6226c1431 languageName: node linkType: hard @@ -9444,21 +9679,24 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 2eeaaff605250f5e836ea3500d33d1a5d3aa98d008641d9d42fb941e929ffd25972326c2ef912987e54c95b6f10416281aaf1b35cdf81992cfb7524c5de8e193 languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + call-bound: ^1.0.2 + has-symbols: ^1.1.0 + safe-regex-test: ^1.1.0 + checksum: bfafacf037af6f3c9d68820b74be4ae8a736a658a3344072df9642a090016e281797ba8edbeb1c83425879aae55d1cb1f30b38bf132d703692b2570367358032 languageName: node linkType: hard @@ -9471,12 +9709,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: ^1.1.14 - checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 languageName: node linkType: hard @@ -9494,12 +9732,29 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + checksum: 1769b9aed5d435a3a989ffc18fc4ad1947d2acdaf530eb2bd6af844861b545047ea51102f75901f89043bed0267ed61d914ee21e6e8b9aa734ec201cdfc0726f + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: 5c6c8415a06065d78bdd5e3a771483aa1cd928df19138aa73c4c51333226f203f22117b4325df55cc8b3085a6716870a320c2d757efee92d7a7091a039082041 languageName: node linkType: hard @@ -9582,27 +9837,6 @@ __metadata: languageName: node linkType: hard -"istanbul-instrumenter-loader@npm:^3.0.1": - version: 3.0.1 - resolution: "istanbul-instrumenter-loader@npm:3.0.1" - dependencies: - convert-source-map: ^1.5.0 - istanbul-lib-instrument: ^1.7.3 - loader-utils: ^1.1.0 - schema-utils: ^0.3.0 - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 6b2eb9987f79dd451c43e0fcc6fa77bf0f7ac91f3237b7833a07ad6f35e15a6bff579e943edfc2dee203408b6c3a2b4b11f3028b8628cb7304df3decc7552831 - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^1.2.1": - version: 1.2.1 - resolution: "istanbul-lib-coverage@npm:1.2.1" - checksum: 72bfeaa9212f5a6abb243cbce4933712599ba9a6fbdee819f4f5a4cf87ed15cb92772fcab219e93c3712c578774d6d8e54084440423356b3da5d9f8ecaba9888 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -9610,21 +9844,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^1.7.3": - version: 1.10.2 - resolution: "istanbul-lib-instrument@npm:1.10.2" - dependencies: - babel-generator: ^6.18.0 - babel-template: ^6.16.0 - babel-traverse: ^6.18.0 - babel-types: ^6.18.0 - babylon: ^6.18.0 - istanbul-lib-coverage: ^1.2.1 - semver: ^5.3.0 - checksum: c299d73820b0ac93d1c53f436181da09579083dc4a0febadbda93f598f9a5591fe4888c3071a913eede36148d6481fdf163fa0b6ec7156fffe2a95cff965fc51 - languageName: node - linkType: hard - "istanbul-lib-instrument@npm:^5.1.0": version: 5.2.1 resolution: "istanbul-lib-instrument@npm:5.2.1" @@ -9661,12 +9880,12 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.0.5": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 + checksum: 72b4c8525276147908d28b0917bc675b1019836b638e50875521ca3b8ec63672681aa98dbab88a6f49ef798c08fe041d428abdcf84f4f3fcff5844eee54af65a languageName: node linkType: hard @@ -9684,16 +9903,78 @@ __metadata: linkType: hard "jake@npm:^10.8.5": - version: 10.9.2 - resolution: "jake@npm:10.9.2" + version: 10.9.4 + resolution: "jake@npm:10.9.4" dependencies: - async: ^3.2.3 - chalk: ^4.0.2 + async: ^3.2.6 filelist: ^1.0.4 - minimatch: ^3.1.2 + picocolors: ^1.1.1 bin: jake: bin/cli.js - checksum: f2dc4a086b4f58446d02cb9be913c39710d9ea570218d7681bb861f7eeaecab7b458256c946aeaa7e548c5e0686cc293e6435501e4047174a3b6a504dcbfcaae + checksum: 1ca6f6a6fe1f2385ed32df82fcb71f9c7378f7fb591ed0b183e9d79a1801221cfe96f3dd9174db2d1a9705a13ae659f2af7004ad23645c910121fc7086a137ef + languageName: node + linkType: hard + +"jest-environment-jsdom@npm:^29.3.0": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" + dependencies: + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/jsdom": ^20.0.0 + "@types/node": "*" + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + jsdom: ^20.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 559aac134c196fccc1dfc794d8fc87377e9f78e894bb13012b0831d88dec0abd7ece99abec69da564b8073803be4f04a9eb4f4d1bb80e29eec0cb252c254deb8 + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.6.3 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.7.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: a9d025b1c6726a2ff17d54cc694de088b0489456c69106be6b615db7a51b7beb66788bea7a59991a019d924fbf20f67d085a445aedb9a4d6760363f4d7d09930 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@types/node": "*" + jest-util: ^29.7.0 + checksum: 81ba9b68689a60be1482212878973700347cb72833c5e5af09895882b9eb5c4e02843a1bbdf23f94c52d42708bab53a30c45a3482952c9eec173d1eaac5b86c5 + languageName: node + linkType: hard + +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca languageName: node linkType: hard @@ -9709,11 +9990,11 @@ __metadata: linkType: hard "jquery-ui@npm:^1.12.1": - version: 1.14.0 - resolution: "jquery-ui@npm:1.14.0" + version: 1.14.1 + resolution: "jquery-ui@npm:1.14.1" dependencies: jquery: ">=1.12.0 <5.0.0" - checksum: 16e85d54df56c6f0411de92cc2e1ff570ed247f6346735cac4a62f7ef4160f239ba36b4e5e5aaca6bfd34dbf1100da4028673f5097c69bfac8d076f4299f92c5 + checksum: 376d2af7a3be0de1d42b522c2f1f2891dd521adde333f732f94f2dbff6c9926352d345d13bb92c784c9933bb49743934a712af498ada7d6cfb91e3aab66f03e3 languageName: node linkType: hard @@ -9731,13 +10012,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^3.0.2": - version: 3.0.2 - resolution: "js-tokens@npm:3.0.2" - checksum: ff24cf90e6e4ac446eba56e604781c1aaf3bdaf9b13a00596a0ebd972fa3b25dc83c0f0f67289c33252abb4111e0d14e952a5d9ffb61f5c22532d555ebd8d8a9 - languageName: node - linkType: hard - "js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -9761,13 +10035,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 - languageName: node - linkType: hard - "jsbn@npm:~0.1.0": version: 0.1.1 resolution: "jsbn@npm:0.1.1" @@ -9775,21 +10042,51 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^1.3.0": - version: 1.3.0 - resolution: "jsesc@npm:1.3.0" - bin: - jsesc: bin/jsesc - checksum: 9384cc72bf8ef7f2eb75fea64176b8b0c1c5e77604854c72cb4670b7072e112e3baaa69ef134be98cb078834a7812b0bfe676ad441ccd749a59427f5ed2127f1 +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.2 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.11.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 languageName: node linkType: hard "jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f languageName: node linkType: hard @@ -9834,13 +10131,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^0.3.0": - version: 0.3.1 - resolution: "json-schema-traverse@npm:0.3.1" - checksum: a685c36222023471c25c86cddcff506306ecb8f8941922fd356008419889c41c38e1c16d661d5499d0a561b34f417693e9bb9212ba2b2b2f8f8a345a49e4ec1a - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -9883,17 +10173,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": - version: 1.0.2 - resolution: "json5@npm:1.0.2" - dependencies: - minimist: ^1.2.0 - bin: - json5: lib/cli.js - checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 - languageName: node - linkType: hard - "json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -9923,15 +10202,15 @@ __metadata: linkType: hard "jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" dependencies: graceful-fs: ^4.1.6 universalify: ^2.0.0 dependenciesMeta: graceful-fs: optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + checksum: c3028ec5c770bb41290c9bb9ca04bdd0a1b698ddbdf6517c9453d3f90fc9e000c9675959fb46891d317690a93c62de03ff1735d8dbe02be83e51168ce85815d3 languageName: node linkType: hard @@ -10001,13 +10280,13 @@ __metadata: linkType: hard "jwa@npm:^1.4.1": - version: 1.4.1 - resolution: "jwa@npm:1.4.1" + version: 1.4.2 + resolution: "jwa@npm:1.4.2" dependencies: - buffer-equal-constant-time: 1.0.1 + buffer-equal-constant-time: ^1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: ^5.0.1 - checksum: ff30ea7c2dcc61f3ed2098d868bf89d43701605090c5b21b5544b512843ec6fd9e028381a4dda466cbcdb885c2d1150f7c62e7168394ee07941b4098e1035e2f + checksum: fd1a6de6c649a4b16f0775439ac9173e4bc9aa0162c7f3836699af47736ae000fafe89f232a2345170de6c14021029cb94b488f7882c6caf61e6afef5fce6494 languageName: node linkType: hard @@ -10208,8 +10487,8 @@ __metadata: linkType: hard "less@npm:^4.1.2": - version: 4.2.0 - resolution: "less@npm:4.2.0" + version: 4.4.2 + resolution: "less@npm:4.4.2" dependencies: copy-anything: ^2.0.1 errno: ^0.1.1 @@ -10238,7 +10517,7 @@ __metadata: optional: true bin: lessc: bin/lessc - checksum: 2ec4fa41e35e5c0331c1ee64419aa5c2cbb9a17b9e9d1deb524ec45843f59d9c4612dffc164ca16126911fbe9913e4ff811a13f33805f71e546f6d022ece93b6 + checksum: c2cb1bdfadd499892d71520b66adcd0d1d2ae206080321cd7b9fd321fd6947e65a275d8603477ca6f4f5d308375c8803752dc76caad155398c2460b791581d16 languageName: node linkType: hard @@ -10252,16 +10531,16 @@ __metadata: languageName: node linkType: hard -"lib0@npm:^0.2.85, lib0@npm:^0.2.98": - version: 0.2.98 - resolution: "lib0@npm:0.2.98" +"lib0@npm:^0.2.85, lib0@npm:^0.2.99": + version: 0.2.114 + resolution: "lib0@npm:0.2.114" dependencies: isomorphic.js: ^0.2.4 bin: 0ecdsa-generate-keypair: bin/0ecdsa-generate-keypair.js 0gentesthtml: bin/gentesthtml.js 0serve: bin/0serve.js - checksum: 8d17060deb4ffb73f825e634e6543c024d27dad589a7ce2e6334af34b36d4441434edabf3716930f6c5e1c32c5f3e867b8c1b922c1cc51b22469f281292e423b + checksum: af6583437c4a29bf015407fc81882009b3f0b916d308d05d93287b20f19f3bd41674e30ea6a98789bcc71cc4e32f748ad5d94ea657d82911003710bbf6018764 languageName: node linkType: hard @@ -10394,20 +10673,9 @@ __metadata: linkType: hard "loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 - languageName: node - linkType: hard - -"loader-utils@npm:^1.1.0": - version: 1.4.2 - resolution: "loader-utils@npm:1.4.2" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^1.0.1 - checksum: eb6fb622efc0ffd1abdf68a2022f9eac62bef8ec599cf8adb75e94d1d338381780be6278534170e99edc03380a6d29bc7eb1563c89ce17c5fed3a0b17f1ad804 + version: 4.3.1 + resolution: "loader-runner@npm:4.3.1" + checksum: 14689a39a79b286d3d15f2199384d6132d62ea707abd6c7e50dc8a1f80c20cbfdd5344f7e6b4a7346974696689ab1a96f8ec7d1e8bf206c5264561502658bd3c languageName: node linkType: hard @@ -10590,7 +10858,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4, lodash@npm:4.17.21, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.6.1, lodash@npm:^4.7.0": +"lodash@npm:4, lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.6.1, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -10641,7 +10909,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -10772,23 +11040,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - "@npmcli/agent": ^2.0.0 - cacache: ^18.0.0 + "@npmcli/agent": ^3.0.0 + cacache: ^19.0.1 http-cache-semantics: ^4.1.1 - is-lambda: ^1.0.1 minipass: ^7.0.2 - minipass-fetch: ^3.0.0 + minipass-fetch: ^4.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - proc-log: ^4.2.0 + negotiator: ^1.0.0 + proc-log: ^5.0.0 promise-retry: ^2.0.1 - ssri: ^10.0.0 - checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd + ssri: ^12.0.0 + checksum: 6fb2fee6da3d98f1953b03d315826b5c5a4ea1f908481afc113782d8027e19f080c85ae998454de4e5f27a681d3ec58d57278f0868d4e0b736f51d396b661691 languageName: node linkType: hard @@ -10807,11 +11074,14 @@ __metadata: linkType: hard "markdown-to-jsx@npm:^7.4.1": - version: 7.5.0 - resolution: "markdown-to-jsx@npm:7.5.0" + version: 7.7.15 + resolution: "markdown-to-jsx@npm:7.7.15" peerDependencies: react: ">= 0.14.0" - checksum: c9c6f1bfad5f2d9b1d3476eb0313ae3dffd0a9f14011c74efdd7c664fd32ee1842ef48abb16a496046f90361af49aa80a827e9d9c0bc04824a1986fdeb4d1852 + peerDependenciesMeta: + react: + optional: true + checksum: 4c904db5fe1aa7d238706ffc3acadf6fd1331ec9fc70a609dcbb3d60bf936a0eb7cb15aa06ceb2520434e91cd90fb0610e6008c43689a54a331691521087c5a1 languageName: node linkType: hard @@ -10831,6 +11101,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -10892,7 +11169,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -10902,20 +11179,13 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0": +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard -"mime-db@npm:>= 1.43.0 < 2": - version: 1.53.0 - resolution: "mime-db@npm:1.53.0" - checksum: 3fd9380bdc0b085d0b56b580e4f89ca4fc3b823722310d795c248f0806b9a80afd5d8f4347f015ad943b9ecfa7cc0b71dffa0db96fa776d01a13474821a2c7fb - languageName: node - linkType: hard - "mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -10981,14 +11251,14 @@ __metadata: linkType: hard "mini-css-extract-plugin@npm:^2.7.0": - version: 2.9.1 - resolution: "mini-css-extract-plugin@npm:2.9.1" + version: 2.9.4 + resolution: "mini-css-extract-plugin@npm:2.9.4" dependencies: schema-utils: ^4.0.0 tapable: ^2.2.1 peerDependencies: webpack: ^5.0.0 - checksum: 036b0fbb207cf9a56e2f5f5dce5e35100cbd255e5b5a920a5357ec99215af16a77136020729b2d004a041d04ebb0a544b2f442535cbb982704dcd50297014c9e + checksum: 4ec46ebdcb5dae4b1c012debca90fea27b1e8e7790d408154232d77d25f56f839e7b1ec5401a962d6356e7b9301c760d2ef62e1cb0d4d7b6ec8209f812733dda languageName: node linkType: hard @@ -11106,18 +11376,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 minipass-sized: ^1.0.3 - minizlib: ^2.1.2 + minizlib: ^3.0.1 dependenciesMeta: encoding: optional: true - checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 + checksum: 3dfca705ce887ca9ff14d73e8d8593996dea1a1ecd8101fdbb9c10549d1f9670bc8fb66ad0192769ead4c2dc01b4f9ca1cf567ded365adff17827a303b948140 languageName: node linkType: hard @@ -11174,7 +11444,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 @@ -11191,6 +11461,15 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: ^7.1.2 + checksum: a15e6f0128f514b7d41a1c68ce531155447f4669e32d279bba1c1c071ef6c2abd7e4d4579bb59ccc2ed1531346749665968fdd7be8d83eb6b6ae2fe1f3d370a7 + languageName: node + linkType: hard + "mkdirp-infer-owner@npm:^2.0.0": version: 2.0.0 resolution: "mkdirp-infer-owner@npm:2.0.0" @@ -11211,7 +11490,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.5, mkdirp@npm:^0.5.6, mkdirp@npm:~0.5.1": +"mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -11332,12 +11611,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + checksum: 3be20d8866a57a6b6d218e82549711c8352ed969f9ab3c45379da28f405363ad4c9aeb0b39e9abc101a529ca65a72ff9502b00bf74a912c4b64a9d62dfd26c29 languageName: node linkType: hard @@ -11383,13 +11662,20 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": +"negotiator@npm:^0.6.3, negotiator@npm:~0.6.4": version: 0.6.4 resolution: "negotiator@npm:0.6.4" checksum: 7ded10aa02a0707d1d12a9973fdb5954f98547ca7beb60e31cb3a403cc6e8f11138db7a3b0128425cf836fc85d145ec4ce983b2bdf83dca436af879c2d683510 languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -11455,13 +11741,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.3.0": - version: 4.8.2 - resolution: "node-gyp-build@npm:4.8.2" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 1a57bba8c4c193f808bd8ad1484d4ebdd8106dd9f04a3e82554dc716e3a2d87d7e369e9503c145e0e6a7e2c663fec0d8aaf52bd8156342ec7fc388195f37824e + checksum: 8b81ca8ffd5fa257ad8d067896d07908a36918bc84fb04647af09d92f58310def2d2b8614d8606d129d9cd9b48890a5d2bec18abe7fcff54818f72bedd3a7d74 languageName: node linkType: hard @@ -11487,29 +11773,29 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" + version: 11.4.2 + resolution: "node-gyp@npm:11.4.2" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 - glob: ^10.3.10 graceful-fs: ^4.2.6 - make-fetch-happen: ^13.0.0 - nopt: ^7.0.0 - proc-log: ^4.1.0 + make-fetch-happen: ^14.0.3 + nopt: ^8.0.0 + proc-log: ^5.0.0 semver: ^7.3.5 - tar: ^6.2.1 - which: ^4.0.0 + tar: ^7.4.3 + tinyglobby: ^0.2.12 + which: ^5.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f + checksum: d8041cee7ec60c86fb2961d77c12a2d083a481fb28b08e6d9583153186c0e7766044dc30bdb1f3ac01ddc5763b83caeed3d1ea35787ec4ffd8cc4aeedfc34f2b languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 +"node-releases@npm:^2.0.21": + version: 2.0.23 + resolution: "node-releases@npm:2.0.23" + checksum: dc3194ffdf04975f8525a5e175c03f5a95cecd7607b6b0e80d28aaa03900706d920722b5f2ae2e8e28e029e6ae75f0d0f7eae87e8ee2a363c704785e3118f13d languageName: node linkType: hard @@ -11535,14 +11821,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: ^2.0.0 + abbrev: ^3.0.0 bin: nopt: bin/nopt.js - checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 + checksum: 49cfd3eb6f565e292bf61f2ff1373a457238804d5a5a63a8d786c923007498cba89f3648e3b952bc10203e3e7285752abf5b14eaf012edb821e84f24e881a92a languageName: node linkType: hard @@ -11764,6 +12050,13 @@ __metadata: languageName: node linkType: hard +"nwsapi@npm:^2.2.2": + version: 2.2.22 + resolution: "nwsapi@npm:2.2.22" + checksum: 9491f0396d8aaf7fd1f9ebbbbff5d9bb9090e5d200263cf31b117bbaad7eb79da86b4c9b9bcd64c4b35f6d7e1630d14ee21c0959c01131e89c1c5e22d72530bf + languageName: node + linkType: hard + "nx@npm:15.9.7, nx@npm:>=14.8.1 < 16, nx@npm:^15": version: 15.9.7 resolution: "nx@npm:15.9.7" @@ -11852,10 +12145,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b languageName: node linkType: hard @@ -11866,15 +12159,17 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: ^1.0.5 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - has-symbols: ^1.0.3 + es-object-atoms: ^1.0.0 + has-symbols: ^1.1.0 object-keys: ^1.1.1 - checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + checksum: 60e07d2651cf4f5528c485f1aa4dbded9b384c47d80e8187cefd11320abb1aebebf78df5483451dfa549059f8281c21f7b4bf7d19e9e5e97d8d617df0df298de languageName: node linkType: hard @@ -11993,13 +12288,6 @@ __metadata: languageName: node linkType: hard -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - "os@npm:~0.1.1": version: 0.1.2 resolution: "os@npm:0.1.2" @@ -12007,6 +12295,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.6 + object-keys: ^1.1.1 + safe-push-apply: ^1.0.0 + checksum: cc9dd7d85c4ccfbe8109fce307d581ac7ede7b26de892b537873fbce2dc6a206d89aea0630dbb98e47ce0873517cefeaa7be15fcf94aaf4764a3b34b474a5b61 + languageName: node + linkType: hard + "p-cancelable@npm:^2.0.0": version: 2.1.1 resolution: "p-cancelable@npm:2.1.1" @@ -12091,6 +12390,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 8c92d533acf82f0d12f7e196edccff773f384098bbb048acdd55a08778ce4fc8889d8f1bde72969487bd96f9c63212698d79744c20bedfce36c5b00b46d369f8 + languageName: node + linkType: hard + "p-pipe@npm:^3.1.0": version: 3.1.0 resolution: "p-pipe@npm:3.1.0" @@ -12254,11 +12560,11 @@ __metadata: linkType: hard "parse-path@npm:^7.0.0": - version: 7.0.0 - resolution: "parse-path@npm:7.0.0" + version: 7.1.0 + resolution: "parse-path@npm:7.1.0" dependencies: protocols: ^2.0.0 - checksum: 244b46523a58181d251dda9b888efde35d8afb957436598d948852f416d8c76ddb4f2010f9fc94218b4be3e5c0f716aa0d2026194a781e3b8981924142009302 + checksum: 1da6535a967b14911837bba98e5f8d16acb415b28753ff6225e3121dce71167a96c79278fbb631d695210dadae37462a9eff40d93b9c659cf1ce496fd5db9bb6 languageName: node linkType: hard @@ -12278,6 +12584,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: ^6.0.0 + checksum: ffd040c4695d93f0bc370e3d6d75c1b352178514af41be7afa212475ea5cead1d6e377cd9d4cec6a5e2bcf497ca50daf9e0088eadaa37dbc271f60def08fdfcd + languageName: node + linkType: hard + "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -12406,20 +12721,27 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 6817fb74eb745a71445debe1029768de55fd59a42b75606f478ee1d0dc1aa6e78b711d041a7c9d5550e042642029b7f373dc1a43b224c4b7f12d23436735dba0 + languageName: node + linkType: hard + "pidtree@npm:^0.3.0": version: 0.3.1 resolution: "pidtree@npm:0.3.1" @@ -12580,20 +12902,19 @@ __metadata: linkType: hard "portfinder@npm:^1.0.28": - version: 1.0.32 - resolution: "portfinder@npm:1.0.32" + version: 1.0.38 + resolution: "portfinder@npm:1.0.38" dependencies: - async: ^2.6.4 - debug: ^3.2.7 - mkdirp: ^0.5.6 - checksum: 116b4aed1b9e16f6d5503823d966d9ffd41b1c2339e27f54c06cd2f3015a9d8ef53e2a53b57bc0a25af0885977b692007353aa28f9a0a98a44335cb50487240d + async: ^3.2.6 + debug: ^4.3.6 + checksum: 738f388b4fc26fd0ab27b6671f2d903fccad8891d53ebad094e53294674164d616717805643667583abde32f5c31d554363ac693cffffe2c30bf564633f92f50 languageName: node linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: cfcd4f05264eee8fd184cd4897a17890561d1d473434b43ab66ad3673d9c9128981ec01e0cb1d65a52cd6b1eebfb2eae1e53e39b2e0eca86afc823ede7a4f41b languageName: node linkType: hard @@ -12929,26 +13250,26 @@ __metadata: linkType: hard "postcss-modules-local-by-default@npm:^4.0.5": - version: 4.0.5 - resolution: "postcss-modules-local-by-default@npm:4.0.5" + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" dependencies: icss-utils: ^5.0.0 - postcss-selector-parser: ^6.0.2 + postcss-selector-parser: ^7.0.0 postcss-value-parser: ^4.1.0 peerDependencies: postcss: ^8.1.0 - checksum: ca9b01f4a0a3dfb33e016299e2dfb7e85c3123292f7aec2efc0c6771b9955648598bfb4c1561f7ee9732fb27fb073681233661b32eef98baab43743f96735452 + checksum: 720d145453f82ad5f1c1d0ff7386d64722f0812808e4132e573c1a49909745e109fcce3792a0b0cb18770dbeb3d9741867e81c698dc8353a18bc664b7d6d9533 languageName: node linkType: hard "postcss-modules-scope@npm:^3.2.0": - version: 3.2.0 - resolution: "postcss-modules-scope@npm:3.2.0" + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - postcss-selector-parser: ^6.0.4 + postcss-selector-parser: ^7.0.0 peerDependencies: postcss: ^8.1.0 - checksum: 2ffe7e98c1fa993192a39c8dd8ade93fc4f59fbd1336ce34fcedaee0ee3bafb29e2e23fb49189256895b30e4f21af661c6a6a16ef7b17ae2c859301e4a4459ae + checksum: 085f65863bb7d8bf08209a979ceb22b2b07bb466574e0e698d34aaad832d614957bb05f2418348a14e4035f65e23b2be2951369d26ea429dd5762c6a020f0f7c languageName: node linkType: hard @@ -13043,13 +13364,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.1.2 - resolution: "postcss-selector-parser@npm:6.1.2" +"postcss-selector-parser@npm:^7.0.0": + version: 7.1.0 + resolution: "postcss-selector-parser@npm:7.1.0" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84 + checksum: 1300e7871dd60a5132ee5462cc6e94edd4f3df28462b2495ca9ff025bd83768a908e892a18fde62cae63ff63524641baa6d58c64120f04fe6884b916663ce737 languageName: node linkType: hard @@ -13100,13 +13421,13 @@ __metadata: linkType: hard "postcss@npm:^8.3.11, postcss@npm:^8.3.2, postcss@npm:^8.4.33": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: - nanoid: ^3.3.7 - picocolors: ^1.1.0 + nanoid: ^3.3.11 + picocolors: ^1.1.1 source-map-js: ^1.2.1 - checksum: f78440a9d8f97431dd2ab1ab8e1de64f12f3eff38a3d8d4a33919b96c381046a314658d2de213a5fa5eb296b656de76a3ec269fdea27f16d5ab465b916a0f52c + checksum: 20f3b5d673ffeec2b28d65436756d31ee33f65b0a8bedb3d32f556fbd5973be38c3a7fb5b959a5236c60a5db7b91b0a6b14ffaac0d717dce1b903b964ee1c1bb languageName: node linkType: hard @@ -13144,6 +13465,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": ^29.6.3 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 032c1602383e71e9c0c02a01bbd25d6759d60e9c7cf21937dde8357aa753da348fcec5def5d1002c9678a8524d5fe099ad98861286550ef44de8808cc61e43b6 + languageName: node + linkType: hard + "pretty-hrtime@npm:^1.0.3": version: 1.0.3 resolution: "pretty-hrtime@npm:1.0.3" @@ -13158,10 +13490,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: c78b26ecef6d5cce4a7489a1e9923d7b4b1679028c8654aef0463b27f4a90b0946cd598f55799da602895c52feb085ec76381d007ab8dcceebd40b89c2f9dfe0 languageName: node linkType: hard @@ -13252,9 +13584,9 @@ __metadata: linkType: hard "protocols@npm:^2.0.0, protocols@npm:^2.0.1": - version: 2.0.1 - resolution: "protocols@npm:2.0.1" - checksum: 4a9bef6aa0449a0245ded319ac3cbfd032c3e76ebb562777037a3a832c99253d0e8bc2847f7be350236df620a11f7d4fe683ea7f59a2cc14c69f746b6259eda4 + version: 2.0.2 + resolution: "protocols@npm:2.0.2" + checksum: 031cc068eb800468a50eb7c1e1c528bf142fb8314f5df9b9ea3c3f9df1697a19f97b9915b1229cef694d156812393172d9c3051ef7878d26eaa8c6faa5cccec4 languageName: node linkType: hard @@ -13283,9 +13615,11 @@ __metadata: linkType: hard "psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: ^2.3.1 + checksum: 6f777d82eecfe1c2406dadbc15e77467b186fec13202ec887a45d0209a2c6fca530af94a462a477c3c4a767ad892ec9ede7c482d98f61f653dd838b50e89dc15 languageName: node linkType: hard @@ -13300,12 +13634,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.2 - resolution: "pump@npm:3.0.2" + version: 3.0.3 + resolution: "pump@npm:3.0.3" dependencies: end-of-stream: ^1.1.0 once: ^1.3.1 - checksum: e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f + checksum: 52843fc933b838c0330f588388115a1b28ef2a5ffa7774709b142e35431e8ab0c2edec90de3fa34ebb72d59fef854f151eea7dfc211b6dcf586b384556bd2f39 languageName: node linkType: hard @@ -13327,7 +13661,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 @@ -13348,21 +13682,12 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.10.4": - version: 6.10.4 - resolution: "qs@npm:6.10.4" - dependencies: - side-channel: ^1.0.4 - checksum: 31e4fedd759d01eae52dde6692abab175f9af3e639993c5caaa513a2a3607b34d8058d3ae52ceeccf37c3025f22ed5e90e9ddd6c2537e19c0562ddd10dc5b1eb - languageName: node - linkType: hard - -"qs@npm:6.11.0, qs@npm:^6.4.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" +"qs@npm:6.13.0, qs@npm:^6.4.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 + side-channel: ^1.0.6 + checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 languageName: node linkType: hard @@ -13375,15 +13700,8 @@ __metadata: "queue-microtask@npm:^1.2.2": version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"queue-tick@npm:^1.0.1": - version: 1.0.1 - resolution: "queue-tick@npm:1.0.1" - checksum: 57c3292814b297f87f792fbeb99ce982813e4e54d7a8bdff65cf53d5c084113913289d4a48ec8bbc964927a74b847554f9f4579df43c969a6c8e0f026457ad01 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 languageName: node linkType: hard @@ -13469,7 +13787,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.2.0": +"react-is@npm:^18.0.0, react-is@npm:^18.2.0": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 @@ -13603,15 +13921,15 @@ __metadata: linkType: hard "readable-stream@npm:^4.0.0": - version: 4.5.2 - resolution: "readable-stream@npm:4.5.2" + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" dependencies: abort-controller: ^3.0.0 buffer: ^6.0.3 events: ^3.3.0 process: ^0.11.10 string_decoder: ^1.3.0 - checksum: c4030ccff010b83e4f33289c535f7830190773e274b3fcb6e2541475070bdfd69c98001c3b0cb78763fc00c8b62f514d96c2b10a8bd35d5ce45203a25fa1d33a + checksum: 03ec762faed8e149dc6452798b60394a8650861a1bb4bf936fa07b94044826bc25abe73696f5f45372abc404eec01876c560f64b479eba108b56397312dbe2ae languageName: node linkType: hard @@ -13708,6 +14026,22 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.7 + get-proto: ^1.0.1 + which-builtin-type: ^1.2.1 + checksum: ccc5debeb66125e276ae73909cecb27e47c35d9bb79d9cc8d8d055f008c58010ab8cb401299786e505e4aab733a64cba9daf5f312a58e96a43df66adad221870 + languageName: node + linkType: hard + "regenerator-runtime@npm:^0.11.0": version: 0.11.1 resolution: "regenerator-runtime@npm:0.11.1" @@ -13715,15 +14049,17 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.3 - resolution: "regexp.prototype.flags@npm:1.5.3" +"regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 define-properties: ^1.2.1 es-errors: ^1.3.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 set-function-name: ^2.0.2 - checksum: 83ff0705b837f7cb6d664010a11642250f36d3f642263dd0f3bdfe8f150261aa7b26b50ee97f21c1da30ef82a580bb5afedbef5f45639d69edaafbeac9bbb0ed + checksum: 18cb667e56cb328d2dda569d7f04e3ea78f2683135b866d606538cf7b1d4271f7f749f09608c877527799e6cf350e531368f3c7a20ccd1bb41048a48926bdeeb languageName: node linkType: hard @@ -13745,15 +14081,6 @@ __metadata: languageName: node linkType: hard -"repeating@npm:^2.0.0": - version: 2.0.1 - resolution: "repeating@npm:2.0.1" - dependencies: - is-finite: ^1.0.0 - checksum: d2db0b69c5cb0c14dd750036e0abcd6b3c3f7b2da3ee179786b755cf737ca15fa0fff417ca72de33d6966056f4695440e680a352401fc02c95ade59899afbdd0 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -13816,28 +14143,28 @@ __metadata: linkType: hard "resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.9.0": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" + version: 1.22.10 + resolution: "resolve@npm:1.22.10" dependencies: - is-core-module: ^2.13.0 + is-core-module: ^2.16.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + checksum: ab7a32ff4046fcd7c6fdd525b24a7527847d03c3650c733b909b01b757f92eb23510afa9cc3e9bf3f26a3e073b48c88c706dfd4c1d2fb4a16a96b73b6328ddcf languageName: node linkType: hard "resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#~builtin::version=1.22.10&hash=c3c19d" dependencies: - is-core-module: ^2.13.0 + is-core-module: ^2.16.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + checksum: 8aac1e4e4628bd00bf4b94b23de137dd3fe44097a8d528fd66db74484be929936e20c696e1a3edf4488f37e14180b73df6f600992baea3e089e8674291f16c9d languageName: node linkType: hard @@ -13868,9 +14195,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 64cb3142ac5e9ad689aca289585cb41d22521f4571f73e9488af39f6b1bd62f0cbb3d65e2ecc768ec6494052523f473f1eb4b55c3e9014b3590c17fc6a03e22a languageName: node linkType: hard @@ -13976,23 +14303,24 @@ __metadata: linkType: hard "rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" dependencies: tslib: ^2.1.0 - checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 + checksum: 2f233d7c832a6c255dabe0759014d7d9b1c9f1cb2f2f0d59690fd11c883c9826ea35a51740c06ab45b6ade0d9087bde9192f165cba20b6730d344b831ef80744 languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" dependencies: - call-bind: ^1.0.7 - get-intrinsic: ^1.2.4 - has-symbols: ^1.0.3 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 isarray: ^2.0.5 - checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 + checksum: 00f6a68140e67e813f3ad5e73e6dedcf3e42a9fa01f04d44b0d3f7b1f4b257af876832a9bfc82ac76f307e8a6cc652e3cf95876048a26cbec451847cf6ae3707 languageName: node linkType: hard @@ -14010,14 +14338,24 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + isarray: ^2.0.5 + checksum: 8c11cbee6dc8ff5cc0f3d95eef7052e43494591384015902e4292aef4ae9e539908288520ed97179cee17d6ffb450fe5f05a46ce7a1749685f7524fd568ab5db + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.2 es-errors: ^1.3.0 - is-regex: ^1.1.4 - checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab languageName: node linkType: hard @@ -14056,6 +14394,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" @@ -14065,15 +14412,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^0.3.0": - version: 0.3.0 - resolution: "schema-utils@npm:0.3.0" - dependencies: - ajv: ^5.0.0 - checksum: 441fa4bd4900afb19eb9da1d8d6271056b71ce3d8b1b73bbece791de1d4c90ac7e97ffc9787607aa53611aaf2996711af7c18ba8669f06b084b218cab1e701e3 - languageName: node - linkType: hard - "schema-utils@npm:^2.7.0": version: 2.7.1 resolution: "schema-utils@npm:2.7.1" @@ -14085,7 +14423,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.0.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -14096,15 +14434,15 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": + version: 4.3.3 + resolution: "schema-utils@npm:4.3.3" dependencies: "@types/json-schema": ^7.0.9 ajv: ^8.9.0 ajv-formats: ^2.1.1 ajv-keywords: ^5.1.0 - checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde + checksum: 4e20404962fd45d5feb5942f7c9ab334a3d3dab94e15001049bd49e2959015f2c59089353953d4976fe664462c79121dea50392968182d4e2c4b75803f822fa3 languageName: node linkType: hard @@ -14115,7 +14453,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -14135,7 +14473,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.3, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:7.6.3, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -14183,7 +14521,7 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.1": +"serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" dependencies: @@ -14211,7 +14549,7 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -14237,6 +14575,17 @@ __metadata: languageName: node linkType: hard +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + checksum: ec27cbbe334598547e99024403e96da32aca3e530583e4dba7f5db1c43cbc4affa9adfbd77c7b2c210b9b8b2e7b2e600bad2a6c44fd62e804d8233f96bbb62f4 + languageName: node + linkType: hard + "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -14286,9 +14635,9 @@ __metadata: linkType: hard "shell-quote@npm:^1.6.1": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 550dd84e677f8915eb013d43689c80bb114860649ec5298eb978f40b8f3d4bc4ccb072b82c094eb3548dc587144bb3965a8676f0d685c1cf4c40b5dc27166242 languageName: node linkType: hard @@ -14304,15 +14653,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: ^1.0.7 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - object-inspect: ^1.13.1 - checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff languageName: node linkType: hard @@ -14331,11 +14716,11 @@ __metadata: linkType: hard "simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" + version: 0.2.4 + resolution: "simple-swizzle@npm:0.2.4" dependencies: is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + checksum: 9a2f6f39a6b9fab68f96903523bf19953ec21e5e843108154cf47a9cc0f78955dd44f64499ffb71a849ac10c758d9fab7533627c7ca3ab40b5c177117acfdc1b languageName: node linkType: hard @@ -14437,8 +14822,8 @@ __metadata: linkType: hard "socket.io@npm:^4.7.2": - version: 4.8.0 - resolution: "socket.io@npm:4.8.0" + version: 4.8.1 + resolution: "socket.io@npm:4.8.1" dependencies: accepts: ~1.3.4 base64id: ~2.0.0 @@ -14447,7 +14832,7 @@ __metadata: engine.io: ~6.6.0 socket.io-adapter: ~2.5.2 socket.io-parser: ~4.2.4 - checksum: 02f53a7ffd5aa53ac11b1b76b795c3fb8154ca385183ddee141f9685d1218f0a8e59056268c7231df3b4d6116f75b608bd7c0fbef28fcf7aaecb27ac8d41b7f3 + checksum: d5e4d7eabba7a04c0d130a7b34c57050a1b4694e5b9eb9bd0a40dd07c1d635f3d5cacc15442f6135be8b2ecdad55dad08ee576b5c74864508890ff67329722fa languageName: node linkType: hard @@ -14463,23 +14848,23 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: ^7.1.1 + agent-base: ^7.1.2 debug: ^4.3.4 socks: ^2.8.3 - checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 + checksum: b4fbcdb7ad2d6eec445926e255a1fb95c975db0020543fbac8dfa6c47aecc6b3b619b7fb9c60a3f82c9b2969912a5e7e174a056ae4d98cb5322f3524d6036e1d languageName: node linkType: hard "socks@npm:^2.6.2, socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip-address: ^9.0.5 + ip-address: ^10.0.1 smart-buffer: ^4.2.0 - checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd + checksum: 4bbe2c88cf0eeaf49f94b7f11564a99b2571bde6fd1e714ff95b38f89e1f97858c19e0ab0e6d39eb7f6a984fa67366825895383ed563fe59962a1d57a1d55318 languageName: node linkType: hard @@ -14527,20 +14912,20 @@ __metadata: linkType: hard "sort-package-json@npm:^2.1.0": - version: 2.10.1 - resolution: "sort-package-json@npm:2.10.1" + version: 2.15.1 + resolution: "sort-package-json@npm:2.15.1" dependencies: detect-indent: ^7.0.1 detect-newline: ^4.0.0 get-stdin: ^9.0.0 git-hooks-list: ^3.0.0 - globby: ^13.1.2 is-plain-obj: ^4.1.0 semver: ^7.6.0 sort-object-keys: ^1.1.3 + tinyglobby: ^0.2.9 bin: sort-package-json: cli.js - checksum: 861d8161565fba322414d70b6be10fb331680549b73399778965be628783833c85c4e02929bcea5a2d96994884b0327dfe2f7c7a79409c901d2582b703f5333d + checksum: 2d612da6bc597da4552d6006cfe769a0f745b4a32da848dbdb606aa42b599ca670519aa9f07d388a2a41e92f310e936e2a9e406904599bf86c1cb279488572c0 languageName: node linkType: hard @@ -14611,13 +14996,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.7": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d - languageName: node - linkType: hard - "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" @@ -14653,9 +15031,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.20 - resolution: "spdx-license-ids@npm:3.0.20" - checksum: 0c57750bedbcff48f3d0e266fbbdaf0aab54217e182f669542ffe0b5a902dce69e8cdfa126a131e1ddd39a9bef4662e357b2b41315d7240b4a28c0a7e782bb40 + version: 3.0.22 + resolution: "spdx-license-ids@npm:3.0.22" + checksum: 3810ce1ddd8c67d7cfa76a0af05157090a2d93e5bb93bd85bf9735f1fd8062c5b510423a4669dc7d8c34b0892b27a924b1c6f8965f85d852aa25062cceff5e29 languageName: node linkType: hard @@ -14684,13 +15062,6 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -14698,7 +15069,7 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.14.1": +"sshpk@npm:^1.18.0": version: 1.18.0 resolution: "sshpk@npm:1.18.0" dependencies: @@ -14719,12 +15090,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: minipass: ^7.0.3 - checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 + checksum: ef4b6b0ae47b4a69896f5f1c4375f953b9435388c053c36d27998bc3d73e046969ccde61ab659e679142971a0b08e50478a1228f62edb994105b280f17900c98 languageName: node linkType: hard @@ -14737,6 +15108,15 @@ __metadata: languageName: node linkType: hard +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: ^2.0.0 + checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -14760,6 +15140,16 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + internal-slot: ^1.1.0 + checksum: be944489d8829fb3bdec1a1cc4a2142c6b6eb317305eeace1ece978d286d6997778afa1ae8cb3bd70e2b274b9aa8c69f93febb1e15b94b1359b11058f9d3c3a1 + languageName: node + linkType: hard + "stream-shift@npm:^1.0.0, stream-shift@npm:^1.0.2": version: 1.0.3 resolution: "stream-shift@npm:1.0.3" @@ -14779,17 +15169,13 @@ __metadata: linkType: hard "streamx@npm:^2.15.0": - version: 2.20.1 - resolution: "streamx@npm:2.20.1" + version: 2.23.0 + resolution: "streamx@npm:2.23.0" dependencies: - bare-events: ^2.2.0 + events-universal: ^1.0.0 fast-fifo: ^1.3.2 - queue-tick: ^1.0.1 text-decoder: ^1.1.0 - dependenciesMeta: - bare-events: - optional: true - checksum: 48605ddd3abdd86d2e3ee945ec7c9317f36abb5303347a8fff6e4c7926a72c33ec7ac86b50734ccd1cf65602b6a38e247966e8199b24e5a7485d9cec8f5327bd + checksum: d57de47db76ffd926842afab562fc8b139d7333269c6db11da5a233e8524cd326161b48bdddd28cefc010cec0b143af04dbb6f5e92d5034839ce7428928dfcae languageName: node linkType: hard @@ -14834,26 +15220,30 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-data-property: ^1.1.4 define-properties: ^1.2.1 - es-abstract: ^1.23.0 + es-abstract: ^1.23.5 es-object-atoms: ^1.0.0 - checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 + has-property-descriptors: ^1.0.2 + checksum: 87659cd8561237b6c69f5376328fda934693aedde17bb7a2c57008e9d9ff992d0c253a391c7d8d50114e0e49ff7daf86a362f7961cf92f7564cd01342ca2e385 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.2 define-properties: ^1.2.1 es-object-atoms: ^1.0.0 - checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd + checksum: cb86f639f41d791a43627784be2175daa9ca3259c7cb83e7a207a729909b74f2ea0ec5d85de5761e6835e5f443e9420c6ff3f63a845378e4a61dd793177bc287 languageName: node linkType: hard @@ -14895,15 +15285,6 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^3.0.0": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: ^2.0.0 - checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 - languageName: node - linkType: hard - "strip-ansi@npm:^4.0.0": version: 4.0.0 resolution: "strip-ansi@npm:4.0.0" @@ -14914,11 +15295,11 @@ __metadata: linkType: hard "strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" dependencies: ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + checksum: db0e3f9654e519c8a33c50fc9304d07df5649388e7da06d3aabf66d29e5ad65d5e6315d8519d409c15b32fa82c1df7e11ed6f8cd50b0e4404463f0c9d77c8d0b languageName: node linkType: hard @@ -15004,13 +15385,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 602538c5812b9006404370b5a4b885d3e2a1f6567d314f8b4a41974ffe7d08e525bf92ae0f9c7030e3b4c78e4e34ace55d6a67a74f1571bc205959f5972f88f0 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0, supports-color@npm:^5.4.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -15043,6 +15417,13 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d + languageName: node + linkType: hard + "tabbable@npm:^5.2.0": version: 5.3.3 resolution: "tabbable@npm:5.3.3" @@ -15050,10 +15431,10 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 +"tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: ada1194219ad550e3626d15019d87a2b8e77521d8463ab1135f46356e987a4c37eff1e87ffdd5acd573590962e519cc81e8ea6f7ed632c66bb58c0f12bd772a4 languageName: node linkType: hard @@ -15081,7 +15462,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.5, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1": +"tar@npm:^6.0.5, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -15095,6 +15476,19 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.3": + version: 7.5.1 + resolution: "tar@npm:7.5.1" + dependencies: + "@isaacs/fs-minipass": ^4.0.0 + chownr: ^3.0.0 + minipass: ^7.1.2 + minizlib: ^3.1.0 + yallist: ^5.0.0 + checksum: dbd55d4c3bd9e3c69aed137d9dc9fcb8f86afd103c28d97d52728ca80708f4c84b07e0a01d0bf1c8e820be84d37632325debf19f672a06e0c605c57a03636fd0 + languageName: node + linkType: hard + "temp-dir@npm:^1.0.0": version: 1.0.0 resolution: "temp-dir@npm:1.0.0" @@ -15102,15 +15496,15 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.7": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" +"terser-webpack-plugin@npm:^5.3.11, terser-webpack-plugin@npm:^5.3.7": + version: 5.3.14 + resolution: "terser-webpack-plugin@npm:5.3.14" dependencies: - "@jridgewell/trace-mapping": ^0.3.20 + "@jridgewell/trace-mapping": ^0.3.25 jest-worker: ^27.4.5 - schema-utils: ^3.1.1 - serialize-javascript: ^6.0.1 - terser: ^5.26.0 + schema-utils: ^4.3.0 + serialize-javascript: ^6.0.2 + terser: ^5.31.1 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -15120,28 +15514,30 @@ __metadata: optional: true uglify-js: optional: true - checksum: bd6e7596cf815f3353e2a53e79cbdec959a1b0276f5e5d4e63e9d7c3c5bb5306df567729da287d1c7b39d79093e56863c569c42c6c24cc34c76aa313bd2cbcea + checksum: 13a1e67f1675a473b18d25cb0ce65c3f0a19b5e9a93213a99ea61dc4ca996ea93aa17a221965b526f5788d242836a8249ad00538fbb322e25cb69076eb55feab languageName: node linkType: hard -"terser@npm:^5.26.0": - version: 5.36.0 - resolution: "terser@npm:5.36.0" +"terser@npm:^5.31.1": + version: 5.44.0 + resolution: "terser@npm:5.44.0" dependencies: "@jridgewell/source-map": ^0.3.3 - acorn: ^8.8.2 + acorn: ^8.15.0 commander: ^2.20.0 source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 489afd31901a2b170f7766948a3aa0e25da0acb41e9e35bd9f9b4751dfa2fc846e485f6fb9d34f0839a96af77f675b5fbf0a20c9aa54e0b8d7c219cf0b55e508 + checksum: 4e1868d9662ea280dad7b49cfe61b7693187be2b529b31b1f86782db00833c03ba05f2b82fc513d928e937260f2a5fbf42a93724e86eaf55f069288f934ccdb3 languageName: node linkType: hard "text-decoder@npm:^1.1.0": - version: 1.2.1 - resolution: "text-decoder@npm:1.2.1" - checksum: 0f42deda4a8f111af67f81f292e823f2bdcc85057fdeef35e3a5dda6b501605a1d449927a4a440af4485fbd02198b5baf722d146a195c1b1b211cdd37292ac66 + version: 1.2.3 + resolution: "text-decoder@npm:1.2.3" + dependencies: + b4a: ^1.6.4 + checksum: d7642a61f9d72330eac52ff6b6e8d34dea03ebbb1e82749a8734e7892e246cf262ed70730d20c4351c5dc5334297b9cc6c0b6a8725a204a63a197d7728bb35e5 languageName: node linkType: hard @@ -15210,6 +15606,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.9": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: ^6.5.0 + picomatch: ^4.0.3 + checksum: 0e33b8babff966c6ab86e9b825a350a6a98a63700fa0bb7ae6cf36a7770a508892383adc272f7f9d17aaf46a9d622b455e775b9949a3f951eaaf5dfb26331d44 + languageName: node + linkType: hard + "tinylogic@npm:^2.0.0": version: 2.0.0 resolution: "tinylogic@npm:2.0.0" @@ -15217,33 +15623,28 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 - languageName: node - linkType: hard - -"tmp@npm:^0.2.1, tmp@npm:~0.2.1": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 +"tldts-core@npm:^6.1.86": + version: 6.1.86 + resolution: "tldts-core@npm:6.1.86" + checksum: 0a715457e03101deff9b34cf45dcd91b81985ef32d35b8e9c4764dcf76369bf75394304997584080bb7b8897e94e20f35f3e8240a1ec87d6faba3cc34dc5a954 languageName: node linkType: hard -"to-fast-properties@npm:^1.0.3": - version: 1.0.3 - resolution: "to-fast-properties@npm:1.0.3" - checksum: bd0abb58c4722851df63419de3f6d901d5118f0440d3f71293ed776dd363f2657edaaf2dc470e3f6b7b48eb84aa411193b60db8a4a552adac30de9516c5cc580 +"tldts@npm:^6.1.32": + version: 6.1.86 + resolution: "tldts@npm:6.1.86" + dependencies: + tldts-core: ^6.1.86 + bin: + tldts: bin/cli.js + checksum: e5c57664f73663c6c8f7770db02c0c03d6f877fe837854c72037be8092826f95b8e568962358441ef18431b80b7e40ed88391c70873ee7ec0d4344999a12e3de 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 +"tmp@npm:^0.2.1, tmp@npm:~0.2.1": + version: 0.2.5 + resolution: "tmp@npm:0.2.5" + checksum: 9d18e58060114154939930457b9e198b34f9495bcc05a343bc0a0a29aa546d2c1c2b343dae05b87b17c8fde0af93ab7d8fe8574a8f6dc2cd8fd3f2ca1ad0d8e1 languageName: node linkType: hard @@ -15263,7 +15664,7 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.3": +"tough-cookie@npm:^4.1.2": version: 4.1.4 resolution: "tough-cookie@npm:4.1.4" dependencies: @@ -15275,6 +15676,15 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^5.0.0": + version: 5.1.2 + resolution: "tough-cookie@npm:5.1.2" + dependencies: + tldts: ^6.1.32 + checksum: 31c626a77ac247b881665851035773afe7eeac283b91ed8da3c297ed55480ea1dd1ba3f5bb1f94b653ac2d5b184f17ce4bf1cf6ca7c58ee7c321b4323c4f8024 + languageName: node + linkType: hard + "tr46@npm:^2.1.0": version: 2.1.0 resolution: "tr46@npm:2.1.0" @@ -15284,6 +15694,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -15312,13 +15731,6 @@ __metadata: languageName: node linkType: hard -"trim-right@npm:^1.0.1": - version: 1.0.1 - resolution: "trim-right@npm:1.0.1" - checksum: 9120af534e006a7424a4f9358710e6e707887b6ccf7ea69e50d6ac6464db1fe22268400def01752f09769025d480395159778153fb98d4a2f6f40d4cf5d4f3b6 - languageName: node - linkType: hard - "tsconfig-paths@npm:^4.1.2": version: 4.2.0 resolution: "tsconfig-paths@npm:4.2.0" @@ -15338,9 +15750,9 @@ __metadata: linkType: hard "tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0": - version: 2.8.0 - resolution: "tslib@npm:2.8.0" - checksum: de852ecd81adfdb4870927e250763345f07dc13fe7f395ce261424966bb122a0992ad844c3ec875c9e63e72afe2220a150712984e44dfd1a8a7e538a064e3d46 + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a languageName: node linkType: hard @@ -15364,13 +15776,6 @@ __metadata: languageName: node linkType: hard -"tunnel@npm:^0.0.6": - version: 0.0.6 - resolution: "tunnel@npm:0.0.6" - checksum: c362948df9ad34b649b5585e54ce2838fa583aa3037091aaed66793c65b423a264e5229f0d7e9a95513a795ac2bd4cb72cda7e89a74313f182c1e9ae0b0994fa - languageName: node - linkType: hard - "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -15460,55 +15865,56 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: ^1.0.7 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-typed-array: ^1.1.13 - checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + is-typed-array: ^1.1.14 + checksum: 3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.14 + checksum: cda9352178ebeab073ad6499b03e938ebc30c4efaea63a26839d89c4b1da9d2640b0d937fc2bd1f049eb0a38def6fbe8a061b601292ae62fe079a410ce56e3a6 languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.15 + reflect.getprototypeof: ^1.0.9 + checksum: 670b7e6bb1d3c2cf6160f27f9f529e60c3f6f9611c67e47ca70ca5cfa24ad95415694c49d1dbfeda016d3372cab7dfc9e38c7b3e1bb8d692cae13a63d3c144d7 languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" dependencies: call-bind: ^1.0.7 for-each: ^0.3.3 gopd: ^1.0.1 - has-proto: ^1.0.3 is-typed-array: ^1.1.13 possible-typed-array-names: ^1.0.0 - checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c + reflect.getprototypeof: ^1.0.6 + checksum: deb1a4ffdb27cd930b02c7030cb3e8e0993084c643208e52696e18ea6dd3953dfc37b939df06ff78170423d353dc8b10d5bae5796f3711c1b3abe52872b3774c languageName: node linkType: hard @@ -15575,11 +15981,11 @@ __metadata: linkType: hard "ua-parser-js@npm:^0.7.30": - version: 0.7.39 - resolution: "ua-parser-js@npm:0.7.39" + version: 0.7.41 + resolution: "ua-parser-js@npm:0.7.41" bin: ua-parser-js: script/cli.js - checksum: 3488852961485b80b65a8dbc978098cdf1c51bb7765262698ee1a29304786f667272182e9cee15433e7792981376b1ca59ca77e126fee0b41b104085f4be9a3c + checksum: c14ea0ba52585f0c363375b30d511d972bf1842855b6d6f4a411e6a27c936c7eb1f96e53e2d321fe3c587f0420677dcabd8977622be71da51edc8521e595b9b9 languageName: node linkType: hard @@ -15592,19 +15998,18 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: ^1.0.2 + call-bound: ^1.0.3 has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + has-symbols: ^1.1.0 + which-boxed-primitive: ^1.1.1 + checksum: 729f13b84a5bfa3fead1d8139cee5c38514e63a8d6a437819a473e241ba87eeb593646568621c7fc7f133db300ef18d65d1a5a60dc9c7beb9000364d93c581df languageName: node linkType: hard -"underscore@npm:>=1.7.0, underscore@npm:>=1.8.3, underscore@npm:^1.8.3": "underscore@npm:>=1.7.0, underscore@npm:>=1.8.3, underscore@npm:^1.8.3": version: 1.13.7 resolution: "underscore@npm:1.13.7" @@ -15637,12 +16042,12 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + unique-slug: ^5.0.0 + checksum: 6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df languageName: node linkType: hard @@ -15655,12 +16060,12 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" dependencies: imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + checksum: 222d0322bc7bbf6e45c08967863212398313ef73423f4125e075f893a02405a5ffdbaaf150f7dd1e99f8861348a486dd079186d27c5f2c60e465b7dcbb1d3e5b languageName: node linkType: hard @@ -15723,21 +16128,20 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" +"update-browserslist-db@npm:^1.1.3": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" dependencies: escalade: ^3.2.0 - picocolors: ^1.1.0 + picocolors: ^1.1.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e + checksum: 7b6d8d08c34af25ee435bccac542bedcb9e57c710f3c42421615631a80aa6dd28b0a81c9d2afbef53799d482fb41453f714b8a7a0a8003e3b4ec8fb1abb819af languageName: node linkType: hard -"uri-js@npm:^4.2.2": "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -15905,11 +16309,11 @@ __metadata: languageName: node linkType: hard -"verdaccio@npm:^5.25.0": - version: 5.32.2 - resolution: "verdaccio@npm:5.32.2" +"verdaccio@npm:^5.33.0": + version: 5.33.0 + resolution: "verdaccio@npm:5.33.0" dependencies: - "@cypress/request": 3.0.1 + "@cypress/request": 3.0.6 "@verdaccio/auth": 8.0.0-next-8.1 "@verdaccio/config": 8.0.0-next-8.1 "@verdaccio/core": 8.0.0-next-8.1 @@ -15924,13 +16328,13 @@ __metadata: "@verdaccio/url": 13.0.0-next-8.1 "@verdaccio/utils": 7.0.1-next-8.1 JSONStream: 1.3.5 - async: 3.2.5 - clipanion: 4.0.0-rc.3 - compression: 1.7.4 + async: 3.2.6 + clipanion: 4.0.0-rc.4 + compression: 1.7.5 cors: 2.8.5 - debug: ^4.3.5 - envinfo: 7.13.0 - express: 4.21.0 + debug: ^4.3.7 + envinfo: 7.14.0 + express: 4.21.1 express-rate-limit: 5.5.1 fast-safe-stringify: 2.1.1 handlebars: 4.7.8 @@ -15949,7 +16353,7 @@ __metadata: verdaccio-htpasswd: 13.0.0-next-8.1 bin: verdaccio: bin/verdaccio - checksum: ef165a81b02af9121d2baaaa2cb7817d1009eacca423b76c8e30e7036c3342588a4e6f3435d7998ad67592c5f7f9295651210bf22b3b37d1c0898f4ba931285e + checksum: 0474cccb9e788f356468fe7227f3e2faa7cb594b1a30785e1e7516ef7c8486216abd22208ab15427ab7b274f6adee4ed1cbde064bf29d631d27693f0db67d35e languageName: node linkType: hard @@ -16039,6 +16443,15 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 + languageName: node + linkType: hard + "walk-up-path@npm:^1.0.0": version: 1.0.0 resolution: "walk-up-path@npm:1.0.0" @@ -16046,13 +16459,13 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" +"watchpack@npm:^2.4.4": + version: 2.4.4 + resolution: "watchpack@npm:2.4.4" dependencies: glob-to-regexp: ^0.4.1 graceful-fs: ^4.1.2 - checksum: 92d9d52ce3d16fd83ed6994d1dd66a4d146998882f4c362d37adfea9ab77748a5b4d1e0c65fa104797928b2d40f635efa8f9b925a6265428a69f1e1852ca3441 + checksum: 469514a04bcdd7ea77d4b3c62d1f087eafbce64cbc728c89355d5710ee01311533456122da7c585d3654d5bfcf09e6085db1a6eb274c4762a18e370526d17561 languageName: node linkType: hard @@ -16079,6 +16492,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + "webpack-cli@npm:^4.7.2": version: 4.10.0 resolution: "webpack-cli@npm:4.10.0" @@ -16174,26 +16594,28 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 +"webpack-sources@npm:^3.3.3": + version: 3.3.3 + resolution: "webpack-sources@npm:3.3.3" + checksum: 243d438ec4dfe805cca20fa66d111114b1f277b8ecfa95bb6ee0a6c7d996aee682539952028c2b203a6c170e6ef56f71ecf3e366e90bf1cb58b0ae982176b651 languageName: node linkType: hard "webpack@npm:^5, webpack@npm:^5.65.0, webpack@npm:^5.76.1": - version: 5.95.0 - resolution: "webpack@npm:5.95.0" - dependencies: - "@types/estree": ^1.0.5 - "@webassemblyjs/ast": ^1.12.1 - "@webassemblyjs/wasm-edit": ^1.12.1 - "@webassemblyjs/wasm-parser": ^1.12.1 - acorn: ^8.7.1 - acorn-import-attributes: ^1.9.5 - browserslist: ^4.21.10 + version: 5.102.1 + resolution: "webpack@npm:5.102.1" + dependencies: + "@types/eslint-scope": ^3.7.7 + "@types/estree": ^1.0.8 + "@types/json-schema": ^7.0.15 + "@webassemblyjs/ast": ^1.14.1 + "@webassemblyjs/wasm-edit": ^1.14.1 + "@webassemblyjs/wasm-parser": ^1.14.1 + acorn: ^8.15.0 + acorn-import-phases: ^1.0.3 + browserslist: ^4.26.3 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.17.1 + enhanced-resolve: ^5.17.3 es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 @@ -16203,17 +16625,17 @@ __metadata: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.2.0 - tapable: ^2.1.1 - terser-webpack-plugin: ^5.3.10 - watchpack: ^2.4.1 - webpack-sources: ^3.2.3 + schema-utils: ^4.3.3 + tapable: ^2.3.0 + terser-webpack-plugin: ^5.3.11 + watchpack: ^2.4.4 + webpack-sources: ^3.3.3 peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 0c3dfe288de4d62f8f3dc25478a618894883cab739121330763b7847e43304630ea2815ae2351a5f8ff6ab7c9642caf530d503d89bda261fe2cd220e524dd5d1 + checksum: b43be23872e6743b47a2b9840bb3494ec512a9fa012b5e04d47d210f16462db0f741f29b3aa42d83f3859f8965a9a7990e33134e71402df19c6f78480e80c12c languageName: node linkType: hard @@ -16233,6 +16655,23 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -16254,29 +16693,64 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: ^1.1.0 + is-boolean-object: ^1.2.1 + is-number-object: ^1.1.1 + is-string: ^1.1.1 + is-symbol: ^1.1.1 + checksum: ee41d0260e4fd39551ad77700c7047d3d281ec03d356f5e5c8393fe160ba0db53ef446ff547d05f76ffabfd8ad9df7c9a827e12d4cccdbc8fccf9239ff8ac21e + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: ^1.0.2 + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 + is-async-function: ^2.0.0 + is-date-object: ^1.1.0 + is-finalizationregistry: ^1.1.0 + is-generator-function: ^1.0.10 + is-regex: ^1.2.1 + is-weakref: ^1.0.2 + isarray: ^2.0.5 + which-boxed-primitive: ^1.1.0 + which-collection: ^1.0.2 + which-typed-array: ^1.1.16 + checksum: 7a3617ba0e7cafb795f74db418df889867d12bce39a477f3ee29c6092aa64d396955bf2a64eae3726d8578440e26777695544057b373c45a8bcf5fbe920bf633 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" + resolution: "which-collection@npm:1.0.2" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + is-map: ^2.0.3 + is-set: ^2.0.3 + is-weakmap: ^2.0.2 + is-weakset: ^2.0.3 + checksum: c51821a331624c8197916598a738fc5aeb9a857f1e00d89f5e4c03dc7c60b4032822b8ec5696d28268bb83326456a8b8216344fb84270d18ff1d7628051879d9 languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" dependencies: available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - for-each: ^0.3.3 - gopd: ^1.0.1 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 + gopd: ^1.2.0 has-tostringtag: ^1.0.2 - checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 + checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670 languageName: node linkType: hard @@ -16313,14 +16787,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: ^3.1.1 bin: node-which: bin/which.js - checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + checksum: 6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 languageName: node linkType: hard @@ -16485,33 +16959,32 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.4.6": - version: 7.5.10 - resolution: "ws@npm:7.5.10" +"ws@npm:^8.11.0, ws@npm:~8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb + checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf languageName: node linkType: hard -"ws@npm:^8.11.0, ws@npm:~8.11.0": - version: 8.11.0 - resolution: "ws@npm:8.11.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 languageName: node linkType: hard @@ -16554,6 +17027,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: eba51182400b9f35b017daa7f419f434424410691bbc5de4f4240cc830fdef906b504424992700dc047f16b4d99100a6f8b8b11175c193f38008e9c96322b6a5 + languageName: node + linkType: hard + "yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" @@ -16618,11 +17098,11 @@ __metadata: linkType: hard "yjs@npm:^13.5.40": - version: 13.6.20 - resolution: "yjs@npm:13.6.20" + version: 13.6.27 + resolution: "yjs@npm:13.6.27" dependencies: - lib0: ^0.2.98 - checksum: a87295efe7df58ae8b5cf09b7cdbbcc3cbfba2b7fb72bb424513eb25587eff8dc8304f41e3bcd3926c02c86a0f7ce2185285e4b9d71aca5ff50cefe1ecb6657c + lib0: ^0.2.99 + checksum: 3c934464cf28027278fa0d000568148d02af04d89d9debae7781aa50f09e20895de071120f9bd2b40faa115322a7ed8933518537344d78fb2a470e6d06df95a0 languageName: node linkType: hard @@ -16634,8 +17114,8 @@ __metadata: linkType: hard "yoctocolors-cjs@npm:^2.1.2": - version: 2.1.2 - resolution: "yoctocolors-cjs@npm:2.1.2" - checksum: 1c474d4b30a8c130e679279c5c2c33a0d48eba9684ffa0252cc64846c121fb56c3f25457fef902edbe1e2d7a7872130073a9fc8e795299d75e13fa3f5f548f1b + version: 2.1.3 + resolution: "yoctocolors-cjs@npm:2.1.3" + checksum: 207df586996c3b604fa85903f81cc54676f1f372613a0c7247f0d24b1ca781905685075d06955211c4d5d4f629d7d5628464f8af0a42d286b7a8ff88e9dadcb8 languageName: node linkType: hard From 1af0cff3e1993c60f0404e7e3677658a3bde91ad Mon Sep 17 00:00:00 2001 From: Alan <> Date: Fri, 17 Oct 2025 19:45:38 +1100 Subject: [PATCH 39/48] Use jupyterlab/mathjax-extension for typesetting. --- examples/web1/webpack.config.js | 5 +- packages/controls/package.json | 2 +- packages/controls/src/utils.ts | 11 +- packages/controls/src/widget_description.ts | 13 +-- packages/controls/test/webpack.conf.js | 1 + packages/controls/tsconfig.json | 2 +- yarn.lock | 114 ++++++++++++++++---- 7 files changed, 105 insertions(+), 43 deletions(-) diff --git a/examples/web1/webpack.config.js b/examples/web1/webpack.config.js index 53f0cbe8a0..f7193bc774 100644 --- a/examples/web1/webpack.config.js +++ b/examples/web1/webpack.config.js @@ -10,6 +10,9 @@ module.exports = { path: path.resolve(__dirname, 'built'), }, module: { - rules: [{ test: /\.css$/i, use: ['style-loader', 'css-loader'] }], + rules: [ + { test: /\.css$/i, use: ['style-loader', 'css-loader'] }, + { test: /\.svg$/, type: 'asset/resource' }, + ], }, }; diff --git a/packages/controls/package.json b/packages/controls/package.json index 6efa7c5f36..c162e30652 100644 --- a/packages/controls/package.json +++ b/packages/controls/package.json @@ -37,6 +37,7 @@ }, "dependencies": { "@jupyter-widgets/base": "^6.0.11", + "@jupyterlab/mathjax-extension": "^4.4.9", "@lumino/algorithm": "^1 || ^2", "@lumino/domutils": "^1 || ^2", "@lumino/messaging": "^1 || ^2", @@ -53,7 +54,6 @@ "@types/d3-format": "^3.0.1", "@types/expect.js": "^0.3.29", "@types/jquery": "^3.5.16", - "@types/mathjax": "^0.0.37", "@types/mocha": "^9.0.0", "@types/node": "^17.0.2", "chai": "^4.0.0", diff --git a/packages/controls/src/utils.ts b/packages/controls/src/utils.ts index 0250e118bf..b1bab7bc9f 100644 --- a/packages/controls/src/utils.ts +++ b/packages/controls/src/utils.ts @@ -1,12 +1,11 @@ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. - +import { MathJaxTypesetter } from '@jupyterlab/mathjax-extension'; export { uuid, resolvePromisesDict } from '@jupyter-widgets/base'; +const typesetter = new MathJaxTypesetter(); /** - * Apply MathJax rendering to an element, and optionally set its text. - * - * If MathJax is not available, make no changes. + * Apply MathJax rendering to an element, if `text` is provided it will replace element.textContent. * * Parameters * ---------- @@ -17,9 +16,7 @@ export function typeset(element: HTMLElement, text?: string): void { if (text !== void 0) { element.textContent = text; } - if ((window as any).MathJax !== void 0) { - MathJax!.Hub!.Queue(['Typeset', MathJax.Hub, element]); - } + typesetter.typeset(element); } /** diff --git a/packages/controls/src/widget_description.ts b/packages/controls/src/widget_description.ts index afc6556f6e..40ea975278 100644 --- a/packages/controls/src/widget_description.ts +++ b/packages/controls/src/widget_description.ts @@ -66,18 +66,7 @@ export class DescriptionView extends DOMWidgetView { } typeset(element: HTMLElement, text?: string): void { - this.displayed.then(() => { - const widget_manager: any = this.model.widget_manager; - const latexTypesetter = widget_manager._rendermime?.latexTypesetter; - if (latexTypesetter) { - if (text !== void 0) { - element.textContent = text; - } - latexTypesetter.typeset(element); - } else { - return typeset(element, text); - } - }); + this.displayed.then(() => typeset(element, text)); } updateDescription(): void { diff --git a/packages/controls/test/webpack.conf.js b/packages/controls/test/webpack.conf.js index ae4b39e183..7ba4d3178f 100644 --- a/packages/controls/test/webpack.conf.js +++ b/packages/controls/test/webpack.conf.js @@ -17,6 +17,7 @@ module.exports = { generator: { filename: '[name].[ext]' }, }, { test: /\.ipynb$/, type: 'json' }, + { test: /\.svg$/, type: 'asset/resource' }, ], }, mode: 'development', diff --git a/packages/controls/tsconfig.json b/packages/controls/tsconfig.json index ea205d9f6d..3b52136bb6 100644 --- a/packages/controls/tsconfig.json +++ b/packages/controls/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "outDir": "lib", "rootDir": "src", - "types": ["mathjax", "node"] + "types": ["node"] }, "include": ["src/**/*"], "references": [ diff --git a/yarn.lock b/yarn.lock index d5c3f37e7a..574e3ca551 100644 --- a/yarn.lock +++ b/yarn.lock @@ -856,6 +856,7 @@ __metadata: resolution: "@jupyter-widgets/controls@workspace:packages/controls" dependencies: "@jupyter-widgets/base": ^6.0.11 + "@jupyterlab/mathjax-extension": ^4.4.9 "@jupyterlab/services": ^6.0.0 || ^7.0.0 "@lumino/algorithm": ^1 || ^2 "@lumino/domutils": ^1 || ^2 @@ -866,7 +867,6 @@ __metadata: "@types/d3-format": ^3.0.1 "@types/expect.js": ^0.3.29 "@types/jquery": ^3.5.16 - "@types/mathjax": ^0.0.37 "@types/mocha": ^9.0.0 "@types/node": ^17.0.2 chai: ^4.0.0 @@ -1136,7 +1136,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application@npm:^3.0.0 || ^4.0.0": +"@jupyterlab/application@npm:^3.0.0 || ^4.0.0, @jupyterlab/application@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/application@npm:4.4.9" dependencies: @@ -1578,6 +1578,18 @@ __metadata: languageName: node linkType: hard +"@jupyterlab/mathjax-extension@npm:^4.4.9": + version: 4.4.9 + resolution: "@jupyterlab/mathjax-extension@npm:4.4.9" + dependencies: + "@jupyterlab/application": ^4.4.9 + "@jupyterlab/rendermime": ^4.4.9 + "@lumino/coreutils": ^2.2.1 + mathjax-full: ^3.2.2 + checksum: 33155cb0cfd9e81e44262ddd19c699cf84d9487c0280df0939611a91463e8cc359475c4f43e3952d2a4d83c830011e133253f23de27f39b154f60e1513b2232d + languageName: node + linkType: hard + "@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0, @jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/nbformat@npm:4.4.9" @@ -3664,9 +3676,9 @@ __metadata: linkType: hard "@types/emscripten@npm:^1.39.6": - version: 1.41.2 - resolution: "@types/emscripten@npm:1.41.2" - checksum: b0321eb7211f23801e886a7fbbd12e105b357eea5bb32ab13617d8cd04946a48a80b34ee7fe075344e76859753af2279969f7a322dda23bfd328bcfdf339a100 + version: 1.41.4 + resolution: "@types/emscripten@npm:1.41.4" + checksum: e7776acdfe3e95d43ff301eadf8cb21df0eb16395db02e1c4aa1646f01a53e2be5e375935f16123ac4432c5e720db395497a8ef45cf20ef962fa67e3456e556b languageName: node linkType: hard @@ -3789,13 +3801,6 @@ __metadata: languageName: node linkType: hard -"@types/mathjax@npm:^0.0.37": - version: 0.0.37 - resolution: "@types/mathjax@npm:0.0.37" - checksum: 8fe8f0dac3271a848dc0070c49ec8604c53abdc0a442308e357f215ed4d68102ed5e57e2f989cde447ebcf929efd2bc64b5a986b159c5cb50963546aa20d1a81 - languageName: node - linkType: hard - "@types/minimatch@npm:*, @types/minimatch@npm:^3.0.3": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" @@ -4569,6 +4574,13 @@ __metadata: languageName: node linkType: hard +"@xmldom/xmldom@npm:0.9.8": + version: 0.9.8 + resolution: "@xmldom/xmldom@npm:0.9.8" + checksum: f8d16ad3c8083312575850fa4f2c13a2b884a37021dbb0146c6b2575bd3ddbf4c900530b49a55a7f62088ecf9809173fd7138985e7e58ddab786578970e09c59 + languageName: node + linkType: hard + "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -5696,9 +5708,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1, caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30000792, caniuse-lite@npm:^1.0.30000805, caniuse-lite@npm:^1.0.30001746": - version: 1.0.30001750 - resolution: "caniuse-lite@npm:1.0.30001750" - checksum: 4a50a24ceed75cde8a8cd8b370a8c044463c26cc171eb30d1e738cd55b328c599b6e2602ec79e3e9d3b15d56e3cc980f02dd2f82784f91410544fa49c6d09cad + version: 1.0.30001751 + resolution: "caniuse-lite@npm:1.0.30001751" + checksum: d11e25c44e40c21e7b7492a25c9fd60f4c04e94aa265573f7c487666f5e1b5ca3ed09d09560336f959237063616255cb294d415511bb6cf0486eb2cb6a3a4318 languageName: node linkType: hard @@ -6083,6 +6095,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:13.1.0": + version: 13.1.0 + resolution: "commander@npm:13.1.0" + checksum: 8ca2fcb33caf2aa06fba3722d7a9440921331d54019dabf906f3603313e7bf334b009b862257b44083ff65d5a3ab19e83ad73af282bd5319f01dc228bdf87ef0 + languageName: node + linkType: hard + "commander@npm:^10.0.1": version: 10.0.1 resolution: "commander@npm:10.0.1" @@ -7627,6 +7646,13 @@ __metadata: languageName: node linkType: hard +"esm@npm:^3.2.25": + version: 3.2.25 + resolution: "esm@npm:3.2.25" + checksum: 978aabe2de83541c105605a6d60a26ed8e627ef6bb0a7605fe15a95bbdea6b8348bd045255cb22219c054dd09a81a94823df00843d9e97f42419c92015ce3a64 + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -11108,6 +11134,18 @@ __metadata: languageName: node linkType: hard +"mathjax-full@npm:^3.2.2": + version: 3.2.2 + resolution: "mathjax-full@npm:3.2.2" + dependencies: + esm: ^3.2.25 + mhchemparser: ^4.1.0 + mj-context-menu: ^0.6.1 + speech-rule-engine: ^4.0.6 + checksum: 6fbccb9338e1fbf686202d924666d79ac9eb658157c1c8102ba018672188978c4cacfb1b6f65adf7d2d51dc79535ff3e32ba86b15e66d3011dda2ab99562d90d + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -11169,6 +11207,13 @@ __metadata: languageName: node linkType: hard +"mhchemparser@npm:^4.1.0": + version: 4.2.1 + resolution: "mhchemparser@npm:4.2.1" + checksum: 6dd7e3926befc74d26cf7b44b9e5ff7295e142bffc48a60bd225d5a30d525354afb70d23fc4fdb8f46178099ab98a66a57a6131dcb0f410264cfd2b9ad4af4b7 + languageName: node + linkType: hard + "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" @@ -11470,6 +11515,13 @@ __metadata: languageName: node linkType: hard +"mj-context-menu@npm:^0.6.1": + version: 0.6.1 + resolution: "mj-context-menu@npm:0.6.1" + checksum: 7a036026538662cac9619b760fade98681618c3ddf417cb36eddb7c28a937baf257c56fd0b6318738419e738ba01a00bcb3790b324885fd6edbae03fb0a2c986 + languageName: node + linkType: hard + "mkdirp-infer-owner@npm:^2.0.0": version: 2.0.0 resolution: "mkdirp-infer-owner@npm:2.0.0" @@ -11773,8 +11825,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.4.2 - resolution: "node-gyp@npm:11.4.2" + version: 11.5.0 + resolution: "node-gyp@npm:11.5.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -11788,14 +11840,14 @@ __metadata: which: ^5.0.0 bin: node-gyp: bin/node-gyp.js - checksum: d8041cee7ec60c86fb2961d77c12a2d083a481fb28b08e6d9583153186c0e7766044dc30bdb1f3ac01ddc5763b83caeed3d1ea35787ec4ffd8cc4aeedfc34f2b + checksum: 6cc29b9d454d9a684c8fe299668db618875bb4282e37717ca5b79689cc5ce99cd553c70944bb367979f2eba40ad6a50afaf7b12a6b214172edc7377384efa051 languageName: node linkType: hard "node-releases@npm:^2.0.21": - version: 2.0.23 - resolution: "node-releases@npm:2.0.23" - checksum: dc3194ffdf04975f8525a5e175c03f5a95cecd7607b6b0e80d28aaa03900706d920722b5f2ae2e8e28e029e6ae75f0d0f7eae87e8ee2a363c704785e3118f13d + version: 2.0.25 + resolution: "node-releases@npm:2.0.25" + checksum: 9a23149cf3f6778e62440b1f26f91927aff06c3606a29996f3d196c7c0f5e31c17c24c324b5ef1f571cebef6b5a8db9adce9c09381ca271bc6422aac91463f75 languageName: node linkType: hard @@ -15037,6 +15089,19 @@ __metadata: languageName: node linkType: hard +"speech-rule-engine@npm:^4.0.6": + version: 4.1.2 + resolution: "speech-rule-engine@npm:4.1.2" + dependencies: + "@xmldom/xmldom": 0.9.8 + commander: 13.1.0 + wicked-good-xpath: 1.3.0 + bin: + sre: bin/sre + checksum: 437e70f6f6a08b35d5339467427d6a74eecf6c1f4a74e551b2c18ad2315c1f6a89ecb801d02c49e92b30df709a3a8e08ad75ae1095c0224c2cd0fddf5f982de9 + languageName: node + linkType: hard + "split2@npm:^3.0.0": version: 3.2.2 resolution: "split2@npm:3.2.2" @@ -16798,6 +16863,13 @@ __metadata: languageName: node linkType: hard +"wicked-good-xpath@npm:1.3.0": + version: 1.3.0 + resolution: "wicked-good-xpath@npm:1.3.0" + checksum: 1aa84bd57426aa07f95d7eca0b0410e841b8e7a35248c9404fa235eaf6a0932c811a96cbdc763c3df18ab76c7644fd8e807d8f185146154d3fc6baf554dcc7e3 + languageName: node + linkType: hard + "wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" From 4aff0cd278d842451c647a4eaaf0814052673fb8 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sat, 18 Oct 2025 10:54:31 +1100 Subject: [PATCH 40/48] Simplify tests (some were failing for an unknown reason when run together). --- .github/workflows/packaging.yml | 2 +- .github/workflows/tests.yml | 4 +-- .../ipywidgets/widgets/tests/test_widget.py | 23 +++++++--------- .../widgets/tests/test_widget_box.py | 26 ------------------- python/ipywidgets/setup.cfg | 5 ++-- 5 files changed, 15 insertions(+), 45 deletions(-) diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index e09f62e2aa..532486e3bd 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -83,7 +83,7 @@ jobs: fail-fast: false matrix: os: [ubuntu, windows] - python: ['3.9', '3.13'] + python: ['3.10', '3.13'] dist: ['ipywidgets*.tar.gz'] include: - python: '3.13' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4ee8dfda81..2f27e04cd6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -77,7 +77,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@v4 @@ -96,7 +96,7 @@ jobs: pip install file://$PWD/python/ipywidgets#egg=ipywidgets[test] - name: Test with pytest run: | - pip install "pytest<8" + pip install "pytest" cd python/ipywidgets pytest --cov=ipywidgets ipywidgets diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py index dbd949dd10..6058f6e435 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py @@ -159,18 +159,16 @@ def test_widget_open(): "Widget", ], ) -@pytest.mark.parametrize("enable_weakref", [True, False]) -def test_weakreference(class_name, enable_weakref): +def test_weakreference(class_name): # Ensure the base instance of all widgets can be deleted / garbage collected. - if enable_weakref: - ipw.enable_weakreference() - cls = getattr(ipw, class_name) - if class_name in ['SelectionRangeSlider', 'SelectionSlider']: - kwgs = {"options": [1, 2, 4]} - else: - kwgs = {} + ipw.enable_weakreference() try: - w = cls(**kwgs) + cls = getattr(ipw, class_name) + if class_name in ["SelectionRangeSlider", "SelectionSlider"]: + kwgs = {"options": [1, 2, 4]} + else: + kwgs = {} + w: Widget = cls(**kwgs) deleted = False def on_delete(): nonlocal deleted @@ -178,14 +176,11 @@ def on_delete(): weakref.finalize(w, on_delete) # w should be the only strong ref to the widget. # calling `del` should invoke its immediate deletion calling the `__del__` method. - if not enable_weakref: - w.close() del w gc.collect() assert deleted finally: - if enable_weakref: - ipw.disable_weakreference() + ipw.disable_weakreference() @pytest.mark.parametrize("weakref_enabled", [True, False]) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py index 021e3f4c78..a24bad2f84 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py @@ -55,29 +55,3 @@ def test_box_validate_mode(): with pytest.raises(TraitError): box.children += ("Not a widget", closed_button) - -def test_box_gc(): - widgets.enable_weakreference() - # Test Box gc collected and children lifecycle managed. - try: - deleted = False - - class TestButton(widgets.Button): - def my_click(self, b): - pass - - button = TestButton(description="button") - button.on_click(button.my_click) - - b = widgets.VBox(children=[button]) - - def on_delete(): - nonlocal deleted - deleted = True - - weakref.finalize(b, on_delete) - del b - gc.collect() - assert deleted - finally: - widgets.disable_weakreference() diff --git a/python/ipywidgets/setup.cfg b/python/ipywidgets/setup.cfg index 2bbf868a3a..889d8301d7 100644 --- a/python/ipywidgets/setup.cfg +++ b/python/ipywidgets/setup.cfg @@ -18,16 +18,16 @@ classifiers = License :: OSI Approved :: BSD License Programming Language :: Python Programming Language :: Python :: 3 - Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 Programming Language :: Python :: 3.13 + Programming Language :: Python :: 3.14 Programming Language :: Python :: 3 :: Only Framework :: Jupyter [options] -python_requires = >=3.7 +python_requires = >=3.10 zip_safe = False # include_package_data = True @@ -47,6 +47,7 @@ test = pytest>=3.6.0 pytest-cov pytz + pytest-mock [options.package_data] ipywidgets = From 4869104c8d62fcf02ab1431ba2fa77499f0a5d4c Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sat, 18 Oct 2025 11:19:29 +1100 Subject: [PATCH 41/48] Fix create_markdown accessing deprecated (removed _widget_types). --- packages/schema/generate-spec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/generate-spec.py b/packages/schema/generate-spec.py index 7b9465b047..9eaa515a8d 100644 --- a/packages/schema/generate-spec.py +++ b/packages/schema/generate-spec.py @@ -236,7 +236,7 @@ def create_markdown(spec): args = parser.parse_args() format = args.format - widgets_to_document = sorted(widgets.Widget._widget_types.items()) + widgets_to_document = sorted(widgets.widget._registry.items()) spec = create_spec(widgets_to_document) if args.output: From ec26a09e5e046a0c104a16d9b10c1305b9f12ee9 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sat, 18 Oct 2025 12:31:33 +1100 Subject: [PATCH 42/48] Merge remote-tracking branch 'origin/weakref' into combine_v1 --- .github/workflows/packaging.yml | 2 +- .github/workflows/tests.yml | 4 +- docs/source/dev_install.md | 1 + packages/base/src/widget.ts | 8 +- packages/controls/src/widget_bool.ts | 13 +- packages/controls/src/widget_description.ts | 5 - packages/controls/src/widget_link.ts | 3 + packages/controls/src/widget_selection.ts | 10 - packages/controls/src/widget_string.ts | 20 -- packages/schema/generate-spec.py | 2 +- .../schema/jupyterwidgetmodels.latest.json | 42 +--- packages/schema/jupyterwidgetmodels.latest.md | 14 +- python/ipywidgets/ipywidgets/embed.py | 6 +- .../ipywidgets/ipywidgets/tests/test_embed.py | 4 +- .../ipywidgets/ipywidgets/widgets/__init__.py | 2 +- .../widgets/tests/test_send_state.py | 5 +- .../widgets/tests/test_set_state.py | 230 ++++++++++-------- .../ipywidgets/widgets/tests/test_widget.py | 193 +++++++++++++-- .../widgets/tests/test_widget_box.py | 64 +++-- .../ipywidgets/widgets/tests/utils.py | 17 +- .../ipywidgets/ipywidgets/widgets/widget.py | 214 ++++++++-------- .../ipywidgets/widgets/widget_box.py | 53 +++- python/ipywidgets/setup.cfg | 5 +- python/jupyterlab_widgets/package.json | 11 + yarn.lock | 11 +- 25 files changed, 560 insertions(+), 379 deletions(-) diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index 6d58cb021e..509cfb94db 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -83,7 +83,7 @@ jobs: fail-fast: false matrix: os: [ubuntu, windows] - python: ['3.9', '3.13'] + python: ['3.10', '3.13'] dist: ['ipywidgets*.tar.gz'] include: - python: '3.13' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4ee8dfda81..2f27e04cd6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -77,7 +77,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@v4 @@ -96,7 +96,7 @@ jobs: pip install file://$PWD/python/ipywidgets#egg=ipywidgets[test] - name: Test with pytest run: | - pip install "pytest<8" + pip install "pytest" cd python/ipywidgets pytest --cov=ipywidgets ipywidgets diff --git a/docs/source/dev_install.md b/docs/source/dev_install.md index ad90794b4b..56d2bd90a8 100644 --- a/docs/source/dev_install.md +++ b/docs/source/dev_install.md @@ -90,6 +90,7 @@ To update the widget model specification with changes, do something like this in ``` python ./packages/schema/generate-spec.py -f json-pretty packages/schema/jupyterwidgetmodels.latest.json python ./packages/schema/generate-spec.py -f markdown packages/schema/jupyterwidgetmodels.latest.md +jlpm prettier ``` ## Releasing new versions diff --git a/packages/base/src/widget.ts b/packages/base/src/widget.ts index 55a6f31ab5..4953cd847e 100644 --- a/packages/base/src/widget.ts +++ b/packages/base/src/widget.ts @@ -1102,11 +1102,11 @@ export class DOMWidgetView extends WidgetView { } updateTooltip(): void { - const title = this.model.get('tooltip'); - if (!title) { - this.el.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { + const title = this.model.get('tooltip') ?? this.model.get('description'); + if (title) { this.el.setAttribute('title', title); + } else { + this.el.removeAttribute('title'); } } diff --git a/packages/controls/src/widget_bool.ts b/packages/controls/src/widget_bool.ts index a08d9ff693..8f2a67b521 100644 --- a/packages/controls/src/widget_bool.ts +++ b/packages/controls/src/widget_bool.ts @@ -153,8 +153,7 @@ export class CheckboxView extends DescriptionView { this.descriptionSpan.textContent = description; } this.typeset(this.descriptionSpan); - this.descriptionSpan.title = description; - this.checkbox.title = description; + this.updateTooltip(); } /** @@ -180,16 +179,6 @@ export class CheckboxView extends DescriptionView { } } - updateTooltip(): void { - if (!this.checkbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.checkbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.checkbox.setAttribute('title', title); - } - } - events(): { [e: string]: string } { return { 'click input[type="checkbox"]': '_handle_click', diff --git a/packages/controls/src/widget_description.ts b/packages/controls/src/widget_description.ts index 40ea975278..02d0ebf0a1 100644 --- a/packages/controls/src/widget_description.ts +++ b/packages/controls/src/widget_description.ts @@ -85,11 +85,6 @@ export class DescriptionView extends DOMWidgetView { } } - updateTooltip(): void { - if (!this.label) return; - this.label.title = this.model.get('tooltip'); - } - label: HTMLLabelElement; } diff --git a/packages/controls/src/widget_link.ts b/packages/controls/src/widget_link.ts index 2b90330e41..7de1904898 100644 --- a/packages/controls/src/widget_link.ts +++ b/packages/controls/src/widget_link.ts @@ -85,9 +85,12 @@ export class DirectionalLinkModel extends CoreWidgetModel { undefined ); this.stopListening(this.sourceModel, 'destroy', undefined); + this.set('source', [null, '']); } if (this.targetModel) { this.stopListening(this.targetModel, 'destroy', undefined); + this.set('target', [null, '']); + this.save_changes(); } } diff --git a/packages/controls/src/widget_selection.ts b/packages/controls/src/widget_selection.ts index 7986383d79..050723c9c3 100644 --- a/packages/controls/src/widget_selection.ts +++ b/packages/controls/src/widget_selection.ts @@ -67,16 +67,6 @@ export class SelectionView extends DescriptionView { } } - updateTooltip(): void { - if (!this.listbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.listbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.listbox.setAttribute('title', title); - } - } - listbox: HTMLSelectElement; } diff --git a/packages/controls/src/widget_string.ts b/packages/controls/src/widget_string.ts index a907b667d1..8d65365916 100644 --- a/packages/controls/src/widget_string.ts +++ b/packages/controls/src/widget_string.ts @@ -378,16 +378,6 @@ export class TextareaView extends StringView { } } - updateTooltip(): void { - if (!this.textbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.textbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.textbox.setAttribute('title', title); - } - } - events(): { [e: string]: string } { return { 'keydown textarea': 'handleKeyDown', @@ -504,16 +494,6 @@ export class TextView extends StringView { } } - updateTooltip(): void { - if (!this.textbox) return; // we might be constructing the parent - const title = this.model.get('tooltip'); - if (!title) { - this.textbox.removeAttribute('title'); - } else if (this.model.get('description').length === 0) { - this.textbox.setAttribute('title', title); - } - } - update(options?: any): void { /** * Update the contents of this view diff --git a/packages/schema/generate-spec.py b/packages/schema/generate-spec.py index 7b9465b047..9eaa515a8d 100644 --- a/packages/schema/generate-spec.py +++ b/packages/schema/generate-spec.py @@ -236,7 +236,7 @@ def create_markdown(spec): args = parser.parse_args() format = args.format - widgets_to_document = sorted(widgets.Widget._widget_types.items()) + widgets_to_document = sorted(widgets.widget._registry.items()) spec = create_spec(widgets_to_document) if args.output: diff --git a/packages/schema/jupyterwidgetmodels.latest.json b/packages/schema/jupyterwidgetmodels.latest.json index 0cefeb25bf..6a2b37ccef 100644 --- a/packages/schema/jupyterwidgetmodels.latest.json +++ b/packages/schema/jupyterwidgetmodels.latest.json @@ -441,12 +441,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -935,12 +931,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -3753,12 +3745,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -3850,12 +3838,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -6643,12 +6627,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -6756,12 +6736,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", @@ -7914,12 +7890,8 @@ { "default": [], "help": "List of widget children", - "items": { - "type": "reference", - "widget": "Widget" - }, "name": "children", - "type": "array" + "type": "Children" }, { "default": "reference to new instance", diff --git a/packages/schema/jupyterwidgetmodels.latest.md b/packages/schema/jupyterwidgetmodels.latest.md index eb7e7147b8..bc061245f2 100644 --- a/packages/schema/jupyterwidgetmodels.latest.md +++ b/packages/schema/jupyterwidgetmodels.latest.md @@ -76,7 +76,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'AccordionView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `selected_index` | `null` or number (integer) | `null` | The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | @@ -163,7 +163,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'BoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | @@ -663,7 +663,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'GridBoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | @@ -680,7 +680,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'HBoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | @@ -1179,7 +1179,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'StackView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `selected_index` | `null` or number (integer) | `null` | The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | @@ -1198,7 +1198,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'TabView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `selected_index` | `null` or number (integer) | `null` | The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | @@ -1402,7 +1402,7 @@ that the widget is registered with. | `_view_module_version` | string | `'2.0.0'` | | `_view_name` | string | `'VBoxView'` | | `box_style` | string (one of `'success'`, `'info'`, `'warning'`, `'danger'`, `''`) | `''` | Use a predefined styling for the box. | -| `children` | array of reference to Widget widget | `[]` | List of widget children | +| `children` | Children | `[]` | List of widget children | | `layout` | reference to Layout widget | reference to new instance | | `tabbable` | `null` or boolean | `null` | Is widget tabbable? | | `tooltip` | `null` or string | `null` | A tooltip caption. | diff --git a/python/ipywidgets/ipywidgets/embed.py b/python/ipywidgets/ipywidgets/embed.py index ca58880092..e9bffbfd65 100644 --- a/python/ipywidgets/ipywidgets/embed.py +++ b/python/ipywidgets/ipywidgets/embed.py @@ -12,7 +12,7 @@ import json import re -from .widgets import Widget, DOMWidget, widget as widget_module +from .widgets import Widget, DOMWidget from .widgets.widget_link import Link from .widgets.docutils import doc_subst from ._version import __html_manager_version__ @@ -129,7 +129,7 @@ def _get_recursive_state(widget, store=None, drop_defaults=False): def add_resolved_links(store, drop_defaults): """Adds the state of any link models between two models in store""" - for widget_id, widget in widget_module._instances.items(): # go over all widgets + for widget_id, widget in Widget._instances.items(): # go over all widgets if isinstance(widget, Link) and widget_id not in store: if widget.source[0].model_id in store and widget.target[0].model_id in store: store[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) @@ -207,7 +207,7 @@ def embed_data(views, drop_defaults=True, state=None): view_specs: a list of widget view specs """ if views is None: - views = [w for w in widget_module._instances.values() if isinstance(w, DOMWidget)] + views = [w for w in Widget._instances.values() if isinstance(w, DOMWidget)] else: try: views[0] diff --git a/python/ipywidgets/ipywidgets/tests/test_embed.py b/python/ipywidgets/ipywidgets/tests/test_embed.py index a295442455..c5e6b97aa1 100644 --- a/python/ipywidgets/ipywidgets/tests/test_embed.py +++ b/python/ipywidgets/ipywidgets/tests/test_embed.py @@ -9,7 +9,7 @@ import traitlets -from ..widgets import IntSlider, IntText, Text, Widget, jslink, HBox, widget_serialization, widget as widget_module +from ..widgets import IntSlider, IntText, Text, Widget, jslink, HBox, widget_serialization from ..embed import embed_data, embed_snippet, embed_minimal_html, dependency_state @@ -29,7 +29,7 @@ class CaseWidget(Widget): class TestEmbed: def teardown(self): - for w in tuple(widget_module._instances.values()): + for w in tuple(Widget._instances.values()): w.close() def test_embed_data_simple(self): diff --git a/python/ipywidgets/ipywidgets/widgets/__init__.py b/python/ipywidgets/ipywidgets/widgets/__init__.py index b90d3ee111..0951bad905 100644 --- a/python/ipywidgets/ipywidgets/widgets/__init__.py +++ b/python/ipywidgets/ipywidgets/widgets/__init__.py @@ -1,7 +1,7 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -from .widget import Widget, CallbackDispatcher, register, widget_serialization +from .widget import Widget, CallbackDispatcher, register, widget_serialization, enable_weakreference, disable_weakreference from .domwidget import DOMWidget from .valuewidget import ValueWidget diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py b/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py index 98465b9b7d..ad1335e52d 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_send_state.py @@ -9,12 +9,11 @@ from ..._version import __control_protocol_version__ + # A widget with simple traits class SimpleWidget(Widget): a = Bool().tag(sync=True) - b = Tuple(Bool(), Bool(), Bool(), default_value=(False, False, False)).tag( - sync=True - ) + b = Tuple(Bool(), Bool(), Bool(), default_value=(False, False, False)).tag(sync=True) c = List(Bool()).tag(sync=True) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py b/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py index 22ec54d90f..c19ff57cde 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_set_state.py @@ -19,10 +19,12 @@ def echo(request): yield request.param ipywidgets.widgets.widget.JUPYTER_WIDGETS_ECHO = oldvalue + # # First some widgets to test on: # + # A widget with simple traits (list + tuple to ensure both are handled) class SimpleWidget(Widget): a = Bool().tag(sync=True) @@ -38,7 +40,6 @@ class NumberWidget(Widget): ci = CInt().tag(sync=True) - # A widget where the data might be changed on reception: def transform_fromjson(data, widget): # Switch the two last elements when setting from json, if the first element is True @@ -47,31 +48,37 @@ def transform_fromjson(data, widget): return data return [False] + data[1:-2] + [data[-1], data[-2]] + class TransformerWidget(Widget): d = List(Bool()).tag(sync=True, from_json=transform_fromjson) - # A widget that has a buffer: -class DataInstance(): +class DataInstance: def __init__(self, data=None): self.data = data + def mview_serializer(instance, widget): - return { 'data': memoryview(instance.data) if instance.data else None } + return {"data": memoryview(instance.data) if instance.data else None} + def bytes_serializer(instance, widget): - return { 'data': bytearray(memoryview(instance.data).tobytes()) if instance.data else None } + return {"data": bytearray(memoryview(instance.data).tobytes()) if instance.data else None} + def deserializer(json_data, widget): - return DataInstance( memoryview(json_data['data']).tobytes() if json_data else None ) + return DataInstance(memoryview(json_data["data"]).tobytes() if json_data else None) + class DataWidget(SimpleWidget): d = Instance(DataInstance, args=()).tag(sync=True, to_json=mview_serializer, from_json=deserializer) + # A widget that has a buffer that might be changed on reception: def truncate_deserializer(json_data, widget): - return DataInstance( json_data['data'][:20].tobytes() if json_data else None ) + return DataInstance(json_data["data"][:20].tobytes() if json_data else None) + class TruncateDataWidget(SimpleWidget): d = Instance(DataInstance, args=()).tag(sync=True, to_json=bytes_serializer, from_json=truncate_deserializer) @@ -81,72 +88,82 @@ class TruncateDataWidget(SimpleWidget): # Actual tests: # + def test_set_state_simple(echo): w = SimpleWidget() - w.set_state(dict( - a=True, - b=[True, False, True], - c=[False, True, False], - )) + w.set_state( + dict( + a=True, + b=[True, False, True], + c=[False, True, False], + ) + ) assert len(w.comm.messages) == (1 if echo else 0) def test_set_state_transformer(echo): w = TransformerWidget() - w.set_state(dict( - d=[True, False, True] - )) + w.set_state(dict(d=[True, False, True])) # Since the deserialize step changes the state, this should send an update expected = [] if echo: expected.append( - ((), dict( - buffers=[], - data=dict( - buffer_paths=[], - method='echo_update', - state=dict(d=[True, False, True]), - )))) + ( + (), + dict( + buffers=[], + data=dict( + buffer_paths=[], + method="echo_update", + state=dict(d=[True, False, True]), + ), + ), + ) + ) expected.append( - ((), dict( - buffers=[], - data=dict( - buffer_paths=[], - method='update', - state=dict(d=[False, True, False]), - )))) + ( + (), + dict( + buffers=[], + data=dict( + buffer_paths=[], + method="update", + state=dict(d=[False, True, False]), + ), + ), + ) + ) assert w.comm.messages == expected def test_set_state_data(echo): w = DataWidget() - data = memoryview(b'x'*30) - w.set_state(dict( - a=True, - d={'data': data}, - )) + data = memoryview(b"x" * 30) + w.set_state( + dict( + a=True, + d={"data": data}, + ) + ) assert len(w.comm.messages) == (1 if echo else 0) def test_set_state_data_truncate(echo): w = TruncateDataWidget() - data = memoryview(b'x'*30) - w.set_state(dict( - a=True, - d={'data': data}, - )) + data = memoryview(b"x" * 30) + w.set_state( + dict( + a=True, + d={"data": data}, + ) + ) # Get message for checking - assert len(w.comm.messages) == 2 if echo else 1 # ensure we didn't get more than expected + assert len(w.comm.messages) == 2 if echo else 1 # ensure we didn't get more than expected msg = w.comm.messages[-1] # Assert that the data update (truncation) sends an update - buffers = msg[1].pop('buffers') - assert msg == ((), dict( - data=dict( - method='update', - state=dict(d={}), - buffer_paths=[['d', 'data']] - ))) + buffers = msg[1].pop("buffers") + assert msg == ((), dict(data=dict(method="update", state=dict(d={}), buffer_paths=[["d", "data"]]))) # Sanity: assert len(buffers) == 1 @@ -159,12 +176,14 @@ def test_set_state_numbers_int(echo): w = NumberWidget() # Set everything with ints - w.set_state(dict( - f = 1, - cf = 2, - i = 3, - ci = 4, - )) + w.set_state( + dict( + f=1, + cf=2, + i=3, + ci=4, + ) + ) # Ensure one update message gets produced assert len(w.comm.messages) == (1 if echo else 0) @@ -172,11 +191,7 @@ def test_set_state_numbers_int(echo): def test_set_state_numbers_float(echo): w = NumberWidget() # Set floats to int-like floats - w.set_state(dict( - f = 1.0, - cf = 2.0, - ci = 4.0 - )) + w.set_state(dict(f=1.0, cf=2.0, ci=4.0)) # Ensure one update message gets produced assert len(w.comm.messages) == (1 if echo else 0) @@ -184,10 +199,12 @@ def test_set_state_numbers_float(echo): def test_set_state_float_to_float(echo): w = NumberWidget() # Set floats to float - w.set_state(dict( - f = 1.2, - cf = 2.6, - )) + w.set_state( + dict( + f=1.2, + cf=2.6, + ) + ) # Ensure one message gets produced assert len(w.comm.messages) == (1 if echo else 0) @@ -196,15 +213,13 @@ def test_set_state_cint_to_float(echo): w = NumberWidget() # Set CInt to float - w.set_state(dict( - ci = 5.6 - )) + w.set_state(dict(ci=5.6)) # Ensure an update message gets produced assert len(w.comm.messages) == (2 if echo else 1) msg = w.comm.messages[-1] - data = msg[1]['data'] - assert data['method'] == 'update' - assert data['state'] == {'ci': 5} + data = msg[1]["data"] + assert data["method"] == "update" + assert data["state"] == {"ci": 5} # This test is disabled, meaning ipywidgets REQUIRES @@ -216,9 +231,7 @@ def _x_test_set_state_int_to_int_like(): w = NumberWidget() # Set floats to int-like floats - w.set_state(dict( - i = 3.0 - )) + w.set_state(dict(i=3.0)) # Ensure no update message gets produced assert len(w.comm.messages) == 0 @@ -228,9 +241,8 @@ def test_set_state_int_to_float(echo): # Set Int to float with pytest.raises(TraitError): - w.set_state(dict( - i = 3.5 - )) + w.set_state(dict(i=3.5)) + def test_property_lock(echo): # when this widget's value is set to 42, it sets itself to 2, and then back to 42 again (and then stops) @@ -238,9 +250,9 @@ class AnnoyingWidget(Widget): value = Float().tag(sync=True) stop = Bool(False) - @observe('value') + @observe("value") def _propagate_value(self, change): - print('_propagate_value', change.new) + print("_propagate_value", change.new) if self.stop: return if change.new == 42: @@ -254,7 +266,7 @@ def _propagate_value(self, change): widget._send = mock.MagicMock() # this mimics a value coming from the front end - widget.set_state({'value': 42}) + widget.set_state({"value": 42}) assert widget.value == 42 assert widget.stop is True @@ -262,15 +274,16 @@ def _propagate_value(self, change): calls = [] widget._send.assert_has_calls(calls) + def test_hold_sync(echo): # when this widget's value is set to 42, it sets the value to 2, and also sets a different trait value class AnnoyingWidget(Widget): value = Float().tag(sync=True) other = Float().tag(sync=True) - @observe('value') + @observe("value") def _propagate_value(self, change): - print('_propagate_value', change.new) + print("_propagate_value", change.new) if change.new == 42: self.value = 2 self.other = 11 @@ -280,24 +293,23 @@ def _propagate_value(self, change): widget._send = mock.MagicMock() # this mimics a value coming from the front end - widget.set_state({'value': 42}) + widget.set_state({"value": 42}) assert widget.value == 2 assert widget.other == 11 - msg = {'method': 'echo_update', 'state': {'value': 42.0}, 'buffer_paths': []} + msg = {"method": "echo_update", "state": {"value": 42.0}, "buffer_paths": []} call42 = mock.call(msg, buffers=[]) - msg = {'method': 'update', 'state': {'value': 2.0}, 'buffer_paths': []} + msg = {"method": "update", "state": {"value": 2.0}, "buffer_paths": []} call2 = mock.call(msg, buffers=[]) - msg = {'method': 'update', 'state': {'other': 11.0}, 'buffer_paths': []} + msg = {"method": "update", "state": {"other": 11.0}, "buffer_paths": []} call11 = mock.call(msg, buffers=[]) calls = [call42, call2, call11] if echo else [call2, call11] widget._send.assert_has_calls(calls) - def test_echo(): # we always echo values back to the frontend class ValueWidget(Widget): @@ -308,11 +320,11 @@ class ValueWidget(Widget): widget._send = mock.MagicMock() # this mimics a state coming from the front end - widget.set_state({'value': 42, 'unexpected_field': 43}) + widget.set_state({"value": 42, "unexpected_field": 43}) assert widget.value == 42 # we expect this to be echoed - msg = {'method': 'echo_update', 'state': {'value': 42.0}, 'buffer_paths': []} + msg = {"method": "echo_update", "state": {"value": 42.0}, "buffer_paths": []} call42 = mock.call(msg, buffers=[]) calls = [call42] @@ -324,7 +336,8 @@ def test_echo_single(): class ValueWidget(Widget): value = Float().tag(sync=True) square = Float().tag(sync=True) - @observe('value') + + @observe("value") def _square(self, change): self.square = self.value**2 @@ -333,33 +346,34 @@ def _square(self, change): widget._send = mock.MagicMock() # this mimics a value coming from the front end - widget._handle_msg({ - 'content': { - 'data': { - 'method': 'update', - 'state': { - 'value': 8, + widget._handle_msg( + { + "content": { + "data": { + "method": "update", + "state": { + "value": 8, + }, } } } - }) + ) assert widget.value == 8 assert widget.square == 64 # we expect this to be echoed # note that only value is echoed, not square - msg = {'method': 'echo_update', 'state': {'value': 8.0}, 'buffer_paths': []} + msg = {"method": "echo_update", "state": {"value": 8.0}, "buffer_paths": []} call = mock.call(msg, buffers=[]) - msg = {'method': 'update', 'state': {'square': 64}, 'buffer_paths': []} + msg = {"method": "update", "state": {"square": 64}, "buffer_paths": []} call2 = mock.call(msg, buffers=[]) - calls = [call, call2] widget._send.assert_has_calls(calls) -def test_no_echo(echo): +def test_no_echo(): # in cases where values coming from the frontend are 'heavy', we might want to opt out class ValueWidget(Widget): value = Float().tag(sync=True, echo_update=False) @@ -369,16 +383,18 @@ class ValueWidget(Widget): widget._send = mock.MagicMock() # this mimics a value coming from the front end - widget._handle_msg({ - 'content': { - 'data': { - 'method': 'update', - 'state': { - 'value': 42, + widget._handle_msg( + { + "content": { + "data": { + "method": "update", + "state": { + "value": 42, + }, } } } - }) + ) assert widget.value == 42 # widget._send.assert_not_called(calls) @@ -386,4 +402,6 @@ class ValueWidget(Widget): # a regular set should sync to the frontend widget.value = 43 - widget._send.assert_has_calls([mock.call({'method': 'update', 'state': {'value': 43.0}, 'buffer_paths': []}, buffers=[])]) + widget._send.assert_has_calls( + [mock.call({"method": "update", "state": {"value": 43.0}, "buffer_paths": []}, buffers=[])] + ) diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py index c5aa36048a..6058f6e435 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py @@ -3,17 +3,19 @@ """Test Widget.""" -import inspect +import copy +import gc +import weakref import pytest from IPython.core.interactiveshell import InteractiveShell from IPython.display import display from IPython.utils.capture import capture_output -from .. import widget +import ipywidgets as ipw + from ..widget import Widget from ..widget_button import Button -import copy def test_no_widget_view(): @@ -58,29 +60,12 @@ def test_close_all(): # create a couple of widgets widgets = [Button() for i in range(10)] - assert len(widget._instances) > 0, "expect active widgets" - assert widget._instances[widgets[0].model_id] is widgets[0] + assert len(Widget._instances) > 0, "expect active widgets" + assert Widget._instances[widgets[0].model_id] is widgets[0] # close all the widgets Widget.close_all() - assert len(widget._instances) == 0, "active widgets should be cleared" - - -def test_compatibility(): - button = Button() - assert widget._instances[button.model_id] is button - with pytest.deprecated_call() as record: - assert widget._instances is widget.Widget.widgets - assert widget._instances is widget.Widget._active_widgets - assert widget._registry is widget.Widget.widget_types - assert widget._registry is widget.Widget._widget_types - - Widget.close_all() - assert not widget.Widget.widgets - assert not widget.Widget._active_widgets - caller_path = inspect.stack(context=0)[1].filename - assert all(x.filename == caller_path for x in record) - assert len(record) == 6 + assert len(Widget._instances) == 0, "active widgets should be cleared" def test_widget_copy(): @@ -88,4 +73,164 @@ def test_widget_copy(): with pytest.raises(NotImplementedError): copy.copy(button) with pytest.raises(NotImplementedError): - copy.deepcopy(button) \ No newline at end of file + copy.deepcopy(button) + + +def test_widget_open(): + button = Button() + model_id = button.model_id + assert model_id in Widget._instances + spec = button.get_view_spec() + assert list(spec) == ["version_major", "version_minor", "model_id"] + assert spec["model_id"] + button.close() + assert model_id not in Widget._instances + with pytest.raises(RuntimeError, match="Widget is closed"): + button.open() + with pytest.raises(RuntimeError, match="Widget is closed"): + button.get_view_spec() + + +@pytest.mark.parametrize( + "class_name", + [ + "Accordion", + "AppLayout", + "Audio", + "BoundedFloatText", + "BoundedIntText", + "Box", + "Button", + "ButtonStyle", + "Checkbox", + "ColorPicker", + "ColorsInput", + "Combobox", + "Controller", + "CoreWidget", + "DOMWidget", + "DatePicker", + "DatetimePicker", + "Dropdown", + "FileUpload", + "FloatLogSlider", + "FloatProgress", + "FloatRangeSlider", + "FloatSlider", + "FloatText", + "FloatsInput", + "GridBox", + "HBox", + "HTML", + "HTMLMath", + "Image", + "IntProgress", + "IntRangeSlider", + "IntSlider", + "IntText", + "IntsInput", + "Label", + "Layout", + "NaiveDatetimePicker", + "Output", + "Password", + "Play", + "RadioButtons", + "Select", + "SelectMultiple", + "SelectionRangeSlider", + "SelectionSlider", + "SliderStyle", + "Stack", + "Style", + "Tab", + "TagsInput", + "Text", + "Textarea", + "TimePicker", + "ToggleButton", + "ToggleButtons", + "ToggleButtonsStyle", + "TwoByTwoLayout", + "VBox", + "Valid", + "ValueWidget", + "Video", + "Widget", + ], +) +def test_weakreference(class_name): + # Ensure the base instance of all widgets can be deleted / garbage collected. + ipw.enable_weakreference() + try: + cls = getattr(ipw, class_name) + if class_name in ["SelectionRangeSlider", "SelectionSlider"]: + kwgs = {"options": [1, 2, 4]} + else: + kwgs = {} + w: Widget = cls(**kwgs) + deleted = False + def on_delete(): + nonlocal deleted + deleted = True + weakref.finalize(w, on_delete) + # w should be the only strong ref to the widget. + # calling `del` should invoke its immediate deletion calling the `__del__` method. + del w + gc.collect() + assert deleted + finally: + ipw.disable_weakreference() + + +@pytest.mark.parametrize("weakref_enabled", [True, False]) +def test_button_weakreference(weakref_enabled: bool): + try: + click_count = 0 + deleted = False + + def on_delete(): + nonlocal deleted + deleted = True + + class TestButton(Button): + def my_click(self, b): + nonlocal click_count + click_count += 1 + + b = TestButton(description="button") + weakref.finalize(b, on_delete) + b_ref = weakref.ref(b) + assert b in Widget._instances.values() + + b.on_click(b.my_click) + b.on_click(lambda x: setattr(x, "clicked", True)) + + b.click() + assert click_count == 1 + + if weakref_enabled: + ipw.enable_weakreference() + assert b in Widget._instances.values(), "Instances not transferred" + ipw.disable_weakreference() + assert b in Widget._instances.values(), "Instances not transferred" + ipw.enable_weakreference() + assert b in Widget._instances.values(), "Instances not transferred" + + b.click() + assert click_count == 2 + assert getattr(b, "clicked") + + del b + gc.collect() + if weakref_enabled: + assert deleted + else: + assert not deleted + assert b_ref() in Widget._instances.values() + b_ref().close() + gc.collect() + assert deleted, "Closing should remove the last strong reference." + + finally: + ipw.disable_weakreference() diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py index 551f68dcc4..a24bad2f84 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py @@ -1,33 +1,57 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -from unittest import TestCase +import gc +import weakref +import pytest from traitlets import TraitError import ipywidgets as widgets -class TestBox(TestCase): +def test_box_construction(): + box = widgets.Box() + assert box.get_state()["children"] == [] - def test_construction(self): - box = widgets.Box() - assert box.get_state()['children'] == [] - def test_construction_with_children(self): - html = widgets.HTML('some html') - slider = widgets.IntSlider() - box = widgets.Box([html, slider]) - children_state = box.get_state()['children'] - assert children_state == [ - widgets.widget._widget_to_json(html, None), - widgets.widget._widget_to_json(slider, None), - ] +def test_box_construction_with_children(): + html = widgets.HTML("some html") + slider = widgets.IntSlider() + box = widgets.Box([html, slider]) + children_state = box.get_state()["children"] + assert children_state == [ + widgets.widget._widget_to_json(html, None), + widgets.widget._widget_to_json(slider, None), + ] - def test_construction_style(self): - box = widgets.Box(box_style='warning') - assert box.get_state()['box_style'] == 'warning' - def test_construction_invalid_style(self): - with self.assertRaises(TraitError): - widgets.Box(box_style='invalid') +def test_box_construction_style(): + box = widgets.Box(box_style="warning") + assert box.get_state()["box_style"] == "warning" + + +def test_construction_invalid_style(): + with pytest.raises(TraitError): + widgets.Box(box_style="invalid") + + +def test_box_validate_mode(): + slider = widgets.IntSlider() + closed_button = widgets.Button() + closed_button.close() + with pytest.raises(TraitError, match="Invalid or closed items found.*"): + widgets.Box( + children=[closed_button, slider, "Not a widget"] + ) + box = widgets.Box( + children=[closed_button, slider, "Not a widget"], + validate_mode="log_error", + ) + assert len (box.children) == 1, "Invalid items should be dropped." + assert slider in box.children + + box.validate_mode = "raise" + with pytest.raises(TraitError): + box.children += ("Not a widget", closed_button) + diff --git a/python/ipywidgets/ipywidgets/widgets/tests/utils.py b/python/ipywidgets/ipywidgets/widgets/tests/utils.py index 8dbbcb355b..f382742fd4 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/utils.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/utils.py @@ -1,12 +1,14 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. + from ipywidgets import Widget import ipywidgets.widgets.widget # The new comm package is not available in our Python 3.7 CI (older ipykernel version) try: import comm + NEW_COMM_PACKAGE = True except ImportError: NEW_COMM_PACKAGE = False @@ -14,9 +16,10 @@ import ipykernel.comm import pytest -class DummyComm(): - comm_id = 'a-b-c-d' - kernel = 'Truthy' + +class DummyComm: + comm_id = "a-b-c-d" + kernel = "Truthy" def __init__(self, *args, **kwargs): super().__init__() @@ -57,6 +60,7 @@ def dummy_get_comm_manager(**kwargs): orig_create_comm = comm.create_comm orig_get_comm_manager = comm.get_comm_manager + def setup_test_comm(): if NEW_COMM_PACKAGE: comm.create_comm = dummy_create_comm @@ -66,11 +70,14 @@ def setup_test_comm(): ipykernel.comm.Comm = DummyComm Widget.comm.klass = DummyComm ipywidgets.widgets.widget.Comm = DummyComm - _widget_attrs['_repr_mimebundle_'] = Widget._repr_mimebundle_ + _widget_attrs["_repr_mimebundle_"] = Widget._repr_mimebundle_ + def raise_not_implemented(*args, **kwargs): raise NotImplementedError() + Widget._repr_mimebundle_ = raise_not_implemented + def teardown_test_comm(): if NEW_COMM_PACKAGE: comm.create_comm = orig_create_comm @@ -87,11 +94,13 @@ def teardown_test_comm(): setattr(Widget, attr, value) _widget_attrs.clear() + @pytest.fixture(autouse=True) def setup(): setup_test_comm() yield teardown_test_comm() + def call_method(method, *args, **kwargs): method(*args, **kwargs) diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index cb05ff2bbb..c95850132b 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -6,21 +6,19 @@ in the Jupyter notebook front-end. """ import os -import sys import typing +import weakref from contextlib import contextmanager from collections.abc import Iterable from IPython import get_ipython from traitlets import ( - Any, HasTraits, Unicode, Dict, Instance, List, Int, Set, Bytes, observe, default, Container, + Any, HasTraits, Unicode, Dict, Instance, List, Int, Set, observe, default, Container, Undefined) from json import loads as jsonloads, dumps as jsondumps from .. import comm from base64 import standard_b64encode -from .utils import deprecation, _get_frame - from .._version import __protocol_version__, __control_protocol_version__, __jupyter_widgets_base_version__ import inspect @@ -41,17 +39,34 @@ def envset(name, default): PROTOCOL_VERSION_MAJOR = __protocol_version__.split('.')[0] CONTROL_PROTOCOL_VERSION_MAJOR = __control_protocol_version__.split('.')[0] JUPYTER_WIDGETS_ECHO = envset('JUPYTER_WIDGETS_ECHO', default=True) -# we keep a strong reference for every widget created, for a discussion on using weak references see: +# for a discussion on using weak references see: # https://github.com/jupyter-widgets/ipywidgets/issues/1345 -_instances : typing.MutableMapping[str, "Widget"] = {} + +def enable_weakreference(): + """Use a WeakValueDictionary to store references to Widget instances. + + A strong reference must be kept to widgets. + """ + if not isinstance(Widget._instances, weakref.WeakValueDictionary): + Widget._instances = weakref.WeakValueDictionary(Widget._instances) + +def disable_weakreference(): + """Use a standard dictionary to store references to Widget instances (default behavior). + + Note: this is the default setting and maintains a strong reference to the + the widget preventing automatic garbage collection. When the widget is closed + it can be garbage collected. + """ + if isinstance(Widget._instances, weakref.WeakValueDictionary): + Widget._instances = dict(Widget._instances) def _widget_to_json(x, obj): - if isinstance(x, dict): - return {k: _widget_to_json(v, obj) for k, v in x.items()} + if isinstance(x, Widget): + return f"IPY_MODEL_{x.model_id}" elif isinstance(x, (list, tuple)): return [_widget_to_json(v, obj) for v in x] - elif isinstance(x, Widget): - return "IPY_MODEL_" + x.model_id + elif isinstance(x, dict): + return {k: _widget_to_json(v, obj) for k, v in x.items()} else: return x @@ -60,8 +75,8 @@ def _json_to_widget(x, obj): return {k: _json_to_widget(v, obj) for k, v in x.items()} elif isinstance(x, (list, tuple)): return [_json_to_widget(v, obj) for v in x] - elif isinstance(x, str) and x.startswith('IPY_MODEL_') and x[10:] in _instances: - return _instances[x[10:]] + elif isinstance(x, str) and x.startswith("IPY_MODEL_") and x[10:] in Widget._instances: + return Widget._instances[x[10:]] else: return x @@ -215,18 +230,6 @@ def register_callback(self, callback, remove=False): elif not remove and callback not in self.callbacks: self.callbacks.append(callback) -def _show_traceback(method): - """decorator for showing tracebacks""" - def m(self, *args, **kwargs): - try: - return(method(self, *args, **kwargs)) - except Exception as e: - ip = get_ipython() - if ip is None: - self.log.warning("Exception in widget method %s: %s", method, e, exc_info=True) - else: - ip.showtraceback() - return m class WidgetRegistry: @@ -305,49 +308,11 @@ class Widget(LoggingHasTraits): _widget_construction_callback = None _control_comm = None - @_staticproperty - def widgets(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget.widgets is deprecated.") - return _instances - - @_staticproperty - def _active_widgets(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget._active_widgets is deprecated.") - return _instances - - @_staticproperty - def _widget_types(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget._widget_types is deprecated.") - return _registry - - @_staticproperty - def widget_types(): - # Because this is a static attribute, it will be accessed when initializing this class. In that case, since a user - # did not explicitly try to use this attribute, we do not want to throw a deprecation warning. - # So we check if the thing calling this static property is one of the known initialization functions in traitlets. - frame = _get_frame(2) - if not (frame.f_code.co_filename == TRAITLETS_FILE and (frame.f_code.co_name in ('getmembers', 'setup_instance', 'setup_class'))): - deprecation("Widget.widget_types is deprecated.") - return _registry + _instances: typing.ClassVar[typing.MutableMapping[str, "Widget"]] = {} @classmethod def close_all(cls): - for widget in list(_instances.values()): + for widget in list(Widget._instances.values()): widget.close() @staticmethod @@ -389,7 +354,7 @@ def _handle_control_comm_msg(cls, msg): if method == 'request_states': # Send back the full widgets state cls.get_manager_state() - widgets = _instances.values() + widgets = cls._instances.values() full_state = {} drop_defaults = False for widget in widgets: @@ -430,8 +395,8 @@ def handle_comm_opened(comm, msg): _put_buffers(state, data['buffer_paths'], msg['buffers']) widget.set_state(state) - @staticmethod - def get_manager_state(drop_defaults=False, widgets=None): + @classmethod + def get_manager_state(cls, drop_defaults=False, widgets=None): """Returns the full state for a widget manager for embedding :param drop_defaults: when True, it will not include default value @@ -440,7 +405,7 @@ def get_manager_state(drop_defaults=False, widgets=None): """ state = {} if widgets is None: - widgets = _instances.values() + widgets = cls._instances.values() for widget in widgets: state[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) return {'version_major': 2, 'version_minor': 0, 'state': state} @@ -461,7 +426,7 @@ def _get_embed_state(self, drop_defaults=False): return state def get_view_spec(self): - return dict(version_major=2, version_minor=0, model_id=self._model_id) + return {"version_major": 2, "version_minor": 0, "model_id": self.model_id} #------------------------------------------------------------------------- # Traits @@ -485,6 +450,8 @@ def get_view_spec(self): keys = List(help="The traits which are synced.") + _model_id: None | str = None + @default('keys') def _default_keys(self): return [name for name in self.traits(sync=True)] @@ -499,11 +466,12 @@ def _default_keys(self): #------------------------------------------------------------------------- def __init__(self, **kwargs): """Public constructor""" - self._model_id = kwargs.pop('model_id', None) + if 'model_id' in kwargs: + self.comm = self._create_comm(kwargs.pop('model_id')) super().__init__(**kwargs) + self.open() Widget._call_widget_constructed(self) - self.open() def __copy__(self): raise NotImplementedError("Widgets cannot be copied; custom implementation required") @@ -519,53 +487,76 @@ def __del__(self): # Properties #------------------------------------------------------------------------- - def open(self): - """Open a comm to the frontend if one isn't already open.""" - if self.comm is None: - state, buffer_paths, buffers = _remove_buffers(self.get_state()) - args = dict(target_name='jupyter.widget', - data={'state': state, 'buffer_paths': buffer_paths}, - buffers=buffers, - metadata={'version': __protocol_version__} - ) - if self._model_id is not None: - args['comm_id'] = self._model_id + @default('comm') + def _default_comm(self): + return self._create_comm() - self.comm = comm.create_comm(**args) + def open(self): + """Open a comm to the frontend if one isn't already open.""" + assert self.model_id + + + def _create_comm(self, comm_id=None): + """Open a new comm to the frontend.""" + state, buffer_paths, buffers = _remove_buffers(self.get_state()) + self.comm = comm_ = comm.create_comm( + target_name="jupyter.widget", + data={"state": state, "buffer_paths": buffer_paths}, + buffers=buffers, + metadata={"version": __protocol_version__}, + comm_id=comm_id, + ) + return comm_ + @observe('comm') def _comm_changed(self, change): """Called when the comm is changed.""" - if change['new'] is None: - return - self._model_id = self.model_id - - self.comm.on_msg(self._handle_msg) - _instances[self.model_id] = self + if change['old']: + change['old'].on_msg(None) + change['old'].close() + self._instances.pop(change['old'].comm_id, None) + if change['new']: + self._instances[change["new"].comm_id] = self + self._model_id = change["new"].comm_id + + # prevent memory leaks by using a weak reference to self. + ref = weakref.ref(self) + def _handle_msg(msg): + self_ = ref() + if self_ is not None: + try: + self_._handle_msg(msg) + except Exception as e: + self_._show_traceback(self_._handle_msg, e) + + change['new'].on_msg(_handle_msg) @property def model_id(self): """Gets the model id of this widget. If a Comm doesn't exist yet, a Comm will be created automagically.""" - return self.comm.comm_id + if not self._repr_mimebundle_: + # a closed widget will not be found at the frontend so raise an error here. + msg = f"Widget is closed: {self!r}" + raise RuntimeError(msg) + return getattr(self.comm, "comm_id", None) + #------------------------------------------------------------------------- # Methods #------------------------------------------------------------------------- def close(self): - """Close method. + """Permanently close the widget. Closes the underlying comm. When the comm is closed, all of the widget views are automatically removed from the front-end.""" - if self.comm is not None: - _instances.pop(self.model_id, None) - self.comm.close() - self.comm = None - self._repr_mimebundle_ = None + self._repr_mimebundle_ = None + self.comm = None def send_state(self, key=None): """Sends the widget state, or a piece of it, to the front-end, if it exists. @@ -693,15 +684,18 @@ def notify_change(self, change): # Send the state to the frontend before the user-registered callbacks # are called. name = change['name'] - if self.comm is not None and getattr(self.comm, 'kernel', True) is not None: + comm = self._trait_values.get('comm') + if comm and getattr(comm, 'kernel', None): # Make sure this isn't information that the front-end just sent us. - if name in self.keys and self._should_send_property(name, getattr(self, name)): + if name in self.keys and self._should_send_property(name, change['new']): # Send new state to front-end self.send_state(key=name) super().notify_change(change) def __repr__(self): - return self._gen_repr_from_keys(self._repr_keys()) + if not self._repr_mimebundle_: + return f'' + return self._gen_repr_from_keys(self._repr_keys()) #------------------------------------------------------------------------- # Support methods @@ -759,7 +753,6 @@ def _should_send_property(self, key, value): return True # Event handlers - @_show_traceback def _handle_msg(self, msg): """Called when a msg is received from the front-end""" data = msg['content']['data'] @@ -785,6 +778,14 @@ def _handle_msg(self, msg): else: self.log.error('Unknown front-end to back-end widget msg with method "%s"' % method) + def _show_traceback(self, method, e:Exception): + ip = get_ipython() + if ip is None: + self.log.warning("Exception in widget method %s: %s", method, e, exc_info=True) + else: + ip.showtraceback() + + def _handle_custom_msg(self, content, buffers): """Called when a custom msg is received.""" self._msg_callbacks(self, content, buffers) @@ -812,17 +813,18 @@ def _repr_mimebundle_(self, **kwargs): # http://tools.ietf.org/html/rfc6838 # and the currently registered mimetypes at # http://www.iana.org/assignments/media-types/media-types.xhtml. - data['application/vnd.jupyter.widget-view+json'] = { - 'version_major': 2, - 'version_minor': 0, - 'model_id': self._model_id + data["application/vnd.jupyter.widget-view+json"] = { + "version_major": 2, + "version_minor": 0, + "model_id": self.model_id, } return data def _send(self, msg, buffers=None): """Sends a message to the model in the front-end.""" - if self.comm is not None and (self.comm.kernel is not None if hasattr(self.comm, "kernel") else True): - self.comm.send(data=msg, buffers=buffers) + comm = self.comm + if comm is not None and getattr(comm, "kernel", True): + comm.send(data=msg, buffers=buffers) def _repr_keys(self): traits = self.traits() diff --git a/python/ipywidgets/ipywidgets/widgets/widget_box.py b/python/ipywidgets/ipywidgets/widgets/widget_box.py index 740e54cb1a..50804bb28c 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/widget_box.py @@ -1,3 +1,4 @@ + # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. @@ -7,14 +8,16 @@ group other widgets together and control their relative layouts. """ +from __future__ import annotations + +import typing + +from traitlets import CaselessStrEnum, TraitError, TraitType, Unicode -from .widget import register, widget_serialization, Widget +from .docutils import doc_subst from .domwidget import DOMWidget +from .widget import Widget, register, widget_serialization from .widget_core import CoreWidget -from .docutils import doc_subst -from .trait_types import TypedTuple -from traitlets import Unicode, CaselessStrEnum, Instance - _doc_snippets = {} _doc_snippets['box_params'] = """ @@ -25,8 +28,35 @@ one of 'success', 'info', 'warning' or 'danger', or ''. Applies a predefined style to the box. Defaults to '', which applies no pre-defined style. + + validate_mode: str + one of 'raise', 'warning', error'. + How invalid children will be treated. + 'raise' will raise a trait error. + 'warning' and 'error' will log an error using box.log dropping + the invalid items from children. """ +class Children(TraitType['tuple[Widget,...]', typing.Iterable[Widget]]): + default_value = () + + def validate(self, obj: Box, value: typing.Iterable[Widget]): + valid, invalid = [], [] + for v in value: + if isinstance(v, Widget) and v._repr_mimebundle_: + valid.append(v) + else: + invalid.append(v) + if invalid: + msg = f'Invalid or closed items found: {invalid}' + if obj.validate_mode == 'log_warning': + obj.log.warning(msg) + elif obj.validate_mode == 'log_error': + obj.log.error(msg) + else: + raise TraitError(msg) + return tuple(valid) + @register @doc_subst(_doc_snippets) @@ -47,20 +77,23 @@ class Box(DOMWidget, CoreWidget): >>> widgets.Box([title_widget, slider]) """ _model_name = Unicode('BoxModel').tag(sync=True) - _view_name = Unicode('BoxView').tag(sync=True) + _view_name = Unicode("BoxView").tag(sync=True) + validate_mode = CaselessStrEnum(['raise', 'log_warning', 'log_error'], 'raise') # Child widgets in the container. # Using a tuple here to force reassignment to update the list. # When a proper notifying-list trait exists, use that instead. - children = TypedTuple(trait=Instance(Widget), help="List of widget children").tag( - sync=True, **widget_serialization) + children = Children(help='List of widget children').tag( + sync=True, **widget_serialization + ) box_style = CaselessStrEnum( values=['success', 'info', 'warning', 'danger', ''], default_value='', help="""Use a predefined styling for the box.""").tag(sync=True) - + def __init__(self, children=(), **kwargs): - kwargs['children'] = children + if children: + kwargs['children'] = children super().__init__(**kwargs) @register diff --git a/python/ipywidgets/setup.cfg b/python/ipywidgets/setup.cfg index 2bbf868a3a..889d8301d7 100644 --- a/python/ipywidgets/setup.cfg +++ b/python/ipywidgets/setup.cfg @@ -18,16 +18,16 @@ classifiers = License :: OSI Approved :: BSD License Programming Language :: Python Programming Language :: Python :: 3 - Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 Programming Language :: Python :: 3.13 + Programming Language :: Python :: 3.14 Programming Language :: Python :: 3 :: Only Framework :: Jupyter [options] -python_requires = >=3.7 +python_requires = >=3.10 zip_safe = False # include_package_data = True @@ -47,6 +47,7 @@ test = pytest>=3.6.0 pytest-cov pytz + pytest-mock [options.package_data] ipywidgets = diff --git a/python/jupyterlab_widgets/package.json b/python/jupyterlab_widgets/package.json index 768dd8c4a4..27d7a13bf5 100644 --- a/python/jupyterlab_widgets/package.json +++ b/python/jupyterlab_widgets/package.json @@ -92,5 +92,16 @@ "extension": true, "outputDir": "labextension", "schemaDir": "./schema" + }, + "optionalDependencies": { + "react": "^18.3.1" + }, + "peerDependencies": { + "react": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } } diff --git a/yarn.lock b/yarn.lock index 574e3ca551..27310989e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1055,10 +1055,19 @@ __metadata: jquery: ^3.1.1 npm-run-all: ^4.1.5 prettier: ^2.3.2 + react: ^18.3.1 rimraf: ^3.0.2 semver: ^7.3.5 source-map-loader: ^4.0.1 typescript: ~4.9.4 + peerDependencies: + react: "*" + dependenciesMeta: + react: + optional: true + peerDependenciesMeta: + react: + optional: true languageName: unknown linkType: soft @@ -13846,7 +13855,7 @@ __metadata: languageName: node linkType: hard -"react@npm:>=17.0.0 <19.0.0, react@npm:^18.2.0": +"react@npm:>=17.0.0 <19.0.0, react@npm:^18.2.0, react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: From f6313f622dfb78e87ffeb72c1537c4e058fa6fd6 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sat, 18 Oct 2025 12:42:42 +1100 Subject: [PATCH 43/48] Change mininum version of widgetsnbextension. --- docs/source/dev_release.md | 2 +- python/widgetsnbextension/setup.cfg | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/dev_release.md b/docs/source/dev_release.md index 7a9be90ee6..c69d357f62 100644 --- a/docs/source/dev_release.md +++ b/docs/source/dev_release.md @@ -9,7 +9,7 @@ conda deactivate conda remove --all -y -n releasewidgets rm -rf ipywidgets -conda create -c conda-forge --override-channels -y -n releasewidgets notebook nodejs "yarn=3.*" twine jupyterlab=4 jupyter-packaging python-build jq "python==3.9.*" +conda create -c conda-forge --override-channels -y -n releasewidgets notebook nodejs "yarn=3.*" twine jupyterlab=4 jupyter-packaging python-build jq "python==3.10.*" conda activate releasewidgets git clone git@github.com:jupyter-widgets/ipywidgets.git diff --git a/python/widgetsnbextension/setup.cfg b/python/widgetsnbextension/setup.cfg index cd28e770ff..2cf68a9a74 100644 --- a/python/widgetsnbextension/setup.cfg +++ b/python/widgetsnbextension/setup.cfg @@ -18,16 +18,16 @@ classifiers = License :: OSI Approved :: BSD License Programming Language :: Python Programming Language :: Python :: 3 - Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 Programming Language :: Python :: 3.13 + Programming Language :: Python :: 3.14 Programming Language :: Python :: 3 :: Only Framework :: Jupyter [options] -python_requires = >=3.7 +python_requires = >=3.10 zip_safe=False include_package_data = True packages = find: From 9647eeab96d3ca771aac72a9e62ffbb5854021b8 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sat, 18 Oct 2025 12:44:39 +1100 Subject: [PATCH 44/48] Minimum python version for jupyterlab_widgets of 3.10. --- python/jupyterlab_widgets/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/jupyterlab_widgets/pyproject.toml b/python/jupyterlab_widgets/pyproject.toml index d8bda2e1ff..42c1acbf93 100644 --- a/python/jupyterlab_widgets/pyproject.toml +++ b/python/jupyterlab_widgets/pyproject.toml @@ -2,7 +2,7 @@ name = "jupyterlab_widgets" description = "Jupyter interactive widgets for JupyterLab" readme = { file = "README.md", content-type = "text/markdown" } -requires-python = ">=3.7" +requires-python = ">=3.10" license = { file = "LICENSE" } authors = [ { name = "Jupyter Development Team", email = "jupyter@googlegroups.com" } @@ -18,11 +18,11 @@ classifiers = [ "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: 3 :: Only", "Framework :: Jupyter", "Framework :: Jupyter :: JupyterLab", From 7bd0bbdb91b226199c2991d1d92cf9ba2aec24bf Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sat, 18 Oct 2025 14:40:51 +1100 Subject: [PATCH 45/48] Merge remote-tracking branch 'origin/OutputWidget-enhancements' into combine_v1 --- packages/controls/css/widgets-base.css | 10 +++- python/jupyterlab_widgets/package.json | 1 + python/jupyterlab_widgets/src/output.ts | 79 +++++++++++++++---------- yarn.lock | 1 + 4 files changed, 59 insertions(+), 32 deletions(-) diff --git a/packages/controls/css/widgets-base.css b/packages/controls/css/widgets-base.css index 6a16589ddc..52815a2fe8 100644 --- a/packages/controls/css/widgets-base.css +++ b/packages/controls/css/widgets-base.css @@ -125,6 +125,14 @@ flex-direction: column; } +.jupyter-widget-output { + box-sizing: border-box; + display: flex; + margin: 0; + overflow: auto; + flex-direction: column; +} + /* General Tags Styling */ .jupyter-widget-tagsinput { @@ -907,7 +915,7 @@ flex: 1 1 var(--jp-widgets-inline-width-short); outline: none !important; overflow: auto; - height: inherit; + height: 100%; /* Because Firefox defines the baseline of a select as the bottom of the control, we align the entire control to the top and add padding to the diff --git a/python/jupyterlab_widgets/package.json b/python/jupyterlab_widgets/package.json index 27d7a13bf5..4c1ffcb5ef 100644 --- a/python/jupyterlab_widgets/package.json +++ b/python/jupyterlab_widgets/package.json @@ -66,6 +66,7 @@ "@jupyterlab/translation": "^3.0.0 || ^4.0.0", "@lumino/coreutils": "^1.11.1 || ^2.1", "@lumino/disposable": "^1.10.1 || ^2.1", + "@lumino/messaging": "^2.0.3", "@lumino/properties": "^2.0.1", "@lumino/signaling": "^1.10.1 || ^2.1", "@lumino/widgets": "^1.30.0 || ^2.1", diff --git a/python/jupyterlab_widgets/src/output.ts b/python/jupyterlab_widgets/src/output.ts index a71032defe..d25912918e 100644 --- a/python/jupyterlab_widgets/src/output.ts +++ b/python/jupyterlab_widgets/src/output.ts @@ -3,15 +3,15 @@ import * as outputBase from '@jupyter-widgets/output'; -import { JupyterLuminoPanelWidget } from '@jupyter-widgets/base'; - -import { Panel } from '@lumino/widgets'; - import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; import { KernelWidgetManager } from './manager'; -import { OutputAreaModel, OutputArea } from '@jupyterlab/outputarea'; +import { + OutputArea, + SimplifiedOutputArea, + OutputAreaModel, +} from '@jupyterlab/outputarea'; import * as nbformat from '@jupyterlab/nbformat'; @@ -19,6 +19,8 @@ import { KernelMessage } from '@jupyterlab/services'; import $ from 'jquery'; +import type { Message } from '@lumino/messaging'; + export const OUTPUT_WIDGET_VERSION = outputBase.OUTPUT_WIDGET_VERSION; export class OutputModel extends outputBase.OutputModel { @@ -105,7 +107,15 @@ export class OutputModel extends outputBase.OutputModel { export class OutputView extends outputBase.OutputView { _createElement(tagName: string): HTMLElement { - this.luminoWidget = new JupyterLuminoPanelWidget({ view: this }); + this.luminoWidget = new JupyterOutputArea({ + view: this, + rendermime: OutputModel.rendermime, + contentFactory: OutputArea.defaultContentFactory, + model: this.model.outputs, + promptOverlay: false, + }); + this.luminoWidget.addClass('jupyter-widgets'); + this.luminoWidget.addClass('jupyter-widget-output'); return this.luminoWidget.node; } @@ -119,34 +129,41 @@ export class OutputView extends outputBase.OutputView { this.$el = $(this.luminoWidget.node); } - /** - * Called when view is rendered. - */ - render(): void { - super.render(); - this._outputView = new OutputArea({ - rendermime: OutputModel.rendermime, - contentFactory: OutputArea.defaultContentFactory, - model: this.model.outputs, - }); - - // TODO: why is this a readonly property now? - // this._outputView.model = this.model.outputs; - // TODO: why is this on the model now? - // this._outputView.trusted = true; - this.luminoWidget.insertWidget(0, this._outputView); + model: OutputModel; + luminoWidget: JupyterOutputArea; +} - this.luminoWidget.addClass('jupyter-widgets'); - this.luminoWidget.addClass('widget-output'); - this.update(); // Set defaults. +class JupyterOutputArea extends SimplifiedOutputArea { + constructor(options: JupyterOutputArea.IOptions & OutputArea.IOptions) { + const view = options.view; + delete (options as any).view; + super(options); + this._view = view; } - remove(): any { - this._outputView.dispose(); - return super.remove(); + processMessage(msg: Message): void { + super.processMessage(msg); + this._view?.processLuminoMessage(msg); + } + /** + * Dispose the widget. + * + * This causes the view to be destroyed as well with 'remove' + */ + dispose(): void { + if (this.isDisposed) { + return; + } + super.dispose(); + this._view?.remove(); + this._view = null!; } - model: OutputModel; - _outputView: OutputArea; - luminoWidget: Panel; + private _view: OutputView; +} + +export namespace JupyterOutputArea { + export interface IOptions { + view: OutputView; + } } diff --git a/yarn.lock b/yarn.lock index 27310989e2..57b61654ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1041,6 +1041,7 @@ __metadata: "@jupyterlab/translation": ^3.0.0 || ^4.0.0 "@lumino/coreutils": ^1.11.1 || ^2.1 "@lumino/disposable": ^1.10.1 || ^2.1 + "@lumino/messaging": ^2.0.3 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^1.10.1 || ^2.1 "@lumino/widgets": ^1.30.0 || ^2.1 From adfee9c3ec090e87ede5a1ed42e833f85f6f8e76 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sun, 19 Oct 2025 17:17:31 +1100 Subject: [PATCH 46/48] Change from using Widget._instances class variable to the global _widget_instances to fix a Segmentation Fault that was causing test failure. Also added the static method Widget.all_widgets that returns a copy of the current widgets. --- python/ipywidgets/ipywidgets/embed.py | 4 +- .../ipywidgets/ipywidgets/tests/test_embed.py | 3 +- .../ipywidgets/widgets/tests/test_widget.py | 43 +++++++------- .../widgets/tests/test_widget_box.py | 27 +++++++++ .../ipywidgets/ipywidgets/widgets/widget.py | 56 ++++++++++++++----- 5 files changed, 95 insertions(+), 38 deletions(-) diff --git a/python/ipywidgets/ipywidgets/embed.py b/python/ipywidgets/ipywidgets/embed.py index e9bffbfd65..bd2e8366bb 100644 --- a/python/ipywidgets/ipywidgets/embed.py +++ b/python/ipywidgets/ipywidgets/embed.py @@ -129,7 +129,7 @@ def _get_recursive_state(widget, store=None, drop_defaults=False): def add_resolved_links(store, drop_defaults): """Adds the state of any link models between two models in store""" - for widget_id, widget in Widget._instances.items(): # go over all widgets + for widget_id, widget in Widget.all_widgets().items(): # go over all widgets if isinstance(widget, Link) and widget_id not in store: if widget.source[0].model_id in store and widget.target[0].model_id in store: store[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) @@ -207,7 +207,7 @@ def embed_data(views, drop_defaults=True, state=None): view_specs: a list of widget view specs """ if views is None: - views = [w for w in Widget._instances.values() if isinstance(w, DOMWidget)] + views = [w for w in Widget.all_widgets().values() if isinstance(w, DOMWidget)] else: try: views[0] diff --git a/python/ipywidgets/ipywidgets/tests/test_embed.py b/python/ipywidgets/ipywidgets/tests/test_embed.py index c5e6b97aa1..0f337a7d70 100644 --- a/python/ipywidgets/ipywidgets/tests/test_embed.py +++ b/python/ipywidgets/ipywidgets/tests/test_embed.py @@ -12,7 +12,6 @@ from ..widgets import IntSlider, IntText, Text, Widget, jslink, HBox, widget_serialization from ..embed import embed_data, embed_snippet, embed_minimal_html, dependency_state - class CaseWidget(Widget): """Widget to test dependency traversal""" @@ -29,7 +28,7 @@ class CaseWidget(Widget): class TestEmbed: def teardown(self): - for w in tuple(Widget._instances.values()): + for w in tuple(Widget.all_widgets().values()): w.close() def test_embed_data_simple(self): diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py index 6058f6e435..d8a062a14e 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py @@ -60,12 +60,12 @@ def test_close_all(): # create a couple of widgets widgets = [Button() for i in range(10)] - assert len(Widget._instances) > 0, "expect active widgets" - assert Widget._instances[widgets[0].model_id] is widgets[0] + assert len(Widget.all_widgets()) > 0, "expect active widgets" + assert Widget.all_widgets()[widgets[0].model_id] is widgets[0] # close all the widgets Widget.close_all() - assert len(Widget._instances) == 0, "active widgets should be cleared" + assert len(Widget.all_widgets()) == 0, "active widgets should be cleared" def test_widget_copy(): @@ -79,12 +79,12 @@ def test_widget_copy(): def test_widget_open(): button = Button() model_id = button.model_id - assert model_id in Widget._instances + assert model_id in Widget.all_widgets() spec = button.get_view_spec() assert list(spec) == ["version_major", "version_minor", "model_id"] assert spec["model_id"] button.close() - assert model_id not in Widget._instances + assert model_id not in Widget.all_widgets() with pytest.raises(RuntimeError, match="Widget is closed"): button.open() with pytest.raises(RuntimeError, match="Widget is closed"): @@ -159,16 +159,18 @@ def test_widget_open(): "Widget", ], ) -def test_weakreference(class_name): +@pytest.mark.parametrize("enable_weakref", [True, False]) +def test_weakreference(class_name, enable_weakref): # Ensure the base instance of all widgets can be deleted / garbage collected. - ipw.enable_weakreference() + if enable_weakref: + ipw.enable_weakreference() + cls = getattr(ipw, class_name) + if class_name in ["SelectionRangeSlider", "SelectionSlider"]: + kwgs = {"options": [1, 2, 4]} + else: + kwgs = {} try: - cls = getattr(ipw, class_name) - if class_name in ["SelectionRangeSlider", "SelectionSlider"]: - kwgs = {"options": [1, 2, 4]} - else: - kwgs = {} - w: Widget = cls(**kwgs) + w = cls(**kwgs) deleted = False def on_delete(): nonlocal deleted @@ -176,11 +178,14 @@ def on_delete(): weakref.finalize(w, on_delete) # w should be the only strong ref to the widget. # calling `del` should invoke its immediate deletion calling the `__del__` method. + if not enable_weakref: + w.close() del w gc.collect() assert deleted finally: - ipw.disable_weakreference() + if enable_weakref: + ipw.disable_weakreference() @pytest.mark.parametrize("weakref_enabled", [True, False]) @@ -201,7 +206,7 @@ def my_click(self, b): b = TestButton(description="button") weakref.finalize(b, on_delete) b_ref = weakref.ref(b) - assert b in Widget._instances.values() + assert b in Widget.all_widgets().values() b.on_click(b.my_click) b.on_click(lambda x: setattr(x, "clicked", True)) @@ -211,11 +216,11 @@ def my_click(self, b): if weakref_enabled: ipw.enable_weakreference() - assert b in Widget._instances.values(), "Instances not transferred" + assert b in Widget.all_widgets().values(), "Instances not transferred" ipw.disable_weakreference() - assert b in Widget._instances.values(), "Instances not transferred" + assert b in Widget.all_widgets().values(), "Instances not transferred" ipw.enable_weakreference() - assert b in Widget._instances.values(), "Instances not transferred" + assert b in Widget.all_widgets().values(), "Instances not transferred" b.click() assert click_count == 2 @@ -227,7 +232,7 @@ def my_click(self, b): assert deleted else: assert not deleted - assert b_ref() in Widget._instances.values() + assert b_ref() in Widget.all_widgets().values() b_ref().close() gc.collect() assert deleted, "Closing should remove the last strong reference." diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py index a24bad2f84..cff576d26f 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py @@ -55,3 +55,30 @@ def test_box_validate_mode(): with pytest.raises(TraitError): box.children += ("Not a widget", closed_button) + +def test_box_gc(): + widgets.enable_weakreference() + # Test Box gc collected and children lifecycle managed. + try: + deleted = False + + class TestButton(widgets.Button): + def my_click(self, b): + pass + + button = TestButton(description="button") + button.on_click(button.my_click) + + b = widgets.VBox(children=[button]) + + def on_delete(): + nonlocal deleted + deleted = True + + weakref.finalize(b, on_delete) + del b + gc.collect() + assert deleted + finally: + pass + widgets.disable_weakreference() diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index c95850132b..e389a6e6d3 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -5,8 +5,10 @@ """Base Widget class. Allows user to create widgets in the back-end that render in the Jupyter notebook front-end. """ +from typing import Any + + import os -import typing import weakref from contextlib import contextmanager from collections.abc import Iterable @@ -42,13 +44,19 @@ def envset(name, default): # for a discussion on using weak references see: # https://github.com/jupyter-widgets/ipywidgets/issues/1345 +_widget_instances = {} + + def enable_weakreference(): """Use a WeakValueDictionary to store references to Widget instances. A strong reference must be kept to widgets. """ - if not isinstance(Widget._instances, weakref.WeakValueDictionary): - Widget._instances = weakref.WeakValueDictionary(Widget._instances) + global _widget_instances + if not isinstance(_widget_instances, weakref.WeakValueDictionary): + _widget_instances = weakref.WeakValueDictionary(_widget_instances) + # Widget.__dict__["_instances"] = weakref.WeakValueDictionary() + def disable_weakreference(): """Use a standard dictionary to store references to Widget instances (default behavior). @@ -57,10 +65,19 @@ def disable_weakreference(): the widget preventing automatic garbage collection. When the widget is closed it can be garbage collected. """ - if isinstance(Widget._instances, weakref.WeakValueDictionary): - Widget._instances = dict(Widget._instances) - -def _widget_to_json(x, obj): + global _widget_instances + if isinstance(_widget_instances, weakref.WeakValueDictionary): + _widget_instances = dict(_widget_instances) + + +def _widget_to_json( + x, obj +) -> ( + str + | list[str | list[Any] | dict[Any, str | list[Any] | dict[Any, Any] | Any] | Any] + | dict[Any, str | list[Any] | dict[Any, Any] | Any] + | Any +): if isinstance(x, Widget): return f"IPY_MODEL_{x.model_id}" elif isinstance(x, (list, tuple)): @@ -75,8 +92,11 @@ def _json_to_widget(x, obj): return {k: _json_to_widget(v, obj) for k, v in x.items()} elif isinstance(x, (list, tuple)): return [_json_to_widget(v, obj) for v in x] - elif isinstance(x, str) and x.startswith("IPY_MODEL_") and x[10:] in Widget._instances: - return Widget._instances[x[10:]] + elif isinstance(x, str) and x.startswith("IPY_MODEL_"): + try: + return _widget_instances[x[10:]] + except (KeyError, IndexError): + pass else: return x @@ -308,13 +328,18 @@ class Widget(LoggingHasTraits): _widget_construction_callback = None _control_comm = None - _instances: typing.ClassVar[typing.MutableMapping[str, "Widget"]] = {} @classmethod def close_all(cls): - for widget in list(Widget._instances.values()): + while _widget_instances: + _, widget = _widget_instances.popitem() widget.close() + @staticmethod + def all_widgets() -> dict[str, "Widget"]: + "Returns a dict mapping `comm_id` to Widget of all Widget instances." + return dict(_widget_instances) + @staticmethod def on_widget_constructed(callback): """Registers a callback to be called when a widget is constructed. @@ -354,7 +379,7 @@ def _handle_control_comm_msg(cls, msg): if method == 'request_states': # Send back the full widgets state cls.get_manager_state() - widgets = cls._instances.values() + widgets = _widget_instances.values() full_state = {} drop_defaults = False for widget in widgets: @@ -405,7 +430,7 @@ def get_manager_state(cls, drop_defaults=False, widgets=None): """ state = {} if widgets is None: - widgets = cls._instances.values() + widgets = _widget_instances.values() for widget in widgets: state[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) return {'version_major': 2, 'version_minor': 0, 'state': state} @@ -516,9 +541,10 @@ def _comm_changed(self, change): if change['old']: change['old'].on_msg(None) change['old'].close() - self._instances.pop(change['old'].comm_id, None) + if _widget_instances: # This check is needed to avoid errors on cleanup + _widget_instances.pop(change["old"].comm_id, None) if change['new']: - self._instances[change["new"].comm_id] = self + _widget_instances[change["new"].comm_id] = self self._model_id = change["new"].comm_id # prevent memory leaks by using a weak reference to self. From 3541511b0a35ea433d47342935b717456a955d50 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Sun, 19 Oct 2025 17:37:54 +1100 Subject: [PATCH 47/48] Change from using Widget._instances class variable to the global _widget_instances to fix a Segmentation Fault that was causing test failure. Also added the static method Widget.all_widgets that returns a copy of the current widgets. --- python/ipywidgets/ipywidgets/embed.py | 4 +- .../ipywidgets/ipywidgets/tests/test_embed.py | 2 +- .../ipywidgets/widgets/tests/test_widget.py | 43 +++++++------- .../widgets/tests/test_widget_box.py | 27 +++++++++ .../ipywidgets/ipywidgets/widgets/widget.py | 56 ++++++++++++------- 5 files changed, 91 insertions(+), 41 deletions(-) diff --git a/python/ipywidgets/ipywidgets/embed.py b/python/ipywidgets/ipywidgets/embed.py index e9bffbfd65..bd2e8366bb 100644 --- a/python/ipywidgets/ipywidgets/embed.py +++ b/python/ipywidgets/ipywidgets/embed.py @@ -129,7 +129,7 @@ def _get_recursive_state(widget, store=None, drop_defaults=False): def add_resolved_links(store, drop_defaults): """Adds the state of any link models between two models in store""" - for widget_id, widget in Widget._instances.items(): # go over all widgets + for widget_id, widget in Widget.all_widgets().items(): # go over all widgets if isinstance(widget, Link) and widget_id not in store: if widget.source[0].model_id in store and widget.target[0].model_id in store: store[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) @@ -207,7 +207,7 @@ def embed_data(views, drop_defaults=True, state=None): view_specs: a list of widget view specs """ if views is None: - views = [w for w in Widget._instances.values() if isinstance(w, DOMWidget)] + views = [w for w in Widget.all_widgets().values() if isinstance(w, DOMWidget)] else: try: views[0] diff --git a/python/ipywidgets/ipywidgets/tests/test_embed.py b/python/ipywidgets/ipywidgets/tests/test_embed.py index c5e6b97aa1..c1d1f91b6f 100644 --- a/python/ipywidgets/ipywidgets/tests/test_embed.py +++ b/python/ipywidgets/ipywidgets/tests/test_embed.py @@ -29,7 +29,7 @@ class CaseWidget(Widget): class TestEmbed: def teardown(self): - for w in tuple(Widget._instances.values()): + for w in tuple(Widget.all_widgets().values()): w.close() def test_embed_data_simple(self): diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py index 6058f6e435..d8a062a14e 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget.py @@ -60,12 +60,12 @@ def test_close_all(): # create a couple of widgets widgets = [Button() for i in range(10)] - assert len(Widget._instances) > 0, "expect active widgets" - assert Widget._instances[widgets[0].model_id] is widgets[0] + assert len(Widget.all_widgets()) > 0, "expect active widgets" + assert Widget.all_widgets()[widgets[0].model_id] is widgets[0] # close all the widgets Widget.close_all() - assert len(Widget._instances) == 0, "active widgets should be cleared" + assert len(Widget.all_widgets()) == 0, "active widgets should be cleared" def test_widget_copy(): @@ -79,12 +79,12 @@ def test_widget_copy(): def test_widget_open(): button = Button() model_id = button.model_id - assert model_id in Widget._instances + assert model_id in Widget.all_widgets() spec = button.get_view_spec() assert list(spec) == ["version_major", "version_minor", "model_id"] assert spec["model_id"] button.close() - assert model_id not in Widget._instances + assert model_id not in Widget.all_widgets() with pytest.raises(RuntimeError, match="Widget is closed"): button.open() with pytest.raises(RuntimeError, match="Widget is closed"): @@ -159,16 +159,18 @@ def test_widget_open(): "Widget", ], ) -def test_weakreference(class_name): +@pytest.mark.parametrize("enable_weakref", [True, False]) +def test_weakreference(class_name, enable_weakref): # Ensure the base instance of all widgets can be deleted / garbage collected. - ipw.enable_weakreference() + if enable_weakref: + ipw.enable_weakreference() + cls = getattr(ipw, class_name) + if class_name in ["SelectionRangeSlider", "SelectionSlider"]: + kwgs = {"options": [1, 2, 4]} + else: + kwgs = {} try: - cls = getattr(ipw, class_name) - if class_name in ["SelectionRangeSlider", "SelectionSlider"]: - kwgs = {"options": [1, 2, 4]} - else: - kwgs = {} - w: Widget = cls(**kwgs) + w = cls(**kwgs) deleted = False def on_delete(): nonlocal deleted @@ -176,11 +178,14 @@ def on_delete(): weakref.finalize(w, on_delete) # w should be the only strong ref to the widget. # calling `del` should invoke its immediate deletion calling the `__del__` method. + if not enable_weakref: + w.close() del w gc.collect() assert deleted finally: - ipw.disable_weakreference() + if enable_weakref: + ipw.disable_weakreference() @pytest.mark.parametrize("weakref_enabled", [True, False]) @@ -201,7 +206,7 @@ def my_click(self, b): b = TestButton(description="button") weakref.finalize(b, on_delete) b_ref = weakref.ref(b) - assert b in Widget._instances.values() + assert b in Widget.all_widgets().values() b.on_click(b.my_click) b.on_click(lambda x: setattr(x, "clicked", True)) @@ -211,11 +216,11 @@ def my_click(self, b): if weakref_enabled: ipw.enable_weakreference() - assert b in Widget._instances.values(), "Instances not transferred" + assert b in Widget.all_widgets().values(), "Instances not transferred" ipw.disable_weakreference() - assert b in Widget._instances.values(), "Instances not transferred" + assert b in Widget.all_widgets().values(), "Instances not transferred" ipw.enable_weakreference() - assert b in Widget._instances.values(), "Instances not transferred" + assert b in Widget.all_widgets().values(), "Instances not transferred" b.click() assert click_count == 2 @@ -227,7 +232,7 @@ def my_click(self, b): assert deleted else: assert not deleted - assert b_ref() in Widget._instances.values() + assert b_ref() in Widget.all_widgets().values() b_ref().close() gc.collect() assert deleted, "Closing should remove the last strong reference." diff --git a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py index a24bad2f84..cff576d26f 100644 --- a/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py +++ b/python/ipywidgets/ipywidgets/widgets/tests/test_widget_box.py @@ -55,3 +55,30 @@ def test_box_validate_mode(): with pytest.raises(TraitError): box.children += ("Not a widget", closed_button) + +def test_box_gc(): + widgets.enable_weakreference() + # Test Box gc collected and children lifecycle managed. + try: + deleted = False + + class TestButton(widgets.Button): + def my_click(self, b): + pass + + button = TestButton(description="button") + button.on_click(button.my_click) + + b = widgets.VBox(children=[button]) + + def on_delete(): + nonlocal deleted + deleted = True + + weakref.finalize(b, on_delete) + del b + gc.collect() + assert deleted + finally: + pass + widgets.disable_weakreference() diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index c95850132b..e76553c758 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -6,7 +6,6 @@ in the Jupyter notebook front-end. """ import os -import typing import weakref from contextlib import contextmanager from collections.abc import Iterable @@ -42,23 +41,33 @@ def envset(name, default): # for a discussion on using weak references see: # https://github.com/jupyter-widgets/ipywidgets/issues/1345 +# A global to store all widget instances so that it can be swapped out when +# enabling/disabling weakreferences +_widget_instances = {} + + def enable_weakreference(): - """Use a WeakValueDictionary to store references to Widget instances. + """Configure the module to only maintain a weakreference between the comm_id and widget for all widgets. - A strong reference must be kept to widgets. + With this enabled the user must maintain a strong reference to widgets. The + advantage being that memory leaks prevented in long running programs. """ - if not isinstance(Widget._instances, weakref.WeakValueDictionary): - Widget._instances = weakref.WeakValueDictionary(Widget._instances) + global _widget_instances + if not isinstance(_widget_instances, weakref.WeakValueDictionary): + _widget_instances = weakref.WeakValueDictionary(_widget_instances) + # Widget.__dict__["_instances"] = weakref.WeakValueDictionary() + def disable_weakreference(): - """Use a standard dictionary to store references to Widget instances (default behavior). + """Configure the module to only maintain a strong reference between the comm_id and widget for all widgets. - Note: this is the default setting and maintains a strong reference to the - the widget preventing automatic garbage collection. When the widget is closed - it can be garbage collected. + !!! Note: + This is the default behavior. The method `Widget.close` should be called when it is no longer required. """ - if isinstance(Widget._instances, weakref.WeakValueDictionary): - Widget._instances = dict(Widget._instances) + global _widget_instances + if isinstance(_widget_instances, weakref.WeakValueDictionary): + _widget_instances = dict(_widget_instances) + def _widget_to_json(x, obj): if isinstance(x, Widget): @@ -75,8 +84,11 @@ def _json_to_widget(x, obj): return {k: _json_to_widget(v, obj) for k, v in x.items()} elif isinstance(x, (list, tuple)): return [_json_to_widget(v, obj) for v in x] - elif isinstance(x, str) and x.startswith("IPY_MODEL_") and x[10:] in Widget._instances: - return Widget._instances[x[10:]] + elif isinstance(x, str) and x.startswith("IPY_MODEL_"): + try: + return _widget_instances[x[10:]] + except (KeyError, IndexError): + pass else: return x @@ -308,13 +320,18 @@ class Widget(LoggingHasTraits): _widget_construction_callback = None _control_comm = None - _instances: typing.ClassVar[typing.MutableMapping[str, "Widget"]] = {} @classmethod def close_all(cls): - for widget in list(Widget._instances.values()): + while _widget_instances: + _, widget = _widget_instances.popitem() widget.close() + @staticmethod + def all_widgets() -> dict[str, "Widget"]: + "Returns a dict mapping `comm_id` to Widget of all Widget instances." + return dict(_widget_instances) + @staticmethod def on_widget_constructed(callback): """Registers a callback to be called when a widget is constructed. @@ -354,7 +371,7 @@ def _handle_control_comm_msg(cls, msg): if method == 'request_states': # Send back the full widgets state cls.get_manager_state() - widgets = cls._instances.values() + widgets = _widget_instances.values() full_state = {} drop_defaults = False for widget in widgets: @@ -405,7 +422,7 @@ def get_manager_state(cls, drop_defaults=False, widgets=None): """ state = {} if widgets is None: - widgets = cls._instances.values() + widgets = _widget_instances.values() for widget in widgets: state[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) return {'version_major': 2, 'version_minor': 0, 'state': state} @@ -516,9 +533,10 @@ def _comm_changed(self, change): if change['old']: change['old'].on_msg(None) change['old'].close() - self._instances.pop(change['old'].comm_id, None) + if _widget_instances: # This check is needed to avoid errors on cleanup + _widget_instances.pop(change["old"].comm_id, None) if change['new']: - self._instances[change["new"].comm_id] = self + _widget_instances[change["new"].comm_id] = self self._model_id = change["new"].comm_id # prevent memory leaks by using a weak reference to self. From 1243f709d0d47a9c5f5e19d2031dd33f4e91dbb6 Mon Sep 17 00:00:00 2001 From: Alan <> Date: Tue, 21 Oct 2025 13:28:56 +1100 Subject: [PATCH 48/48] Improved resilience of Widget.get_state to omit close items in boxes and Widget.get_manager_state to omit invalid widgets. --- .../ipywidgets/ipywidgets/widgets/widget.py | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/python/ipywidgets/ipywidgets/widgets/widget.py b/python/ipywidgets/ipywidgets/widgets/widget.py index e76553c758..06da81b9be 100644 --- a/python/ipywidgets/ipywidgets/widgets/widget.py +++ b/python/ipywidgets/ipywidgets/widgets/widget.py @@ -422,9 +422,12 @@ def get_manager_state(cls, drop_defaults=False, widgets=None): """ state = {} if widgets is None: - widgets = _widget_instances.values() + widgets = tuple(_widget_instances.values()) for widget in widgets: - state[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) + try: + state[widget.model_id] = widget._get_embed_state(drop_defaults=drop_defaults) + except Exception: + pass return {'version_major': 2, 'version_minor': 0, 'state': state} def _get_embed_state(self, drop_defaults=False): @@ -621,7 +624,24 @@ def get_state(self, key=None, drop_defaults=False): traits = self.traits() for k in keys: to_json = self.trait_metadata(k, 'to_json', self._trait_to_json) - value = to_json(getattr(self, k), self) + try: + value = to_json(getattr(self, k), self) + except RuntimeError as e: + if k == "children" and isinstance((children := getattr(self, k)), tuple): + # A special case to handle invalid children + children_ = [] + for c in children: + try: + to_json(c, self) + except Exception: + self.log.debug("Dropping invalid child item:%r", c) + continue + else: + children_.append(c) + value = to_json(children_, self) + else: + self.log.exception("Unable to trait %s from %r", k, self, exc_info=e) + continue if not drop_defaults or not self._compare(value, traits[k].default_value): state[k] = value return state