From 95c22d9c385b7220231334c1cd445e31d06b5d1c Mon Sep 17 00:00:00 2001 From: Alan Fleming <> Date: Fri, 1 Nov 2024 11:57:08 +1100 Subject: [PATCH] Add IpylabModel and Connections, plugins, pre-commit, ruff and other enhancements. --- .copier-answers.yml | 1 - .github/workflows/binder-on-pr.yml | 35 +- .github/workflows/build.yml | 97 +- .github/workflows/lint.yml | 35 - .github/workflows/packaging.yml | 14 +- .github/workflows/pre-commit.yml | 14 + .pre-commit-config.yaml | 58 + .vscode/launch.json | 67 + .vscode/settings.json | 17 + README.md | 24 +- examples/commands.ipynb | 150 +- examples/dialogs.ipynb | 359 ++ examples/generic.ipynb | 198 + examples/icons.ipynb | 182 +- examples/ipytree.ipynb | 95 +- examples/menu.ipynb | 215 + examples/notifications.ipynb | 145 + examples/plugins.ipynb | 311 ++ examples/sessions.ipynb | 73 +- examples/widgets.ipynb | 318 +- ipylab/__init__.py | 43 +- ipylab/__main__.py | 13 + ipylab/_compat/__init__.py | 0 ipylab/_compat/enum.py | 17 + ipylab/_compat/typing.py | 18 + ipylab/_frontend.py | 15 +- ipylab/commands.py | 337 +- ipylab/common.py | 242 ++ ipylab/connection.py | 159 + ipylab/dialog.py | 150 + ipylab/hookspecs.py | 139 + ipylab/icon.py | 19 - ipylab/ipylab.py | 444 +++ ipylab/jupyterfrontend.py | 328 +- ipylab/labapp.py | 11 + ipylab/launcher.py | 55 + ipylab/lib.py | 133 + ipylab/log.py | 109 + ipylab/menu.py | 219 ++ ipylab/notification.py | 173 + ipylab/scripts.py | 12 + ipylab/sessions.py | 55 +- ipylab/shell.py | 179 +- ipylab/widgets.py | 129 +- package.json | 53 +- pyproject.toml | 82 +- ruff_defaults.toml | 543 +++ schema/settings.json | 14 + src/observable_disposable.ts | 30 + src/plugin.ts | 168 +- src/utils.ts | 263 ++ src/widget.ts | 24 +- src/widgets/commands.ts | 241 +- src/widgets/connection.ts | 258 ++ src/widgets/dialog.ts | 58 + src/widgets/frontend.ts | 308 +- src/widgets/icon.ts | 27 +- src/widgets/ipylab.ts | 566 +++ src/widgets/notification.ts | 85 + src/widgets/palette.ts | 113 - src/widgets/panel.ts | 47 +- src/widgets/sessions.ts | 140 - src/widgets/shell.ts | 227 +- src/widgets/split_panel.ts | 103 +- src/widgets/title.ts | 56 +- style/widget.css | 38 +- yarn.lock | 5807 +++++++++++++++++----------- 67 files changed, 10869 insertions(+), 3789 deletions(-) delete mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/pre-commit.yml create mode 100644 .pre-commit-config.yaml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 examples/dialogs.ipynb create mode 100644 examples/generic.ipynb create mode 100644 examples/menu.ipynb create mode 100644 examples/notifications.ipynb create mode 100644 examples/plugins.ipynb create mode 100644 ipylab/__main__.py create mode 100644 ipylab/_compat/__init__.py create mode 100644 ipylab/_compat/enum.py create mode 100644 ipylab/_compat/typing.py create mode 100644 ipylab/common.py create mode 100644 ipylab/connection.py create mode 100644 ipylab/dialog.py create mode 100644 ipylab/hookspecs.py delete mode 100644 ipylab/icon.py create mode 100644 ipylab/ipylab.py create mode 100644 ipylab/labapp.py create mode 100644 ipylab/launcher.py create mode 100644 ipylab/lib.py create mode 100644 ipylab/log.py create mode 100644 ipylab/menu.py create mode 100644 ipylab/notification.py create mode 100644 ipylab/scripts.py create mode 100644 ruff_defaults.toml create mode 100644 schema/settings.json create mode 100644 src/observable_disposable.ts create mode 100644 src/utils.ts create mode 100644 src/widgets/connection.ts create mode 100644 src/widgets/dialog.ts create mode 100644 src/widgets/ipylab.ts create mode 100644 src/widgets/notification.ts delete mode 100644 src/widgets/palette.ts delete mode 100644 src/widgets/sessions.ts diff --git a/.copier-answers.yml b/.copier-answers.yml index c4b18f1f..2d0ca61b 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -11,4 +11,3 @@ project_short_description: Control JupyterLab from Python notebooks python_name: ipylab repository: https://github.com/jtpio/ipylab test: false - diff --git a/.github/workflows/binder-on-pr.yml b/.github/workflows/binder-on-pr.yml index dce34efa..c9ed77de 100644 --- a/.github/workflows/binder-on-pr.yml +++ b/.github/workflows/binder-on-pr.yml @@ -5,26 +5,25 @@ on: types: [opened] permissions: - pull-requests: - write + pull-requests: write jobs: binder: runs-on: ubuntu-latest steps: - - name: comment on PR with Binder link - uses: actions/github-script@v1 - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - var PR_HEAD_USERREPO = process.env.PR_HEAD_USERREPO; - var PR_HEAD_REF = process.env.PR_HEAD_REF; - github.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/${PR_HEAD_USERREPO}/${PR_HEAD_REF}?urlpath=lab) :point_left: Try it on Binder (branch _${PR_HEAD_USERREPO}/${PR_HEAD_REF}_)` - }) - env: - PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} - PR_HEAD_USERREPO: ${{ github.event.pull_request.head.repo.full_name }} \ No newline at end of file + - name: comment on PR with Binder link + uses: actions/github-script@v1 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + var PR_HEAD_USERREPO = process.env.PR_HEAD_USERREPO; + var PR_HEAD_REF = process.env.PR_HEAD_REF; + github.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/${PR_HEAD_USERREPO}/${PR_HEAD_REF}?urlpath=lab) :point_left: Try it on Binder (branch _${PR_HEAD_USERREPO}/${PR_HEAD_REF}_)` + }) + env: + PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} + PR_HEAD_USERREPO: ${{ github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49b78e8e..70ec4ea5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,76 +2,71 @@ name: Build on: push: - branches: main + branches: ['main'] pull_request: - branches: '*' + branches: + - '*' jobs: build: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - name: Base Setup - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - name: Base Setup + uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - name: Install dependencies - run: python -m pip install -U "jupyterlab>=4.2.0,<5" + - name: Build the extension + run: | + set -eux + pip install .[dev] - - name: Build the extension - run: | - set -eux - jlpm - python -m pip install .[test] + jupyter labextension list + jupyter labextension list 2>&1 | grep -ie "ipylab.*OK" + python -m jupyterlab.browser_check - jupyter labextension list - jupyter labextension list 2>&1 | grep -ie "ipylab.*OK" - python -m jupyterlab.browser_check + - name: Package the extension + run: | + set -eux - - name: Package the extension - run: | - set -eux + hatch build + pip uninstall -y "ipylab" jupyterlab - pip install build - python -m build - pip uninstall -y "ipylab" jupyterlab - - - name: Upload extension packages - uses: actions/upload-artifact@v4 - with: - name: extension-artifacts - path: dist/ipylab* - if-no-files-found: error + - name: Upload extension packages + uses: actions/upload-artifact@v4 + with: + name: extension-artifacts + path: dist/ipylab* + if-no-files-found: error test_isolated: needs: build runs-on: ubuntu-latest steps: - - name: Install Python - uses: actions/setup-python@v5 - with: - python-version: '3.9' - architecture: 'x64' - - uses: actions/download-artifact@v4 - with: - name: extension-artifacts - - name: Install and Test - run: | - set -eux - # Remove NodeJS, twice to take care of system and locally installed node versions. - sudo rm -rf $(which node) - sudo rm -rf $(which node) - - pip install "jupyterlab>=4.0.0,<5" ipylab*.whl - - - jupyter labextension list - jupyter labextension list 2>&1 | grep -ie "ipylab.*OK" - python -m jupyterlab.browser_check --no-browser-test - + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + architecture: 'x64' + - uses: actions/download-artifact@v4 + with: + name: extension-artifacts + - name: Install and Test + run: | + set -eux + # Remove NodeJS, twice to take care of system and locally installed node versions. + sudo rm -rf $(which node) + sudo rm -rf $(which node) + + pip install ipylab*.whl + + + jupyter labextension list + jupyter labextension list 2>&1 | grep -ie "ipylab.*OK" + python -m jupyterlab.browser_check --no-browser-test check_links: name: Check Links diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 7af1e2ad..00000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Lint - -on: - push: - branches: [ main ] - pull_request: - branches: '*' - -jobs: - lint_ts: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Base Setup - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - name: Install JupyterLab - run: python -m pip install 'jupyterlab >=4.2.0,<5' - - name: Lint TypeScript - run: | - jlpm - jlpm run lint:check - - lint_python: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Base Setup - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - name: Install black - run: python -m pip install black - - name: Lint Python - run: | - black --check . diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index ff77c788..c367ad37 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -2,9 +2,11 @@ name: Packaging on: push: - branches: [ main ] + branches: + - main pull_request: - branches: '*' + branches: + - '*' env: PIP_DISABLE_PIP_VERSION_CHECK: 1 @@ -23,10 +25,10 @@ jobs: uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Install dependencies run: | - python -m pip install "jupyterlab>=4,<5" build + python -m pip install "jupyterlab>=4,<5" hatch - name: Build pypi distributions run: | - python -m build + hatch build - name: Build npm distributions run: | npm pack @@ -48,9 +50,9 @@ jobs: fail-fast: false matrix: os: [ubuntu, macos, windows] - python: ['3.8', '3.12'] + python: ['3.10', '3.12'] include: - - python: '3.8' + - python: '3.10' dist: 'ipylab*.tar.gz' - python: '3.12' dist: 'ipylab*.whl' diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000..064db0ff --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,14 @@ +name: Pre-Commit Check +on: + push: + branches: ['main'] + pull_request: + branches: + - '*' +jobs: + pre_commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - uses: jupyterlab/maintainer-tools/.github/actions/pre-commit@v1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..b6c086b0 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,58 @@ +ci: + autoupdate_schedule: monthly + skip: + - prettier +default_language_version: + node: system +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-case-conflict + - id: check-ast + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-toml + - id: check-yaml + - id: debug-statements + - id: end-of-file-fixer + - id: trailing-whitespace + - id: forbid-new-submodules + - id: end-of-file-fixer + exclude: galata/.*-snapshots + - id: requirements-txt-fixer + - id: check-builtin-literals + - repo: https://gitlab.com/bmares/check-json5 + rev: 'v1.0.0' + hooks: + - id: check-json5 + - repo: https://github.com/python-jsonschema/check-jsonschema + rev: 0.29.4 + hooks: + - id: check-github-workflows + - repo: https://github.com/ComPWA/taplo-pre-commit + rev: v0.9.3 + hooks: + - id: taplo-format + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.7.1 + hooks: + - id: ruff + types_or: [python, jupyter] + args: ['--fix'] + - id: ruff-format + types_or: [python, jupyter] + - repo: https://github.com/codespell-project/codespell + rev: 'v2.3.0' + hooks: + - id: codespell + additional_dependencies: + - tomli + + - repo: https://github.com/kynan/nbstripout + rev: '0.7.1' + hooks: + - id: nbstripout diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..04b6c90d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,67 @@ +{ + // To debug jupyterlab running in a venv or conda env: + // - set up Python env in your workspace as per https://code.visualstudio.com/docs/python/environments + // - add an "envFile" prop to each backend config pointing to .vscode/debug.env + // - configure the .vscode/debug.env file as needed + // https://github.com/jupyterlab/vscode-config-template/tree/main + // https://github.com/jupyterlab/vscode-config-template/issues/1 + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Current File all-code", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": false + }, + { + "name": "Python Debugger: Current File: just my code", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": false + }, + { + "name": "Ipylab", + "type": "debugpy", + "request": "launch", + "args": [ + "--notebook-dir=examples", + "--no-browser", + "--ServerApp.token=''", + "--port=9999" + ], + "cwd": "${workspaceFolder}", + "justMyCode": false, + "module": "ipylab", + "presentation": { + "hidden": false + } + }, + { + "name": "IPylab frontend with Firefox", + "type": "firefox", + "request": "launch", + "reAttach": true, + "url": "http://localhost:9999", + "webRoot": "${workspaceFolder}", + "pathMappings": [ + { + "url": "webpack://ipylab/src", + "path": "${workspaceFolder}/src" + } + ], + "presentation": { + "hidden": false + } + } + ], + "compounds": [ + { + "name": "Debug IPylab with firefox", + "configurations": ["Ipylab", "IPylab frontend with Firefox"] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c991dcd6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "spellright.language": ["en"], + "spellright.documentTypes": ["markdown", "latex"], + "[toml]": { + "editor.defaultFormatter": "tamasfe.even-better-toml" + }, + "[python]": { + "editor.defaultFormatter": "charliermarsh.ruff" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "editor.formatOnSave": true, + "python.terminal.activateEnvInCurrentTerminal": true, + "python.createEnvironment.trigger": "prompt", + "python.analysis.typeCheckingMode": "basic" +} diff --git a/README.md b/README.md index 7bbd32c1..ffdf703e 100644 --- a/README.md +++ b/README.md @@ -88,21 +88,39 @@ jupyter lab ```bash # create a new conda environment -mamba create -n ipylab -c conda-forge jupyter-packaging nodejs python -y +mamba create -n ipylab -c conda-forge nodejs python=3.10 -y # activate the environment conda activate ipylab # install the Python package -python -m pip install -e ".[dev]" +pip install -e ".[dev]" # link the extension files jupyter labextension develop . --overwrite # compile the extension -jlpm && jlpm run build +jlpm clean +jlpm build + +# pre-commit (optional) +pip install pre-commit +pre-commit run + +# or, to install the git hook +pre-commit install + +# Use jlpm script to lint the JS +jlpm lint +#or +jlpm lint:check + ``` +### VS code debugging + +A config file is included to debug ipylab with Firefox. + ## Related projects There are a couple of projects that also enable interacting with the JupyterLab environment from Python notebooks: diff --git a/examples/commands.ipynb b/examples/commands.ipynb index 9ac8668c..02d5200d 100644 --- a/examples/commands.ipynb +++ b/examples/commands.ipynb @@ -22,9 +22,10 @@ "metadata": {}, "outputs": [], "source": [ - "from ipylab import JupyterFrontEnd\n", + "import ipylab\n", "\n", - "app = JupyterFrontEnd()" + "app = ipylab.App()\n", + "app.commands" ] }, { @@ -49,7 +50,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.list_commands()" + "app.commands.all_commands" ] }, { @@ -65,12 +66,15 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.execute('console:create', {\n", - " 'insertMode': 'split-right',\n", - " 'kernelPreference': {\n", - " 'shutdownOnClose': True,\n", - " }\n", - "})" + "app.commands.execute(\n", + " \"console:create\",\n", + " {\n", + " \"insertMode\": \"split-right\",\n", + " \"kernelPreference\": {\n", + " \"shutdownOnClose\": True,\n", + " },\n", + " },\n", + ")" ] }, { @@ -86,14 +90,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.execute('apputils:change-theme', { 'theme': 'JupyterLab Dark' })" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create a new terminal" + "app.commands.execute(\"apputils:change-theme\", {\"theme\": \"JupyterLab Dark\"})" ] }, { @@ -102,48 +99,14 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.execute('terminal:create-new')" + "app.commands.execute(\"apputils:change-theme\", {\"theme\": \"JupyterLab Light\"})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Ready event\n", - "\n", - "Some functionalities might require the `JupyterFrontEnd` widget to be ready on the frontend first.\n", - "\n", - "This is for example the case when listing all the available commands, or retrieving the version with `app.version`.\n", - "\n", - "The `on_ready` method can be used to register a callback that will be fired when the frontend is ready." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ipylab import JupyterFrontEnd\n", - "from ipywidgets import Output\n", - "\n", - "app = JupyterFrontEnd()\n", - "out = Output()\n", - "\n", - "def init():\n", - " # show the first 5 commands\n", - " cmds = app.commands.list_commands()[:5]\n", - " out.append_stdout(cmds)\n", - "\n", - "app.on_ready(init)\n", - "out" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or using `asyncio`:" + "## Create a new terminal" ] }, { @@ -152,19 +115,7 @@ "metadata": {}, "outputs": [], "source": [ - "import asyncio\n", - "\n", - "app = JupyterFrontEnd()\n", - "\n", - "out = Output()\n", - "\n", - "async def init():\n", - " await app.ready()\n", - " cmds = app.commands.list_commands()[:5]\n", - " out.append_stdout(cmds)\n", - "\n", - "asyncio.create_task(init())\n", - "out" + "app.commands.execute(\"terminal:create-new\")" ] }, { @@ -173,9 +124,11 @@ "source": [ "## Add your own command\n", "\n", - "Let's create a nice plot with `bqlot` and generate some random data.\n", + "Let's create a nice plot with `bqlot` and generate some random data. \n", + "\n", + "See https://github.com/bqplot/bqplot/blob/master/examples/Advanced%20Plotting/Animations.ipynb for more details.\n", "\n", - "See https://github.com/bqplot/bqplot/blob/master/examples/Advanced%20Plotting/Animations.ipynb for more details." + "Note: This requires bqplot to be installed, which may require Jupyterlab to be restarted." ] }, { @@ -185,9 +138,9 @@ "outputs": [], "source": [ "import numpy as np\n", + "from bqplot import Axis, Bars, Figure, LinearScale, Lines\n", "\n", - "from bqplot import LinearScale, Lines, Bars, Axis, Figure\n", - "from ipywidgets import IntSlider" + "import ipylab" ] }, { @@ -204,14 +157,16 @@ "y = np.cumsum(np.random.randn(20))\n", "y1 = np.random.rand(20)\n", "\n", - "line = Lines(x=x, y=y, scales={'x': xs, 'y': ys1}, colors=['magenta'], marker='square')\n", - "bar = Bars(x=x, y=y1, scales={'x': xs, 'y': ys2}, colorpadding=0.2, colors=['steelblue'])\n", + "line = Lines(x=x, y=y, scales={\"x\": xs, \"y\": ys1}, colors=[\"magenta\"], marker=\"square\")\n", + "bar = Bars(x=x, y=y1, scales={\"x\": xs, \"y\": ys2}, colorpadding=0.2, colors=[\"steelblue\"])\n", "\n", - "xax = Axis(scale=xs, label='x', grid_lines='solid')\n", - "yax1 = Axis(scale=ys1, orientation='vertical', tick_format='0.1f', label='y', grid_lines='solid')\n", - "yax2 = Axis(scale=ys2, orientation='vertical', side='right', tick_format='0.0%', label='y1', grid_lines='none')\n", + "xax = Axis(scale=xs, label=\"x\", grid_lines=\"solid\")\n", + "yax1 = Axis(scale=ys1, orientation=\"vertical\", tick_format=\"0.1f\", label=\"y\", grid_lines=\"solid\")\n", + "yax2 = Axis(scale=ys2, orientation=\"vertical\", side=\"right\", tick_format=\"0.0%\", label=\"y1\", grid_lines=\"none\")\n", "\n", - "Figure(marks=[bar, line], axes=[xax, yax1, yax2], animation_duration=1000)" + "fig = Figure(marks=[bar, line], axes=[xax, yax1, yax2], animation_duration=1000)\n", + "panel = ipylab.Panel([fig])\n", + "panel.add_to_shell(mode=ipylab.InsertMode.split_right)" ] }, { @@ -256,7 +211,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.add_command('update_data', execute=update_data, label=\"Update Data\", icon_class=\"jp-PythonIcon\")" + "t = panel.app.commands.add_command(\"update_data\", execute=update_data, label=\"Update Data\", icon_class=\"jp-PythonIcon\")" ] }, { @@ -272,7 +227,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.execute('update_data')" + "panel.app.commands.execute(\"update_data\")" ] }, { @@ -290,7 +245,8 @@ "metadata": {}, "outputs": [], "source": [ - "assert 'random' in app.commands.list_commands()" + "cmd = t.result()\n", + "assert str(cmd) in panel.app.commands.all_commands # noqa: S101" ] }, { @@ -313,32 +269,14 @@ "metadata": {}, "outputs": [], "source": [ - "from ipylab.commands import CommandPalette" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "palette = CommandPalette()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "palette.add_item('update_data', 'Python Commands')" + "cmd.add_to_command_pallet(\"Python Commands\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Open the command palette on the left side and the command should show now be visible." + "Open the command palette `CTRL + SHIFT + C` and the command should show now be available as `Update data`." ] }, { @@ -356,7 +294,10 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.remove_command('update_data')" + "app.commands.remove_command(\"update_data\")\n", + "\n", + "# or better with using the link\n", + "cmd.close()" ] } ], @@ -376,14 +317,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } + "version": "3.12.7" } }, "nbformat": 4, diff --git a/examples/dialogs.ipynb b/examples/dialogs.ipynb new file mode 100644 index 00000000..e35e1332 --- /dev/null +++ b/examples/dialogs.ipynb @@ -0,0 +1,359 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -q ipylab" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Panels and Widgets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Warning for notebooks and consoles\n", + "\n", + "**Do not try to await tasks returned from any ipylab methods, doing so block forever preventing further execution.**\n", + "\n", + "This happens because Ipylab employs custom messages over widget comms and widget comms is blocked during cell execution (in the default kernel and server).\n", + "\n", + "see [Plugins](plugins.ipynb#Example-launching-a-small-app) or [Actions](widgets.ipynb#Notification-Actions) for an example of awaiting the tasks in a coroutine." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ipywidgets as ipw\n", + "\n", + "import ipylab\n", + "\n", + "app = ipylab.App()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### [Dialogs](https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#dialogs)\n", + "\n", + "Various dialogs are provided to interact with the users, possibly getting a returned value. Outside of notebooks, the response can be awaited.\n", + "\n", + "#### Cancelling\n", + "\n", + "Except for the `showDialog` function, cancelling will raise an `IpylabFrontendError`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Item" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_item(\"Select an item\", [1, 2, 3])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Boolean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_boolean(\"Select boolean value\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Number" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_number(\"Provide a numeric value\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Text" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_text(\"Enter text\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Password\n", + "\n", + "Note: messaging is not encrypted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_password(\"Provide a password\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.show_dialog(\n", + " \"A custom dialog\",\n", + " \"It returns the raw result, and there is no cancellation\",\n", + " buttons=[\n", + " {\n", + " \"ariaLabel\": \"Accept\",\n", + " \"label\": \"Accept\",\n", + " \"iconClass\": \"\",\n", + " \"iconLabel\": \"\",\n", + " \"caption\": \"Accept the result\",\n", + " \"className\": \"\",\n", + " \"accept\": \"accept\",\n", + " \"actions\": [],\n", + " \"displayType\": \"warn\",\n", + " },\n", + " {\n", + " \"ariaLabel\": \"Cancel\",\n", + " \"label\": \"Cancel\",\n", + " \"iconClass\": \"\",\n", + " \"iconLabel\": \"\",\n", + " \"caption\": \"\",\n", + " \"className\": \"\",\n", + " \"accept\": \"cancel\",\n", + " \"actions\": [],\n", + " \"displayType\": \"default\",\n", + " },\n", + " ],\n", + " checkbox={ # Optional checkbox in the dialog footer\n", + " \"label\": \"check me\", # Checkbox label\n", + " \"caption\": \"check me I'm magic\", # Checkbox tooltip\n", + " \"className\": \"my-checkbox\", # Additional checkbox CSS class\n", + " \"checked\": True, # Default checkbox state\n", + " },\n", + " hasClose=False,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**This one has some Ipywidgets in the body!**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.show_dialog(body=ipw.VBox([ipw.HTML(\"SomeTitle\"), ipw.FloatSlider()]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.show_error_message(\n", + " \"My error\",\n", + " \"Please acknowledge\",\n", + " buttons=[\n", + " {\n", + " \"ariaLabel\": \"Accept\",\n", + " \"label\": \"Accept\",\n", + " \"iconClass\": \"\",\n", + " \"iconLabel\": \"\",\n", + " \"caption\": \"Accept the result\",\n", + " \"className\": \"\",\n", + " \"accept\": \"accept\",\n", + " \"actions\": [],\n", + " \"displayType\": \"warn\",\n", + " }\n", + " ],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### [File dialogs](https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#file-dialogs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_open_files()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.dialog.get_existing_directory()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.result()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/generic.ipynb b/examples/generic.ipynb new file mode 100644 index 00000000..72105f81 --- /dev/null +++ b/examples/generic.ipynb @@ -0,0 +1,198 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -q ipylab" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ipylab\n", + "\n", + "`Ipylab` is the primary class that provides functionality for scheduling and awaiting operations between Python objects and the corresponding model in the frontend. Each operation is run as a Task which is assigned a UUID and sent as a custom message. \n", + "\n", + "`IpylabModel` has a `base` object that is set prior to being *ready*. The base object is specified by the Python class and located by the frontend model with the `ipylabInit` method (customised by other subclasses). \n", + "\n", + "## Operations\n", + "\n", + "The `operation` method is the workhorse through which all asynchronous messaging is done. It will always return a task. Each operation much be implement in the frontend model. \n", + "\n", + "\n", + "## Generic methods\n", + "\n", + " `Ipylab` implements the following generic methods interact with objects in the fronted: \n", + "\n", + "* execute_method\n", + "* get_property\n", + "* set_property\n", + "* update_property\n", + "* list_properties\n", + "\n", + "These methods pass an object to utility functions reducing the need to write corresponding code in the frontend. \n", + "\n", + "By default the methods the `base`. A different base object can be specified `obj=Obj.###` to specify a different path.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Connection\n", + "\n", + "A `Connection` is subclassed from `Ipylab` providing a connection to an object in the Frontend. \n", + "\n", + "Each connection has a unique `cid` (stands for connection id). The `cid` consists of the class prefix `ipylab-|` followed by one or more parts joined with a pipe. The class prefix part of the cid determines the type of class that is created when creating a new instance.\n", + "\n", + "In the kernel there is only one instance of a Connection object per `cid`. For example: calling `Connection('ipylab-Connection|my cid')` multiple times will get the same object inside the same kernel.\n", + "\n", + "The object in the frontend is stored as an ObservableDisposable and once it has be set, it cannot be replaced with another object, unless it has been disposed.\n", + "\n", + "Calling the close method in Python will by default dispose of the object in the frontend. This can behavior can be changed by using `dispose=False`, or previously setting the 'auto_dispose` trait to False.\n", + "\n", + "\n", + "### Subclasses\n", + "\n", + "Subclasses of `Connection` are identified by its *prefix* `.\n", + "\n", + "### Connection models\n", + "\n", + "There are two models for connections, `ConnectionModel` and `ShellConnectionModel`. `ShellConnectionModel` is specific for widgets that are loaded in the shell.\n", + "\n", + "### Making a connection\n", + "\n", + "Many of the builtin methods return connections.\n", + "\n", + "The easiest way to create a connection is to specify the `transform` as a `Transform.connection`. Examples:\n", + "\n", + "* [Autostart](plugins.ipynb#Example-launching-a-small-app)\n", + "* [Console](http://localhost:9999/lab/tree/commands.ipynb#Create-a-new-console)\n", + "* [Notebook](sessions.ipynb#Create-a-new-Notebook)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: This notebook should be run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ipylab\n", + "\n", + "app = ipylab.App()\n", + "\n", + "t = app.list_properties(\"shell\", depth=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "methods = t.result()\n", + "methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some of the methods above have already been implemented in 'app.shell' on the Python object. And if you look at the code you'll see these methods use the *generic* method `execute_method`.\n", + "\n", + "In case you're interested, the custom message sent to the frontend looks like this:\n", + "\n", + "```python\n", + "{\n", + " \"method\": \"custom\",\n", + " \"content\": '{\"ipylab_PY\": \"353695a0-1754-4d53-b758-291f70058f41\", \"operation\": \"listProperties\", \"kwgs\": {\"dottedname\": \"shell\", \"depth\": 2, \"omitHidden\": true}, \"transform\": \"raw\"}',\n", + "}\n", + "```\n", + "\n", + "Note the *content* is always JSON string. This is because we convert every message to JSON prior to sending making it possible to replace widgets and code objects with string representations. For widgets, it is necessary to instruct the frontend what to do with the widget. Currently there are the following additional options:\n", + "1. `toLuminoWidget`: Replace with a widget in the frontend.\n", + "2. `toObject`: Replace with an object in the frontend.\n", + "\n", + "These options are lists of attributes as they appear in the frontend that should be transformed/extracted." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The source code\n", + "\n", + "import inspect\n", + "\n", + "print(inspect.getsource(app.shell.expand_left)) # noqa: T201" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.shell.expand_right() # Built in" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.shell.execute_method(\"collapseRight\") # Generic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that all Python methods are written with `snake_case` whereas the Javascript command is written as `cammelCase`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/icons.ipynb b/examples/icons.ipynb index ec6291ce..6eb1a5d3 100644 --- a/examples/icons.ipynb +++ b/examples/icons.ipynb @@ -2,7 +2,15 @@ "cells": [ { "cell_type": "markdown", - "id": "690da69f-cf3d-40a9-b8e0-610339c859e9", + "id": "0", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "markdown", + "id": "1", "metadata": {}, "source": [ "# Icons" @@ -10,7 +18,7 @@ }, { "cell_type": "markdown", - "id": "d5267848-fde6-4108-b7ff-be9e7303d0e4", + "id": "2", "metadata": {}, "source": [ "Icons can be applied to both the `Title` of a `Panel` [widgets](./widgets.ipynb) and [commands](./commands.ipynb), providing more customization than `icon_class`." @@ -19,7 +27,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5eb2e5cc", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -29,18 +37,23 @@ { "cell_type": "code", "execution_count": null, - "id": "2b18ff57-b458-4b92-bbf3-0e660343d067", + "id": "4", "metadata": { "tags": [] }, "outputs": [], "source": [ - "from ipylab import Icon" + "import json\n", + "\n", + "import ipywidgets as ipw\n", + "import traitlets\n", + "\n", + "import ipylab" ] }, { "cell_type": "markdown", - "id": "5a05db60-7147-4466-b8e3-296e59204013", + "id": "5", "metadata": {}, "source": [ "## SVG\n", @@ -57,7 +70,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a02c39d9-1284-4f84-b13f-d7028640c821", + "id": "6", "metadata": { "tags": [] }, @@ -71,7 +84,7 @@ }, { "cell_type": "markdown", - "id": "22c3c5a5-ae3c-435c-9f12-21e247cf80f3", + "id": "7", "metadata": {}, "source": [ "Icons can be displayed directly, and sized with the `layout` member inherited from `ipywidgets.DOMWidget`." @@ -80,56 +93,50 @@ { "cell_type": "code", "execution_count": null, - "id": "add039d5-35d7-44ee-a70e-7d9cf38f56eb", + "id": "8", "metadata": { "tags": [] }, "outputs": [], "source": [ - "icon = Icon(name=\"my-icon\", svgstr=SVG, layout=dict(width=\"32px\"))\n", + "icon = ipylab.Icon(name=\"my-icon\", svgstr=SVG, layout={\"width\": \"32px\"})\n", "icon" ] }, { "cell_type": "markdown", - "id": "2555a92e-3335-407d-8e8e-22d686794913", + "id": "9", "metadata": {}, "source": [ "### More about `jp-icon` classes\n", - "The interactive below isn't particuarly _robust_, but shows how the different `jp-icon-*` classes can be used." + "The interactive below isn't particularly _robust_, but shows how the different `jp-icon-*` classes can be used." ] }, { "cell_type": "code", "execution_count": null, - "id": "ccea8868-2d3e-454d-b3d5-15e16cf51f54", + "id": "10", "metadata": { "tags": [] }, "outputs": [], "source": [ - "from ipylab import Panel, JupyterFrontEnd\n", - "from ipywidgets import SelectionSlider, FloatSlider, VBox\n", - "from traitlets import dlink, link\n", - "\n", "icon_prefix = [\"\", \"-accent\", \"-brand\", \"-contrast\", \"-warn\"]\n", "options = [\"\"] + [f\"jp-icon{sub}{i}\" for sub in icon_prefix for i in range(5)]\n", - "background = SelectionSlider(description=\"background\", options=options)\n", - "foreground = SelectionSlider(description=\"foreground\", options=options)\n", - "\n", - "repaint = lambda: SVG.replace(\"jp-icon3\", background.value).replace(\"jp-contrast0\", foreground.value)\n", + "background = ipw.SelectionSlider(description=\"background\", options=options)\n", + "foreground = ipw.SelectionSlider(description=\"foreground\", options=options)\n", "\n", - "dlink((background, \"value\"), (icon, \"svgstr\"), lambda x: SVG.replace(\"jp-icon3\", x))\n", - "dlink((foreground, \"value\"), (icon, \"svgstr\"), lambda x: SVG.replace(\"jp-contrast0\", x))\n", - "size = FloatSlider(32, description=\"size\")\n", - "dlink((size, \"value\"), (icon.layout, \"width\"), \"{}px\".format)\n", - "icon_controls = VBox([background, foreground, size, icon])\n", + "traitlets.dlink((background, \"value\"), (icon, \"svgstr\"), lambda x: SVG.replace(\"jp-icon3\", x))\n", + "traitlets.dlink((foreground, \"value\"), (icon, \"svgstr\"), lambda x: SVG.replace(\"jp-contrast0\", x))\n", + "size = ipw.FloatSlider(32, description=\"size\")\n", + "traitlets.dlink((size, \"value\"), (icon.layout, \"width\"), \"{}px\".format)\n", + "icon_controls = ipw.VBox([background, foreground, size, icon])\n", "icon_controls" ] }, { "cell_type": "markdown", - "id": "5f0a6742-3a3b-4879-8bb0-e675c80f03ed", + "id": "11", "metadata": {}, "source": [ "## Icons on Panel Titles\n", @@ -140,23 +147,21 @@ { "cell_type": "code", "execution_count": null, - "id": "29a7cd8c-e26b-4a54-aca5-ae19fab2772d", + "id": "12", "metadata": { "tags": [] }, "outputs": [], "source": [ - "app = JupyterFrontEnd()\n", - "panel = Panel([icon_controls])\n", + "panel = ipylab.Panel([icon_controls])\n", "panel.title.icon = icon\n", - "panel.title.closable = False\n", - "dlink((background, \"value\"), (panel.title, \"label\"))\n", - "app.shell.add(panel, \"main\", {\"mode\": \"split-right\"})" + "traitlets.dlink((background, \"value\"), (panel.title, \"label\"))\n", + "panel.add_to_shell(mode=ipylab.InsertMode.split_right)" ] }, { "cell_type": "markdown", - "id": "1df9a22e-90d6-440a-9921-3519e0e4da53", + "id": "13", "metadata": {}, "source": [ "### More Title Options\n", @@ -167,22 +172,20 @@ { "cell_type": "code", "execution_count": null, - "id": "ebb3698f-7752-4584-89f1-7d552264a04e", + "id": "14", "metadata": { "tags": [] }, "outputs": [], "source": [ - "from ipywidgets import Text, Checkbox, IntText\n", - "import json\n", - "\n", "def noop(value):\n", " return value\n", "\n", + "\n", "def as_json(value):\n", " try:\n", " return json.loads(value)\n", - " except:\n", + " except Exception:\n", " return {}\n", "\n", "\n", @@ -191,20 +194,17 @@ " link_fn = noop\n", " placeholder = \"\"\n", " if field_name == \"dataset\":\n", - " placeholder = \"{}\" \n", + " placeholder = \"{}\"\n", " link_fn = as_json\n", - " field = Text(description=field_name, placeholder=placeholder)\n", - " dlink((field, \"value\"), (panel.title, field_name), link_fn)\n", + " field = ipw.Text(description=field_name, placeholder=placeholder)\n", + " traitlets.dlink((field, \"value\"), (panel.title, field_name), link_fn)\n", " title_controls.append(field)\n", - "closable = Checkbox(description=\"closable?\")\n", - "dlink((closable, \"value\"), (panel.title, \"closable\"))\n", - "title_controls += [closable]\n", "panel.children = [icon_controls, *title_controls]" ] }, { "cell_type": "markdown", - "id": "f3018262-e383-4b8e-b0cb-b8cefd936d98", + "id": "15", "metadata": {}, "source": [ "## Icons on Commands\n", @@ -215,7 +215,7 @@ { "cell_type": "code", "execution_count": null, - "id": "386a1149-26f9-4def-9eab-146baaebfdb3", + "id": "16", "metadata": { "tags": [] }, @@ -224,70 +224,118 @@ "import asyncio\n", "import random\n", "\n", - "async def randomize_icon():\n", - " for i in range(10):\n", - " background.value = random.choice(options)\n", + "\n", + "async def randomize_icon(count=10):\n", + " for _ in range(count):\n", + " background.value = random.choice(options) # noqa: S311\n", " await asyncio.sleep(0.1)" ] }, { "cell_type": "code", "execution_count": null, - "id": "5b16eaad-69e2-436c-a99a-d9e299977973", + "id": "17", "metadata": { "tags": [] }, "outputs": [], "source": [ - "app.commands.add_command(\n", - " \"my-icon:randomize\",\n", - " lambda: asyncio.get_running_loop().create_task(randomize_icon()),\n", + "t = panel.app.commands.add_command(\n", + " \"randomize\",\n", + " randomize_icon,\n", " label=\"Randomize My Icon\",\n", - " icon=icon\n", + " icon=icon,\n", ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "cmd = t.result()" + ] + }, { "cell_type": "markdown", - "id": "dc396794-ee61-4af4-aac3-d303321eb04a", + "id": "19", "metadata": {}, "source": [ - "To see these, add the a _Command Palette_ with the same `command_id`:" + "We can use methods on `cmd` (Connection for the cmd registered in the Frontend) to add it to the command pallet, and create a launcher." ] }, { "cell_type": "code", "execution_count": null, - "id": "82b36a75-235f-4ac1-92a5-b79131b480f1", + "id": "20", "metadata": { "tags": [] }, "outputs": [], "source": [ - "from ipylab.commands import CommandPalette\n", - "\n", - "palette = CommandPalette()\n", - "palette.add_item(\"my-icon:randomize\", \"All My Commands\")" + "t = cmd.add_to_command_pallet(\"All My Commands\", rank=1000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "cmd.add_launcher(\"my launcher\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "assert cmd in panel.app.commands.connections # noqa: S101" ] }, { "cell_type": "markdown", - "id": "4d961ace-35da-4965-b529-703b69ce828b", + "id": "23", "metadata": {}, "source": [ - "Then open the _Command Palette_." + "Then open the _Command Palette_ (keyboard shortcut is `CTRL + SHIFT + C`).\n", + "\n", + "The and _Launcher_ is `CTRL + SHIFT + L`. " ] }, { "cell_type": "code", "execution_count": null, - "id": "0bcbb157-6741-446a-a04b-de8ad2dda74a", + "id": "24", "metadata": { "tags": [] }, "outputs": [], "source": [ - "app.commands.execute(\"apputils:activate-command-palette\")" + "asyncio.get_running_loop().call_later(1, panel.app.commands.execute, \"apputils:activate-command-palette\")" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "And run 'Randomize my icon'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "panel.app.commands.execute(cmd, {\"count\": 1})" ] } ], @@ -307,7 +355,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/examples/ipytree.ipynb b/examples/ipytree.ipynb index d1445712..8ab3658e 100644 --- a/examples/ipytree.ipynb +++ b/examples/ipytree.ipynb @@ -8,6 +8,8 @@ "\n", "In this example, we demonstrate how to create an alternative file browser UI using the `ipytree` widget.\n", "\n", + "**BROKEN until ipytree is updated to work with JupyterLab 4**\n", + "\n", "## Collecting the files\n", "\n", "First let's define some imports." @@ -29,9 +31,11 @@ "outputs": [], "source": [ "import os\n", + "from pathlib import PurePath\n", + "\n", + "import ipylab\n", "\n", - "from fnmatch import fnmatch\n", - "from pathlib import PurePath" + "app = ipylab.App()" ] }, { @@ -56,7 +60,7 @@ " \"lib\",\n", " \"node_modules\",\n", " \"__pycache__\",\n", - " \".ipynb_checkpoints\"\n", + " \".ipynb_checkpoints\",\n", "}" ] }, @@ -73,7 +77,7 @@ "metadata": {}, "outputs": [], "source": [ - "def collect_files(root_path='..'):\n", + "def collect_files(root_path=\"..\"):\n", " files = []\n", " for dirpath, dirnames, filenames in os.walk(root_path, followlinks=True):\n", " dirnames[:] = [d for d in dirnames if d not in EXCLUDES]\n", @@ -185,17 +189,17 @@ "def create_tree_widget(root, path, depth=0):\n", " node = Tree() if depth == 0 else TreeNode()\n", " for name, children in root.items():\n", - " fullpath = path + [name]\n", + " fullpath = [*path, name]\n", " if len(children) == 0:\n", " leaf = TreeNode(name)\n", " leaf.fullpath = os.path.join(*fullpath)\n", - " leaf.icon = 'file'\n", - " leaf.icon_style = 'warning'\n", + " leaf.icon = \"file\"\n", + " leaf.icon_style = \"warning\"\n", " node.add_node(leaf)\n", " else:\n", " subtree = create_tree_widget(children, fullpath, depth + 1)\n", - " subtree.icon = 'folder'\n", - " subtree.icon_style = 'info'\n", + " subtree.icon = \"folder\"\n", + " subtree.icon_style = \"info\"\n", " subtree.name = name\n", " node.add_node(subtree)\n", " return node" @@ -237,24 +241,6 @@ "Let's first create the frontend widget to serve as the proxy to JupyterLab." ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ipylab import JupyterFrontEnd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "app = JupyterFrontEnd()" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -262,7 +248,7 @@ "Let's also define a couple of buttons to:\n", "\n", "- open the selected files\n", - "- expand all nodes of the tre\n", + "- expand all nodes of the tree\n", "- collapse all nodes of the tree" ] }, @@ -272,16 +258,12 @@ "metadata": {}, "outputs": [], "source": [ - "from ipywidgets import Button, Layout, HBox, VBox\n", + "from ipywidgets import Button, HBox, Layout\n", "\n", - "open_button = Button(description='Open', button_style='success', icon='folder')\n", - "expand_button = Button(description='Expand', button_style='info', icon='chevron-down')\n", - "collapse_button = Button(description='Collapse', button_style='info', icon='chevron-right')\n", - "hbox = HBox([\n", - " open_button,\n", - " expand_button,\n", - " collapse_button\n", - "], layout=Layout(overflow='unset'))\n", + "open_button = Button(description=\"Open\", button_style=\"success\", icon=\"folder\")\n", + "expand_button = Button(description=\"Expand\", button_style=\"info\", icon=\"chevron-down\")\n", + "collapse_button = Button(description=\"Collapse\", button_style=\"info\", icon=\"chevron-right\")\n", + "hbox = HBox([open_button, expand_button, collapse_button], layout=Layout(overflow=\"unset\"))\n", "hbox" ] }, @@ -298,17 +280,19 @@ "metadata": {}, "outputs": [], "source": [ - "def expand_tree(tree, expand=True):\n", + "def expand_tree(tree, expand=True): # noqa: FBT002\n", " for node in tree.nodes:\n", " node.opened = expand\n", "\n", - "def on_expand_click(b):\n", + "\n", + "def on_expand_click(_):\n", " expand_tree(file_tree)\n", "\n", - " \n", - "def on_collapse_click(b):\n", + "\n", + "def on_collapse_click(_):\n", " expand_tree(file_tree, False)\n", "\n", + "\n", "expand_button.on_click(on_expand_click)\n", "collapse_button.on_click(on_collapse_click)" ] @@ -326,11 +310,12 @@ "metadata": {}, "outputs": [], "source": [ - "def on_open_clicked(b):\n", + "def on_open_clicked(_):\n", " for node in file_tree.selected_nodes:\n", " filepath = node.fullpath\n", " if filepath:\n", - " app.commands.execute('docmanager:open', { 'path': filepath})\n", + " app.commands.execute(\"docmanager:open\", {\"path\": filepath})\n", + "\n", "\n", "open_button.on_click(on_open_clicked)" ] @@ -349,7 +334,7 @@ "outputs": [], "source": [ "expand_tree(file_tree, False)\n", - "file_tree.layout = Layout(overflow='auto')" + "file_tree.layout = Layout(overflow=\"auto\")" ] }, { @@ -368,9 +353,9 @@ "from ipylab import Panel\n", "\n", "panel = Panel(children=[hbox, file_tree])\n", - "panel.title.label = 'File Browser'\n", - "panel.title.icon_class = 'jp-FileIcon'\n", - "panel.layout = Layout(overflow='auto')" + "panel.title.label = \"File Browser\"\n", + "panel.title.icon_class = \"jp-FileIcon\"\n", + "panel.layout = Layout(overflow=\"auto\")" ] }, { @@ -386,15 +371,8 @@ "metadata": {}, "outputs": [], "source": [ - "app.shell.add(panel, 'left', {'rank': 10000})" + "panel.add_to_shell(rank=1000)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -414,13 +392,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } } }, "nbformat": 4, diff --git a/examples/menu.ipynb b/examples/menu.ipynb new file mode 100644 index 00000000..507877b1 --- /dev/null +++ b/examples/menu.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Menu\n", + "\n", + "Menu items can be made in Jupyterlab with a connection provided back to the item in ipylab.\n", + "\n", + "## Main menu\n", + "\n", + "We can add items to existing menus. But lets first create a new menu and add it to the main menu." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ipywidgets as ipw\n", + "\n", + "import ipylab\n", + "\n", + "app = ipylab.App()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.main_menu.create_menu(\"🌈 MY CUSTOM MENU 🎌\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Menus can be added directly to the shell or nested inside other menus. Let's add this menu to main menu up top." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "menu = t.result()\n", + "app.main_menu.add_menu(menu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See above that the new menu is now added" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lets populate the new menu." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "async def populate_menu(menu):\n", + " await menu.add_item(command=\"help:about\")\n", + " await menu.add_item(type=\"separator\")\n", + " submenu = await app.main_menu.create_menu(\"My submenu\")\n", + " await submenu.add_item(command=\"notebook:create-console\")\n", + " await menu.add_item(submenu=submenu, type=\"submenu\")\n", + " await menu.add_item(command=\"logconsole:open\")\n", + "\n", + " # Open it\n", + " await app.main_menu.set_property(\"activeMenu\", ipylab.pack(menu), toObject=[\"value\"])\n", + " await app.main_menu.execute_method(\"openActiveMenu\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "app.to_task(populate_menu(menu))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "menu.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Context menu\n", + "\n", + "The app provides a global context menu. We can add items to the context menu using the same functions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.to_task(populate_menu(app.context_menu))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "panel = ipylab.Panel([ipw.HTML(\"

Right click to open the context menu\")])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "panel.add_to_shell(mode=ipylab.InsertMode.split_right)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## On ready\n", + "\n", + "**Requires per-kernel widget manager**\n", + "\n", + "When the workspace is re-loaded, including when the page is refreshed, all objects in the frontend are lost. Ipywidgets get restored from the backend, but the connected objects are not. \n", + "\n", + "For this reason, creating anything that uses connections should be defined in a function and then registered with on_ready.\n", + "\n", + "`on_ready` is called with the object that was registered. \n", + "\n", + "For example using `populate_menus from above:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "async def create_menus(app: ipylab.App):\n", + " menu = await app.main_menu.create_menu(\"🌈 MY CUSTOM MENU 🎌\")\n", + " await app.main_menu.add_menu(menu)\n", + " await populate_menu(menu)\n", + " await populate_menu(app.context_menu)\n", + "\n", + "\n", + "app.on_ready(create_menus)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Reload the page (F5) ignoring any warnings.\n", + "\n", + "The panel that was in the shell and the menus should have been restored.\n", + "\n", + "Note: May require a per-kernel widget manager. See Readme for details on installation." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.15" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/notifications.ipynb b/examples/notifications.ipynb new file mode 100644 index 00000000..3c98cefa --- /dev/null +++ b/examples/notifications.ipynb @@ -0,0 +1,145 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -q ipylab" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Notifications\n", + "Lets make a notification and then do some updates to the notification using the `NotificationConnection`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import asyncio\n", + "\n", + "import ipylab\n", + "\n", + "app = ipylab.App()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.notification.notify(\"Updating soon\", ipylab.NotificationType.progress, auto_close=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nc = t.result()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "async def update():\n", + " n = 20\n", + " for i in range(1, n):\n", + " await nc.update(f\"Updating {n-i}\")\n", + " await nc.update(\"All done\", type=ipylab.NotificationType.success)\n", + " await asyncio.sleep(1)\n", + " nc.close()\n", + "\n", + "\n", + "t = nc.to_task(update())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nc" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Notification Actions\n", + "\n", + "Actions appear as a button in the notification. Each action has a callback to a python function. Here each callback executes a command in Jupyterlab." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.notification.notify(\n", + " \"These buttons are linked to the Python callback.\",\n", + " actions=[\n", + " {\"label\": \"About\", \"caption\": \"Show help\", \"callback\": lambda: app.commands.execute(\"help:about\")},\n", + " {\n", + " \"label\": \"Show Menu\",\n", + " \"caption\": \"`keep_open` means the notify is left open\",\n", + " \"callback\": lambda: app.commands.execute(\"kernelmenu:open\"),\n", + " \"display_type\": \"accent\",\n", + " \"keep_open\": True,\n", + " },\n", + " {\n", + " \"label\": \"Close Notebook\",\n", + " \"caption\": \"Close this notebook\",\n", + " \"display_type\": \"warn\",\n", + " \"callback\": lambda: app.commands.execute(\"notebook:close-and-shutdown\"),\n", + " },\n", + " ],\n", + " type=ipylab.NotificationType.info,\n", + " auto_close=False,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/plugins.ipynb b/examples/plugins.ipynb new file mode 100644 index 00000000..53dd00c0 --- /dev/null +++ b/examples/plugins.ipynb @@ -0,0 +1,311 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -q ipylab" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plugins\n", + "\n", + "We use the [pluggy](https://pluggy.readthedocs.io/en/stable/index.html#pluggy) plugin system.\n", + "\n", + "Plugins can be either:\n", + "* Manually registered with the `plugin_manager` or\n", + "* defined as an `entrypoint` for modules.\n", + "\n", + "The advantage of using entry points is that the plugin is registered automatically and can run in the always running `iyplab` kernel. But requires the extra effort installing a module with the defined entry point." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Existing hook specs\n", + "from IPython import display as ipd\n", + "\n", + "import ipylab.hookspecs\n", + "\n", + "app = ipylab.App()\n", + "\n", + "display(ipd.Markdown(\"## Plugins\\n\\nThe following plugins (*hookspecs*) are available.\"))\n", + "for n in dir(ipylab.hookspecs):\n", + " f = getattr(ipylab.hookspecs, n)\n", + " if not hasattr(f, \"ipylab_spec\"):\n", + " continue\n", + " display(ipd.Markdown(f\"### `{f.__name__}`\"))\n", + " display(ipd.Markdown(f.__doc__))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Autostart\n", + "\n", + "The `autostart` hookspec is called as when the App is ready.\n", + "\n", + "Possible uses include:\n", + "* Create and register custom commands;\n", + "* Create launchers;\n", + "* Modify the appearance of Jupyterlab." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example launching a small app\n", + "\n", + "The following example demonstrates a few plugins:\n", + "1. `autostart` This is a 'historic' plugin and runs once the app is 'ready'. \n", + "2. `namespace_objects` This allows for modify the namespace feature implemented in ipylab.\n", + "3. `ready` This hook is called for each Ipylab instance when it is ready. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# @myproject.pluginmodule.py\n", + "\n", + "\n", + "async def create_app(app: ipylab.App, cwd=\"\", extra=\"\"):\n", + " # The code in this function is called in the new kernel.\n", + " # Ensure imports are performed inside the function.\n", + " import ipywidgets as ipw\n", + " from IPython import display as ipd\n", + "\n", + " import ipylab\n", + "\n", + " md = f\"\"\"\n", + "## test\n", + "Welcome to my app.\n", + "\n", + "## cwd\n", + "\n", + "The folder in Jupyter tree when opened\n", + "`{cwd=}`\n", + "\n", + "### extra\n", + "\n", + "Extra args provided to the launcher\n", + "`{extra=}`\n", + "\n", + "### Context menu\n", + "Try the context menu with: right click -> Open console\n", + "This console populates with the namespace used for execution plus some namespace defaults.\n", + "\n", + "Then try.\n", + "```python\n", + "\n", + "test # Should print 'Test' as defined in the 'namespace_objects' plugin.\n", + "\n", + "# Now lets load a different namespace is available.\n", + "app.activate_namespace('test')\n", + "dir()\n", + "\n", + "# To switch back use\n", + "\n", + "app.activate_namespace('')\n", + "test # Should raise name error\n", + "\n", + "```\n", + " \"\"\"\n", + "\n", + " panel = ipylab.Panel()\n", + " panel.title.label = app.vpath\n", + " notify_type = ipw.Dropdown(description=\"Notify type\", options=ipylab.NotificationType)\n", + " notify_message = ipw.Combobox(placeholder=\"Enter message\")\n", + " notify_button = ipw.Button(description=\"Notify\")\n", + " notify_button.on_click(lambda _: app.notification.notify(notify_message.value, notify_type.value)) # type: ignore\n", + " box = ipw.HBox([notify_type, notify_message, notify_button], layout={\"align_content\": \"center\"})\n", + "\n", + " out = ipw.Output()\n", + " out.append_display_data(ipd.Markdown(md))\n", + " panel.children = [out, box]\n", + "\n", + " # Do something when the window is closed (shutdown the kernel)\n", + " def observe_connections(change):\n", + " if not change[\"new\"] and panel.comm:\n", + " panel.close()\n", + "\n", + " async def shutdown():\n", + " result = await app.dialog.show_dialog(\"Shutdown kernel?\")\n", + " if result[\"value\"]:\n", + " app.notification.notify(\"Shutting down kernel\", type=ipylab.NotificationType.info)\n", + " app.shutdown_kernel()\n", + "\n", + " app.to_task(shutdown())\n", + "\n", + " # Add a plugin in this kernel. Instead of defining a class, you can also define a module eg: 'ipylab.lib.py'\n", + " class MyLocalPlugin:\n", + " @ipylab.hookimpl\n", + " def namespace_objects(self, objects: dict, namespace_name: str, app: ipylab.App): # noqa: ARG002\n", + " if namespace_name == \"test\":\n", + " objects[\"test\"] = \"TEST\"\n", + "\n", + " @ipylab.hookimpl\n", + " def ready(self, obj: ipylab.Ipylab):\n", + " # TODO: connect log console\n", + " ipd.display(obj)\n", + "\n", + " ipylab.plugin_manager.register(MyLocalPlugin())\n", + "\n", + " app.shell.observe(observe_connections, \"connections\")\n", + " return panel\n", + "\n", + "\n", + "import ipylab # noqa: E402\n", + "\n", + "\n", + "class MyPlugins:\n", + " @ipylab.hookimpl(specname=\"autostart\")\n", + " async def register_commands(self, app: ipylab.App):\n", + " cmd = await app.commands.add_command(\n", + " \"Start my app\",\n", + " execute=app.shell.add,\n", + " args={\n", + " \"obj\": create_app,\n", + " \"vpath\": {\"title\": \"Virtual path for app\"},\n", + " },\n", + " label=\"Start\",\n", + " caption=\"Start my custom app\",\n", + " icon_class=\"jp-PythonIcon\",\n", + " )\n", + " await cmd.add_launcher(\"Ipylab\", extra=\"Ipylab extra arguments\")\n", + "\n", + " @ipylab.hookimpl\n", + " def vpath_getter(self, app: ipylab.App, kwgs: dict): # noqa: ARG002\n", + " # if the ipylab kernel is running the per-kernel widget manager\n", + " if app.per_kernel_widget_manager_detected:\n", + " return None\n", + " return app.vpath\n", + "\n", + "\n", + "pluginmodule = MyPlugins()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Register the plugin\n", + "ipylab.plugin_manager.register(pluginmodule, \"demo plugin\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We should now have a launcher" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.commands.execute(\"launcher:create\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Entry points\n", + "\n", + "Entry points provide for automatic registration for when ipylab is imported.\n", + "\n", + "Add the following in your `pyproject.toml`\n", + "\n", + "``` toml\n", + "[project.entry-points.ipylab]\n", + "myproject = \"myproject.pluginmodule\"\n", + "```\n", + "\n", + "`pluginmodule` is the name of a python file (module) with the '.py' omitted.\n", + "\n", + "It is also possible to define specific objects in the module to load by adding a ':' between the module name and the object. The object should be the name of an instance of a class in the module that defines the plugins.\n", + "\n", + "``` toml\n", + "[project.entry-points.ipylab]\n", + "myproject1 = \"myproject.pluginmodule:plugin1\"\n", + "myproject2 = \"myproject.pluginmodule:plugin2\"\n", + "\n", + "# in pluginmodule:\n", + "\n", + "plugin1 = MyPlugins()\n", + "plugin2 = MyOtherPlugins()\n", + "```\n", + "\n", + "\n", + "### Ipylab kernel (autostart)\n", + "\n", + "**Starting kernels with widgets enabled requires a widget manager capable of running independent of a notebook or console.**\n", + "\n", + "Currently this isn't supported by IpyWidgets. There is an outstanding PR [here](https://github.com/jupyter-widgets/ipywidgets/pull/3922) which enables this. \n", + "\n", + "#### Command\n", + "\n", + "The ipylab kernel can be started/re-started with the command 'Start ipylab kernel' (`Ctrl c` -> 'Start ipylab kernel').\n", + "\n", + "#### Configure\n", + "\n", + "An *autostart* ipylab kernel can be enabled in the configuration settings which will automatically start when Jupyterlab is started (intended to run locally). This provides a means for entry points to be loaded when Jupyterlab is launched.\n", + "\n", + "To change the configuration use the Jupyterlab settings editor: \n", + "\n", + "`Ctrl + ,` \n", + "\n", + "`Ipylab` \n", + "\n", + "`ipylab kernel enabled = True`.\n", + "\n", + "The next time Jupyterlab is started, a kerenel on the path 'ipylab' will be started." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.15" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/sessions.ipynb b/examples/sessions.ipynb index 23437dc4..517579a3 100644 --- a/examples/sessions.ipynb +++ b/examples/sessions.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -22,15 +29,16 @@ "metadata": {}, "outputs": [], "source": [ - "from ipylab import JupyterFrontEnd\n", - "app = JupyterFrontEnd()" + "import ipylab\n", + "\n", + "app = ipylab.App()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## show all sessions from the global `SessionManager` instance" + "## Show all sessions from the global `SessionManager` instance" ] }, { @@ -39,7 +47,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.sessions.running()" + "app.all_sessions" ] }, { @@ -55,7 +63,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.sessions.current_session" + "app.current_session" ] }, { @@ -72,9 +80,25 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.execute(\n", - " 'console:create', \n", - " app.sessions.current_session)" + "app.commands.execute(\"console:create\", app.current_session)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a new Notebook\n", + "\n", + "Create a new notebook and use the connection to interact with the notebook directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = app.commands.execute(\"notebook:create-new\", transform=ipylab.Transform.connection)" ] }, { @@ -83,17 +107,15 @@ "metadata": {}, "outputs": [], "source": [ - "app.commands.execute(\n", - " 'notebook:create-console', \n", - " {})" + "nb = t.result()\n", + "nb # A Connection to the notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Force update session (asynchronous)\n", - "sessions should be updated automatically, you can force a call to `SessionManager.refreshRunning()`" + "We can use the connection to the notebook to do various actions. Lets list the attributes of the context." ] }, { @@ -102,23 +124,22 @@ "metadata": {}, "outputs": [], "source": [ - "import asyncio\n", - "from ipywidgets import Output\n", - "\n", - "out = Output()\n", - "async def refresh_running():\n", - " await app.sessions.refresh_running()\n", - " sesssions = app.sessions.running()\n", - " out.append_stdout('Session Refreshed')\n", - "\n", - "asyncio.create_task(refresh_running())\n", - "out" + "nb.execute_method(\"context.rename\", \"My renamed notebook.ipynb\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nb.close()" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -132,7 +153,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/examples/widgets.ipynb b/examples/widgets.ipynb index d6cecbf5..00d6dd20 100644 --- a/examples/widgets.ipynb +++ b/examples/widgets.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Panels and Widgets" + "**To use this notebook:** Run one line at a time waiting for each cell to return before running the next cell." ] }, { @@ -16,16 +16,37 @@ "%pip install -q ipylab" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Panels and Widgets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Warning for notebooks and consoles\n", + "\n", + "**Do not try to await tasks returned from any ipylab methods, doing so block forever preventing further execution.**\n", + "\n", + "This happens because Ipylab employs custom messages over widget comms and widget comms is blocked during cell execution (in the default kernel and server).\n", + "\n", + "see [Plugins](plugins.ipynb#Example-launching-a-small-app) or [Actions](widgets.ipynb#Notification-Actions) for an example of awaiting the tasks in a coroutine." + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "from ipylab import JupyterFrontEnd, Panel, SplitPanel\n", - "from ipywidgets import IntSlider, Layout\n", + "import ipywidgets as ipw\n", + "\n", + "import ipylab\n", "\n", - "app = JupyterFrontEnd()" + "app = ipylab.App()" ] }, { @@ -34,7 +55,7 @@ "source": [ "## Panel\n", "\n", - "A `Panel` widget is mostly the same as a `VBox`, but with a `Title`." + "A `Panel` widget is the same as a `ipywidget.Box`, but with a `Title` that is used when the panel is added to the application shell." ] }, { @@ -43,10 +64,14 @@ "metadata": {}, "outputs": [], "source": [ - "panel = Panel()\n", - "slider = IntSlider()\n", - "panel.children = [slider]\n", - "panel" + "panel = ipylab.Panel(children=[ipw.Dropdown()])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To quickly add the panel to the JupyterLab *shell* main area:" ] }, { @@ -55,14 +80,42 @@ "metadata": {}, "outputs": [], "source": [ - "panel.title" + "t = panel.add_to_shell(mode=ipylab.InsertMode.split_right, activate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sc = t.result()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sc in panel.connections" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sc in app.shell.connections" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "To add the panel to the JupyterLab main area:" + "`sc` is a `ShellConnection`. \n", + "It provides an `activate` method, and in further may have other features added." ] }, { @@ -71,14 +124,48 @@ "metadata": {}, "outputs": [], "source": [ - "app.shell.add(panel, 'main', { 'mode': 'split-right' })" + "sc.activate() # Will activate before returning to this notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "In the case of sliders and other widgets that fit on a single line, they can even be added to the top area:" + "Closing the connection will remove the panel from the shell and leave the panel open." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sc.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can put it back in the shell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = panel.add_to_shell(mode=ipylab.InsertMode.split_right, activate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sc = t.result()" ] }, { @@ -87,9 +174,15 @@ "metadata": {}, "outputs": [], "source": [ - "inline_panel = Panel()\n", - "inline_panel.children = [slider]\n", - "inline_panel.layout = Layout(overflow='hidden')" + "# closable is on the widget in the shell rather than the panel, but we can set it using set_property.\n", + "t = sc.set_property(\"title.closable\", False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The title label can be updated as required." ] }, { @@ -98,7 +191,56 @@ "metadata": {}, "outputs": [], "source": [ - "app.shell.add(inline_panel, 'top')" + "panel.title.label = \"This panel has a dropdown\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can close the panel and the view will disappear." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "panel.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When the panel is closed sc is also closed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sc" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the case of sliders and other widgets that fit on a single line, they can even be added to the top area directly:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "slider = ipw.IntSlider()\n", + "panel.app.shell.add(slider, area=ipylab.Area.top)" ] }, { @@ -114,7 +256,7 @@ "metadata": {}, "outputs": [], "source": [ - "inline_panel.close()" + "slider.close()" ] }, { @@ -122,8 +264,8 @@ "metadata": {}, "source": [ "## SplitPanel\n", - "\n", - "Now let's create a `SplitPanel` with a few widgets inside." + "A split panel is a subclass of Panel that provides a draggable border between widgets, whose orientatation can be either horizontal or vertical.\n", + "Let's create a `SplitPanel` with a few widgets inside." ] }, { @@ -132,30 +274,30 @@ "metadata": {}, "outputs": [], "source": [ - "from ipywidgets import HBox, IntProgress, jslink\n", - "\n", - "split_panel = SplitPanel()\n", - "progress = IntProgress(\n", + "split_panel = ipylab.SplitPanel()\n", + "progress = ipw.IntProgress(\n", " value=7,\n", " min=0,\n", " max=100,\n", " step=1,\n", - " description='Loading:',\n", - " bar_style='info',\n", - " orientation='horizontal',\n", - " layout=Layout(height='30px')\n", + " description=\"Loading:\",\n", + " bar_style=\"info\",\n", + " orientation=\"horizontal\",\n", + " layout={\"height\": \"30px\"},\n", + ")\n", + "slider_ctrl = ipw.IntSlider(\n", + " min=0,\n", + " max=100,\n", + " step=1,\n", + " description=\"Slider Control:\",\n", ")\n", - "slider_ctrl = IntSlider(min=0, max=100, step=1, description='Slider Control:',)\n", "\n", "# link the slider to the progress bar\n", - "jslink((slider_ctrl, 'value'), (progress, 'value'))\n", + "ipw.jslink((slider_ctrl, \"value\"), (progress, \"value\"))\n", "\n", "# add the widgets to the split panel\n", - "split_panel.children = [\n", - " progress,\n", - " slider_ctrl\n", - "]\n", - "split_panel" + "split_panel.children = [progress, slider_ctrl]\n", + "ipw.Box(children=[split_panel], layout={\"height\": \"100px\"})" ] }, { @@ -164,9 +306,8 @@ "metadata": {}, "outputs": [], "source": [ - "split_panel.title.label = 'A SplitPanel'\n", - "split_panel.title.icon_class = 'jp-PythonIcon'\n", - "split_panel.title.closable = True" + "split_panel.title.label = \"A SplitPanel \"\n", + "split_panel.title.icon_class = \"jp-PythonIcon\"" ] }, { @@ -182,7 +323,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.shell.add(split_panel, 'main', { 'mode': 'split-bottom' })" + "split_panel.add_to_shell(area=ipylab.Area.main, mode=ipylab.InsertMode.split_bottom)" ] }, { @@ -198,7 +339,7 @@ "metadata": {}, "outputs": [], "source": [ - "split_panel.orientation = 'horizontal'" + "split_panel.orientation = \"horizontal\"" ] }, { @@ -214,14 +355,14 @@ "metadata": {}, "outputs": [], "source": [ - "split_panel.orientation = 'vertical'" + "split_panel.orientation = \"vertical\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can add the progress bar one more time:" + "Just like with boxes, we can add an existing widget (the progress bar) more than once:" ] }, { @@ -230,7 +371,7 @@ "metadata": {}, "outputs": [], "source": [ - "split_panel.addWidget(progress)" + "split_panel.children += (progress,)" ] }, { @@ -246,16 +387,9 @@ "metadata": {}, "outputs": [], "source": [ - "from ipywidgets import Play\n", - "\n", - "play = Play(\n", - " min=0,\n", - " max=100,\n", - " step=1,\n", - " description=\"Press play\"\n", - ")\n", - "jslink((play, 'value'), (slider_ctrl, 'value'))\n", - "split_panel.addWidget(play)" + "play = ipw.Play(min=0, max=100, step=1, description=\"Press play\")\n", + "ipw.jslink((play, \"value\"), (slider_ctrl, \"value\"))\n", + "split_panel.children += (play,)" ] }, { @@ -264,7 +398,24 @@ "source": [ "## Left and Right Areas\n", "\n", - "The same `SplitPanel` widget can also be added to the left area:" + "The same `SplitPanel` widget (or `Panel` or `Widget`) can be moved to the left area:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split_panel.add_to_shell(area=ipylab.Area.left, rank=1000)\n", + "split_panel.connections[0].activate()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or to the right area:" ] }, { @@ -273,15 +424,56 @@ "metadata": {}, "outputs": [], "source": [ - "app.shell.add(split_panel, 'left', { 'rank': '0' })\n", - "app.shell.expand_left()" + "split_panel.add_to_shell(area=ipylab.Area.right, rank=1000)\n", + "split_panel.connections[0].activate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = split_panel.app.shell.collapse_right()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "As well as on the right area:" + "Notice how it moved the widget instead of adding a second one?\n", + "\n", + "This is the default behaviour.\n", + "\n", + "To have multiple widgets, provide it with a new `cid` when 'adding' it to the shell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split_panel.add_to_shell(cid=ipylab.ShellConnection.to_cid(), mode=ipylab.InsertMode.split_right)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split_panel.connections[0].activate()\n", + "split_panel.connections" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split_panel.close()" ] }, { @@ -290,8 +482,7 @@ "metadata": {}, "outputs": [], "source": [ - "app.shell.add(split_panel, 'right', { 'rank': '1000' })\n", - "app.shell.expand_right()" + "split_panel.connections" ] } ], @@ -311,14 +502,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } + "version": "3.12.7" } }, "nbformat": 4, diff --git a/ipylab/__init__.py b/ipylab/__init__.py index dfbb3af2..7d8c4e53 100644 --- a/ipylab/__init__.py +++ b/ipylab/__init__.py @@ -1,15 +1,44 @@ -#!/usr/bin/env python -# coding: utf-8 - # Copyright (c) ipylab contributors. # Distributed under the terms of the Modified BSD License. -from ._version import __version__ +from __future__ import annotations # noqa: I001 + +from ipylab._frontend import module_version as __version__ +from ipylab.common import Area, InsertMode, NotificationType, Obj, Transform, hookimpl, pack +from ipylab.ipylab import Ipylab, _get_plugin_manager +from ipylab.connection import Connection, ShellConnection +from ipylab import menu +from ipylab.jupyterfrontend import App +from ipylab.widgets import Icon, Panel, SplitPanel -from .jupyterfrontend import JupyterFrontEnd -from .widgets import Panel, SplitPanel, Icon -from .icon import Icon +__all__ = [ + "__version__", + "Connection", + "ShellConnection", + "Panel", + "SplitPanel", + "Icon", + "Area", + "NotificationType", + "InsertMode", + "hookimpl", + "Transform", + "pack", + "_jupyter_labextension_paths", + "Ipylab", + "App", + "Obj", + "menu", + "JupyterFrontEnd", +] def _jupyter_labextension_paths(): + "Called by Jupyterlab see: jupyterlab.federated_labextensions._get_labextension_metadata." return [{"src": "labextension", "dest": "ipylab"}] + + +plugin_manager = _get_plugin_manager() +del _get_plugin_manager + +JupyterFrontEnd = App diff --git a/ipylab/__main__.py b/ipylab/__main__.py new file mode 100644 index 00000000..456ff0b8 --- /dev/null +++ b/ipylab/__main__.py @@ -0,0 +1,13 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import sys + +if __name__ == "__main__": + if not sys.argv: + sys.argv = ["--ServerApp.token=''"] + from ipylab.scripts import launch_jupyterlab + + launch_jupyterlab() diff --git a/ipylab/_compat/__init__.py b/ipylab/_compat/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ipylab/_compat/enum.py b/ipylab/_compat/enum.py new file mode 100644 index 00000000..3abf86a6 --- /dev/null +++ b/ipylab/_compat/enum.py @@ -0,0 +1,17 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import sys + +if sys.version_info < (3, 11): + from backports.strenum import StrEnum +else: + from enum import StrEnum + +__all__ = ["StrEnum"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/ipylab/_compat/typing.py b/ipylab/_compat/typing.py new file mode 100644 index 00000000..36235efb --- /dev/null +++ b/ipylab/_compat/typing.py @@ -0,0 +1,18 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import sys +from typing import TYPE_CHECKING, Any, TypeAlias, TypedDict + +if sys.version_info < (3, 11): + from typing_extensions import NotRequired, Self, TypedDict, Unpack, override +else: + from typing import NotRequired, Self, TypedDict, Unpack, override + +__all__ = ["NotRequired", "TYPE_CHECKING", "Any", "TypeAlias", "TypedDict", "Self", "Unpack", "override"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/ipylab/_frontend.py b/ipylab/_frontend.py index 2c03d5df..c179f1a6 100644 --- a/ipylab/_frontend.py +++ b/ipylab/_frontend.py @@ -1,4 +1,15 @@ -from ._version import __version__ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import json +import pathlib module_name = "ipylab" -module_version = f"^{__version__}" + +# Read in the javascript version so the exact value can be specified +path = pathlib.Path(__file__).parent.joinpath("labextension", "package.json") +with path.open("rb") as f: + data = json.load(f) +module_version = data["version"] diff --git a/ipylab/commands.py b/ipylab/commands.py index f1a50845..aaef2951 100644 --- a/ipylab/commands.py +++ b/ipylab/commands.py @@ -1,87 +1,296 @@ # Copyright (c) ipylab contributors. # Distributed under the terms of the Modified BSD License. -from collections import defaultdict +from __future__ import annotations -from ipywidgets import CallbackDispatcher, Widget, register -from traitlets import List, Unicode +import functools +import inspect +from typing import TYPE_CHECKING, ClassVar -from ._frontend import module_name, module_version +from ipywidgets import TypedTuple +from traitlets import Bool, Container, Dict, Instance, Tuple, Unicode +from traitlets import Callable as CallableTrait +from ipylab._compat.typing import Any, NotRequired, TypedDict, Unpack, override +from ipylab.common import IpylabKwgs, Obj, TaskHooks, TransformType, pack +from ipylab.connection import Connection +from ipylab.ipylab import Ipylab, IpylabBase, Transform, register +from ipylab.widgets import Icon -def _noop(): - pass +if TYPE_CHECKING: + from asyncio import Task + from collections.abc import Callable, Coroutine -@register -class CommandPalette(Widget): - _model_name = Unicode("CommandPaletteModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) - - _items = List([], read_only=True).tag(sync=True) - - def add_item(self, command_id, category, *, args=None, rank=None): - args = args or {} - self.send( - { - "func": "addItem", - "payload": { - "id": command_id, - "category": category, - "args": args, - "rank": rank, - }, - } +__all__ = ["CommandConnection", "CommandPalletItemConnection", "CommandRegistry"] + + +APP_COMMANDS_NAME = "Jupyterlab" + + +class CommandOptions(TypedDict): + caption: NotRequired[str] + className: NotRequired[str] # noqa: N815 + dataset: NotRequired[Any] + describedBy: NotRequired[dict] # noqa: N815 + iconClass: NotRequired[str] # noqa: N815 + iconLabel: NotRequired[str] # noqa: N815 + isEnabled: NotRequired[bool] # noqa: N815 + isToggled: NotRequired[bool] # noqa: N815 + isVisible: NotRequired[bool] # noqa: N815 + label: NotRequired[str] + mnemonic: NotRequired[str] + usage: NotRequired[str] + + +class CommandConnection(Connection): + """An Ipylab command registered in a command registry.""" + + auto_dispose = Bool(True).tag(sync=True) + + info = Dict() + args = Dict() + python_command = CallableTrait(allow_none=False) + namespace_name = Unicode("") + + _config_options: ClassVar = tuple(CommandOptions.__annotations__) + + @override + @classmethod + def to_cid(cls, commands_name: str, name: str): + return super().to_cid(commands_name, name) + + @property + def commands(self): + return CommandRegistry(name=self.cid.split(self._SEP)[1]) + + @property + def repr_info(self): + return {"name": self.commands.name} | {"info": self.info} + + def configure(self, *, emit=True, **kwgs: Unpack[CommandOptions]) -> Task[CommandOptions]: + if diff := set(kwgs).difference(self._config_options): + msg = f"The following useless configuration options were detected for {diff} in {self}" + raise KeyError(msg) + + async def configure(): + config: CommandOptions = await self.update_property("config", kwgs) # type: ignore + if emit: + await self.commands.execute_method("commandChanged.emit", {"id": self.cid}) + return config + + return self.to_task(configure()) + + def add_launcher(self, category: str, rank=None, **args): + """Add a launcher for this command. + + **args are used when calling the command. + + When this link is closed the launcher will be disposed. + """ + + return self.to_task(self.app.launcher.add(self, category, rank=rank, **args), hooks={"close_with_rev": [self]}) + + def add_to_command_pallet(self, category: str, rank=None, args: dict | None = None): + """Add a pallet item for this command. + + **args are used when calling the command. + + When this link is closed the pallet item will be disposed. + """ + return self.to_task( + self.app.command_pallet.add(self, category, rank=rank, args=args), hooks={"close_with_rev": [self]} ) + def execute(self, args: dict | None = None, **kwgs: Unpack[IpylabKwgs]): + "Execute this command via the frontend. TIP: you can also call python_command directly." + return self.commands.execute(self, args, **kwgs) + + +class CommandPalletItemConnection(Connection): + """An Ipylab command palette item.""" + + auto_dispose = Bool(True).tag(sync=True) + info = Dict() + command = Instance(CommandConnection, ()) + + @override + @classmethod + def to_cid(cls, command: CommandConnection, category: str): + return super().to_cid(str(command), category) + + +class CommandPalette(Ipylab): + """ + + https://jupyterlab.readthedocs.io/en/latest/api/interfaces/apputils.ICommandPalette.html + """ + + SINGLE = True + + ipylab_base = IpylabBase(Obj.IpylabModel, "palette").tag(sync=True) + + info = Dict(help="info about the item") + connections: Container[tuple[CommandPalletItemConnection, ...]] = TypedTuple( + trait=Instance("ipylab.commands.CommandPalletItemConnection") + ) + + def add( + self, command: CommandConnection, category: str, *, rank=None, args: dict | None = None + ) -> Task[CommandPalletItemConnection]: + """Add a command to the command pallet (must be registered in this kernel). + + **args are used when calling the command. + """ + cid = self.remove(command, category) + CommandRegistry._check_belongs_to_application_registry(cid) # noqa: SLF001 + info = {"args": args, "category": category, "command": str(command), "rank": rank} + transform: TransformType = {"transform": Transform.connection, "cid": cid} + hooks: TaskHooks = { + "add_to_tuple_fwd": [(self, "connections")], + "trait_add_fwd": [("info", info), ("command", command)], + "close_with_fwd": [command], + } + return self.execute_method("addItem", info, transform=transform, hooks=hooks) + + def remove(self, command: CommandConnection, category: str): + cid = CommandPalletItemConnection.to_cid(command, category) + if conn := CommandPalletItemConnection.get_existing_connection(cid, quiet=True): + conn.close() + return cid + @register -class CommandRegistry(Widget): +class CommandRegistry(Ipylab): _model_name = Unicode("CommandRegistryModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) + ipylab_base = IpylabBase(Obj.IpylabModel, "").tag(sync=True) + name = Unicode(APP_COMMANDS_NAME, read_only=True, help="Use the default registry").tag(sync=True) + all_commands = Tuple(read_only=True).tag(sync=True) + connections: Container[tuple[CommandConnection, ...]] = TypedTuple(trait=Instance(CommandConnection)) + + @classmethod + @override + def _single_key(cls, kwgs: dict): + return cls, kwgs["name"] - _command_list = List(Unicode, read_only=True).tag(sync=True) - _commands = List([], read_only=True).tag(sync=True) - _execute_callbacks = defaultdict(_noop) + @classmethod + def _check_belongs_to_application_registry(cls, cid: str): + "Check the cid belongs to the application command registry." + if APP_COMMANDS_NAME not in cid: + msg = ( + f"{cid=} doesn't correspond to an ipylab CommandConnection " + f'for the application command registry "{APP_COMMANDS_NAME}". ' + "Use a command registered with `app.commands.add_command` instead." + ) + raise ValueError(msg) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.on_msg(self._on_frontend_msg) + @property + def repr_info(self): + return {"name": self.name} - def _on_frontend_msg(self, _, content, buffers): - if content.get("event", "") == "execute": - command_id = content.get("id") - self._execute_callbacks[command_id]() + def __init__(self, *, name=APP_COMMANDS_NAME, **kwgs): + super().__init__(name=name, **kwgs) - def execute(self, command_id, args=None): - args = args or {} - self.send({"func": "execute", "payload": {"id": command_id, "args": args}}) + @override + async def _do_operation_for_frontend(self, operation: str, payload: dict, buffers: list) -> Any: + match operation: + case "execute": + return await self._execute_for_frontend(payload, buffers) + return await super()._do_operation_for_frontend(operation, payload, buffers) - def list_commands(self): - return self._command_list + async def _execute_for_frontend(self, payload: dict, buffers: list): + conn = Connection.get_existing_connection(payload["id"], quiet=True) + if not isinstance(conn, CommandConnection): + msg = f'Invalid command "{payload["id"]} {conn=}"' + raise TypeError(msg) + cmd = conn.python_command + args = conn.args | (payload.get("args") or {}) | {"buffers": buffers} + glbls = self.app.get_namespace(conn.namespace_name) + kwgs = {} + for n, p in inspect.signature(cmd).parameters.items(): + if n in args: + kwgs[n] = args[n] + elif n in glbls: + kwgs[n] = glbls[n] + elif p.kind is p.VAR_KEYWORD: + kwgs = args + break + elif p.default is p.empty: + msg = f"Required parameter '{n}' missing for {cmd} of {conn}" + raise NameError(msg) + glbls["_to_eval"] = functools.partial(cmd, **kwgs) + result = eval("_to_eval()", glbls) # noqa: S307 + if inspect.isawaitable(result): + result = await result + return result def add_command( - self, command_id, execute, *, caption="", label="", icon_class="", icon=None - ): - if command_id in self._command_list: - raise Exception(f"Command {command_id} is already registered") - # TODO: support other parameters (isEnabled, isVisible...) - self._execute_callbacks[command_id] = execute - self.send( - { - "func": "addCommand", - "payload": { - "id": command_id, - "caption": caption, - "label": label, - "iconClass": icon_class, - "icon": f"IPY_MODEL_{icon.model_id}" if icon else None, - }, - } + self, + name: str, + execute: Callable[..., Coroutine | Any], + *, + caption="", + label="", + icon_class: str | None = None, + icon: Icon | None = None, + args: dict | None = None, + namespace_name="", + **kwgs, + ) -> Task[CommandConnection]: + """Add a python command that can be executed by Jupyterlab. + + name: str + The suffix for the 'id'. + execute: + + args: dict | None + Mapping of default arguments to provide. + kwgs: + Additional ICommandOptions can be passed as kwgs + + ref: https://lumino.readthedocs.io/en/latest/api/interfaces/commands.CommandRegistry.ICommandOptions.html + """ + cid = self.remove_command(name) + hooks: TaskHooks = { + "add_to_tuple_fwd": [(self, "connections")], + "trait_add_fwd": [("namespace_name", namespace_name), ("python_command", execute), ("args", args or {})], + } + return self.operation( + "addCommand", + id=cid, + caption=caption, + label=label or name, + iconClass=icon_class, + transform={"transform": Transform.connection, "cid": cid}, + icon=f"{pack(icon)}.labIcon" if isinstance(icon, Icon) else None, + toObject=["icon"] if isinstance(icon, Icon) else [], + hooks=hooks, + **kwgs, ) - def remove_command(self, command_id): - # TODO: check whether to keep this method, or return disposables like in lab - self.send({"func": "removeCommand", "payload": {"id": command_id}}) + def remove_command(self, command: str | CommandConnection): + cid = command.cid if isinstance(command, CommandConnection) else CommandConnection.to_cid(self.name, command) + if conn := Connection.get_existing_connection(cid, quiet=True): + conn.close() + return cid + + def execute(self, command_id: str | CommandConnection, args: dict | None = None, **kwgs: Unpack[IpylabKwgs]): + """Execute a command in the registry. + + `args` are passed to the command. + + see: https://github.com/jtpio/ipylab/issues/128#issuecomment-1683097383 for hints + about what args can be used. + """ + + async def execute_command(): + id_ = str(command_id) + async with self as cmd: + if id_ not in cmd.all_commands: + id_ = CommandConnection.to_cid(cmd.name, id_) + if id_ not in cmd.all_commands: + msg = f"Command '{command_id}' not registered!" + raise ValueError(msg) + return await cmd.operation("execute", id=id_, args=args or {}, **kwgs) + + return self.to_task(execute_command()) diff --git a/ipylab/common.py b/ipylab/common.py new file mode 100644 index 00000000..240401c8 --- /dev/null +++ b/ipylab/common.py @@ -0,0 +1,242 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import inspect +import typing +from typing import TYPE_CHECKING, Any, Literal + +import pluggy +from ipywidgets import Widget, widget_serialization + +import ipylab +from ipylab._compat.enum import StrEnum +from ipylab._compat.typing import NotRequired, TypedDict + +__all__ = ["Area", "Obj", "InsertMode", "Transform", "TransformType", "hookimpl", "pack", "IpylabKwgs"] + +hookimpl = pluggy.HookimplMarker("ipylab") # Used for plugins + +if TYPE_CHECKING: + from collections.abc import Awaitable, Callable + from typing import TypeVar, overload + + from traitlets import HasTraits + + from ipylab.ipylab import Ipylab + + T = TypeVar("T") + + @overload + def pack(obj: Widget) -> str: ... + @overload + def pack(obj: inspect._SourceObjectType) -> str: ... # Technically only modules and functions. + @overload + def pack(obj: T) -> T: ... + + +def pack(obj): + "Return serialized obj if it is a Widget or string if code else passes through." + + if isinstance(obj, Widget): + return widget_serialization["to_json"](obj, None) + if inspect.isfunction(obj) or inspect.ismodule(obj): + return inspect.getsource(obj) + return obj + + +class Obj(StrEnum): + "The objects available to use as 'obj' in the Frontend." + + this = "this" + base = "base" + # These provides static access to the class + IpylabModel = "IpylabModel" + MainMenu = "MainMenu" + + +class Area(StrEnum): + # https://github.com/jupyterlab/jupyterlab/blob/da8e7bda5eebd22319f59e5abbaaa9917872a7e8/packages/application/src/shell.ts#L500 + main = "main" + left = "left" + right = "right" + header = "header" + top = "top" + bottom = "bottom" + down = "down" + menu = "menu" + + +class InsertMode(StrEnum): + # ref https://lumino.readthedocs.io/en/latest/api/types/widgets.DockLayout.InsertMode.html + split_top = "split-top" + split_left = "split-left" + split_right = "split-right" + split_bottom = "split-bottom" + merge_top = "merge-top" + merge_left = "merge-left" + merge_right = "merge-right" + merge_bottom = "merge-bottom" + tab_before = "tab-before" + tab_after = "tab-after" + + +class ErrorSource(StrEnum): + FrontendError = "Frontend error" + TaskError = "Task error" + SendError = "Send error" + MessageError = "Message processing error" + OperationForFrontendError = "Operation for frontend error" + EnsureRun = "Ensure run" + + +class Transform(StrEnum): + """An eumeration of transformations to apply to the result of an operation + performed on the Frontend prior to returning to Python and transformation + of the result in python. + + Transformations that require parameters can be specified as dict with the key `transform`. + + - auto: [default] Raw data or a connection. + - connection: Return a connection to a disposable object in the frontend. + - function: Use a function to calculate the return value. ['code'] = 'function...' + - advanced: A mapping of keys to transformations to apply sequentially on the object. + + `function` + -------- + JS code defining a function and the data to return. + + The function must accept two args: obj, options. + + ``` + transform = { + "transform": Transform.function, + "code": "function (obj, options) { return obj.id; }", + } + + transform = { + "transform": Transform.connection, + "cid": "ID TO USE FOR CONNECTION", + } + + `advanced` + --------- + ``` + transform = { + "transform": Transform.advanced, + "mappings": {path: TransformType, ...} + } + ``` + """ + + auto = "auto" + null = "null" + function = "function" + connection = "connection" + advanced = "advanced" + + @classmethod + def validate(cls, transform: TransformType): + """Return a valid copy of the transform.""" + if isinstance(transform, dict): + match cls(transform["transform"]): + case cls.function: + code = transform.get("code") + if not isinstance(code, str) or not code.startswith("function"): + raise TypeError + return TransformDictFunction(transform=Transform.function, code=code) + case cls.connection: + cid = transform.get("cid") + if cid and not cid.startswith(ipylab.Connection._PREFIX): # noqa: SLF001 + msg = f"'cid' should start with '{ipylab.Connection._PREFIX}' but got {cid=}" # noqa: SLF001 + raise ValueError(msg) + return TransformDictConnection(transform=Transform.connection, cid=cid) + case cls.advanced: + mappings = {} + transform_ = TransformDictAdvanced(transform=Transform.advanced, mappings=mappings) + mappings_ = transform.get("mappings") + if not isinstance(mappings_, dict): + raise TypeError + for pth, tfm in mappings_.items(): + mappings[pth] = cls.validate(tfm) + return transform_ + case _: + raise NotImplementedError + transform_ = Transform(transform) + if transform_ in [Transform.function, Transform.advanced]: + msg = "This type of transform should be passed as a dict to provide the additional arguments" + raise ValueError(msg) + return transform_ + + @classmethod + def transform_payload(cls, transform: TransformType, payload): + """Transform the payload according to the transform.""" + transform_ = transform["transform"] if isinstance(transform, dict) else transform + match transform_: + case Transform.advanced: + mappings = typing.cast(TransformDictAdvanced, transform)["mappings"] + return {key: cls.transform_payload(mappings[key], payload[key]) for key in mappings} + case Transform.connection | Transform.auto if isinstance(payload, dict) and (cid := payload.get("cid")): + conn = ipylab.Connection(cid) + conn._check_closed() # noqa: SLF001 + return conn + return payload + + +class NotificationType(StrEnum): + info = "info" + progress = "in-progress" + success = "success" + warning = "warning" + error = "error" + default = "default" + + +class TransformDictFunction(TypedDict): + transform: Literal[Transform.function] + code: str + + +class TransformDictAdvanced(TypedDict): + transform: Literal[Transform.advanced] + mappings: dict[str, TransformType] + + +class TransformDictConnection(TypedDict): + transform: Literal[Transform.connection] + cid: NotRequired[str | None] + + +TransformType = Transform | TransformDictAdvanced | TransformDictFunction | TransformDictConnection + + +class IpylabKwgs(TypedDict): + transform: NotRequired[TransformType] + toLuminoWidget: NotRequired[list[str]] # noqa: N815 + toObject: NotRequired[list[str]] # noqa: N815 + hooks: NotRequired[TaskHookType] + + +class TaskHooks(TypedDict): + """Hooks to run after successful completion of 'aw' passed to the method "to_task" + and prior to returning. + + This provides a convenient means to set traits of the returned result. + + see: `Hookspec.task_result` + """ + + close_with_fwd: NotRequired[list[Ipylab]] # result is closed when any item in list is closed + close_with_rev: NotRequired[list[Widget]] # + + trait_add_fwd: NotRequired[list[tuple[str, Any]]] + trait_add_rev: NotRequired[list[tuple[HasTraits, str]]] + + add_to_tuple_fwd: NotRequired[list[tuple[HasTraits, str]]] + add_to_tuple_rev: NotRequired[list[tuple[str, Ipylab]]] + + callbacks: NotRequired[list[Callable[[Any], None | Awaitable[None]]]] + + +TaskHookType = TaskHooks | None diff --git a/ipylab/connection.py b/ipylab/connection.py new file mode 100644 index 00000000..258d18ad --- /dev/null +++ b/ipylab/connection.py @@ -0,0 +1,159 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import uuid +import weakref +from typing import TYPE_CHECKING, Any, ClassVar + +from ipywidgets import Widget, register +from traitlets import Bool, Dict, Instance, Unicode, observe + +from ipylab._compat.typing import override +from ipylab.ipylab import Ipylab + +if TYPE_CHECKING: + from collections.abc import Generator + from typing import Literal, overload + + from ipylab._compat.typing import Self + + +@register +class Connection(Ipylab): + """This class provides a connection to an object (disposable) in the Frontend. + + `Connection` and subclasses of `Connection` are used extensiviely in ipylab + to provide a connection to an object in the frontend (Javascript). + + Instances of `Connection` are created automatically when the transform is + set as `Transform.connection` and also for `Transform.auto` when the payload + looks like it is `disposable`. + + Each subclass of `Connection` is designated a prefix derived from the subclass + name. Creating a new object will create an instance of the correct class + according to the `cid`. Only one instance of an object will exist per `cid` + in a kernel. + + Closing a connection will also disposed of the object in the frontend by + default. This can be disabled by specify `dispose=False` or setting the + trait (property) `auto_dispose=False`. + + See also `Transform.connection` for further detail about transforms. + """ + + _CLASS_DEFINITIONS: ClassVar[dict[str, type[Self]]] = {} + _PREFIX = "ipylab-" + _SEP = "|" + prefix: ClassVar = f"{_PREFIX}Connection{_SEP}" + + _connections: weakref.WeakValueDictionary[str, Self] = weakref.WeakValueDictionary() + _model_name = Unicode("ConnectionModel").tag(sync=True) + cid = Unicode(read_only=True, help="connection id").tag(sync=True) + _dispose = Bool(read_only=True).tag(sync=True) + ipylab_base = None + + auto_dispose = Bool(False, read_only=True, help="Dispose of the object in frontend when closed.").tag(sync=True) + info: Dict | None = None + + def __init_subclass__(cls, **kwargs) -> None: + cls.prefix = f"{cls._PREFIX}{cls.__name__}{cls._SEP}" + cls._CLASS_DEFINITIONS[cls.prefix.strip(cls._SEP)] = cls + super().__init_subclass__(**kwargs) + + def __new__(cls, cid: str, **kwgs): + inst = cls._connections.get(cid) + if not inst: + cls = cls._CLASS_DEFINITIONS[cid.split(cls._SEP, maxsplit=1)[0]] + cls._connections[cid] = inst = super().__new__(cls, **kwgs) + return inst + + def __init__(self, cid: str, **kwgs): + super().__init__(cid=cid, **kwgs) + + def __str__(self): + return self.cid + + @property + @override + def repr_info(self): + if self.info: + return {"cid": self.cid, "info": self.info} + return {"cid": self.cid} + + @classmethod + def to_cid(cls, *args: str) -> str: + """Generate a cid.""" + args = tuple(aa for a in args if (aa := a.strip())) + if args and args[0].startswith(cls.prefix): + if len(args) != 1: + msg = "Extending a cid with extra args is not allowed!" + raise ValueError(msg) + return args[0] + if not args: + args = (str(uuid.uuid4()),) + return cls.prefix + cls._SEP.join(args) + + @classmethod + def get_instances(cls) -> Generator[Self, Any, None]: + "Get all instances of this class (including subclasses)." + for item in cls._connections.values(): + if isinstance(item, cls): + yield item + + @observe("comm") + def _connection_observe_comm(self, _): + if not self.comm: + self._connections.pop(self.cid, None) + + def close(self, *, dispose=True): + """Permanently close the widget. + + dispose: bool + Whether to dispose of the object at the frontend.""" + self.set_trait("auto_dispose", dispose) + super().close() + + if TYPE_CHECKING: + + @overload + @classmethod + def get_existing_connection(cls, cid: str, *, quiet: Literal[False]) -> Self: ... + @overload + @classmethod + def get_existing_connection(cls, cid: str, *, quiet: Literal[True]) -> Self | None: ... + @overload + @classmethod + def get_existing_connection(cls, cid: str) -> Self: ... + + @classmethod + def get_existing_connection(cls, cid: str, *, quiet=False): + """Get an existing connection. + + quiet: bool + True: Raise a value error if the connection does not exist. + False: Return None. + """ + conn = cls._connections.get(cid) + if not conn and not quiet: + msg = f"A connection does not exist with '{cid=}'" + raise ValueError(msg) + return conn + + +Connection._CLASS_DEFINITIONS[Connection.prefix.strip(Connection._SEP)] = Connection # noqa: SLF001 + + +class ShellConnection(Connection): + "Provides a connection to a widget loaded in the shell" + + _model_name = Unicode("ShellConnectionModel").tag(sync=True) + + widget = Instance(Widget, allow_none=True, default_value=None, help="The widget that has the view") + auto_dispose = Bool(True).tag(sync=True) + + def activate(self): + "Activate the connected widget in the shell." + + return self.operation("activate") diff --git a/ipylab/dialog.py b/ipylab/dialog.py new file mode 100644 index 00000000..95899a12 --- /dev/null +++ b/ipylab/dialog.py @@ -0,0 +1,150 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from ipywidgets import Widget +from traitlets import Unicode + +from ipylab import Ipylab + +if TYPE_CHECKING: + from asyncio import Task + from typing import Any + + +class Dialog(Ipylab): + _model_name = Unicode("DialogModel", help="Name of the model.", read_only=True).tag(sync=True) + + def get_boolean(self, title: str) -> Task[bool]: + """Jupyter dialog to get a boolean value. + see: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#input-dialogs + """ + return self.operation("getBoolean", title=title) + + def get_item(self, title: str, items: tuple | list) -> Task[str]: + """Jupyter dialog to get an item from a list value. + + note: will always return a string representation of the selected item. + see: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#input-dialogs + """ + return self.operation("getItem", title=title, items=tuple(items)) + + def get_number(self, title: str) -> Task[float]: + """Jupyter dialog to get a number. + see: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#input-dialogs + """ + return self.operation("getNumber", title=title) + + def get_text(self, title: str) -> Task[str]: + """Jupyter dialog to get a string. + see: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#input-dialogs + """ + return self.operation("getText", title=title) + + def get_password(self, title: str) -> Task[str]: + """Jupyter dialog to get a number. + see: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#input-dialogs + """ + return self.operation("getPassword", title=title) + + def show_dialog( + self, title: str = "", body: str | Widget = "", host: None | Widget = None, **kwgs + ) -> Task[dict[str, Any]]: + """Jupyter dialog to get user response with custom buttons and checkbox. + + returns {'value':any, 'isChecked':bool|None} + + 'value' is the button 'accept' value of the selected button. + + title: 'Dialog title', // Can be text or a react element + body: 'Dialog body', // Can be text, a widget or a react element + host: document.body, // Parent element for rendering the dialog + specify kwgs passed as below. + buttons: [ // List of buttons + buttons=[ + { + "ariaLabel": "Accept", + "label": "Accept", + "iconClass": "", + "iconLabel": "", + "caption": "Accept the result", + "className": "", + "accept": False, + "actions": [], + "displayType": "warn", + }, + { + "ariaLabel": "Cancel", + "label": "Cancel", + "iconClass": "", + "iconLabel": "", + "caption": "", + "className": "", + "accept": False, + "actions": [], + "displayType": "default", + }, + ], + ], + ], + checkbox: { // Optional checkbox in the dialog footer + label: 'check me', // Checkbox label + caption: 'check me I\'magic', // Checkbox title + className: 'my-checkbox', // Additional checkbox CSS class + checked: true, // Default checkbox state + }, + defaultButton: 0, // Index of the default button + focusNodeSelector: '.my-input', // Selector for focussing an input element when dialog opens + hasClose: false, // Whether to display a close button or not + renderer: undefined // To define customized dialog structure + + + source: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#generic-dialog + """ + return self.operation( + "showDialog", + title=title, + body=body, + host=host, + toLuminoWidget=["body"] if isinstance(body, Widget) else None, + **kwgs, + ) + + def show_error_message( + self, title: str, error: str, buttons: None | list[dict[str, str | list[str]]] = None + ) -> Task[None]: + """Jupyter error message. + + buttons = [ + { + "ariaLabel": "Accept error", + "label": "Okay", + "iconClass": "", + "iconLabel": "", + "caption": "", + "className": 'error-circle', + "accept": False, + "actions": [], + "displayType": "warn", + } + ] + + https://jupyterlab.readthedocs.io/en/stable/api/functions/apputils.showErrorMessage.html#showErrorMessage + """ + return self.operation("showErrorMessage", title=title, error=error, buttons=buttons) + + def get_open_files(self, **kwgs) -> Task[list[str]]: + """Get a list of files + + https://jupyterlab.readthedocs.io/en/latest/api/functions/filebrowser.FileDialog.getOpenFiles.html#getOpenFiles + """ + return self.operation("getOpenFiles", **kwgs) + + def get_existing_directory(self, **kwgs) -> Task[str]: + """ + https://jupyterlab.readthedocs.io/en/latest/api/functions/filebrowser.FileDialog.getExistingDirectory.html#getExistingDirectory + """ + return self.operation("getExistingDirectory", **kwgs) diff --git a/ipylab/hookspecs.py b/ipylab/hookspecs.py new file mode 100644 index 00000000..0a5ac1f5 --- /dev/null +++ b/ipylab/hookspecs.py @@ -0,0 +1,139 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +from typing import TYPE_CHECKING, Literal + +import pluggy + +hookspec = pluggy.HookspecMarker("ipylab") + +if TYPE_CHECKING: + from collections.abc import Awaitable, Callable + + import ipylab + from ipylab import App + from ipylab.common import ErrorSource, IpylabKwgs + + +@hookspec(firstresult=True) +def start_app(vpath: str) -> App: # type: ignore + """Start the App + + This is called when a new kernel is created. + + Args + ---- + + vpath: str + The path (virtual path) used for the session. + """ + + +@hookspec() +def ready(obj: ipylab.Ipylab) -> None | Awaitable[None]: + """ + Called by `obj` when it is ready. + + Return a coro or awaitable for it to run as a task in the obj. + """ + + +@hookspec(historic=True) +async def autostart(app: ipylab.App) -> None | Awaitable[None]: + """ + Called when the `app` is ready. + + Historic + -------- + + This plugin is historic so will be called when a plugin is registered if the + app is already ready. + """ + + +@hookspec(firstresult=True) +def ensure_run(obj: ipylab.Ipylab, aw: Callable | Awaitable | None) -> None | Literal[True]: + """ + Used by ipylab to ensure 'aw' has been run. + + see lib.ensure_run for further detail. + """ + + +@hookspec(firstresult=True) +def namespace_objects(objects: dict, namespace_name: str, app: ipylab.App) -> None: + """ + Called when loading a namespace. + + You can use this to customise the objects available in the namespace.""" + + +@hookspec(firstresult=True) +def on_error(obj: ipylab.Ipylab, source: ErrorSource, error: Exception): + """ + Intercept an error message for logging purposes. + + Fired when an exception occurs trying to process a message from the frontend. + + Args + ---- + + obj: ipylab.Ipylab + The object from where the error. + + aw: Awaitable + The awaitable object running in the task. + + error: Exception + The exception. + """ + + +@hookspec +def opening_console(app: ipylab.App, args: dict, objects: dict, kwgs: IpylabKwgs) -> None | Awaitable[None]: + """ + Called when the console is opening. + + Add or remove items from the dicts to alter loading of console. + + Returned awaitables will be awaited prior to proceeding. + + Args + ---- + + app: ipylab.App + + The Ipylab widget that owns the shell connection if there is one. + + args: dict + options used with `open_console`. + keys: [activate, ref (as id), insertMode, type] + + objects: dict + objects for loading into the namespace. + 'ref:(as ShellConnection) is used as the ref for options. This must be a ShellConnection or None. + + kwgs:IpylabKwgs + Added keys 'namesapace_name' the name of the name space to load. + """ + + +@hookspec(firstresult=True) +def vpath_getter(app: ipylab.App, kwgs: dict) -> Awaitable[str] | str: # type: ignore + """ + Resolve with a request for a vpath. + + This is used in conjunction with `app.shell.add` enabling customisation of the vpath. + + vpath is the 'virtual path' for a session. + """ + + +@hookspec +def task_result(obj: ipylab.Ipylab, result, aw: Awaitable, hooks: dict): + """ + Called with the result of a task. + + This is used by ipylab to provide `TaskHooks` to set traits between related objects.""" diff --git a/ipylab/icon.py b/ipylab/icon.py deleted file mode 100644 index 9e62b4d3..00000000 --- a/ipylab/icon.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) ipylab contributors. -# Distributed under the terms of the Modified BSD License. - -from ipywidgets import DOMWidget, register -from traitlets import Unicode, Float -from ._frontend import module_name, module_version - - -@register -class Icon(DOMWidget): - _model_name = Unicode("IconModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) - _view_name = Unicode("IconView").tag(sync=True) - _view_module = Unicode(module_name).tag(sync=True) - _view_module_version = Unicode(module_version).tag(sync=True) - - name = Unicode().tag(sync=True) - svgstr = Unicode().tag(sync=True) diff --git a/ipylab/ipylab.py b/ipylab/ipylab.py new file mode 100644 index 00000000..1412400e --- /dev/null +++ b/ipylab/ipylab.py @@ -0,0 +1,444 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. +from __future__ import annotations + +import asyncio +import contextlib +import json +import logging +import traceback +import uuid +import weakref +from typing import TYPE_CHECKING, Any, TypeVar + +from ipywidgets import Widget, register +from traitlets import Bool, Container, Dict, HasTraits, Instance, Set, TraitError, TraitType, Unicode, default, observe + +import ipylab +import ipylab._frontend as _fe +from ipylab.common import ErrorSource, IpylabKwgs, Obj, TaskHookType, Transform, TransformType, pack +from ipylab.log import LogPayloadType, LogTypes + +if TYPE_CHECKING: + from asyncio import Task + from collections.abc import Awaitable, Callable, Hashable + from typing import ClassVar + + from ipylab import App + from ipylab._compat.typing import Self, Unpack + + +__all__ = ["Ipylab", "WidgetBase"] + +T = TypeVar("T") +L = TypeVar("L", bound="Ipylab") + + +class IpylabBase(TraitType[tuple[str, str], None]): + info_text = "A mapping to the base in the frontend." + read_only = True + + def __init__(self, base: Obj, subpath: str): + "The 'mapping' to the 'base' in the frontend." + self._trait = Unicode() + super().__init__((base, subpath)) + + +class Response(asyncio.Event): + def set(self, payload, error: Exception | None = None) -> None: + if getattr(self, "_value", False): + msg = "Already set!" + raise RuntimeError(msg) + self.payload = payload + self.error = error + super().set() + + async def wait(self) -> Any: + """Wait for a message and return the response.""" + await super().wait() + if self.error: + raise self.error + return self.payload + + +class IpylabFrontendError(IOError): + pass + + +class WidgetBase(Widget): + _model_name = None # Ensure this gets overloaded + _model_module = Unicode(_fe.module_name, read_only=True).tag(sync=True) + _model_module_version = Unicode(_fe.module_version, read_only=True).tag(sync=True) + _view_module = Unicode(_fe.module_name, read_only=True).tag(sync=True) + _view_module_version = Unicode(_fe.module_version, read_only=True).tag(sync=True) + _comm = None + add_traits = None # type: ignore # Don't support the method HasTraits.add_traits as it creates a new type that isn't a subclass of its origin) + app: Instance[App] = Instance("ipylab.App", (), read_only=True) + + +@register +class Ipylab(WidgetBase): + """The base class for Ipylab which has a corresponding Frontend.""" + + SINGLE = False + + _model_name = Unicode("IpylabModel", help="Name of the model.", read_only=True).tag(sync=True) + _python_class = Unicode().tag(sync=True) + ipylab_base = IpylabBase(Obj.this, "").tag(sync=True) + _ready = Bool(read_only=True, help="Set to by frontend when ready").tag(sync=True) + _on_ready_callbacks: Container[set[Callable]] = Set() + + _async_widget_base_init_complete = False + _single_map: ClassVar[dict[Hashable, str]] = {} # single_key : model_id + _single_models: ClassVar[dict[str, Self]] = {} # model_id : Widget + _ready_event = Instance(asyncio.Event, ()) + _comm = None + + _pending_operations: Dict[str, Response] = Dict() + _tasks: Container[set[asyncio.Task]] = Set() + _has_attrs_mappings: Container[set[tuple[HasTraits, str]]] = Set() + close_extras: Container[weakref.WeakSet[Widget]] = Instance(weakref.WeakSet, (), help="extra items to close") # type: ignore + log = Instance(logging.Logger) + + @classmethod + def _single_key(cls, kwgs: dict) -> Hashable: # noqa: ARG003 + """The key used for finding instances when SINGLE is enabled.""" + return cls + + @property + def hook(self): + return ipylab.plugin_manager.hook + + @property + def repr_info(self) -> dict[str, Any] | str: + "Extra info to provide for __repr__." + return {} + + @default("log") + def _default_log(self): + return self.app.log + + def __new__(cls, **kwgs) -> Self: + model_id = kwgs.get("model_id") or cls._single_map.get(cls._single_key(kwgs)) if cls.SINGLE else None + if model_id and model_id in cls._single_models: + return cls._single_models[model_id] + return super().__new__(cls) + + def __init__(self, **kwgs): + if self._async_widget_base_init_complete: + return + # set traits, including read only traits. + model_id = kwgs.pop("model_id", None) + for k in kwgs: + if self.has_trait(k): + self.set_trait(k, kwgs[k]) + self.set_trait("_python_class", self.__class__.__name__) + super().__init__(model_id=model_id) if model_id else super().__init__() + model_id = self.model_id + if not model_id: + msg = "Failed to init comms" + raise RuntimeError(msg) + if key := self._single_key(kwgs) if self.SINGLE else None: + self._single_map[key] = model_id + self._single_models[model_id] = self + self.on_msg(self._on_custom_msg) + self._async_widget_base_init_complete = True + + def __repr__(self): + if not self._repr_mimebundle_: + status = "CLOSED" + elif (not self._ready) and self._repr_mimebundle_: + status = "Not ready" + else: + status = "" + info = ( + ", ".join(f"{k}={v!r}" for k, v in self.repr_info.items()) + if isinstance(self.repr_info, dict) + else self.repr_info + ) + if status: + return f"< {status}: {self.__class__.__name__}({info}) >" + return f"{status}{self.__class__.__name__}({info})" + + async def __aenter__(self): + if not self._ready: + self._check_closed() + await self.ready() + self._check_closed() + return self + + async def __aexit__(self, exc_type, exc, tb): + pass + + @observe("comm", "_ready") + def _observe_comm(self, change: dict): + if not self.comm: + for task in self._tasks: + task.cancel() + self._tasks.clear() + for item in self.close_extras: + item.close() + for obj, name in self._has_attrs_mappings: + if val := getattr(obj, name, None): + if val is self: + with contextlib.suppress(TraitError): + obj.set_trait(name, None) + elif isinstance(val, tuple): + obj.set_trait(name, tuple(v for v in val if v.comm)) + self._on_ready_callbacks.clear() + if self.SINGLE: + self._single_models.pop(change["old"].comm_id, None) # type: ignore + if change["name"] == "_ready": + if self._ready: + self._ready_event.set() + for cb in self.hook.ready(obj=self): + self.hook.ensure_run(obj=self, aw=cb) + for cb in self._on_ready_callbacks: + self.hook.ensure_run(obj=self, aw=cb) + + else: + self._ready_event.clear() + + def _check_closed(self): + if not self._repr_mimebundle_: + msg = f"This widget is closed {self!r}" + raise RuntimeError(msg) + + async def _wrap_awaitable(self, aw: Awaitable[T], hooks: TaskHookType) -> T: + try: + async with self: + if not hooks: + return await aw + result = await aw + try: + self.hook.task_result(obj=self, aw=aw, result=result, hooks=hooks) + except Exception as e: + self.on_error(ErrorSource.TaskError, e) + raise e from None + return result + except Exception as e: + try: + self.on_error(ErrorSource.TaskError, e) + finally: + raise e + + def _task_done_callback(self, task: Task): + self._tasks.discard(task) + # TODO: It'd be great if we could cancel in the frontend. + # Unfortunately it looks like Javascript Promises can't be cancelled. + # https://stackoverflow.com/questions/30233302/promise-is-it-possible-to-force-cancel-a-promise#30235261 + + def _to_error(self, content: dict) -> IpylabFrontendError | None: + error = content["error"] + operation = content.get("operation") + if operation: + msg = ( + f'{self.__class__.__name__} operation "{operation}" failed with message "{error}"' + "\nNote: Additional information may be available in the browser console (press `F12`)" + ) + return IpylabFrontendError(msg) + return IpylabFrontendError(f'{self.__class__.__name__} failed with message "{error}"') + + async def _send_receive(self, content: dict): + async with self: + self._pending_operations[content["ipylab_PY"]] = response = Response() + self.send(content) + try: + payload = await response.wait() + return Transform.transform_payload(content["transform"], payload) + except asyncio.CancelledError: + if not self.comm: + msg = f"This widget is closed {self!r}" + raise asyncio.CancelledError(msg) from None + raise + + def _on_custom_msg(self, _, msg: str, buffers: list): + if not isinstance(msg, str): + return + try: + content = json.loads(msg) + error = self._to_error(content) if "error" in content else None + if "operation" in content: + if "ipylab_PY" in content: + self._pending_operations.pop(content["ipylab_PY"]).set(content.get("payload"), error) + elif "ipylab_FE" in content: + self.to_task(self._do_operation_for_fe(buffers=buffers, **content)) + elif "closed" in content: + self.close() + if error: + self.on_error(ErrorSource.FrontendError, error) + except Exception as e: + self.on_error(ErrorSource.MessageError, e) + raise e from None + + async def _do_operation_for_fe(self, *, ipylab_FE: str, operation: str, payload: dict, buffers: list): + """Handle operation requests from the frontend and reply with a result.""" + content: dict[str, Any] = {"ipylab_FE": ipylab_FE} + buffers = [] + try: + result = await self._do_operation_for_frontend(operation, payload, buffers) + if isinstance(result, dict) and "buffers" in result: + buffers = result["buffers"] + result = result["payload"] + content["payload"] = result + except asyncio.CancelledError: + content["error"] = "Cancelled" + except Exception as e: + content["error"] = { + "repr": repr(e).replace("'", '"'), + "traceback": traceback.format_tb(e.__traceback__), + } + self.on_error(ErrorSource.OperationForFrontendError, e) + finally: + self.send(content, buffers) + + async def _do_operation_for_frontend(self, operation: str, payload: dict, buffers: list): + """Perform an operation for a custom message with an ipylab_FE uuid.""" + raise NotImplementedError(operation) + + def _obj_operation(self, base: Obj, subpath: str, operation: str, ipl_kwgs: IpylabKwgs, **kwgs): + return self.operation( + "genericOperation", genericOperation=operation, basename=base, subpath=subpath, **ipl_kwgs, **kwgs + ) + + def close(self): + self.send({"close": True}) + super().close() + + async def ready(self): + await self.app.ready() + await self._ready_event.wait() + + def on_ready(self, callback, remove=False): # noqa: FBT002 + if remove: + self._on_ready_callbacks.discard(callback) + else: + self._on_ready_callbacks.add(callback) + + def on_error(self, source: ErrorSource, error: Exception): + self.hook.on_error(obj=self, source=source, error=error) + + def add_to_tuple(self, owner: HasTraits, name: str): + """Add self to the tuple of obj.""" + + items = getattr(owner, name) + if self.comm and self not in items: + owner.set_trait(name, (*items, self)) + # see: _observe_comm for removal + self._has_attrs_mappings.add((owner, name)) + + def add_as_trait(self, obj: HasTraits, name: str): + "Add self as a trait to obj." + self._check_closed() + obj.set_trait(name, self) + # see: _observe_comm for removal + self._has_attrs_mappings.add((obj, name)) + + def send(self, content, buffers=None): + try: + super().send(json.dumps(content, default=pack), buffers) + except Exception as e: + self.on_error(ErrorSource.SendError, e) + raise e from None + + def send_log_message(self, log: LogPayloadType): + self.send({"log": LogTypes.parse(log)}) + + def to_task(self, aw: Awaitable[T], name: str | None = None, *, hooks: TaskHookType = None) -> Task[T]: + """Run aw in a task. + + If the task is running when this object is closed the task will be cancel. + Noting the corresponding promise in the frontend will run to completion. + + aw: An awaitable to run in the task. + + name: str + The name of the task. + + hooks: TaskHookType + + """ + + self._check_closed() + task = asyncio.create_task(self._wrap_awaitable(aw, hooks), name=name) + self._tasks.add(task) + task.add_done_callback(self._task_done_callback) + return task + + def operation( + self, + operation: str, + *, + transform: TransformType = Transform.auto, + toLuminoWidget: list[str] | None = None, + toObject: list[str] | None = None, + hooks: TaskHookType = None, + **kwgs, + ) -> Task[Any]: + """Create a new task requesting an operation to be performed in the frontend. + + operation: str + Name corresponding to operation in JS frontend. + + transform : Transform | dict + The transform to apply to the result of the operation. + see: ipylab.Transform + + toLuminoWidget: List[str] | None + A list of item name mappings to convert to a Lumino widget in the frontend + prior to performing the operation. + + toObject: List[str] | None + A list of item name mappings to convert to objects in the frontend prior + to performing the operation. + + hooks: TaskHookType + see: TaskHooks + """ + # validation + self._check_closed() + if not operation or not isinstance(operation, str): + msg = f"Invalid {operation=}" + raise ValueError(msg) + name = str(uuid.uuid4()) + content = { + "ipylab_PY": name, + "operation": operation, + "kwgs": kwgs, + "transform": Transform.validate(transform), + } + if toLuminoWidget: + content["toLuminoWidget"] = toLuminoWidget + if toObject: + content["toObject"] = toObject + return self.to_task(self._send_receive(content), name=name, hooks=hooks) + + def execute_method(self, subpath: str, *args, obj=Obj.base, **kwgs: Unpack[IpylabKwgs]): + return self._obj_operation(obj, subpath, "executeMethod", kwgs, args=args) + + def get_property(self, subpath: str, *, obj=Obj.base, null_if_missing=False, **kwgs: Unpack[IpylabKwgs]): + return self._obj_operation(obj, subpath, "getProperty", kwgs, null_if_missing=null_if_missing) + + def set_property(self, subpath: str, value, *, obj=Obj.base, **kwgs: Unpack[IpylabKwgs]): + return self._obj_operation(obj, subpath, "setProperty", kwgs, value=value) + + def update_property(self, subpath: str, value: dict[str, Any], *, obj=Obj.base, **kwgs: Unpack[IpylabKwgs]): + return self._obj_operation(obj, subpath, "updateProperty", kwgs, value=value) + + def list_properties( + self, subpath="", *, obj=Obj.base, depth=3, skip_hidden=True, **kwgs: Unpack[IpylabKwgs] + ) -> Task[dict]: + return self._obj_operation(obj, subpath, "listProperties", kwgs, depth=depth, omitHidden=skip_hidden) + + +def _get_plugin_manager(): + # Only to be run once by __init__ + import pluggy + + from ipylab import hookspecs, lib + + pm = pluggy.PluginManager("ipylab") + pm.add_hookspecs(hookspecs) + pm.register(lib) + pm.load_setuptools_entrypoints("ipylab") + return pm diff --git a/ipylab/jupyterfrontend.py b/ipylab/jupyterfrontend.py index 47f97c48..507c5b7e 100644 --- a/ipylab/jupyterfrontend.py +++ b/ipylab/jupyterfrontend.py @@ -1,50 +1,308 @@ -#!/usr/bin/env python -# coding: utf-8 - # Copyright (c) ipylab contributors. # Distributed under the terms of the Modified BSD License. -import asyncio +from __future__ import annotations + +import functools +import inspect +import logging +from collections import OrderedDict +from typing import TYPE_CHECKING, Any + +import ipywidgets +from IPython.core.getipython import get_ipython +from ipywidgets import Widget, register +from traitlets import Bool, Container, Dict, Instance, Tuple, Unicode, UseEnum, default, observe + +import ipylab +import ipylab.hookspecs +from ipylab import Ipylab, ShellConnection, Transform +from ipylab._compat.typing import Unpack, override +from ipylab.commands import CommandPalette, CommandRegistry +from ipylab.common import InsertMode, IpylabKwgs, Obj, pack +from ipylab.dialog import Dialog +from ipylab.ipylab import IpylabBase +from ipylab.launcher import Launcher +from ipylab.log import IpylabLogHandler, LogLevel +from ipylab.menu import ContextMenu, MainMenu +from ipylab.notification import NotificationManager +from ipylab.sessions import SessionManager +from ipylab.shell import Shell + +if TYPE_CHECKING: + from asyncio import Task + from typing import ClassVar + -from ipywidgets import CallbackDispatcher, Widget, register, widget_serialization -from traitlets import Instance, Unicode -from ._frontend import module_name, module_version +class LastUpdatedDict(OrderedDict): + "Store items in the order the keys were last added" -from .commands import CommandRegistry -from .shell import Shell -from .sessions import SessionManager + # ref: https://docs.python.org/3/library/collections.html#ordereddict-examples-and-recipes + + def __setitem__(self, key, value): + super().__setitem__(key, value) + self.move_to_end(key) @register -class JupyterFrontEnd(Widget): - _model_name = Unicode("JupyterFrontEndModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) +class App(Ipylab): + "A connection to the 'app' in the frontend. A singleton (per kernel) not to be subclassed." + + SINGLE = True + _model_name = Unicode("JupyterFrontEndModel").tag(sync=True) + ipylab_base = IpylabBase(Obj.IpylabModel, "app").tag(sync=True) version = Unicode(read_only=True).tag(sync=True) - shell = Instance(Shell).tag(sync=True, **widget_serialization) - commands = Instance(CommandRegistry).tag(sync=True, **widget_serialization) - sessions = Instance(SessionManager).tag(sync=True, **widget_serialization) - - def __init__(self, *args, **kwargs): - super().__init__( - *args, - shell=Shell(), - commands=CommandRegistry(), - sessions=SessionManager(), - **kwargs, - ) - self._ready_event = asyncio.Event() - self._on_ready_callbacks = CallbackDispatcher() - self.on_msg(self._on_frontend_msg) + current_widget_id = Unicode(read_only=True).tag(sync=True) + logger_level = UseEnum(LogLevel, read_only=True, default_value=LogLevel.warning).tag(sync=True) + current_session = Dict(read_only=True).tag(sync=True) + all_sessions = Tuple(read_only=True).tag(sync=True) + vpath = Unicode(read_only=True).tag(sync=True) + per_kernel_widget_manager_detected = Bool(read_only=True).tag(sync=True) + + shell = Instance(Shell, (), read_only=True) + dialog = Instance(Dialog, (), read_only=True) + commands = Instance(CommandRegistry, (), read_only=True) + command_pallet = Instance(CommandPalette, (), read_only=True) + launcher = Instance(Launcher, (), read_only=True) + session_manager = Instance(SessionManager, (), read_only=True) + main_menu = Instance(MainMenu, (), read_only=True) + context_menu = Instance(ContextMenu, (), read_only=True) + notification = Instance(NotificationManager, (), read_only=True) + console = Instance(ShellConnection, allow_none=True, read_only=True) + log_handler = Instance(logging.Handler, allow_none=True, read_only=True) - def _on_frontend_msg(self, _, content, buffers): - if content.get("event", "") == "lab_ready": - self._ready_event.set() - self._on_ready_callbacks() + active_namespace = Unicode("", read_only=True, help="name of the current namespace") + namespace_names: Container[tuple[str, ...]] = Tuple(read_only=True).tag(sync=True) + _namespaces: Container[dict[str, LastUpdatedDict]] = Dict(read_only=True) # type: ignore + + _ipy_shell = get_ipython() + _ipy_default_namespace: ClassVar = getattr(_ipy_shell, "user_ns", {}) + + def __init_subclass__(cls, **kwargs) -> None: + msg = "Subclassing the `App` class is not allowed!" + raise RuntimeError(msg) + + def __init__(self, **kwgs): + if self._async_widget_base_init_complete: + return + if vpath := kwgs.pop("vpath", None): + self.set_trait("vpath", vpath) + super().__init__(**kwgs) + + def close(self): + "Cannot close" + + @default("log") + def _default_log(self): + logger = logging.getLogger("ipylab") + if isinstance(self.log_handler, logging.Handler): + logger.addHandler(self.log_handler) + return logger + + @default("log_handler") + def _default_log_handler(self): + handler = IpylabLogHandler(self) + fmt = "{name}:{message}" + handler.setFormatter(logging.Formatter(fmt, style="{")) + return handler + + @observe("_ready") + def _app_observe_ready(self, _): + if self._ready: + self.hook.autostart._call_history.clear() # type: ignore # noqa: SLF001 + self.hook.autostart.call_historic(kwargs={"app": self}, result_callback=self._autostart_callback) + + def _autostart_callback(self, result): + self.hook.ensure_run(obj=self, aw=result) + + @property + def repr_info(self): + return {"vpath": self.vpath} + + @override async def ready(self): await self._ready_event.wait() - def on_ready(self, callback, remove=False): - self._on_ready_callbacks.register_callback(callback, remove) + @override + async def _do_operation_for_frontend(self, operation: str, payload: dict, buffers: list) -> Any: + match operation: + case "evaluate": + return await self._evaluate(payload, buffers) + case "shell_eval": + result = await self._evaluate(payload, buffers) + widget = result.get("payload") + if not isinstance(widget, Widget): + msg = f"Expected an Widget but got {type(widget)}" + raise TypeError(msg) + result["payload"] = await self.shell.add(widget, **payload) + return result + case "open_console": + async with ShellConnection(payload["cid"]) as ref: + return await self._open_console( + args=payload.get("args") or {}, + namespace_name=payload.get("namespace_name", ""), + objects={"widget": ref.widget, "ref": ref}, + ) + return await super()._do_operation_for_frontend(operation, payload, buffers) + + async def _open_console(self, args: dict, objects: dict, namespace_name: str, **kwgs: Unpack[IpylabKwgs]): + args = {"path": self.vpath, "insertMode": InsertMode.split_bottom} | args + kwgs["transform"] = {"transform": Transform.connection} + kwgs["namespace_name"] = namespace_name # type: ignore + + # plugins + plugin_results = self.hook.opening_console(app=self, args=args, objects=objects, kwgs=kwgs) + for pr in plugin_results: + if inspect.isawaitable(pr): + await pr + + if "ref" not in args and (ref := objects.get("ref")): + args["ref"] = f"{pack(ref)}.id" + kwgs["toObject"] = [*kwgs.pop("toObject", []), "args.ref"] + + if (namespace_name := kwgs.pop("namespace_name", "")) is not None: # type: ignore + self.activate_namespace(namespace_name, objects=objects) + + conn: ShellConnection = await self.commands.execute("console:open", args, **kwgs) + conn.add_as_trait(self, "console") + if isinstance((widget := objects.get("widget")), ipylab.Panel): + conn.add_as_trait(widget, "console") + return conn + + async def _evaluate(self, options: dict, buffers: list): + """Evaluate code corresponding to a call from 'evaluate'. + + A call to this method should originate from either: + 1. An `evaluate` method call from a subclass of `Ipylab`. + 2. A direct call in the frontend at jfem.evaluate. + + """ + namespace_name = options.get("namespace_name", "") + glbls = self.get_namespace(namespace_name, options | {"buffers": buffers}) + evaluate = options.get("evaluate", {}) + if isinstance(evaluate, str): + evaluate = {"payload": evaluate} + for name, expression in evaluate.items(): + try: + result = eval(expression, glbls, glbls) # noqa: S307 + except SyntaxError: + exec(expression, glbls, glbls) # noqa: S102 + result = next(reversed(glbls.values())) + while callable(result) or inspect.isawaitable(result): + if callable(result): + pnames = set(glbls).intersection(inspect.signature(result).parameters) + kwgs = {name: glbls[name] for name in pnames} + glbls[name] = functools.partial(result, **kwgs) + result = eval(f"{name}()", glbls) # type: ignore # noqa: S307 + if inspect.isawaitable(result): + result = await result + glbls[name] = result + buffers = glbls.pop("buffers", []) + if namespace_name == self.active_namespace: + self.activate_namespace(namespace_name) + else: + self.get_namespace(namespace_name, glbls) + return {"payload": glbls.get("payload"), "buffers": buffers} + + def open_console( + self, + *, + insertMode=InsertMode.split_bottom, + namespace_name="", + activate=True, + objects: dict | None = None, + **kwgs: Unpack[IpylabKwgs], + ) -> Task[ShellConnection]: + """Open a console and activate the namespace. + namespace_name: str + An alternate namespace to load into the console. + """ + args = {"activate": activate, "insertMode": InsertMode(insertMode)} + coro = self._open_console(args, objects=objects or {}, namespace_name=namespace_name, **kwgs) + return self.to_task(coro, "Open console") + + def toggle_log_console(self) -> Task[ShellConnection]: + # How can we check if the log console is open? + return self.commands.execute("logconsole:open", {"source": self.vpath}) + + def shutdown_kernel(self, vpath: str | None = None): + "Shutdown the kernel" + return self.operation("shutdownKernel", vpath=vpath) + + def start_iyplab_python_kernel(self, *, restart=False): + "Start the 'ipylab' Python kernel." + return self.operation("startIyplabKernel", restart=restart) + + def evaluate( + self, + evaluate: dict[str, str | inspect._SourceObjectType] | str, + *, + vpath="", + name="", + namespace_name="", + **kwgs: Unpack[IpylabKwgs], + ): + """Evaluate code in a Python kernel. + + If `vpath` isn't provided a session matching the path will be used, possibly prompting for a kernel. + + evaluate: + An expression to evaluate or execute. + + The evaluation expression will also be called and or awaited until the returned symbol is no + longer callable or awaitable. + String: + If it is string it will be evaluated and returned. + Dict: Advanced usage: + A dictionary of `symbol name` to `expression` mappings to be evaluated in the kernel. + Each expression is evaluated in turn adding the symbol to the namespace. + + Expression can be a the name of a function or class. In which case it will be evaluated + using parameter names matching the signature of the function or class. + + ref: https://docs.python.org/3/library/functions.html#eval + + Once evaluation is complete, the symbols named `payload` and `buffers` will be returned. + vpath: + The path used for the kernel session context. + globals: + The globals namespace includes the follow symbols: + * ipylab + * ipywidgets + * ipw (ipywidgets) + """ + return self.app.operation( + "evaluate", evaluate=evaluate, vpath=vpath, name=name, namespace_name=namespace_name, **kwgs + ) + + def get_namespace(self, name="", objects: dict | None = None): + "Get the 'globals' namespace stored for name." + if self._ipy_shell: + if "" not in self._namespaces: + self._namespaces[""] = LastUpdatedDict(self._ipy_shell.user_ns) + if self.active_namespace == name: + self._namespaces.update(self._ipy_shell.user_ns) + if name not in self._namespaces: + self._namespaces[name] = LastUpdatedDict(self._ipy_default_namespace) + objects = {"ipylab": ipylab, "ipywidgets": ipywidgets, "ipw": ipywidgets, "app": self} | (objects or {}) + self.hook.namespace_objects(objects=objects, namespace_name=name, app=self) + self._namespaces[name].update(objects) + return self._namespaces[name] + + def activate_namespace(self, name="", objects: dict | None = None): + "Sets the ipython/console namespace." + if not self._ipy_shell: + msg = "Ipython shell is not loaded!" + raise RuntimeError(msg) + ns = self.get_namespace(name, objects) + self._ipy_shell.reset() + self._ipy_shell.push(ns) + self.set_trait("active_namespace", name) + + def reset_namespace(self, name: str, *, activate=True, objects: dict | None = None): + "Reset the namespace to default. If activate is False it won't be created." + self._namespaces.pop(name, None) + if activate: + self.activate_namespace(name, objects) diff --git a/ipylab/labapp.py b/ipylab/labapp.py new file mode 100644 index 00000000..e7238745 --- /dev/null +++ b/ipylab/labapp.py @@ -0,0 +1,11 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +from jupyterlab.labapp import LabApp + + +class IPLabApp(LabApp): + pass + # TODO: Add in customisation diff --git a/ipylab/launcher.py b/ipylab/launcher.py new file mode 100644 index 00000000..c9e2f07d --- /dev/null +++ b/ipylab/launcher.py @@ -0,0 +1,55 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from ipywidgets import TypedTuple +from traitlets import Container, Instance + +from ipylab.commands import CommandConnection, CommandPalletItemConnection, CommandRegistry +from ipylab.common import Obj, TaskHooks +from ipylab.connection import Connection +from ipylab.ipylab import Ipylab, IpylabBase, Transform + +if TYPE_CHECKING: + from asyncio import Task + + +__all__ = ["LauncherConnection"] + + +class LauncherConnection(CommandPalletItemConnection): + """An Ipylab launcher item.""" + + +cid: str + + +class Launcher(Ipylab): + """ + ref: https://jupyterlab.readthedocs.io/en/latest/api/interfaces/launcher.ILauncher-1.html""" + + SINGLE = True + + ipylab_base = IpylabBase(Obj.IpylabModel, "launcher").tag(sync=True) + + connections: Container[tuple[LauncherConnection, ...]] = TypedTuple(trait=Instance(LauncherConnection)) + + def add(self, cmd: CommandConnection, category: str, *, rank=None, **args) -> Task[LauncherConnection]: + """Add a launcher for the command (must be registered in this kernel). + + ref: https://jupyterlab.readthedocs.io/en/latest/api/interfaces/launcher.ILauncher.IItemOptions.html + """ + cid = self.remove(cmd, category) + CommandRegistry._check_belongs_to_application_registry(cid) # noqa: SLF001 + hooks: TaskHooks = {"close_with_fwd": [cmd], "add_to_tuple_fwd": [(self, "connections")]} + args = {"command": str(cmd), "category": category, "rank": rank, "args": args} + return self.execute_method("add", args, transform={"transform": Transform.connection, "cid": cid}, hooks=hooks) + + def remove(self, command: CommandConnection, category: str): + cid = LauncherConnection.to_cid(command, category) + if conn := Connection.get_existing_connection(cid, quiet=True): + conn.close() + return cid diff --git a/ipylab/lib.py b/ipylab/lib.py new file mode 100644 index 00000000..47027631 --- /dev/null +++ b/ipylab/lib.py @@ -0,0 +1,133 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import inspect +from asyncio import Task +from typing import TYPE_CHECKING, Any + +from ipywidgets import Widget + +import ipylab +from ipylab.common import ErrorSource, IpylabKwgs, TaskHooks, hookimpl +from ipylab.ipylab import Ipylab +from ipylab.notification import NotifyAction + +objects = {} + +if TYPE_CHECKING: + from collections.abc import Awaitable, Callable + + from traitlets import HasTraits + + from ipylab import App + + +def trait_tuple_add(owner: HasTraits, name: str, value: Any): + items = getattr(owner, name) + if value not in items: + owner.set_trait(name, (*items, value)) + + +@hookimpl +def start_app(vpath: str): + "Default implementation of App and Plugins" + ipylab.App(vpath=vpath) + + +@hookimpl +def on_error(obj: Ipylab, source: ErrorSource, error: Exception): + msg = f"{source} {error}" + obj.log.exception(msg, extra={"source": source, "error": error}) + task = objects.get("error_task") + if isinstance(task, Task): + # Try to minimize the number of notifications. + if not task.done(): + return + task.result().close() + a = NotifyAction(label="📝", caption="Toggle log console", callback=obj.app.toggle_log_console, keep_open=True) + objects["error_task"] = obj.app.notification.notify(msg, type=ipylab.NotificationType.error, actions=[a]) + + +@hookimpl +def ensure_run(obj: ipylab.Ipylab, aw: Callable | Awaitable | None): + try: + if callable(aw): + try: + aw = aw(obj) + except TypeError: + aw = aw() + if inspect.iscoroutine(aw): + obj.to_task(aw, f"Ensure run {aw}") + except Exception as e: + obj.on_error(ErrorSource.EnsureRun, e) + raise + else: + return True + + +@hookimpl +def task_result(obj: Ipylab, result: HasTraits, hooks: TaskHooks): + # close with + for owner in hooks.pop("close_with_fwd", ()): + # Close result with each item. + if isinstance(owner, Ipylab) and isinstance(result, Widget): + if not owner.comm: + result.close() + raise RuntimeError(str(owner)) + owner.close_extras.add(result) + for obj_ in hooks.pop("close_with_rev", ()): + # Close each item with the result. + if isinstance(result, Ipylab): + result.close_extras.add(obj_) + + # tuple add + for owner, name in hooks.pop("add_to_tuple_fwd", ()): + # Add each item of to tuple of result. + if isinstance(result, Ipylab): + result.add_to_tuple(owner, name) + else: + trait_tuple_add(owner, name, result) + for name, value in hooks.pop("add_to_tuple_rev", ()): + # Add the result the the tuple with 'name' for each item. + if isinstance(value, Ipylab): + value.add_to_tuple(result, name) + else: + trait_tuple_add(result, name, value) + + # trait add + for name, value in hooks.pop("trait_add_fwd", ()): + # Set each trait of result with value. + if isinstance(value, Ipylab): + value.add_as_trait(result, name) + else: + result.set_trait(name, value) + for owner, name in hooks.pop("trait_add_rev", ()): + # Set set trait of each value with result. + if isinstance(result, Ipylab): + result.add_as_trait(owner, name) + else: + owner.set_trait(name, result) + + for cb in hooks.pop("callbacks", ()): + ensure_run(obj, cb(result)) + + if hooks: + msg = f"Invalid hooks detected: {hooks}" + raise ValueError(msg) + + +@hookimpl +def opening_console(app: App, args: dict, objects: dict, kwgs: IpylabKwgs): + "no-op" + + +@hookimpl +def vpath_getter(app: App, kwgs: dict) -> Awaitable[str] | str: + return app.dialog.get_text(**kwgs) + + +@hookimpl +def ready(obj: Ipylab): + "Pass through" diff --git a/ipylab/log.py b/ipylab/log.py new file mode 100644 index 00000000..33c263a3 --- /dev/null +++ b/ipylab/log.py @@ -0,0 +1,109 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Any, Literal + +from ipylab._compat.enum import StrEnum +from ipylab._compat.typing import TypedDict + +if TYPE_CHECKING: + from ipywidgets import Widget + + from ipylab import App + +__all__ = ["LogLevel", "LogTypes", "LogPayloadType", "LogPayloadText", "LogPayloadHtml", "LogPayloadOutput"] + + +class LogLevel(StrEnum): + "The log levels available in Jupyterlab" + + debug = "debug" + info = "info" + warning = "warning" + error = "error" + critical = "critical" + + @classmethod + def to_numeric(cls, value: LogLevel | int): + return log_name_mappings[LogLevel(value)] + + @classmethod + def to_level(cls, val: LogLevel | int) -> LogLevel: + if isinstance(val, int): + if val >= log_name_mappings[LogLevel.critical]: + return LogLevel.critical + if val >= log_name_mappings[LogLevel.error]: + return LogLevel.error + if val >= log_name_mappings[LogLevel.warning]: + return LogLevel.warning + if val >= log_name_mappings[LogLevel.info]: + return LogLevel.info + return LogLevel.debug + return LogLevel(val) + + +log_name_mappings = { + LogLevel.debug: 10, + LogLevel.info: 20, + LogLevel.warning: 30, + LogLevel.error: 40, + LogLevel.critical: 50, +} + + +class LogTypes(StrEnum): + text = "text" + html = "html" + output = "output" + + @classmethod + def parse(cls, log): + level = LogLevel.to_level(log["level"]) + match LogTypes(log["type"]): + case LogTypes.text: + return LogPayloadText(type=LogTypes.text, level=level, data=log["data"]) + case LogTypes.html: + return LogPayloadHtml(type=LogTypes.html, level=level, data=log["data"]) + case LogTypes.output: + raise NotImplementedError + return LogPayloadOutput(type=LogTypes.output, level=LogLevel(log["level"]), data=log["data"]) + + +class LogPayloadBase(TypedDict): + type: LogTypes + level: LogLevel | int + data: Any + + +class LogPayloadText(LogPayloadBase): + type: Literal[LogTypes.text] + data: str + + +class LogPayloadHtml(LogPayloadText): + type: Literal[LogTypes.html] + + +class LogPayloadOutput(LogPayloadBase): + type: Literal[LogTypes.output] + data: Widget + + +LogPayloadType = LogPayloadBase | LogPayloadText | LogPayloadHtml | LogPayloadOutput + + +class IpylabLogHandler(logging.Handler): + def __init__(self, app: App) -> None: + self.app = app + self.app.observe(self._observe_app_log_level, "logger_level") + super().__init__(LogLevel.to_numeric(self.app.logger_level)) + + def _observe_app_log_level(self, change: dict): + self.setLevel(LogLevel.to_numeric(change["new"])) + + def emit(self, record): + log = LogPayloadText(type=LogTypes.text, level=LogLevel.to_level(record.levelno), data=self.format(record)) + self.app.send_log_message(log) diff --git a/ipylab/menu.py b/ipylab/menu.py new file mode 100644 index 00000000..b980a1b8 --- /dev/null +++ b/ipylab/menu.py @@ -0,0 +1,219 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from ipywidgets import TypedTuple +from traitlets import Bool, Container, Dict, Instance, Union + +from ipylab._compat.typing import override +from ipylab.commands import APP_COMMANDS_NAME, CommandConnection, CommandRegistry +from ipylab.common import Obj, pack +from ipylab.connection import Connection +from ipylab.ipylab import Ipylab, IpylabBase, Transform + +if TYPE_CHECKING: + from asyncio import Task + from typing import Literal + + from ipylab.common import TaskHooks, TransformType + + +__all__ = ["MenuItemConnection", "MenuConnection", "MainMenu", "ContextMenu"] + + +class MenuItemConnection(Connection): + """A connection to an ipylab menu item.""" + + auto_dispose = Bool(True).tag(sync=True) + info = Dict() + menu: Instance[RankedMenu] = Instance("ipylab.menu.RankedMenu") + + +class RankedMenu(Ipylab): + """ + + ref: https://jupyterlab.readthedocs.io/en/4.0 .x/api/classes/ui_components.RankedMenu.html + """ + + connections: Container[tuple[MenuItemConnection, ...]] = TypedTuple(trait=Instance(MenuItemConnection)) + + def add_item( + self, + *, + command: str | CommandConnection = "", + submenu: MenuConnection | None = None, + rank=None, + type: Literal["command", "submenu", "separator"] = "command", # noqa: A002 + **args, + ) -> Task[MenuItemConnection]: + """Add command, subitem or separator. + **args are 'defaults' used with command only. + + ref: https://jupyterlab.readthedocs.io/en/4.0.x/api/classes/ui_components.RankedMenu.html#addItem.addItem-1 + """ + if isinstance(self, ContextMenu): + selector = args.pop("selector") + info = {"rank": rank, "args": args, "type": type, "selector": selector} + else: + info = {"rank": rank, "args": args, "type": type} + to_object = [] + match type: + case "command": + if not command: + msg = "command is required" + raise ValueError(msg) + info["command"] = str(command) + info["args"] = args + case "separator": + pass + case "submenu": + if not isinstance(submenu, MenuConnection): + msg = "`submenu` must be an instance of MenuItemConnection" + raise TypeError(msg) + info["submenu"] = submenu + to_object = ["args[0].submenu"] + case _: + msg = f"Invalid type {type}" + raise ValueError(msg) + hooks: TaskHooks = { + "trait_add_fwd": [("info", info), ("menu", self)], + "close_with_fwd": [self], + "add_to_tuple_fwd": [(self, "connections")], + } + transform: TransformType = {"transform": Transform.connection, "cid": MenuItemConnection.to_cid()} + return self.execute_method("addItem", info, hooks=hooks, transform=transform, toObject=to_object) + + def activate(self): + async def activate(): + await self.app.main_menu.set_property("activeMenu", self, toObject=["value"]) + await self.app.main_menu.execute_method("openActiveMenu") + return self + + return self.to_task(activate()) + + +class MenuConnection(RankedMenu, Connection): + """A connection to a custom menu""" + + auto_dispose = Bool(True).tag(sync=True) + info = Dict() + commands = Instance(CommandRegistry) + + +class Menu(RankedMenu): + SINGLE = True + + ipylab_base = IpylabBase(Obj.IpylabModel, "palette").tag(sync=True) + + commands = Instance(CommandRegistry) + connections: Container[tuple[MenuConnection, ...]] = TypedTuple( + trait=Union([Instance(MenuConnection), Instance(MenuItemConnection)]) + ) + + @classmethod + @override + def _single_key(cls, kwgs: dict): + return cls, kwgs["commands"] + + def __init__(self, *, commands: CommandRegistry, **kwgs): + commands.close_extras.add(self) + super().__init__(commands=commands, **kwgs) + + def create_menu(self, label: str, rank: int = 500) -> Task[MenuConnection]: + "Make a new menu that can be used where a menu is required." + cid = MenuConnection.to_cid() + options = {"id": cid, "label": label, "rank": int(rank)} + hooks: TaskHooks = { + "trait_add_fwd": [("info", options), ("commands", self.commands)], + "add_to_tuple_fwd": [(self, "connections")], + "close_with_fwd": [self], + } + return self.app.execute_method( + "generateMenu", + f"{pack(self.commands)}.base", + options, + (Obj.this, "translator"), + obj=Obj.MainMenu, + toObject=["args[0]", "args[2]"], + transform={"transform": Transform.connection, "cid": cid}, + hooks=hooks, + ) + + +class MainMenu(Menu): + """Direct access to the Jupyterlab main menu. + + ref: https://jupyterlab.readthedocs.io/en/4.0.x/api/classes/mainmenu.MainMenu.html + """ + + SINGLE = True + + ipylab_base = IpylabBase(Obj.IpylabModel, "mainMenu").tag(sync=True) + + edit_menu = Instance(RankedMenu, kw={"ipylab_base": (Obj.IpylabModel, "menu.editMenu")}) + file_menu = Instance(RankedMenu, kw={"basename": (Obj.IpylabModel, "menu.fileMenu")}) + kernel_menu = Instance(RankedMenu, kw={"basename": (Obj.IpylabModel, "menu.kernelMenu")}) + run_menu = Instance(RankedMenu, kw={"basename": (Obj.IpylabModel, "menu.runMenu")}) + settings_menu = Instance(RankedMenu, kw={"basename": (Obj.IpylabModel, "menu.settingsMenu")}) + view_menu = Instance(RankedMenu, kw={"basename": (Obj.IpylabModel, "menu.viewMenu")}) + tabs_menu = Instance(RankedMenu, kw={"basename": (Obj.IpylabModel, "menu.tabsMenu")}) + + @classmethod + @override + def _single_key(cls, kwgs: dict): # noqa: ARG003 + return cls + + def __init__(self): + if self._async_widget_base_init_complete: + return + super().__init__(commands=CommandRegistry(name=APP_COMMANDS_NAME)) + + def add_menu(self, menu: MenuConnection, *, update=True, rank: int = 500) -> Task[None]: + """Add a top level menu to the shell. + + ref: https://jupyterlab.readthedocs.io/en/4.0.x/api/classes/mainmenu.MainMenu.html#addMenu + """ + options = {"rank": rank} + return self.execute_method("addMenu", menu, update, options, toObject=["args[0]"]) + + +class ContextMenu(Menu): + """Menu available on mouse right click.""" + + SINGLE = True + # TODO: Support custom context menus. + # This would require a model similar to CommandRegistryModel. + + ipylab_base = IpylabBase(Obj.IpylabModel, "app.contextMenu").tag(sync=True) + + @classmethod + @override + def _single_key(cls, kwgs: dict): # noqa: ARG003 + return cls + + def __init__(self): + super().__init__(commands=CommandRegistry(name=APP_COMMANDS_NAME)) + + def add_item( + self, + *, + command: str | CommandConnection = "", + selector=".ipylab-MainArea", + submenu: MenuConnection | None = None, + rank=None, + type: Literal["command", "submenu", "separator"] = "command", # noqa: A002 + **args, + ) -> Task[MenuItemConnection]: + """Add command, subitem or separator. + **args are 'defaults' used with command only. + + ref: https://jupyterlab.readthedocs.io/en/stable/extension/extension_points.html#context-menu + """ + return super().add_item(command=command, selector=selector, submenu=submenu, rank=rank, type=type, **args) + + @override + def activate(self): + raise NotImplementedError diff --git a/ipylab/notification.py b/ipylab/notification.py new file mode 100644 index 00000000..14e88b1a --- /dev/null +++ b/ipylab/notification.py @@ -0,0 +1,173 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import inspect +from typing import TYPE_CHECKING, Literal + +import traitlets +from ipywidgets import TypedTuple, register +from traitlets import Bool, Container, Dict, Instance, Unicode + +from ipylab import Connection, NotificationType, Transform, pack +from ipylab._compat.typing import NotRequired, TypedDict, override +from ipylab.common import Obj, TaskHooks, TransformType +from ipylab.ipylab import Ipylab, IpylabBase + +if TYPE_CHECKING: + from asyncio import Task + from collections.abc import Callable, Iterable + from typing import Any + + +__all__ = ["NotificationManager"] + + +class NotifyAction(TypedDict): + label: str + callback: Callable[[], Any] + display_type: NotRequired[Literal["default", "accent", "warn", "link"]] + keep_open: NotRequired[bool] + caption: NotRequired[str] + + +class ActionConnection(Connection): + callback = traitlets.Callable() + + info = Dict(help="info about the item") + auto_dispose = Bool(True).tag(sync=True) + + +class NotificationConnection(Connection): + info = Dict(help="info about the item") + actions: Container[tuple[ActionConnection, ...]] = TypedTuple(trait=Instance(ActionConnection)) + auto_dispose = Bool(True).tag(sync=True) + + def update( + self, + message: str, + type: NotificationType | None = None, # noqa: A002 + *, + auto_close: float | Literal[False] | None = None, + actions: Iterable[NotifyAction | ActionConnection] = (), + ) -> Task[bool]: + args = { + "id": f"{pack(self)}.id", + "message": message, + "type": NotificationType(type) if type else None, + "autoClose": auto_close, + } + to_object = ["args.id"] + + async def update(): + async with self.app.notification as n: + actions_ = [await n._ensure_action(v) for v in actions] # noqa: SLF001 + if actions_: + args["actions"] = list(map(pack, actions_)) # type: ignore + to_object.extend(f"options.actions.{i}" for i in range(len(actions_))) + for action in actions_: + self.close_extras.add(action) + return await n.operation("update", toObject=to_object, args=args) + + return self.to_task(update()) + + +@register +class NotificationManager(Ipylab): + """Create new notifications with access to the notification manager as base. + + ref: https://jupyterlab.readthedocs.io/en/stable/extension/ui_helpers.html#notifications + """ + + SINGLE = True + + _model_name = Unicode("NotificationManagerModel").tag(sync=True) + ipylab_base = IpylabBase(Obj.IpylabModel, "Notification.manager").tag(sync=True) + + connections: Container[tuple[NotificationConnection | ActionConnection, ...]] = TypedTuple( + trait=Instance(Connection) + ) + + @override + async def _do_operation_for_frontend(self, operation: str, payload: dict, buffers: list): + """Overload this function as required.""" + match operation: + case "action_callback": + callback = ActionConnection.get_existing_connection(payload["cid"]).callback + result = callback() + while inspect.isawaitable(result): + result = await result + return result + return await super()._do_operation_for_frontend(operation, payload, buffers) + + async def _ensure_action(self, value: ActionConnection | NotifyAction) -> ActionConnection: + "Create a new action." + if isinstance(value, ActionConnection): + async with value: + return value + return await self.new_action(**value) # type: ignore + + def notify( + self, + message: str, + type: NotificationType = NotificationType.default, # noqa: A002 + *, + auto_close: float | Literal[False] | None = None, + actions: Iterable[NotifyAction | ActionConnection] = (), + ) -> Task[NotificationConnection]: + """Create a new notification. + + To update a notification use the update method of the returned `NotificationConnection`. + + NotifyAction: + label: str + callback: Callable[[], Any] + display_type: NotRequired[Literal["default", "accent", "warn", "link"]] + keep_open: NotRequired[bool] + caption: NotRequired[str] + """ + + options = {"autoClose": auto_close} + info = {"type": NotificationType(type), "message": message, "options": options} + hooks: TaskHooks = { + "add_to_tuple_fwd": [(self, "connections")], + "trait_add_fwd": [("info", info)], + } + + async def notify(): + actions_ = [await self._ensure_action(v) for v in actions] + if actions_: + options["actions"] = actions_ # type: ignore + cid = NotificationConnection.to_cid() + notification: NotificationConnection = await self.operation( + "notification", + message=message, + type=NotificationType(type) if type else None, + options=options, + transform={"transform": Transform.connection, "cid": cid}, + toObject=[f"options.actions[{i}]" for i in range(len(actions_))] if actions_ else [], + ) + return notification + + return self.to_task(notify(), hooks=hooks) + + def new_action( + self, + label: str, + callback: Callable[[], Any], + display_type: Literal["default", "accent", "warn", "link"] = "default", + *, + keep_open: bool = False, + caption: str = "", + ) -> Task[ActionConnection]: + "Create an action to use in a notification." + cid = ActionConnection.to_cid() + info = {"label": label, "displayType": display_type, "keep_open": keep_open, "caption": caption} + transform: TransformType = {"transform": Transform.connection, "cid": cid} + hooks: TaskHooks = { + "trait_add_fwd": [("callback", callback), ("info", info)], + "add_to_tuple_fwd": [(self, "connections")], + "close_with_fwd": [self], + } + return self.operation("createAction", cid=cid, transform=transform, hooks=hooks, **info) diff --git a/ipylab/scripts.py b/ipylab/scripts.py new file mode 100644 index 00000000..b0425a7d --- /dev/null +++ b/ipylab/scripts.py @@ -0,0 +1,12 @@ +# Copyright (c) ipylab contributors. +# Distributed under the terms of the Modified BSD License. + +from __future__ import annotations + +import sys + + +def launch_jupyterlab(): + from ipylab.labapp import IPLabApp + + sys.exit(IPLabApp.launch_instance()) diff --git a/ipylab/sessions.py b/ipylab/sessions.py index 09e7daac..c954c0fb 100644 --- a/ipylab/sessions.py +++ b/ipylab/sessions.py @@ -1,50 +1,27 @@ -#!/usr/bin/env python -# coding: utf-8 - # Copyright (c) ipylab contributors. # Distributed under the terms of the Modified BSD License. -import asyncio - -from ipywidgets import CallbackDispatcher, Widget, register, widget_serialization -from traitlets import List, Unicode, Dict - -from ._frontend import module_name, module_version +from __future__ import annotations +from ipylab.common import Obj +from ipylab.ipylab import Ipylab, IpylabBase -@register -class SessionManager(Widget): - """Expose JupyterFrontEnd.serviceManager.sessions""" - _model_name = Unicode("SessionManagerModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) +class SessionManager(Ipylab): + """ + https://jupyterlab.readthedocs.io/en/latest/api/interfaces/services.Session.IManager.html + """ - # information of the current session - current_session = Dict(read_only=True).tag(sync=True) - # keeps track of the list of sessions - sessions = List([], read_only=True).tag(sync=True) + SINGLE = True - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._refreshed_event = None - self._on_refresh_callbacks = CallbackDispatcher() - self.on_msg(self._on_frontend_msg) + ipylab_base = IpylabBase(Obj.IpylabModel, "app.serviceManager.sessions").tag(sync=True) - def _on_frontend_msg(self, _, content, buffers): - if content.get("event", "") == "sessions_refreshed": - self._refreshed_event.set() - self._on_refresh_callbacks() + def refresh_running(self): + """Force a call to refresh running sessions.""" + return self.execute_method("refreshRunning") - async def refresh_running(self): - """Force a call to refresh running sessions - - Resolved when `SessionManager.runnigSession` resolves + def stop_if_needed(self, path): """ - self.send({"func": "refreshRunning"}) - self._refreshed_event = asyncio.Event() - await self._refreshed_event.wait() - - def running(self): - """List all running sessions managed in the manager""" - return self.sessions + https://jupyterlab.readthedocs.io/en/latest/api/interfaces/services.Session.IManager.html#stopIfNeeded + """ + return self.execute_method("stopIfNeeded", path) diff --git a/ipylab/shell.py b/ipylab/shell.py index f244b047..195b8f69 100644 --- a/ipylab/shell.py +++ b/ipylab/shell.py @@ -1,45 +1,148 @@ # Copyright (c) ipylab contributors. # Distributed under the terms of the Modified BSD License. -from ipywidgets import Widget, register, widget_serialization -from traitlets import List, Unicode -from ._frontend import module_name, module_version - - -@register -class Shell(Widget): - _model_name = Unicode("ShellModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) - - _widgets = List([], read_only=True).tag(sync=True) - - def add(self, widget, area, args=None): - args = args or {} - serialized_widget = widget_serialization["to_json"](widget, None) - self.send( - { - "func": "add", - "payload": { - "serializedWidget": serialized_widget, - "area": area, - "args": args, - }, - } - ) +from __future__ import annotations + +import inspect +from typing import TYPE_CHECKING + +from ipywidgets import TypedTuple, Widget +from traitlets import Container, Instance, Unicode + +import ipylab +from ipylab import Area, InsertMode, Ipylab, ShellConnection, Transform, pack +from ipylab.common import Obj +from ipylab.ipylab import IpylabBase + +if TYPE_CHECKING: + from asyncio import Task + from typing import Literal + + from ipylab.common import TaskHooks + + +__all__ = ["Shell"] + + +class Shell(Ipylab): + """ + Provides access to the shell. + The minimal interface is: + https://jupyterlab.readthedocs.io/en/latest/api/interfaces/application.App.IShell.html + + Likely the full labShell interface. + + ref: https://jupyterlab.readthedocs.io/en/latest/api/interfaces/application.App.IShell.html#add + """ + + SINGLE = True + + _model_name = Unicode("ShellModel", help="Name of the model.", read_only=True).tag(sync=True) + ipylab_base = IpylabBase(Obj.IpylabModel, "app.shell").tag(sync=True) + + connections: Container[tuple[ShellConnection, ...]] = TypedTuple(trait=Instance(ShellConnection)) + + def add( + self, + obj: Widget | inspect._SourceObjectType, + *, + area: Area = Area.main, + activate: bool = True, + mode: InsertMode = InsertMode.tab_after, + rank: int | None = None, + ref: ShellConnection | None = None, + options: dict | None = None, + vpath: str | dict[Literal["title"], str] = "", + **args, + ) -> Task[ShellConnection]: + """ + Add a widget or evaluation to the + [shell](https://jupyterlab.readthedocs.io/en/latest/extension/extension_points.html#shell). + + obj + --- + + When `obj` is NOT a Widget it is assumed `obj` should be evaluated in a python kernel. + vpath: str | dict[literal['title':str]] + **Only relevant for 'evaluate'** + The 'virtual' path for the app. A new kernel will be created if a session + doesn't exist with the same path. + If a dict is provided, a text_dialog will be used to obtain the vpath. + + Note: + The result (payload) of evaluate must be a Widget with a view and NOT a ShellConnection. + + + options: dict + mode: InsertMode + https://jupyterlab.readthedocs.io/en/latest/api/interfaces/docregistry.DocumentRegistry.IOpenOptions.html + + Basic example + ------------- + + The example evaluates code in a session with path="test". A new kernel is started if a + session doesn't exist that has a path = vpath. + ``` + app.shell.add("ipylab.Panel([ipw.HTML('

Test')])", vpath="test") + ``` + """ + cid = args.pop("cid", "") + hooks: TaskHooks = {"add_to_tuple_fwd": [(self, "connections")]} + args["options"] = { + "activate": activate, + "mode": InsertMode(mode), + "rank": int(rank) if rank else None, + "ref": f"{pack(ref)}.id" if isinstance(ref, ShellConnection) else None, + } | (options or {}) + args["area"] = area + + if isinstance(obj, ShellConnection): + if cid and cid != obj.cid: + msg = f"The provided {cid=} does not match {obj.cid=}" + raise RuntimeError(msg) + cid = obj.cid + elif isinstance(obj, Widget): + if not obj._view_name: # noqa: SLF001 + msg = f"This widget does not have a view {obj}" + raise RuntimeError(msg) + if not cid and reversed(self.connections): + for c in self.connections: + if c.widget is obj: + cid = c.cid + break + hooks["trait_add_fwd"] = [("widget", obj)] + if isinstance(obj, ipylab.Panel): + hooks["add_to_tuple_fwd"].append((obj, "connections")) + args["ipy_model"] = obj.model_id + else: + args["evaluate"] = pack(obj) + + args["cid"] = ShellConnection.to_cid(cid) + + async def add_to_shell() -> ShellConnection: + async with self.app as app: + if "evaluate" in args: + if isinstance(vpath, dict): + result = self.hook.vpath_getter(app=app, kwgs=vpath) + while inspect.isawaitable(result): + result = await result + args["vpath"] = result + else: + args["vpath"] = vpath or app.vpath + else: + args["vpath"] = app.vpath + return await self.operation("addToShell", transform=Transform.connection, args=args) + + return self.to_task(add_to_shell(), "Add to shell", hooks=hooks) def expand_left(self): - self.send( - { - "func": "expandLeft", - "payload": {}, - } - ) + return self.execute_method("expandLeft") def expand_right(self): - self.send( - { - "func": "expandRight", - "payload": {}, - } - ) + return self.execute_method("expandRight") + + def collapse_left(self): + return self.execute_method("collapseLeft") + + def collapse_right(self): + return self.execute_method("collapseRight") diff --git a/ipylab/widgets.py b/ipylab/widgets.py index f4996472..8d11bcb5 100644 --- a/ipylab/widgets.py +++ b/ipylab/widgets.py @@ -1,51 +1,134 @@ # Copyright (c) ipylab contributors. # Distributed under the terms of the Modified BSD License. -from ipywidgets import VBox, Widget, register, widget_serialization -from traitlets import Bool, Dict, Instance, Unicode -from ._frontend import module_name, module_version -from .icon import Icon +from __future__ import annotations + +import asyncio +from typing import TYPE_CHECKING + +from ipywidgets import Box, DOMWidget, TypedTuple, register, widget_serialization +from ipywidgets.widgets.trait_types import InstanceDict +from traitlets import Container, Dict, Instance, Unicode, observe + +import ipylab._frontend as _fe +from ipylab.common import Area, InsertMode, IpylabKwgs +from ipylab.connection import ShellConnection +from ipylab.ipylab import WidgetBase + +if TYPE_CHECKING: + from asyncio import Task + + from ipylab import App + from ipylab._compat.typing import Unpack + + +@register +class Icon(DOMWidget, WidgetBase): + _model_name = Unicode("IconModel").tag(sync=True) + _view_name = Unicode("IconView").tag(sync=True) + + name = Unicode().tag(sync=True) + svgstr = Unicode().tag(sync=True) @register -class Title(Widget): +class Title(WidgetBase): _model_name = Unicode("TitleModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) label = Unicode().tag(sync=True) icon_class = Unicode().tag(sync=True) caption = Unicode().tag(sync=True) class_name = Unicode().tag(sync=True) - closable = Bool(True).tag(sync=True) dataset = Dict().tag(sync=True) icon_label = Unicode().tag(sync=True) - - icon = Instance(Icon, allow_none=True).tag(sync=True, **widget_serialization) + # Widgets + icon: Instance[Icon] = InstanceDict(Icon, allow_none=True).tag(sync=True, **widget_serialization) @register -class Panel(VBox): +class Panel(Box): _model_name = Unicode("PanelModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) + _view_name = Unicode("PanelView").tag(sync=True) + _model_module = Unicode(_fe.module_name, read_only=True).tag(sync=True) + _model_module_version = Unicode(_fe.module_version, read_only=True).tag(sync=True) + _view_module = Unicode(_fe.module_name, read_only=True).tag(sync=True) + _view_module_version = Unicode(_fe.module_version, read_only=True).tag(sync=True) + title: Instance[Title] = InstanceDict(Title, ()).tag(sync=True, **widget_serialization) + + app: Instance[App] = Instance("ipylab.App", (), read_only=True) + connections: Container[tuple[ShellConnection, ...]] = TypedTuple(trait=Instance(ShellConnection)) + console = Instance(ShellConnection, (), allow_none=True, read_only=True) - title = Instance(Title).tag(sync=True, **widget_serialization) + def add_to_shell( + self, + *, + area: Area = Area.main, + activate: bool = True, + mode: InsertMode = InsertMode.tab_after, + rank: int | None = None, + ref: ShellConnection | None = None, + options: dict | None = None, + **kwgs, + ) -> Task[ShellConnection]: + """Add this panel to the shell.""" + return self.app.shell.add( + self, + area=area, + mode=mode, + activate=activate, + rank=rank, + ref=ref, + options=options, + **kwgs, + ) - def __init__(self, *args, **kwargs): - super().__init__(*args, title=Title(), **kwargs) + def open_console( + self, + *, + insertMode=InsertMode.split_bottom, + namespace_name="", + activate=True, + **kwgs: Unpack[IpylabKwgs], + ) -> Task[ShellConnection]: + """Open a console and activate the namespace. + namespace_name: str + An alternate namespace to activate. + """ + return self.app.open_console( + objects={"widget": self, "ref": self.connections[-1] if self.connections else None}, + activate=activate, + namespace_name=namespace_name, + insertMode=InsertMode(insertMode), + **kwgs, + ) @register class SplitPanel(Panel): _model_name = Unicode("SplitPanelModel").tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) _view_name = Unicode("SplitPanelView").tag(sync=True) - _view_module = Unicode(module_name).tag(sync=True) - _view_module_version = Unicode(module_version).tag(sync=True) - orientation = Unicode("vertical").tag(sync=True) + _force_update_in_progress = False + + # ============== Start temp fix ============= + # Below here is added as a temporary fix to address issue https://github.com/jtpio/ipylab/issues/129 + + @observe("children", "connections") + def _observer(self, _): + self._rerender() + + def _rerender(self): + """Toggle the orientation to cause lumino_widget.parent to re-render content.""" + + async def force_refresh(children): + if children != self.children: + return + await asyncio.sleep(0.1) + orientation = self.orientation + self.orientation = "horizontal" if orientation == "vertical" else "vertical" + await asyncio.sleep(0.001) + self.orientation = orientation + + return self.app.to_task(force_refresh(self.children)) - def addWidget(self, widget): - self.children = list(self.children) + [widget] + # ============== End temp fix ============= diff --git a/package.json b/package.json index f8d6144c..eef07ac4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipylab", - "version": "1.0.0", + "version": "2.0.0-b3", "description": "Control JupyterLab from Python notebooks", "keywords": [ "jupyter", @@ -13,7 +13,8 @@ "dist/*.js", "style/*.css", "style/*.js", - "style/index.js" + "style/index.js", + "schema/*.json" ], "homepage": "https://github.com/jtpio/ipylab", "bugs": { @@ -49,6 +50,7 @@ "clean:labextension": "rimraf ipylab/labextension ipylab/_version.py", "clean:lib": "rimraf lib tsconfig.tsbuildinfo", "clean:lintcache": "rimraf .eslintcache .stylelintcache", + "deduplicate": "jlpm dlx yarn-berry-deduplicate -s fewerHighest && jlpm install", "eslint": "jlpm eslint:check --fix", "eslint:check": "eslint . --cache --ext .ts,.tsx", "install:extension": "jlpm build", @@ -81,16 +83,25 @@ ] }, "dependencies": { - "@jupyter-widgets/base": "^1 || ^2 || ^3 || ^4 || ^5 || ^6.0.5", - "@jupyter-widgets/controls": "^3 || ^4 || ^5", - "@jupyterlab/application": "^4.0.4", - "@jupyterlab/apputils": "^4.1.4", - "@jupyterlab/observables": "^5.0.4", - "@lumino/algorithm": "^1.9.2 || ^2", - "@lumino/commands": "^1.20.1 || ^2", - "@lumino/disposable": "^1.10.2 || ^2", - "@lumino/messaging": "^1.10.2 || ^2", - "@lumino/widgets": "^1.34.0 || ^2" + "@jupyter-widgets/base": "^6.0.10", + "@jupyter-widgets/controls": "^5.0.11", + "@jupyter-widgets/jupyterlab-manager": "^5.0.13", + "@jupyterlab/application": "^4.2.5", + "@jupyterlab/apputils": "^4.3.5", + "@jupyterlab/console": "^4.2.5", + "@jupyterlab/coreutils": "^6.2.5", + "@jupyterlab/filebrowser": "^4.2.5", + "@jupyterlab/launcher": "^4.2.5", + "@jupyterlab/logconsole": "^4.2.5", + "@jupyterlab/mainmenu": "^4.2.5", + "@jupyterlab/observables": "^5.2.5", + "@jupyterlab/rendermime": "^4.2.5", + "@jupyterlab/settingregistry": "^4.2.5", + "@lumino/commands": "^2.3.1", + "@lumino/disposable": "^2.1.3", + "@lumino/widgets": "^2.5.0", + "react": "^18.3.1", + "webpack": "^5.95.0" }, "devDependencies": { "@jupyterlab/builder": "^4.0.0", @@ -107,14 +118,13 @@ "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.30.1", "expect.js": "^0.3.1", - "fs-extra": "^10.1.0", - "husky": "^8.0.1", - "lint-staged": "^13.0.3", - "mkdirp": "^1.0.4", + "fs-extra": "^11.2.0", + "lint-staged": "^15.2.9", + "mkdirp": "^3.0.1", "npm-run-all": "^4.1.5", "prettier": "^3.0.0", "rimraf": "^5.0.1", - "source-map-loader": "^1.0.2", + "source-map-loader": "^5.0.0", "style-loader": "^3.3.1", "stylelint": "^15.10.1", "stylelint-config-recommended": "^13.0.0", @@ -126,10 +136,19 @@ "jupyterlab": { "extension": "lib/plugin", "outputDir": "ipylab/labextension", + "schemaDir": "schema", "sharedPackages": { "@jupyter-widgets/base": { "bundled": false, "singleton": true + }, + "@jupyter-widgets/controls": { + "bundled": false, + "singleton": true + }, + "@jupyter-widgets/jupyterlab-manager": { + "bundled": false, + "singleton": true } } }, diff --git a/pyproject.toml b/pyproject.toml index 7d24793f..39a07298 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,32 +1,48 @@ [build-system] -requires = ["hatchling>=1.5.0", "jupyterlab>=4.0.0,<5", "hatch-nodejs-version"] +requires = [ + "hatchling>=1.5.0", + "jupyterlab>=4.1.0,<5", + "hatch-nodejs-version>=0.3.2", +] build-backend = "hatchling.build" [project] name = "ipylab" readme = "README.md" license = { file = "LICENSE" } -requires-python = ">=3.8" +requires-python = ">=3.10" classifiers = [ - "Framework :: Jupyter", - "Framework :: Jupyter :: JupyterLab", - "Framework :: Jupyter :: JupyterLab :: 4", - "Framework :: Jupyter :: JupyterLab :: Extensions", - "Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt", - "License :: OSI Approved :: BSD License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", + "Framework :: Jupyter", + "Framework :: Jupyter :: JupyterLab", + "Framework :: Jupyter :: JupyterLab :: 4", + "Framework :: Jupyter :: JupyterLab :: Extensions", + "Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ] + + dependencies = [ - "ipywidgets>=7.6.0,<9" + "jupyterlab>=4.1", + "ipywidgets>=8.1.5", + "jupyterlab_widgets>=3.0.11", + "pluggy~=1.1", + "backports.strenum; python_version < '3.11'", + "typing_extensions; python_version < '3.11'", ] dynamic = ["version", "description", "authors", "urls", "keywords"] +[project.optional-dependencies] +dev = ["hatch", "ruff", "pre-commit"] +test = ["pytest"] + +[project.scripts] +ipylab = "ipylab:scripts.launch_jupyterlab" + [tool.hatch.version] source = "nodejs" @@ -39,17 +55,17 @@ exclude = [".github", "binder"] [tool.hatch.build.targets.wheel.shared-data] "ipylab/labextension" = "share/jupyter/labextensions/ipylab" -"install.json" = "share/jupyter/labextensions/ipylab/install.json" -[tool.hatch.build.hooks.version] -path = "ipylab/_version.py" +[tool.hatch.build.targets.wheel.force-include] +"ipylab/labextension/package.json" = "ipylab/labextension/package.json" + [tool.hatch.build.hooks.jupyter-builder] dependencies = ["hatch-jupyter-builder>=0.5"] build-function = "hatch_jupyter_builder.npm_builder" ensured-targets = [ - "ipylab/labextension/static/style.js", - "ipylab/labextension/package.json", + "ipylab/labextension/static/style.js", + "ipylab/labextension/package.json", ] skip-if-exists = ["ipylab/labextension/static/style.js"] @@ -63,16 +79,30 @@ npm = ["jlpm"] source_dir = "src" build_dir = "ipylab/labextension" +[tool.hatch.envs.hatch-static-analysis] +config-path = "ruff_defaults.toml" + [tool.jupyter-releaser.options] version_cmd = "hatch version" [tool.jupyter-releaser.hooks] -before-build-npm = [ - "python -m pip install 'jupyterlab>=4.0.0,<5'", - "jlpm", - "jlpm build:prod" -] +before-build-npm = ["pip install jupyterlab~=4.1", "jlpm", "jlpm build:prod"] before-build-python = ["jlpm clean:all"] [tool.check-wheel-contents] ignore = ["W002"] + +[tool.ruff] +extend = "ruff_defaults.toml" +target-version = "py310" +src = ['docs'] + +[tool.codespell] +skip = 'yarn.lock,node_modules*,lib,.yarn*,./ipylab*' +ignore-words-list = 'statics' +write = true + +[tool.ruff.lint] +ignore = ["BLE001", "N803"] +[tool.ruff.format] +docstring-code-format = true diff --git a/ruff_defaults.toml b/ruff_defaults.toml new file mode 100644 index 00000000..98860d34 --- /dev/null +++ b/ruff_defaults.toml @@ -0,0 +1,543 @@ +line-length = 120 + +[format] +docstring-code-format = true +docstring-code-line-length = 80 + +[lint] +select = [ + "A001", + "A002", + "A003", + "ARG001", + "ARG002", + "ARG003", + "ARG004", + "ARG005", + "B002", + "B003", + "B004", + "B005", + "B006", + "B007", + "B008", + "B009", + "B010", + "B011", + "B012", + "B013", + "B014", + "B015", + "B016", + "B017", + "B018", + "B019", + "B020", + "B021", + "B022", + "B023", + "B024", + "B025", + "B026", + "B028", + "B029", + "B030", + "B031", + "B032", + "B033", + "B034", + "B035", + "B904", + "B905", + "BLE001", + "C400", + "C401", + "C402", + "C403", + "C404", + "C405", + "C406", + "C408", + "C409", + "C410", + "C411", + "C413", + "C414", + "C415", + "C416", + "C417", + "C418", + "C419", + "COM818", + "DTZ001", + "DTZ002", + "DTZ003", + "DTZ004", + "DTZ005", + "DTZ006", + "DTZ007", + "DTZ011", + "DTZ012", + "E101", + "E401", + "E402", + "E701", + "E702", + "E703", + "E711", + "E712", + "E713", + "E714", + "E721", + "E722", + "E731", + "E741", + "E742", + "E743", + "E902", + "EM101", + "EM102", + "EM103", + "EXE001", + "EXE002", + "EXE003", + "EXE004", + "EXE005", + "F401", + "F402", + "F403", + "F404", + "F405", + "F406", + "F407", + "F501", + "F502", + "F503", + "F504", + "F505", + "F506", + "F507", + "F508", + "F509", + "F521", + "F522", + "F523", + "F524", + "F525", + "F541", + "F601", + "F602", + "F621", + "F622", + "F631", + "F632", + "F633", + "F634", + "F701", + "F702", + "F704", + "F706", + "F707", + "F722", + "F811", + "F821", + "F822", + "F823", + "F841", + "F842", + "F901", + "FA100", + "FA102", + "FBT001", + "FBT002", + "FLY002", + "G001", + "G002", + "G003", + "G004", + "G010", + "G101", + "G201", + "G202", + "I001", + "I002", + "ICN001", + "ICN002", + "ICN003", + "INP001", + "INT001", + "INT002", + "INT003", + "ISC003", + "LOG001", + "LOG002", + "LOG007", + "LOG009", + "N801", + "N802", + "N803", + "N804", + "N805", + "N806", + "N807", + "N811", + "N812", + "N813", + "N814", + "N815", + "N816", + "N817", + "N818", + "N999", + "PERF101", + "PERF102", + "PERF401", + "PERF402", + "PGH005", + "PIE790", + "PIE794", + "PIE796", + "PIE800", + "PIE804", + "PIE807", + "PIE808", + "PIE810", + "PLC0105", + "PLC0131", + "PLC0132", + "PLC0205", + "PLC0208", + "PLC0414", + "PLC3002", + "PLE0100", + "PLE0101", + "PLE0116", + "PLE0117", + "PLE0118", + "PLE0237", + "PLE0241", + "PLE0302", + "PLE0307", + "PLE0604", + "PLE0605", + "PLE1142", + "PLE1205", + "PLE1206", + "PLE1300", + "PLE1307", + "PLE1310", + "PLE1507", + "PLE1700", + "PLE2502", + "PLE2510", + "PLE2512", + "PLE2513", + "PLE2514", + "PLE2515", + "PLR0124", + "PLR0133", + "PLR0206", + "PLR0402", + "PLR1701", + "PLR1711", + "PLR1714", + "PLR1722", + "PLR2004", + "PLR5501", + "PLW0120", + "PLW0127", + "PLW0129", + "PLW0131", + "PLW0406", + "PLW0602", + "PLW0603", + "PLW0711", + "PLW1508", + "PLW1509", + "PLW1510", + "PLW2901", + "PLW3301", + "PT001", + "PT002", + "PT003", + "PT006", + "PT007", + "PT008", + "PT009", + "PT010", + "PT011", + "PT012", + "PT013", + "PT014", + "PT015", + "PT016", + "PT017", + "PT018", + "PT019", + "PT020", + "PT021", + "PT022", + "PT023", + "PT024", + "PT025", + "PT026", + "PT027", + "PYI001", + "PYI002", + "PYI003", + "PYI004", + "PYI005", + "PYI006", + "PYI007", + "PYI008", + "PYI009", + "PYI010", + "PYI011", + "PYI012", + "PYI013", + "PYI014", + "PYI015", + "PYI016", + "PYI017", + "PYI018", + "PYI019", + "PYI020", + "PYI021", + "PYI024", + "PYI025", + "PYI026", + "PYI029", + "PYI030", + "PYI032", + "PYI033", + "PYI034", + "PYI035", + "PYI036", + "PYI041", + "PYI042", + "PYI043", + "PYI044", + "PYI045", + "PYI046", + "PYI047", + "PYI048", + "PYI049", + "PYI050", + "PYI051", + "PYI052", + "PYI053", + "PYI054", + "PYI055", + "PYI056", + "PYI058", + "RET503", + "RET504", + "RET505", + "RET506", + "RET507", + "RET508", + "RSE102", + "RUF001", + "RUF002", + "RUF003", + "RUF005", + "RUF006", + "RUF007", + "RUF008", + "RUF009", + "RUF010", + "RUF012", + "RUF013", + "RUF015", + "RUF016", + "RUF017", + "RUF018", + "RUF019", + "RUF020", + "RUF100", + "S101", + "S102", + "S103", + "S104", + "S105", + "S106", + "S107", + "S108", + "S110", + "S112", + "S113", + "S201", + "S202", + "S301", + "S302", + "S303", + "S304", + "S305", + "S306", + "S307", + "S308", + "S310", + "S311", + "S312", + "S313", + "S314", + "S315", + "S316", + "S317", + "S318", + "S319", + "S320", + "S321", + "S323", + "S324", + "S501", + "S502", + "S503", + "S504", + "S505", + "S506", + "S507", + "S508", + "S509", + "S601", + "S602", + "S604", + "S605", + "S606", + "S607", + "S608", + "S609", + "S611", + "S612", + "S701", + "S702", + "SIM101", + "SIM102", + "SIM103", + "SIM105", + "SIM107", + "SIM108", + "SIM109", + "SIM110", + "SIM112", + "SIM113", + "SIM114", + "SIM115", + "SIM116", + "SIM117", + "SIM118", + "SIM201", + "SIM202", + "SIM208", + "SIM210", + "SIM211", + "SIM212", + "SIM220", + "SIM221", + "SIM222", + "SIM223", + "SIM300", + "SIM910", + "SIM911", + "SLF001", + "SLOT000", + "SLOT001", + "SLOT002", + "T100", + "T201", + "T203", + "TCH001", + "TCH002", + "TCH003", + "TCH004", + "TCH005", + "TCH010", + "TD004", + "TD005", + "TD006", + "TD007", + "TID251", + "TID252", + "TID253", + "TRIO100", + "TRIO105", + "TRIO109", + "TRIO110", + "TRIO115", + "TRY002", + "TRY003", + "TRY004", + "TRY201", + "TRY300", + "TRY301", + "TRY302", + "TRY400", + "TRY401", + "UP001", + "UP003", + "UP004", + "UP005", + "UP006", + "UP007", + "UP008", + "UP009", + "UP010", + "UP011", + "UP012", + "UP013", + "UP014", + "UP015", + "UP017", + "UP018", + "UP019", + "UP020", + "UP021", + "UP022", + "UP023", + "UP024", + "UP025", + "UP026", + "UP028", + "UP029", + "UP030", + "UP031", + "UP032", + "UP033", + "UP034", + "UP035", + "UP036", + "UP037", + "UP038", + "UP039", + "UP040", + "UP041", + "W291", + "W292", + "W293", + "W505", + "W605", + "YTT101", + "YTT102", + "YTT103", + "YTT201", + "YTT202", + "YTT203", + "YTT204", + "YTT301", + "YTT302", + "YTT303", +] + +[lint.per-file-ignores] +"**/scripts/*" = ["INP001", "T201"] +"**/tests/**/*" = ["PLC1901", "PLR2004", "PLR6301", "S", "TID252"] + +[lint.flake8-tidy-imports] +ban-relative-imports = "all" + +[lint.isort] +known-first-party = ["ipylab"] + +[lint.flake8-pytest-style] +fixture-parentheses = false +mark-parentheses = false diff --git a/schema/settings.json b/schema/settings.json new file mode 100644 index 00000000..5ae5997b --- /dev/null +++ b/schema/settings.json @@ -0,0 +1,14 @@ +{ + "title": "Ipylab", + "description": "Settings for ipylab.", + "properties": { + "autostart": { + "type": "boolean", + "title": "Ipylab kernel enabled", + "description": "Automatically start the ipylab kernel when Jupyterlab is started. This enables plugins to use the autostart feature. Note: This feature requires a special version of Jupyterlab widgets https://github.com/jupyter-widgets/ipywidgets/pull/3922", + "default": false + } + }, + "additionalProperties": false, + "type": "object" +} diff --git a/src/observable_disposable.ts b/src/observable_disposable.ts new file mode 100644 index 00000000..7c5f8599 --- /dev/null +++ b/src/observable_disposable.ts @@ -0,0 +1,30 @@ +// Copyright (c) ipylab contributors +// Distributed under the terms of the Modified BSD License. + +import { IObservableDisposable } from '@lumino/disposable'; +import { ISignal, Signal } from '@lumino/signaling'; + +/** + * A minimal ObservableDisposable. + */ +export class ObservableDisposable implements IObservableDisposable { + get disposed(): ISignal { + return this._disposed; + } + + get isDisposed(): boolean { + return this._isDisposed; + } + + dispose(): void { + if (this.isDisposed) { + return; + } + this._isDisposed = true; + this._disposed.emit(undefined); + Signal.clearData(this); + } + + private _disposed = new Signal(this); + private _isDisposed = false; +} diff --git a/src/plugin.ts b/src/plugin.ts index 98aca1fe..f9fb0936 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,55 +1,151 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. +import { IJupyterWidgetRegistry } from '@jupyter-widgets/base'; import { - JupyterFrontEndPlugin, + ILabShell, + ILayoutRestorer, JupyterFrontEnd, - ILabShell + JupyterFrontEndPlugin } from '@jupyterlab/application'; - import { ICommandPalette } from '@jupyterlab/apputils'; - -import { IJupyterWidgetRegistry } from '@jupyter-widgets/base'; - +import { IDefaultFileBrowser } from '@jupyterlab/filebrowser'; +import { ILauncher } from '@jupyterlab/launcher'; +import { ILoggerRegistry } from '@jupyterlab/logconsole'; +import { IMainMenu } from '@jupyterlab/mainmenu'; +import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; +import { ISettingRegistry } from '@jupyterlab/settingregistry'; +import { ITranslator } from '@jupyterlab/translation'; import { MODULE_NAME, MODULE_VERSION } from './version'; +import { IpylabModel, JupyterFrontEndModel, ShellModel } from './widget'; +import { PER_KERNEL_WM } from './widgets/frontend'; -const EXTENSION_ID = 'ipylab:plugin'; +const PLUGIN_ID = 'ipylab:settings'; + +/** + * The command IDs used by the plugin. + */ +namespace CommandIDs { + export const restore = 'ipylab:restore'; + export const checkStartKernel = 'ipylab:check-start-kernel'; + export const openConsole = 'ipylab:open-console'; + export const toggleLogConsole = 'ipylab:toggle-log-console'; +} /** * The default plugin. */ const extension: JupyterFrontEndPlugin = { - id: EXTENSION_ID, + id: PLUGIN_ID, autoStart: true, - requires: [IJupyterWidgetRegistry], - optional: [ICommandPalette, ILabShell], - activate: ( - app: JupyterFrontEnd, - registry: IJupyterWidgetRegistry, - palette: ICommandPalette, - labShell: ILabShell | null - ): void => { - registry.registerWidget({ - name: MODULE_NAME, - version: MODULE_VERSION, - exports: async () => { - const widgetExports = await import('./widget'); - - // add globals - widgetExports.JupyterFrontEndModel.app = app; - widgetExports.ShellModel.shell = app.shell; - widgetExports.ShellModel.labShell = labShell; - widgetExports.CommandRegistryModel.commands = app.commands; - widgetExports.CommandPaletteModel.palette = palette; - widgetExports.SessionManagerModel.sessions = - app.serviceManager.sessions; - widgetExports.SessionManagerModel.shell = app.shell; - widgetExports.SessionManagerModel.labShell = labShell; - - return widgetExports; + requires: [IJupyterWidgetRegistry, IRenderMimeRegistry, ISettingRegistry], + optional: [ + ILayoutRestorer, + ICommandPalette, + ILabShell, + IDefaultFileBrowser, + ILauncher, + ITranslator, + IMainMenu, + ILoggerRegistry + ], + activate: activate +}; + +/** + * Activate the JupyterLab extension. + * + * @param app Jupyter Front End + * @param registry Jupyter Widget Registry + * @param palette Jupyter Commands + * @param labShell Jupyter Shell + * @param defaultBrowser Jupyter Default File Browser + * @param launcher [optional] Jupyter Launcher + * @param translator Jupyter Translator + */ +async function activate( + app: JupyterFrontEnd, + registry: IJupyterWidgetRegistry, + rendermime: IRenderMimeRegistry, + settings: ISettingRegistry, + restorer: ILayoutRestorer, + palette: ICommandPalette, + labShell: ILabShell | null, + defaultBrowser: IDefaultFileBrowser | null, + launcher: ILauncher | null, + translator: ITranslator | null, + mainMenu: IMainMenu | null, + loggerRegistry: ILoggerRegistry | null +): Promise { + // add globals + IpylabModel.app = app; + IpylabModel.rendermime = rendermime; + IpylabModel.labShell = labShell; + IpylabModel.defaultBrowser = defaultBrowser; + IpylabModel.palette = palette; + IpylabModel.translator = translator; + IpylabModel.launcher = launcher; + IpylabModel.mainMenu = mainMenu; + IpylabModel.JFEM.loggerRegistry = loggerRegistry; + + const exports = { + name: MODULE_NAME, + version: MODULE_VERSION, + exports: await import('./widget') + }; + + registry.registerWidget(exports); + + app.commands.addCommand(CommandIDs.openConsole, { + execute: JupyterFrontEndModel.openConsole, + label: 'Open console' + }); + app.commands.addCommand(CommandIDs.toggleLogConsole, { + execute: JupyterFrontEndModel.toggleLogConsole, + label: 'Toggle log console' + }); + app.contextMenu.addItem({ + command: CommandIDs.openConsole, + selector: '.ipylab-shell', + rank: 1 + }); + app.contextMenu.addItem({ + command: CommandIDs.toggleLogConsole, + selector: '.ipylab-shell', + rank: 2 + }); + + let when; + if (PER_KERNEL_WM) { + app.commands.addCommand(CommandIDs.restore, { + execute: ShellModel.restoreToShell + }); + app.commands.addCommand(CommandIDs.checkStartKernel, { + label: 'Start or restart ipylab kernel', + caption: 'Start or restart the python kernel with path="ipylab".', + execute: () => IpylabModel.JFEM.startIpylabKernel(true) + }); + + palette.addItem({ + command: CommandIDs.checkStartKernel, + category: 'ipylab', + rank: 50 + }); + when = settings.load(PLUGIN_ID).then(async () => { + const config = await settings.get(PLUGIN_ID, 'autostart'); + if (config.composite as boolean) { + await IpylabModel.JFEM.startIpylabKernel(); } }); + // Handle state restoration. + if (restorer) { + void restorer.restore(IpylabModel.tracker, { + command: CommandIDs.restore, + args: widget => (widget as any).ipylabSettings, + name: widget => (widget as any).ipylabSettings.cid, + when + }); + } } -}; - +} export default extension; diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..f9489433 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,263 @@ +// Copyright (c) ipylab contributors +// Distributed under the terms of the Modified BSD License. + +import { Signal } from '@lumino/signaling'; + +/** + * Clean a dotted name prior to passing to one of these functions. + * + * @param subpath A dotted name + * @returns + */ +function cleanSubpath(subpath: string) { + return (subpath || '').replace('[', '.').replace(']', ''); +} + +/** + * Get a nested property relative to `obj` using the `subpath` notation. + */ +export function getNestedProperty({ + obj, + subpath, + nullIfMissing = false, + basename = '' +}: { + obj: object; + subpath: string; + nullIfMissing?: boolean; + basename?: string; +}): any { + subpath = cleanSubpath(subpath); + let subpath_ = ''; + const parts = subpath.split('.'); + let pname = ''; + for (let i = 0; i < parts.length; i++) { + pname = parts[i]; + if (pname in obj) { + obj = obj[pname as keyof typeof obj]; + subpath_ = !subpath_ ? pname : `${subpath_}.${pname}`; + } else { + break; + } + } + if (subpath_ !== subpath || typeof obj === 'undefined') { + if (nullIfMissing) { + return null; + } + if (obj instanceof Array && !isNaN(+pname)) { + throw new Error( + `Index ${subpath_}[${pname}] out of range for ` + + `Array (${obj.length}) {${toJSONsubstituteCylic(obj)}}` + ); + } + basename = basename ? basename + '.' : basename; + throw new Error(`Property "${basename}${pname}" not found!`); + } + return obj; +} + +/** + * Set a nested property at `subpath` relative to the obj on `obj`. + */ +export function setNestedProperty({ + obj, + subpath, + value, + basename = '' +}: { + obj: object; + subpath: string; + value: any; + basename?: string; +}) { + subpath = cleanSubpath(subpath); + const objname = subpath.split('.').slice(0, -1).join('.'); + const key = subpath.split('.').slice(-1)[0]; + obj = getNestedProperty({ obj, subpath: objname, basename }); + (obj as any)[key] = value; +} + +/** + * Update the property. Equivalent to python: `dict.update`. + */ +export async function updateProperty({ + obj, + subpath, + value, + basename = '' +}: { + obj: object; + subpath: string; + value: any; + basename?: string; +}): Promise { + obj = getNestedProperty({ obj, subpath, basename }); + return Object.assign(obj, value); +} + +/** + * Convert a string definition of a function to a function object. + * @param code The function as a string: eg. 'function (a, b) { return a + b; }' + * @returns + */ +export function toFunction(code: string) { + return new Function('return ' + code)(); +} + +function findAllProperties({ + obj: obj, + items = [], + type = '', + depth = 1, + omitHidden = false +}: { + obj: any; + items?: Array; + type?: string; + depth?: number; + omitHidden?: boolean; +}): Array { + if (!obj || depth === 0) { + return [...new Set(items)]; + } + + const props = Object.getOwnPropertyNames(obj).filter(value => + omitHidden ? value.slice(0, 1) !== '_' : true + ); + return findAllProperties({ + obj: Object.getPrototypeOf(obj), + items: [...items, ...props], + type, + depth: depth - 1, + omitHidden: omitHidden + }); +} + +/** + * List the properties of the object. + * + * This function is cyclic ref safe so is suitable for converting to json. + */ +export function listProperties({ + obj, + type = '', + depth = 1, + omitHidden = false +}: { + obj: any; + type?: string; + depth?: number; + omitHidden?: boolean; +}): any { + const out: any = {}; + for (const name of findAllProperties({ + obj, + items: [], + type, + depth, + omitHidden + })) { + const obj_ = obj[name]; + let type_: string = typeof obj_; + let val: any = name; + /*eslint no-fallthrough: ["error", { "commentPattern": "break[\\s\\w]*omitted" }]*/ + switch (type_) { + case 'string': + case 'number': + case 'bigint': + case 'boolean': + out[name] = obj_; + break; + case 'undefined': + out[name] = null; + break; + case 'object': + if (obj_ instanceof Promise) { + type_ = 'Promise'; + break; + } else if (obj_ instanceof Signal) { + type_ = 'Signal'; + } + if (depth > 1) { + val = {}; + val[name] = listProperties({ + obj: obj_, + type, + depth: 1, + omitHidden + }); + } + // caution: break is omitted intentionally + default: + if (!out[`<${type_}s>`]) { + out[`<${type_}s>`] = [val]; + } else { + out[`<${type_}s>`].push(val); + out[`<${type_}s>`] = out[`<${type_}s>`].sort(); + } + } + } + // Sort alphabetically + return Object.fromEntries(Object.entries(out).sort()); +} + +/** + * Execute a method at subpath of obj. + * + * args are for the method. + */ +export async function executeMethod({ + obj, + subpath, + args, + basename = '' +}: { + obj: object; + subpath: string; + args: any[]; + basename?: string; +}): Promise { + if (!subpath) { + throw new Error('subpath required!'); + } + subpath = cleanSubpath(subpath); + const ownername = subpath.split('.').slice(0, -1).join('.'); + const owner = getNestedProperty({ obj, subpath: ownername, basename }); + let func = getNestedProperty({ obj, subpath, basename }); + func = func.bind(owner, ...args); + return await func(); +} + +/** + * Convert content replacing cyclic objects with a list of its properties. + * @param value Content represent JSON + * @returns + */ +export function toJSONsubstituteCylic(value: any) { + try { + return JSON.stringify(value); + } catch { + // Assuming the error is due to circular reference + return JSON.stringify(value, _replacer); + } +} + +function _replacer(key: string, value: any) { + // Filtering out properties + if (typeof value !== 'object') { + return value; + } + try { + JSON.stringify(value); + return value; + } catch { + const out = listProperties({ + obj: value, + omitHidden: true, + depth: 3 + }); + out['WARNING'] = + 'This is a simplified representation because it contains circular references.'; + return out; + } +} diff --git a/src/widget.ts b/src/widget.ts index e5cb76f6..45b2265b 100644 --- a/src/widget.ts +++ b/src/widget.ts @@ -2,25 +2,31 @@ // Distributed under the terms of the Modified BSD License. import { CommandRegistryModel } from './widgets/commands'; -import { CommandPaletteModel } from './widgets/palette'; -import { SessionManagerModel } from './widgets/sessions'; +import { ConnectionModel, ShellConnectionModel } from './widgets/connection'; +import { DialogModel } from './widgets/dialog'; import { JupyterFrontEndModel } from './widgets/frontend'; -import { PanelModel } from './widgets/panel'; +import { IconModel, IconView } from './widgets/icon'; +import { IpylabModel } from './widgets/ipylab'; +import { NotificationManagerModel } from './widgets/notification'; +import { PanelModel, PanelView } from './widgets/panel'; import { ShellModel } from './widgets/shell'; import { SplitPanelModel, SplitPanelView } from './widgets/split_panel'; import { TitleModel } from './widgets/title'; -import { IconView, IconModel } from './widgets/icon'; export { CommandRegistryModel, - CommandPaletteModel, + ConnectionModel, + DialogModel, + IconModel, + IconView, + IpylabModel, JupyterFrontEndModel, + NotificationManagerModel, PanelModel, + PanelView, + ShellConnectionModel, ShellModel, SplitPanelModel, SplitPanelView, - TitleModel, - SessionManagerModel, - IconModel, - IconView + TitleModel }; diff --git a/src/widgets/commands.ts b/src/widgets/commands.ts index f81bcb3c..aed9c7d8 100644 --- a/src/widgets/commands.ts +++ b/src/widgets/commands.ts @@ -1,194 +1,135 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. -import { ObservableMap } from '@jupyterlab/observables'; -import { LabIcon } from '@jupyterlab/ui-components'; -import { - ISerializers, - unpack_models, - WidgetModel -} from '@jupyter-widgets/base'; - -import { ArrayExt } from '@lumino/algorithm'; - import { CommandRegistry } from '@lumino/commands'; - -import { ReadonlyPartialJSONObject } from '@lumino/coreutils'; - +import { IpylabModel } from './ipylab'; import { IDisposable } from '@lumino/disposable'; - -import { MODULE_NAME, MODULE_VERSION } from '../version'; +import { ObservableDisposable } from '../observable_disposable'; /** * The model for a command registry. */ -export class CommandRegistryModel extends WidgetModel { +export class CommandRegistryModel extends IpylabModel { /** * The default attributes. */ - defaults(): any { + defaults(): Backbone.ObjectHash { return { ...super.defaults(), - _model_name: CommandRegistryModel.model_name, - _model_module: CommandRegistryModel.model_module, - _model_module_version: CommandRegistryModel.model_module_version, - _command_list: [], - _commands: [] + _model_name: 'CommandRegistryModel' }; } + async ipylabInit(base: any = null) { + if (!base) { + base = + this.get('name') === 'Jupyterlab' + ? IpylabModel.app.commands + : new CommandRegistry(); + } + await super.ipylabInit(base); + } - /** - * Initialize a CommandRegistryModel instance. - * - * @param attributes The base attributes. - * @param options The initialization options. - */ - initialize(attributes: any, options: any): void { - this._commands = CommandRegistryModel.commands; - super.initialize(attributes, options); - this.on('msg:custom', this._onMessage.bind(this)); - this.on('comm_live_update', () => { - if (this.comm_live) { - return; - } - Private.customCommands.values().forEach(command => command.dispose()); - this._sendCommandList(); - }); - - // restore existing commands - const commands = this.get('_commands'); - Promise.all(commands.map((command: any) => this._addCommand(command))) - .then(() => this._sendCommandList()) - .catch(console.warn); + setReady() { + this.base.commandChanged.connect(this.sendCommandList, this); + this.sendCommandList(); + super.setReady(); } /** - * Handle a custom message from the backend. + * Close model * - * @param msg The message to handle. + * @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. */ - private async _onMessage(msg: any): Promise { - switch (msg.func) { + close(comm_closed = false): Promise { + this?.base?.commandChanged?.disconnect(this.sendCommandList, this); + return super.close(comm_closed); + } + + async operation(op: string, payload: any): Promise { + switch (op) { case 'execute': - this._execute(msg.payload); - break; - case 'addCommand': { - await this._addCommand(msg.payload); - // keep track of the commands - const commands = this.get('_commands'); - this.set('_commands', commands.concat(msg.payload)); - this.save_changes(); - break; - } - case 'removeCommand': - this._removeCommand(msg.payload); - break; + return await this.base.execute(payload.id, payload.args); + case 'addCommand': + return await this.addCommand(payload); default: - break; + return await super.operation(op, payload); } } /** * Send the list of commands to the backend. */ - private _sendCommandList(): void { - this._commands.notifyCommandChanged(); - this.set('_command_list', this._commands.listCommands()); + private sendCommandList(sender?: object, args?: any): void { + if (args && args.type !== 'added' && args.type !== 'removed') { + return; + } + this.set('all_commands', this.base.listCommands()); this.save_changes(); } - /** - * Execute a command - * - * @param bundle The command bundle. - * @param bundle.id - * @param bundle.args - */ - private _execute(bundle: { - id: string; - args: ReadonlyPartialJSONObject; - }): void { - const { id, args } = bundle; - void this._commands.execute(id, args); - } - /** * Add a new command to the command registry. * - * @param options The command options. + * @param payload The command options. */ - private async _addCommand( + private async addCommand( options: CommandRegistry.ICommandOptions & { id: string } - ): Promise { - const { id, caption, label, iconClass, icon } = options; - if (this._commands.hasCommand(id)) { - Private.customCommands.get(id).dispose(); - } - - let labIcon: LabIcon | null = null; - if (icon) { - labIcon = (await unpack_models(icon, this.widget_manager))?.labIcon; - } - - const commandEnabled = (command: IDisposable): boolean => { - return !command.isDisposed && !!this.comm && this.comm_live; - }; - const command = this._commands.addCommand(id, { - caption, - label, - iconClass, - icon: labIcon, - execute: () => { - if (!this.comm_live) { - command.dispose(); - return; - } - this.send({ event: 'execute', id }, {}); + ): Promise { + const { id, isToggleable, icon } = options; + + // Make a new object and define functions so we can dynamically update. + delete options.icon; + const isToggled = isToggleable ? () => options.isToggled ?? true : null; + const mappings = { + caption: () => options.caption ?? '', + className: () => options.className ?? '', + dataset: () => options.dataset ?? {}, + describedBy: () => options.describedBy ?? '', + execute: async (args: any) => { + return await this.scheduleOperation('execute', { id, args }, 'object'); }, - isEnabled: () => commandEnabled(command), - isVisible: () => commandEnabled(command) - }); - Private.customCommands.set(id, command); - this._sendCommandList(); + icon: icon, + iconClass: () => options.iconClass ?? '', + iconLabel: () => options.iconLabel ?? '', + isEnabled: () => options.isEnabled ?? true, + isToggleable, + isToggled, + isVisible: () => options.isVisible ?? true, + label: () => options.label, + mnemonic: () => Number(options.mnemonic ?? -1), + usage: () => options.usage ?? '' + }; + const command = this.base.addCommand(id, mappings as any); + return new CommandLink(command, id, options, mappings); } + public readonly base: CommandRegistry; +} - /** - * Remove a command from the command registry. - * - * @param bundle The command bundle. - * @param bundle.id - */ - private _removeCommand(bundle: { id: string }): void { - const { id } = bundle; - if (Private.customCommands.has(id)) { - Private.customCommands.get(id).dispose(); - } - const commands = this.get('_commands').slice(); - ArrayExt.removeAllWhere(commands, (w: any) => w.id === id); - this.set('_commands', commands); - this.save_changes(); - this._sendCommandList(); +class CommandLink extends ObservableDisposable { + constructor( + command: IDisposable, + id: string = '', + options: CommandRegistry.ICommandOptions, + mappings: any + ) { + super(); + this.command = command; + this.id = id; + this.config = options; + this.mappings = mappings; } - static serializers: ISerializers = { - ...WidgetModel.serializers - }; - - static model_name = 'CommandRegistryModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name: string = null; - static view_module: string = null; - static view_module_version = MODULE_VERSION; - - private _commands: CommandRegistry; - - static commands: CommandRegistry; -} - -/** - * A namespace for private data - */ -namespace Private { - export const customCommands = new ObservableMap(); + dispose(): void { + if (this.isDisposed) { + return; + } + this.command.dispose(); + super.dispose(); + } + readonly id: string; + readonly config: CommandRegistry.ICommandOptions; + readonly command: IDisposable; + readonly mappings: any; } diff --git a/src/widgets/connection.ts b/src/widgets/connection.ts new file mode 100644 index 00000000..daa513c4 --- /dev/null +++ b/src/widgets/connection.ts @@ -0,0 +1,258 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import { PromiseDelegate, UUID } from '@lumino/coreutils'; +import { Signal } from '@lumino/signaling'; +import { IpylabModel } from './ipylab'; +import { IObservableDisposable } from '@lumino/disposable'; +import { Widget } from '@lumino/widgets'; +import { ILabShell } from '@jupyterlab/application'; +/** + * Provides a connection to an object using a unique 'cid'. + * + * + * An object must be registered static method `ConnectionModel.registerConnection` + * to establish the connection. The base class expects the object to be + * register before it is created. Subclasses can indicate + * by using a 'pending' promise. The + * The 'cid' can generated in Python first, or generated in the Frontend if a 'cid' + * isn't provided. + * + * The object is set to `this.base`. + */ +export class ConnectionModel extends IpylabModel { + /** + * The default attributes. + */ + defaults(): Backbone.ObjectHash { + return { ...super.defaults(), _model_name: 'ConnectionModel' }; + } + + async ipylabInit(base: any = null) { + this.cid_ = this.get('cid'); + try { + base = await this.getObject(); + base.disposed.connect(this._base_disposed, this); + await super.ipylabInit(base); + } catch (e) { + this.close(); + this.error(`Failed to establish connection for cid=${this.cid_} ${e}`); + } + } + + _base_disposed() { + this.set('auto_dispose', false); + this.close(false); + } + + close(comm_closed = false): Promise { + Private.pending.get(this.cid_)?.reject('closing'); + Private.pending.delete(this.cid_); + this.base?.disposed?.disconnect(this._base_disposed, this); + if ((this.base as any)?.ipylabDisposeOnClose ?? this.get('auto_dispose')) { + this.set('auto_dispose', false); + this.base?.dispose(); + } + return super.close(comm_closed); + } + + async getObject(): Promise { + // This is async for overloading + return Private.connections.get(this.cid_); + } + + ensurePending() { + const cid = this.get('cid'); + if (!Private.pending.has(cid)) { + Private.pending.set(cid, new PromiseDelegate()); + } + const pc = Private.pending.get(cid); + if (Private.connections.has(cid)) { + pc.resolve(null); + } + return pc; + } + + /** + * Keep a reference to an object so it can be found from the backend. + * Also keeps a reverse mapping for the last registered cid of the object + * see: `IpylabModel.get_cid` + + * @param obj + */ + static registerConnection(cid: string, obj: any) { + if (!cid) { + throw new Error('`cid` not provided!'); + } + if (typeof obj !== 'object') { + throw new Error(`An object is required but got a '${typeof obj}'`); + } + while (obj?.isConnectionModel) { + obj = obj.base; + } + if (obj?.isDisposed) { + throw new Error('object is disposed'); + } + if (Private.connections.has(cid) && Private.connections.get(cid) !== obj) { + throw new Error(`Another object is already registered for cid: ${cid}`); + } + ConnectionModel.ensureObservableDisposable(obj); + obj.disposed.connect(() => { + Private.connections.delete(cid); + Private.connections_rev.delete(obj); + }); + Private.connections.set(cid, obj); + Private.connections_rev.set(obj, cid); + if (Private.pending.has(cid)) { + Private.pending.get(cid).resolve(null); + Private.pending.delete(cid); + } + return obj; + } + + /** + * Modify the object to make it usable as an IObservableDisposable. + * @param obj The object to modify. + * @returns + */ + static ensureObservableDisposable(obj: any) { + if (typeof obj !== 'object') { + throw new Error(`An object is required but got ${typeof obj} `); + } + if (obj.disposed) { + // Assume obj provides an IObservableDisposable interface. + return; + } + const args = { enumerable: false, configurable: true, writable: false }; + if (!obj.dispose) { + Object.defineProperties(obj, { + dispose: { value: () => null as any, ...args }, + ipylabDisposeOnClose: { value: true, ...args } + }); + } + const disposed = new Signal(obj); + const dispose_ = obj.dispose.bind(obj); + const dispose = () => { + if (obj.isDisposed) { + return; + } + dispose_(); + disposed.emit(null); + Signal.clearData(obj); + if (!obj.isDisposed) { + obj.isDisposed = true; + } + }; + Object.defineProperties(obj, { + dispose: { value: dispose.bind(obj), ...args }, + disposed: { value: disposed, ...args } + }); + } + + static get_cid(obj: any, register = false): string | null { + if (register && !Private.connections_rev.has(obj)) { + const cls = + obj instanceof Widget && + obj.id && + ConnectionModel.getLuminoWidgetFromShell(obj.id) + ? 'ShellConnection' + : 'Connection'; + const cid = ConnectionModel.new_cid(cls); + ConnectionModel.registerConnection(cid, obj); + } + return Private.connections_rev.get(obj); + } + + static getConnection(cid: string): IObservableDisposable | undefined { + return Private.connections.get(cid); + } + + /** + * Get the lumino widget from the shell using its id. + * + * @param id + * @returns + */ + static getLuminoWidgetFromShell(id: string): Widget | null { + for (const area of [ + 'main', + 'header', + 'top', + 'menu', + 'left', + 'right', + 'bottom' + ]) { + for (const widget of IpylabModel.labShell.widgets( + area as ILabShell.Area + )) { + if (widget.id === id) { + return widget; + } + } + } + } + + static new_cid(cls: string): string { + const _PREFIX = 'ipylab-'; + const _SEP = '|'; + + return `${_PREFIX}${cls}${_SEP}${UUID.uuid4()}`; + } + // 'cid' is used by BackboneJS so we use cid_ here. + cid_: string; + readonly isConnectionModel = true; +} + +/** + * A connection for widgets in the Shell. + */ +export class ShellConnectionModel extends ConnectionModel { + /* + * The default attributes. + */ + defaults(): Backbone.ObjectHash { + return { ...super.defaults(), _model_name: 'ShellConnectionModel' }; + } + + async getObject(): Promise { + let base = Private.connections.get(this.cid_); + if (!base && !Private.pending.has(this.cid_)) { + const pending = this.ensurePending(); + IpylabModel.tracker.restored.then(() => { + if (!Private.connections.has(this.cid_)) { + setTimeout( + () => pending.reject(`Shell connection not found ${this.cid_}`), + 10000 + ); + } + }); + } + await Private.pending.get(this.cid_)?.promise; + base = Private.connections.get(this.cid_); + if (!(base instanceof Widget)) { + this.error(`Failed to locate a widget cid=${this.cid_}`); + } + return base; + } + + async operation(op: string, payload: any): Promise { + switch (op) { + case 'activate': + return IpylabModel.app.shell.activateById(this.base.id); + default: + return await super.operation(op, payload); + } + } +} + +IpylabModel.ConnectionModel = ConnectionModel; + +/** + * A namespace for private data + */ +namespace Private { + export const pending = new Map>(); + export const connections = new Map(); + export const connections_rev = new Map(); +} diff --git a/src/widgets/dialog.ts b/src/widgets/dialog.ts new file mode 100644 index 00000000..35f45cd2 --- /dev/null +++ b/src/widgets/dialog.ts @@ -0,0 +1,58 @@ +// Copyright (c) ipylab contributors +// Distributed under the terms of the Modified BSD License. + +import { + InputDialog, + showDialog, + showErrorMessage +} from '@jupyterlab/apputils'; +import { FileDialog } from '@jupyterlab/filebrowser'; +import { IpylabModel } from './ipylab'; + +export class DialogModel extends IpylabModel { + /** + * The default attributes. + */ + defaults(): Backbone.ObjectHash { + return { ...super.defaults(), _model_name: 'DialogModel' }; + } + + async operation(op: string, payload: any): Promise { + function _get_result(result: any): any { + if (result.value === null) { + throw new Error('Cancelled'); + } + return result.value; + } + let result; + switch (op) { + case 'showDialog': + result = await showDialog(payload); + return { value: result.button.accept, isChecked: result.isChecked }; + case 'getBoolean': + return await InputDialog.getBoolean(payload).then(_get_result); + case 'getItem': + return await InputDialog.getItem(payload).then(_get_result); + case 'getNumber': + return await InputDialog.getNumber(payload).then(_get_result); + case 'getText': + return await InputDialog.getText(payload).then(_get_result); + case 'getPassword': + return await InputDialog.getPassword(payload).then(_get_result); + case 'showErrorMessage': + return await showErrorMessage( + payload.title, + payload.error, + payload.buttons + ); + case 'getOpenFiles': + payload.manager = IpylabModel.defaultBrowser.model.manager; + return await FileDialog.getOpenFiles(payload).then(_get_result); + case 'getExistingDirectory': + payload.manager = IpylabModel.defaultBrowser.model.manager; + return await FileDialog.getExistingDirectory(payload).then(_get_result); + default: + return await super.operation(op, payload); + } + } +} diff --git a/src/widgets/frontend.ts b/src/widgets/frontend.ts index 15f9665b..2fc47998 100644 --- a/src/widgets/frontend.ts +++ b/src/widgets/frontend.ts @@ -1,57 +1,287 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. -import { JupyterFrontEnd } from '@jupyterlab/application'; +import { KernelWidgetManager } from '@jupyter-widgets/jupyterlab-manager'; +import { SessionContext, SessionContextDialogs } from '@jupyterlab/apputils'; +import { ILogger, ILoggerRegistry, IStateChange } from '@jupyterlab/logconsole'; +import { PromiseDelegate } from '@lumino/coreutils'; +import { IpylabModel } from './ipylab'; -import { - DOMWidgetModel, - ISerializers, - WidgetModel -} from '@jupyter-widgets/base'; +// Determine if the per kernel widget manager is available +export const PER_KERNEL_WM = Boolean((KernelWidgetManager as any)?.getManager); -import { MODULE_NAME, MODULE_VERSION } from '../version'; - -/** - * The model for a JupyterFrontEnd. - */ -export class JupyterFrontEndModel extends WidgetModel { +export class JupyterFrontEndModel extends IpylabModel { /** * The default attributes. */ - defaults(): any { - return { - ...super.defaults(), - _model_name: JupyterFrontEndModel.model_name, - _model_module: JupyterFrontEndModel.model_module, - _model_module_version: JupyterFrontEndModel.model_module_version - }; + defaults(): Backbone.ObjectHash { + return { ...super.defaults(), _model_name: 'JupyterFrontEndModel' }; } - /** - * Initialize a JupyterFrontEndModel instance. - * - * @param attributes The base attributes. - * @param options The initialization options. - */ initialize(attributes: any, options: any): void { - this._app = JupyterFrontEndModel.app; super.initialize(attributes, options); - this.send({ event: 'lab_ready' }, {}); - this.set('version', this._app.version); + this.logger = JFEM.loggerRegistry.getLogger(this.vpath); + this.logger.stateChanged.connect(this.loggerStateChanged as any, this); + Private.jfems.set(this.kernel.id, this); + if (!Private.vpathTojfem.has(this.vpath)) { + Private.vpathTojfem.set(this.vpath, new PromiseDelegate()); + } + } + + async ipylabInit(base: any = null) { + this.set('version', JFEM.app.version); + this.set('per_kernel_widget_manager_detected', PER_KERNEL_WM); + JFEM.sessionManager.runningChanged.connect(this.updateAllSessions, this); + if (JFEM.labShell) { + JFEM.labShell.currentChanged.connect(this.updateSessionInfo, this); + JFEM.labShell.activeChanged.connect(this.updateSessionInfo, this); + this.updateSessionInfo(); + } + this.updateAllSessions(); + await super.ipylabInit(base); + Private.vpathTojfem.get(this.vpath).resolve(this); + } + + close(comm_closed?: boolean): Promise { + Private.jfems.delete(this.kernel.id); + Private.vpathTojfem.delete(this.vpath); + JFEM.labShell.currentChanged.disconnect(this.updateSessionInfo, this); + JFEM.labShell.activeChanged.disconnect(this.updateSessionInfo, this); + JFEM.sessionManager.runningChanged.disconnect(this.updateAllSessions, this); + this.logger.stateChanged.disconnect(this.loggerStateChanged as any, this); + return super.close(comm_closed); + } + + get vpath() { + let vpath = this.get('vpath'); + if (!vpath) { + const cs = this.get('current_session'); + if (cs?.kernel?.id === this.kernel.id) { + vpath = cs?.path; + } + if (!vpath) { + for (const session of JFEM.sessionManager.running()) { + if (session.kernel.id === this.kernel.id) { + vpath = session.path; + break; + } + } + } + this.set('vpath', vpath); + this.save_changes(); + } + return vpath; + } + + private updateSessionInfo(): void { + const currentWidget = JFEM.app.shell.currentWidget as any; + const current_session = currentWidget?.sessionContext?.session?.model ?? {}; + if (this.get('current_widget_id') !== currentWidget?.id) { + this.set('current_widget_id', currentWidget?.id ?? ''); + this.set('current_session', current_session); + this.save_changes(); + } + } + private updateAllSessions(): void { + this.set('all_sessions', Array.from(JFEM.sessionManager.running())); this.save_changes(); } - static serializers: ISerializers = { - ...DOMWidgetModel.serializers - }; + private loggerStateChanged(sender: ILogger, change: IStateChange): void { + if (this.get('logger_level') !== this.logger.level) { + this.set('logger_level', this.logger.level); + this.save_changes(); + } + } - static model_name = 'JupyterFrontEndModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name: string = null; - static view_module: string = null; - static view_module_version = MODULE_VERSION; + async operation(op: string, payload: any): Promise { + switch (op) { + case 'evaluate': + return await this.scheduleOperation('evaluate', payload, 'auto'); + case 'startIyplabKernel': + return await JFEM.startIpylabKernel(payload.restart ?? false); + case 'shutdownKernel': + if (payload.vpath) { + if (Private.vpathTojfem.has(payload.vpath)) { + await JFEM.getModelByVpath(payload.vpath).then(jfem => + jfem.kernel.shutdown() + ); + } + } else { + this.kernel.shutdown(); + } + return null; + default: + return await super.operation(op, payload); + } + } + + static getModelByKernelId(kernelId: string) { + return Private.jfems.get(kernelId); + } + + /** + * Get the JupyterFrontendModel for the vpath. + * If the path doesn't exist, a new kernel will be started. + * @param vpath The session path + * @returns + */ + static async getModelByVpath(vpath: string): Promise { + if (!vpath || typeof vpath !== 'string') { + throw new Error(`Invalid vpath ${vpath}`); + } + if (!Private.vpathTojfem.has(vpath)) { + if (!PER_KERNEL_WM) { + throw new Error( + 'A per-kernel KernelWidgetManager is required to start a new session!' + ); + } + Private.vpathTojfem.set(vpath, new PromiseDelegate()); + + const sessionContext = new SessionContext({ + sessionManager: IpylabModel.sessionManager, + specsManager: IpylabModel.app.serviceManager.kernelspecs, + path: vpath, + name: vpath, + type: 'console', + kernelPreference: { language: 'python' } + }); + await sessionContext.initialize(); + if (!sessionContext.isReady) { + await new SessionContextDialogs({ + translator: IpylabModel.translator + }).selectKernel(sessionContext!); + } + if (!sessionContext.isReady) { + sessionContext.dispose(); + throw new Error('Cancelling because a kernel was not provided'); + } + const kernel = sessionContext.session.kernel; + new KernelWidgetManager(kernel, IpylabModel.rendermime); + await kernel.requestExecute( + { + code: ` + import ipylab + ipylab.plugin_manager.hook.start_app(vpath='${vpath}')`, + store_history: false + }, + true + ).done; + } + return await new Promise((resolve, reject) => { + const timeoutID = setTimeout(() => { + const msg = `Failed to get a JupyterFrontendModel for vpath='${vpath}'`; + Private.vpathTojfem.get(vpath).reject(msg); + Private.vpathTojfem.delete(vpath); + reject(msg); + }, 2000); + Private.vpathTojfem.get(vpath).promise.then(jfem => { + clearTimeout(timeoutID); + resolve(jfem); + }); + }); + } - private _app: JupyterFrontEnd; - static app: JupyterFrontEnd; + /** + * Get the WidgetModel + * + * This depends on the PR requiring a per-kernel widget manager. + * + * @param model_id The model id + * @returns WidgetModel + */ + static async getWidgetModel(model_id: string) { + const manager = await JFEM.getWidgetManager(model_id); + return await manager.get_model(model_id); + } + + /** + * Get the WidgetManger searching all known kernels. + * + * @param model_id The widget model id + * @returns + */ + static async getWidgetManager( + model_id: string, + delays = [100, 5000] + ): Promise { + for (const sleepTime of delays) { + for (const jfem of Private.jfems.values()) { + if (jfem.widget_manager.has_model(model_id)) { + return jfem.widget_manager; + } + } + await new Promise(resolve => setTimeout(resolve, sleepTime)); + } + throw new Error( + `Failed to locate the KernelWidgetManager for model_id='${model_id}'` + ); + } + + /** + * + * @param restart Restart the kernel + */ + static async startIpylabKernel(restart = false) { + if (restart) { + const model = await IpylabModel.sessionManager.findByPath('ipylab'); + if (model) { + await IpylabModel.app.serviceManager.kernels.shutdown(model.kernel.id); + } + } + await IpylabModel.JFEM.getModelByVpath('ipylab'); + } + + /** + * Open a console using vpath for path. + * + * @param args not used. + * @returns + */ + static async openConsole(args: any) { + const currentWidget = JFEM.tracker.currentWidget; + const ipylabSettings = (currentWidget as any)?.ipylabSettings; + const jfem = await JFEM.getModelByVpath(ipylabSettings.vpath); + const payload = { cid: ipylabSettings.cid }; + return await jfem.scheduleOperation('open_console', payload, 'auto'); + } + + /** + * Opening/close the console using vpath. + * + * logconsole:open corresponds to a toggle command, so we the best + * we can do is toggle the console. + * + * @param args not used. + */ + static async toggleLogConsole(args: any) { + const currentWidget = JFEM.tracker.currentWidget; + const ipylabSettings = (currentWidget as any)?.ipylabSettings; + const source = ipylabSettings.vpath; + JFEM.app.commands.execute('logconsole:open', { source }); + } + + logger: ILogger; + static loggerRegistry: ILoggerRegistry; +} + +IpylabModel.JFEM = JupyterFrontEndModel; +const JFEM = JupyterFrontEndModel; + +/** + * A namespace for private data + */ +namespace Private { + /** + * Mapping of vpath to JupyterFrontEndModel + */ + export const vpathTojfem = new Map< + string, + PromiseDelegate + >(); + + /** + * Mapping of kernelId to JupyterFrontEndModel + */ + export const jfems = new Map(); } diff --git a/src/widgets/icon.ts b/src/widgets/icon.ts index 082d0366..1336f1e4 100644 --- a/src/widgets/icon.ts +++ b/src/widgets/icon.ts @@ -1,10 +1,8 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. +import { DOMWidgetModel, DOMWidgetView } from '@jupyter-widgets/base'; import { LabIcon } from '@jupyterlab/ui-components'; - -import { DOMWidgetView, DOMWidgetModel } from '@jupyter-widgets/base'; - import { MODULE_NAME, MODULE_VERSION } from '../version'; export class IconView extends DOMWidgetView { @@ -35,15 +33,15 @@ export class IconModel extends DOMWidgetModel { /** * The default attributes. */ - defaults(): any { + defaults(): Backbone.ObjectHash { return { ...super.defaults(), - _model_name: IconModel.model_name, - _model_module: IconModel.model_module, - _model_module_version: IconModel.model_module_version, - _view_name: IconModel.view_name, - _view_module: IconModel.view_module, - _view_module_version: IconModel.view_module_version + _model_name: 'IconModel', + _model_module: MODULE_NAME, + _model_module_version: MODULE_VERSION, + _view_name: 'IconView', + _view_module: MODULE_NAME, + _view_module_version: MODULE_VERSION }; } @@ -64,7 +62,7 @@ export class IconModel extends DOMWidgetModel { } /** - * Update the LabIcon when model chenges occur + * Update the LabIcon when model changes occur */ updateIcon() { const name = this.get('name'); @@ -77,11 +75,4 @@ export class IconModel extends DOMWidgetModel { } protected _labIcon: LabIcon; - - static model_name = 'IconModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name = 'IconView'; - static view_module = MODULE_NAME; - static view_module_version = MODULE_VERSION; } diff --git a/src/widgets/ipylab.ts b/src/widgets/ipylab.ts new file mode 100644 index 00000000..459db5d3 --- /dev/null +++ b/src/widgets/ipylab.ts @@ -0,0 +1,566 @@ +// Copyright (c) ipylab contributors +// Distributed under the terms of the Modified BSD License. + +import { ICallbacks, ISerializers, WidgetModel } from '@jupyter-widgets/base'; +import { KernelWidgetManager } from '@jupyter-widgets/jupyterlab-manager'; +import { JupyterFrontEnd, LabShell } from '@jupyterlab/application'; +import { + ICommandPalette, + Notification, + WidgetTracker +} from '@jupyterlab/apputils'; +import { IDefaultFileBrowser } from '@jupyterlab/filebrowser'; +import { ILauncher } from '@jupyterlab/launcher'; +import { IMainMenu, MainMenu } from '@jupyterlab/mainmenu'; +import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; +import { Kernel, Session } from '@jupyterlab/services'; +import { IKernelConnection } from '@jupyterlab/services/lib/kernel/kernel'; +import { ITranslator } from '@jupyterlab/translation'; +import { JSONValue, PromiseDelegate, UUID } from '@lumino/coreutils'; +import { Widget } from '@lumino/widgets'; +import { + executeMethod, + getNestedProperty, + listProperties, + setNestedProperty, + toFunction, + toJSONsubstituteCylic, + updateProperty +} from '../utils'; +import { MODULE_NAME, MODULE_VERSION } from '../version'; +import type { ConnectionModel } from './connection'; +import { JupyterFrontEndModel } from './frontend'; + +/** + * Base model for common features + */ +export class IpylabModel extends WidgetModel { + /** + * The default attributes. + */ + defaults(): Backbone.ObjectHash { + return { + ...super.defaults(), + _model_name: 'IpylabModel', + _model_module: MODULE_NAME, + _model_module_version: MODULE_VERSION, + _view_name: null, + _view_module: null, + _view_module_version: MODULE_VERSION + }; + } + + initialize(attributes: any, options: any): void { + super.initialize(attributes, options); + this.set('_ready', false); + this.save_changes(); + this.on('msg:custom', this.onCustomMessage, this); + IpylabModel.onKernelLost(this.kernel, this.onKernelLost, this); + this.widget_manager.get_model(this.model_id).then(() => this.ipylabInit()); + } + + /** + * Finish initializing the model. + * Overload this method as required. + * + * When overloading call: + * `await super.ipylabInit()` + * + * @param base override the base of the instance. + */ + async ipylabInit(base: any = null) { + if (!base) { + let subpath; + [base, subpath] = this.toBaseAndSubpath(this.get('ipylab_base'), 'this'); + base = getNestedProperty({ obj: base, subpath, nullIfMissing: true }); + if (!base) { + this.send({ + error: `Invalid ipylab_base '${this.get('ipylab_base')}'!` + }); + this.close(); + } + } + Object.defineProperty(this, 'base', { + value: base, + writable: false, + configurable: true + }); + this.setReady(); + } + + /** + * This is called once the object is ready by ipylabInit. + * It can be overloaded, but shouldn't be called. + */ + setReady() { + this.set('_ready', true); + this.save_changes(); + } + + onKernelLost() { + this.close(true); + } + + close(comm_closed?: boolean): Promise { + this._pendingOperations.forEach(opDone => opDone.reject('Closed')); + this._pendingOperations.clear(); + comm_closed = comm_closed || !this.commAvailable; + if (!comm_closed) { + this.send({ closed: true }); + } + Object.defineProperty(this, 'base', { value: null }); + return super.close(true); + } + + save_changes(callbacks?: object): void { + if (this.commAvailable) { + super.save_changes(callbacks); + } + } + + /** + * Send a custom msg over the comm. + */ + send( + content: any, + callbacks?: ICallbacks, + buffers?: ArrayBuffer[] | ArrayBufferView[] + ) { + try { + content = JSON.stringify(content); + } catch { + if (content.transform === 'auto') { + content.payload = { + cid: IpylabModel.ConnectionModel.get_cid(content.payload, true) + }; + } + content = toJSONsubstituteCylic(content); + } + super.send(content, callbacks, buffers); + } + + /** + * Throw an error with extra detail about the current object + */ + error(msg: string): never { + throw new Error(`${msg}\nPython class = ${this.get('_python_class')}`); + } + + /** + * Schedule an operation to be performed in Python. + * This is a mirror of `Ipylab.operation` in Python. + * + * @param operation The name of the operation to perform in Python. + * @param payload Payload to send to Python. + * @param transform The type of transformation to apply on the returned result. + */ + async scheduleOperation( + operation: string, + payload: JSONValue, + transform: any + ): Promise { + const ipylab_FE = UUID.uuid4(); + // Create callbacks to be resolved when a custom message is received + // with the key `ipylab_FE`. + const opDone = new PromiseDelegate(); + this._pendingOperations.set(ipylab_FE, opDone); + this.send({ ipylab_FE, operation, payload }); + const result: any = await opDone.promise; + return await this.transformObject(result, transform); + } + + /** + * Perform an operation and return the result. + * + * Overload as required. + * + * @param op Name of the operation. + * @param payload Options relevant to the operation. + * @returns Raw result of the operation. + */ + async operation(op: string, payload: any): Promise { + switch (op) { + case 'genericOperation': + return await this.genericOperation(payload); + default: + // Each failed operation should throw an error if it is un-handled + throw new Error(`genericOperation "${op}" not implemented!`); + } + } + + /** + * Perform a generic operation and return the result. + */ + async genericOperation(payload: any): Promise { + payload.obj = this.getBase(payload.basename); + switch (payload.genericOperation) { + case 'executeMethod': + return await executeMethod(payload); + case 'getProperty': + return await getNestedProperty(payload); + case 'listProperties': + payload.obj = getNestedProperty(payload); + return listProperties(payload); + case 'setProperty': + return setNestedProperty(payload); + case 'updateProperty': + return updateProperty(payload); + default: + this.error(`'${payload.methodName}' has not been implemented`); + } + } + + /** + * Handle messages + * 1. Response to requested operation sent to Python (ipylab_FE). + * 2. Operation requests received from the Python (ipylab_PY). + * 3. close - close always starts from the frontend unless the kernel is lost. + * 4. Log messages for the Jupyterlab logger. + * + * @param msg + */ + private async onCustomMessage(msg: any) { + if (typeof msg !== 'string') { + return; + } + const content = JSON.parse(msg); + + if (content.ipylab_FE) { + // Result of an operation request sent to Python. + const op = this._pendingOperations.get(content.ipylab_FE); + const { kwgs, toLuminoWidget, toObject } = content; + this._pendingOperations.delete(content.ipylab_FE); + try { + await this.replaceParts(kwgs, toLuminoWidget, toObject); + } catch (e) { + content.error = e; + } + if (op) { + if (content.error) { + op.reject(new Error(content.error?.repr ?? content.error)); + } else { + op.resolve(content.payload); + } + } + } else if (content.ipylab_PY) { + this.doOperationForPython(content); + } else if (content.close) { + this.close(true); + } else if (content.log) { + const { log, toLuminoWidget, toObject } = content; + this.replaceParts(log, toLuminoWidget, toObject); + IpylabModel.JFEM.getModelByKernelId(this.kernel.id).logger.log(log); + } + } + + /** + * Perform an operation request issued from a Python kernel. + * @param content + */ + private async doOperationForPython(content: any) { + const { operation, ipylab_PY, transform } = content; + const { kwgs, toLuminoWidget, toObject } = content; + try { + await this.replaceParts(kwgs, toLuminoWidget, toObject); + let obj, buffers; + obj = await this.operation(operation, kwgs); + if (obj?.payload) { + buffers = obj.buffers; + obj = obj.payload; + } + const payload = (await this.transformObject(obj, transform)) ?? null; + this.send({ ipylab_PY, operation, payload }, null, buffers); + } catch (e) { + this.send({ operation, ipylab_PY, error: `${(e as Error).message}` }); + console.error(e); + } + } + + /** + * Replace parts in obj that are indicated by the arrays + * - toLuminoWidget + * - toObject + * + * @param obj The object (map) with elements to be replaced. + * @param toLuminoWidget A list of elements to replace with widgets. + * @param toObject A list of elements to replace with objects. + */ + private async replaceParts( + obj: Map, + toLuminoWidget?: Array, + toObject?: Array + ) { + if (toLuminoWidget instanceof Array) { + // Replace values in kwgs with widgets + for (const subpath of toLuminoWidget) { + const value = getNestedProperty({ obj, subpath }); + if (value) { + const lw = await IpylabModel.toLuminoWidget({ id: value }); + setNestedProperty({ obj, subpath, value: lw }); + } + } + } + if (toObject instanceof Array) { + for (const subpath of toObject) { + let base, value; + value = getNestedProperty({ obj, subpath }); + if (value) { + [base, value] = this.toBaseAndSubpath(value); + value = await IpylabModel.toObject(base, value); + setNestedProperty({ obj, subpath, value }); + } + } + } + } + + /** + * Get the base and subpath from value. + * + * When `default_basename` will be used when `value` is a string. + * + * @param value can be either [basename, subpath] or subpath. + * @param defaultBasename A basename to use when value is just a subpath. + * @returns [base, subpath] + */ + private toBaseAndSubpath( + value: string | Array, + defaultBasename = 'base' + ): [any, string] { + let basename = defaultBasename; + if (value instanceof Array) { + [basename, value] = value; + } + return [this.getBase(basename), value ?? '']; + } + + /** + * Get the object referenced by basename. + */ + private getBase(basename: string) { + switch (basename) { + case 'this': + return this; + case 'base': + return this.base; + case 'IpylabModel': + return IpylabModel; + case 'MainMenu': + return MainMenu; + default: + this.error(`Invalid basename: "${basename}"`); + } + } + + /** + * Transform the object for sending. + * @param base + * @param args The mode as a string or an object with mode and any other parameters. + * @returns + */ + private async transformObject(obj: any, args: string | any): Promise { + const transform = typeof args === 'string' ? args : args.transform; + let result, func; + + switch (transform) { + case 'auto': + if (obj?.dispose) { + return { cid: IpylabModel.ConnectionModel.get_cid(obj, true) }; + } + return await obj; + case 'null': + return null; + case 'connection': + if (args.cid) { + IpylabModel.ConnectionModel.registerConnection(args.cid, obj); + } + return { cid: IpylabModel.ConnectionModel.get_cid(obj, true) }; + case 'advanced': + // expects args.mappings = {key:transform} + result = new Object(); + for (const key of Object.keys(args.mappings)) { + const base = getNestedProperty({ obj, subpath: key }); + (result as any)[key] = await this.transformObject( + base, + args.mappings[key] + ); + } + return result as any; + case 'function': + func = toFunction(args.code).bind(this); + if (func.constructor.name === 'AsyncFunction') { + return await func(obj, args); + } + return func(obj); + case 'object': + // 'object' is used by the frontend only. + if (obj) { + try { + return await IpylabModel.toObject(null, obj); + } catch { + return obj; + } + } + return obj; + default: + this.error(`Invalid return mode: '${transform}'`); + } + } + + get kernel(): Kernel.IKernelConnection { + return (this.widget_manager as any).kernel; + } + + get commAvailable(): boolean { + return ( + !this.kernel?.isDisposed && + this.comm && + !['dead', 'restarting'].includes(this.kernel?.status) + ); + } + + /** + * Get or create a lumino widget. + * + * @param args: an object with 'id' and 'vpath' + * args is updated as the object is located + * @returns + */ + static async toLuminoWidget({ + cid = '', + id = '', + ipy_model = '' + }: { cid?: string; id?: string; ipy_model?: string } = {}): Promise { + let widget: Widget; + + widget = IpylabModel.ConnectionModel.getConnection(cid) as Widget; + if (widget instanceof Widget) { + return widget; + } + if (!ipy_model && id.slice(0, 10) === 'IPY_MODEL_') { + ipy_model = id.slice(10).split(':', 1)[0]; + } + if (ipy_model) { + let model = await IpylabModel.JFEM.getWidgetModel(ipy_model); + if ((model as ConnectionModel).isConnectionModel) { + model = (model as ConnectionModel).base; + } + if (!model.get('_view_name')) { + const name = model.get('_model_name'); + throw new Error(`Model '${name}' does not have a view!`); + } + const manager = model.widget_manager as KernelWidgetManager; + widget = (await manager.create_view(model, {})).luminoWidget; + IpylabModel.onKernelLost(manager.kernel, widget.dispose, widget); + } + if (!(widget instanceof Widget)) { + throw new Error( + `Unable to create a luminoWidget cid='${cid}' id='${id}' ipy_model='${ipy_model}` + ); + } + return widget; + } + + /** + * Returns the object for the subpath 'value'. + * 1. If value starts with IPY_MODEL_ it will ignore the base, instead + * unpacking the model and return the object relative to subpath after + * the model name. If there is no path after the model id it will be the model. + * 2. The object as specified by the subpath relate to the base will be returned. + * 3. An error will be thrown if the value doesn't point an existing attribute. + * + * @param obj The object to locate the dotted value. + * @param value The subpath on the base (except for IPY_MODEL_). + * @param nullIfMissing Return a null instead of throwing an error if missing. + */ + static async toObject( + obj: any, + value: any, + nullIfMissing = false + ): Promise { + if (typeof value === 'string') { + let subpath = value; + if (value.slice(0, 10) === 'IPY_MODEL_') { + let model_id; + [model_id, subpath] = value.slice(10).split('.', 2); + obj = await IpylabModel.JFEM.getWidgetModel(model_id); + if (obj.isConnectionModel) { + obj = obj.base; + } + } + subpath = subpath ?? ''; + return await getNestedProperty({ obj, subpath, nullIfMissing }); + } + throw new Error(`Cannot convert this value to an object: ${value}`); + } + + /** + * Will call the callback once the kernel dead or restarted or disposed. + * + * Use this to close the corresponding frontend objects. + */ + static onKernelLost( + kernel: IKernelConnection, + callback: () => any, + thisArg: object + ) { + if (!Private.kernelLostCallbacks.has(kernel)) { + Private.kernelLostCallbacks.set(kernel, new Set()); + kernel.disposed.connect(_kernelLost); + kernel.statusChanged.connect(_onKernelStatusChanged); + } + Private.kernelLostCallbacks.get(kernel).add([callback, thisArg]); + } + + static get sessionManager(): Session.IManager { + return IpylabModel.app.serviceManager.sessions; + } + + static serializers: ISerializers = { + ...WidgetModel.serializers + }; + widget_manager: KernelWidgetManager; + private _pendingOperations = new Map>(); + readonly base: any; + static app: JupyterFrontEnd; + static rendermime: IRenderMimeRegistry; + static labShell: LabShell; + static defaultBrowser: IDefaultFileBrowser; + static palette: ICommandPalette; + static translator: ITranslator; + translator = IpylabModel.translator.load('jupyterlab'); + static launcher: ILauncher; + static mainMenu: IMainMenu; + static tracker = new WidgetTracker({ namespace: 'ipylab' }); + static JFEM: typeof JupyterFrontEndModel; + static ConnectionModel: typeof ConnectionModel; + static Notification = Notification; +} + +/** + * React to changes to the kernel status. + */ +function _onKernelStatusChanged(kernel: Kernel.IKernelConnection) { + if (['dead', 'restarting'].includes(kernel.status)) { + _kernelLost(kernel); + } +} + +function _kernelLost(kernel: IKernelConnection) { + if (!Private.kernelLostCallbacks.has(kernel)) { + return; + } + Private.kernelLostCallbacks.get(kernel).forEach(cb => cb[0].bind(cb[1])()); + Private.kernelLostCallbacks.delete(kernel); + kernel.statusChanged.disconnect(_kernelLost); + kernel.disposed.disconnect(_kernelLost); +} + +/** + * A namespace for private data + */ +namespace Private { + export const kernelLostCallbacks = new Map< + IKernelConnection, + Set<[() => any, object]> + >(); +} diff --git a/src/widgets/notification.ts b/src/widgets/notification.ts new file mode 100644 index 00000000..395fc4bf --- /dev/null +++ b/src/widgets/notification.ts @@ -0,0 +1,85 @@ +// Copyright (c) ipylab contributors +// Distributed under the terms of the Modified BSD License. + +import { Notification } from '@jupyterlab/apputils'; +import { ObservableDisposable } from '../observable_disposable'; +import { IpylabModel } from './ipylab'; +/** + * The model for a notification. + */ +export class NotificationManagerModel extends IpylabModel { + /** + * The default attributes. + */ + defaults(): Backbone.ObjectHash { + return { + ...super.defaults(), + _model_name: 'NotificationManagerModel' + }; + } + + async operation(op: string, payload: any): Promise { + switch (op) { + case 'update': + return this.base.update(payload.args); + case 'notification': + return this.notification(payload); + case 'createAction': + return this.createAction(payload); + default: + return await super.operation(op, payload); + } + } + + notification(payload: any) { + const { message, type, options } = payload; + const id = this.base.notify(message, type, options); + return new NotifyLink(id); + } + + createAction(payload: any) { + const action = { ...payload } as any; + const cid = action.cid; + action.callback = (event: MouseEvent) => { + if (action.keep_open) { + event.preventDefault(); + } + return this.scheduleOperation('action_callback', { cid }, 'auto'); + }; + return action; + } + + public readonly base: typeof Notification.manager; +} + +/** + * A small object to keep track of a notification in the notification manager by its id. + * + * It will dispose itself once the manager no longer 'has' the id registered. + */ +class NotifyLink extends ObservableDisposable { + constructor(public id: string = '') { + super(); + this.id = id; + this.manager.changed.connect(this._check_exists, this); + } + + get manager() { + return IpylabModel.Notification.manager; + } + + _check_exists() { + if (!this.manager.has(this.id)) { + this.dispose(); + } + } + + dispose(): void { + if (this.isDisposed) { + return; + } + this.manager.changed.disconnect(this._check_exists, this); + IpylabModel.Notification.manager.dismiss(this.id); + super.dispose(); + } +} diff --git a/src/widgets/palette.ts b/src/widgets/palette.ts deleted file mode 100644 index 27498dbb..00000000 --- a/src/widgets/palette.ts +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) ipylab contributors -// Distributed under the terms of the Modified BSD License. - -import { ICommandPalette, IPaletteItem } from '@jupyterlab/apputils'; - -import { ObservableMap } from '@jupyterlab/observables'; - -import { - DOMWidgetModel, - ISerializers, - WidgetModel -} from '@jupyter-widgets/base'; - -import { IDisposable } from '@lumino/disposable'; - -import { MODULE_NAME, MODULE_VERSION } from '../version'; - -/** - * The model for a command palette. - */ -export class CommandPaletteModel extends WidgetModel { - /** - * The default attributes. - */ - defaults(): any { - return { - ...super.defaults(), - _model_name: CommandPaletteModel.model_name, - _model_module: CommandPaletteModel.model_module, - _model_module_version: CommandPaletteModel.model_module_version, - _items: [] - }; - } - - /** - * Initialize a CommandPaletteModel instance. - * - * @param attributes The base attributes. - * @param options The initialization options. - */ - initialize(attributes: any, options: any): void { - this._palette = CommandPaletteModel.palette; - super.initialize(attributes, options); - - this.on('msg:custom', this._onMessage.bind(this)); - - // restore existing items - const items = this.get('_items'); - items.forEach((item: any) => this._addItem(item)); - } - - /** - * Handle a custom message from the backend. - * - * @param msg The message to handle. - */ - private _onMessage(msg: any): void { - switch (msg.func) { - case 'addItem': { - this._addItem(msg.payload); - // keep track of the items - const items = this.get('_items'); - this.set('_items', items.concat(msg.payload)); - this.save_changes(); - break; - } - default: - break; - } - } - - /** - * Add a new item to the command palette. - * - * @param options The item options. - */ - private _addItem(options: IPaletteItem & { id: string }): void { - if (!this._palette) { - // no-op if no palette - return; - } - const { id, category, args, rank } = options; - const itemId = `${id}-${category}`; - if (Private.customItems.has(itemId)) { - // no-op if the item is already in the palette - return; - } - const item = this._palette.addItem({ command: id, category, args, rank }); - Private.customItems.set(itemId, item); - } - - static serializers: ISerializers = { - ...DOMWidgetModel.serializers - }; - - static model_name = 'CommandPaletteModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name: string = null; - static view_module: string = null; - static view_module_version = MODULE_VERSION; - - private _palette: ICommandPalette; - - static palette: ICommandPalette; -} - -/** - * A namespace for private data - */ -namespace Private { - export const customItems = new ObservableMap(); -} diff --git a/src/widgets/panel.ts b/src/widgets/panel.ts index aa9ea338..6f599cb0 100644 --- a/src/widgets/panel.ts +++ b/src/widgets/panel.ts @@ -1,27 +1,54 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. -import { VBoxModel } from '@jupyter-widgets/controls'; - +import { JupyterLuminoPanelWidget, unpack_models } from '@jupyter-widgets/base'; +import { BoxModel, BoxView } from '@jupyter-widgets/controls'; import { MODULE_NAME, MODULE_VERSION } from '../version'; +import { TitleModel } from '../widgets/title'; /** * The model for a panel. */ -export class PanelModel extends VBoxModel { +export class PanelModel extends BoxModel { /** * The default attributes. */ - defaults(): any { + defaults(): Backbone.ObjectHash { return { ...super.defaults(), - _model_name: PanelModel.model_name, - _model_module: PanelModel.model_module, - _model_module_version: PanelModel.model_module_version + _model_name: 'PanelModel', + _model_module: MODULE_NAME, + _model_module_version: MODULE_VERSION, + _view_name: 'PanelView', + _view_module: MODULE_NAME, + _view_module_version: MODULE_VERSION }; } - static model_name = 'PanelModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; + static serializers = { + ...BoxModel.serializers, + title: { deserialize: unpack_models } + }; +} + +/** + * The view for a Panel. + */ +export class PanelView extends BoxView { + initialize(parameters: any): void { + super.initialize(parameters); + this.listenTo(this.model.get('title'), 'change', this.update_title); + this.luminoWidget.removeClass('widget-box'); + // this.luminoWidget.removeClass('jupyter-widgets'); + this.luminoWidget.addClass('ipylab-Panel'); + this.update_title(); + } + + update_title() { + const title: TitleModel = this.model.get('title'); + title.update_title(this.luminoWidget.title); + } + + model: PanelModel; + luminoWidget: JupyterLuminoPanelWidget; } diff --git a/src/widgets/sessions.ts b/src/widgets/sessions.ts deleted file mode 100644 index 7daed119..00000000 --- a/src/widgets/sessions.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) ipylab contributors -// Distributed under the terms of the Modified BSD License. - -// SessionManager exposes `JupyterLab.serviceManager.sessions` to user python kernel - -import { ISerializers, WidgetModel } from '@jupyter-widgets/base'; -import { toArray } from '@lumino/algorithm'; -import { MODULE_NAME, MODULE_VERSION } from '../version'; -import { Session } from '@jupyterlab/services'; -import { ILabShell, JupyterFrontEnd } from '@jupyterlab/application'; - -/** - * The model for a Session Manager - */ -export class SessionManagerModel extends WidgetModel { - /** - * The default attributes. - */ - defaults(): any { - return { - ...super.defaults(), - _model_name: SessionManagerModel.model_name, - _model_module: SessionManagerModel.model_module, - _model_module_version: SessionManagerModel.model_module_version, - current_session: null, - sessions: [] - }; - } - - /** - * Initialize a SessionManagerModel instance. - * - * @param attributes The base attributes. - * @param options The initialization options. - */ - initialize(attributes: any, options: any): void { - const { labShell, sessions, shell } = SessionManagerModel; - this._sessions = sessions; - this._shell = shell; - this._labShell = labShell; - - sessions.runningChanged.connect(this._sendSessions, this); - - super.initialize(attributes, options); - this.on('msg:custom', this._onMessage.bind(this)); - - if (this._labShell) { - this._labShell.currentChanged.connect(this._currentChanged, this); - this._labShell.activeChanged.connect(this._currentChanged, this); - } else { - this._currentChanged(); - } - - this._sendSessions(); - this._sendCurrent(); - this.send({ event: 'sessions_initialized' }, {}); - } - - /** - * Handle a custom message from the backend. - * - * @param msg The message to handle. - */ - private _onMessage(msg: any): void { - switch (msg.func) { - case 'refreshRunning': - this._sessions.refreshRunning().then(() => { - this.send({ event: 'sessions_refreshed' }, {}); - }); - break; - default: - break; - } - } - - /** - * get sessionContext from a given widget instance - * - * @param widget widget tracked by app.shell._track (FocusTracker) - */ - private _getSessionContext( - widget: any - ): Session.IModel | Record { - return widget?.sessionContext?.session?.model ?? {}; - } - - /** - * Handle focus change in JLab - * - * NOTE: currentChange fires on two situations that we are concerned about here: - * 1. when user focuses on a widget in browser, which the `change.newValue` will - * be the current Widget - * 2. when user executes a code in console/notebook, where the `changed.newValue` will be null since - * we lost focus due to execution. - * To solve this problem, we interrogate `this._tracker.currentWidget` directly. - * We also added a simple fencing to reduce the number of Comm sync calls between Python/JS - */ - private _currentChanged(): void { - this._current_session = this._getSessionContext(this._shell.currentWidget); - this.set('current_session', this._current_session); - this.set('sessions', toArray(this._sessions.running())); - this.save_changes(); - } - - /** - * Send the list of sessions to the backend. - */ - private _sendSessions(): void { - this.set('sessions', toArray(this._sessions.running())); - this.save_changes(); - } - - /** - * send current session to backend - */ - private _sendCurrent(): void { - this._current_session = this._getSessionContext(this._shell.currentWidget); - this.set('current_session', this._current_session); - this.save_changes(); - } - - static serializers: ISerializers = { - ...WidgetModel.serializers - }; - - static model_name = 'SessionManagerModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name: string = null; - static view_module: string = null; - static view_module_version = MODULE_VERSION; - - private _current_session: Session.IModel | Record; - private _sessions: Session.IManager; - static sessions: Session.IManager; - private _shell: JupyterFrontEnd.IShell; - private _labShell: ILabShell | null; - static shell: JupyterFrontEnd.IShell; - static labShell: ILabShell | null; -} diff --git a/src/widgets/shell.ts b/src/widgets/shell.ts index af21e029..874445d9 100644 --- a/src/widgets/shell.ts +++ b/src/widgets/shell.ts @@ -1,175 +1,102 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. -import { JupyterFrontEnd, ILabShell } from '@jupyterlab/application'; +import { MainAreaWidget } from '@jupyterlab/apputils'; +import { UUID } from '@lumino/coreutils'; +import { IpylabModel } from './ipylab'; +import { Widget } from '@lumino/widgets'; -import { DOMUtils } from '@jupyterlab/apputils'; - -import { - ISerializers, - WidgetModel, - unpack_models -} from '@jupyter-widgets/base'; - -import { ArrayExt } from '@lumino/algorithm'; - -import { Message, MessageLoop } from '@lumino/messaging'; - -import { MODULE_NAME, MODULE_VERSION } from '../version'; - -/** - * The model for a shell. - */ -export class ShellModel extends WidgetModel { +export class ShellModel extends IpylabModel { /** * The default attributes. */ - defaults(): any { - return { - ...super.defaults(), - _model_name: ShellModel.model_name, - _model_module: ShellModel.model_module, - _model_module_version: ShellModel.model_module_version, - _widgets: [] - }; + defaults(): Backbone.ObjectHash { + return { ...super.defaults(), _model_name: 'ShellModel' }; } - /** - * Initialize a ShellModel instance. - * - * @param attributes The base attributes. - * @param options The initialization options. - */ - initialize(attributes: any, options: any): void { - this._shell = ShellModel.shell; - this._labShell = ShellModel.labShell; - - super.initialize(attributes, options); - this.on('msg:custom', this._onMessage.bind(this)); - - // restore existing widgets - const widgets = this.get('_widgets'); - widgets.forEach((w: any) => this._add(w)); + async operation(op: string, payload: any): Promise { + switch (op) { + case 'addToShell': + return await ShellModel.addToShell(payload.args); + default: + return await super.operation(op, payload); + } } /** - * Add a widget to the application shell - * - * @param payload The payload to add + * Provided for IpylabModel.tracker for restoring widgets to the shell. + * @param args `ipylabSettings` in 'addToShell' */ - private async _add(payload: any): Promise { - const { serializedWidget, area, args, id } = payload; - const model = await unpack_models(serializedWidget, this.widget_manager); - const view = await this.widget_manager.create_view(model, {}); - const title = await unpack_models(model.get('title'), this.widget_manager); - const luminoWidget = view.luminoWidget; - - luminoWidget.id = id ?? DOMUtils.createDomID(); - - MessageLoop.installMessageHook( - luminoWidget, - (handler: any, msg: Message) => { - switch (msg.type) { - case 'close-request': { - const widgets = this.get('_widgets').slice(); - ArrayExt.removeAllWhere(widgets, (w: any) => w.id === handler.id); - this.set('_widgets', widgets); - this.save_changes(); - break; - } - } - return true; - } - ); - - const updateTitle = async (): Promise => { - luminoWidget.title.caption = title.get('caption'); - luminoWidget.title.className = title.get('class_name'); - luminoWidget.title.closable = title.get('closable'); - luminoWidget.title.label = title.get('label'); - luminoWidget.title.dataset = title.get('dataset'); - luminoWidget.title.iconLabel = title.get('icon_label'); - - const icon = await unpack_models(title.get('icon'), this.widget_manager); - luminoWidget.title.icon = icon ? icon.labIcon : null; - luminoWidget.title.iconClass = icon ? null : title.get('icon_class'); - }; - - title.on('change', updateTitle); - void updateTitle(); - - if ((area === 'left' || area === 'right') && this._labShell) { - let handler; - if (area === 'left') { - handler = this._labShell['_leftHandler']; - } else { - handler = this._labShell['_rightHandler']; + static async restoreToShell(args: any) { + // Wait for backend to load/reload plugins. + await ShellModel.JFEM.getModelByVpath(args.vpath); + try { + await ShellModel.addToShell(args); + } catch (e) { + if (args.evaluate) { + throw e; } - - // handle tab closed event - handler.sideBar.tabCloseRequested.connect((sender: any, tab: any) => { - tab.title.owner.close(); - }); - - luminoWidget.addClass('jp-SideAreaWidget'); } - - this._shell.add(luminoWidget, area, args); - return luminoWidget.id; } /** - * Handle a custom message from the backend. + * Add a widget to the application shell. * - * @param msg The message to handle. + * This function can handle ipywidgets and native Widgets and be used to move + * widgets about the shell. + * + * Ipywidgets are added to a tracker enabling restoration from a + * running kernel such as page refreshing and switching workspaces. + * + * Generative widget creation is supported with 'evaluate' using the same + * code as 'evalute'. The evaluated code MUST return a widget with a view to be valid. + * + * @param args An object with area, options, cid, id, vpath & evaluate. */ - private async _onMessage(msg: any): Promise { - switch (msg.func) { - case 'add': { - const id = await this._add(msg.payload); - // keep track of the widgets added to the shell - const widgets = this.get('_widgets'); - this.set( - '_widgets', - widgets.concat({ - ...msg.payload, - id - }) - ); - this.save_changes(); - break; - } - case 'expandLeft': { - if (this._labShell) { - this._labShell.expandLeft(); - } - break; + + private static async addToShell(args: any): Promise { + let widget: Widget | MainAreaWidget; + + try { + widget = await IpylabModel.toLuminoWidget(args); + // Create a new lumino widget + } catch (e) { + if (args.evaluate) { + // Evaluate code in python to get a panel and then add it to the shell. + const jfem = await IpylabModel.JFEM.getModelByVpath(args.vpath); + return await jfem.scheduleOperation('shell_eval', args, 'object'); + } else { + throw e; } - case 'expandRight': { - if (this._labShell) { - this._labShell.expandRight(); - } - break; + } + if ( + (args.area === 'main' && !(widget instanceof MainAreaWidget)) || + typeof widget.title === 'undefined' + ) { + // Wrap the widget with a MainAreaWidget + const w = (widget = new MainAreaWidget({ content: widget })); + w.node.removeChild(w.toolbar.node); + w.addClass('ipylab-MainArea'); + } + args.cid = + args.cid || IpylabModel.ConnectionModel.new_cid('ShellConnection'); + IpylabModel.ConnectionModel.registerConnection(args.cid, widget); + + widget.id = widget.id || args.cid || UUID.uuid4(); + IpylabModel.app.shell.add(widget as any, args.area || 'main', args.options); + + // Register widgets originating from IpyWidgets + if (args.ipy_model) { + widget.addClass('ipylab-shell'); + if (!IpylabModel.tracker.has(widget)) { + (widget as any).ipylabSettings = args; + IpylabModel.tracker.add(widget); + } else { + (widget as any).ipylabSettings.area = args.area; + (widget as any).ipylabSettings.options = args.options; + IpylabModel.tracker.save(widget); } - default: - break; } + return widget; } - - static serializers: ISerializers = { - ...WidgetModel.serializers - }; - - static model_name = 'ShellModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name: string = null; - static view_module: string = null; - static view_module_version = MODULE_VERSION; - - private _shell: JupyterFrontEnd.IShell; - private _labShell: ILabShell; - - static shell: JupyterFrontEnd.IShell; - static labShell: ILabShell; } diff --git a/src/widgets/split_panel.ts b/src/widgets/split_panel.ts index b2dd317c..e340cb75 100644 --- a/src/widgets/split_panel.ts +++ b/src/widgets/split_panel.ts @@ -1,19 +1,15 @@ // Copyright (c) ipylab contributors // Distributed under the terms of the Modified BSD License. -import { JupyterLuminoWidget, DOMWidgetView } from '@jupyter-widgets/base'; - -import { VBoxView } from '@jupyter-widgets/controls'; - import { Message } from '@lumino/messaging'; - import { SplitPanel } from '@lumino/widgets'; +import { PanelModel, PanelView } from './panel'; -import $ from 'jquery'; - -import { PanelModel } from './panel'; - -import { MODULE_NAME, MODULE_VERSION } from '../version'; +export declare namespace JupyterLuminoSplitPanelWidget { + interface IOptions { + view: SplitPanelView; + } +} /** * A Lumino widget for split panels. @@ -24,18 +20,20 @@ class JupyterLuminoSplitPanelWidget extends SplitPanel { * * @param options The instantiation options for a JupyterLuminoSplitPanelWidget. */ - constructor(options: JupyterLuminoWidget.IOptions & SplitPanel.IOptions) { + constructor( + options: JupyterLuminoSplitPanelWidget.IOptions & SplitPanel.IOptions + ) { const view = options.view; - delete options.view; + delete (options as any).view; super(options); - this.addClass('jp-JupyterLuminoSplitPanelWidget'); this._view = view; } /** - * Handle a lumino message. + * Process the Lumino message. * - * @param msg The message to handle. + * Any custom Lumino widget used inside a Jupyter widget should override + * the processMessage function like this. */ processMessage(msg: Message): void { super.processMessage(msg); @@ -44,19 +42,19 @@ class JupyterLuminoSplitPanelWidget extends SplitPanel { /** * Dispose the widget. + * + * This causes the view to be destroyed as well with 'remove' */ dispose(): void { if (this.isDisposed) { return; } super.dispose(); - if (this._view) { - this._view.remove(); - } + this._view?.remove(); this._view = null; } - private _view: DOMWidgetView; + private _view: SplitPanelView; } /** @@ -66,30 +64,25 @@ export class SplitPanelModel extends PanelModel { /** * The default attributes. */ - defaults(): any { + defaults(): Backbone.ObjectHash { return { ...super.defaults(), - _model_name: SplitPanelModel.model_name, - _model_module: SplitPanelModel.model_module, - _model_module_version: SplitPanelModel.model_module_version, - _view_name: SplitPanelModel.model_name, - _view_module: SplitPanelModel.model_module, - _view_module_version: SplitPanelModel.model_module_version + _model_name: 'SplitPanelModel', + _view_name: 'SplitPanelView' }; } - - static model_name = 'SplitPanelModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name = 'SplitPanelView'; - static view_module = MODULE_NAME; - static view_module_name = MODULE_VERSION; } /** * The view for a split panel. */ -export class SplitPanelView extends VBoxView { +export class SplitPanelView extends PanelView { + initialize(parameters: any): void { + super.initialize(parameters); + this.luminoWidget.removeClass('ipylab-Panel'); + this.luminoWidget.addClass('ipylab-SplitPanel'); + } + /** * Create the widget and return the DOM element. * @@ -97,49 +90,23 @@ export class SplitPanelView extends VBoxView { */ _createElement(tagName: string): HTMLElement { this.luminoWidget = new JupyterLuminoSplitPanelWidget({ - view: this, - orientation: this.model.get('orientation') + view: this }) as any; return this.luminoWidget.node; } /** - * Set the DOM element. - * - * @param el The element. + * Render the view. */ - _setElement(el: HTMLElement): void { - if (this.el || el !== this.luminoWidget.node) { - throw new Error('Cannot reset the DOM element.'); - } - - this.el = this.luminoWidget.node; - this.$el = $(this.luminoWidget.node); + render() { + super.render(); + this.update_luminoWidget(); + this.listenTo(this.model, 'change:orientation', this.update_luminoWidget); } - /** - * Initialize a SplitPanelView instance. - * - * @param parameters The view parameters. - */ - initialize(parameters: any): void { - super.initialize(parameters); + update_luminoWidget() { const luminoWidget = this .luminoWidget as any as JupyterLuminoSplitPanelWidget; - this.model.on('change:orientation', () => { - const orientation = this.model.get('orientation'); - luminoWidget.orientation = orientation; - }); - } - - /** - * Render the view. - */ - async render(): Promise { - super.render(); - const views = await Promise.all(this.children_views.views); - views.forEach(async (view: DOMWidgetView) => { - this.luminoWidget.addWidget(view.luminoWidget); - }); + luminoWidget.orientation = this.model.get('orientation'); } } diff --git a/src/widgets/title.ts b/src/widgets/title.ts index 793235d2..a52a5893 100644 --- a/src/widgets/title.ts +++ b/src/widgets/title.ts @@ -2,8 +2,9 @@ // Distributed under the terms of the Modified BSD License. import { WidgetModel, unpack_models } from '@jupyter-widgets/base'; - +import { Title } from '@lumino/widgets'; import { MODULE_NAME, MODULE_VERSION } from '../version'; +import { IconModel } from './icon'; /** * The model for a title widget. @@ -12,15 +13,17 @@ export class TitleModel extends WidgetModel { /** * The default attributes. */ - defaults(): any { + defaults(): Backbone.ObjectHash { return { ...super.defaults(), - _model_name: TitleModel.model_name, - _model_module: TitleModel.model_module, - _model_module_version: TitleModel.model_module_version + _model_name: 'TitleModel', + _model_module: MODULE_NAME, + _model_module_version: MODULE_VERSION, + _view_name: null, + _view_module: MODULE_NAME, + _view_module_version: MODULE_VERSION }; } - /** * Initialize a LabIcon instance. * @@ -29,23 +32,38 @@ export class TitleModel extends WidgetModel { */ initialize(attributes: any, options: any): void { super.initialize(attributes, options); - this.on('change:icon', this.iconChanged); + this.on('change:icon', this._iconChanged); } /** - * Pass on changes from the icon. + * Load settings into the widget + * @param luminoWidget */ - async iconChanged() { - const icon = await unpack_models(this.get('icon'), this.widget_manager); - if (icon) { - icon.on('change', () => this.trigger('change')); - } + update_title(title: Title) { + title.caption = this.get('caption'); + title.className = this.get('class_name'); + title.label = this.get('label'); + title.dataset = this.get('dataset'); + title.iconLabel = this.get('icon_label'); + + const icon = this.get('icon'); + title.icon = icon ? icon.labIcon : null; + title.iconClass = icon ? null : this.get('icon_class'); + } + + // /** + // * Pass on changes from the icon. + // */ + private _iconChanged() { + const icon = this.get('icon'); + this.listenTo(icon, 'change', () => { + // Pass on changes from the icon. + this.trigger('change'); + }); } - static model_name = 'TitleModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name: string = null; - static view_module: string = null; - static view_module_version = MODULE_VERSION; + static serializers = { + icon: { deserialize: unpack_models } + }; + icon: IconModel; } diff --git a/style/widget.css b/style/widget.css index f357d157..154dca52 100644 --- a/style/widget.css +++ b/style/widget.css @@ -3,30 +3,30 @@ | Distributed under the terms of the Modified BSD License. |---------------------------------------------------------------------------- */ -/* Default Split Handle Color */ -.jp-JupyterLuminoSplitPanelWidget .p-SplitPanel-handle { - background-color: var(--jp-border-color2); +.ipylab-Panel { + box-sizing: border-box; + display: flex; + height: 100%; + width: 100%; + flex-direction: column; + overflow: auto; } -.jp-SideAreaWidget { - background: var(--jp-layout-color1); +.ipylab-SplitPanel { + box-sizing: border-box; display: flex; + height: 100%; + width: 100%; + overflow: hidden; } -.jp-SideBar.jp-mod-left .p-mod-closable .p-TabBar-tabCloseIcon, -.jp-SideBar.jp-mod-right .p-mod-closable .p-TabBar-tabCloseIcon { - padding: 4px 0 4px 4px; - background-size: 16px; - height: 16px; - width: 16px; - background-image: var(--jp-icon-close); - background-position: center; - background-repeat: no-repeat; - align-self: center; +/* Default Split Handle Color */ +.ipylab-SplitPanel .lm-SplitPanel-handle { + background-color: var(--jp-border-color2); } -.jp-SideBar.jp-mod-left .p-mod-closable .p-TabBar-tabCloseIcon:hover, -.jp-SideBar.jp-mod-right .p-mod-closable .p-TabBar-tabCloseIcon:hover { - background-size: 16px; - background-image: var(--jp-icon-inverse-close-circle); +.ipylab-MainArea { + box-sizing: border-box; + display: flex; + margin: 0; } diff --git a/yarn.lock b/yarn.lock index 25a70daa..24d8183d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,101 +2,342 @@ # Manual changes might be lost - proceed with caution! __metadata: - version: 8 - cacheKey: 10c0 + version: 6 + cacheKey: 8 "@aashutoshrathi/word-wrap@npm:^1.2.3": version: 1.2.6 resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 8/ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd languageName: node linkType: hard "@babel/code-frame@npm:^7.0.0": - version: 7.22.10 - resolution: "@babel/code-frame@npm:7.22.10" + version: 7.26.0 + resolution: "@babel/code-frame@npm:7.26.0" dependencies: - "@babel/highlight": "npm:^7.22.10" - chalk: "npm:^2.4.2" - checksum: 8/89a06534ad19759da6203a71bad120b1d7b2ddc016c8e07d4c56b35dea25e7396c6da60a754e8532a86733092b131ae7f661dbe6ba5d165ea777555daa2ed3c9 + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: 2a677369e9b80b956401809485e8c2ae24df5e6076f669cf26a2809fcb88f91c2f6bb1bf3fb799dfe8487b2b7a276b62d14ac230a79d7ac8c7b369090d0a43fc languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 8/7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/highlight@npm:7.22.10" +"@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" dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.5" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - checksum: 8/f714a1e1a72dd9d72f6383f4f30fd342e21a8df32d984a4ea8f5eab691bb6ba6db2f8823d4b4cf135d98869e7a98925b81306aa32ee3c429f8cfa52c75889e1b + "@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 languageName: node linkType: hard -"@codemirror/state@npm:^6.2.0": - version: 6.2.1 - resolution: "@codemirror/state@npm:6.2.1" - checksum: 8/d12a321d0471b264b9d3259042bff913a8b939e8d28d408ff452004538a71ca9d5329df3f8a1d8a9183f5b42a7ef5b200737bcab1065714f5ae8e0a5ba9d59d3 +"@codemirror/commands@npm:^6.3.3": + version: 6.7.1 + resolution: "@codemirror/commands@npm:6.7.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.4.0 + "@codemirror/view": ^6.27.0 + "@lezer/common": ^1.1.0 + checksum: 507ae0cc7f3a7bd869bca0de7e942ecb2bc0bd95a42484e5b06835ebf8caf7626c39d2bea26cefab99d07ab83ba5934afd2d07ce00dac4190aca014523f3c97e languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.3.0": - version: 2.3.1 - resolution: "@csstools/css-parser-algorithms@npm:2.3.1" +"@codemirror/lang-cpp@npm:^6.0.2": + version: 6.0.2 + resolution: "@codemirror/lang-cpp@npm:6.0.2" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/cpp": ^1.0.0 + checksum: bb9eba482cca80037ce30c7b193cf45eff19ccbb773764fddf2071756468ecc25aa53c777c943635054f89095b0247b9b50c339e107e41e68d34d12a7295f9a9 + 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" + 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 + 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" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/lang-css": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/language": ^6.4.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.17.0 + "@lezer/common": ^1.0.0 + "@lezer/css": ^1.1.0 + "@lezer/html": ^1.3.0 + checksum: ac8c3ceb0396f2e032752c5079bd950124dca708bc64e96fc147dc5fe7133e5cee0814fe951abdb953ec1d11fa540e4b30a712b5149d9a36016a197a28de45d7 + languageName: node + linkType: hard + +"@codemirror/lang-java@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-java@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/java": ^1.0.0 + checksum: 4679104683cbffcd224ac04c7e5d144b787494697b26470b07017259035b7bb3fa62609d9a61bfbc566f1756d9f972f9f26d96a3c1362dd48881c1172f9a914d + 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" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.6.0 + "@codemirror/lint": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.17.0 + "@lezer/common": ^1.0.0 + "@lezer/javascript": ^1.0.0 + checksum: 66379942a8347dff2bd76d10ed7cf313bca83872f8336fdd3e14accfef23e7b690cd913c9d11a3854fba2b32299da07fc3275995327642c9ee43c2a8e538c19d + languageName: node + linkType: hard + +"@codemirror/lang-json@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-json@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/json": ^1.0.0 + checksum: e9e87d50ff7b81bd56a6ab50740b1dd54e9a93f1be585e1d59d0642e2148842ea1528ac7b7221eb4ddc7fe84bbc28065144cc3ab86f6e06c6aeb2d4b4e62acf1 + languageName: node + linkType: hard + +"@codemirror/lang-markdown@npm:^6.2.4": + version: 6.3.0 + resolution: "@codemirror/lang-markdown@npm:6.3.0" + dependencies: + "@codemirror/autocomplete": ^6.7.1 + "@codemirror/lang-html": ^6.0.0 + "@codemirror/language": ^6.3.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.2.1 + "@lezer/markdown": ^1.0.0 + checksum: 8f3a231a0008d6b6834e58d44eac3c383cf472083ef2a68de66f9b4209bb4de1fb14f167e6e04236dbf58444299bce74715df372b1e97c9b4f207cc65daf6285 + languageName: node + linkType: hard + +"@codemirror/lang-php@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-php@npm:6.0.1" + 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 + languageName: node + linkType: hard + +"@codemirror/lang-python@npm:^6.1.4": + version: 6.1.6 + resolution: "@codemirror/lang-python@npm:6.1.6" + 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 + languageName: node + linkType: hard + +"@codemirror/lang-rust@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-rust@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/rust": ^1.0.0 + checksum: 8a439944cb22159b0b3465ca4fa4294c69843219d5d30e278ae6df8e48f30a7a9256129723c025ec9b5e694d31a3560fb004300b125ffcd81c22d13825845170 + languageName: node + linkType: hard + +"@codemirror/lang-sql@npm:^6.6.1": + version: 6.8.0 + resolution: "@codemirror/lang-sql@npm:6.8.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 1b5a3c8129b09f24039d8c0906fc4cb8d0f706a424a1d56721057bd1e647797c2b1240bb53eed9bf2bac5806a4e0363e555a3963f04c478efa05829890c537f7 + languageName: node + linkType: hard + +"@codemirror/lang-wast@npm:^6.0.2": + version: 6.0.2 + resolution: "@codemirror/lang-wast@npm:6.0.2" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 72119d4a7d726c54167aa227c982ae9fa785c8ad97a158d8350ae95eecfbd8028a803eef939f7e6c5c6e626fcecda1dc37e9dffc6d5d6ec105f686aeda6b2c24 + languageName: node + linkType: hard + +"@codemirror/lang-xml@npm:^6.1.0": + version: 6.1.0 + resolution: "@codemirror/lang-xml@npm:6.1.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.4.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/xml": ^1.0.0 + checksum: 3a1b7af07b29ad7e53b77bf584245580b613bc92256059f175f2b1d7c28c4e39b75654fe169b9a8a330a60164b53ff5254bdb5b8ee8c6e6766427ee115c4e229 + 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" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.23.0 + "@lezer/common": ^1.1.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + style-mod: ^4.0.0 + checksum: 53fb72299500f63706f78c888d6b5fd81043ea11ea2fa4c72c13c6d4794bb6f4ec29450208c56b4f40e839984b3dc73505262803fa61416baf588da389a7c577 + languageName: node + linkType: hard + +"@codemirror/legacy-modes@npm:^6.3.3": + version: 6.4.1 + resolution: "@codemirror/legacy-modes@npm:6.4.1" + dependencies: + "@codemirror/language": ^6.0.0 + checksum: 3947842c5f06db49a152bf7dd03a626806c5f2e80abfa9840927396fef08ff8bc2dfb228e7231bd8d0b7bb1a84b7ef582df8361b2bef77419e0e04bf43cc6b7d + languageName: node + linkType: hard + +"@codemirror/lint@npm:^6.0.0": + version: 6.8.2 + resolution: "@codemirror/lint@npm:6.8.2" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: 714fe911c2d600350ea8ca0f65ceb2de25ace511e71bf174a550ba0aefc9884ec4e099f0f500b55bfd0fccbd7fe3a342a0048ff5a49c8c20020ea16cc8bff3c3 + languageName: node + linkType: hard + +"@codemirror/search@npm:^6.5.6": + version: 6.5.6 + resolution: "@codemirror/search@npm:6.5.6" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: 19dc88d09fc750563347001e83c6194bbb2a25c874bd919d2d81809e1f98d6330222ddbd284aa9758a09eeb41fd153ec7c2cf810b2ee51452c25963d7f5833d5 + 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 + 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" + dependencies: + "@codemirror/state": ^6.4.0 + style-mod: ^4.1.0 + w3c-keyname: ^2.2.4 + checksum: 5c7bf199f0b45a3cc192f08c2ac89e5ab972f313cb4f2c979edf6e05b27bccd60c6cb42d5dacb6813ef3a928d75476eb0a00ffdeffd7431c8e9f44bab4f6e12e + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^2.3.1": + version: 2.7.1 + resolution: "@csstools/css-parser-algorithms@npm:2.7.1" peerDependencies: - "@csstools/css-tokenizer": ^2.2.0 - checksum: 8/90c6aa391ff817b0fc2ae20b9cc5e3308e3906536d83c8eeb502171ec709730a2cd0458eb7646378f74db545c9079fd026e125dbdbe26030652f9466bacc1183 + "@csstools/css-tokenizer": ^2.4.1 + checksum: 304e6f92e583042c310e368a82b694af563a395e5c55911caefe52765c5acb000b9daa17356ea8a4dd37d4d50132b76de48ced75159b169b53e134ff78b362ba languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.1.1": - version: 2.2.0 - resolution: "@csstools/css-tokenizer@npm:2.2.0" - checksum: 8/d6b3ead496e187cbf89b5e08a55be7a8393676c2b93526f7f051418376d08146f9f533708aca5eec6a07d925ea6a7e65b0e0bb36aabeba657666e968b8d89cd0 +"@csstools/css-tokenizer@npm:^2.2.0": + version: 2.4.1 + resolution: "@csstools/css-tokenizer@npm:2.4.1" + checksum: 395c51f8724ddc4851d836f484346bb3ea6a67af936dde12cbf9a57ae321372e79dee717cbe4823599eb0e6fd2d5405cf8873450e986c2fca6e6ed82e7b10219 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.2": - version: 2.1.4 - resolution: "@csstools/media-query-list-parser@npm:2.1.4" +"@csstools/media-query-list-parser@npm:^2.1.4": + version: 2.1.13 + resolution: "@csstools/media-query-list-parser@npm:2.1.13" peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.1 - "@csstools/css-tokenizer": ^2.2.0 - checksum: 8/8fa5be6acea01af39f49e08b2f2e2f7f54c2881c2c8a7a8cc783f8668610404398e81f86092f44ae64914d0f7626a5177d721ce5d1858b1599b26c91687f311e + "@csstools/css-parser-algorithms": ^2.7.1 + "@csstools/css-tokenizer": ^2.4.1 + checksum: 7754b4b9fcc749a51a2bcd34a167ad16e7227ff087f6c4e15b3593d3342413446b72dad37f1adb99c62538730c77e3e47842987ce453fbb3849d329a39ba9ad7 languageName: node linkType: hard "@csstools/selector-specificity@npm:^3.0.0": - version: 3.0.0 - resolution: "@csstools/selector-specificity@npm:3.0.0" + version: 3.1.1 + resolution: "@csstools/selector-specificity@npm:3.1.1" peerDependencies: postcss-selector-parser: ^6.0.13 - checksum: 8/4a2dfe69998a499155d9dab4c2a0e7ae7594d8db98bb8a487d2d5347c0c501655051eb5eacad3fe323c86b0ba8212fe092c27fc883621e6ac2a27662edfc3528 + checksum: 3786a6afea97b08ad739ee8f4004f7e0a9e25049cee13af809dbda6462090744012a54bd9275a44712791e8f103f85d21641f14e81799f9dab946b0459a5e1ef languageName: node linkType: hard "@discoveryjs/json-ext@npm:^0.5.0": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 8/2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.31.0": - version: 0.31.0 - resolution: "@es-joy/jsdoccomment@npm:0.31.0" +"@es-joy/jsdoccomment@npm:~0.36.1": + version: 0.36.1 + resolution: "@es-joy/jsdoccomment@npm:0.36.1" dependencies: - comment-parser: "npm:1.3.1" - esquery: "npm:^1.4.0" - jsdoc-type-pratt-parser: "npm:~3.1.0" - checksum: 8/1691ff501559f45593e5f080d2c08dea4fadba5f48e526b9ff2943c050fbb40408f5e83968542e5b6bf47219c7573796d00bfe80dacfd1ba8187904cc475cefb + comment-parser: 1.3.1 + esquery: ^1.4.0 + jsdoc-type-pratt-parser: ~3.1.0 + checksum: 28e697779230dc6a95b1f233a8c2a72b64fbea686e407106e5d4292083421a997452731c414de26c10bee86e8e0397c5fb84d6ecfd4b472a29735e1af103ddb6 languageName: node linkType: hard @@ -107,70 +348,70 @@ __metadata: eslint-visitor-keys: "npm:^3.3.0" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 8/cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.6.2 - resolution: "@eslint-community/regexpp@npm:4.6.2" - checksum: 8/a3c341377b46b54fa228f455771b901d1a2717f95d47dcdf40199df30abc000ba020f747f114f08560d119e979d882a94cf46cfc51744544d54b00319c0f2724 + version: 4.12.0 + resolution: "@eslint-community/regexpp@npm:4.12.0" + checksum: 640bf6575cdcf6cffc246cede4ebfc4045ca7ee1d1c9eaeaf302f63ade05d2a20c58908d8d335c9409824cad77773d1282141af7e8e2aa7ce137d77a038254a0 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.1": - version: 2.1.1 - resolution: "@eslint/eslintrc@npm:2.1.1" +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 8/bf909ea183d27238c257a82d4ffdec38ca94b906b4b8dfae02ecbe7ecc9e5a8182ef5e469c808bb8cb4fea4750f43ac4ca7c4b4a167b6cd7e3aaacd386b2bd25 + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.6.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 languageName: node linkType: hard -"@eslint/js@npm:^8.46.0": - version: 8.46.0 - resolution: "@eslint/js@npm:8.46.0" - checksum: 8/7aed479832302882faf5bec37e9d068f270f84c19b3fb529646a7c1b031e73a312f730569c78806492bc09cfce3d7651dfab4ce09a56cbb06bc6469449e56377 +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 2afb77454c06e8316793d2e8e79a0154854d35e6782a1217da274ca60b5044d2c69d6091155234ed0551a1e408f86f09dd4ece02752c59568fa403e60611e880 languageName: node linkType: hard "@fortawesome/fontawesome-free@npm:^5.12.0": version: 5.15.4 resolution: "@fortawesome/fontawesome-free@npm:5.15.4" - checksum: 8/32281c3df4075290d9a96dfc22f72fadb3da7055d4117e48d34046b8c98032a55fa260ae351b0af5d6f6fb57a2f5d79a4abe52af456da35195f7cb7dda27b4a2 + checksum: 32281c3df4075290d9a96dfc22f72fadb3da7055d4117e48d34046b8c98032a55fa260ae351b0af5d6f6fb57a2f5d79a4abe52af456da35195f7cb7dda27b4a2 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.10 - resolution: "@humanwhocodes/config-array@npm:0.11.10" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": "npm:^1.2.1" - debug: "npm:^4.1.1" - minimatch: "npm:^3.0.5" - checksum: 8/1b1302e2403d0e35bc43e66d67a2b36b0ad1119efc704b5faff68c41f791a052355b010fb2d27ef022670f550de24cd6d08d5ecf0821c16326b7dcd0ee5d5d8a + "@humanwhocodes/object-schema": ^2.0.3 + debug: ^4.3.1 + minimatch: ^3.0.5 + checksum: eae69ff9134025dd2924f0b430eb324981494be26f0fddd267a33c28711c4db643242cf9fddf7dadb9d16c96b54b2d2c073e60a56477df86e0173149313bd5d6 languageName: node linkType: hard "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 8/0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: 8/a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 languageName: node linkType: hard @@ -184,7 +425,7 @@ __metadata: strip-ansi-cjs: "npm:strip-ansi@^6.0.1" wrap-ansi: "npm:^8.1.0" wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 8/4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb languageName: node linkType: hard @@ -195,21 +436,21 @@ __metadata: "@jridgewell/set-array": "npm:^1.0.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 8/1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 + checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 languageName: node linkType: hard "@jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.1 resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: 8/f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard "@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 8/69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e languageName: node linkType: hard @@ -219,680 +460,1210 @@ __metadata: dependencies: "@jridgewell/gen-mapping": "npm:^0.3.0" "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 8/1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f + checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f languageName: node linkType: hard "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 8/b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.19 - resolution: "@jridgewell/trace-mapping@npm:0.3.19" +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 8/956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + languageName: node + linkType: hard + +"@jupyter-widgets/base-manager@npm:^1.0.11": + version: 1.0.11 + resolution: "@jupyter-widgets/base-manager@npm:1.0.11" + dependencies: + "@jupyter-widgets/base": ^6.0.10 + "@jupyterlab/services": ^6.0.0 || ^7.0.0 + "@lumino/coreutils": ^1.11.1 || ^2 + base64-js: ^1.2.1 + sanitize-html: ^2.3 + checksum: 04ef40b05f38ac081cae63c5201a09c30c587df8039671e4d11b16fd911171bd3507deb7b2bc7d7f0e7805bfedb7fee77ebd2560606d6570659c669abc19e374 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.20": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jupyter-widgets/base@npm:^6.0.10": + version: 6.0.10 + resolution: "@jupyter-widgets/base@npm:6.0.10" dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + "@jupyterlab/services": ^6.0.0 || ^7.0.0 + "@lumino/coreutils": ^1.11.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/widgets": ^1.30.0 || ^2.1 + "@types/backbone": 1.4.14 + "@types/lodash": ^4.14.134 + backbone: 1.4.0 + jquery: ^3.1.1 + lodash: ^4.17.4 + checksum: 423f96bf6bee953f9347e7fb85a89bbae5f4040a91ab6d6769bc72b1f9752b388cb3b9ede68032133c4c567fc411d06ced290e0bfb80d3c348caa0eaf81cab9b languageName: node linkType: hard -"@jupyter-widgets/base@npm:^1 || ^2 || ^3 || ^4 || ^5 || ^6.0.5, @jupyter-widgets/base@npm:^6.0.0": - version: 6.0.5 - resolution: "@jupyter-widgets/base@npm:6.0.5" - dependencies: - "@jupyterlab/services": "npm:^6.0.0 || ^7.0.0" - "@lumino/coreutils": "npm:^1.11.1 || ^2.1" - "@lumino/messaging": "npm:^1.10.1 || ^2.1" - "@lumino/widgets": "npm:^1.30.0 || ^2.1" - "@types/backbone": "npm:1.4.14" - "@types/lodash": "npm:^4.14.134" - backbone: "npm:1.4.0" - jquery: "npm:^3.1.1" - lodash: "npm:^4.17.4" - checksum: 8/d9090c172d6504f95a7b1906e4b8c7be722318103b5721fa447140d04888448ebc31f47887c1dfc9022fff183b41cf6dbb7a2d2b3f821d05fe17350281fc3a17 +"@jupyter-widgets/controls@npm:^5.0.11": + version: 5.0.11 + resolution: "@jupyter-widgets/controls@npm:5.0.11" + dependencies: + "@jupyter-widgets/base": ^6.0.10 + "@lumino/algorithm": ^1.9.1 || ^2.1 + "@lumino/domutils": ^1.8.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/signaling": ^1.10.1 || ^2.1 + "@lumino/widgets": ^1.30.0 || ^2.1 + d3-color: ^3.0.1 + d3-format: ^3.0.1 + jquery: ^3.1.1 + nouislider: 15.4.0 + checksum: dd995d4a17898e7bca4fa1ec4bfa643ed705b9592fca847f870babd3db72cc6cc76c6b7dcf5d3bb421f952505a273332b9429294e2ffe4cfff289076802c0aef languageName: node linkType: hard -"@jupyter-widgets/controls@npm:^3 || ^4 || ^5": - version: 5.0.0 - resolution: "@jupyter-widgets/controls@npm:5.0.0" +"@jupyter-widgets/jupyterlab-manager@npm:^5.0.13": + version: 5.0.13 + resolution: "@jupyter-widgets/jupyterlab-manager@npm:5.0.13" dependencies: - "@jupyter-widgets/base": "npm:^6.0.0" - "@lumino/algorithm": "npm:^1.9.1" - "@lumino/domutils": "npm:^1.8.1" - "@lumino/messaging": "npm:^1.10.1" - "@lumino/signaling": "npm:^1.10.1" - "@lumino/widgets": "npm:^1.30.0" - d3-color: "npm:^3.0.1" - d3-format: "npm:^3.0.1" - jquery: "npm:^3.1.1" - nouislider: "npm:15.4.0" - checksum: 8/4e5e3077c4dcbae7789001a35278d655a4a50c8b0ee15db3087295918723209d9825b3530e187916f118879025d955500cb823e3db200eb9208889480a2728a5 + "@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/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/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.11.1 || ^2.0.0 + "@lumino/coreutils": ^1.11.1 || ^2.1 + "@lumino/disposable": ^1.10.1 || ^2.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 + checksum: 3862f58e962386877e1e47563c92d23df4a55671c7e10974d424b08eeaca423b1f359dcc62c1c3c8bbe09cced790f3b1fd5180943d794ab3f521193a827c23dc languageName: node linkType: hard -"@jupyter/ydoc@npm:^1.0.2": - version: 1.0.2 - resolution: "@jupyter/ydoc@npm:1.0.2" - dependencies: - "@jupyterlab/nbformat": "npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0" - "@lumino/coreutils": "npm:^1.11.0 || ^2.0.0" - "@lumino/disposable": "npm:^1.10.0 || ^2.0.0" - "@lumino/signaling": "npm:^1.10.0 || ^2.0.0" - y-protocols: "npm:^1.0.5" - yjs: "npm:^13.5.40" - checksum: 8/739f9630940466b3cfcd7b742dd06479f81772ca13f863d057af0bbb5e318829506969066ab72977e7c721644982b5c8f88cf44e1ae81955ed1c27e87632d1f2 - languageName: node - linkType: hard - -"@jupyterlab/application@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/application@npm:4.0.4" - dependencies: - "@fortawesome/fontawesome-free": "npm:^5.12.0" - "@jupyterlab/apputils": "npm:^4.1.4" - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/docregistry": "npm:^4.0.4" - "@jupyterlab/rendermime": "npm:^4.0.4" - "@jupyterlab/rendermime-interfaces": "npm:^3.8.4" - "@jupyterlab/services": "npm:^7.0.4" - "@jupyterlab/statedb": "npm:^4.0.4" - "@jupyterlab/translation": "npm:^4.0.4" - "@jupyterlab/ui-components": "npm:^4.0.4" - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/application": "npm:^2.1.1" - "@lumino/commands": "npm:^2.1.1" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/polling": "npm:^2.1.1" - "@lumino/properties": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/widgets": "npm:^2.1.1" - checksum: 8/97c1499905c13d29012cca17dd6983098db81847dcf5478571a3a0a7fcf3ef4cb2a0f75ae1bde3984669eeb90d8b1bb8e6fb01316a1dacf43acde82151e9d677 - languageName: node - linkType: hard - -"@jupyterlab/apputils@npm:^4.1.4": - version: 4.1.4 - resolution: "@jupyterlab/apputils@npm:4.1.4" - dependencies: - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/observables": "npm:^5.0.4" - "@jupyterlab/rendermime-interfaces": "npm:^3.8.4" - "@jupyterlab/services": "npm:^7.0.4" - "@jupyterlab/settingregistry": "npm:^4.0.4" - "@jupyterlab/statedb": "npm:^4.0.4" - "@jupyterlab/statusbar": "npm:^4.0.4" - "@jupyterlab/translation": "npm:^4.0.4" - "@jupyterlab/ui-components": "npm:^4.0.4" - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/commands": "npm:^2.1.1" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/domutils": "npm:^2.0.0" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/virtualdom": "npm:^2.0.0" - "@lumino/widgets": "npm:^2.1.1" - "@types/react": "npm:^18.0.26" - react: "npm:^18.2.0" - sanitize-html: "npm:~2.7.3" - checksum: 8/237072bdc351b7f8dd4b9b8ba623fa67b85997fdc72441b8416d8899510d361d74ef04db5fbba236908f203f8ac78d0fbfe00d6dd84fba3a5451164f8d3ad478 +"@jupyter-widgets/output@npm:^6.0.10": + version: 6.0.10 + resolution: "@jupyter-widgets/output@npm:6.0.10" + dependencies: + "@jupyter-widgets/base": ^6.0.10 + checksum: ebe2173753b5a6c9aa62d47657f45ccd9baa41f374b5fa24aee67e235d73e0b99e4f2a4b9badd9e2461f3078b9e9261ccdd63fd03eda2ecf177e79b3b41a356e languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.0.0": - version: 4.0.4 - resolution: "@jupyterlab/builder@npm:4.0.4" - dependencies: - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/application": "npm:^2.1.1" - "@lumino/commands": "npm:^2.1.1" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/domutils": "npm:^2.0.0" - "@lumino/dragdrop": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/properties": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/virtualdom": "npm:^2.0.0" - "@lumino/widgets": "npm:^2.1.1" - ajv: "npm:^8.12.0" - commander: "npm:^9.4.1" - css-loader: "npm:^6.7.1" - duplicate-package-checker-webpack-plugin: "npm:^3.0.0" - fs-extra: "npm:^10.1.0" - glob: "npm:~7.1.6" - license-webpack-plugin: "npm:^2.3.14" - mini-css-extract-plugin: "npm:^2.7.0" - mini-svg-data-uri: "npm:^1.4.4" - path-browserify: "npm:^1.0.0" - process: "npm:^0.11.10" - source-map-loader: "npm:~1.0.2" - style-loader: "npm:~3.3.1" - supports-color: "npm:^7.2.0" - terser-webpack-plugin: "npm:^5.3.7" - webpack: "npm:^5.76.1" - webpack-cli: "npm:^5.0.1" - webpack-merge: "npm:^5.8.0" - worker-loader: "npm:^3.0.2" - bin: - build-labextension: lib/build-labextension.js - checksum: 8/0e85e3d0f0cc458e34dad4a4dcfdd047d8c59b206b69c972ec5223c98b2b82265cf59594e9e426a288dca945708b79218b8c686f6b9efef47dba5e263f0ab7c9 +"@jupyter/react-components@npm:^0.15.3": + version: 0.15.3 + resolution: "@jupyter/react-components@npm:0.15.3" + dependencies: + "@jupyter/web-components": ^0.15.3 + "@microsoft/fast-react-wrapper": ^0.3.22 + react: ">=17.0.0 <19.0.0" + checksum: 1a6b256314259c6465c4b6d958575710536b82234a7bf0fba3e889a07e1f19ff8ab321450be354359876f92c45dbcc9d21a840237ff4a619806d9de696f55496 languageName: node linkType: hard -"@jupyterlab/codeeditor@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/codeeditor@npm:4.0.4" +"@jupyter/web-components@npm:^0.15.3": + version: 0.15.3 + resolution: "@jupyter/web-components@npm:0.15.3" dependencies: - "@codemirror/state": "npm:^6.2.0" - "@jupyter/ydoc": "npm:^1.0.2" - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/nbformat": "npm:^4.0.4" - "@jupyterlab/observables": "npm:^5.0.4" - "@jupyterlab/statusbar": "npm:^4.0.4" - "@jupyterlab/translation": "npm:^4.0.4" - "@jupyterlab/ui-components": "npm:^4.0.4" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/dragdrop": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/widgets": "npm:^2.1.1" - react: "npm:^18.2.0" - checksum: 8/e92124bfa08fc7368ab80764e932d8e765393a5d5f5b1173dd20d1a575f67709c491e87e5eb3d593374dd6a6c61daa8918224e6a4946ff1c0f4a69316b77ff8f + "@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 + languageName: node + linkType: hard + +"@jupyter/ydoc@npm:^2.0.1": + version: 2.1.3 + resolution: "@jupyter/ydoc@npm:2.1.3" + dependencies: + "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 + "@lumino/coreutils": ^1.11.0 || ^2.0.0 + "@lumino/disposable": ^1.10.0 || ^2.0.0 + "@lumino/signaling": ^1.10.0 || ^2.0.0 + y-protocols: ^1.0.5 + yjs: ^13.5.40 + checksum: 61b38e3f89accebc8060eb0aacc11bf812befb9b1cec085d1b0153be851037a3a26b5576d58e5bc65d8c0697ef9f1e535afa73af1b1deef0523d749ff4ac0ac9 + languageName: node + linkType: hard + +"@jupyterlab/application@npm:^3.0.0 || ^4.0.0, @jupyterlab/application@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/application@npm:4.2.5" + 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:^3.0.0 || ^4.0.0, @jupyterlab/apputils@npm:^4.3.5": + version: 4.3.5 + resolution: "@jupyterlab/apputils@npm:4.3.5" + 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 + "@types/react": ^18.0.26 + react: ^18.2.0 + sanitize-html: ~2.12.1 + checksum: a2307657bfab1aff687eccfdb7a2c378a40989beea618ad6e5a811dbd250753588ea704a11250ddef42a551c8360717c1fe4c8827c5e2c3bfff1e84fc7fdc836 languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.0.4": - version: 6.0.4 - resolution: "@jupyterlab/coreutils@npm:6.0.4" +"@jupyterlab/attachments@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/attachments@npm:4.2.5" dependencies: - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/signaling": "npm:^2.1.1" - minimist: "npm:~1.2.0" - path-browserify: "npm:^1.0.0" - url-parse: "npm:~1.5.4" - checksum: 8/8a6ff82d9d65db39dae0f10f160f38fd09d33c61b9a9615be469e64e8501391cd36233ba0679b1413699bb7db1c88f0201550ed6aa6e0adc9f660e8ed2434e03 + "@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 languageName: node linkType: hard -"@jupyterlab/docregistry@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/docregistry@npm:4.0.4" - dependencies: - "@jupyter/ydoc": "npm:^1.0.2" - "@jupyterlab/apputils": "npm:^4.1.4" - "@jupyterlab/codeeditor": "npm:^4.0.4" - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/observables": "npm:^5.0.4" - "@jupyterlab/rendermime": "npm:^4.0.4" - "@jupyterlab/rendermime-interfaces": "npm:^3.8.4" - "@jupyterlab/services": "npm:^7.0.4" - "@jupyterlab/translation": "npm:^4.0.4" - "@jupyterlab/ui-components": "npm:^4.0.4" - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/properties": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/widgets": "npm:^2.1.1" - checksum: 8/ba7682762039f1e1ba9c3ffae5091ba3e77ccb36c6ef64bbd2cc563d69abbddaa3ea7509be73aceb5cd58553c26be1419bbb5d5af935a7df018163911071ab84 +"@jupyterlab/builder@npm:^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 + ajv: ^8.12.0 + commander: ^9.4.1 + css-loader: ^6.7.1 + duplicate-package-checker-webpack-plugin: ^3.0.0 + fs-extra: ^10.1.0 + glob: ~7.1.6 + license-webpack-plugin: ^2.3.14 + mini-css-extract-plugin: ^2.7.0 + mini-svg-data-uri: ^1.4.4 + path-browserify: ^1.0.0 + process: ^0.11.10 + source-map-loader: ~1.0.2 + style-loader: ~3.3.1 + supports-color: ^7.2.0 + terser-webpack-plugin: ^5.3.7 + webpack: ^5.76.1 + webpack-cli: ^5.0.1 + webpack-merge: ^5.8.0 + worker-loader: ^3.0.2 + bin: + build-labextension: lib/build-labextension.js + checksum: 67d7150a52cd647cfb1a1b1217223389dd2ce1169bf7aa3a5ea8b7d73e2589e6699181cfd488de88362ff8f46682a4e875c545836733d37b19217ae3068d876c + languageName: node + linkType: hard + +"@jupyterlab/cells@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/cells@npm:4.2.5" + 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 + 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 + react: ^18.2.0 + checksum: 0b6f3f7a1fe02d2bb0b07571e03c6be645d58e182f3e1fcc5452e79dee8eab2097e13544eb461ff2bed72337bd335c539b8cb7cfe5f7bfd840163cc26d200c58 + languageName: node + linkType: hard + +"@jupyterlab/codemirror@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/codemirror@npm:4.2.5" + dependencies: + "@codemirror/autocomplete": ^6.15.0 + "@codemirror/commands": ^6.3.3 + "@codemirror/lang-cpp": ^6.0.2 + "@codemirror/lang-css": ^6.2.1 + "@codemirror/lang-html": ^6.4.8 + "@codemirror/lang-java": ^6.0.1 + "@codemirror/lang-javascript": ^6.2.2 + "@codemirror/lang-json": ^6.0.1 + "@codemirror/lang-markdown": ^6.2.4 + "@codemirror/lang-php": ^6.0.1 + "@codemirror/lang-python": ^6.1.4 + "@codemirror/lang-rust": ^6.0.1 + "@codemirror/lang-sql": ^6.6.1 + "@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 + "@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 + yjs: ^13.5.40 + checksum: 6c612c861dbc6a6acdc1887e7dd25d5029d1a40cda20735fb3f009867e27aacd0e2d05e9b01c71b3a6f9a35218d881159954e679806b118df24d90565b9c16c4 + languageName: node + linkType: hard + +"@jupyterlab/console@npm:^3.0.0 || ^4.0.0, @jupyterlab/console@npm:^4.2.5": + 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 + 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 + 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 + react: ^18.2.0 + checksum: 7e93987f4c6cd82058231c10c69a66aba38913c73f425a01c565a45e330e20dcb6f80489d3bd35d78b5b36a7798ed50485635fae3317b5c87d75ce30a144827e languageName: node linkType: hard -"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/nbformat@npm:4.0.4" +"@jupyterlab/documentsearch@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/documentsearch@npm:4.2.5" dependencies: - "@lumino/coreutils": "npm:^2.1.1" - checksum: 8/f7f6131018df1e3c80a3e55925b139a637dba90f81af017944495a19e63d6781b82ac863029576df8c75cfb3843335d73d7a0a5ac3d6208fc6b64fb3b014089c + "@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 + 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 + react: ^18.2.0 + checksum: bce079263a141c76ec0a28be0d662c0a627ceaa12bcbe13be97a40f99abf37838fc87284701da1f6a7dce0be82f7322c8530f9fd9b3d1f4f253da5ddfa2e04ff languageName: node linkType: hard -"@jupyterlab/observables@npm:^5.0.4": - version: 5.0.4 - resolution: "@jupyterlab/observables@npm:5.0.4" - dependencies: - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - checksum: 8/f394c8a9aac3984bcc20f9d3342a340381687573ac4e461ccd7afafe2c535d3e6b1f349886ad6de47f305703ef02f19e4069b9e4038d32e3f4821384c794d6d9 - languageName: node - linkType: hard - -"@jupyterlab/rendermime-interfaces@npm:^3.8.4": - version: 3.8.4 - resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.4" - dependencies: - "@lumino/coreutils": "npm:^1.11.0 || ^2.1.1" - "@lumino/widgets": "npm:^1.37.2 || ^2.1.1" - checksum: 8/5cd8cef14e0716e14f77c724937fa9f9d33bfc079e75a005b933601057675b660eebae69f53e2e369ee5665902501a547e8aac3f0eda9a79a8c82fe95fe01a27 - languageName: node - linkType: hard - -"@jupyterlab/rendermime@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/rendermime@npm:4.0.4" - dependencies: - "@jupyterlab/apputils": "npm:^4.1.4" - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/nbformat": "npm:^4.0.4" - "@jupyterlab/observables": "npm:^5.0.4" - "@jupyterlab/rendermime-interfaces": "npm:^3.8.4" - "@jupyterlab/services": "npm:^7.0.4" - "@jupyterlab/translation": "npm:^4.0.4" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/widgets": "npm:^2.1.1" - lodash.escape: "npm:^4.0.1" - checksum: 8/4a277681f51456bc8e254760b544d857b5fbb91a9589b25a45dd83b5913305607d95976cc33da6050f64250660bb5f34875b0a61ba6eb4b030c764ab3e2fd831 - languageName: node - linkType: hard - -"@jupyterlab/services@npm:^6.0.0 || ^7.0.0, @jupyterlab/services@npm:^7.0.4": - version: 7.0.4 - resolution: "@jupyterlab/services@npm:7.0.4" - dependencies: - "@jupyter/ydoc": "npm:^1.0.2" - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/nbformat": "npm:^4.0.4" - "@jupyterlab/settingregistry": "npm:^4.0.4" - "@jupyterlab/statedb": "npm:^4.0.4" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/polling": "npm:^2.1.1" - "@lumino/properties": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - ws: "npm:^8.11.0" - checksum: 8/b7f2322992cb27744d9b690cf686ece84ee2a957f1f8cb349db68eea908c44af26dbb9613b903def6cff35cf32a30e4c286801e5b3dfb6ebb8451d3b10205599 - languageName: node - linkType: hard - -"@jupyterlab/settingregistry@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/settingregistry@npm:4.0.4" - dependencies: - "@jupyterlab/nbformat": "npm:^4.0.4" - "@jupyterlab/statedb": "npm:^4.0.4" - "@lumino/commands": "npm:^2.1.1" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/signaling": "npm:^2.1.1" - "@rjsf/utils": "npm:^5.1.0" - ajv: "npm:^8.12.0" - json5: "npm:^2.2.3" +"@jupyterlab/launcher@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/launcher@npm:4.2.5" + 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/disposable": ^2.1.2 + "@lumino/properties": ^2.0.1 + "@lumino/widgets": ^2.3.2 + react: ^18.2.0 + checksum: 3d6c395e11dbfbe894f68e92509746bcd3a3f1e0369ba3b877829b18804fc528aba0a5fe476c6608d88993b09a031ea3afc673d68de1ed30b87528088895fa11 + languageName: node + linkType: hard + +"@jupyterlab/logconsole@npm:^3.0.0 || ^4.0.0, @jupyterlab/logconsole@npm:^4.2.5": + 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 + lodash.mergewith: ^4.6.1 + vscode-jsonrpc: ^6.0.0 + vscode-languageserver-protocol: ^3.17.0 + vscode-ws-jsonrpc: ~1.0.2 + checksum: 8dfaeb330a6b72b32f8eae6b5d4c3c0ff64203fe5fd69dbfbe15e22c46851a9fbc8c968608e4a6cd887760e194d4e4bb757135aff2df4eaee31acf248d603e9a + languageName: node + linkType: hard + +"@jupyterlab/mainmenu@npm:^3.0.0 || ^4.0.0, @jupyterlab/mainmenu@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/mainmenu@npm:4.2.5" + 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 + 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" + dependencies: + "@lumino/coreutils": ^2.1.2 + checksum: b3ad2026969bfa59f8cfb7b1a991419f96f7e6dc8c4acf4ac166c210d7ab99631350c785e9b04350095488965d2824492c8adbff24a2e26db615457545426b3c + 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 + react: ^18.2.0 + checksum: 1c91b42e890407574451903af7d48db8c216fa9e27ecc4e60ee76366572029ff73be3974085427b72eaedf67e718a7d4f93207f7b66dd3cf27a0b51172ca7727 + languageName: node + linkType: hard + +"@jupyterlab/observables@npm:^5.2.5": + version: 5.2.5 + resolution: "@jupyterlab/observables@npm:5.2.5" + 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 + 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 + 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" + dependencies: + "@lumino/coreutils": ^1.11.0 || ^2.1.2 + "@lumino/widgets": ^1.37.2 || ^2.3.2 + checksum: acfb10315a3ed4d0b0ef664437b33f8938968c61993351fd4067b0eaf6cb6ccd4c5caf50ae050d184a34b35b88d844eee6689d00244e54a02b228c02eab544b4 + 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 + lodash.escape: ^4.0.1 + checksum: e3e68c66306dc4bc7d4497d017e9e32cbfacfdc3ba14da6dfa6d7dbd328a3e8d5b710260365a06cd508209393e21985e7a69d0a160e239e4fdc1f0eb0874f35c + languageName: node + linkType: hard + +"@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" + 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 + ws: ^8.11.0 + checksum: 72d7578a86af1277b574095423fafb4176bc66373662fdc0e243a7d20e4baf8f291377b6c80300841dba6486767f16664f0e893174c2761658aedb74024e1db6 + 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 + "@rjsf/utils": ^5.13.4 + ajv: ^8.12.0 + json5: ^2.2.3 peerDependencies: react: ">=16" - checksum: 8/ae3972477b89c148d997e761e23924c8ba3e63ed349bd4c6344b8e8a85f9e7fdfded37bbd22113d1d27afb32fd5143f1153709064a992c92c718de0481fc503e - languageName: node - linkType: hard - -"@jupyterlab/statedb@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/statedb@npm:4.0.4" - dependencies: - "@lumino/commands": "npm:^2.1.1" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/properties": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - checksum: 8/7dbda864705335bd800ae6a4d4be124d6d19044ac74bf0f5fe9cd83122a875d17cfda706112705e9cd9e76a79b8c92b81af4f6282d5aa6571c147c3b9a0aedf0 - languageName: node - linkType: hard - -"@jupyterlab/statusbar@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/statusbar@npm:4.0.4" - dependencies: - "@jupyterlab/ui-components": "npm:^4.0.4" - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/widgets": "npm:^2.1.1" - react: "npm:^18.2.0" - checksum: 8/d393bf73f11d39f095b03327fc090d106f50a404ada3c2c87a26f95de240d8334063408114e66f4d3b4c7ae94e185049970434be64ae6b3f977dea306db458ea - languageName: node - linkType: hard - -"@jupyterlab/translation@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/translation@npm:4.0.4" - dependencies: - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/rendermime-interfaces": "npm:^3.8.4" - "@jupyterlab/services": "npm:^7.0.4" - "@jupyterlab/statedb": "npm:^4.0.4" - "@lumino/coreutils": "npm:^2.1.1" - checksum: 8/9c2c0ad7531572d61e93f7451e96b6417ec9330841294d1c6e40279839e7e8e34a9ae525a57b4f7a36959c6dbcd2b1c53d4cddbcd2a8d32827a0abc32fd0cd61 - languageName: node - linkType: hard - -"@jupyterlab/ui-components@npm:^4.0.4": - version: 4.0.4 - resolution: "@jupyterlab/ui-components@npm:4.0.4" - dependencies: - "@jupyterlab/coreutils": "npm:^6.0.4" - "@jupyterlab/observables": "npm:^5.0.4" - "@jupyterlab/rendermime-interfaces": "npm:^3.8.4" - "@jupyterlab/translation": "npm:^4.0.4" - "@lumino/algorithm": "npm:^2.0.0" - "@lumino/commands": "npm:^2.1.1" - "@lumino/coreutils": "npm:^2.1.1" - "@lumino/disposable": "npm:^2.1.1" - "@lumino/messaging": "npm:^2.0.0" - "@lumino/polling": "npm:^2.1.1" - "@lumino/properties": "npm:^2.0.0" - "@lumino/signaling": "npm:^2.1.1" - "@lumino/virtualdom": "npm:^2.0.0" - "@lumino/widgets": "npm:^2.1.1" - "@rjsf/core": "npm:^5.1.0" - "@rjsf/utils": "npm:^5.1.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - typestyle: "npm:^2.0.4" + checksum: 2403e3198f2937fb9e4c12f96121e8bfc4f2a9ed47a9ad64182c88c8c19d59fcdf7443d0bf7d04527e89ac06378ceb39d6b4196c7f575c2a21fea23283ad3892 + languageName: node + linkType: hard + +"@jupyterlab/statedb@npm:^4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/statedb@npm:4.2.5" + 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 + 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" + 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 + 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 + "@rjsf/core": ^5.13.4 + "@rjsf/utils": ^5.13.4 + react: ^18.2.0 + react-dom: ^18.2.0 + typestyle: ^2.0.4 peerDependencies: react: ^18.2.0 - checksum: 8/674a31002199c6a52fe43f55c5aa43bff0f8bbd336758b04923d43710ee442b8d8a237980165d03486e00b9980ea9316afda645b26cbcb3712a827653699f82f + checksum: 9d2b887910a3b0d41645388c5ac6183d6fd2f3af4567de9b077b2492b1a9380f98c4598a4ae6d1c3186624ed4f956bedf8ba37adb5f772c96555761384a93e1e languageName: node linkType: hard -"@lumino/algorithm@npm:^1.9.1, @lumino/algorithm@npm:^1.9.2": - version: 1.9.2 - resolution: "@lumino/algorithm@npm:1.9.2" - checksum: 8/a89e7c63504236119634858e271db1cc649684d30ced5a6ebe2788af7c0837f1e05a6fd3047d8525eb756c42ce137f76b3688f75fd3ef915b71cd4f213dfbb96 +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.0.2, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.0, @lezer/common@npm:^1.2.1": + version: 1.2.3 + resolution: "@lezer/common@npm:1.2.3" + checksum: 9b5f52d949adae69d077f56c0b1c2295923108c3dfb241dd9f17654ff708f3eab81ff9fa7f0d0e4a668eabdcb9d961c73e75caca87c966ca1436e30e49130fcb languageName: node linkType: hard -"@lumino/algorithm@npm:^1.9.2 || ^2, @lumino/algorithm@npm:^2.0.0, @lumino/algorithm@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/algorithm@npm:2.0.1" - checksum: 8/cbf7fcf6ee6b785ea502cdfddc53d61f9d353dcb9659343511d5cd4b4030be2ff2ca4c08daec42f84417ab0318a3d9972a17319fa5231693e109ab112dcf8000 +"@lezer/cpp@npm:^1.0.0": + version: 1.1.2 + resolution: "@lezer/cpp@npm:1.1.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: a319cd46fd32affc07c9432e9b2b9954becf7766be0361176c525d03474bb794cc051aad9932f48c9df33833eee1d6bfdccab12e571f2b137b4ca765c60c75de languageName: node linkType: hard -"@lumino/application@npm:^2.1.1": - version: 2.2.1 - resolution: "@lumino/application@npm:2.2.1" +"@lezer/css@npm:^1.1.0, @lezer/css@npm:^1.1.7": + version: 1.1.9 + resolution: "@lezer/css@npm:1.1.9" dependencies: - "@lumino/commands": "npm:^2.1.3" - "@lumino/coreutils": "npm:^2.1.2" - "@lumino/widgets": "npm:^2.3.0" - checksum: 8/a33e661703728440bc7d2ddb4674261f4de0d20eb8c9846646cbd6debac03b5c65e78d739a500903550fd83b8f47b47fa82ec178c97bc9967ca3ac4014075cde + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 25c63475061a3c9f87961a7f85c5f547f14fb7e81b0864675d2206999a874a0559d676145c74c6ccde39519dbc8aa33e216265f5366d08060507b6c9e875fe0f languageName: node linkType: hard -"@lumino/collections@npm:^1.9.3": - version: 1.9.3 - resolution: "@lumino/collections@npm:1.9.3" +"@lezer/generator@npm:^1.7.0": + version: 1.7.1 + resolution: "@lezer/generator@npm:1.7.1" dependencies: - "@lumino/algorithm": "npm:^1.9.2" - checksum: 8/1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 + "@lezer/common": ^1.1.0 + "@lezer/lr": ^1.3.0 + bin: + lezer-generator: src/lezer-generator.cjs + checksum: e46df5a31252fb036ea17fce820acdf47672bb5405b2a38e26a430182b9a50b8513fde37d9a43d8334cde3bb2f2106ce7a5ab1a01e244876ce3217c4db59e627 languageName: node linkType: hard -"@lumino/collections@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/collections@npm:2.0.1" +"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3, @lezer/highlight@npm:^1.2.0": + version: 1.2.1 + resolution: "@lezer/highlight@npm:1.2.1" dependencies: - "@lumino/algorithm": "npm:^2.0.1" - checksum: 8/8a29b7973a388a33c5beda0819dcd2dc2aad51a8406dcfd4581b055a9f77a39dc5800f7a8b4ae3c0bb97ae7b56a7a869e2560ffb7a920a28e93b477ba05907d6 + "@lezer/common": ^1.0.0 + checksum: a8822d7e37f79ff64669eb2df4a9f9d16580e88f2b276a646092e19a9bdccac304e92510e200e35869a8b1f6c27eba5972c508d347a277e9b722d582ab7a23d5 languageName: node linkType: hard -"@lumino/commands@npm:^1.20.1": - version: 1.20.1 - resolution: "@lumino/commands@npm:1.20.1" +"@lezer/html@npm:^1.3.0": + version: 1.3.10 + resolution: "@lezer/html@npm:1.3.10" dependencies: - "@lumino/algorithm": "npm:^1.9.2" - "@lumino/coreutils": "npm:^1.12.1" - "@lumino/disposable": "npm:^1.10.2" - "@lumino/domutils": "npm:^1.8.2" - "@lumino/keyboard": "npm:^1.8.2" - "@lumino/signaling": "npm:^1.10.2" - "@lumino/virtualdom": "npm:^1.14.2" - checksum: 8/e5069acb95cf7b2ed11a54b8052e6dad6377156958de6b102a8e908112b890f78f5891a73306d2a502adff738788d3f39a6defd03e026b66541dd3510049ac88 + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: cce391aab9259704ae3079b3209f74b2f248594dd8b851c28aaff26765e00ebb890a5ff1fe600f2d03aaf4ade0e36de8048d9632b12bfbccd47b3e649c3b0ecd languageName: node linkType: hard -"@lumino/commands@npm:^1.20.1 || ^2, @lumino/commands@npm:^2.1.1, @lumino/commands@npm:^2.1.3": - version: 2.1.3 - resolution: "@lumino/commands@npm:2.1.3" +"@lezer/java@npm:^1.0.0": + version: 1.1.3 + resolution: "@lezer/java@npm:1.1.3" dependencies: - "@lumino/algorithm": "npm:^2.0.1" - "@lumino/coreutils": "npm:^2.1.2" - "@lumino/disposable": "npm:^2.1.2" - "@lumino/domutils": "npm:^2.0.1" - "@lumino/keyboard": "npm:^2.0.1" - "@lumino/signaling": "npm:^2.1.2" - "@lumino/virtualdom": "npm:^2.0.1" - checksum: 8/e4e3ee279f2a5e8d68e4ce142c880333f5542f90c684972402356936ecb5cf5e07163800b59e7cb8c911cbdb4e5089edcc5dd2990bc8db10c87517268de1fc5d + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: a4b8a348ab08465cff6e54ec80e397d2629e0911decb4c6a47fd56cd74f6978fae478879b15a2e239203b9e53aef41ecaeba675f8013e290165249abdab7da74 languageName: node linkType: hard -"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.1, @lumino/coreutils@npm:^1.11.1 || ^2.1, @lumino/coreutils@npm:^2.1.1, @lumino/coreutils@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/coreutils@npm:2.1.2" - checksum: 8/7865317ac0676b448d108eb57ab5d8b2a17c101995c0f7a7106662d9fe6c859570104525f83ee3cda12ae2e326803372206d6f4c1f415a5b59e4158a7b81066f +"@lezer/javascript@npm:^1.0.0": + version: 1.4.19 + resolution: "@lezer/javascript@npm:1.4.19" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.1.3 + "@lezer/lr": ^1.3.0 + checksum: e305680dea6659570b88eded0d03eba3d33bb8860f8646b457798da955742916dd9cbe17fe6dd867bdb7767ef6c00717aadd45e520ee0b416bdc5e39046e6459 languageName: node linkType: hard -"@lumino/coreutils@npm:^1.12.1": - version: 1.12.1 - resolution: "@lumino/coreutils@npm:1.12.1" - peerDependencies: - crypto: 1.0.1 - checksum: 8/55f1b87997f8dd0af28ff23c2d4b3aa252e515b9d3bc91b350a5c6c8526ceae61b14b55dc0d8d01691c69d42974b3d559f2b49bc7ced0f474b8f5dc52b3e83ed +"@lezer/json@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/json@npm:1.0.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: f899d13765d95599c9199fc3404cb57969031dc40ce07de30f4e648979153966581f0bee02e2f8f70463b0a5322206a97c2fe8d5d14f218888c72a6dcedf90ef languageName: node linkType: hard -"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^1.10.2 || ^2, @lumino/disposable@npm:^2.1.1, @lumino/disposable@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/disposable@npm:2.1.2" +"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.1.0, @lezer/lr@npm:^1.3.0": + version: 1.4.2 + resolution: "@lezer/lr@npm:1.4.2" dependencies: - "@lumino/signaling": "npm:^2.1.2" - checksum: 8/ac2fb2bf18d0b2939fda454f3db248a0ff6e8a77b401e586d1caa9293b3318f808b93a117c9c3ac27cd17aab545aea83b49108d099b9b2f5503ae2a012fbc6e2 + "@lezer/common": ^1.0.0 + checksum: 94318ad046c7dfcc8d37e26cb85b99623c39aef60aa51ec2abb30928e7a649f38fa5520f34bd5b356f1db11b6991999589f039e87c8949b0f163be3764f029d8 languageName: node linkType: hard -"@lumino/disposable@npm:^1.10.2": - version: 1.10.2 - resolution: "@lumino/disposable@npm:1.10.2" +"@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.2.0": + version: 1.3.1 + resolution: "@lezer/markdown@npm:1.3.1" + dependencies: + "@lezer/common": ^1.0.0 + "@lezer/highlight": ^1.0.0 + checksum: b5cbb857a90411e174e7ad23433756a81cf2ab422ef749e529211e078ed4061b4595fa8cbcca56119919c0b2735e8ecac11ff34768d64cb90e599fde2bc6c730 + languageName: node + linkType: hard + +"@lezer/php@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/php@npm:1.0.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.1.0 + checksum: c85ef18571d37826b687dd141a0fe110f5814adaf9d1a391e7e482020d7f81df189ca89ec0dd141c1433d48eff4c6e53648b46f008dea8ad2dc574f35f1d4d79 + languageName: node + linkType: hard + +"@lezer/python@npm:^1.1.4": + version: 1.1.14 + resolution: "@lezer/python@npm:1.1.14" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 1608187f698e972d11b340dfdfd79e15b1359641e386e386befd37d5e5839620b45a5a39c5616792a24da29ef1d99d11ea0dad52b9617f1767e7ea6a11c2fed3 + languageName: node + linkType: hard + +"@lezer/rust@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/rust@npm:1.0.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: fc5e97852b42beeb44a0ebe316dc64e3cc49ff481c22e3e67d6003fc4a5c257fcd94959cfcc76cd154fa172db9b3b4b28de5c09f10550d6e5f14869ddc274e5b + languageName: node + linkType: hard + +"@lezer/xml@npm:^1.0.0": + version: 1.0.5 + resolution: "@lezer/xml@npm:1.0.5" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: a0a077b9e455b03593b93a7fdff2a4eab2cb7b230c8e1b878a8bebe80184632b9cc75ca018f1f9e2acb3a26e1386f4777385ab6e87aea70ccf479cde5ca268ee + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^1.11.1 || ^2.0.0, @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 + 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.4.1 + resolution: "@lumino/application@npm:2.4.1" + dependencies: + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/widgets": ^2.5.0 + checksum: b7166d1bf4f0e3cc945d984b4057a4cd106d38df6cb4c6f1259c75484e2b976018aca55f169fa4af7dd174ce7117be1920966bef0fb7cba756f503f0df1d211e + languageName: node + linkType: hard + +"@lumino/collections@npm:^1.9.3": + version: 1.9.3 + resolution: "@lumino/collections@npm:1.9.3" dependencies: "@lumino/algorithm": "npm:^1.9.2" - "@lumino/signaling": "npm:^1.10.2" - checksum: 8/036affaa0079a91dacafdc302040e5194aaf3078b05385f559b82ecfdcefc8a98a57a35b3e3591d00f79072ca4d8fc592fac5bd4c775fcb5b28323a64f98658a + checksum: 1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 languageName: node linkType: hard -"@lumino/domutils@npm:^1.8.1, @lumino/domutils@npm:^1.8.2": - version: 1.8.2 - resolution: "@lumino/domutils@npm:1.8.2" - checksum: 8/196f25316a17cd8df8f11dbe17f10cbd96e5ce166ea97aab6402307dc554382423d860859bb5d05226f05909748b781fb281bb9220690fe1f3ddc716072c2ed5 +"@lumino/collections@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/collections@npm:2.0.2" + dependencies: + "@lumino/algorithm": ^2.0.2 + checksum: e8bb2068a3741940e0dd396fa729c3c9d12458b41b7c2a9d171c5c034e69fb5834116a824094a8aa4182397e13abace06025ed5032a755ea85b976eae74ee9a9 languageName: node linkType: hard -"@lumino/domutils@npm:^2.0.0, @lumino/domutils@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/domutils@npm:2.0.1" - checksum: 8/61fa0ab226869dfbb763fc426790cf5a43b7d6f4cea1364c6dd56d61c44bff05eea188d33ff847449608ef58ed343161bee15c19b96f35410e4ee35815dc611a +"@lumino/commands@npm:^2.3.0, @lumino/commands@npm:^2.3.1": + version: 2.3.1 + resolution: "@lumino/commands@npm:2.3.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 languageName: node linkType: hard -"@lumino/dragdrop@npm:^1.14.1": - version: 1.14.1 - resolution: "@lumino/dragdrop@npm:1.14.1" +"@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, @lumino/coreutils@npm:^2.2.0": + version: 2.2.0 + resolution: "@lumino/coreutils@npm:2.2.0" dependencies: - "@lumino/coreutils": "npm:^1.12.1" - "@lumino/disposable": "npm:^1.10.2" - checksum: 8/85b49cf0848d5734276dcd337aa8929777a79d4acce7fac87fbe89a9219b98ca017997c502326396b78861eed60a2c64d13c1408acbb125da8607688cdfe3d54 + "@lumino/algorithm": ^2.0.2 + checksum: 345fcd5d7493d745831dd944edfbd8eda06cc59a117e71023fc97ce53badd697be2bd51671f071f5ff0064f75f104575d9695f116a07517bafbedd38e5c7a785 languageName: node linkType: hard -"@lumino/dragdrop@npm:^2.1.1, @lumino/dragdrop@npm:^2.1.3": +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^1.10.1 || ^2.1, @lumino/disposable@npm:^2.1.2, @lumino/disposable@npm:^2.1.3": version: 2.1.3 - resolution: "@lumino/dragdrop@npm:2.1.3" + resolution: "@lumino/disposable@npm:2.1.3" dependencies: - "@lumino/coreutils": "npm:^2.1.2" - "@lumino/disposable": "npm:^2.1.2" - checksum: 8/d5f7eb4cc9f9a084cb9af10f02d6741b25d683350878ecbc324e24ba9d4b5246451a410e2ca5fff227aab1c191d1e73a2faf431f93e13111d67a4e426e126258 + "@lumino/signaling": ^2.1.3 + checksum: b9a346fa2752b3cd1b053cb637ee173501d33082a73423429070e8acc508b034ea0babdae0549b923cbdd287ee1fc7f6159f0539c9fff7574393a214eef07c57 languageName: node linkType: hard -"@lumino/keyboard@npm:^1.8.2": +"@lumino/domutils@npm:^1.8.1 || ^2.1": version: 1.8.2 - resolution: "@lumino/keyboard@npm:1.8.2" - checksum: 8/30f8ced53ca0aa466dba33be3c9379a2a6abcf1c52485073d9f9d9bc119eb3327a7343fad764c2d63a8a30ae05c0047098c40ec605e60af215356f3edb9ab4a9 + resolution: "@lumino/domutils@npm:1.8.2" + checksum: 196f25316a17cd8df8f11dbe17f10cbd96e5ce166ea97aab6402307dc554382423d860859bb5d05226f05909748b781fb281bb9220690fe1f3ddc716072c2ed5 languageName: node linkType: hard -"@lumino/keyboard@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/keyboard@npm:2.0.1" - checksum: 8/cf33f13427a418efd7cc91061233321e860d5404f3d86397781028309bef86c8ad2d88276ffe335c1db0fe619bd9d1e60641c81f881696957a58703ee4652c3e +"@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 + 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" + 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 languageName: node linkType: hard -"@lumino/messaging@npm:^1.10.1, @lumino/messaging@npm:^1.10.1 || ^2.1, @lumino/messaging@npm:^1.10.2": +"@lumino/messaging@npm:^1.10.1 || ^2.1": version: 1.10.3 resolution: "@lumino/messaging@npm:1.10.3" dependencies: "@lumino/algorithm": "npm:^1.9.2" "@lumino/collections": "npm:^1.9.3" - checksum: 8/1131e80379fa9b8a9b5d3418c90e25d4be48e2c92ec711518190772f9e8845a695bef45daddd06a129168cf6f158c8ad80ae86cb245f566e9195bbd9a0843b7a + checksum: 1131e80379fa9b8a9b5d3418c90e25d4be48e2c92ec711518190772f9e8845a695bef45daddd06a129168cf6f158c8ad80ae86cb245f566e9195bbd9a0843b7a languageName: node linkType: hard -"@lumino/messaging@npm:^1.10.2 || ^2, @lumino/messaging@npm:^2.0.0, @lumino/messaging@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/messaging@npm:2.0.1" +"@lumino/messaging@npm:^2.0.1, @lumino/messaging@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/messaging@npm:2.0.2" dependencies: - "@lumino/algorithm": "npm:^2.0.1" - "@lumino/collections": "npm:^2.0.1" - checksum: 8/964c4651c374b17452b4252b7d71500b32d2ecd87c192fc5bcf5d3bd1070661d78d07edcac8eca7d1d6fd50aa25992505485e1296d6dd995691b8e349b652045 + "@lumino/algorithm": ^2.0.2 + "@lumino/collections": ^2.0.2 + checksum: 66abd8c473026123589dc22f2ce8f85da10e0b1a05c05ed9b2011035721da5f751cc7ef63b628877f446a78a4287e26ad1450efbeaf0c2e03b1d08be9abaca4d languageName: node linkType: hard -"@lumino/polling@npm:^2.1.1": - version: 2.1.2 - resolution: "@lumino/polling@npm:2.1.2" +"@lumino/polling@npm:^2.1.2": + version: 2.1.3 + resolution: "@lumino/polling@npm:2.1.3" dependencies: - "@lumino/coreutils": "npm:^2.1.2" - "@lumino/disposable": "npm:^2.1.2" - "@lumino/signaling": "npm:^2.1.2" - checksum: 8/fa9b401e6dbeb8f31d7e3ba485e8ef1e0c92b3f2da086239c0ed49931026f5d3528709193c93e031e35ac624fb4bbbfcdcbaa0e25eb797f36e2952e5cd91e9e3 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/signaling": ^2.1.3 + checksum: 2c94dbc2339dd06b3b89a3a690d23576ce095f92bf1f614557dcaeb1c1a8a707b2a18d78c03e5fd7376a43e3f393cc4fec42a65580ae4b67c6630ea86cecbac6 languageName: node linkType: hard -"@lumino/properties@npm:^1.8.2": - version: 1.8.2 - resolution: "@lumino/properties@npm:1.8.2" - checksum: 8/9a53709fe58d3abbc99062f0c0fda4d5f64a4c7dca509251f0f89cdcaf881fdf6172ee852dbfe70594ee34bb97255acca771a722d62e7e2150ba8cf6f7e7d15c +"@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 languageName: node linkType: hard -"@lumino/properties@npm:^2.0.0, @lumino/properties@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/properties@npm:2.0.1" - checksum: 8/c50173a935148cc4148fdaea119df1d323ee004ae16ab666800388d27e9730345629662d85f25591683329b39f0cdae60ee8c94e8943b4d0ef7d7370a38128d6 +"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^1.10.1 || ^2.1, @lumino/signaling@npm:^2.1.2, @lumino/signaling@npm:^2.1.3": + version: 2.1.3 + resolution: "@lumino/signaling@npm:2.1.3" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/coreutils": ^2.2.0 + checksum: ce59383bd75fe30df5800e0442dbc4193cc6778e2530b9be0f484d159f1d8668be5c6ee92cee9df36d5a0c3dbd9126d0479a82581dee1df889d5c9f922d3328d languageName: node linkType: hard -"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.1, @lumino/signaling@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/signaling@npm:2.1.2" +"@lumino/virtualdom@npm:^2.0.1, @lumino/virtualdom@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/virtualdom@npm:2.0.2" dependencies: - "@lumino/algorithm": "npm:^2.0.1" - "@lumino/coreutils": "npm:^2.1.2" - checksum: 8/ad7d7153db57980da899c43e412e6130316ef30b231a70250e7af49058db16cadb018c1417a2ea8083d83c48623cfe6b705fa82bf10216b1a8949aed9f4aca4e + "@lumino/algorithm": ^2.0.2 + checksum: 0e1220d5b3b2441e7668f3542a6341e015bdbea0c8bd6d4be962009386c034336540732596d5dedcd54ca57fbde61c2942549129a3e1b0fccb1aa143685fcd15 languageName: node linkType: hard -"@lumino/signaling@npm:^1.10.1, @lumino/signaling@npm:^1.10.2": - version: 1.10.2 - resolution: "@lumino/signaling@npm:1.10.2" +"@lumino/widgets@npm:^1.30.0 || ^2.1, @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": "npm:^1.9.2" - checksum: 8/3ab05df9c414d289863313c92b92e22b001084e4e6571c117049d99b58d7f79b2520089d5c18d86dce7e653cb13c60f451b7f3ddabd361a4348ca15ceba6a8a0 + "@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 languageName: node linkType: hard -"@lumino/virtualdom@npm:^1.14.2": - version: 1.14.2 - resolution: "@lumino/virtualdom@npm:1.14.2" - dependencies: - "@lumino/algorithm": "npm:^1.9.2" - checksum: 8/1113f5bda94abce2a94b5ce83fe6a1fa9cc88ae9a69f4e6d7115f57dbdc60a39d91117b197b4a96e1e10fddbab277a9327d2806c1fca20d7f5cb7aa7cfb5e179 +"@microsoft/fast-colors@npm:^5.3.1": + version: 5.3.1 + resolution: "@microsoft/fast-colors@npm:5.3.1" + checksum: ff87f402faadb4b5aeee3d27762566c11807f927cd4012b8bbc7f073ca68de0e2197f95330ff5dfd7038f4b4f0e2f51b11feb64c5d570f5c598d37850a5daf60 languageName: node linkType: hard -"@lumino/virtualdom@npm:^2.0.0, @lumino/virtualdom@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/virtualdom@npm:2.0.1" +"@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.50.0": + version: 2.50.0 + resolution: "@microsoft/fast-foundation@npm:2.50.0" dependencies: - "@lumino/algorithm": "npm:^2.0.1" - checksum: 8/cf59b6f15b430e13e9e657b7a0619b9056cd9ea7b2a87f407391d071c501b77403c302b6a66dca510382045e75b2e3fe551630bb391f1c6b33678057d4bec164 + "@microsoft/fast-element": ^1.14.0 + "@microsoft/fast-web-utilities": ^5.4.1 + tabbable: ^5.2.0 + tslib: ^1.13.0 + checksum: 651501eb8cd5a3e583638f70a4e7c0ad30952fe12adedd5c4c24861515d0aaeec0e83d1f1cd25dece899d2fa1614b415001c461f76bb84b20e1a8e18a3fcf219 languageName: node linkType: hard -"@lumino/widgets@npm:^1.30.0": - version: 1.34.0 - resolution: "@lumino/widgets@npm:1.34.0" +"@microsoft/fast-react-wrapper@npm:^0.3.22": + version: 0.3.25 + resolution: "@microsoft/fast-react-wrapper@npm:0.3.25" dependencies: - "@lumino/algorithm": "npm:^1.9.2" - "@lumino/commands": "npm:^1.20.1" - "@lumino/coreutils": "npm:^1.12.1" - "@lumino/disposable": "npm:^1.10.2" - "@lumino/domutils": "npm:^1.8.2" - "@lumino/dragdrop": "npm:^1.14.1" - "@lumino/keyboard": "npm:^1.8.2" - "@lumino/messaging": "npm:^1.10.2" - "@lumino/properties": "npm:^1.8.2" - "@lumino/signaling": "npm:^1.10.2" - "@lumino/virtualdom": "npm:^1.14.2" - checksum: 8/e8c255f41ec02b50cd598ca92dea5e934fa99f0337126e0917d9b65355dd85be199134114f4373201d4b62286661478370b1b17b948dbef249954239b02515fe + "@microsoft/fast-element": ^1.14.0 + "@microsoft/fast-foundation": ^2.50.0 + peerDependencies: + react: ">=16.9.0" + checksum: 4c8e597eefd51c3091c25d0df28018b3283139178d6fd759532b40deb189f0422877308894fe55670edb82ed2a5b0138f2be8ef0b3df3ae518c14f75d6d0d577 languageName: node linkType: hard -"@lumino/widgets@npm:^1.30.0 || ^2.1, @lumino/widgets@npm:^1.34.0 || ^2, @lumino/widgets@npm:^1.37.2 || ^2.1.1, @lumino/widgets@npm:^2.1.1, @lumino/widgets@npm:^2.3.0": - version: 2.3.0 - resolution: "@lumino/widgets@npm:2.3.0" +"@microsoft/fast-web-utilities@npm:^5.4.1": + version: 5.4.1 + resolution: "@microsoft/fast-web-utilities@npm:5.4.1" dependencies: - "@lumino/algorithm": "npm:^2.0.1" - "@lumino/commands": "npm:^2.1.3" - "@lumino/coreutils": "npm:^2.1.2" - "@lumino/disposable": "npm:^2.1.2" - "@lumino/domutils": "npm:^2.0.1" - "@lumino/dragdrop": "npm:^2.1.3" - "@lumino/keyboard": "npm:^2.0.1" - "@lumino/messaging": "npm:^2.0.1" - "@lumino/properties": "npm:^2.0.1" - "@lumino/signaling": "npm:^2.1.2" - "@lumino/virtualdom": "npm:^2.0.1" - checksum: 8/a8559bd3574b7fc16e7679e05994c515b0d3e78dada35786d161f67c639941d134e92ce31d95c2e4ac06709cdf83b0e7fb4b6414a3f7779579222a2fb525d025 + exenv-es6: ^1.1.1 + checksum: 303e87847f962944f474e3716c3eb305668243916ca9e0719e26bb9a32346144bc958d915c103776b3e552cea0f0f6233f839fad66adfdf96a8436b947288ca7 languageName: node linkType: hard @@ -902,14 +1673,14 @@ __metadata: dependencies: "@nodelib/fs.stat": "npm:2.0.5" run-parallel: "npm:^1.1.9" - checksum: 8/a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 languageName: node linkType: hard "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 8/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard @@ -919,59 +1690,52 @@ __metadata: dependencies: "@nodelib/fs.scandir": "npm:2.1.5" fastq: "npm:^1.6.0" - checksum: 8/190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 languageName: node linkType: hard "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 8/6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f languageName: node linkType: hard -"@pkgr/utils@npm:^2.3.1": - version: 2.4.2 - resolution: "@pkgr/utils@npm:2.4.2" - dependencies: - cross-spawn: "npm:^7.0.3" - fast-glob: "npm:^3.3.0" - is-glob: "npm:^4.0.3" - open: "npm:^9.1.0" - picocolors: "npm:^1.0.0" - tslib: "npm:^2.6.0" - checksum: 8/24e04c121269317d259614cd32beea3af38277151c4002df5883c4be920b8e3490bb897748e844f9d46bf68230f86dabd4e8f093773130e7e60529a769a132fc +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 6f25fd2e3008f259c77207ac9915b02f1628420403b2630c92a07ff963129238c9262afc9e84344c7a23b5cc1f3965e2cd17e3798219f5fd78a63d144d3cceba languageName: node linkType: hard -"@rjsf/core@npm:^5.1.0": - version: 5.11.2 - resolution: "@rjsf/core@npm:5.11.2" +"@rjsf/core@npm:^5.13.4": + version: 5.22.1 + resolution: "@rjsf/core@npm:5.22.1" dependencies: - lodash: "npm:^4.17.21" - lodash-es: "npm:^4.17.21" - markdown-to-jsx: "npm:^7.2.1" - nanoid: "npm:^3.3.6" - prop-types: "npm:^15.8.1" + 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.8.x + "@rjsf/utils": ^5.22.x react: ^16.14.0 || >=17 - checksum: 8/e3c80418fedc2c4bd30eb3a97d34e374fe08000cb8aa9135c72b2e1e2cc3321ec174a28368626bb553d7707834b966de65cef7fa890e2ddd167156ab99d7b759 + checksum: c6bda6ecb2ea948d14b30fd8a0cedcc1caa8d527bde353a958f4f78304a6ecdbccf1982424e3fbe324bccdc77fed22823a9240e937a07c8e477845b97002b2bb languageName: node linkType: hard -"@rjsf/utils@npm:^5.1.0": - version: 5.11.2 - resolution: "@rjsf/utils@npm:5.11.2" +"@rjsf/utils@npm:^5.13.4": + version: 5.22.1 + resolution: "@rjsf/utils@npm:5.22.1" dependencies: - json-schema-merge-allof: "npm:^0.8.1" - jsonpointer: "npm:^5.0.1" - lodash: "npm:^4.17.21" - lodash-es: "npm:^4.17.21" - react-is: "npm:^18.2.0" + json-schema-merge-allof: ^0.8.1 + jsonpointer: ^5.0.1 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 8/979d5b14baa0fa320dfdfc39a81935b179a3a223b90d787bbc81a1d262601610a1dbe19f2b6db1fb75858f9930ede4751ab4c3f0730a4e38c6d3fbef8685639b + checksum: d6a059e72afe3c86a22a7a49df15e2458e6a853645b75081757dee7afff1c2d5935fc87ca4f031502bf4629d403a3425375339e5e163cb94634aa462568b1aef languageName: node linkType: hard @@ -981,21 +1745,21 @@ __metadata: dependencies: "@types/jquery": "npm:*" "@types/underscore": "npm:*" - checksum: 8/4f44bfb71d75332b5de610be7687f4ae523ad4ef02da844a828403b534b6a94a6288b32cab64371d0ad526e35cfed511652ac53af22d0b9caaac3f4cfb4375dd + checksum: 4f44bfb71d75332b5de610be7687f4ae523ad4ef02da844a828403b534b6a94a6288b32cab64371d0ad526e35cfed511652ac53af22d0b9caaac3f4cfb4375dd languageName: node linkType: hard "@types/estree@npm:^1.0.5": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 languageName: node linkType: hard "@types/expect.js@npm:^0.3.29": - version: 0.3.29 - resolution: "@types/expect.js@npm:0.3.29" - checksum: 8/c04ea8ae20939a69e66b09fce3a03041a93db300f16a3ca660f84601a35eaee10ca64d190467d1cf09f13d20347890bfa46397a2ac676daca0ec77c4d4950dcd + version: 0.3.32 + resolution: "@types/expect.js@npm:0.3.32" + checksum: 3e7714cda0941388846adeae9c1a75ea956f8d90477cebf500d3500f943e0ab476395f3b4770724656fe927b3e4d8d705f20b8b4e61f6fd1f871b0ffec4e0df2 languageName: node linkType: hard @@ -1004,95 +1768,89 @@ __metadata: resolution: "@types/jquery@npm:3.5.14" dependencies: "@types/sizzle": "npm:*" - checksum: 8/159d6f804ed1a204b3f79f2d591a271d82e866bd45bd49fb6ef40561a25dbe0f47ec7815681b44cc2db5598425f72811e7e80ab0e983d980470998ac56feb375 + checksum: 159d6f804ed1a204b3f79f2d591a271d82e866bd45bd49fb6ef40561a25dbe0f47ec7815681b44cc2db5598425f72811e7e80ab0e983d980470998ac56feb375 languageName: node linkType: hard "@types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 8/00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 languageName: node linkType: hard "@types/lodash@npm:^4.14.134": version: 4.14.184 resolution: "@types/lodash@npm:4.14.184" - checksum: 8/6d9a4d67f7f9d0ec3fd21174f3dd3d00629dc1227eb469450eace53adbc1f7e2330699c28d0fe093e5f0fef0f0e763098be1f779268857213224af082b62be21 + checksum: 6d9a4d67f7f9d0ec3fd21174f3dd3d00629dc1227eb469450eace53adbc1f7e2330699c28d0fe093e5f0fef0f0e763098be1f779268857213224af082b62be21 languageName: node linkType: hard "@types/minimist@npm:^1.2.2": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: 8/b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 languageName: node linkType: hard "@types/node@npm:*, @types/node@npm:^18.7.8": - version: 18.7.8 - resolution: "@types/node@npm:18.7.8" - checksum: 8/e0125efefa896083c05f549d93166109959ffdd68cb626aad0d660c0ce9de888fe405b4763b4a3c3e0968560409c272413e0ad07204522543c688e162a617ecb + version: 18.19.59 + resolution: "@types/node@npm:18.19.59" + dependencies: + undici-types: ~5.26.4 + checksum: 8e45a05aa91437d3d11a346775ac16589353070c504f91a62cd91945a384231ccbbe92009a8e1ae653f954f9de5bf8ff106cc8e26721ecab98914dc019217aef languageName: node linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: 8/e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 languageName: node linkType: hard "@types/prop-types@npm:*": version: 15.7.5 resolution: "@types/prop-types@npm:15.7.5" - checksum: 8/5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 languageName: node linkType: hard "@types/react@npm:^18.0.26": - version: 18.2.19 - resolution: "@types/react@npm:18.2.19" + version: 18.3.12 + resolution: "@types/react@npm:18.3.12" dependencies: - "@types/prop-types": "npm:*" - "@types/scheduler": "npm:*" - csstype: "npm:^3.0.2" - checksum: 8/1ef657b90c7413451bbac2fd2fbce4f8a093941bc5041d344ab9833bc113c8eebf6318dae8aeeb1a0f922f15bc772507e6aaa0c7b51847b5f7302921c8dd6740 - languageName: node - linkType: hard - -"@types/scheduler@npm:*": - version: 0.16.2 - resolution: "@types/scheduler@npm:0.16.2" - checksum: 8/b6b4dcfeae6deba2e06a70941860fb1435730576d3689225a421280b7742318d1548b3d22c1f66ab68e414f346a9542f29240bc955b6332c5b11e561077583bc + "@types/prop-types": "*" + csstype: ^3.0.2 + checksum: 4ab1577a8c2105a5e316536f724117c90eee5f4bd5c137fc82a2253d8c1fd299dedaa07e8dfc95d6e2f04a4be3cb8b0e1b06098c6233ebd55c508d88099395b7 languageName: node linkType: hard "@types/semver@npm:^7.5.0": - version: 7.5.0 - resolution: "@types/semver@npm:7.5.0" - checksum: 8/0a64b9b9c7424d9a467658b18dd70d1d781c2d6f033096a6e05762d20ebbad23c1b69b0083b0484722aabf35640b78ccc3de26368bcae1129c87e9df028a22e2 + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 languageName: node linkType: hard "@types/sizzle@npm:*": version: 2.3.3 resolution: "@types/sizzle@npm:2.3.3" - checksum: 8/586a9fb1f6ff3e325e0f2cc1596a460615f0bc8a28f6e276ac9b509401039dd242fa8b34496d3a30c52f5b495873922d09a9e76c50c2ab2bcc70ba3fb9c4e160 + checksum: 586a9fb1f6ff3e325e0f2cc1596a460615f0bc8a28f6e276ac9b509401039dd242fa8b34496d3a30c52f5b495873922d09a9e76c50c2ab2bcc70ba3fb9c4e160 languageName: node linkType: hard "@types/source-list-map@npm:*": version: 0.1.2 resolution: "@types/source-list-map@npm:0.1.2" - checksum: 8/fda8f37537aca9d3ed860d559289ab1dddb6897e642e6f53e909bbd18a7ac3129a8faa2a7d093847c91346cf09c86ef36e350c715406fba1f2271759b449adf6 + checksum: fda8f37537aca9d3ed860d559289ab1dddb6897e642e6f53e909bbd18a7ac3129a8faa2a7d093847c91346cf09c86ef36e350c715406fba1f2271759b449adf6 languageName: node linkType: hard "@types/underscore@npm:*": version: 1.11.4 resolution: "@types/underscore@npm:1.11.4" - checksum: 8/db9f8486bc851b732259e51f42d62aad1ae2158be5724612dc125ece5f5d61c51447f9dea28284c2a0f79cb95e788d01cb5ce97709880019213e69fab0dd1696 + checksum: db9f8486bc851b732259e51f42d62aad1ae2158be5724612dc125ece5f5d61c51447f9dea28284c2a0f79cb95e788d01cb5ce97709880019213e69fab0dd1696 languageName: node linkType: hard @@ -1103,130 +1861,137 @@ __metadata: "@types/node": "npm:*" "@types/source-list-map": "npm:*" source-map: "npm:^0.6.1" - checksum: 8/bc09c584c7047e8aed29801a3981787dee3898e9e7a99891a362df114fcac3879eea5a00932314866a01b25220391839be09fe1487b16d4970ff4a7afd5b9725 + checksum: bc09c584c7047e8aed29801a3981787dee3898e9e7a99891a362df114fcac3879eea5a00932314866a01b25220391839be09fe1487b16d4970ff4a7afd5b9725 languageName: node linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.1.0": - version: 6.3.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.3.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.3.0" - "@typescript-eslint/type-utils": "npm:6.3.0" - "@typescript-eslint/utils": "npm:6.3.0" - "@typescript-eslint/visitor-keys": "npm:6.3.0" - debug: "npm:^4.3.4" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.4" - natural-compare: "npm:^1.4.0" - natural-compare-lite: "npm:^1.4.0" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 peerDependencies: "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 8/1493c6c661993640eef56893a7919cb964165cb46653c62468e71ce02a5ec8c654dd7e9767587aea67ec16c026a5630011bc7ea6c04e2fa8a4afee7f26a51358 + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd languageName: node linkType: hard "@typescript-eslint/parser@npm:^6.1.0": - version: 6.3.0 - resolution: "@typescript-eslint/parser@npm:6.3.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:6.3.0" - "@typescript-eslint/types": "npm:6.3.0" - "@typescript-eslint/typescript-estree": "npm:6.3.0" - "@typescript-eslint/visitor-keys": "npm:6.3.0" - debug: "npm:^4.3.4" + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 8/ec739adbe4a972a696b4a4625dc5c2f5b4e072968decdcafd0a9b972d0167007230951a6450becb52e187b1b90a2858debba26f73162e293f7846b373888b8e9 + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.3.0": - version: 6.3.0 - resolution: "@typescript-eslint/scope-manager@npm:6.3.0" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.3.0" - "@typescript-eslint/visitor-keys": "npm:6.3.0" - checksum: 8/1690465f620f2b4517d45516864ef107258b2b608293d72606d0f115e11a8c1416b3d57e1b67f1daa1838f0239f71464aead57fe77c53ebd54b0aeee5fd4cf5e + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.3.0": - version: 6.3.0 - resolution: "@typescript-eslint/type-utils@npm:6.3.0" +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.3.0" - "@typescript-eslint/utils": "npm:6.3.0" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.0.1" + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 8/cf2ab9d576bc9f3c0554318d20cb92671e4f46a07c24271fc47f144139b3843dab54592ee2e0962f81ad588f57a0b0a7c09d7e1047c720143a54bb1ec3ac4007 + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc languageName: node linkType: hard -"@typescript-eslint/types@npm:6.3.0": - version: 6.3.0 - resolution: "@typescript-eslint/types@npm:6.3.0" - checksum: 8/3c133e4c1b06d009739f1a4387831eb99758ba45b06b6f632fe9cf14c2839fc92dcbdbb6d94ca42c1cb5ab4ca1b31a5ead50a72e0a084b62e4de15255c451160 +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.3.0": - version: 6.3.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.3.0" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.3.0" - "@typescript-eslint/visitor-keys": "npm:6.3.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 peerDependenciesMeta: typescript: optional: true - checksum: 8/b2bb03411a5d079a9fd3310eec0af3b81a99827569cb3957724071aa54ac6c88449fbd1ebb72d7a356d5994d7e9542b5292a385ca3c3b0bc8049bb61a40a8ae9 + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.3.0": - version: 6.3.0 - resolution: "@typescript-eslint/utils@npm:6.3.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.3.0" - "@typescript-eslint/types": "npm:6.3.0" - "@typescript-eslint/typescript-estree": "npm:6.3.0" - semver: "npm:^7.5.4" +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 8/98a078a3948e8b6a45dec8f3be9bcb72dc98faa2fe84336b1925efb7caa06c05a2fbf7290cddb420465b415cc05252548e2b839b9311f99bce84cf856fd32888 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.3.0": - version: 6.3.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.3.0" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.3.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 8/fc3148c3284de3f42724736f312a4fd0c3c2029617ae2ea9a84cf6601d31f600ee6563f9288de162028ffffde85b58d92feaafbe75a2da863ff2c4e3a0b5ed8c + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 languageName: node linkType: hard @@ -1236,28 +2001,28 @@ __metadata: dependencies: "@webassemblyjs/helper-numbers": "npm:1.11.6" "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + checksum: 31bcc64147236bd7b1b6d29d1f419c1f5845c785e1e42dc9e3f8ca2e05a029e9393a271b84f3a5bff2a32d35f51ff59e2181a6e5f953fe88576acd6750506202 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: 8/29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 + checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 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: 8/e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f + checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f languageName: node linkType: hard "@webassemblyjs/helper-buffer@npm:1.12.1": version: 1.12.1 resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a + checksum: c3ffb723024130308db608e86e2bdccd4868bbb62dffb0a9a1530606496f79c87f8565bd8e02805ce64912b71f1a70ee5fb00307258b0c082c3abf961d097eca languageName: node linkType: hard @@ -1268,14 +2033,14 @@ __metadata: "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" "@webassemblyjs/helper-api-error": "npm:1.11.6" "@xtuc/long": "npm:4.2.2" - checksum: 8/f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 + checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 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: 8/3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc + checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc languageName: node linkType: hard @@ -1287,7 +2052,7 @@ __metadata: "@webassemblyjs/helper-buffer": "npm:1.12.1" "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + checksum: c19810cdd2c90ff574139b6d8c0dda254d42d168a9e5b3d353d1bc085f1d7164ccd1b3c05592a45a939c47f7e403dc8d03572bb686642f06a3d02932f6f0bc8f languageName: node linkType: hard @@ -1296,7 +2061,7 @@ __metadata: resolution: "@webassemblyjs/ieee754@npm:1.11.6" dependencies: "@xtuc/ieee754": "npm:^1.2.0" - checksum: 8/13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de + checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de languageName: node linkType: hard @@ -1305,14 +2070,14 @@ __metadata: resolution: "@webassemblyjs/leb128@npm:1.11.6" dependencies: "@xtuc/long": "npm:4.2.2" - checksum: 8/7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 + checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 languageName: node linkType: hard "@webassemblyjs/utf8@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 8/807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 + checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 languageName: node linkType: hard @@ -1328,7 +2093,7 @@ __metadata: "@webassemblyjs/wasm-opt": "npm:1.12.1" "@webassemblyjs/wasm-parser": "npm:1.12.1" "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + checksum: ae23642303f030af888d30c4ef37b08dfec7eab6851a9575a616e65d1219f880d9223913a39056dd654e49049d76e97555b285d1f7e56935047abf578cce0692 languageName: node linkType: hard @@ -1341,7 +2106,7 @@ __metadata: "@webassemblyjs/ieee754": "npm:1.11.6" "@webassemblyjs/leb128": "npm:1.11.6" "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + checksum: 5787626bb7f0b033044471ddd00ce0c9fe1ee4584e8b73e232051e3a4c99ba1a102700d75337151c8b6055bae77eefa4548960c610a5e4a504e356bd872138ff languageName: node linkType: hard @@ -1353,7 +2118,7 @@ __metadata: "@webassemblyjs/helper-buffer": "npm:1.12.1" "@webassemblyjs/wasm-gen": "npm:1.12.1" "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + checksum: 0e8fa8a0645304a1e18ff40d3db5a2e9233ebaa169b19fcc651d6fc9fe2cac0ce092ddee927318015ae735d9cd9c5d97c0cafb6a51dcd2932ac73587b62df991 languageName: node linkType: hard @@ -1367,7 +2132,7 @@ __metadata: "@webassemblyjs/ieee754": "npm:1.11.6" "@webassemblyjs/leb128": "npm:1.11.6" "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + checksum: 176015de3551ac068cd4505d837414f258d9ade7442bd71efb1232fa26c9f6d7d4e11a5c816caeed389943f409af7ebff6899289a992d7a70343cb47009d21a8 languageName: node linkType: hard @@ -1377,7 +2142,7 @@ __metadata: dependencies: "@webassemblyjs/ast": "npm:1.12.1" "@xtuc/long": "npm:4.2.2" - checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + checksum: 2974b5dda8d769145ba0efd886ea94a601e61fb37114c14f9a9a7606afc23456799af652ac3052f284909bd42edc3665a76bc9b50f95f0794c053a8a1757b713 languageName: node linkType: hard @@ -1387,7 +2152,7 @@ __metadata: peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x - checksum: 8/9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 + checksum: 9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 languageName: node linkType: hard @@ -1397,7 +2162,7 @@ __metadata: peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x - checksum: 8/8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e + checksum: 8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e languageName: node linkType: hard @@ -1410,28 +2175,28 @@ __metadata: peerDependenciesMeta: webpack-dev-server: optional: true - checksum: 8/75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 + checksum: 75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 languageName: node linkType: hard "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: 8/ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a + checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a languageName: node linkType: hard "@xtuc/long@npm:4.2.2": version: 4.2.2 resolution: "@xtuc/long@npm:4.2.2" - checksum: 8/8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec + checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec languageName: node linkType: hard "abab@npm:^2.0.3": version: 2.0.6 resolution: "abab@npm:2.0.6" - checksum: 8/6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e languageName: node linkType: hard @@ -1440,7 +2205,7 @@ __metadata: resolution: "acorn-import-attributes@npm:1.9.5" peerDependencies: acorn: ^8 - checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d + checksum: 1c0c49b6a244503964ae46ae850baccf306e84caf99bc2010ed6103c69a423987b07b520a6c619f075d215388bd4923eccac995886a54309eda049ab78a4be95 languageName: node linkType: hard @@ -1449,7 +2214,7 @@ __metadata: resolution: "acorn-jsx@npm:5.3.2" peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 8/c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 languageName: node linkType: hard @@ -1458,17 +2223,7 @@ __metadata: resolution: "acorn@npm:8.10.0" bin: acorn: bin/acorn - checksum: 8/538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 8/1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d languageName: node linkType: hard @@ -1482,7 +2237,7 @@ __metadata: peerDependenciesMeta: ajv: optional: true - checksum: 8/4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 languageName: node linkType: hard @@ -1491,7 +2246,7 @@ __metadata: resolution: "ajv-keywords@npm:3.5.2" peerDependencies: ajv: ^6.9.1 - checksum: 8/7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 languageName: node linkType: hard @@ -1502,7 +2257,7 @@ __metadata: fast-deep-equal: "npm:^3.1.3" peerDependencies: ajv: ^8.8.2 - checksum: 8/c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 + checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 languageName: node linkType: hard @@ -1514,42 +2269,42 @@ __metadata: fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 8/874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 languageName: node linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.12.0, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 8/4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + fast-deep-equal: ^3.1.3 + fast-uri: ^3.0.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 languageName: node linkType: hard -"ansi-escapes@npm:^4.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" +"ansi-escapes@npm:^7.0.0": + version: 7.0.0 + resolution: "ansi-escapes@npm:7.0.0" dependencies: - type-fest: "npm:^0.21.3" - checksum: 8/93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + environment: ^1.0.0 + checksum: 19baa61e68d1998c03b3b8bd023653a6c2667f0ed6caa9a00780ffd6f0a14f4a6563c57a38b3c0aba71bd704cd49c4c8df41be60bd81c957409f91e9dd49051f languageName: node linkType: hard "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" - checksum: 8/2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b languageName: node linkType: hard "ansi-regex@npm:^6.0.1": version: 6.0.1 resolution: "ansi-regex@npm:6.0.1" - checksum: 8/1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 languageName: node linkType: hard @@ -1558,7 +2313,7 @@ __metadata: resolution: "ansi-styles@npm:3.2.1" dependencies: color-convert: "npm:^1.9.0" - checksum: 8/d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 languageName: node linkType: hard @@ -1567,67 +2322,130 @@ __metadata: resolution: "ansi-styles@npm:4.3.0" dependencies: color-convert: "npm:^2.0.1" - checksum: 8/513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" - checksum: 8/ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 languageName: node linkType: hard "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" - checksum: 8/83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced languageName: node linkType: hard -"array-includes@npm:^3.1.5": - version: 3.1.5 - resolution: "array-includes@npm:3.1.5" +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.19.5" - get-intrinsic: "npm:^1.1.1" - is-string: "npm:^1.0.7" - checksum: 8/f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5 + call-bind: ^1.0.5 + is-array-buffer: ^3.0.4 + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + languageName: node + linkType: hard + +"array-includes@npm:^3.1.5, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.4 + is-string: ^1.0.7 + checksum: eb39ba5530f64e4d8acab39297c11c1c5be2a4ea188ab2b34aba5fb7224d918f77717a9d57a3e2900caaa8440e59431bdaf5c974d5212ef65d97f132e38e2d91 languageName: node linkType: hard "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" - checksum: 8/5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.0": - version: 1.3.0 - resolution: "array.prototype.flatmap@npm:1.3.0" +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.2" - es-shim-unscopables: "npm:^1.0.0" - checksum: 8/818538f39409c4045d874be85df0dbd195e1446b14d22f95bdcfefea44ae77db44e42dcd89a559254ec5a7c8b338cfc986cc6d641e3472f9a5326b21eb2976a2 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-shim-unscopables: ^1.0.2 + checksum: 83ce4ad95bae07f136d316f5a7c3a5b911ac3296c3476abe60225bc4a17938bf37541972fcc37dd5adbc99cbb9c928c70bbbfc1c1ce549d41a415144030bb446 + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + es-shim-unscopables: ^1.0.0 + checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.3 + es-errors: ^1.3.0 + es-shim-unscopables: ^1.0.2 + checksum: e4142d6f556bcbb4f393c02e7dbaea9af8f620c040450c2be137c9cbbd1a17f216b9c688c5f2c08fbb038ab83f55993fa6efdd9a05881d84693c7bcb5422127a + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.2.1 + get-intrinsic: ^1.2.3 + is-array-buffer: ^3.0.4 + is-shared-array-buffer: ^1.0.2 + checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e languageName: node linkType: hard "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" - checksum: 8/745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 languageName: node linkType: hard "astral-regex@npm:^2.0.0": version: 2.0.0 resolution: "astral-regex@npm:2.0.0" - checksum: 8/876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 languageName: node linkType: hard @@ -1636,44 +2454,35 @@ __metadata: resolution: "backbone@npm:1.4.0" dependencies: underscore: "npm:>=1.8.3" - checksum: 8/09abdf184c485a4cd2c68218298cf772fbefeaa166ef8eb795cdb0159b4ad1d2f6823dde089352eaf0be929e5bbef67c57555722f4d1886f969d954f77814870 + checksum: 09abdf184c485a4cd2c68218298cf772fbefeaa166ef8eb795cdb0159b4ad1d2f6823dde089352eaf0be929e5bbef67c57555722f4d1886f969d954f77814870 languageName: node linkType: hard "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" - checksum: 8/9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 languageName: node linkType: hard "balanced-match@npm:^2.0.0": version: 2.0.0 resolution: "balanced-match@npm:2.0.0" - checksum: 8/9a5caad6a292c5df164cc6d0c38e0eedf9a1413f42e5fece733640949d74d0052cfa9587c1a1681f772147fb79be495121325a649526957fd75b3a216d1fbc68 + checksum: 9a5caad6a292c5df164cc6d0c38e0eedf9a1413f42e5fece733640949d74d0052cfa9587c1a1681f772147fb79be495121325a649526957fd75b3a216d1fbc68 languageName: node linkType: hard -"big-integer@npm:^1.6.44": - version: 1.6.51 - resolution: "big-integer@npm:1.6.51" - checksum: 8/3d444173d1b2e20747e2c175568bedeebd8315b0637ea95d75fd27830d3b8e8ba36c6af40374f36bdaea7b5de376dcada1b07587cb2a79a928fccdb6e6e3c518 +"base64-js@npm:^1.2.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 languageName: node linkType: hard "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" - checksum: 8/b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e - languageName: node - linkType: hard - -"bplist-parser@npm:^0.2.0": - version: 0.2.0 - resolution: "bplist-parser@npm:0.2.0" - dependencies: - big-integer: "npm:^1.6.44" - checksum: 8/d5339dd16afc51de6c88f88f58a45b72ed6a06aa31f5557d09877575f220b7c1d3fbe375da0b62e6a10d4b8ed80523567e351f24014f5bc886ad523758142cdd + checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e languageName: node linkType: hard @@ -1683,7 +2492,7 @@ __metadata: dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 8/faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 languageName: node linkType: hard @@ -1692,7 +2501,7 @@ __metadata: resolution: "brace-expansion@npm:2.0.1" dependencies: balanced-match: "npm:^1.0.0" - checksum: 8/a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 languageName: node linkType: hard @@ -1701,7 +2510,7 @@ __metadata: resolution: "braces@npm:3.0.3" dependencies: fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 languageName: node linkType: hard @@ -1715,40 +2524,34 @@ __metadata: update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10c0/95e76ad522753c4c470427f6e3c8a4bb5478ff448841e22b3d3e53f89ecaf17b6984666d6c7e715c370f1e7fa0cf684f42e34e554236a8b2fab38ea76b9e4c52 + checksum: de200d3eb8d6ed819dad99719099a28fb6ebeb88016a5ac42fbdc11607e910c236a84ca1b0bbf232477d4b88ab64e8ab6aa67557cdd40a73ca9c2834f92ccce0 languageName: node linkType: hard "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" - checksum: 8/0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb languageName: node linkType: hard -"bundle-name@npm:^3.0.0": - version: 3.0.0 - resolution: "bundle-name@npm:3.0.0" - dependencies: - run-applescript: "npm:^5.0.0" - checksum: 8/edf2b1fbe6096ed32e7566947ace2ea937ee427391744d7510a2880c4b9a5b3543d3f6c551236a29e5c87d3195f8e2912516290e638c15bcbede7b37cc375615 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" +"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" dependencies: - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.0.2" - checksum: 8/f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 languageName: node linkType: hard "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" - checksum: 8/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 languageName: node linkType: hard @@ -1756,36 +2559,36 @@ __metadata: version: 7.0.2 resolution: "camelcase-keys@npm:7.0.2" dependencies: - camelcase: "npm:^6.3.0" - map-obj: "npm:^4.1.0" - quick-lru: "npm:^5.1.1" - type-fest: "npm:^1.2.1" - checksum: 8/b5821cc48dd00e8398a30c5d6547f06837ab44de123f1b3a603d0a03399722b2fc67a485a7e47106eb02ef543c3b50c5ebaabc1242cde4b63a267c3258d2365b + camelcase: ^6.3.0 + map-obj: ^4.1.0 + quick-lru: ^5.1.1 + type-fest: ^1.2.1 + checksum: b5821cc48dd00e8398a30c5d6547f06837ab44de123f1b3a603d0a03399722b2fc67a485a7e47106eb02ef543c3b50c5ebaabc1242cde4b63a267c3258d2365b languageName: node linkType: hard "camelcase@npm:^6.3.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" - checksum: 8/8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d languageName: node linkType: hard "caniuse-lite@npm:^1.0.30001663": version: 1.0.30001664 resolution: "caniuse-lite@npm:1.0.30001664" - checksum: 10c0/db2b431aba41a585191ab1e4d40da0ad349ff32400edac2a167bf6bf92dbf9c704eab03dc60fb89e882ce02478d61c3036b2b1bdce8edf9b2aabda5608bae05e + checksum: cee25b4ea8a84779b7c9a60c1f9e304f6d99b79ef622b25fbc7873b4e55e8722a1091dd6c8b77bd7723e9f26a84b4a820a50a864989dd477e7ee51dc30461dca languageName: node linkType: hard -"chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.3.0, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: ansi-styles: "npm:^3.2.1" escape-string-regexp: "npm:^1.0.5" supports-color: "npm:^5.3.0" - checksum: 8/ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 languageName: node linkType: hard @@ -1795,50 +2598,40 @@ __metadata: dependencies: ansi-styles: "npm:^4.1.0" supports-color: "npm:^7.1.0" - checksum: 8/fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc languageName: node linkType: hard -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: 8/cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 8/2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 +"chalk@npm:~5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 languageName: node linkType: hard -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: "npm:^3.1.0" - checksum: 8/2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 languageName: node linkType: hard -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" +"cli-cursor@npm:^5.0.0": + version: 5.0.0 + resolution: "cli-cursor@npm:5.0.0" dependencies: - slice-ansi: "npm:^3.0.0" - string-width: "npm:^4.2.0" - checksum: 8/bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d + restore-cursor: ^5.0.0 + checksum: 1eb9a3f878b31addfe8d82c6d915ec2330cec8447ab1f117f4aa34f0137fbb3137ec3466e1c9a65bcb7557f6e486d343f2da57f253a2f668d691372dfa15c090 languageName: node linkType: hard -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" +"cli-truncate@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-truncate@npm:4.0.0" dependencies: - slice-ansi: "npm:^5.0.0" - string-width: "npm:^5.0.0" - checksum: 8/c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + slice-ansi: ^5.0.0 + string-width: ^7.0.0 + checksum: d5149175fd25ca985731bdeec46a55ec237475cf74c1a5e103baea696aceb45e372ac4acbaabf1316f06bd62e348123060f8191ffadfeedebd2a70a2a7fb199d languageName: node linkType: hard @@ -1849,7 +2642,7 @@ __metadata: is-plain-object: "npm:^2.0.4" kind-of: "npm:^6.0.2" shallow-clone: "npm:^3.0.0" - checksum: 8/770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 languageName: node linkType: hard @@ -1858,7 +2651,7 @@ __metadata: resolution: "color-convert@npm:1.9.3" dependencies: color-name: "npm:1.1.3" - checksum: 8/fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 languageName: node linkType: hard @@ -1867,63 +2660,70 @@ __metadata: resolution: "color-convert@npm:2.0.1" dependencies: color-name: "npm:~1.1.4" - checksum: 8/79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 languageName: node linkType: hard "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" - checksum: 8/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d languageName: node linkType: hard "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" - checksum: 8/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard "colord@npm:^2.9.3": version: 2.9.3 resolution: "colord@npm:2.9.3" - checksum: 8/95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 + checksum: 95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 languageName: node linkType: hard -"colorette@npm:^2.0.14, colorette@npm:^2.0.16, colorette@npm:^2.0.17": - version: 2.0.19 - resolution: "colorette@npm:2.0.19" - checksum: 8/888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 +"colorette@npm:^2.0.14, colorette@npm:^2.0.20": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d languageName: node linkType: hard "commander@npm:^10.0.1": version: 10.0.1 resolution: "commander@npm:10.0.1" - checksum: 8/436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 languageName: node linkType: hard "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" - checksum: 8/ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e languageName: node linkType: hard -"commander@npm:^9.3.0, commander@npm:^9.4.1": +"commander@npm:^9.4.1": version: 9.5.0 resolution: "commander@npm:9.5.0" - checksum: 8/c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + +"commander@npm:~12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 68e9818b00fc1ed9cdab9eb16905551c2b768a317ae69a5e3c43924c2b20ac9bb65b27e1cab36aeda7b6496376d4da908996ba2c0b5d79463e0fb1e77935d514 languageName: node linkType: hard "comment-parser@npm:1.3.1": version: 1.3.1 resolution: "comment-parser@npm:1.3.1" - checksum: 8/421e6a113a3afd548500e7174ab46a2049dccf92e82bbaa3b209031b1bdf97552aabfa1ae2a120c0b62df17e1ba70e0d8b05d68504fee78e1ef974c59bcfe718 + checksum: 421e6a113a3afd548500e7174ab46a2049dccf92e82bbaa3b209031b1bdf97552aabfa1ae2a120c0b62df17e1ba70e0d8b05d68504fee78e1ef974c59bcfe718 languageName: node linkType: hard @@ -1934,7 +2734,7 @@ __metadata: validate.io-array: "npm:^1.0.3" validate.io-function: "npm:^1.0.2" validate.io-integer-array: "npm:^1.0.0" - checksum: 8/51cf33b75f7c8db5142fcb99a9d84a40260993fed8e02a7ab443834186c3ab99b3fd20b30ad9075a6a9d959d69df6da74dd3be8a59c78d9f2fe780ebda8242e1 + checksum: 51cf33b75f7c8db5142fcb99a9d84a40260993fed8e02a7ab443834186c3ab99b3fd20b30ad9075a6a9d959d69df6da74dd3be8a59c78d9f2fe780ebda8242e1 languageName: node linkType: hard @@ -1946,26 +2746,38 @@ __metadata: validate.io-array: "npm:^1.0.3" validate.io-function: "npm:^1.0.2" validate.io-integer-array: "npm:^1.0.0" - checksum: 8/d499ab57dcb48e8d0fd233b99844a06d1cc56115602c920c586e998ebba60293731f5b6976e8a1e83ae6cbfe86716f62d9432e8d94913fed8bd8352f447dc917 + checksum: d499ab57dcb48e8d0fd233b99844a06d1cc56115602c920c586e998ebba60293731f5b6976e8a1e83ae6cbfe86716f62d9432e8d94913fed8bd8352f447dc917 languageName: node linkType: hard "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" - checksum: 8/902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af languageName: node linkType: hard "cosmiconfig@npm:^8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - checksum: 8/836d5d8efa750f3fb17b03d6ca74cd3154ed025dffd045304b3ef59637f662bde1e5dc88f8830080d180ec60841719cf4ea2ce73fb21ec694b16865c478ff297 + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 + languageName: node + linkType: hard + +"crelt@npm:^1.0.5": + version: 1.0.6 + resolution: "crelt@npm:1.0.6" + checksum: dad842093371ad702afbc0531bfca2b0a8dd920b23a42f26e66dabbed9aad9acd5b9030496359545ef3937c3aced0fd4ac39f7a2d280a23ddf9eb7fdcb94a69f languageName: node linkType: hard @@ -1978,7 +2790,7 @@ __metadata: semver: "npm:^5.5.0" shebang-command: "npm:^1.2.0" which: "npm:^1.2.9" - checksum: 8/f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 + checksum: f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 languageName: node linkType: hard @@ -1989,14 +2801,14 @@ __metadata: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 8/671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 languageName: node linkType: hard -"css-functions-list@npm:^3.2.0": - version: 3.2.0 - resolution: "css-functions-list@npm:3.2.0" - checksum: 8/fe912ea852fad500aef9a4f04db9a0371c7b0eb1ac1a45fbd8df0156ae0538cee7492ebd620b9bb502fe5bf2b5ed3bf3c16b6659cf67c7144eff0b597bcc3891 +"css-functions-list@npm:^3.2.1": + version: 3.2.3 + resolution: "css-functions-list@npm:3.2.3" + checksum: 25f12fb0ef1384b1cf45a6e7e0afd596a19bee90b90316d9e50f7820888f4a8f265be7a6a96b10a5c81e403bd7a5ff8010fa936144f84959d9d91c9350cda0d4 languageName: node linkType: hard @@ -2014,7 +2826,7 @@ __metadata: semver: "npm:^7.3.8" peerDependencies: webpack: ^5.0.0 - checksum: 8/7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 + checksum: 7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 languageName: node linkType: hard @@ -2024,7 +2836,7 @@ __metadata: dependencies: mdn-data: "npm:2.0.30" source-map-js: "npm:^1.0.1" - checksum: 8/493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 + checksum: 493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 languageName: node linkType: hard @@ -2033,28 +2845,28 @@ __metadata: resolution: "cssesc@npm:3.0.0" bin: cssesc: bin/cssesc - checksum: 8/f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 + checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 languageName: node linkType: hard "csstype@npm:3.0.10, csstype@npm:^3.0.2": version: 3.0.10 resolution: "csstype@npm:3.0.10" - checksum: 8/20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 + checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 languageName: node linkType: hard "d3-color@npm:^3.0.1": version: 3.1.0 resolution: "d3-color@npm:3.1.0" - checksum: 8/4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b + checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b languageName: node linkType: hard "d3-format@npm:^3.0.1": version: 3.1.0 resolution: "d3-format@npm:3.1.0" - checksum: 8/f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 + checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 languageName: node linkType: hard @@ -2065,19 +2877,52 @@ __metadata: abab: "npm:^2.0.3" whatwg-mimetype: "npm:^2.3.0" whatwg-url: "npm:^8.0.0" - checksum: 8/97caf828aac25e25e04ba6869db0f99c75e6859bb5b424ada28d3e7841941ebf08ddff3c1b1bb4585986bd507a5d54c2a716853ea6cb98af877400e637393e71 + checksum: 97caf828aac25e25e04ba6869db0f99c75e6859bb5b424ada28d3e7841941ebf08ddff3c1b1bb4585986bd507a5d54c2a716853ea6cb98af877400e637393e71 languageName: node linkType: hard -"debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" dependencies: - ms: "npm:2.1.2" + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + 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" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + 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" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + +"debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.6": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 8/3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 languageName: node linkType: hard @@ -2085,76 +2930,59 @@ __metadata: version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" dependencies: - decamelize: "npm:^1.1.0" - map-obj: "npm:^1.0.0" - checksum: 8/fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 languageName: node linkType: hard "decamelize@npm:^1.1.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" - checksum: 8/ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa languageName: node linkType: hard "decamelize@npm:^5.0.0": version: 5.0.1 resolution: "decamelize@npm:5.0.1" - checksum: 8/7c3b1ed4b3e60e7fbc00a35fb248298527c1cdfe603e41dfcf05e6c4a8cb9efbee60630deb677ed428908fb4e74e322966c687a094d1478ddc9c3a74e9dc7140 + checksum: 7c3b1ed4b3e60e7fbc00a35fb248298527c1cdfe603e41dfcf05e6c4a8cb9efbee60630deb677ed428908fb4e74e322966c687a094d1478ddc9c3a74e9dc7140 languageName: node linkType: hard "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" - checksum: 8/edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 languageName: node linkType: hard "deepmerge@npm:^4.2.2": version: 4.2.2 resolution: "deepmerge@npm:4.2.2" - checksum: 8/a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b - languageName: node - linkType: hard - -"default-browser-id@npm:^3.0.0": - version: 3.0.0 - resolution: "default-browser-id@npm:3.0.0" - dependencies: - bplist-parser: "npm:^0.2.0" - untildify: "npm:^4.0.0" - checksum: 8/279c7ad492542e5556336b6c254a4eaf31b2c63a5433265655ae6e47301197b6cfb15c595a6fdc6463b2ff8e1a1a1ed3cba56038a60e1527ba4ab1628c6b9941 + checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b languageName: node linkType: hard -"default-browser@npm:^4.0.0": - version: 4.0.0 - resolution: "default-browser@npm:4.0.0" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - bundle-name: "npm:^3.0.0" - default-browser-id: "npm:^3.0.0" - execa: "npm:^7.1.1" - titleize: "npm:^3.0.0" - checksum: 8/40c5af984799042b140300be5639c9742599bda76dc9eba5ac9ad5943c83dd36cebc4471eafcfddf8e0ec817166d5ba89d56f08e66a126c7c7908a179cead1a7 - languageName: node - linkType: hard - -"define-lazy-prop@npm:^3.0.0": - version: 3.0.0 - resolution: "define-lazy-prop@npm:3.0.0" - checksum: 8/54884f94caac0791bf6395a3ec530ce901cf71c47b0196b8754f3fd17edb6c0e80149c1214429d851873bb0d689dbe08dcedbb2306dc45c8534a5934723851b6 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 8/ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 languageName: node linkType: hard @@ -2163,7 +2991,7 @@ __metadata: resolution: "dir-glob@npm:3.0.1" dependencies: path-type: "npm:^4.0.0" - checksum: 8/fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 languageName: node linkType: hard @@ -2172,7 +3000,7 @@ __metadata: resolution: "doctrine@npm:2.1.0" dependencies: esutils: "npm:^2.0.2" - checksum: 8/a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 languageName: node linkType: hard @@ -2181,45 +3009,45 @@ __metadata: resolution: "doctrine@npm:3.0.0" dependencies: esutils: "npm:^2.0.2" - checksum: 8/fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce languageName: node linkType: hard -"dom-serializer@npm:^1.0.1": - version: 1.4.1 - resolution: "dom-serializer@npm:1.4.1" +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.2.0" - entities: "npm:^2.0.0" - checksum: 8/fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 languageName: node linkType: hard -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": +"domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" - checksum: 8/ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 languageName: node linkType: hard -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" dependencies: - domelementtype: "npm:^2.2.0" - checksum: 8/4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa + domelementtype: ^2.3.0 + checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c languageName: node linkType: hard -"domutils@npm:^2.5.2": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" +"domutils@npm:^3.0.1": + version: 3.1.0 + resolution: "domutils@npm:3.1.0" dependencies: - dom-serializer: "npm:^1.0.1" - domelementtype: "npm:^2.2.0" - domhandler: "npm:^4.2.0" - checksum: 8/abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 + dom-serializer: ^2.0.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 languageName: node linkType: hard @@ -2231,42 +3059,49 @@ __metadata: find-root: "npm:^1.0.0" lodash: "npm:^4.17.4" semver: "npm:^5.4.1" - checksum: 8/d77be45cb72d79a429c64d8f8f7603fea681d182fb795459a3d4afa608faad9a923378a7e80c6855f465263e1983140b6fc3682bd0213228b8cd7906ab4b934d + checksum: d77be45cb72d79a429c64d8f8f7603fea681d182fb795459a3d4afa608faad9a923378a7e80c6855f465263e1983140b6fc3682bd0213228b8cd7906ab4b934d languageName: node linkType: hard "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" - checksum: 8/7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed languageName: node linkType: hard "electron-to-chromium@npm:^1.5.28": version: 1.5.29 resolution: "electron-to-chromium@npm:1.5.29" - checksum: 10c0/ae4849f1fe8d756d30c6f5f992803d8550a98b38a30aecc7d9776858cf229ad05b12cb9f7675f0a89330a077d16e28388cfe394fdd9d0828ffe860c8568c95c2 + checksum: c1de62aaea88c9b3ba32f8f2703b9d77a81633099a8f61365eaf9855d36e72189dcd99b9c3b8b2804afa403ac2ce0b00c23affa6f19d17b04ce0076f66a546b6 + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.4.0 + resolution: "emoji-regex@npm:10.4.0" + checksum: a6d9a0e454829a52e664e049847776ee1fff5646617b06cd87de7c03ce1dfcce4102a3b154d5e9c8e90f8125bc120fc1fe114d523dddf60a8a161f26c72658d2 languageName: node linkType: hard "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" - checksum: 8/d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 languageName: node linkType: hard "emoji-regex@npm:^9.2.2": version: 9.2.2 resolution: "emoji-regex@npm:9.2.2" - checksum: 8/8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 languageName: node linkType: hard "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" - checksum: 8/ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 + checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 languageName: node linkType: hard @@ -2276,14 +3111,14 @@ __metadata: dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 languageName: node linkType: hard -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 8/19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 +"entities@npm:^4.2.0, entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 languageName: node linkType: hard @@ -2292,7 +3127,14 @@ __metadata: resolution: "envinfo@npm:7.8.1" bin: envinfo: dist/cli.js - checksum: 8/de736c98d6311c78523628ff127af138451b162e57af5293c1b984ca821d0aeb9c849537d2fde0434011bed33f6bca5310ca2aab8a51a3f28fc719e89045d648 + checksum: de736c98d6311c78523628ff127af138451b162e57af5293c1b984ca821d0aeb9c849537d2fde0434011bed33f6bca5310ca2aab8a51a3f28fc719e89045d648 + languageName: node + linkType: hard + +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: dd3c1b9825e7f71f1e72b03c2344799ac73f2e9ef81b78ea8b373e55db021786c6b9f3858ea43a436a2c4611052670ec0afe85bc029c384cc71165feee2f4ba6 languageName: node linkType: hard @@ -2301,54 +3143,135 @@ __metadata: resolution: "error-ex@npm:1.3.2" dependencies: is-arrayish: "npm:^0.2.1" - checksum: 8/c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.19.1, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + arraybuffer.prototype.slice: ^1.0.3 + 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 + 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 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 + has-symbols: ^1.0.3 + hasown: ^2.0.2 + internal-slot: ^1.0.7 + is-array-buffer: ^3.0.4 + is-callable: ^1.2.7 + is-data-view: ^1.0.1 + 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 + 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 + 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 + 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 languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": - version: 1.20.1 - resolution: "es-abstract@npm:1.20.1" - dependencies: - call-bind: "npm:^1.0.2" - es-to-primitive: "npm:^1.2.1" - function-bind: "npm:^1.1.1" - function.prototype.name: "npm:^1.1.5" - get-intrinsic: "npm:^1.1.1" - get-symbol-description: "npm:^1.0.0" - has: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.0" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.3" - is-callable: "npm:^1.2.4" - is-negative-zero: "npm:^2.0.2" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" - is-string: "npm:^1.0.7" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.12.0" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.2" - regexp.prototype.flags: "npm:^1.4.3" - string.prototype.trimend: "npm:^1.0.5" - string.prototype.trimstart: "npm:^1.0.5" - unbox-primitive: "npm:^1.0.2" - checksum: 8/28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.1.0": + version: 1.1.0 + resolution: "es-iterator-helpers@npm:1.1.0" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.3 + es-errors: ^1.3.0 + es-set-tostringtag: ^2.0.3 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + globalthis: ^1.0.4 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 + has-symbols: ^1.0.3 + internal-slot: ^1.0.7 + iterator.prototype: ^1.1.3 + safe-array-concat: ^1.1.2 + checksum: 4ba3a32ab7ba05b85f0ae30604feeb8ffd801fe762e9df9577bd220a96b9eaa2e90af8e6bdc498e523051f293955e2f7d2bddd34de71e1428a1b8ff3fd961016 languageName: node linkType: hard "es-module-lexer@npm:^1.2.1": version: 1.3.0 resolution: "es-module-lexer@npm:1.3.0" - checksum: 8/48fd9f504a9d2a894126f75c8b7ccc6273a289983e9b67255f165bfd9ae765d50100218251e94e702ca567826905ea2f7b3b4a0c4d74d3ce99cce3a2a606a238 + checksum: 48fd9f504a9d2a894126f75c8b7ccc6273a289983e9b67255f165bfd9ae765d50100218251e94e702ca567826905ea2f7b3b4a0c4d74d3ce99cce3a2a606a238 languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": +"es-object-atoms@npm:^1.0.0": version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" dependencies: - has: "npm:^1.0.3" - checksum: 8/83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + get-intrinsic: ^1.2.4 + has-tostringtag: ^1.0.2 + hasown: ^2.0.1 + checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" + dependencies: + hasown: ^2.0.0 + checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 languageName: node linkType: hard @@ -2359,28 +3282,28 @@ __metadata: is-callable: "npm:^1.1.4" is-date-object: "npm:^1.0.1" is-symbol: "npm:^1.0.2" - checksum: 8/4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed languageName: node linkType: hard "escalade@npm:^3.1.2": version: 3.2.0 resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard "escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" - checksum: 8/6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 languageName: node linkType: hard "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" - checksum: 8/98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 languageName: node linkType: hard @@ -2391,67 +3314,72 @@ __metadata: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 8/153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 languageName: node linkType: hard "eslint-plugin-jsdoc@npm:^39.3.6": - version: 39.3.6 - resolution: "eslint-plugin-jsdoc@npm:39.3.6" - dependencies: - "@es-joy/jsdoccomment": "npm:~0.31.0" - comment-parser: "npm:1.3.1" - debug: "npm:^4.3.4" - escape-string-regexp: "npm:^4.0.0" - esquery: "npm:^1.4.0" - semver: "npm:^7.3.7" - spdx-expression-parse: "npm:^3.0.1" + version: 39.9.1 + resolution: "eslint-plugin-jsdoc@npm:39.9.1" + dependencies: + "@es-joy/jsdoccomment": ~0.36.1 + comment-parser: 1.3.1 + debug: ^4.3.4 + escape-string-regexp: ^4.0.0 + esquery: ^1.4.0 + semver: ^7.3.8 + spdx-expression-parse: ^3.0.1 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 8/0825a5eba6cdcb250e45cd5ad488bd234da346f324a11160ad4b8c9fb3c76d8e1457d462fa91c24f11bdff5ef0013375d65c366b648202254c4bcc79eed89060 + checksum: 757444505eabff5bd24ded18fd1a2920031520ba251c84944dd5c12dd2b21460fde6aa6253e454518386c3d7a0fa64f2496e3ba27bd338ec7768cb090ae86cca languageName: node linkType: hard "eslint-plugin-prettier@npm:^5.0.0": - version: 5.0.0 - resolution: "eslint-plugin-prettier@npm:5.0.0" + version: 5.2.1 + resolution: "eslint-plugin-prettier@npm:5.2.1" dependencies: - prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.8.5" + prettier-linter-helpers: ^1.0.0 + synckit: ^0.9.1 peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" + eslint-config-prettier: "*" prettier: ">=3.0.0" peerDependenciesMeta: "@types/eslint": optional: true eslint-config-prettier: optional: true - checksum: 8/84e88744b9050f2d5ef31b94e85294dda16f3a53c2449f9d33eac8ae6264889b459bf35a68e438fb6b329c2a1d6491aac4bfa00d86317e7009de3dad0311bec6 + checksum: 812f4d1596dcd3a55963212dfbd818a4b38f880741aac75f6869aa740dc5d934060674d3b85d10ff9fec424defa61967dbdef26b8a893a92c9b51880264ed0d9 languageName: node linkType: hard "eslint-plugin-react@npm:^7.30.1": - version: 7.30.1 - resolution: "eslint-plugin-react@npm:7.30.1" - dependencies: - array-includes: "npm:^3.1.5" - array.prototype.flatmap: "npm:^1.3.0" - doctrine: "npm:^2.1.0" - estraverse: "npm:^5.3.0" - jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" - minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.5" - object.fromentries: "npm:^2.0.5" - object.hasown: "npm:^1.1.1" - object.values: "npm:^1.1.5" - prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.3" - semver: "npm:^6.3.0" - string.prototype.matchall: "npm:^4.0.7" + version: 7.37.2 + resolution: "eslint-plugin-react@npm:7.37.2" + dependencies: + array-includes: ^3.1.8 + array.prototype.findlast: ^1.2.5 + array.prototype.flatmap: ^1.3.2 + array.prototype.tosorted: ^1.1.4 + doctrine: ^2.1.0 + es-iterator-helpers: ^1.1.0 + estraverse: ^5.3.0 + hasown: ^2.0.2 + jsx-ast-utils: ^2.4.1 || ^3.0.0 + minimatch: ^3.1.2 + object.entries: ^1.1.8 + object.fromentries: ^2.0.8 + object.values: ^1.2.0 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.5 + semver: ^6.3.1 + string.prototype.matchall: ^4.0.11 + string.prototype.repeat: ^1.0.0 peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 8/553fb9ece6beb7c14cf6f84670c786c8ac978c2918421994dcc4edd2385302022e5d5ac4a39fafdb35954e29cecddefed61758040c3c530cafcf651f674a9d51 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 7f5203afee7fbe3702b27fdd2b9a3c0ccbbb47d0672f58311b9d8a08dea819c9da4a87c15e8bd508f2562f327a9d29ee8bd9cd189bf758d8dc903de5648b0bfa languageName: node linkType: hard @@ -2461,7 +3389,7 @@ __metadata: dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^4.1.1" - checksum: 8/47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb languageName: node linkType: hard @@ -2471,61 +3399,62 @@ __metadata: dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 8/ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.2": - version: 3.4.2 - resolution: "eslint-visitor-keys@npm:3.4.2" - checksum: 8/9e0e7e4aaea705c097ae37c97410e5f167d4d2193be2edcb1f0760762ede3df01545e4820ae314f42dcec687745f2c6dcaf6d83575c4a2a241eb0c8517d724f2 +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 languageName: node linkType: hard "eslint@npm:^8.36.0": - version: 8.46.0 - resolution: "eslint@npm:8.46.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.1" - "@eslint/js": "npm:^8.46.0" - "@humanwhocodes/config-array": "npm:^0.11.10" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.2" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.4 + "@eslint/js": 8.57.1 + "@humanwhocodes/config-array": ^0.13.0 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + "@ungap/structured-clone": ^1.2.0 + ajv: ^6.12.4 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.3 + espree: ^9.6.1 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + graphemer: ^1.4.0 + ignore: ^5.2.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.3 + strip-ansi: ^6.0.1 + text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 8/7a7d36b1a3bbc12e08fbb5bc36fd482a7a5a1797e62e762499dd45601b9e45aaa53a129f31ce0b4444551a9639b8b681ad535f379893dd1e3ae37b31dccd82aa + checksum: e2489bb7f86dd2011967759a09164e65744ef7688c310bc990612fc26953f34cc391872807486b15c06833bdff737726a23e9b4cdba5de144c311377dc41d91b languageName: node linkType: hard @@ -2536,16 +3465,16 @@ __metadata: acorn: "npm:^8.9.0" acorn-jsx: "npm:^5.3.2" eslint-visitor-keys: "npm:^3.4.1" - checksum: 8/eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 languageName: node linkType: hard "esquery@npm:^1.4.0, esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: - estraverse: "npm:^5.1.0" - checksum: 8/aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + estraverse: ^5.1.0 + checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 languageName: node linkType: hard @@ -2554,141 +3483,128 @@ __metadata: resolution: "esrecurse@npm:4.3.0" dependencies: estraverse: "npm:^5.2.0" - checksum: 8/ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 languageName: node linkType: hard "estraverse@npm:^4.1.1": version: 4.3.0 resolution: "estraverse@npm:4.3.0" - checksum: 8/a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 languageName: node linkType: hard "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" - checksum: 8/072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b languageName: node linkType: hard "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" - checksum: 8/22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 languageName: node linkType: hard -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 8/f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 languageName: node linkType: hard -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 8/fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 languageName: node linkType: hard -"execa@npm:^6.1.0": - version: 6.1.0 - resolution: "execa@npm:6.1.0" +"execa@npm:~8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.1" - human-signals: "npm:^3.0.1" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^3.0.7" - strip-final-newline: "npm:^3.0.0" - checksum: 8/1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e + cross-spawn: ^7.0.3 + get-stream: ^8.0.1 + human-signals: ^5.0.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^4.1.0 + strip-final-newline: ^3.0.0 + checksum: cac1bf86589d1d9b73bdc5dda65c52012d1a9619c44c526891956745f7b366ca2603d29fe3f7460bacc2b48c6eab5d6a4f7afe0534b31473d3708d1265545e1f languageName: node linkType: hard -"execa@npm:^7.1.1": - version: 7.2.0 - resolution: "execa@npm:7.2.0" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.1" - human-signals: "npm:^4.3.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^3.0.7" - strip-final-newline: "npm:^3.0.0" - checksum: 8/14fd17ba0ca8c87b277584d93b1d9fc24f2a65e5152b31d5eb159a3b814854283eaae5f51efa9525e304447e2f757c691877f7adff8fde5746aae67eb1edd1cc +"exenv-es6@npm:^1.1.1": + version: 1.1.1 + resolution: "exenv-es6@npm:1.1.1" + checksum: 7f2aa12025e6f06c48dc286f380cf3183bb19c6017b36d91695034a3e5124a7235c4f8ff24ca2eb88ae801322f0f99605cedfcfd996a5fcbba7669320e2a448e languageName: node linkType: hard "expect.js@npm:^0.3.1": version: 0.3.1 resolution: "expect.js@npm:0.3.1" - checksum: 8/3ab9df872129c75e9ae7157f44c9a6468e0e43d636df82585a695d6304ad53004f97e7108ec9d7df06c6193b0e7ea48454a17c8007bb666ff5dd5e7135e0cc54 + checksum: 3ab9df872129c75e9ae7157f44c9a6468e0e43d636df82585a695d6304ad53004f97e7108ec9d7df06c6193b0e7ea48454a17c8007bb666ff5dd5e7135e0cc54 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" - checksum: 8/e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d languageName: node linkType: hard "fast-diff@npm:^1.1.2": version: 1.2.0 resolution: "fast-diff@npm:1.2.0" - checksum: 8/1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae + checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.1": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 8/b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + "@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 languageName: node linkType: hard "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 8/b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb languageName: node linkType: hard "fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" - checksum: 8/92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: c52e6c86465f5c240e84a4485fb001088cc743d261a4b54b0050ce4758b1648bdbe53da1328ef9620149dca1435e3de64184f226d7c0a3656cb5837b3491e149 languageName: node linkType: hard "fastest-levenshtein@npm:^1.0.12, fastest-levenshtein@npm:^1.0.16": version: 1.0.16 resolution: "fastest-levenshtein@npm:1.0.16" - checksum: 8/a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 + checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 languageName: node linkType: hard @@ -2697,7 +3613,7 @@ __metadata: resolution: "fastq@npm:1.13.0" dependencies: reusify: "npm:^1.0.4" - checksum: 8/32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b + checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b languageName: node linkType: hard @@ -2706,7 +3622,16 @@ __metadata: resolution: "file-entry-cache@npm:6.0.1" dependencies: flat-cache: "npm:^3.0.4" - checksum: 8/f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"file-entry-cache@npm:^7.0.0": + version: 7.0.2 + resolution: "file-entry-cache@npm:7.0.2" + dependencies: + flat-cache: ^3.2.0 + checksum: 283c674fc26bed1c44e74cf25c2640c813e222ea30a2536404b53511ca311d4a2502ee8145a01aecd12b9a910eb4162364776be27a9683e8447332054e9d712f languageName: node linkType: hard @@ -2715,14 +3640,14 @@ __metadata: resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 languageName: node linkType: hard "find-root@npm:^1.0.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" - checksum: 8/b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf languageName: node linkType: hard @@ -2732,7 +3657,7 @@ __metadata: dependencies: locate-path: "npm:^5.0.0" path-exists: "npm:^4.0.0" - checksum: 8/4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 languageName: node linkType: hard @@ -2742,24 +3667,34 @@ __metadata: dependencies: locate-path: "npm:^6.0.0" path-exists: "npm:^4.0.0" - checksum: 8/07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" +"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: "npm:^3.1.0" - rimraf: "npm:^3.0.2" - checksum: 8/4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 8/427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 languageName: node linkType: hard @@ -2769,14 +3704,14 @@ __metadata: dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 8/139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 languageName: node linkType: hard "free-style@npm:3.1.0": version: 3.1.0 resolution: "free-style@npm:3.1.0" - checksum: 8/949258ae315deda48cac93ecd5f9a80f36e8a027e19ce2103598dc8d5ab60e963bbad5444b2a4990ddb746798dd188896f430285cf484afbf2141f7d75a191d8 + checksum: 949258ae315deda48cac93ecd5f9a80f36e8a027e19ce2103598dc8d5ab60e963bbad5444b2a4990ddb746798dd188896f430285cf484afbf2141f7d75a191d8 languageName: node linkType: hard @@ -2787,68 +3722,89 @@ __metadata: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 8/dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs-extra@npm:^11.2.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 languageName: node linkType: hard "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" - checksum: 8/99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: 8/b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.0" - functions-have-names: "npm:^1.2.2" - checksum: 8/acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + functions-have-names: ^1.2.3 + checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 languageName: node linkType: hard -"functions-have-names@npm:^1.2.2": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" - checksum: 8/c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.2 - resolution: "get-intrinsic@npm:1.1.2" +"get-east-asian-width@npm:^1.0.0": + version: 1.3.0 + resolution: "get-east-asian-width@npm:1.3.0" + checksum: 757a34c7a46ff385e2775f96f9d3e553f6b6666a8898fb89040d36a1010fba692332772945606a7d4b0f0c6afb84cd394e75d5477c56e1f00f1eb79603b0aecc + 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" dependencies: - function-bind: "npm:^1.1.1" - has: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - checksum: 8/252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b + es-errors: ^1.3.0 + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 languageName: node linkType: hard -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 8/e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad +"get-stream@npm:^8.0.1": + version: 8.0.1 + resolution: "get-stream@npm:8.0.1" + checksum: 01e3d3cf29e1393f05f44d2f00445c5f9ec3d1c49e8179b31795484b9c117f4c695e5e07b88b50785d5c8248a788c85d9913a79266fc77e3ef11f78f10f1b974 languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.1" - checksum: 8/9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bind: ^1.0.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 languageName: node linkType: hard @@ -2857,7 +3813,7 @@ __metadata: resolution: "glob-parent@npm:5.1.2" dependencies: is-glob: "npm:^4.0.1" - checksum: 8/f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e languageName: node linkType: hard @@ -2866,29 +3822,30 @@ __metadata: resolution: "glob-parent@npm:6.0.2" dependencies: is-glob: "npm:^4.0.3" - checksum: 8/c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 languageName: node linkType: hard "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" - checksum: 8/e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 + checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 languageName: node linkType: hard -"glob@npm:^10.2.5": - version: 10.3.3 - resolution: "glob@npm:10.3.3" +"glob@npm:^10.3.7": + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.0.3" - minimatch: "npm:^9.0.1" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry: "npm:^1.10.1" + foreground-child: ^3.1.0 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^1.11.1 bin: - glob: dist/cjs/src/bin.js - checksum: 8/29190d3291f422da0cb40b77a72fc8d2c51a36524e99b8bf412548b7676a6627489528b57250429612b6eec2e6fe7826d328451d3e694a9d15e575389308ec53 + glob: dist/esm/bin.mjs + checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a languageName: node linkType: hard @@ -2902,7 +3859,7 @@ __metadata: minimatch: "npm:^3.0.4" once: "npm:^1.3.0" path-is-absolute: "npm:^1.0.0" - checksum: 8/b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 languageName: node linkType: hard @@ -2910,8 +3867,8 @@ __metadata: version: 2.0.0 resolution: "global-modules@npm:2.0.0" dependencies: - global-prefix: "npm:^3.0.0" - checksum: 8/d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 + global-prefix: ^3.0.0 + checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 languageName: node linkType: hard @@ -2919,10 +3876,10 @@ __metadata: version: 3.0.0 resolution: "global-prefix@npm:3.0.0" dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 8/8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d + ini: ^1.3.5 + kind-of: ^6.0.2 + which: ^1.3.1 + checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d languageName: node linkType: hard @@ -2931,7 +3888,17 @@ __metadata: resolution: "globals@npm:13.20.0" dependencies: type-fest: "npm:^0.20.2" - checksum: 8/ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a + 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: + define-properties: ^1.2.1 + gopd: ^1.0.1 + checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a languageName: node linkType: hard @@ -2945,104 +3912,113 @@ __metadata: ignore: "npm:^5.2.0" merge2: "npm:^1.4.1" slash: "npm:^3.0.0" - checksum: 8/b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 languageName: node linkType: hard "globjoin@npm:^0.1.4": version: 0.1.4 resolution: "globjoin@npm:0.1.4" - checksum: 8/0a47d88d566122d9e42da946453ee38b398e0021515ac6a95d13f980ba8c1e42954e05ee26cfcbffce1ac1ee094d0524b16ce1dd874ca52408d6db5c6d39985b + checksum: 0a47d88d566122d9e42da946453ee38b398e0021515ac6a95d13f980ba8c1e42954e05ee26cfcbffce1ac1ee094d0524b16ce1dd874ca52408d6db5c6d39985b languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 8/3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 languageName: node linkType: hard -"graceful-fs@npm:^4.2.11": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" - checksum: 8/bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 languageName: node linkType: hard "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" - checksum: 8/7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc 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: 8/390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b languageName: node linkType: hard "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" - checksum: 8/4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b languageName: node linkType: hard "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" - checksum: 8/261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - get-intrinsic: "npm:^1.1.1" - checksum: 8/a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + 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 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: 8/a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: "npm:^1.0.2" - checksum: 8/cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: - function-bind: "npm:^1.1.1" - checksum: 8/b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" - checksum: 8/c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd languageName: node linkType: hard @@ -3050,66 +4026,43 @@ __metadata: version: 4.1.0 resolution: "hosted-git-info@npm:4.1.0" dependencies: - lru-cache: "npm:^6.0.0" - checksum: 8/c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + lru-cache: ^6.0.0 + checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 languageName: node linkType: hard "html-tags@npm:^3.3.1": version: 3.3.1 resolution: "html-tags@npm:3.3.1" - checksum: 8/b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce + checksum: b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce languageName: node linkType: hard -"htmlparser2@npm:^6.0.0": - version: 6.1.0 - resolution: "htmlparser2@npm:6.1.0" +"htmlparser2@npm:^8.0.0": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.0.0" - domutils: "npm:^2.5.2" - entities: "npm:^2.0.0" - checksum: 8/81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 8/b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"human-signals@npm:^3.0.1": - version: 3.0.1 - resolution: "human-signals@npm:3.0.1" - checksum: 8/f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354 - languageName: node - linkType: hard - -"human-signals@npm:^4.3.0": - version: 4.3.1 - resolution: "human-signals@npm:4.3.1" - checksum: 8/6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + entities: ^4.4.0 + checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 languageName: node linkType: hard -"husky@npm:^8.0.1": - version: 8.0.1 - resolution: "husky@npm:8.0.1" - bin: - husky: lib/bin.js - checksum: 8/943a73a13d0201318fd30e83d299bb81d866bd245b69e6277804c3b462638dc1921694cb94c2b8c920a4a187060f7d6058d3365152865406352e934c5fff70dc +"human-signals@npm:^5.0.0": + version: 5.0.0 + resolution: "human-signals@npm:5.0.0" + checksum: 6504560d5ed91444f16bea3bd9dfc66110a339442084e56c3e7fa7bbdf3f406426d6563d662bdce67064b165eac31eeabfc0857ed170aaa612cf14ec9f9a464c languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 8/3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf languageName: node linkType: hard @@ -3118,31 +4071,31 @@ __metadata: resolution: "icss-utils@npm:5.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 8/5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 + checksum: 5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 languageName: node linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 8/3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be languageName: node linkType: hard -"import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 8/2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa languageName: node linkType: hard "import-lazy@npm:^4.0.0": version: 4.0.0 resolution: "import-lazy@npm:4.0.0" - checksum: 8/22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 languageName: node linkType: hard @@ -3154,28 +4107,21 @@ __metadata: resolve-cwd: "npm:^3.0.0" bin: import-local-fixture: fixtures/cli.js - checksum: 8/bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd languageName: node linkType: hard "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" - checksum: 8/7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 8/824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 languageName: node linkType: hard "indent-string@npm:^5.0.0": version: 5.0.0 resolution: "indent-string@npm:5.0.0" - checksum: 8/e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3 + checksum: e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3 languageName: node linkType: hard @@ -3185,39 +4131,39 @@ __metadata: dependencies: once: "npm:^1.3.0" wrappy: "npm:1" - checksum: 8/f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd languageName: node linkType: hard "inherits@npm:2": version: 2.0.4 resolution: "inherits@npm:2.0.4" - checksum: 8/4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 languageName: node linkType: hard "ini@npm:^1.3.5": version: 1.3.8 resolution: "ini@npm:1.3.8" - checksum: 8/dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" +"internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" dependencies: - get-intrinsic: "npm:^1.1.0" - has: "npm:^1.0.3" - side-channel: "npm:^1.0.4" - checksum: 8/1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf + es-errors: ^1.3.0 + hasown: ^2.0.0 + side-channel: ^1.0.4 + checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb languageName: node linkType: hard "interpret@npm:^3.1.1": version: 3.1.1 resolution: "interpret@npm:3.1.1" - checksum: 8/35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 + checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 languageName: node linkType: hard @@ -3225,52 +4171,79 @@ __metadata: version: 0.0.0-use.local resolution: "ipylab@workspace:." dependencies: - "@jupyter-widgets/base": "npm:^1 || ^2 || ^3 || ^4 || ^5 || ^6.0.5" - "@jupyter-widgets/controls": "npm:^3 || ^4 || ^5" - "@jupyterlab/application": "npm:^4.0.4" - "@jupyterlab/apputils": "npm:^4.1.4" - "@jupyterlab/builder": "npm:^4.0.0" - "@jupyterlab/observables": "npm:^5.0.4" - "@lumino/algorithm": "npm:^1.9.2 || ^2" - "@lumino/commands": "npm:^1.20.1 || ^2" - "@lumino/disposable": "npm:^1.10.2 || ^2" - "@lumino/messaging": "npm:^1.10.2 || ^2" - "@lumino/widgets": "npm:^1.34.0 || ^2" - "@types/expect.js": "npm:^0.3.29" - "@types/json-schema": "npm:^7.0.11" - "@types/node": "npm:^18.7.8" - "@types/react": "npm:^18.0.26" - "@typescript-eslint/eslint-plugin": "npm:^6.1.0" - "@typescript-eslint/parser": "npm:^6.1.0" - css-loader: "npm:^6.7.1" - eslint: "npm:^8.36.0" - eslint-config-prettier: "npm:^8.8.0" - eslint-plugin-jsdoc: "npm:^39.3.6" - eslint-plugin-prettier: "npm:^5.0.0" - eslint-plugin-react: "npm:^7.30.1" - expect.js: "npm:^0.3.1" - fs-extra: "npm:^10.1.0" - husky: "npm:^8.0.1" - lint-staged: "npm:^13.0.3" - mkdirp: "npm:^1.0.4" - npm-run-all: "npm:^4.1.5" - prettier: "npm:^3.0.0" - rimraf: "npm:^5.0.1" - source-map-loader: "npm:^1.0.2" - style-loader: "npm:^3.3.1" - stylelint: "npm:^15.10.1" - stylelint-config-recommended: "npm:^13.0.0" - stylelint-config-standard: "npm:^34.0.0" - stylelint-prettier: "npm:^4.0.0" - typescript: "npm:~5.0.2" - yjs: "npm:^13.5.40" + "@jupyter-widgets/base": ^6.0.10 + "@jupyter-widgets/controls": ^5.0.11 + "@jupyter-widgets/jupyterlab-manager": ^5.0.13 + "@jupyterlab/application": ^4.2.5 + "@jupyterlab/apputils": ^4.3.5 + "@jupyterlab/builder": ^4.0.0 + "@jupyterlab/console": ^4.2.5 + "@jupyterlab/coreutils": ^6.2.5 + "@jupyterlab/filebrowser": ^4.2.5 + "@jupyterlab/launcher": ^4.2.5 + "@jupyterlab/logconsole": ^4.2.5 + "@jupyterlab/mainmenu": ^4.2.5 + "@jupyterlab/observables": ^5.2.5 + "@jupyterlab/rendermime": ^4.2.5 + "@jupyterlab/settingregistry": ^4.2.5 + "@lumino/commands": ^2.3.1 + "@lumino/disposable": ^2.1.3 + "@lumino/widgets": ^2.5.0 + "@types/expect.js": ^0.3.29 + "@types/json-schema": ^7.0.11 + "@types/node": ^18.7.8 + "@types/react": ^18.0.26 + "@typescript-eslint/eslint-plugin": ^6.1.0 + "@typescript-eslint/parser": ^6.1.0 + css-loader: ^6.7.1 + eslint: ^8.36.0 + eslint-config-prettier: ^8.8.0 + eslint-plugin-jsdoc: ^39.3.6 + eslint-plugin-prettier: ^5.0.0 + eslint-plugin-react: ^7.30.1 + expect.js: ^0.3.1 + fs-extra: ^11.2.0 + lint-staged: ^15.2.9 + mkdirp: ^3.0.1 + npm-run-all: ^4.1.5 + prettier: ^3.0.0 + react: ^18.3.1 + rimraf: ^5.0.1 + source-map-loader: ^5.0.0 + style-loader: ^3.3.1 + stylelint: ^15.10.1 + stylelint-config-recommended: ^13.0.0 + stylelint-config-standard: ^34.0.0 + stylelint-prettier: ^4.0.0 + typescript: ~5.0.2 + webpack: ^5.95.0 + yjs: ^13.5.40 languageName: unknown linkType: soft +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" - checksum: 8/eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: ^1.0.0 + checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd languageName: node linkType: hard @@ -3279,7 +4252,7 @@ __metadata: resolution: "is-bigint@npm:1.0.4" dependencies: has-bigints: "npm:^1.0.1" - checksum: 8/c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 languageName: node linkType: hard @@ -3289,71 +4262,89 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" has-tostringtag: "npm:^1.0.0" - checksum: 8/c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 8/1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": - version: 2.13.0 - resolution: "is-core-module@npm:2.13.0" +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" dependencies: - has: "npm:^1.0.3" - checksum: 8/053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 + hasown: ^2.0.2 + checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 8/baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + is-typed-array: ^1.1.13 + checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 languageName: node linkType: hard -"is-docker@npm:^2.0.0": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 8/3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: 8/b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc languageName: node linkType: hard "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" - checksum: 8/df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d 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" - checksum: 8/44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 languageName: node linkType: hard "is-fullwidth-code-point@npm:^4.0.0": version: 4.0.0 resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 8/8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d + checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^5.0.0": + version: 5.0.0 + resolution: "is-fullwidth-code-point@npm:5.0.0" + dependencies: + get-east-asian-width: ^1.0.0 + checksum: 8dfb2d2831b9e87983c136f5c335cd9d14c1402973e357a8ff057904612ed84b8cba196319fabedf9aefe4639e14fe3afe9d9966d1d006ebeb40fe1fed4babe5 + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10": + version: 1.0.10 + resolution: "is-generator-function@npm:1.0.10" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b languageName: node linkType: hard @@ -3362,25 +4353,21 @@ __metadata: resolution: "is-glob@npm:4.0.3" dependencies: is-extglob: "npm:^2.1.1" - checksum: 8/d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 languageName: node linkType: hard -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: "npm:^3.0.0" - bin: - is-inside-container: cli.js - checksum: 8/c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 +"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.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: 8/f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd languageName: node linkType: hard @@ -3389,28 +4376,28 @@ __metadata: resolution: "is-number-object@npm:1.0.7" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: 8/d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 languageName: node linkType: hard "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" - checksum: 8/456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a languageName: node linkType: hard "is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" - checksum: 8/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 languageName: node linkType: hard "is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" - checksum: 8/0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 languageName: node linkType: hard @@ -3419,14 +4406,14 @@ __metadata: resolution: "is-plain-object@npm:2.0.4" dependencies: isobject: "npm:^3.0.1" - checksum: 8/2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca languageName: node linkType: hard "is-plain-object@npm:^5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" - checksum: 8/e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c languageName: node linkType: hard @@ -3436,30 +4423,30 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" has-tostringtag: "npm:^1.0.0" - checksum: 8/362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - checksum: 8/9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe languageName: node linkType: hard -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 8/b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 +"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" + dependencies: + call-bind: ^1.0.7 + checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 languageName: node linkType: hard "is-stream@npm:^3.0.0": version: 3.0.0 resolution: "is-stream@npm:3.0.0" - checksum: 8/172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 languageName: node linkType: hard @@ -3468,7 +4455,7 @@ __metadata: resolution: "is-string@npm:1.0.7" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: 8/323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 languageName: node linkType: hard @@ -3477,7 +4464,23 @@ __metadata: resolution: "is-symbol@npm:1.0.4" dependencies: has-symbols: "npm:^1.0.2" - checksum: 8/92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: ^1.1.14 + checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d languageName: node linkType: hard @@ -3486,50 +4489,71 @@ __metadata: resolution: "is-weakref@npm:1.0.2" dependencies: call-bind: "npm:^1.0.2" - checksum: 8/95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" +"is-weakset@npm:^2.0.3": + version: 2.0.3 + resolution: "is-weakset@npm:2.0.3" dependencies: - is-docker: "npm:^2.0.0" - checksum: 8/20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 + checksum: 8b6a20ee9f844613ff8f10962cfee49d981d584525f2357fee0a04dfbcde9fd607ed60cb6dab626dbcc470018ae6392e1ff74c0c1aced2d487271411ad9d85ae + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a languageName: node linkType: hard "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" - checksum: 8/26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 languageName: node linkType: hard "isobject@npm:^3.0.1": version: 3.0.1 resolution: "isobject@npm:3.0.1" - checksum: 8/db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 languageName: node linkType: hard "isomorphic.js@npm:^0.2.4": version: 0.2.5 resolution: "isomorphic.js@npm:0.2.5" - checksum: 8/d8d1b083f05f3c337a06628b982ac3ce6db953bbef14a9de8ad49131250c3592f864b73c12030fdc9ef138ce97b76ef55c7d96a849561ac215b1b4b9d301c8e9 + checksum: d8d1b083f05f3c337a06628b982ac3ce6db953bbef14a9de8ad49131250c3592f864b73c12030fdc9ef138ce97b76ef55c7d96a849561ac215b1b4b9d301c8e9 + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.3": + version: 1.1.3 + resolution: "iterator.prototype@npm:1.1.3" + dependencies: + define-properties: ^1.2.1 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + reflect.getprototypeof: ^1.0.4 + set-function-name: ^2.0.1 + checksum: 7d2a1f8bcbba7b76f72e956faaf7b25405f4de54430c9d099992e6fb9d571717c3044604e8cdfb8e624cb881337d648030ee8b1541d544af8b338835e3f47ebe languageName: node linkType: hard -"jackspeak@npm:^2.0.3": - version: 2.2.2 - resolution: "jackspeak@npm:2.2.2" +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 8/7b1468dd910afc00642db87448f24b062346570b8b47531409aa9012bcb95fdf7ec2b1c48edbb8b57a938c08391f8cc01b5034fc335aa3a2e74dbcc0ee5c555a + checksum: be31027fc72e7cc726206b9f560395604b82e0fddb46c4cbf9f97d049bcef607491a5afc0699612eaa4213ca5be8fd3e1e7cd187b3040988b65c9489838a7c00 languageName: node linkType: hard @@ -3540,21 +4564,21 @@ __metadata: "@types/node": "npm:*" merge-stream: "npm:^2.0.0" supports-color: "npm:^8.0.0" - checksum: 8/98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 languageName: node linkType: hard "jquery@npm:^3.1.1": version: 3.6.0 resolution: "jquery@npm:3.6.0" - checksum: 8/8fd5fef4aa48fd374ec716dd1c1df1af407814a228e15c1260ca140de3a697c2a77c30c54ff1d238b6a3ab4ddc445ddeef9adce6c6d28e4869d85eb9d3951c0e + checksum: 8fd5fef4aa48fd374ec716dd1c1df1af407814a228e15c1260ca140de3a697c2a77c30c54ff1d238b6a3ab4ddc445ddeef9adce6c6d28e4869d85eb9d3951c0e languageName: node linkType: hard "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" - checksum: 8/8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 languageName: node linkType: hard @@ -3565,28 +4589,35 @@ __metadata: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 8/c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a languageName: node linkType: hard "jsdoc-type-pratt-parser@npm:~3.1.0": version: 3.1.0 resolution: "jsdoc-type-pratt-parser@npm:3.1.0" - checksum: 8/2f437b57621f1e481918165f6cf0e48256628a9e510d8b3f88a2ab667bf2128bf8b94c628b57c43e78f555ca61983e9c282814703840dc091d2623992214a061 + checksum: 2f437b57621f1e481918165f6cf0e48256628a9e510d8b3f88a2ab667bf2128bf8b94c628b57c43e78f555ca61983e9c282814703840dc091d2623992214a061 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 languageName: node linkType: hard "json-parse-better-errors@npm:^1.0.1": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" - checksum: 8/ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d + checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d languageName: node linkType: hard "json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 8/798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f languageName: node linkType: hard @@ -3595,7 +4626,7 @@ __metadata: resolution: "json-schema-compare@npm:0.2.2" dependencies: lodash: "npm:^4.17.4" - checksum: 8/dd6f2173857c8e3b77d6ebdfa05bd505bba5b08709ab46b532722f5d1c33b5fee1fc8f3c97d0c0d011db25f9f3b0baf7ab783bb5f55c32abd9f1201760e43c2c + checksum: dd6f2173857c8e3b77d6ebdfa05bd505bba5b08709ab46b532722f5d1c33b5fee1fc8f3c97d0c0d011db25f9f3b0baf7ab783bb5f55c32abd9f1201760e43c2c languageName: node linkType: hard @@ -3606,28 +4637,28 @@ __metadata: compute-lcm: "npm:^1.1.2" json-schema-compare: "npm:^0.2.2" lodash: "npm:^4.17.20" - checksum: 8/82700f6ac77351959138d6b153d77375a8c29cf48d907241b85c8292dd77aabd8cb816400f2b0d17062c4ccc8893832ec4f664ab9c814927ef502e7a595ea873 + checksum: 82700f6ac77351959138d6b153d77375a8c29cf48d907241b85c8292dd77aabd8cb816400f2b0d17062c4ccc8893832ec4f664ab9c814927ef502e7a595ea873 languageName: node linkType: hard "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" - checksum: 8/7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b languageName: node linkType: hard "json-schema-traverse@npm:^1.0.0": version: 1.0.0 resolution: "json-schema-traverse@npm:1.0.0" - checksum: 8/02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad languageName: node linkType: hard "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 8/cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 languageName: node linkType: hard @@ -3636,7 +4667,7 @@ __metadata: resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 8/2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 languageName: node linkType: hard @@ -3649,14 +4680,14 @@ __metadata: dependenciesMeta: graceful-fs: optional: true - checksum: 8/7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 languageName: node linkType: hard "jsonpointer@npm:^5.0.1": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" - checksum: 8/0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c + checksum: 0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c languageName: node linkType: hard @@ -3666,21 +4697,30 @@ __metadata: dependencies: array-includes: "npm:^3.1.5" object.assign: "npm:^4.1.3" - checksum: 8/a2ed78cac49a0f0c4be8b1eafe3c5257a1411341d8e7f1ac740debae003de04e5f6372bfcfbd9d082e954ffd99aac85bcda85b7c6bc11609992483f4cdc0f745 + checksum: a2ed78cac49a0f0c4be8b1eafe3c5257a1411341d8e7f1ac740debae003de04e5f6372bfcfbd9d082e954ffd99aac85bcda85b7c6bc11609992483f4cdc0f745 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 languageName: node linkType: hard "kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" - checksum: 8/3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b languageName: node linkType: hard -"known-css-properties@npm:^0.27.0": - version: 0.27.0 - resolution: "known-css-properties@npm:0.27.0" - checksum: 8/8584fcf0526f984fe5a358af20200dec3b944373dd005dc23a3ce988895e1acd03e7d69c49533dda07d6d9b6d53990ed1119bd9d3e927f17545f8764c434a5cd +"known-css-properties@npm:^0.29.0": + version: 0.29.0 + resolution: "known-css-properties@npm:0.29.0" + checksum: daa6562e907f856cbfd58a00c42f532c9bba283388984da6a3bffb494e56612e5f23c52f30b0d9885f0ea07ad5d88bfa0470ee65017a6ce6c565289a1afd78af languageName: node linkType: hard @@ -3690,19 +4730,20 @@ __metadata: dependencies: prelude-ls: "npm:^1.2.1" type-check: "npm:~0.4.0" - checksum: 8/12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 languageName: node linkType: hard -"lib0@npm:^0.2.42, lib0@npm:^0.2.74": - version: 0.2.80 - resolution: "lib0@npm:0.2.80" +"lib0@npm:^0.2.42, lib0@npm:^0.2.98": + version: 0.2.98 + resolution: "lib0@npm:0.2.98" dependencies: - isomorphic.js: "npm:^0.2.4" + isomorphic.js: ^0.2.4 bin: + 0ecdsa-generate-keypair: bin/0ecdsa-generate-keypair.js 0gentesthtml: bin/gentesthtml.js 0serve: bin/0serve.js - checksum: 8/eddb9c6cc23a916e3f6c26b3e729882c1f886de138b2de4055fb51a941acd7dab08eb65c9b9b43f01a5c83e0936169010e0c6e517d30446540019eebcb1ef6f6 + checksum: 8d17060deb4ffb73f825e634e6543c024d27dad589a7ce2e6334af34b36d4441434edabf3716930f6c5e1c32c5f3e867b8c1b922c1cc51b22469f281292e423b languageName: node linkType: hard @@ -3715,65 +4756,55 @@ __metadata: peerDependenciesMeta: webpack: optional: true - checksum: 8/6208bd2060d200fbffbcc89702c929d50c5a4a3f2158b046cf813b3f7f728bbbe4611b9fea2d67843bb5e7d64ad9122cc368a19ac73f5c4ad41765e6283bdc0c + checksum: 6208bd2060d200fbffbcc89702c929d50c5a4a3f2158b046cf813b3f7f728bbbe4611b9fea2d67843bb5e7d64ad9122cc368a19ac73f5c4ad41765e6283bdc0c languageName: node linkType: hard -"lilconfig@npm:2.0.5": - version: 2.0.5 - resolution: "lilconfig@npm:2.0.5" - checksum: 8/f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1 +"lilconfig@npm:~3.1.2": + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: 4e8b83ddd1d0ad722600994e6ba5d858ddca14f0587aa6b9c8185e17548149b5e13d4d583d811e9e9323157fa8c6a527e827739794c7502b59243c58e210b8c3 languageName: node linkType: hard "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" - checksum: 8/0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"lint-staged@npm:^13.0.3": - version: 13.0.3 - resolution: "lint-staged@npm:13.0.3" - dependencies: - cli-truncate: "npm:^3.1.0" - colorette: "npm:^2.0.17" - commander: "npm:^9.3.0" - debug: "npm:^4.3.4" - execa: "npm:^6.1.0" - lilconfig: "npm:2.0.5" - listr2: "npm:^4.0.5" - micromatch: "npm:^4.0.5" - normalize-path: "npm:^3.0.0" - object-inspect: "npm:^1.12.2" - pidtree: "npm:^0.6.0" - string-argv: "npm:^0.3.1" - yaml: "npm:^2.1.1" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"lint-staged@npm:^15.2.9": + version: 15.2.10 + resolution: "lint-staged@npm:15.2.10" + dependencies: + chalk: ~5.3.0 + commander: ~12.1.0 + debug: ~4.3.6 + execa: ~8.0.1 + lilconfig: ~3.1.2 + listr2: ~8.2.4 + micromatch: ~4.0.8 + pidtree: ~0.6.0 + string-argv: ~0.3.2 + yaml: ~2.5.0 bin: lint-staged: bin/lint-staged.js - checksum: 8/53d585007df06e162febab6b0836b55016d902586a267823c8a1158529d8c742dc7297e523f7023dff02250bef3eb0d6934f4ec4f9961adfc2ebbed5f54162d0 + checksum: 7ab255b848478ca47c6b94aad0e7a3cfe5ba48ae1fb353cfa86635741333b83b1fd793d7cac6d44bf0388ad087d7e0250c7ec0a8ebece63fbcf7a8d175279809 languageName: node linkType: hard -"listr2@npm:^4.0.5": - version: 4.0.5 - resolution: "listr2@npm:4.0.5" - dependencies: - cli-truncate: "npm:^2.1.0" - colorette: "npm:^2.0.16" - log-update: "npm:^4.0.0" - p-map: "npm:^4.0.0" - rfdc: "npm:^1.3.0" - rxjs: "npm:^7.5.5" - through: "npm:^2.3.8" - wrap-ansi: "npm:^7.0.0" - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 8/7af31851abe25969ef0581c6db808117e36af15b131401795182427769d9824f451ba9e8aff6ccd25b6a4f6c8796f816292caf08e5f1f9b1775e8e9c313dc6c5 +"listr2@npm:~8.2.4": + version: 8.2.5 + resolution: "listr2@npm:8.2.5" + dependencies: + cli-truncate: ^4.0.0 + colorette: ^2.0.20 + eventemitter3: ^5.0.1 + log-update: ^6.1.0 + rfdc: ^1.4.1 + wrap-ansi: ^9.0.0 + checksum: 0ca2387b067eb11bbe91863f36903f3a5a040790422a499cc1a15806d8497979e7d1990bd129061c0510906b2971eaa97a74a9635e3ec5abd5830c9749b655b9 languageName: node linkType: hard @@ -3785,14 +4816,14 @@ __metadata: parse-json: "npm:^4.0.0" pify: "npm:^3.0.0" strip-bom: "npm:^3.0.0" - checksum: 8/8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 + checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 languageName: node linkType: hard "loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" - checksum: 8/a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 + checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 languageName: node linkType: hard @@ -3803,7 +4834,7 @@ __metadata: big.js: "npm:^5.2.2" emojis-list: "npm:^3.0.0" json5: "npm:^2.1.2" - checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 + checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 languageName: node linkType: hard @@ -3812,7 +4843,7 @@ __metadata: resolution: "locate-path@npm:5.0.0" dependencies: p-locate: "npm:^4.1.0" - checksum: 8/83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 languageName: node linkType: hard @@ -3821,54 +4852,62 @@ __metadata: resolution: "locate-path@npm:6.0.0" dependencies: p-locate: "npm:^5.0.0" - checksum: 8/72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a languageName: node linkType: hard "lodash-es@npm:^4.17.21": version: 4.17.21 resolution: "lodash-es@npm:4.17.21" - checksum: 8/05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 + checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 languageName: node linkType: hard "lodash.escape@npm:^4.0.1": version: 4.0.1 resolution: "lodash.escape@npm:4.0.1" - checksum: 8/fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f + checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f languageName: node linkType: hard "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" - checksum: 8/ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.mergewith@npm:^4.6.1": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 languageName: node linkType: hard "lodash.truncate@npm:^4.4.2": version: 4.4.2 resolution: "lodash.truncate@npm:4.4.2" - checksum: 8/b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 languageName: node linkType: hard "lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" - checksum: 8/eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 languageName: node linkType: hard -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" +"log-update@npm:^6.1.0": + version: 6.1.0 + resolution: "log-update@npm:6.1.0" dependencies: - ansi-escapes: "npm:^4.3.0" - cli-cursor: "npm:^3.1.0" - slice-ansi: "npm:^4.0.0" - wrap-ansi: "npm:^6.2.0" - checksum: 8/ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 + ansi-escapes: ^7.0.0 + cli-cursor: ^5.0.0 + slice-ansi: ^7.1.0 + strip-ansi: ^7.1.0 + wrap-ansi: ^9.0.0 + checksum: 817a9ba6c5cbc19e94d6359418df8cfe8b3244a2903f6d53354e175e243a85b782dc6a98db8b5e457ee2f09542ca8916c39641b9cd3b0e6ef45e9481d50c918a languageName: node linkType: hard @@ -3879,7 +4918,14 @@ __metadata: js-tokens: "npm:^3.0.0 || ^4.0.0" bin: loose-envify: cli.js - checksum: 8/6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a languageName: node linkType: hard @@ -3887,59 +4933,52 @@ __metadata: version: 6.0.0 resolution: "lru-cache@npm:6.0.0" dependencies: - yallist: "npm:^4.0.0" - checksum: 8/f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.0 - resolution: "lru-cache@npm:10.0.0" - checksum: 8/18f101675fe283bc09cda0ef1e3cc83781aeb8373b439f086f758d1d91b28730950db785999cd060d3c825a8571c03073e8c14512b6655af2188d623031baf50 + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 languageName: node linkType: hard "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" - checksum: 8/9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed languageName: node linkType: hard "map-obj@npm:^4.1.0": version: 4.3.0 resolution: "map-obj@npm:4.3.0" - checksum: 8/fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e languageName: node linkType: hard -"markdown-to-jsx@npm:^7.2.1": +"markdown-to-jsx@npm:^7.4.1": version: 7.5.0 resolution: "markdown-to-jsx@npm:7.5.0" peerDependencies: react: ">= 0.14.0" - checksum: 10c0/88213e64afd41d6934fbb70bcea0e2ef1f9553db1ba4c6f423b17d6e9c2b99c82b0fcbed29036dd5b91704b170803d1fae730ab40ae27af5c7994e2717686ebc + checksum: c9c6f1bfad5f2d9b1d3476eb0313ae3dffd0a9f14011c74efdd7c664fd32ee1842ef48abb16a496046f90361af49aa80a827e9d9c0bc04824a1986fdeb4d1852 languageName: node linkType: hard "mathml-tag-names@npm:^2.1.3": version: 2.1.3 resolution: "mathml-tag-names@npm:2.1.3" - checksum: 8/1201a25a137d6b9e328facd67912058b8b45b19a6c4cc62641c9476195da28a275ca6e0eca070af5378b905c2b11abc1114676ba703411db0b9ce007de921ad0 + checksum: 1201a25a137d6b9e328facd67912058b8b45b19a6c4cc62641c9476195da28a275ca6e0eca070af5378b905c2b11abc1114676ba703411db0b9ce007de921ad0 languageName: node linkType: hard "mdn-data@npm:2.0.30": version: 2.0.30 resolution: "mdn-data@npm:2.0.30" - checksum: 8/d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa + checksum: d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa languageName: node linkType: hard "memorystream@npm:^0.3.1": version: 0.3.1 resolution: "memorystream@npm:0.3.1" - checksum: 8/f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 + checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 languageName: node linkType: hard @@ -3947,50 +4986,50 @@ __metadata: version: 10.1.5 resolution: "meow@npm:10.1.5" dependencies: - "@types/minimist": "npm:^1.2.2" - camelcase-keys: "npm:^7.0.0" - decamelize: "npm:^5.0.0" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:4.1.0" - normalize-package-data: "npm:^3.0.2" - read-pkg-up: "npm:^8.0.0" - redent: "npm:^4.0.0" - trim-newlines: "npm:^4.0.2" - type-fest: "npm:^1.2.2" - yargs-parser: "npm:^20.2.9" - checksum: 8/dd5f0caa4af18517813547dc66741dcbf52c4c23def5062578d39b11189fd9457aee5c1f2263a5cd6592a465023df8357e8ac876b685b64dbcf545e3f66c23a7 + "@types/minimist": ^1.2.2 + camelcase-keys: ^7.0.0 + decamelize: ^5.0.0 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.2 + read-pkg-up: ^8.0.0 + redent: ^4.0.0 + trim-newlines: ^4.0.2 + type-fest: ^1.2.2 + yargs-parser: ^20.2.9 + checksum: dd5f0caa4af18517813547dc66741dcbf52c4c23def5062578d39b11189fd9457aee5c1f2263a5cd6592a465023df8357e8ac876b685b64dbcf545e3f66c23a7 languageName: node linkType: hard "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" - checksum: 8/6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 languageName: node linkType: hard "merge2@npm:^1.3.0, merge2@npm:^1.4.1": version: 1.4.1 resolution: "merge2@npm:1.4.1" - checksum: 8/7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"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: braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 languageName: node linkType: hard "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" - checksum: 8/0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard @@ -3999,28 +5038,28 @@ __metadata: resolution: "mime-types@npm:2.1.35" dependencies: mime-db: "npm:1.52.0" - checksum: 8/89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 8/d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 languageName: node linkType: hard "mimic-fn@npm:^4.0.0": version: 4.0.0 resolution: "mimic-fn@npm:4.0.0" - checksum: 8/995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: eb5893c99e902ccebbc267c6c6b83092966af84682957f79313311edb95e8bb5f39fb048d77132b700474d1c86d90ccc211e99bae0935447a4834eb4c882982c languageName: node linkType: hard "min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" - checksum: 8/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 languageName: node linkType: hard @@ -4031,7 +5070,7 @@ __metadata: schema-utils: "npm:^4.0.0" peerDependencies: webpack: ^5.0.0 - checksum: 8/be6f7cefc6275168eb0a6b8fe977083a18c743c9612c9f00e6c1a62c3393ca7960e93fba1a7ebb09b75f36a0204ad087d772c1ef574bc29c90c0e8175a3c0b83 + checksum: be6f7cefc6275168eb0a6b8fe977083a18c743c9612c9f00e6c1a62c3393ca7960e93fba1a7ebb09b75f36a0204ad087d772c1ef574bc29c90c0e8175a3c0b83 languageName: node linkType: hard @@ -4040,7 +5079,16 @@ __metadata: resolution: "mini-svg-data-uri@npm:1.4.4" bin: mini-svg-data-uri: cli.js - checksum: 8/997f1fbd8d59a70f03761e18626d335197a3479cb9d1ff75678e4b64b864d32a0b8fc18115eabde035e5299b8b4a354a78e57dd6ac10f9d604162a6170898d09 + checksum: 997f1fbd8d59a70f03761e18626d335197a3479cb9d1ff75678e4b64b864d32a0b8fc18115eabde035e5299b8b4a354a78e57dd6ac10f9d604162a6170898d09 + languageName: node + linkType: hard + +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 languageName: node linkType: hard @@ -4049,16 +5097,16 @@ __metadata: resolution: "minimatch@npm:3.1.2" dependencies: brace-expansion: "npm:^1.1.7" - checksum: 8/c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 8/253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + brace-expansion: ^2.0.1 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 languageName: node linkType: hard @@ -4066,84 +5114,77 @@ __metadata: version: 4.1.0 resolution: "minimist-options@npm:4.1.0" dependencies: - arrify: "npm:^1.0.1" - is-plain-obj: "npm:^1.1.0" - kind-of: "npm:^6.0.3" - checksum: 8/8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + arrify: ^1.0.1 + is-plain-obj: ^1.1.0 + kind-of: ^6.0.3 + checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e languageName: node linkType: hard "minimist@npm:~1.2.0": version: 1.2.7 resolution: "minimist@npm:1.2.7" - checksum: 8/7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": - version: 7.0.2 - resolution: "minipass@npm:7.0.2" - checksum: 8/46776de732eb7cef2c7404a15fb28c41f5c54a22be50d47b03c605bf21f5c18d61a173c0a20b49a97e7a65f78d887245066410642551e45fffe04e9ac9e325bc +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard -"mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" bin: - mkdirp: bin/cmd.js - checksum: 8/a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + mkdirp: dist/cjs/src/bin.js + checksum: 972deb188e8fb55547f1e58d66bd6b4a3623bf0c7137802582602d73e6480c1c2268dcbafbfb1be466e00cc7e56ac514d7fd9334b7cf33e3e2ab547c16f83a8d languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 8/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d languageName: node linkType: hard -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 8/7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 - languageName: node - linkType: hard - -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 8/5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 languageName: node linkType: hard "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" - checksum: 8/23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d languageName: node linkType: hard "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" - checksum: 8/deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 languageName: node linkType: hard "nice-try@npm:^1.0.4": version: 1.0.5 resolution: "nice-try@npm:1.0.5" - checksum: 8/0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff + checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff languageName: node linkType: hard "node-releases@npm:^2.0.18": version: 2.0.18 resolution: "node-releases@npm:2.0.18" - checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 + checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 languageName: node linkType: hard @@ -4155,7 +5196,7 @@ __metadata: resolve: "npm:^1.10.0" semver: "npm:2 || 3 || 4 || 5" validate-npm-package-license: "npm:^3.0.1" - checksum: 8/7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 languageName: node linkType: hard @@ -4163,25 +5204,25 @@ __metadata: version: 3.0.3 resolution: "normalize-package-data@npm:3.0.3" dependencies: - hosted-git-info: "npm:^4.0.1" - is-core-module: "npm:^2.5.0" - semver: "npm:^7.3.4" - validate-npm-package-license: "npm:^3.0.1" - checksum: 8/bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a + hosted-git-info: ^4.0.1 + is-core-module: ^2.5.0 + semver: ^7.3.4 + validate-npm-package-license: ^3.0.1 + checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a languageName: node linkType: hard "normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" - checksum: 8/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 languageName: node linkType: hard "nouislider@npm:15.4.0": version: 15.4.0 resolution: "nouislider@npm:15.4.0" - checksum: 8/4b7ffe7ca7eb75b27ffc100949db8594468eba5d8ac82e04fd4ab5a4c1b643b6c94ba7a97afcea2a11ec08ed93a59d1ed771550faf4ef1c7a8cdecd962f89f61 + checksum: 4b7ffe7ca7eb75b27ffc100949db8594468eba5d8ac82e04fd4ab5a4c1b643b6c94ba7a97afcea2a11ec08ed93a59d1ed771550faf4ef1c7a8cdecd962f89f61 languageName: node linkType: hard @@ -4202,16 +5243,7 @@ __metadata: npm-run-all: bin/npm-run-all/index.js run-p: bin/run-p/index.js run-s: bin/run-s/index.js - checksum: 8/373b72c6a36564da13c1642c1fd9bb4dcc756bce7a3648f883772f02661095319820834ff813762d2fee403e9b40c1cd27c8685807c107440f10eb19c006d4a0 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 8/5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + checksum: 373b72c6a36564da13c1642c1fd9bb4dcc756bce7a3648f883772f02661095319820834ff813762d2fee403e9b40c1cd27c8685807c107440f10eb19c006d4a0 languageName: node linkType: hard @@ -4220,83 +5252,74 @@ __metadata: resolution: "npm-run-path@npm:5.1.0" dependencies: path-key: "npm:^4.0.0" - checksum: 8/dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 + checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 languageName: node linkType: hard "object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" - checksum: 8/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f languageName: node linkType: hard -"object-inspect@npm:^1.12.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: 8/a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.13.1": + version: 1.13.2 + resolution: "object-inspect@npm:1.13.2" + checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 languageName: node linkType: hard "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" - checksum: 8/b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:^4.1.2, object.assign@npm:^4.1.3": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: 8/76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a languageName: node linkType: hard -"object.entries@npm:^1.1.5": - version: 1.1.5 - resolution: "object.entries@npm:1.1.5" +"object.assign@npm:^4.1.3, object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: 8/d658696f74fd222060d8428d2a9fda2ce736b700cb06f6bdf4a16a1892d145afb746f453502b2fa55d1dca8ead6f14ddbcf66c545df45adadea757a6c4cd86c7 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 languageName: node linkType: hard -"object.fromentries@npm:^2.0.5": - version: 2.0.5 - resolution: "object.fromentries@npm:2.0.5" +"object.entries@npm:^1.1.8": + version: 1.1.8 + resolution: "object.entries@npm:1.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: 8/61a0b565ded97b76df9e30b569729866e1824cce902f98e90bb106e84f378aea20163366f66dc75c9000e2aad2ed0caf65c6f530cb2abc4c0c0f6c982102db4b + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: 5314877cb637ef3437a30bba61d9bacdb3ce74bf73ac101518be0633c37840c8cc67407edb341f766e8093b3d7516d5c3358f25adfee4a2c697c0ec4c8491907 languageName: node linkType: hard -"object.hasown@npm:^1.1.1": - version: 1.1.1 - resolution: "object.hasown@npm:1.1.1" +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" dependencies: - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.19.5" - checksum: 8/d8ed4907ce57f48b93e3b53c418fd6787bf226a51e8d698c91e39b78e80fe5b124cb6282f6a9d5be21cf9e2c7829ab10206dcc6112b7748860eefe641880c793 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: 29b2207a2db2782d7ced83f93b3ff5d425f901945f3665ffda1821e30a7253cd1fd6b891a64279976098137ddfa883d748787a6fea53ecdb51f8df8b8cec0ae1 languageName: node linkType: hard -"object.values@npm:^1.1.5": - version: 1.1.5 - resolution: "object.values@npm:1.1.5" +"object.values@npm:^1.2.0": + version: 1.2.0 + resolution: "object.values@npm:1.2.0" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: 8/0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: 51fef456c2a544275cb1766897f34ded968b22adfc13ba13b5e4815fdaf4304a90d42a3aee114b1f1ede048a4890381d47a5594d84296f2767c6a0364b9da8fa languageName: node linkType: hard @@ -4305,16 +5328,7 @@ __metadata: resolution: "once@npm:1.4.0" dependencies: wrappy: "npm:1" - checksum: 8/cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 8/2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 languageName: node linkType: hard @@ -4323,19 +5337,16 @@ __metadata: resolution: "onetime@npm:6.0.0" dependencies: mimic-fn: "npm:^4.0.0" - checksum: 8/0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 languageName: node linkType: hard -"open@npm:^9.1.0": - version: 9.1.0 - resolution: "open@npm:9.1.0" +"onetime@npm:^7.0.0": + version: 7.0.0 + resolution: "onetime@npm:7.0.0" dependencies: - default-browser: "npm:^4.0.0" - define-lazy-prop: "npm:^3.0.0" - is-inside-container: "npm:^1.0.0" - is-wsl: "npm:^2.2.0" - checksum: 8/3993c0f61d51fed8ac290e99c9c3cf45d3b6cfb3e2aa2b74cafd312c3486c22fd81df16ac8f3ab91dd8a4e3e729a16fc2480cfc406c4833416cf908acf1ae7c9 + mimic-function: ^5.0.0 + checksum: eb08d2da9339819e2f9d52cab9caf2557d80e9af8c7d1ae86e1a0fef027d00a88e9f5bd67494d350df360f7c559fbb44e800b32f310fb989c860214eacbb561c languageName: node linkType: hard @@ -4349,7 +5360,7 @@ __metadata: levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - checksum: 8/09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a languageName: node linkType: hard @@ -4358,7 +5369,7 @@ __metadata: resolution: "p-limit@npm:2.3.0" dependencies: p-try: "npm:^2.0.0" - checksum: 8/84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 languageName: node linkType: hard @@ -4367,7 +5378,7 @@ __metadata: resolution: "p-limit@npm:3.1.0" dependencies: yocto-queue: "npm:^0.1.0" - checksum: 8/7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 languageName: node linkType: hard @@ -4376,7 +5387,7 @@ __metadata: resolution: "p-locate@npm:4.1.0" dependencies: p-limit: "npm:^2.2.0" - checksum: 8/513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 languageName: node linkType: hard @@ -4385,23 +5396,21 @@ __metadata: resolution: "p-locate@npm:5.0.0" dependencies: p-limit: "npm:^3.0.2" - checksum: 8/1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 8/cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 languageName: node linkType: hard "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" - checksum: 8/f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 languageName: node linkType: hard @@ -4410,7 +5419,7 @@ __metadata: resolution: "parent-module@npm:1.0.1" dependencies: callsites: "npm:^3.0.0" - checksum: 8/6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff languageName: node linkType: hard @@ -4420,85 +5429,85 @@ __metadata: dependencies: error-ex: "npm:^1.3.1" json-parse-better-errors: "npm:^1.0.1" - checksum: 8/0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 + checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 languageName: node linkType: hard -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 8/62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 languageName: node linkType: hard "parse-srcset@npm:^1.0.2": version: 1.0.2 resolution: "parse-srcset@npm:1.0.2" - checksum: 8/3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf + checksum: 3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf languageName: node linkType: hard "path-browserify@npm:^1.0.0": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" - checksum: 8/c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 + checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 languageName: node linkType: hard "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" - checksum: 8/505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 languageName: node linkType: hard "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" - checksum: 8/060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 languageName: node linkType: hard "path-key@npm:^2.0.1": version: 2.0.1 resolution: "path-key@npm:2.0.1" - checksum: 8/f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd + checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": +"path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" - checksum: 8/55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 languageName: node linkType: hard "path-key@npm:^4.0.0": version: 4.0.0 resolution: "path-key@npm:4.0.0" - checksum: 8/8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 languageName: node linkType: hard "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" - checksum: 8/49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a languageName: node linkType: hard -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: - lru-cache: "npm:^9.1.1 || ^10.0.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 8/e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + lru-cache: ^10.2.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 languageName: node linkType: hard @@ -4507,35 +5516,28 @@ __metadata: resolution: "path-type@npm:3.0.0" dependencies: pify: "npm:^3.0.0" - checksum: 8/735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 + checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 languageName: node linkType: hard "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" - checksum: 8/5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 8/a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 languageName: node linkType: hard -"picocolors@npm:^1.0.1": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard "picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" - checksum: 8/050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard @@ -4544,23 +5546,23 @@ __metadata: resolution: "pidtree@npm:0.3.1" bin: pidtree: bin/pidtree.js - checksum: 8/eb49025099f1af89a4696f7673351421f13420f3397b963c901fe23a1c9c2ff50f4750321970d4472c0ffbb065e4a6c3c27f75e226cc62284b19e21d32ce7012 + checksum: eb49025099f1af89a4696f7673351421f13420f3397b963c901fe23a1c9c2ff50f4750321970d4472c0ffbb065e4a6c3c27f75e226cc62284b19e21d32ce7012 languageName: node linkType: hard -"pidtree@npm:^0.6.0": +"pidtree@npm:~0.6.0": version: 0.6.0 resolution: "pidtree@npm:0.6.0" bin: pidtree: bin/pidtree.js - checksum: 8/8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a + checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a languageName: node linkType: hard "pify@npm:^3.0.0": version: 3.0.0 resolution: "pify@npm:3.0.0" - checksum: 8/6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde + checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde languageName: node linkType: hard @@ -4569,40 +5571,47 @@ __metadata: resolution: "pkg-dir@npm:4.2.0" dependencies: find-up: "npm:^4.0.0" - checksum: 8/9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + 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 languageName: node linkType: hard "postcss-modules-extract-imports@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-extract-imports@npm:3.0.0" + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 8/4b65f2f1382d89c4bc3c0a1bdc5942f52f3cb19c110c57bd591ffab3a5fee03fcf831604168205b0c1b631a3dce2255c70b61aaae3ef39d69cd7eb450c2552d2 + checksum: b9192e0f4fb3d19431558be6f8af7ca45fc92baaad9b2778d1732a5880cd25c3df2074ce5484ae491e224f0d21345ffc2d419bd51c25b019af76d7a7af88c17f languageName: node linkType: hard "postcss-modules-local-by-default@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-modules-local-by-default@npm:4.0.3" + version: 4.0.5 + resolution: "postcss-modules-local-by-default@npm:4.0.5" dependencies: - icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" - postcss-value-parser: "npm:^4.1.0" + icss-utils: ^5.0.0 + postcss-selector-parser: ^6.0.2 + postcss-value-parser: ^4.1.0 peerDependencies: postcss: ^8.1.0 - checksum: 8/2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 + checksum: ca9b01f4a0a3dfb33e016299e2dfb7e85c3123292f7aec2efc0c6771b9955648598bfb4c1561f7ee9732fb27fb073681233661b32eef98baab43743f96735452 languageName: node linkType: hard "postcss-modules-scope@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-scope@npm:3.0.0" + version: 3.2.0 + resolution: "postcss-modules-scope@npm:3.2.0" dependencies: - postcss-selector-parser: "npm:^6.0.4" + postcss-selector-parser: ^6.0.4 peerDependencies: postcss: ^8.1.0 - checksum: 8/330b9398dbd44c992c92b0dc612c0626135e2cc840fee41841eb61247a6cfed95af2bd6f67ead9dd9d0bb41f5b0367129d93c6e434fa3e9c58ade391d9a5a138 + checksum: 2ffe7e98c1fa993192a39c8dd8ade93fc4f59fbd1336ce34fcedaee0ee3bafb29e2e23fb49189256895b30e4f21af661c6a6a16ef7b17ae2c859301e4a4459ae languageName: node linkType: hard @@ -4613,14 +5622,14 @@ __metadata: icss-utils: "npm:^5.0.0" peerDependencies: postcss: ^8.1.0 - checksum: 8/f7f2cdf14a575b60e919ad5ea52fed48da46fe80db2733318d71d523fc87db66c835814940d7d05b5746b0426e44661c707f09bdb83592c16aea06e859409db6 + checksum: f7f2cdf14a575b60e919ad5ea52fed48da46fe80db2733318d71d523fc87db66c835814940d7d05b5746b0426e44661c707f09bdb83592c16aea06e859409db6 languageName: node linkType: hard "postcss-resolve-nested-selector@npm:^0.1.1": - version: 0.1.1 - resolution: "postcss-resolve-nested-selector@npm:0.1.1" - checksum: 8/b08fb76ab092a09ee01328bad620a01dcb445ac5eb02dd0ed9ed75217c2f779ecb3bf99a361c46e695689309c08c09f1a1ad7354c8d58c2c2c40d364657fcb08 + version: 0.1.6 + resolution: "postcss-resolve-nested-selector@npm:0.1.6" + checksum: 85453901afe2a4db497b4e0d2c9cf2a097a08fa5d45bc646547025176217050334e423475519a1e6c74a1f31ade819d16bb37a39914e5321e250695ee3feea14 languageName: node linkType: hard @@ -4629,42 +5638,42 @@ __metadata: resolution: "postcss-safe-parser@npm:6.0.0" peerDependencies: postcss: ^8.3.3 - checksum: 8/06c733eaad83a3954367e7ee02ddfe3796e7a44d4299ccf9239f40964a4daac153c7d77613f32964b5a86c0c6c2f6167738f31d578b73b17cb69d0c4446f0ebe + checksum: 06c733eaad83a3954367e7ee02ddfe3796e7a44d4299ccf9239f40964a4daac153c7d77613f32964b5a86c0c6c2f6167738f31d578b73b17cb69d0c4446f0ebe languageName: node linkType: hard "postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.13 - resolution: "postcss-selector-parser@npm:6.0.13" + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 8/f89163338a1ce3b8ece8e9055cd5a3165e79a15e1c408e18de5ad8f87796b61ec2d48a2902d179ae0c4b5de10fccd3a325a4e660596549b040bc5ad1b465f096 + cssesc: ^3.0.0 + util-deprecate: ^1.0.2 + checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84 languageName: node linkType: hard "postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" - checksum: 8/819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f + checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f languageName: node linkType: hard -"postcss@npm:^8.3.11, postcss@npm:^8.4.21, postcss@npm:^8.4.25": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" +"postcss@npm:^8.3.11, postcss@npm:^8.4.21, postcss@npm:^8.4.28": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" dependencies: - nanoid: "npm:^3.3.6" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 8/1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea + nanoid: ^3.3.7 + picocolors: ^1.1.0 + source-map-js: ^1.2.1 + checksum: f78440a9d8f97431dd2ab1ab8e1de64f12f3eff38a3d8d4a33919b96c381046a314658d2de213a5fa5eb296b656de76a3ec269fdea27f16d5ab465b916a0f52c languageName: node linkType: hard "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" - checksum: 8/cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a languageName: node linkType: hard @@ -4673,23 +5682,23 @@ __metadata: resolution: "prettier-linter-helpers@npm:1.0.0" dependencies: fast-diff: "npm:^1.1.2" - checksum: 8/00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 languageName: node linkType: hard "prettier@npm:^3.0.0": - version: 3.0.1 - resolution: "prettier@npm:3.0.1" + version: 3.3.3 + resolution: "prettier@npm:3.3.3" bin: prettier: bin/prettier.cjs - checksum: 8/e1f3f16c7fe0495de3faa182597871f74927d787cce3c52095a66ff5d7eacc05173371d5f58bf12141a0a1b6bfe739a338531d6cf18b92c7256c1319f2c84e73 + checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e languageName: node linkType: hard "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" - checksum: 8/bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 languageName: node linkType: hard @@ -4700,35 +5709,35 @@ __metadata: loose-envify: "npm:^1.4.0" object-assign: "npm:^4.1.1" react-is: "npm:^16.13.1" - checksum: 8/c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 + checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 languageName: node linkType: hard "punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.1.1 resolution: "punycode@npm:2.1.1" - checksum: 8/823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 languageName: node linkType: hard "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" - checksum: 8/5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 languageName: node linkType: hard "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" - checksum: 8/b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 languageName: node linkType: hard "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" - checksum: 8/a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed languageName: node linkType: hard @@ -4737,7 +5746,7 @@ __metadata: resolution: "randombytes@npm:2.1.0" dependencies: safe-buffer: "npm:^5.1.0" - checksum: 8/d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 languageName: node linkType: hard @@ -4749,30 +5758,30 @@ __metadata: scheduler: "npm:^0.23.0" peerDependencies: react: ^18.2.0 - checksum: 8/7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc languageName: node linkType: hard "react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" - checksum: 8/f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f + checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f languageName: node linkType: hard "react-is@npm:^18.2.0": version: 18.2.0 resolution: "react-is@npm:18.2.0" - checksum: 8/e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e languageName: node linkType: hard -"react@npm:^18.2.0": - version: 18.2.0 - resolution: "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: - loose-envify: "npm:^1.1.0" - checksum: 8/88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + loose-envify: ^1.1.0 + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 languageName: node linkType: hard @@ -4780,10 +5789,10 @@ __metadata: version: 8.0.0 resolution: "read-pkg-up@npm:8.0.0" dependencies: - find-up: "npm:^5.0.0" - read-pkg: "npm:^6.0.0" - type-fest: "npm:^1.0.1" - checksum: 8/fe4c80401656b40b408884457fffb5a8015c03b1018cfd8e48f8d82a5e9023e24963603aeb2755608d964593e046c15b34d29b07d35af9c7aa478be81805209c + find-up: ^5.0.0 + read-pkg: ^6.0.0 + type-fest: ^1.0.1 + checksum: fe4c80401656b40b408884457fffb5a8015c03b1018cfd8e48f8d82a5e9023e24963603aeb2755608d964593e046c15b34d29b07d35af9c7aa478be81805209c languageName: node linkType: hard @@ -4794,7 +5803,7 @@ __metadata: load-json-file: "npm:^4.0.0" normalize-package-data: "npm:^2.3.2" path-type: "npm:^3.0.0" - checksum: 8/398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 + checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 languageName: node linkType: hard @@ -4802,11 +5811,11 @@ __metadata: version: 6.0.0 resolution: "read-pkg@npm:6.0.0" dependencies: - "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^3.0.2" - parse-json: "npm:^5.2.0" - type-fest: "npm:^1.0.1" - checksum: 8/0cebdff381128e923815c643074a87011070e5fc352bee575d327d6485da3317fab6d802a7b03deeb0be7be8d3ad1640397b3d5d2f044452caf4e8d1736bf94f + "@types/normalize-package-data": ^2.4.0 + normalize-package-data: ^3.0.2 + parse-json: ^5.2.0 + type-fest: ^1.0.1 + checksum: 0cebdff381128e923815c643074a87011070e5fc352bee575d327d6485da3317fab6d802a7b03deeb0be7be8d3ad1640397b3d5d2f044452caf4e8d1736bf94f languageName: node linkType: hard @@ -4815,7 +5824,7 @@ __metadata: resolution: "rechoir@npm:0.8.0" dependencies: resolve: "npm:^1.20.0" - checksum: 8/ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 + checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 languageName: node linkType: hard @@ -4823,34 +5832,50 @@ __metadata: version: 4.0.0 resolution: "redent@npm:4.0.0" dependencies: - indent-string: "npm:^5.0.0" - strip-indent: "npm:^4.0.0" - checksum: 8/6944e7b1d8f3fd28c2515f5c605b9f7f0ea0f4edddf41890bbbdd4d9ee35abb7540c3b278f03ff827bd278bb6ff4a5bd8692ca406b748c5c1c3ce7355e9fbf8f + indent-string: ^5.0.0 + strip-indent: ^4.0.0 + checksum: 6944e7b1d8f3fd28c2515f5c605b9f7f0ea0f4edddf41890bbbdd4d9ee35abb7540c3b278f03ff827bd278bb6ff4a5bd8692ca406b748c5c1c3ce7355e9fbf8f languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.1, regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" +"reflect.getprototypeof@npm:^1.0.4": + version: 1.0.6 + resolution: "reflect.getprototypeof@npm:1.0.6" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - functions-have-names: "npm:^1.2.2" - checksum: 8/51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.1 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + globalthis: ^1.0.3 + which-builtin-type: ^1.1.3 + checksum: 88e9e65a7eaa0bf8e9a8bbf8ac07571363bc333ba8b6769ed5e013e0042ed7c385e97fae9049510b3b5fe4b42472d8f32de9ce8ce84902bc4297d4bbe3777dba + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.2": + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + set-function-name: ^2.0.2 + checksum: 83ff0705b837f7cb6d664010a11642250f36d3f642263dd0f3bdfe8f150261aa7b26b50ee97f21c1da30ef82a580bb5afedbef5f45639d69edaafbeac9bbb0ed languageName: node linkType: hard "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" - checksum: 8/a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b languageName: node linkType: hard "requires-port@npm:^1.0.0": version: 1.0.0 resolution: "requires-port@npm:1.0.0" - checksum: 8/eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff languageName: node linkType: hard @@ -4859,21 +5884,21 @@ __metadata: resolution: "resolve-cwd@npm:3.0.0" dependencies: resolve-from: "npm:^5.0.0" - checksum: 8/546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 languageName: node linkType: hard "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" - checksum: 8/f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f languageName: node linkType: hard "resolve-from@npm:^5.0.0": version: 5.0.0 resolution: "resolve-from@npm:5.0.0" - checksum: 8/4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf languageName: node linkType: hard @@ -4886,70 +5911,70 @@ __metadata: supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 8/07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e languageName: node linkType: hard -"resolve@npm:^2.0.0-next.3": - version: 2.0.0-next.4 - resolution: "resolve@npm:2.0.0-next.4" +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" dependencies: - is-core-module: "npm:^2.9.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 8/c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 + checksum: a73ac69a1c4bd34c56b213d91f5b17ce390688fdb4a1a96ed3025cc7e08e7bfb90b3a06fcce461780cb0b589c958afcb0080ab802c71c01a7ecc8c64feafc89f languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#optional!builtin::version=1.22.1&hash=c3c19d" +"resolve@patch:resolve@^2.0.0-next.5#~builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=c3c19d" dependencies: - is-core-module: "npm:^2.9.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 10c0/0d8ccceba5537769c42aa75e4aa75ae854aac866a11d7e9ffdb1663f0158ee646a0d48fc2818ed5e7fb364d64220a1fb9092a160e11e00cbdd5fbab39a13092c + checksum: 064d09c1808d0c51b3d90b5d27e198e6d0c5dad0eb57065fd40803d6a20553e5398b07f76739d69cbabc12547058bec6b32106ea66622375fb0d7e8fca6a846c languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.3#optional!builtin": - version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#optional!builtin::version=2.0.0-next.4&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.10.0#~builtin, resolve@patch:resolve@npm%3A^1.20.0#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" dependencies: is-core-module: "npm:^2.9.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/ed2bb51d616b9cd30fe85cf49f7a2240094d9fa01a221d361918462be81f683d1855b7f192391d2ab5325245b42464ca59690db5bd5dad0a326fc0de5974dd10 + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b languageName: node linkType: hard -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" +"restore-cursor@npm:^5.0.0": + version: 5.1.0 + resolution: "restore-cursor@npm:5.1.0" dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 8/f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + onetime: ^7.0.0 + signal-exit: ^4.1.0 + checksum: 838dd54e458d89cfbc1a923b343c1b0f170a04100b4ce1733e97531842d7b440463967e521216e8ab6c6f8e89df877acc7b7f4c18ec76e99fb9bf5a60d358d2c languageName: node linkType: hard "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" - checksum: 8/c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc languageName: node linkType: hard -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: 8/fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 +"rfdc@npm:^1.4.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 3b05bd55062c1d78aaabfcea43840cdf7e12099968f368e9a4c3936beb744adb41cbdb315eac6d4d8c6623005d6f87fdf16d8a10e1ff3722e84afea7281c8d13 languageName: node linkType: hard @@ -4960,27 +5985,18 @@ __metadata: glob: "npm:^7.1.3" bin: rimraf: bin.js - checksum: 8/87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 languageName: node linkType: hard "rimraf@npm:^5.0.1": - version: 5.0.1 - resolution: "rimraf@npm:5.0.1" + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" dependencies: - glob: "npm:^10.2.5" + glob: ^10.3.7 bin: - rimraf: dist/cjs/src/bin.js - checksum: 8/bafce85391349a2d960847980bf9b5caa2a8887f481af630f1ea27e08288217293cec72d75e9a2ba35495c212789f66a7f3d23366ba6197026ab71c535126857 - languageName: node - linkType: hard - -"run-applescript@npm:^5.0.0": - version: 5.0.0 - resolution: "run-applescript@npm:5.0.0" - dependencies: - execa: "npm:^5.0.0" - checksum: 8/d00c2dbfa5b2d774de7451194b8b125f40f65fc183de7d9dcae97f57f59433586d3c39b9001e111c38bfa24c3436c99df1bb4066a2a0c90d39a8c4cd6889af77 + rimraf: dist/esm/bin.mjs + checksum: 50e27388dd2b3fa6677385fc1e2966e9157c89c86853b96d02e6915663a96b7ff4d590e14f6f70e90f9b554093aa5dbc05ac3012876be558c06a65437337bc05 languageName: node linkType: hard @@ -4989,44 +6005,58 @@ __metadata: resolution: "run-parallel@npm:1.2.0" dependencies: queue-microtask: "npm:^1.2.2" - checksum: 8/cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d languageName: node linkType: hard -"rxjs@npm:^7.5.5": - version: 7.5.6 - resolution: "rxjs@npm:7.5.6" +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" dependencies: - tslib: "npm:^2.1.0" - checksum: 8/fc05f01364a74dac57490fb3e07ea63b422af04017fae1db641a009073f902ef69f285c5daac31359620dc8d9aee7d81e42b370ca2a8573d1feae0b04329383b + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 languageName: node linkType: hard "safe-buffer@npm:^5.1.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" - checksum: 8/b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-regex: ^1.1.4 + checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 languageName: node linkType: hard "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" - checksum: 8/cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 languageName: node linkType: hard -"sanitize-html@npm:~2.7.3": - version: 2.7.3 - resolution: "sanitize-html@npm:2.7.3" +"sanitize-html@npm:^2.3, sanitize-html@npm:~2.12.1": + version: 2.12.1 + resolution: "sanitize-html@npm:2.12.1" dependencies: - deepmerge: "npm:^4.2.2" - escape-string-regexp: "npm:^4.0.0" - htmlparser2: "npm:^6.0.0" - is-plain-object: "npm:^5.0.0" - parse-srcset: "npm:^1.0.2" - postcss: "npm:^8.3.11" - checksum: 8/2399d1fdbbc3a263fb413c1fe1971b3dc2b51abc6cc5cb49490624539d1c57a8fe31e2b21408c118e2a957f4e673e3169b1f9a5807654408f17b130a9d78aed7 + 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: fb96ea7170d51b5af2607f5cfd84464c78fc6f47e339407f55783e781c6a0288a8d40bbf97ea6a8758924ba9b2d33dcc4846bb94caacacd90d7f2de10ed8541a languageName: node linkType: hard @@ -5035,7 +6065,7 @@ __metadata: resolution: "scheduler@npm:0.23.0" dependencies: loose-envify: "npm:^1.1.0" - checksum: 8/d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a languageName: node linkType: hard @@ -5046,7 +6076,7 @@ __metadata: "@types/json-schema": "npm:^7.0.5" ajv: "npm:^6.12.4" ajv-keywords: "npm:^3.5.2" - checksum: 8/32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b + checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b languageName: node linkType: hard @@ -5057,7 +6087,7 @@ __metadata: "@types/json-schema": "npm:^7.0.8" ajv: "npm:^6.12.5" ajv-keywords: "npm:^3.5.2" - checksum: 8/ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 languageName: node linkType: hard @@ -5069,7 +6099,7 @@ __metadata: ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 8/26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde + checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde languageName: node linkType: hard @@ -5078,27 +6108,25 @@ __metadata: resolution: "semver@npm:5.7.2" bin: semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 languageName: node linkType: hard -"semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: - semver: ./bin/semver.js - checksum: 8/1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.4": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 8/12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 languageName: node linkType: hard @@ -5107,7 +6135,33 @@ __metadata: resolution: "serialize-javascript@npm:6.0.1" dependencies: randombytes: "npm:^2.1.0" - checksum: 8/3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f languageName: node linkType: hard @@ -5116,7 +6170,7 @@ __metadata: resolution: "shallow-clone@npm:3.0.1" dependencies: kind-of: "npm:^6.0.2" - checksum: 8/39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 + checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 languageName: node linkType: hard @@ -5125,7 +6179,7 @@ __metadata: resolution: "shebang-command@npm:1.2.0" dependencies: shebang-regex: "npm:^1.0.0" - checksum: 8/9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 + checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 languageName: node linkType: hard @@ -5134,71 +6188,54 @@ __metadata: resolution: "shebang-command@npm:2.0.0" dependencies: shebang-regex: "npm:^3.0.0" - checksum: 8/6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa languageName: node linkType: hard "shebang-regex@npm:^1.0.0": version: 1.0.0 resolution: "shebang-regex@npm:1.0.0" - checksum: 8/404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 + checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 languageName: node linkType: hard "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" - checksum: 8/1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 languageName: node linkType: hard "shell-quote@npm:^1.6.1": version: 1.7.3 resolution: "shell-quote@npm:1.7.3" - checksum: 8/aca58e73a3a5d933d02e0bdddedc53ee14f7c2ec264f97ac915b9d4482d077a38e422aa664631d60a672cd3cdb4054eb2e6c0303f54882453dacb6483e482d34 + checksum: aca58e73a3a5d933d02e0bdddedc53ee14f7c2ec264f97ac915b9d4482d077a38e422aa664631d60a672cd3cdb4054eb2e6c0303f54882453dacb6483e482d34 languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" dependencies: - call-bind: "npm:^1.0.0" - get-intrinsic: "npm:^1.0.2" - object-inspect: "npm:^1.9.0" - checksum: 8/351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 8/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 languageName: node linkType: hard -"signal-exit@npm:^4.0.1": +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" - checksum: 8/64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 languageName: node linkType: hard "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" - checksum: 8/94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - astral-regex: "npm:^2.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - checksum: 8/5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c languageName: node linkType: hard @@ -5206,10 +6243,10 @@ __metadata: version: 4.0.0 resolution: "slice-ansi@npm:4.0.0" dependencies: - ansi-styles: "npm:^4.0.0" - astral-regex: "npm:^2.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - checksum: 8/4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 languageName: node linkType: hard @@ -5219,25 +6256,47 @@ __metadata: dependencies: ansi-styles: "npm:^6.0.0" is-fullwidth-code-point: "npm:^4.0.0" - checksum: 8/7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e + checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e + languageName: node + linkType: hard + +"slice-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "slice-ansi@npm:7.1.0" + dependencies: + ansi-styles: ^6.2.1 + is-fullwidth-code-point: ^5.0.0 + checksum: 10313dd3cf7a2e4b265f527b1684c7c568210b09743fd1bd74f2194715ed13ffba653dc93a5fa79e3b1711518b8990a732cb7143aa01ddafe626e99dfa6474b2 languageName: node linkType: hard "source-list-map@npm:^2.0.0": version: 2.0.1 resolution: "source-list-map@npm:2.0.1" - checksum: 8/806efc6f75e7cd31e4815e7a3aaf75a45c704871ea4075cb2eb49882c6fca28998f44fc5ac91adb6de03b2882ee6fb02f951fdc85e6a22b338c32bfe19557938 + checksum: 806efc6f75e7cd31e4815e7a3aaf75a45c704871ea4075cb2eb49882c6fca28998f44fc5ac91adb6de03b2882ee6fb02f951fdc85e6a22b338c32bfe19557938 languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: 8/c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b + languageName: node + linkType: hard + +"source-map-loader@npm:^5.0.0": + version: 5.0.0 + resolution: "source-map-loader@npm:5.0.0" + dependencies: + iconv-lite: ^0.6.3 + source-map-js: ^1.0.2 + peerDependencies: + webpack: ^5.72.1 + checksum: 66d6fbaa87a14197647515f274b9a685a84d0ddb95c3d9801bfb1ce28fc24000954c73548fe09c52c0bad660eb10d963b0c60d5c5943ccf2c8292a8d957f2acb languageName: node linkType: hard -"source-map-loader@npm:^1.0.2, source-map-loader@npm:~1.0.2": +"source-map-loader@npm:~1.0.2": version: 1.0.2 resolution: "source-map-loader@npm:1.0.2" dependencies: @@ -5248,7 +6307,7 @@ __metadata: source-map: "npm:^0.6.1" peerDependencies: webpack: ^4.0.0 || ^5.0.0 - checksum: 8/0360b536e904f8fea452d0e122b9199661765229dc62a4b8093cc9d14e985f2ddd146355ede6d11acdd0b9bf4639b364e2526afcf9d3218ed45af63aa5eb053f + checksum: 0360b536e904f8fea452d0e122b9199661765229dc62a4b8093cc9d14e985f2ddd146355ede6d11acdd0b9bf4639b364e2526afcf9d3218ed45af63aa5eb053f languageName: node linkType: hard @@ -5258,14 +6317,14 @@ __metadata: dependencies: buffer-from: "npm:^1.0.0" source-map: "npm:^0.6.0" - checksum: 8/43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 languageName: node linkType: hard "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" - checksum: 8/59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 languageName: node linkType: hard @@ -5275,14 +6334,14 @@ __metadata: dependencies: spdx-expression-parse: "npm:^3.0.0" spdx-license-ids: "npm:^3.0.0" - checksum: 8/77ce438344a34f9930feffa61be0eddcda5b55fc592906ef75621d4b52c07400a97084d8701557b13f7d2aae0cb64f808431f469e566ef3fe0a3a131dcb775a6 + checksum: 77ce438344a34f9930feffa61be0eddcda5b55fc592906ef75621d4b52c07400a97084d8701557b13f7d2aae0cb64f808431f469e566ef3fe0a3a131dcb775a6 languageName: node linkType: hard "spdx-exceptions@npm:^2.1.0": version: 2.3.0 resolution: "spdx-exceptions@npm:2.3.0" - checksum: 8/cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 languageName: node linkType: hard @@ -5292,59 +6351,74 @@ __metadata: dependencies: spdx-exceptions: "npm:^2.1.0" spdx-license-ids: "npm:^3.0.0" - checksum: 8/a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde languageName: node linkType: hard "spdx-license-ids@npm:^3.0.0": version: 3.0.11 resolution: "spdx-license-ids@npm:3.0.11" - checksum: 8/1da1acb090257773e60b022094050e810ae9fec874dc1461f65dc0400cd42dd830ab2df6e64fb49c2db3dce386dd0362110780e1b154db7c0bb413488836aaeb + checksum: 1da1acb090257773e60b022094050e810ae9fec874dc1461f65dc0400cd42dd830ab2df6e64fb49c2db3dce386dd0362110780e1b154db7c0bb413488836aaeb languageName: node linkType: hard -"string-argv@npm:^0.3.1": - version: 0.3.1 - resolution: "string-argv@npm:0.3.1" - checksum: 8/efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf +"string-argv@npm:~0.3.2": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: emoji-regex: "npm:^8.0.0" is-fullwidth-code-point: "npm:^3.0.0" strip-ansi: "npm:^6.0.1" - checksum: 8/e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb languageName: node linkType: hard -"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: eastasianwidth: "npm:^0.2.0" emoji-regex: "npm:^9.2.2" strip-ansi: "npm:^7.0.1" - checksum: 8/7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.7": - version: 4.0.7 - resolution: "string.prototype.matchall@npm:4.0.7" +"string-width@npm:^7.0.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - get-intrinsic: "npm:^1.1.1" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.3" - regexp.prototype.flags: "npm:^1.4.1" - side-channel: "npm:^1.0.4" - checksum: 8/fc09f3ccbfb325de0472bcc87a6be0598a7499e0b4a31db5789676155b15754a4cc4bb83924f15fc9ed48934dac7366ee52c8b9bd160bed6fd072c93b489e75c + emoji-regex: ^10.3.0 + get-east-asian-width: ^1.0.0 + strip-ansi: ^7.1.0 + checksum: 42f9e82f61314904a81393f6ef75b832c39f39761797250de68c041d8ba4df2ef80db49ab6cd3a292923a6f0f409b8c9980d120f7d32c820b4a8a84a2598a295 + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.11": + version: 4.0.11 + resolution: "string.prototype.matchall@npm:4.0.11" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.7 + regexp.prototype.flags: ^1.5.2 + set-function-name: ^2.0.2 + side-channel: ^1.0.6 + checksum: 6ac6566ed065c0c8489c91156078ca077db8ff64d683fda97ae652d00c52dfa5f39aaab0a710d8243031a857fd2c7c511e38b45524796764d25472d10d7075ae languageName: node linkType: hard @@ -5355,29 +6429,51 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.1.3" es-abstract: "npm:^1.19.1" - checksum: 8/ef9ee0542c17975629bc6d21497e8faaa142d873e9f07fb65de2a955df402a1eac45cbed375045a759501e9d4ef80e589e11f0e12103c20df0770e47f6b59bc7 + checksum: ef9ee0542c17975629bc6d21497e8faaa142d873e9f07fb65de2a955df402a1eac45cbed375045a759501e9d4ef80e589e11f0e12103c20df0770e47f6b59bc7 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimend@npm:1.0.5" +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.19.5" - checksum: 8/d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc + define-properties: ^1.1.3 + es-abstract: ^1.17.5 + checksum: 95dfc514ed7f328d80a066dabbfbbb1615c3e51490351085409db2eb7cbfed7ea29fdadaf277647fbf9f4a1e10e6dd9e95e78c0fd2c4e6bb6723ea6e59401004 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimstart@npm:1.0.5" +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.19.5" - checksum: 8/a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.0 + es-object-atoms: ^1.0.0 + checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 languageName: node linkType: hard @@ -5386,37 +6482,30 @@ __metadata: resolution: "strip-ansi@npm:6.0.1" dependencies: ansi-regex: "npm:^5.0.1" - checksum: 8/f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": - version: 7.0.1 - resolution: "strip-ansi@npm:7.0.1" +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 8/257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d languageName: node linkType: hard "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" - checksum: 8/8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 8/69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b languageName: node linkType: hard "strip-final-newline@npm:^3.0.0": version: 3.0.0 resolution: "strip-final-newline@npm:3.0.0" - checksum: 8/23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 languageName: node linkType: hard @@ -5424,31 +6513,38 @@ __metadata: version: 4.0.0 resolution: "strip-indent@npm:4.0.0" dependencies: - min-indent: "npm:^1.0.1" - checksum: 8/06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + min-indent: ^1.0.1 + checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 languageName: node linkType: hard "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" - checksum: 8/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 languageName: node linkType: hard "style-loader@npm:^3.3.1, style-loader@npm:~3.3.1": - version: 3.3.3 - resolution: "style-loader@npm:3.3.3" + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" peerDependencies: webpack: ^5.0.0 - checksum: 8/f59c953f56f6a935bd6a1dfa409f1128fed2b66b48ce4a7a75b85862a7156e5e90ab163878962762f528ec4d510903d828da645e143fbffd26f055dc1c094078 + checksum: caac3f2fe2c3c89e49b7a2a9329e1cfa515ecf5f36b9c4885f9b218019fda207a9029939b2c35821dec177a264a007e7c391ccdd3ff7401881ce6287b9c8f38b + languageName: node + linkType: hard + +"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": + version: 4.1.2 + resolution: "style-mod@npm:4.1.2" + checksum: 7c5c3e82747f9bcf5f288d8d07f50848e4630fe5ff7bfe4d94cc87d6b6a2588227cbf21b4c792ac6406e5852293300a75e710714479a5c59a06af677f0825ef8 languageName: node linkType: hard "style-search@npm:^0.1.0": version: 0.1.0 resolution: "style-search@npm:0.1.0" - checksum: 8/3cfefe335033aad6d47da0725cb48f5db91a73935954c77eab77d9e415e6668cdb406da4a4f7ef9f1aca77853cf5ba7952c45e869caa5bd6439691d88098d468 + checksum: 3cfefe335033aad6d47da0725cb48f5db91a73935954c77eab77d9e415e6668cdb406da4a4f7ef9f1aca77853cf5ba7952c45e869caa5bd6439691d88098d468 languageName: node linkType: hard @@ -5457,7 +6553,7 @@ __metadata: resolution: "stylelint-config-recommended@npm:13.0.0" peerDependencies: stylelint: ^15.10.0 - checksum: 8/a56eb6d1a7c7f3a7a172b54bc34218859ba22a5a06816fb4d0964f66cb83cf372062f2c97830e994ad68243548e15fc49abf28887c3261ab1b471b3aa69f8e82 + checksum: a56eb6d1a7c7f3a7a172b54bc34218859ba22a5a06816fb4d0964f66cb83cf372062f2c97830e994ad68243548e15fc49abf28887c3261ab1b471b3aa69f8e82 languageName: node linkType: hard @@ -5465,72 +6561,72 @@ __metadata: version: 34.0.0 resolution: "stylelint-config-standard@npm:34.0.0" dependencies: - stylelint-config-recommended: "npm:^13.0.0" + stylelint-config-recommended: ^13.0.0 peerDependencies: stylelint: ^15.10.0 - checksum: 8/536249800c04b48a9c354067765f042713982e8222be17bb897a27d26546e50adfb87e6f1e4541807d720de3554345da99ab470e13e8d7ab0ab326c73ae3df61 + checksum: 536249800c04b48a9c354067765f042713982e8222be17bb897a27d26546e50adfb87e6f1e4541807d720de3554345da99ab470e13e8d7ab0ab326c73ae3df61 languageName: node linkType: hard "stylelint-prettier@npm:^4.0.0": - version: 4.0.2 - resolution: "stylelint-prettier@npm:4.0.2" + version: 4.1.0 + resolution: "stylelint-prettier@npm:4.1.0" dependencies: - prettier-linter-helpers: "npm:^1.0.0" + prettier-linter-helpers: ^1.0.0 peerDependencies: prettier: ">=3.0.0" stylelint: ">=15.8.0" - checksum: 8/b60112c10b8f31456211d65b4c17238fdaf46ee9f80ab035621f2eb86b47505a4b9582d99f4334dfe370cc8104de870f7fcc256737d0f2e68f4357239f739054 + checksum: bbeb7e0dd49099c43297e88a61385b39f4b5810c8bfcc972d5b2706b6a7e14a8eefd5f9e623841cf3127111a8859eb624a3e7cc1bc5197c83c55c6c9a616a4d2 languageName: node linkType: hard "stylelint@npm:^15.10.1": - version: 15.10.2 - resolution: "stylelint@npm:15.10.2" - dependencies: - "@csstools/css-parser-algorithms": "npm:^2.3.0" - "@csstools/css-tokenizer": "npm:^2.1.1" - "@csstools/media-query-list-parser": "npm:^2.1.2" - "@csstools/selector-specificity": "npm:^3.0.0" - balanced-match: "npm:^2.0.0" - colord: "npm:^2.9.3" - cosmiconfig: "npm:^8.2.0" - css-functions-list: "npm:^3.2.0" - css-tree: "npm:^2.3.1" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.0" - fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^6.0.1" - global-modules: "npm:^2.0.0" - globby: "npm:^11.1.0" - globjoin: "npm:^0.1.4" - html-tags: "npm:^3.3.1" - ignore: "npm:^5.2.4" - import-lazy: "npm:^4.0.0" - imurmurhash: "npm:^0.1.4" - is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.27.0" - mathml-tag-names: "npm:^2.1.3" - meow: "npm:^10.1.5" - micromatch: "npm:^4.0.5" - normalize-path: "npm:^3.0.0" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.25" - postcss-resolve-nested-selector: "npm:^0.1.1" - postcss-safe-parser: "npm:^6.0.0" - postcss-selector-parser: "npm:^6.0.13" - postcss-value-parser: "npm:^4.2.0" - resolve-from: "npm:^5.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - style-search: "npm:^0.1.0" - supports-hyperlinks: "npm:^3.0.0" - svg-tags: "npm:^1.0.0" - table: "npm:^6.8.1" - write-file-atomic: "npm:^5.0.1" + version: 15.11.0 + resolution: "stylelint@npm:15.11.0" + dependencies: + "@csstools/css-parser-algorithms": ^2.3.1 + "@csstools/css-tokenizer": ^2.2.0 + "@csstools/media-query-list-parser": ^2.1.4 + "@csstools/selector-specificity": ^3.0.0 + balanced-match: ^2.0.0 + colord: ^2.9.3 + cosmiconfig: ^8.2.0 + css-functions-list: ^3.2.1 + css-tree: ^2.3.1 + debug: ^4.3.4 + fast-glob: ^3.3.1 + fastest-levenshtein: ^1.0.16 + file-entry-cache: ^7.0.0 + global-modules: ^2.0.0 + globby: ^11.1.0 + globjoin: ^0.1.4 + html-tags: ^3.3.1 + ignore: ^5.2.4 + import-lazy: ^4.0.0 + imurmurhash: ^0.1.4 + is-plain-object: ^5.0.0 + known-css-properties: ^0.29.0 + mathml-tag-names: ^2.1.3 + meow: ^10.1.5 + micromatch: ^4.0.5 + normalize-path: ^3.0.0 + picocolors: ^1.0.0 + postcss: ^8.4.28 + postcss-resolve-nested-selector: ^0.1.1 + postcss-safe-parser: ^6.0.0 + postcss-selector-parser: ^6.0.13 + postcss-value-parser: ^4.2.0 + resolve-from: ^5.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + style-search: ^0.1.0 + supports-hyperlinks: ^3.0.0 + svg-tags: ^1.0.0 + table: ^6.8.1 + write-file-atomic: ^5.0.1 bin: stylelint: bin/stylelint.mjs - checksum: 8/1a7dc0385bddc604f6633340dd3eb58dfc8860e677576d7ad688a94064140d73fd70ea21038994a9f8884457098ee297ce625bbddd9477cde35faa4bf7aff848 + checksum: 9835f8a3e3976a3b81a35569d08f5f4a9c3b5cff415f1345a505870afc0c3231acff27f119d937c5bb11fdbc98d554af564c2a648a52604280a59a11974fcbfc languageName: node linkType: hard @@ -5539,7 +6635,7 @@ __metadata: resolution: "supports-color@npm:5.5.0" dependencies: has-flag: "npm:^3.0.0" - checksum: 8/95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac languageName: node linkType: hard @@ -5548,7 +6644,7 @@ __metadata: resolution: "supports-color@npm:7.2.0" dependencies: has-flag: "npm:^4.0.0" - checksum: 8/3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a languageName: node linkType: hard @@ -5557,65 +6653,72 @@ __metadata: resolution: "supports-color@npm:8.1.1" dependencies: has-flag: "npm:^4.0.0" - checksum: 8/c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 languageName: node linkType: hard "supports-hyperlinks@npm:^3.0.0": - version: 3.0.0 - resolution: "supports-hyperlinks@npm:3.0.0" + version: 3.1.0 + resolution: "supports-hyperlinks@npm:3.1.0" dependencies: - has-flag: "npm:^4.0.0" - supports-color: "npm:^7.0.0" - checksum: 8/41021305de5255b10d821bf93c7a781f783e1693d0faec293d7fc7ccf17011b90bde84b0295fa92ba75c6c390351fe84fdd18848cad4bf656e464a958243c3e7 + has-flag: ^4.0.0 + supports-color: ^7.0.0 + checksum: 051ffc31ae0d3334502decb6a17170ff89d870094d6835d93dfb2cda03e2a4504bf861a0954942af5e65fdd038b81cef5998696d0f4f4ff5f5bd3e40c7981874 languageName: node linkType: hard "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 8/53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae languageName: node linkType: hard "svg-tags@npm:^1.0.0": version: 1.0.0 resolution: "svg-tags@npm:1.0.0" - checksum: 8/407e5ef87cfa2fb81c61d738081c2decd022ce13b922d035b214b49810630bf5d1409255a4beb3a940b77b32f6957806deff16f1bf0ce1ab11c7a184115a0b7f + checksum: 407e5ef87cfa2fb81c61d738081c2decd022ce13b922d035b214b49810630bf5d1409255a4beb3a940b77b32f6957806deff16f1bf0ce1ab11c7a184115a0b7f languageName: node linkType: hard -"synckit@npm:^0.8.5": - version: 0.8.5 - resolution: "synckit@npm:0.8.5" +"synckit@npm:^0.9.1": + version: 0.9.2 + resolution: "synckit@npm:0.9.2" dependencies: - "@pkgr/utils": "npm:^2.3.1" - tslib: "npm:^2.5.0" - checksum: 8/8a9560e5d8f3d94dc3cf5f7b9c83490ffa30d320093560a37b88f59483040771fd1750e76b9939abfbb1b5a23fd6dfbae77f6b338abffe7cae7329cd9b9bb86b + "@pkgr/core": ^0.1.0 + tslib: ^2.6.2 + checksum: 3a30e828efbdcf3b50fccab4da6e90ea7ca24d8c5c2ad3ffe98e07d7c492df121e0f75227c6e510f96f976aae76f1fa4710cb7b1d69db881caf66ef9de89360e + languageName: node + linkType: hard + +"tabbable@npm:^5.2.0": + version: 5.3.3 + resolution: "tabbable@npm:5.3.3" + checksum: 1aa56e1bb617cc10616c407f4e756f0607f3e2d30f9803664d70b85db037ca27e75918ed1c71443f3dc902e21dc9f991ce4b52d63a538c9b69b3218d3babcd70 languageName: node linkType: hard "table@npm:^6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" + version: 6.8.2 + resolution: "table@npm:6.8.2" dependencies: - ajv: "npm:^8.0.1" - lodash.truncate: "npm:^4.4.2" - slice-ansi: "npm:^4.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - checksum: 8/08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 61188652f53a980d1759ca460ca8dea5c5322aece3210457e7084882f053c2b6a870041295e08a82cb1d676e31b056406845d94b0abf3c79a4b104777bec413b languageName: node linkType: hard "tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" - checksum: 8/3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10": +"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" dependencies: @@ -5633,43 +6736,7 @@ __metadata: optional: true uglify-js: optional: true - checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 - languageName: node - linkType: hard - -"terser-webpack-plugin@npm:^5.3.7": - version: 5.3.9 - resolution: "terser-webpack-plugin@npm:5.3.9" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.17" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.16.8" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 8/41705713d6f9cb83287936b21e27c658891c78c4392159f5148b5623f0e8c48559869779619b058382a4c9758e7820ea034695e57dc7c474b4962b79f553bc5f - languageName: node - linkType: hard - -"terser@npm:^5.16.8": - version: 5.19.2 - resolution: "terser@npm:5.19.2" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 8/e059177775b4d4f4cff219ad89293175aefbd1b081252270444dc83e42a2c5f07824eb2a85eae6e22ef6eb7ef04b21af36dd7d1dd7cfb93912310e57d416a205 + checksum: bd6e7596cf815f3353e2a53e79cbdec959a1b0276f5e5d4e63e9d7c3c5bb5306df567729da287d1c7b39d79093e56863c569c42c6c24cc34c76aa313bd2cbcea languageName: node linkType: hard @@ -5683,28 +6750,14 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/18a1cd33366dcd8fee7d6eef78c9c417cbe688e5153841e6a574f9d4937066dc40f67b1e96305f73f25bc6f2c458dbe442a056092c99619d4dbee8ad9fae4a3e + checksum: e0012bffa595470f481a19952dde18e5a58836eafc63305cf86823fc4406b187ba1b4d6856e1662fb0f464a844a21e7bccf68919128fc43343d58b6ad49485f1 languageName: node linkType: hard "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" - checksum: 8/b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 8/a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"titleize@npm:^3.0.0": - version: 3.0.0 - resolution: "titleize@npm:3.0.0" - checksum: 8/71fbbeabbfb36ccd840559f67f21e356e1d03da2915b32d2ae1a60ddcc13a124be2739f696d2feb884983441d159a18649e8d956648d591bdad35c430a6b6d28 + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a languageName: node linkType: hard @@ -5713,7 +6766,7 @@ __metadata: resolution: "to-regex-range@npm:5.0.1" dependencies: is-number: "npm:^7.0.0" - checksum: 8/f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed languageName: node linkType: hard @@ -5722,30 +6775,37 @@ __metadata: resolution: "tr46@npm:2.1.0" dependencies: punycode: "npm:^2.1.1" - checksum: 8/ffe6049b9dca3ae329b059aada7f515b0f0064c611b39b51ff6b53897e954650f6f63d9319c6c008d36ead477c7b55e5f64c9dc60588ddc91ff720d64eb710b3 + checksum: ffe6049b9dca3ae329b059aada7f515b0f0064c611b39b51ff6b53897e954650f6f63d9319c6c008d36ead477c7b55e5f64c9dc60588ddc91ff720d64eb710b3 languageName: node linkType: hard "trim-newlines@npm:^4.0.2": version: 4.1.1 resolution: "trim-newlines@npm:4.1.1" - checksum: 8/5b09f8e329e8f33c1111ef26906332ba7ba7248cde3e26fc054bb3d69f2858bf5feedca9559c572ff91f33e52977c28e0d41c387df6a02a633cbb8c2d8238627 + checksum: 5b09f8e329e8f33c1111ef26906332ba7ba7248cde3e26fc054bb3d69f2858bf5feedca9559c572ff91f33e52977c28e0d41c387df6a02a633cbb8c2d8238627 languageName: node linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "ts-api-utils@npm:1.0.1" + version: 1.3.0 + resolution: "ts-api-utils@npm:1.3.0" peerDependencies: typescript: ">=4.2.0" - checksum: 8/78794fc7270d295b36c1ac613465b5dc7e7226907a533125b30f177efef9dd630d4e503b00be31b44335eb2ebf9e136ebe97353f8fc5d383885d5fead9d54c09 + checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 + languageName: node + linkType: hard + +"tslib@npm:^1.13.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.5.0, tslib@npm:^2.6.0": - version: 2.6.1 - resolution: "tslib@npm:2.6.1" - checksum: 8/b0d176d176487905b66ae4d5856647df50e37beea7571c53b8d10ba9222c074b81f1410fb91da13debaf2cbc970663609068bdebafa844ea9d69b146527c38fe +"tslib@npm:^2.6.2": + version: 2.8.0 + resolution: "tslib@npm:2.8.0" + checksum: de852ecd81adfdb4870927e250763345f07dc13fe7f395ce261424966bb122a0992ad844c3ec875c9e63e72afe2220a150712984e44dfd1a8a7e538a064e3d46 languageName: node linkType: hard @@ -5754,28 +6814,73 @@ __metadata: resolution: "type-check@npm:0.4.0" dependencies: prelude-ls: "npm:^1.2.1" - checksum: 8/ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a languageName: node linkType: hard "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" - checksum: 8/4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 8/e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 languageName: node linkType: hard "type-fest@npm:^1.0.1, type-fest@npm:^1.2.1, type-fest@npm:^1.2.2": version: 1.4.0 resolution: "type-fest@npm:1.4.0" - checksum: 8/b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-typed-array: ^1.1.13 + checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + 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" + 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 + checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + 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" + dependencies: + available-typed-arrays: ^1.0.7 + 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 + checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + 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 languageName: node linkType: hard @@ -5785,17 +6890,17 @@ __metadata: bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 8/82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 + checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~5.0.2#optional!builtin": +"typescript@patch:typescript@~5.0.2#~builtin": version: 5.0.4 - resolution: "typescript@patch:typescript@npm%3A5.0.4#optional!builtin::version=5.0.4&hash=b5f058" + resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/c3f7b80577bddf6fab202a7925131ac733bfc414aec298c2404afcddc7a6f242cfa8395cf2d48192265052e11a7577c27f6e5fac8d8fe6a6602023c83d6b3292 + checksum: bb309d320c59a26565fb3793dba550576ab861018ff3fd1b7fccabbe46ae4a35546bc45f342c0a0b6f265c801ccdf64ffd68f548f117ceb7f0eac4b805cd52a9 languageName: node linkType: hard @@ -5805,7 +6910,7 @@ __metadata: dependencies: csstype: "npm:3.0.10" free-style: "npm:3.1.0" - checksum: 8/8b4f02c24f67b594f98507b15a753dabd4db5eb0af007e1d310527c64030e11e9464b25b5a6bc65fb5eec9a4459a8336050121ecc29063ac87b8b47a6d698893 + checksum: 8b4f02c24f67b594f98507b15a753dabd4db5eb0af007e1d310527c64030e11e9464b25b5a6bc65fb5eec9a4459a8336050121ecc29063ac87b8b47a6d698893 languageName: node linkType: hard @@ -5817,28 +6922,28 @@ __metadata: has-bigints: "npm:^1.0.2" has-symbols: "npm:^1.0.3" which-boxed-primitive: "npm:^1.0.2" - checksum: 8/b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 languageName: node linkType: hard "underscore@npm:>=1.8.3": version: 1.13.4 resolution: "underscore@npm:1.13.4" - checksum: 8/6b04f66cd454e8793a552dc49c71e24e5208a29b9d9c0af988a96948af79103399c36fb15db43f3629bfed152f8b1fe94f44e1249e9d196069c0fc7edfadb636 + checksum: 6b04f66cd454e8793a552dc49c71e24e5208a29b9d9c0af988a96948af79103399c36fb15db43f3629bfed152f8b1fe94f44e1249e9d196069c0fc7edfadb636 languageName: node linkType: hard -"universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 8/2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 languageName: node linkType: hard -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 8/39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 languageName: node linkType: hard @@ -5852,7 +6957,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/a7452de47785842736fb71547651c5bbe5b4dc1e3722ccf48a704b7b34e4dcf633991eaa8e4a6a517ffb738b3252eede3773bef673ef9021baa26b056d63a5b9 + checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562 languageName: node linkType: hard @@ -5861,7 +6966,7 @@ __metadata: resolution: "uri-js@npm:4.4.1" dependencies: punycode: "npm:^2.1.0" - checksum: 8/7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 languageName: node linkType: hard @@ -5871,14 +6976,14 @@ __metadata: dependencies: querystringify: "npm:^2.1.1" requires-port: "npm:^1.0.0" - checksum: 8/fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf languageName: node linkType: hard "util-deprecate@npm:^1.0.2": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" - checksum: 8/474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 languageName: node linkType: hard @@ -5888,21 +6993,21 @@ __metadata: dependencies: spdx-correct: "npm:^3.0.0" spdx-expression-parse: "npm:^3.0.0" - checksum: 8/35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad languageName: node linkType: hard "validate.io-array@npm:^1.0.3": version: 1.0.6 resolution: "validate.io-array@npm:1.0.6" - checksum: 8/54eca83ebc702e3e46499f9d9e77287a95ae25c4e727cd2fafee29c7333b3a36cca0c5d8f090b9406262786de80750fba85e7e7ef41e20bf8cc67d5570de449b + checksum: 54eca83ebc702e3e46499f9d9e77287a95ae25c4e727cd2fafee29c7333b3a36cca0c5d8f090b9406262786de80750fba85e7e7ef41e20bf8cc67d5570de449b languageName: node linkType: hard "validate.io-function@npm:^1.0.2": version: 1.0.2 resolution: "validate.io-function@npm:1.0.2" - checksum: 8/e4cce2479a20cb7c42e8630c777fb107059c27bc32925f769e3a73ca5fd62b4892d897b3c80227e14d5fcd1c5b7d05544e0579d63e59f14034c0052cda7f7c44 + checksum: e4cce2479a20cb7c42e8630c777fb107059c27bc32925f769e3a73ca5fd62b4892d897b3c80227e14d5fcd1c5b7d05544e0579d63e59f14034c0052cda7f7c44 languageName: node linkType: hard @@ -5912,7 +7017,7 @@ __metadata: dependencies: validate.io-array: "npm:^1.0.3" validate.io-integer: "npm:^1.0.4" - checksum: 8/5f6d7fab8df7d2bf546a05e830201768464605539c75a2c2417b632b4411a00df84b462f81eac75e1be95303e7e0ac92f244c137424739f4e15cd21c2eb52c7f + checksum: 5f6d7fab8df7d2bf546a05e830201768464605539c75a2c2417b632b4411a00df84b462f81eac75e1be95303e7e0ac92f244c137424739f4e15cd21c2eb52c7f languageName: node linkType: hard @@ -5921,14 +7026,61 @@ __metadata: resolution: "validate.io-integer@npm:1.0.5" dependencies: validate.io-number: "npm:^1.0.3" - checksum: 8/88b3f8bb5a5277a95305d64abbfc437079220ce4f57a148cc6113e7ccec03dd86b10a69d413982602aa90a62b8d516148a78716f550dcd3aff863ac1c2a7a5e6 + checksum: 88b3f8bb5a5277a95305d64abbfc437079220ce4f57a148cc6113e7ccec03dd86b10a69d413982602aa90a62b8d516148a78716f550dcd3aff863ac1c2a7a5e6 languageName: node linkType: hard "validate.io-number@npm:^1.0.3": version: 1.0.3 resolution: "validate.io-number@npm:1.0.3" - checksum: 8/42418aeb6c969efa745475154fe576809b02eccd0961aad0421b090d6e7a12d23a3e28b0d5dddd2c6347c1a6bdccb82bba5048c716131cd20207244d50e07282 + checksum: 42418aeb6c969efa745475154fe576809b02eccd0961aad0421b090d6e7a12d23a3e28b0d5dddd2c6347c1a6bdccb82bba5048c716131cd20207244d50e07282 + languageName: node + linkType: hard + +"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 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:^6.0.0": + version: 6.0.0 + resolution: "vscode-jsonrpc@npm:6.0.0" + checksum: 3a67a56f287e8c449f2d9752eedf91e704dc7b9a326f47fb56ac07667631deb45ca52192e9bccb2ab108764e48409d70fa64b930d46fc3822f75270b111c5f53 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:^3.17.0": + version: 3.17.5 + resolution: "vscode-languageserver-protocol@npm:3.17.5" + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + checksum: dfb42d276df5dfea728267885b99872ecff62f6c20448b8539fae71bb196b420f5351c5aca7c1047bf8fb1f89fa94a961dce2bc5bf7e726198f4be0bb86a1e71 + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-types@npm:3.17.5" + checksum: 79b420e7576398d396579ca3a461c9ed70e78db4403cd28bbdf4d3ed2b66a2b4114031172e51fad49f0baa60a2180132d7cb2ea35aa3157d7af3c325528210ac + languageName: node + linkType: hard + +"vscode-ws-jsonrpc@npm:~1.0.2": + version: 1.0.2 + resolution: "vscode-ws-jsonrpc@npm:1.0.2" + dependencies: + vscode-jsonrpc: ^8.0.2 + checksum: eb2fdb5c96f124326505f06564dfc6584318b748fd6e39b4c0ba16a0d383d13ba0e9433596abdb841428dfc2a5501994c3206723d1cb38c6af5fcac1faf4be26 + languageName: node + linkType: hard + +"w3c-keyname@npm:^2.2.4": + version: 2.2.8 + resolution: "w3c-keyname@npm:2.2.8" + checksum: 95bafa4c04fa2f685a86ca1000069c1ec43ace1f8776c10f226a73296caeddd83f893db885c2c220ebeb6c52d424e3b54d7c0c1e963bbf204038ff1a944fbb07 languageName: node linkType: hard @@ -5938,14 +7090,14 @@ __metadata: dependencies: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.1.2" - checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 + checksum: 92d9d52ce3d16fd83ed6994d1dd66a4d146998882f4c362d37adfea9ab77748a5b4d1e0c65fa104797928b2d40f635efa8f9b925a6265428a69f1e1852ca3441 languageName: node linkType: hard "webidl-conversions@npm:^6.1.0": version: 6.1.0 resolution: "webidl-conversions@npm:6.1.0" - checksum: 8/1f526507aa491f972a0c1409d07f8444e1d28778dfa269a9971f2e157182f3d496dc33296e4ed45b157fdb3bf535bb90c90bf10c50dcf1dd6caacb2a34cc84fb + checksum: 1f526507aa491f972a0c1409d07f8444e1d28778dfa269a9971f2e157182f3d496dc33296e4ed45b157fdb3bf535bb90c90bf10c50dcf1dd6caacb2a34cc84fb languageName: node linkType: hard @@ -5977,7 +7129,7 @@ __metadata: optional: true bin: webpack-cli: bin/cli.js - checksum: 8/3a4ad0d0342a6815c850ee4633cc2a8a5dae04f918e7847f180bf24ab400803cf8a8943707ffbed03eb20fe6ce647f996f60a2aade87b0b4a9954da3da172ce0 + checksum: 3a4ad0d0342a6815c850ee4633cc2a8a5dae04f918e7847f180bf24ab400803cf8a8943707ffbed03eb20fe6ce647f996f60a2aade87b0b4a9954da3da172ce0 languageName: node linkType: hard @@ -5987,7 +7139,7 @@ __metadata: dependencies: clone-deep: "npm:^4.0.1" wildcard: "npm:^2.0.0" - checksum: 8/64fe2c23aacc5f19684452a0e84ec02c46b990423aee6fcc5c18d7d471155bd14e9a6adb02bd3656eb3e0ac2532c8e97d69412ad14c97eeafe32fa6d10050872 + checksum: 64fe2c23aacc5f19684452a0e84ec02c46b990423aee6fcc5c18d7d471155bd14e9a6adb02bd3656eb3e0ac2532c8e97d69412ad14c97eeafe32fa6d10050872 languageName: node linkType: hard @@ -5997,18 +7149,18 @@ __metadata: dependencies: source-list-map: "npm:^2.0.0" source-map: "npm:~0.6.1" - checksum: 8/37463dad8d08114930f4bc4882a9602941f07c9f0efa9b6bc78738cd936275b990a596d801ef450d022bb005b109b9f451dd087db2f3c9baf53e8e22cf388f79 + checksum: 37463dad8d08114930f4bc4882a9602941f07c9f0efa9b6bc78738cd936275b990a596d801ef450d022bb005b109b9f451dd087db2f3c9baf53e8e22cf388f79 languageName: node linkType: hard "webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" - checksum: 8/989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 + checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 languageName: node linkType: hard -"webpack@npm:^5.76.1": +"webpack@npm:^5.76.1, webpack@npm:^5.95.0": version: 5.95.0 resolution: "webpack@npm:5.95.0" dependencies: @@ -6040,14 +7192,14 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/b9e6d0f8ebcbf0632494ac0b90fe4acb8f4a9b83f7ace4a67a15545a36fe58599c912ab58e625e1bf58ab3b0916c75fe99da6196d412ee0cab0b5065edd84238 + checksum: 0c3dfe288de4d62f8f3dc25478a618894883cab739121330763b7847e43304630ea2815ae2351a5f8ff6ab7c9642caf530d503d89bda261fe2cd220e524dd5d1 languageName: node linkType: hard "whatwg-mimetype@npm:^2.3.0": version: 2.3.0 resolution: "whatwg-mimetype@npm:2.3.0" - checksum: 8/23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 + checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 languageName: node linkType: hard @@ -6058,7 +7210,7 @@ __metadata: lodash: "npm:^4.7.0" tr46: "npm:^2.1.0" webidl-conversions: "npm:^6.1.0" - checksum: 8/a87abcc6cefcece5311eb642858c8fdb234e51ec74196bfacf8def2edae1bfbffdf6acb251646ed6301f8cee44262642d8769c707256125a91387e33f405dd1e + checksum: a87abcc6cefcece5311eb642858c8fdb234e51ec74196bfacf8def2edae1bfbffdf6acb251646ed6301f8cee44262642d8769c707256125a91387e33f405dd1e languageName: node linkType: hard @@ -6071,7 +7223,52 @@ __metadata: is-number-object: "npm:^1.0.4" is-string: "npm:^1.0.5" is-symbol: "npm:^1.0.3" - checksum: 8/53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.1.3": + version: 1.1.4 + resolution: "which-builtin-type@npm:1.1.4" + dependencies: + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 + is-async-function: ^2.0.0 + is-date-object: ^1.0.5 + is-finalizationregistry: ^1.0.2 + is-generator-function: ^1.0.10 + is-regex: ^1.1.4 + is-weakref: ^1.0.2 + isarray: ^2.0.5 + which-boxed-primitive: ^1.0.2 + which-collection: ^1.0.2 + which-typed-array: ^1.1.15 + checksum: 1f413025250072534de2a2ee25139a24d477512b532b05c85fb9aa05aef04c6e1ca8e2668acf971b777e602721dbdec4b9d6a4f37c6b9ff8f026ad030352707f + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + 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" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.2 + checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 languageName: node linkType: hard @@ -6082,7 +7279,7 @@ __metadata: isexe: "npm:^2.0.0" bin: which: ./bin/which - checksum: 8/f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 languageName: node linkType: hard @@ -6093,14 +7290,14 @@ __metadata: isexe: "npm:^2.0.0" bin: node-which: ./bin/node-which - checksum: 8/1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 languageName: node linkType: hard "wildcard@npm:^2.0.0": version: 2.0.0 resolution: "wildcard@npm:2.0.0" - checksum: 8/1f4fe4c03dfc492777c60f795bbba597ac78794f1b650d68f398fbee9adb765367c516ebd4220889b6a81e9626e7228bbe0d66237abb311573c2ee1f4902a5ad + checksum: 1f4fe4c03dfc492777c60f795bbba597ac78794f1b650d68f398fbee9adb765367c516ebd4220889b6a81e9626e7228bbe0d66237abb311573c2ee1f4902a5ad languageName: node linkType: hard @@ -6112,29 +7309,18 @@ __metadata: schema-utils: "npm:^3.0.0" peerDependencies: webpack: ^4.0.0 || ^5.0.0 - checksum: 8/84f4a7eeb2a1d8b9704425837e017c91eedfae67ac89e0b866a2dcf283323c1dcabe0258196278b7d5fd0041392da895c8a0c59ddf3a94f1b2e003df68ddfec3 + checksum: 84f4a7eeb2a1d8b9704425837e017c91eedfae67ac89e0b866a2dcf283323c1dcabe0258196278b7d5fd0041392da895c8a0c59ddf3a94f1b2e003df68ddfec3 languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: ansi-styles: "npm:^4.0.0" string-width: "npm:^4.1.0" strip-ansi: "npm:^6.0.0" - checksum: 8/a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 8/6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b languageName: node linkType: hard @@ -6145,14 +7331,25 @@ __metadata: ansi-styles: "npm:^6.1.0" string-width: "npm:^5.0.1" strip-ansi: "npm:^7.0.1" - checksum: 8/371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrap-ansi@npm:^9.0.0": + version: 9.0.0 + resolution: "wrap-ansi@npm:9.0.0" + dependencies: + ansi-styles: ^6.2.1 + string-width: ^7.0.0 + strip-ansi: ^7.1.0 + checksum: b2d43b76b3d8dcbdd64768165e548aad3e54e1cae4ecd31bac9966faaa7cf0b0345677ad6879db10ba58eb446ba8fa44fb82b4951872fd397f096712467a809f languageName: node linkType: hard "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" - checksum: 8/159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 languageName: node linkType: hard @@ -6160,9 +7357,9 @@ __metadata: version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" dependencies: - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^4.0.1" - checksum: 8/8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9 + imurmurhash: ^0.1.4 + signal-exit: ^4.0.1 + checksum: 8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9 languageName: node linkType: hard @@ -6177,7 +7374,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 languageName: node linkType: hard @@ -6186,43 +7383,45 @@ __metadata: resolution: "y-protocols@npm:1.0.5" dependencies: lib0: "npm:^0.2.42" - checksum: 8/d19404a4ebafcf3761c28b881abe8c32ab6e457db0e5ffc7dbb749cbc2c3bb98e003a43f3e8eba7f245b2698c76f2c4cdd1c2db869f8ec0c6ef94736d9a88652 + checksum: d19404a4ebafcf3761c28b881abe8c32ab6e457db0e5ffc7dbb749cbc2c3bb98e003a43f3e8eba7f245b2698c76f2c4cdd1c2db869f8ec0c6ef94736d9a88652 languageName: node linkType: hard "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" - checksum: 8/343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 languageName: node linkType: hard -"yaml@npm:^2.1.1": - version: 2.2.2 - resolution: "yaml@npm:2.2.2" - checksum: 8/d90c235e099e30094dcff61ba3350437aef53325db4a6bcd04ca96e1bfe7e348b191f6a7a52b5211e2dbc4eeedb22a00b291527da030de7c189728ef3f2b4eb3 +"yaml@npm:~2.5.0": + version: 2.5.1 + resolution: "yaml@npm:2.5.1" + bin: + yaml: bin.mjs + checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 languageName: node linkType: hard "yargs-parser@npm:^20.2.9": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" - checksum: 8/8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 languageName: node linkType: hard "yjs@npm:^13.5.40": - version: 13.6.7 - resolution: "yjs@npm:13.6.7" + version: 13.6.20 + resolution: "yjs@npm:13.6.20" dependencies: - lib0: "npm:^0.2.74" - checksum: 8/8e89257c8b565ab97cf3354fca2ce0b6bc3d1abe90b9d45a218a94b35da372c88d2411b353ed8ca03a6619004c4da76c96f7c203c38506c3758c9f8c1a730ca4 + lib0: ^0.2.98 + checksum: a87295efe7df58ae8b5cf09b7cdbbcc3cbfba2b7fb72bb424513eb25587eff8dc8304f41e3bcd3926c02c86a0f7ce2185285e4b9d71aca5ff50cefe1ecb6657c languageName: node linkType: hard "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" - checksum: 8/f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard