From 50cb2977f465c0e28b3b4d7c1333b46b755db88b Mon Sep 17 00:00:00 2001 From: Sigmar Stefansson Date: Fri, 15 Mar 2024 13:46:46 +0000 Subject: [PATCH] Bgd 4696 4.1.x ocean (#20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate (#15750) * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/python-jsonschema/check-jsonschema: 0.27.3 → 0.27.4](https://github.com/python-jsonschema/check-jsonschema/compare/0.27.3...0.27.4) - [github.com/astral-sh/ruff-pre-commit: v0.1.15 → v0.2.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.15...v0.2.0) * Align ruff version in `pyproject.toml` with pre-commit --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: krassowski <5832902+krassowski@users.noreply.github.com> * Catch OSError in addition to PermissionError when sys_prefix is read-only. (#15461) (#15756) * Fix failing "Notebook Toolbar › Paste cell" test (#15720) * Paste zeroth rather than first cell as that has less content which solve the issue of cell toolbar not appearing * Update Playwright Snapshots --------- Co-authored-by: github-actions[bot] * Add post-mortem for 3.6.7 release (#15743) * Update maintainers affiliation (#15724) * Update maintainers affiliation * Update Mike's affiliation --------- Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Fix outputs preservation on splitting cells (#15751) * Add unit test for splitting cell preserving output * Preserve code cell outputs in the last cell on split * Fix migration of multiple command selectors (#15762) Previously only first selector occurrence would be migrated due to warning check being positioned incorrectly * Disable (shift + )alt + number shortcuts on Mac (#15761) * Update changelog to reflect jupyter-ai release, (#15775) and pick some grammar/wording suggestions from Jason Co-authored-by: Jason Weill <93281816+JasonWeill@users.noreply.github.com> * Update lifecycle info for JupyterLab major versions (#15626) * Update lifecycle info * Update overview.rst * Create lifecycle.rst * Use list table * Header rows in lifecycle table * Update lifecycle.rst Reverts parameter which was not honored in build * Adds link to lifecycle from contributor docs, adds note for Lab 3 timing * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix link syntax * Fix link destination and style --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fix completer auto-invoking on non-source changes (#15753) * Add a test for completer not invoking on non-source changes * Filter shared model `changed` signal before invoking `onTextChanged` * Move comment and use more explicit typing/explanation * Fix a failing test that was demonstrating incorrect behaviour because it was expecting `handleTextChange` to be called when an empty signal is emitted * Update `jupyter-collaboration` for the Binder environment (#15767) * Fix console cells not becoming read-only after execution (#15779) * Add test for console cells becoming readonly on execution There is both a unit test and an integration test because the unit test is not able to catch the race condition related to signal clearance, nor check the visibility of the cursor. * Process cell's update before disconnecting its signals, fixing `readOnly` config (handled in `Cell.onUpdateRequest`) not getting properly propagated to the CodeMirror editor. * Fix specificity of readonly style * Use idle callback instead of flushing, because flushing has side effects on other messages and lead to the input of the next cell not being properly focused as caught by visual regression tests. * Add Edge, remove IE 11 (#15784) * Fix undo/redo in console, fix undo/redo enabled state in file editor (#15783) * Fix undo and redo in console by making the console jp-undoer and adding respective commands; this also fixes undo/redo being permanently disabled for console in the edit menu. * Use `canUndo`/`canRedo` in file editor too * Add tests for console context menus * Move undo/redo to above "Show Contextual Help" to align with where undo/redo is in the file editor and notebook (relative to "Show" commands). * Update the file editor context menu snapshot; both undo/redo are now greyed out as disabled because the undo/redo stacks are empty as not edits were introduced yet to the file. Previously they were incorrectly permanently active, confusing the user. * Add snapshots for console context menus * Move the undo/redo bindings up in the schema file * Correct Alt + number keyboard shortcuts command map (#15791) * keyboard shortcuts mapped to correct functionality * Update packages/application-extension/schema/commands.json Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> * Update packages/application-extension/schema/commands.json Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> --------- Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> * catch errors attempting to access document.cookie (#15788) behave as if cookie is empty accessing `document.cookie` can raise SecurityError if page is served by `Content-Security-Policy: sandbox` * [ci skip] Publish 4.1.1 SHA256 hashes: jupyterlab-4.1.1-py3-none-any.whl: fa3e8c18b804eac04e51ceebd9dd3dd396e08106816f0d09cc426799d7087632 jupyterlab-4.1.1.tar.gz: 8acc9f561729d8f32c14c294c397917cddfeeb13a5d46f811979b71b4911a9fd jupyterlab-application-4.1.1.tgz: aa3f2efac69e745d7161d73ee8184de11f2cb671f114500afab3ddc989bb0e82 jupyterlab-application-extension-4.1.1.tgz: 839f6b303115a10e4ffb6ece28a950114c6b773d69327a1e85a6c374e37acffc jupyterlab-apputils-4.2.1.tgz: 45205867a79e10d75e34eea9f4b001caaa1d10053a65cbd9d38eaefe0392ecc8 jupyterlab-apputils-extension-4.1.1.tgz: 5cd0f2be97ce7ee64739a5dcc291ceaaa0cebaa739781ed8e2fae66d8cd22663 jupyterlab-attachments-4.1.1.tgz: 4f5d026ed0cb679abb7003b975120466b1d4d00c2fedf4ca345e7efe2688a7ab jupyterlab-builder-4.1.1.tgz: ea8c06ed3e249714fad9ac191b8f1121676f7546094713f9ff22a21726573873 jupyterlab-buildutils-4.1.1.tgz: 2240e97e747d336dbba106ccc835da7efdb1fae471089b81fba270cb38392057 jupyterlab-cell-toolbar-4.1.1.tgz: 3b5b0a271c4c835e018b7efa1b33a3ea15c85782f9ce8ac63cd915c23facb0ef jupyterlab-cell-toolbar-extension-4.1.1.tgz: bdd783abfb7ce8bbc4a15b1af78291916b1de1aa2397e09dd35d19a99ef06701 jupyterlab-cells-4.1.1.tgz: 8a17bc081aabd26fe1a0bc388805ae406f5da33c56df67ba898867581fb57a89 jupyterlab-celltags-extension-4.1.1.tgz: 6904b5b16097e084ed646f65b3ce461a4f4290cc99a3001abb68bb2289cd1a96 jupyterlab-codeeditor-4.1.1.tgz: 2855d569a0d2e047bf458ef2343d1bfd9b46429168df9cd0257ef5afed1b03bc jupyterlab-codemirror-4.1.1.tgz: b76c2a11cdb900552b4cec5b9881cb152e9212c2fc6cc1df09fac0b7b155e092 jupyterlab-codemirror-extension-4.1.1.tgz: 83bd0c4277aaa3c5ae71364382bc9404ccb102aca2ec3dfd11254d14ce24998a jupyterlab-completer-4.1.1.tgz: 73e5a3b76b9a122128db4b1ffb788adc8c150dec951f4339f1cde838d0343e39 jupyterlab-completer-extension-4.1.1.tgz: f4d107c105237e26d1c2fb71f3f6f43f6857e22949b0b320d82164113b7efa92 jupyterlab-console-4.1.1.tgz: e92cf866e8269950546ef138e0f003c70ec75360f517a7428fddc3cdcb0e764c jupyterlab-console-extension-4.1.1.tgz: 8845bc2abcbdf4e52dd31263797161da42b79c117ad84624e5ab6183f8fda0da jupyterlab-coreutils-6.1.1.tgz: db6751b61c50a1ea84bf85cf6d05d283ef35d434d59b2c8927cf4686eae9e5e4 jupyterlab-csvviewer-4.1.1.tgz: 0577a09bd0551999e1c8c82f22dc7c136c7d69dbb971e9498b65aa303a5191ea jupyterlab-csvviewer-extension-4.1.1.tgz: 5c836ee987ac13e4c2c928486e4ba3f5088a54433aa3410d92bc21c2f7e77677 jupyterlab-debugger-4.1.1.tgz: 3c13838e8456d385d3abc6865867033d6c15a2675d7eb3ee19ac978867782604 jupyterlab-debugger-extension-4.1.1.tgz: 1183ee08bf654acfa1e1fe93ce6359a1765fc6700016bd6ab0c00246e9448cc1 jupyterlab-docmanager-4.1.1.tgz: 43bc326e862e8d3b0da5a8105b503ad9e186ad4f948c10f844bb21d75058a5ca jupyterlab-docmanager-extension-4.1.1.tgz: 269c8cf67af271728f8a79e9144d190307226f88f5b31fcb962156ca73dde2ce jupyterlab-docregistry-4.1.1.tgz: 42351198e720ce633a3aaef6ceb0b6ef5bde6c831c12a6f921e8a2ce929b534c jupyterlab-documentsearch-4.1.1.tgz: 3f7e7be0c7bb86e74c6c8840005f035482818697a5c8f0d51babb3e25bde26f0 jupyterlab-documentsearch-extension-4.1.1.tgz: 57c7bedf806a2952252306cc004ab7d613940d0da66374eef8568be7a96d7220 jupyterlab-extensionmanager-4.1.1.tgz: 3fa68ed4325db7bb10c069945dfd5902d69a0258eb8fd2b3ca85f4888e655d6e jupyterlab-extensionmanager-extension-4.1.1.tgz: 1a8af05858a93b645e582f8ce17122b4fec61516471ea77f68fbf8cce8942bbb jupyterlab-filebrowser-4.1.1.tgz: 88b8f16194c23671c02755d8de34eeb1948b467f5202e0a174abe0b0db760cc1 jupyterlab-filebrowser-extension-4.1.1.tgz: d5d91e8d14199d38e8d7856aa93bd5f109265784d8aa7fe5456ba0ad62e1576c jupyterlab-fileeditor-4.1.1.tgz: c51e04757667a1740513522fb7557c76005573165faba53f9c493bc9159b9b9c jupyterlab-fileeditor-extension-4.1.1.tgz: c9af805baa90db5c3c011b0c99bf13e0143be40413e60ad3b87b93a6bd790dd7 jupyterlab-galata-5.1.1.tgz: c66516225458a1fe92212a2eacdf2d8ab2bf4a286197154c92f610da96a760b5 jupyterlab-help-extension-4.1.1.tgz: daae3a0b09fa1f324b0ad0b1f8de2eb9533485213ed2139b73a80674b15c9be1 jupyterlab-htmlviewer-4.1.1.tgz: 60d78c6136d1a40bc0d12673cfd8d66b71307287f8729f9b96bcba61aa8c5227 jupyterlab-htmlviewer-extension-4.1.1.tgz: 5521351ecbe355231ae86ffa49edd511babf5f8cfc3da3e2b1f72d2365aac67e jupyterlab-hub-extension-4.1.1.tgz: 0e22e9cb4d919191d8f0eac945cf21e1c1c8d961a4cafdc10726a4da82b19c12 jupyterlab-imageviewer-4.1.1.tgz: f47375a4ce9cea58c3f62a811de98be6620c05d59fd7ec00c51fef576146c2ea jupyterlab-imageviewer-extension-4.1.1.tgz: 6d444d91cda711c0c84c4909262f8c0be97f1315fb0b53cd620efc4ebad6474c jupyterlab-inspector-4.1.1.tgz: 6bd46afbc9fdb04d6332b3843daddcda483fa8f6474fc6de0fca150f6ebf8636 jupyterlab-inspector-extension-4.1.1.tgz: 372a8bc839f3569bfac1b246ed944da4fd9a7d239a4e70d91d257ec92eff2a6b jupyterlab-javascript-extension-4.1.1.tgz: 6b8bac0fe67b3b0a6b2bdc07ad4ecf8c1d481215b0371924b66c2e12749b2268 jupyterlab-json-extension-4.1.1.tgz: a2545d4a63bd5c697175ffdcd675f6299fc72d8e7b52045aed2b404b78cc1a97 jupyterlab-launcher-4.1.1.tgz: f74e768e954f0d0b922678f3b79b94c089bf3520f12a5baa18b41b56e83495a0 jupyterlab-launcher-extension-4.1.1.tgz: 8d9eae718e518b27b4696f9c1337e2ac24d98d700643377418cb1965b146fcfa jupyterlab-logconsole-4.1.1.tgz: 3e1242cac2aaaa41ea78a9fbd8af6ff3835f869bf902cab7dec91955ff3804fa jupyterlab-logconsole-extension-4.1.1.tgz: 249d96c7c9792bbaa6759575ce160054e9df87f5a21c31bbf7498f754ce12fa6 jupyterlab-lsp-4.1.1.tgz: edf63ffe4cf3efd29402375eb7fcd9e5c7924b06d6e1c5c5789aca02d5ae5fe7 jupyterlab-lsp-extension-4.1.1.tgz: 790432c026586cdf42c713ce5ce9257492c5ad37eb2d741b1acc96d49e5aa038 jupyterlab-mainmenu-4.1.1.tgz: 9276b9dff4f7fb623cb65f7768f0ea77864440341ee34e48cdf0200cd5e8652f jupyterlab-mainmenu-extension-4.1.1.tgz: 83a27379c9f6009de0949d4ada65a262ea4ccee1d16166d057af5a16668d0733 jupyterlab-markdownviewer-4.1.1.tgz: b381c0b78bce24ad64ec3f00e2e3159b340e0241550169b93589305d09784dac jupyterlab-markdownviewer-extension-4.1.1.tgz: a654ff44f97e9b82a18a5a3c44933ec806c25c088f765fe8996b1934773d48a7 jupyterlab-markedparser-extension-4.1.1.tgz: 31f6b06099093986b648f1b49938a7d1bce29b460a5d8d2971b656aaaf240597 jupyterlab-mathjax-extension-4.1.1.tgz: 20a20fa51fed979fe3d935683e2d4a2de514c4dda761a4b724982a3acf2b62af jupyterlab-mermaid-4.1.1.tgz: 9b127fff2a43a7b83fe93df529e509ea1c6689e78608aa59150e0588cb9a90dc jupyterlab-mermaid-extension-4.1.1.tgz: de7ba6c792dbe2ecb2a5b3a92a5fd220350c56345b9dc6168e1509f5a00b3a6f jupyterlab-metadataform-4.1.1.tgz: 45db242fde9481aa3cec1e1d44fbea9e88dfd497c3b864b6a78ce174548c246d jupyterlab-metadataform-extension-4.1.1.tgz: 5cd5ef4bd5e02b454630e76d0d64f7d47dbc6fb502568baedc55c763139330b1 jupyterlab-metapackage-4.1.1.tgz: 4c9624fc036fd5d3218c3af812729e16f11e65b3bd59bd89ac07b16ce4b4a667 jupyterlab-nbconvert-css-4.1.1.tgz: 57ae599479dcba12d2fee7da54c370d8e05f096265c4ad473286ed40590b4498 jupyterlab-nbformat-4.1.1.tgz: 3dab1c2a636b3a64593a992e3d6330afd4739aa168681b5be0593c57c4548f7d jupyterlab-notebook-4.1.1.tgz: 53b882097d9373a8b5dc687b55f08f71f9826449ed30721a208446346b90d043 jupyterlab-notebook-extension-4.1.1.tgz: 66d7e35d754468895059eef2bd5c8df21088e1167dc22dbd4a290183ccc08256 jupyterlab-observables-5.1.1.tgz: 05ce4523ac2e70d99e632eb1a49273cbd716176e7ebe6a91a6a4cac1326563f6 jupyterlab-outputarea-4.1.1.tgz: 92e23e76307c366facc1e96fdca8f4972f2a8bc95d720590f378635dec4543b7 jupyterlab-pdf-extension-4.1.1.tgz: 342b9e9b231b02ed26bba655d9e379073e8ae10f8529b6f1ca7c7bbad0d4157d jupyterlab-pluginmanager-4.1.1.tgz: d2e4ae06ebd700a2f2d4f77b939b956aab4d355eba1160802eafcf739c14d5fa jupyterlab-pluginmanager-extension-4.1.1.tgz: 92b0466c9ffd5c7542395bf829bcb606db67e730fad4671302a8e0eebc3de9a2 jupyterlab-property-inspector-4.1.1.tgz: 1ee14b99e7783558280aea8f653b20821b9f1cb6e3e8ae5938b63c5edb73ef75 jupyterlab-rendermime-4.1.1.tgz: ab3a34ce95c4323de9cdcabb67843678f2f6734c1e54d18be065948848490445 jupyterlab-rendermime-extension-4.1.1.tgz: 9cc6359a7ae52dad78b0b63fe83092e584a78686faf53794c85391501f558d73 jupyterlab-rendermime-interfaces-3.9.1.tgz: eb919c9029a2ab50d59871f281e583ac58eeafbcdee0890fa973b5be110a5dad jupyterlab-running-4.1.1.tgz: 6dadcc922c2ca2b0266d0750c33a552ff427f8ab3b5d25cec81e90b736a4907a jupyterlab-running-extension-4.1.1.tgz: dcaf499796fcccd41b35fde89a7a3e9f3cbb75416d690fc96386561038da3c12 jupyterlab-services-7.1.1.tgz: 7da9e46913508c631180de551fb991bee04ad958dbcd5f493210c36805ee9be2 jupyterlab-settingeditor-4.1.1.tgz: a2e95b70edcda434c3c2c66536e086b9099c822310e34a296af66b660b36e30c jupyterlab-settingeditor-extension-4.1.1.tgz: 2b2d4e7eff0ac7ff8f1e950f328a274ebf70391d5c28240eff18d33944ded440 jupyterlab-settingregistry-4.1.1.tgz: 3aa25ee1b8bd835cf99b5e9b79568eea6fae862b94c3679f3289cde23cbdd9bf jupyterlab-shortcuts-extension-4.1.1.tgz: 301274b34898da7b4912724f47a786439bf237680c0a1fbb784279566c4dfd47 jupyterlab-statedb-4.1.1.tgz: 0e980f9a7b8f08742f46a2a56ba948d532e8d91645df88f8d6c58e6938373607 jupyterlab-statusbar-4.1.1.tgz: c4d57cc843889570a4931965211cec84c88c6a7cf7ba9d936b45f054697928b0 jupyterlab-statusbar-extension-4.1.1.tgz: a795b2b9a2b7a832648aeb296aad39fbe7aaa64b3f468bdc125b451bff38152e jupyterlab-template-4.1.1.tgz: eac83d02f467a79689833b9fdea4e10afd9997713e13789dc753d8f5b000ce47 jupyterlab-terminal-4.1.1.tgz: c6c06b3b448a34576bef21d9f595f35f41528199dabb1ff19397b3782b65c056 jupyterlab-terminal-extension-4.1.1.tgz: 1c1230e7520f8dc70d133d674c19f7de45c48c5eb5b2bc5e7486dec42782aefd jupyterlab-testing-4.1.1.tgz: 7c41cad751d0f02cb48fc3a482451744a0b382e97695fec1b27570c000331fb9 jupyterlab-testutils-4.1.1.tgz: 344cd6571aa3b49b61d2f30ce3ea48d351d6f9178926284860c8e718b45fc8f7 jupyterlab-theme-dark-extension-4.1.1.tgz: 8ab1994dfd0e503837a135a945927b130aa3fa0ded2f0d2c85359fb86af08593 jupyterlab-theme-light-extension-4.1.1.tgz: e03910d86338286f75ee6a31637a35b10694852859afd04f5b6f84c7124bcca7 jupyterlab-toc-6.1.1.tgz: 7eabe7c0f0bb6f2c2ca6a3b18a080d9cb3fdd816aade250051416b692adc66d6 jupyterlab-toc-extension-6.1.1.tgz: 34577ef603b5e6878180bdc57c26dd4e4779865cf198592436808b9cae8e4e9c jupyterlab-tooltip-4.1.1.tgz: 592137d9644c93eaa51768c98a63796ef5dc913ddf1014e28a99783963593362 jupyterlab-tooltip-extension-4.1.1.tgz: 129713d8897ff2b4a91f0966558bd55bdad9cf0176b0cdd9d8c6d846c3fcf7b5 jupyterlab-translation-4.1.1.tgz: 9fe00d9b6b41f8a738be1d70ff43b040f93f30860c690d14c026700d68c7af9f jupyterlab-translation-extension-4.1.1.tgz: 56c102d6681e4cdc64ebb6696eb783fb7a105466e7e4dccd6cc7aefa233c77d1 jupyterlab-ui-components-4.1.1.tgz: 1b8b46308235a9f27cf6d6a0f0c54c6876006ff82f48a32ad518b427b659dbad jupyterlab-ui-components-extension-4.1.1.tgz: 4cf6f77101a6a240518cc1d90b19e43c83c2782a5dc87777109e02fc35e2f4c8 jupyterlab-vega5-extension-4.1.1.tgz: c41c14181f5689c193d9ff84af1d9d4ebe3759fb5c8ce9e8d226c80c4911c792 * Fix outdated link to mybinder.org on index page of documentation (#15800) This PR is in response to #15799 The current link "Try JupyterLab on Binder" on `index.rst` points to the commit https://github.com/jupyterlab/jupyterlab-demo/commit/3818244680a477cdead8182216f5c87e685e0bee which is not producing a valid binder image anymore. Here, the link is changed to point to HEAD, like in `README.md`, which yields a functioning binder session. * Restore notebook scrolling on dragging a cell to the viewport edge (#15782) * Test for notebook scrolling on dragging cell to an edge * Move `data-lm-dragscroll` to `.jp-WindowedPanel-outer` which has been the scroller node since the virtual scrollbar PR refactored the DOM structure of the notebook (in 4.1.0). * Fix typing in editable elements inside of open shadow DOM (#15774) * Add a test case for typing in an input in shadow DOM * Introduce `.jp-mod-readWrite` class exposing `:read-write` Contrarily to `:read-write` the new class can be used to detect the focus state of editable elements buried in the open shadow DOM. * Document keyboard interactions in outputs/`lm-suppress-shortcuts` * Implement `.jp-mod-readWrite` in console too, rename and move the utility function (`hasActiveEditableElement`) to DOMUtils as it is now used in both notebook and console, add tests for this function. * Keep the `:not(:read-write)` part on `[data-jp-kernel-user]` to err on the side of caution, as these could be used in donwstream widgets for which we do not control the DOM so these could lack the newly added `:not(.jp-mod-readWrite)` * Fix a typo in a test file * Align the selector migration rule * Use `toggle` to simplify the code Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: gabalafou * Correct TODO comment Co-authored-by: gabalafou * Fix hanging bracket --------- Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> Co-authored-by: gabalafou * Fix highlight sequencing when replacing text in code cells (#15803) * Fix typo in comment * Fix currentIndex logic when replacing search match * Additional test for selection in mid-cell * Tests code cells specifically * Lint fixes * Isolates code cell mid-cell test * Update packages/codemirror/src/searchprovider.ts Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Simplifies logic, deferring to caller to call highlightNext --------- Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Windows platforms, erratic pasting of text into Markdown field (#15794) * Windows platforms, erratic pasting of text into Markdown field Due to different line ending in windows display and data got corrupted. Fixed by correcting paste handling of text in packages/cells/src/widgets.ts fixes: https://github.com/jupyterlab/jupyterlab/issues/14752 * Code formatting corrected. * Changed string delimiter. * Added carriage return replacement for pasteing on osx. * adjusted formating of code * Add a test for replacing line endings on paste Co-authored-by: Kilian Singer * Add mocks for `ClipboardEvent` and `DataTransfer` --------- Co-authored-by: krassowski <5832902+krassowski@users.noreply.github.com> * Remove SO links, add more recent issue to FAQ (#15811) * Remove SO links, add more recent issue to FAQ * Replace one more SO link with the direct link to MS docs * [docker] Allow non-unique GID (#15699) * Allow non-unique GID * update CI * Update context path * Update dependencies * [ci skip] Publish 4.1.2 SHA256 hashes: jupyterlab-4.1.2-py3-none-any.whl: aa88193f03cf4d3555f6712f04d74112b5eb85edd7d222c588c7603a26d33c5b jupyterlab-4.1.2.tar.gz: 5d6348b3ed4085181499f621b7dfb6eb0b1f57f3586857aadfc8e3bf4c4885f9 jupyterlab-application-4.1.2.tgz: 039480dd43c16349c56374620bf45263f1866d88974ded69ac6120702fbcaa2b jupyterlab-application-extension-4.1.2.tgz: a44dcfdd819cfa29bdd3a05ccfde5259ce63811b7ef5ae16c4203a4fc23f0631 jupyterlab-apputils-4.2.2.tgz: b8dd678092a5a7e2768f1105981fcfba8eab28d75979786c293cb70323cee374 jupyterlab-apputils-extension-4.1.2.tgz: c4543285be34502a75ca7051d2d5cbc75e6efbd64eeffe2ff722de09f71a70db jupyterlab-attachments-4.1.2.tgz: 9033a814396baee419503e06b58a58a6a8b7c2f25edc9877dbc20bf2d981432e jupyterlab-builder-4.1.2.tgz: 51a5a752f407bc792dc5dd6490fe15a0141e39c29b08634d81b51df1e57ef22f jupyterlab-buildutils-4.1.2.tgz: 0be9bbe548b6298f548325096b87b22876b4618f3eb468de5ee8cb96fef1f65f jupyterlab-cell-toolbar-4.1.2.tgz: 39583959afec75d70e684660454b895883bd75cdf167d4a00ed66f4c0cc60d53 jupyterlab-cell-toolbar-extension-4.1.2.tgz: 1c1658c95bb93280249113bc3c11868707bcc91af87c920588c9d76a47bf3252 jupyterlab-cells-4.1.2.tgz: 2cf2def9e76dcbc9c5e538f61e3ec32a5ed5108b035501d6debbdc6dcc1fbab4 jupyterlab-celltags-extension-4.1.2.tgz: f0e390a3594efdb97cdc4a8c6ecc9029a43203d2b1f559891481c705348481cd jupyterlab-codeeditor-4.1.2.tgz: 17ac6cb87697c00508c6e481837ec29ae05fe4443e5a742f293748ba9dad6187 jupyterlab-codemirror-4.1.2.tgz: a1526b37c33b1032440c929ab76d1b16ad1f9811aa715386dd750dea21f8c827 jupyterlab-codemirror-extension-4.1.2.tgz: 6f7be9930f61e1380c97be34ee83ea51046cb97c85d9500162ea47e99f6305ea jupyterlab-completer-4.1.2.tgz: fadeac4a331da58a0e840a659fa7ef3adcd73b9c0468019fee6f687228275bbf jupyterlab-completer-extension-4.1.2.tgz: a7608b892f5dd430e04ecb5a6fadad889eef44f3afd1bdc340514db9a272ac76 jupyterlab-console-4.1.2.tgz: 5eb461220b188cc0fde31540e788309d0484dda76ba04e7a227cc065d675b8d6 jupyterlab-console-extension-4.1.2.tgz: 1f7f8cc067c21566c2cc36437d3cc69a6165fad6aa4ea8f7f897288f16f21d7d jupyterlab-coreutils-6.1.2.tgz: bee3e239c7fed9d881394632e75572a4b10126aba8e5434ef5a05bb34dbf3af7 jupyterlab-csvviewer-4.1.2.tgz: 9034ff71b9d323dce0a554d80382d2ad78319d3774449bde87ff621f677c5c1f jupyterlab-csvviewer-extension-4.1.2.tgz: 616a2b21b02d33d4eb520f6beb7db6f65700d088feb09cad4a15b32f7d7bb5b9 jupyterlab-debugger-4.1.2.tgz: 573003d1be854cb96ef3203487fa6610ba40fbdd34bc2a08dc95138059978634 jupyterlab-debugger-extension-4.1.2.tgz: f8f88e9e7795129faffb35f7f025bc2e3d8cccf14af9084389351131ad67f200 jupyterlab-docmanager-4.1.2.tgz: f526e5a570c612197c356d37613a122f1e563ad5803ec9d21436cb4cdf6667fb jupyterlab-docmanager-extension-4.1.2.tgz: 6b890552d7061bcfdedfd14d9b5812f74aab1410f6b327231fcea0449a18ecb7 jupyterlab-docregistry-4.1.2.tgz: 5e80953b7c38adf74129fbc51b0470f841946d07644670a744566775553f4739 jupyterlab-documentsearch-4.1.2.tgz: cafef4a3e5591b7f6970b309ae7ac72c52e7214d4b8ee321092cd26574fdfa28 jupyterlab-documentsearch-extension-4.1.2.tgz: 18e0457cefa40c1933bd0845cf72425df4f841dd725dba599be80eef8ca72635 jupyterlab-extensionmanager-4.1.2.tgz: afa18023862d016bae31e05f6fc0a43e32ef2b1cbe606365aef82f9b9da5531e jupyterlab-extensionmanager-extension-4.1.2.tgz: 146028060199a377fd34262a5a59fb1bd4f94627241ffd6c3f297f86b5d151ef jupyterlab-filebrowser-4.1.2.tgz: b7d15880b1b4dbe46cdf4cbec183dea8b153872376f24c1f040d42f522e69178 jupyterlab-filebrowser-extension-4.1.2.tgz: ed547fe0a4ee92aa43c8874bc2d752caf1ace8121b3b3ceb3a204ae7a744fd9a jupyterlab-fileeditor-4.1.2.tgz: 07412c81f7e44e517896b0d0d9b90d7209669252f03e6097006383f7ba2d9c3c jupyterlab-fileeditor-extension-4.1.2.tgz: f41afcea4695457bf5f7e4c3e3df67fb38ebf669665467e715c122c0cea03ad4 jupyterlab-galata-5.1.2.tgz: 05d4d3288cb12728c16d35e9b6ad9aae4b016b8d471369cf56dd64a6d482c3b1 jupyterlab-help-extension-4.1.2.tgz: 7075c001c74465551eea8234d4a8ccff9f8fcd82a47f10dc3c3dd2d8a8bb012c jupyterlab-htmlviewer-4.1.2.tgz: a57d55ef72128f47c5b76784b570bed64efcaba760a1c6cbf45f9f5e4879732e jupyterlab-htmlviewer-extension-4.1.2.tgz: 2b0b2e4f811f054d30e6076bbad1a7776728a54fb23f04044f786a9407fa324e jupyterlab-hub-extension-4.1.2.tgz: fc9772e90ea805a86f24e850d9a115086906cf71c9615e66672410c7deec97ca jupyterlab-imageviewer-4.1.2.tgz: b9a5e02d53a539d02f25da483052a5ae91c99ac10583b8d50fce3973da439270 jupyterlab-imageviewer-extension-4.1.2.tgz: a2ba1833d66f4263ec05182f6c7d72f984a7addd9d7cda5f490f7bf25608c84b jupyterlab-inspector-4.1.2.tgz: a8bddf2732334af0530956d9e3da288523198fe3b1c1e1c06f5a8c544960c358 jupyterlab-inspector-extension-4.1.2.tgz: 0317e13d1ca95993116770266aadf3ff78818a5a2c4fd44e05b61267d9744f05 jupyterlab-javascript-extension-4.1.2.tgz: 98a78baa292510163904b592c311dcdee5c1ae9066476e4a96676e12df51e5be jupyterlab-json-extension-4.1.2.tgz: 6d1f640abae2b6068f93a15b73c2f44c1ad161ad7d605b74aa15165701013135 jupyterlab-launcher-4.1.2.tgz: 73c24ac180a2c8c8399b7af04f58e63c1f136d1fb25b3d4784921e58778834ad jupyterlab-launcher-extension-4.1.2.tgz: 29769c0582e63eacff8ce2f851713bfaff8fa20b86886855e06ccc5e447c3936 jupyterlab-logconsole-4.1.2.tgz: c4d930a65959d9887b2b4d67367422a1658299ec831063b96e8464c44c342ec1 jupyterlab-logconsole-extension-4.1.2.tgz: a7965acb16aa6859d5038728a9964389fbe4a5953e6795575e10b0df0aba45f6 jupyterlab-lsp-4.1.2.tgz: 44f521882d13c20181a2758ee8835ca25b906d98a1dcfe41afb4624090317cc6 jupyterlab-lsp-extension-4.1.2.tgz: 31291185b4465a707947543e89fdde29d145942697e96e32c79b8cd996154a56 jupyterlab-mainmenu-4.1.2.tgz: 7bfebec29c516712f7f3cd17df08cd7bf1f886bed09fbedcda932243d47efb27 jupyterlab-mainmenu-extension-4.1.2.tgz: ce4c4eac4047dd2bfc2a9cf957796c4a568e4b1716ddfef2c92e75831d7a835c jupyterlab-markdownviewer-4.1.2.tgz: 118bb9fb98a94cd1b0106266d3a3bfa655063dffe1863d7b212efb8e6326edb2 jupyterlab-markdownviewer-extension-4.1.2.tgz: ae5134fd2b3c6a0ddcdc1ff00f36af0bc838b36fb1b3ac21bc58aa6c928f51df jupyterlab-markedparser-extension-4.1.2.tgz: 9115b08776e68b490986a5f51d33af42dd398abeb5a8b477bfaa56240bd5e9fd jupyterlab-mathjax-extension-4.1.2.tgz: 5bd52b482407ca6519f5ab6057767dd4f49803b4732ce1143b3b5e831cbd6d62 jupyterlab-mermaid-4.1.2.tgz: 7732646b3431da0138425774f48ccf98bb7263e41d4eeae29747f843e1e52055 jupyterlab-mermaid-extension-4.1.2.tgz: 95d069b10459f136e249065221f4a890599731032a8f27e93d6f2f4e787846cc jupyterlab-metadataform-4.1.2.tgz: f8d5fee3d7e78a329632611ee27544bd426aead3b8735a2b67cc8303e8037ba6 jupyterlab-metadataform-extension-4.1.2.tgz: 169cb93a8bbc54686bf6984deaca982a951bb8ce121f6fe169de10d0d09a6d6d jupyterlab-metapackage-4.1.2.tgz: 8a5d67009d1d4e249f1965e4744964d091715e8868ae23fdd845301845b6ab3e jupyterlab-nbconvert-css-4.1.2.tgz: 9b8e439656815f55feec56f53df347dab4365f5a5f585c0bf7f88d0870dc706f jupyterlab-nbformat-4.1.2.tgz: 00e79edd05dd8d9ba602d58affca093075ef704d5955818fd260412683dbf788 jupyterlab-notebook-4.1.2.tgz: b95b75a5f6a5cd46eecd8680e632add1f2db1d50e62f3d03db72c819e68d75b9 jupyterlab-notebook-extension-4.1.2.tgz: a87694253d935a7ca89e747ae0a8ad20ef127cfcdb6c2a5a03d983bc62af6da1 jupyterlab-observables-5.1.2.tgz: ace2edfa34dba7fd34e085790780de7cde74d7455dbe7330ba1594fb6d2364c5 jupyterlab-outputarea-4.1.2.tgz: 0c16cb7111f8571e788eccd03fdb70cb7c76bb5f21b256ffbeb136df98c82056 jupyterlab-pdf-extension-4.1.2.tgz: 38fefdc623f733bd5c33dc240f8066b387a2652e053445892aa75ed6b6f0d6b5 jupyterlab-pluginmanager-4.1.2.tgz: a88e65164360d8cae3975925c5f7b4e1e3aa3e375be22d825e9d8acbad3f100a jupyterlab-pluginmanager-extension-4.1.2.tgz: 0df33d227079976d139c15589fda59f04adad7c6b677c7ae5b8fb4665176d95f jupyterlab-property-inspector-4.1.2.tgz: ff6aa07b2a1e239179b226901aeac98fb76894a22412c5c1b1c698b5d3325adc jupyterlab-rendermime-4.1.2.tgz: c7774773b6681fe889c2100221358d6f7c30c8bbfcb6fc80ccc815fa87db7d52 jupyterlab-rendermime-extension-4.1.2.tgz: 2c275a2cfcb6e1d8df06169b2df933204b02a9b99eadc855e3ce1cde5a5e665d jupyterlab-rendermime-interfaces-3.9.2.tgz: 48565b4834fcc4f8afdf88ecf19496a3ddc76eb8676657683e28109454d3a8c2 jupyterlab-running-4.1.2.tgz: 5e35a9f170f64379968612059924ece7330681b0cb7a453fe7e9b7448dcfe002 jupyterlab-running-extension-4.1.2.tgz: 4e759e0108c02a35fe343ea4d382ff9b25093526b44b741716415ef0869cbe2a jupyterlab-services-7.1.2.tgz: 34beffa60daba812217d532e11a31d5a4c0ca5e5cc63ff243080d267e2edfedf jupyterlab-settingeditor-4.1.2.tgz: 9a3a72bd6c72b70f08958489a0f509873f3f569b3d68deb83361c3fc78db1166 jupyterlab-settingeditor-extension-4.1.2.tgz: bef3d3f4c0edbac327720be64c3880496848111fb1d667e69b8773b59597534a jupyterlab-settingregistry-4.1.2.tgz: 9884385904bd08f1c18094fcc3043b1a8021de53e980d8740e193586ea301e75 jupyterlab-shortcuts-extension-4.1.2.tgz: 7a05007b1769eeb8d0c5e9928c1d4d9705652a6ff6b0fb6f740e1a7b616217df jupyterlab-statedb-4.1.2.tgz: a0d89d89c1be83cf26361d83f8dd02d2151e43ca193ea4080ca3076de944a0f8 jupyterlab-statusbar-4.1.2.tgz: 204c98eac2c8d615a7a91ed8c144db537d464aabbfb221023183de71dd1bd654 jupyterlab-statusbar-extension-4.1.2.tgz: 1778e5dc2f9a126fc8e543494a3eb911eb9d94c3db512681a718c1d26cd871d6 jupyterlab-template-4.1.2.tgz: b4248c4a99fdea60d17433195dcd0d3d52539faf2b500171c84e9cd55fd27a60 jupyterlab-terminal-4.1.2.tgz: 7a489b99119dde04109543560fed00b87df64df2561a039d8460865aec9758ca jupyterlab-terminal-extension-4.1.2.tgz: 25adab9f6150a9e1f39fec01a13c2dbcd618b22bf65d270f7789fd5d2a562d2f jupyterlab-testing-4.1.2.tgz: 848dba39be5b54fb61edd770b49302f27d85ab5d0a1944d7a5fa88c624496836 jupyterlab-testutils-4.1.2.tgz: 5e1af11ef63dab0e35e6162309992cd0a1c142f749ed8053fc32497a41f6ee3b jupyterlab-theme-dark-extension-4.1.2.tgz: 471d7d483fbe3e8750aa0140cd056209f3c7bc8dff0152c3091fd7b5331ccd25 jupyterlab-theme-light-extension-4.1.2.tgz: eb0ebbc82bffcc485faf0c0a509246e0abfdc5920d363cbb6975384bf0634b90 jupyterlab-toc-6.1.2.tgz: c1c66eb6bd33870c7b471634e0a9c604dce8322b9564fce22beae95dc216e0e9 jupyterlab-toc-extension-6.1.2.tgz: 845ca29455badc88cb064e88a1b1461ea62e13dae11390bc3e1f9acd11e4a38b jupyterlab-tooltip-4.1.2.tgz: 37e3875b710d87b1efbd8f9f3b512c1a1a445ad1089f4748635e1333ed116c7b jupyterlab-tooltip-extension-4.1.2.tgz: d8552bdb496d69f4a02e4111f4d452cceb42af681a1883c842f6c6e17e2a4882 jupyterlab-translation-4.1.2.tgz: ad89dc5b83778aef8251e8ed9dadf877fa65c4596356d35e672cc2bc90503e96 jupyterlab-translation-extension-4.1.2.tgz: 9c3b896ba02ba0b971ae83306c8293c83776113f8d0c0a975d65dd5221c21ffe jupyterlab-ui-components-4.1.2.tgz: ce645fd21fe45899756ee51532ec294d4c9bda7e2caab05bf5ce9992ff787d2f jupyterlab-ui-components-extension-4.1.2.tgz: 4279f86cd9229f23724eee8044814300142acc4cb5ea36a660b7fc1ad5de2df0 jupyterlab-vega5-extension-4.1.2.tgz: c8a0890aa944e23501716e34bc91d8a2ee6ee5da09190ddf5e721a15eb34231a * Bump ip from 2.0.0 to 2.0.1 (#15831) Bumps [ip](https://github.com/indutny/node-ip) from 2.0.0 to 2.0.1. - [Commits](https://github.com/indutny/node-ip/compare/v2.0.0...v2.0.1) --- updated-dependencies: - dependency-name: ip dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix code sample (`app.services` does not exist) (#15838) * Fix workspaces URL guard (#15842) * Update branch configuration for `4.1.x` (#15848) * Backport PR #15851: Fix broken link (#15852) Co-authored-by: Frédéric Collonval * Backport PR #15854: Fix clean script (#15858) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15880: Update docstrings to mention Jupyter Server API (#15884) Co-authored-by: Jeremy Tuloup * Backport PR #15810: When attaching only typeset after rendering is completed (#15879) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15805: Fix codemirror highlight for Python builtin (#15882) Co-authored-by: Allan Chain <36528777+AllanChain@users.noreply.github.com> * Backport PR #15873: Fix missing signals in file editor adapter (#15886) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15878: Bump es5-ext from 0.10.62 to 0.10.63 (#15883) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Backport PR #15843 on branch 4.1.x (Fix saving of item positions in reactive toolbar) (#15906) * Backport PR #15843: Fix saving of item positions in reactive toolbar * Restore the galata function to resize sidebar in documentation/utils (instead of sidebar's helper) and add a copy of it in jupyterlab/utils --------- Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> Co-authored-by: Nicolas Brichet * Backport PR #15790: Prevent command shortcuts from preventing user input (#15904) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15869: Fix Pressing enter in console with console run keystroke set to enter creates a newline and runs (#15910) Co-authored-by: FoSuCloud <49218295+FoSuCloud@users.noreply.github.com> * [ci skip] Publish 4.1.3 SHA256 hashes: jupyterlab-4.1.3-py3-none-any.whl: 67dbec7057c6ad46f08a3667a80bdb890df9453822c93b5ddfd5e8313a718ef9 jupyterlab-4.1.3.tar.gz: b85bd8766f995d23461e1f68a0cbc688d23e0af2b6f42a7768fc7b1826b2ec39 jupyterlab-application-4.1.3.tgz: 679d20c076ba62b224f8299c6d1c7f1f462d405d83849158458b60e093105d41 jupyterlab-application-extension-4.1.3.tgz: 1da6c3a27f07a407cf4f5eda7a565d67df00f25719664fa89f991e4c1494255c jupyterlab-apputils-4.2.3.tgz: b99f2466c53b04408cb0c0794f979e8210dccf73070d84faa3faba6a61cc0ae8 jupyterlab-apputils-extension-4.1.3.tgz: e5b49b88efc96893b5e25f5298b11450ad2c282918c07aca7b1b06cf606baaef jupyterlab-attachments-4.1.3.tgz: e5e7e22410762985a338fb362496dcfcf3b8661dc24fdf095e7ce8a25f167987 jupyterlab-builder-4.1.3.tgz: 1f7a9f076885d4606b79c88817d5a10807fdb62ebe8280e661e6d8e65fba3358 jupyterlab-buildutils-4.1.3.tgz: ab2ea44734f5572f637f56e98bca08d0bcf4de3e09f29d433569b42f197efcc4 jupyterlab-cell-toolbar-4.1.3.tgz: 9115a1457976657106457a55580bda0f97c6661c4a2e144b145b0cf0f962f82f jupyterlab-cell-toolbar-extension-4.1.3.tgz: 678ce61d8a932f8924ed773dbeabcb37f7d2c70c560a4bb025f74b557f59d19a jupyterlab-cells-4.1.3.tgz: 5cfc7ddc7a6987dbbd40af2871b4272282c4f20b0719252302e7bfc291cfdd37 jupyterlab-celltags-extension-4.1.3.tgz: 87e9fd515c1403e0cdd794f96be906f25479f8dd43da5df2118c6b912d39264b jupyterlab-codeeditor-4.1.3.tgz: 781a8fd9f5e11781d8fb9db7307a8e326fd43d2d60efaeaa7ddbafb1ef153cb5 jupyterlab-codemirror-4.1.3.tgz: 5a3e81c30b80e69635732358876b4e2e8262227598a2a3e0ead3d520588ef020 jupyterlab-codemirror-extension-4.1.3.tgz: acb7179771817ca216c598b5209b981f60e9a14130a7fd995bcd0246673f4aac jupyterlab-completer-4.1.3.tgz: c6dbbfeb7174a3a68b13379c15e76db2b4b8cc7e0f6e3b795b07d1a841c63ccf jupyterlab-completer-extension-4.1.3.tgz: 33aa5cc292645019ab76db12c4d1436240b54bde34469297ebb8f8b21f38c0ef jupyterlab-console-4.1.3.tgz: b882c4ee6238df3a2fd860f51a09036ef069646c7cd382927e3bc39542f3b949 jupyterlab-console-extension-4.1.3.tgz: 090aa26f483ec01a8b0622dbaa29bc885dc3b12f3c2d3f2cae9745b82263b1d8 jupyterlab-coreutils-6.1.3.tgz: 38a1cf7c1228798df26c20bc598973af4c0c2f84786ff576e1d43daab3705341 jupyterlab-csvviewer-4.1.3.tgz: 646413398b455d17e10ab175b018ac67ff1a9d06b2825a0863aba8a58ce6d3da jupyterlab-csvviewer-extension-4.1.3.tgz: 0e2227e303baec6530899d1deeffd85763cab867319cd81fb6ccc346a9542f69 jupyterlab-debugger-4.1.3.tgz: e11717a7d1df9fede885fe6ec1da840d30b305aad923f5741ee1dd0d73de1ed6 jupyterlab-debugger-extension-4.1.3.tgz: 87c29a373099ea605d65e1f57333ec5c496c1a1b26c3e6fcff4384b4cdc5ef34 jupyterlab-docmanager-4.1.3.tgz: dfdef0e148ce5bcdebff2067a32de89c0f562d18419c6e4fa6f01c47b8ec0d79 jupyterlab-docmanager-extension-4.1.3.tgz: 3084a253328283c0ecb743392c34380ba8b0013f08bb652f1a44b37c151f19f5 jupyterlab-docregistry-4.1.3.tgz: c85c0b1fa340c549f8500fe020229ec0774c3cf93ae6563a1f6027b9a2470706 jupyterlab-documentsearch-4.1.3.tgz: 3e195b4fd5bfe420bd6a2055110842277ab6b14b9131fd3d7cb42ccec36ae8a3 jupyterlab-documentsearch-extension-4.1.3.tgz: b7c8b0e4c342c599351c5d3ad13d7f24d49d120e2c04a05967d3bf8dd99200f9 jupyterlab-extensionmanager-4.1.3.tgz: 4941422cb115572684acd2b950be08a281e6cdb3ecd74a642650961c6435928c jupyterlab-extensionmanager-extension-4.1.3.tgz: 4feaa3a861578888444bd59af9011084af46f7c8b22076d256ec272fe93bf327 jupyterlab-filebrowser-4.1.3.tgz: fc674caa76d5286cdd28f513368c48e5ed293e27a23b97ce75043a6238d6c2d7 jupyterlab-filebrowser-extension-4.1.3.tgz: 4f859c76386f60ff0c5bc356583c8c8cc32a2f3c4bc3cb30e77c2d051d5decb0 jupyterlab-fileeditor-4.1.3.tgz: 78b9f66e7e3d131a22e2c10f702f98ed3913e48e5939dfdaff041ac746814d28 jupyterlab-fileeditor-extension-4.1.3.tgz: 7c688a5b1234cf0f1f88e2aa4800a8d27a68ff4778f9bb7f6658a5261d4292f5 jupyterlab-galata-5.1.3.tgz: a5a3d6ac9d86321a43e4feda1b3b256c5298f58b6b61748a3e9702969522c5cb jupyterlab-help-extension-4.1.3.tgz: 2ad29d6e2abba53d8d2e0bd8f80a9b4f2882babcc3566f26b2e8eb635e61acd1 jupyterlab-htmlviewer-4.1.3.tgz: 4315638cf88beb807175ff38fa079cb4c03dd2685c003605c0efaf9348b7dbbc jupyterlab-htmlviewer-extension-4.1.3.tgz: f53a17179827722f0e16d1c483152d8d411d531aefe542284d5dc6dc9944e097 jupyterlab-hub-extension-4.1.3.tgz: aea316eb47762bad7fe032d07154a5347c73c81990705e0d6e95f97121e6ecf0 jupyterlab-imageviewer-4.1.3.tgz: 4f7376a79f688cd89a55c09d0755d746747815da1ba2b3d0977247f95bb17d47 jupyterlab-imageviewer-extension-4.1.3.tgz: ca066029e4c6fc0b1764dd89c2ef526330205e73003dbcace9379bf7791924d5 jupyterlab-inspector-4.1.3.tgz: 448c7ebf8a55637072538a87fb49ce002e6853a2db9f7a050ccf1fecdb700f5d jupyterlab-inspector-extension-4.1.3.tgz: c336bbb72909c2849af2eaedfd6999d7720f5e1ddbb9d1c685f6212f1c90564c jupyterlab-javascript-extension-4.1.3.tgz: 3c54c4cb7f1bd096582e93fc82a1c818fd6975d68bc51042e6b35ac790034215 jupyterlab-json-extension-4.1.3.tgz: a7b7e3bf000089aa75883b47bd37cd7771b18dd5ef6de60cb21544621ef81335 jupyterlab-launcher-4.1.3.tgz: 8645a92ce8dd9a56a92c568896d5028baef81c2c56f26b8e8f82699ee470fce2 jupyterlab-launcher-extension-4.1.3.tgz: a87f229d27ccf2164d5822c65f4b2c8e77d7fcb3e77aa2757ebe9f1fdaac0385 jupyterlab-logconsole-4.1.3.tgz: eb5ff14431debe6b428143675cd31d97bafd3c916f304501538ff20fd8fda727 jupyterlab-logconsole-extension-4.1.3.tgz: 2fa55a15742ad73c2d667f946d7d3fd9ecf282b2771ef36ee2025342b709f22b jupyterlab-lsp-4.1.3.tgz: fb55ee23bff0b80681ee6679ac94a76fb226a7ff9f9fe778e11f298e962b1179 jupyterlab-lsp-extension-4.1.3.tgz: 1fd8b6a768a92c4a7347641cce7e63d45af9deddddcf0fa2c4437c9e66108f35 jupyterlab-mainmenu-4.1.3.tgz: 92c66d3eed7f46ec5328f002a401a3e13995177ef62d61d541457fb642cf8435 jupyterlab-mainmenu-extension-4.1.3.tgz: bc6642d417bdb28cefc9d42ebb8b99ccdb78f5c4950e35cc758c03595b407fe6 jupyterlab-markdownviewer-4.1.3.tgz: 453af5f2c65ebc5db4b1ccc33c8efb199ba791c7f7755e41c66f32e174158791 jupyterlab-markdownviewer-extension-4.1.3.tgz: 053cceaa5158d4d0d9a1b00eb225ff573d56a6deb075ca4d8d713dd7c06d39f1 jupyterlab-markedparser-extension-4.1.3.tgz: caec541bff4497908bdab61a3014bd759cacdf86bc481d6ee41fa4f77e660107 jupyterlab-mathjax-extension-4.1.3.tgz: a8c0db28185e61c86b1c36a04aa20c87e4d40f46f476ddc39bcd917a2fe141fa jupyterlab-mermaid-4.1.3.tgz: 1eed3b47f9fe846270ad02901759f3153ca441ed24b2ab87b79aea5ff7b3e9f1 jupyterlab-mermaid-extension-4.1.3.tgz: b0e6416713f30bd31fd5aa4a2037a585fff93652b9c66b5ea54e05f526df176a jupyterlab-metadataform-4.1.3.tgz: cf7faa2dfa5e6f7169b84d0a11cb6da60711d1b44f019f51a628e807e214dba6 jupyterlab-metadataform-extension-4.1.3.tgz: 70e739955fdab5565ba2651e4f5229515f24b4cf8c42968c536e0f695d9ddc75 jupyterlab-metapackage-4.1.3.tgz: 7895e868b4e786075a6709a5676a62f616111cd6cdf872dadfe60496655732ff jupyterlab-nbconvert-css-4.1.3.tgz: b3d7cc3a7881f415b5db24464719a9f1f75f4fdc521c850f9defc8bd9f5e0b34 jupyterlab-nbformat-4.1.3.tgz: b962e8a37aa36098db213d74968ee006df860de8a6a64555444ed18c603e6acd jupyterlab-notebook-4.1.3.tgz: dfe01411e80c0f76ae238d9dfbbceeee6e0f64e959419a8c0e12ca8b7d27ed36 jupyterlab-notebook-extension-4.1.3.tgz: b4a7aff3416cffc19f707d07f9cc0d50b0073790e1ab3c0443276bf3f7029f50 jupyterlab-observables-5.1.3.tgz: a96f8335262dbf82dd02d9690f2a04ca0892239db050aaff596ccb45d1b668ee jupyterlab-outputarea-4.1.3.tgz: 554055b2cf6b30b66d6d0b15e9b3f8d62b8068c3d8a738fe33d2824e55ba6889 jupyterlab-pdf-extension-4.1.3.tgz: 86665c33645ee6a34389d65bb9dd1d4f14f6f48d93087bb342a9d0b6d0f7fed6 jupyterlab-pluginmanager-4.1.3.tgz: 75d2deaf3343072238efe7838899e851dd7f8431854e6dfa247962eeaa6de1b8 jupyterlab-pluginmanager-extension-4.1.3.tgz: c0abfd5a4f9d9c2e0dbfa1cfaae332090b0290b782e2a90c5601cbc8da3e5afc jupyterlab-property-inspector-4.1.3.tgz: fb9ecb51198f05193d50c5f6f6cecc8033fa79a0caf43e7b5692b5842732e2c9 jupyterlab-rendermime-4.1.3.tgz: ae27dcafcbd1e0a33eb07e9f89ce0d586f94b3d86a1ed1be1a59ce99f488b622 jupyterlab-rendermime-extension-4.1.3.tgz: cb2eeeaef610347b22f7231acb0832c4bb6d29dc3c279c7dc48387f254cfbafe jupyterlab-rendermime-interfaces-3.9.3.tgz: 7845019301b2e97317174a7e20a2e78f1a7e258b7a635d2aabffa9d8cbc86276 jupyterlab-running-4.1.3.tgz: 25eab0007ca8d2596d8b537e2b5b3ff2a2a690c595c2bf31e164224e8a046a5f jupyterlab-running-extension-4.1.3.tgz: d3958760bf344c551d835b8670fa98db4e68c463c34d3741eff4f1530ab996e9 jupyterlab-services-7.1.3.tgz: cd4090ff4e61609a6f12fb612882a63d4e3342e73f7ddc156d632d3ead0d32c2 jupyterlab-settingeditor-4.1.3.tgz: 3b4baf3f629c92fafcda71a8a8796a2b91e452ee02348aecf469e67d52336d56 jupyterlab-settingeditor-extension-4.1.3.tgz: 030f72d097dd3eadcc0a2a9bd3943e78d2b91e19008e8f08ed2d1ec5a2917c0f jupyterlab-settingregistry-4.1.3.tgz: 56912542bd4e581b53bf28c50b33510469d9c26da4fb2f0237eb06ab2291bf5b jupyterlab-shortcuts-extension-4.1.3.tgz: 3b34b66413113cbaf9389102e090b87ff47259c0e0425570176b4fe759384512 jupyterlab-statedb-4.1.3.tgz: 0ba9a34fd43daa6763c1ea4ec9d0a9cdab3a774eb11682120236e0e28bbe27fd jupyterlab-statusbar-4.1.3.tgz: e15f006cab8447e0a762274b9663d5b5c22675c53c8aaaac0d5f021f07b19e88 jupyterlab-statusbar-extension-4.1.3.tgz: 66b74d126d2b288980ab9014bd39f8d3cf7b8c3af63128cdc94c92366905abab jupyterlab-template-4.1.3.tgz: df62b7795038826ba61661437bef25e5eb2e42f0980a5253c68ea198cad592bd jupyterlab-terminal-4.1.3.tgz: 377d65e6e88c8e4a883cb5da415fd6bd08480e82572fc0ccff70ad61c996f2ea jupyterlab-terminal-extension-4.1.3.tgz: 1da4a93c0b2ce62e48fae1688360f25bc623b4dd69c5daa7e5a161aebeefc119 jupyterlab-testing-4.1.3.tgz: ddcb42367f4363eec3a5c906910a1700e2014706668265bbad103b6fd9d18273 jupyterlab-testutils-4.1.3.tgz: a7597ce48e42ded74b8e68a17e792f32a367e27841ba0ce3b28df8e2c286c9b3 jupyterlab-theme-dark-extension-4.1.3.tgz: 60c429c541e59d9945a93265b89b5b403908a496e4e710c6223118ddffe7a2dc jupyterlab-theme-light-extension-4.1.3.tgz: 1067427f9b5de2004f96f9920ffde06fcae411b47b9e5799a675d43c980b4774 jupyterlab-toc-6.1.3.tgz: 4f56b0e770790189ca618d14188bd9dc4289afb66105f38fc3db5b384b082200 jupyterlab-toc-extension-6.1.3.tgz: 7d6e635fb4274c336ed92cec3c9962e51bb3f2839cc17165020af4558f1564aa jupyterlab-tooltip-4.1.3.tgz: 68f7ae522dbb659bc05c002e69023e0c8fc1c585af110986eb68d133e79af7df jupyterlab-tooltip-extension-4.1.3.tgz: 89d7404bc914a07b228688923653dc98eb292e7fbdcf06323b6fafddb9199834 jupyterlab-translation-4.1.3.tgz: 0726e278dcc98094fa2aa437af6b1498a987849f514168bf4c28a6d59fdcc381 jupyterlab-translation-extension-4.1.3.tgz: 4ebd68ad69b63516fedd17c23c6712eaee6e03cd6123fda9326174e27d0aeb7c jupyterlab-ui-components-4.1.3.tgz: fe37dd6bc751fb6c3b77c0af33c65612dcd941c4defc3b2a7f7627cf576c3011 jupyterlab-ui-components-extension-4.1.3.tgz: b34028d0cda2932df6198080ce39cddf1eb3063900d47958d681f00f444c631b jupyterlab-vega5-extension-4.1.3.tgz: a94da3f009a209a07f7eadd0ab031312ce199bbba68e459ec39e59a9e8c460d4 * Backport PR #15899: Add an explicit default for inline completer providers (#15914) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15898: Fix spurious dedent when opening inspector tooltip (#15917) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15938: Revert "Prevent command shortcuts from preventing user input" (#15940) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15924: Fix Theme color is not applied to SwitchKernel ToolbarButton (#15941) Co-authored-by: FoSuCloud <49218295+FoSuCloud@users.noreply.github.com> * Backport PR #15291: Fix creating files in custom drives, fix `ContentsManagerMock` (#15942) Co-authored-by: Jeremy Tuloup * [ci skip] Publish 4.1.4 SHA256 hashes: jupyterlab-4.1.4-py3-none-any.whl: f92c3f2b12b88efcf767205f49be9b2f86b85544f9c4f342bb5e9904a16cf931 jupyterlab-4.1.4.tar.gz: e03c82c124ad8a0892e498b9dde79c50868b2c267819aca3f55ce47c57ebeb1d jupyterlab-application-4.1.4.tgz: 66836309e7be38f4455e128c9862b09582baeae005c37ed46e553fe7800f2cf5 jupyterlab-application-extension-4.1.4.tgz: 80dec3f62929a02d77f464849817d079460e107784d63b7ee5d2eea6c5397317 jupyterlab-apputils-4.2.4.tgz: 1ac516ad28f47347a2987724ed75cfab39548288b6e19774f603f9529b3f1789 jupyterlab-apputils-extension-4.1.4.tgz: 0e2cff45ea4e71dc1544e10983b7c2a166fcb783f031fa9d441a31816862af14 jupyterlab-attachments-4.1.4.tgz: 4812f294798e4b5795ba445fb2031ebe2af46e772a704ed9dd16f68be1a73e62 jupyterlab-builder-4.1.4.tgz: 49a20675aaef03d44bf049fa04104db065a13a748720887871258421183f3a1a jupyterlab-buildutils-4.1.4.tgz: 4bc57ed0ae0f2dd0b37316b61e86ee6108faf73d55a6c745b4bb900c842c573e jupyterlab-cell-toolbar-4.1.4.tgz: ed3ddc5b9453072e27c3071e8d4fc116259b1533253525362b1244029a11cea7 jupyterlab-cell-toolbar-extension-4.1.4.tgz: 8e3f90c06751e579d05f90d23939560d4ad19ec705e208457050853473f2aad7 jupyterlab-cells-4.1.4.tgz: 9735026e9b514d94d398c6567dd06a46ab4c95147855471423d32945385c7a64 jupyterlab-celltags-extension-4.1.4.tgz: 23c05e264ee5e736b7ebbb671e7e55584762d20e4a0bc40bc3d0bdc651974349 jupyterlab-codeeditor-4.1.4.tgz: cdee9b94dd191758173c400adda6d56c1cdc71f81a0a8039839e6ee4d06085ba jupyterlab-codemirror-4.1.4.tgz: f5af7cec0e01c302bc494b40044b3fdbfdd0e261cd90b0e1048f04f02f675d4c jupyterlab-codemirror-extension-4.1.4.tgz: f5a48a57b6e3afa3c96e7311ecd13e3ff108bb6f32890c3bd44287343e498036 jupyterlab-completer-4.1.4.tgz: ec4709a1d659361f4d6ba11914cbe060c4b7bc757225a6f55c054b3b3801d8a6 jupyterlab-completer-extension-4.1.4.tgz: 6e333ec2a35b73fc7c969abb5ca55b7efc924ed4a37f5ff518d5ef28a002fcd5 jupyterlab-console-4.1.4.tgz: 7a76d0f92122faa7b448f63041cc075ab3c710b892a9c383bd482447e2573730 jupyterlab-console-extension-4.1.4.tgz: 30bfd42702ec24cc21e3da54fa7502e42df15c9a2aad6a6c076b65f5358eb989 jupyterlab-coreutils-6.1.4.tgz: 6cd94d30e6b5083a904a6c3c1ed07e3318c19fe39a2c687a1aa6ff09b4e5a277 jupyterlab-csvviewer-4.1.4.tgz: c4341db6c3b7bd9d11846dd98b7e1fbaf76a4721c0325002e6d85fed629da6b7 jupyterlab-csvviewer-extension-4.1.4.tgz: 6e811c7cf42f113720cd92f4c112f969c6976930b6850e2bdcec8bbe2611683e jupyterlab-debugger-4.1.4.tgz: 20c081e0449e50b7f48f329dc1da86df1e1a158ce5a1871d1a9cdf919616a06c jupyterlab-debugger-extension-4.1.4.tgz: ad50d9306f2751115787c6b247abd59e2db232fd5701fb4c3e5747a036029e00 jupyterlab-docmanager-4.1.4.tgz: 023447981aa88b04753a907f7d5d84483fa4226d796dd1c556eb466079661f76 jupyterlab-docmanager-extension-4.1.4.tgz: a08881eb39dc39d781723331a9d1cd5054b8f8b8231a66468b45293c633d7a88 jupyterlab-docregistry-4.1.4.tgz: 0ce0b8a70e0def7e2e02c44d1c26010a8a825b2c45bb47f5d397b10a05054925 jupyterlab-documentsearch-4.1.4.tgz: 1b696a46c0252ea7df5f93e8cb77f66556876ffd4d34698fac6495c4a2e6d168 jupyterlab-documentsearch-extension-4.1.4.tgz: d80e5b1146663e59bb10413ecc3cc1766326d3864d57c7a61193b8fb96275d7f jupyterlab-extensionmanager-4.1.4.tgz: 1e3058e98838b5512e29947d3a685c1ca6a902bc9104616d838d656ace901ac9 jupyterlab-extensionmanager-extension-4.1.4.tgz: 695d853fe3ec01d9b6eced5fdc09a14593a8af5b92c9e793119e63aef7da21a0 jupyterlab-filebrowser-4.1.4.tgz: 3ef2317bc913d88ef00baf37a1829e39477df00b263f3d863a3d1305731fadf7 jupyterlab-filebrowser-extension-4.1.4.tgz: b951868a7ad6eb7cb651635a3fdf5c745667c7c03a0aeee165075eb057584a6a jupyterlab-fileeditor-4.1.4.tgz: 5bbf52cc655df484a83b1364761354a4e9f8a7d6e43d69dc1a07dad465d71597 jupyterlab-fileeditor-extension-4.1.4.tgz: 2a058f2d1af4f80d63b598f43e97259037f8ea996f71003a19de13d6a4b51f67 jupyterlab-galata-5.1.4.tgz: e451d01d44bee319494ed558a8d5809550499b84408e84847424e7401d3a1291 jupyterlab-help-extension-4.1.4.tgz: b5422871ec5a5ea401421476c0be3a1b8dc884b58a61cbd219b65cfff11f38b8 jupyterlab-htmlviewer-4.1.4.tgz: 6c224ff34d935927a58f7483df6bab91d915b4f17b38dae799b35c71b7617205 jupyterlab-htmlviewer-extension-4.1.4.tgz: 7226010f8b60b8c2c07856c158a0ef4d2092fa5132e0babb901642d7f2688e3f jupyterlab-hub-extension-4.1.4.tgz: 07dbfd295718fd64e2e2f05d494159b1aa3faabd17429c30eaa8c0a60c3b39dd jupyterlab-imageviewer-4.1.4.tgz: 804a8eb8481855ebd2696e096a1df060e13991ca9a59ed92d0e3a4f3e9c35706 jupyterlab-imageviewer-extension-4.1.4.tgz: e4e54ab10382df4a6cda987ab31d2138e50719206f229ea6e8cab270411a8715 jupyterlab-inspector-4.1.4.tgz: 7bbf7b39b9b4771fbe9e41798d7b797d513c98d8446c30c82faa17fe692f0f0f jupyterlab-inspector-extension-4.1.4.tgz: fc359b3f0408465c3a8fd141e4704ce1fde7caa97562de160c35891e60ab227f jupyterlab-javascript-extension-4.1.4.tgz: fac9b15907ba1b31b6cb044b5dee28220326741dda7258bd45313ba7be0f8748 jupyterlab-json-extension-4.1.4.tgz: a0754911816020f8cde09e276f08306dd3b38fd9a4a1e117e1723f3cbdefe916 jupyterlab-launcher-4.1.4.tgz: e859d14dfda8f604eca332f95a0021e5ff5ecfcc7f1416972a2de284fb226501 jupyterlab-launcher-extension-4.1.4.tgz: f6cba8ae5bdfc283fc64a4ee3fcfa1b21ac4be95a0d6ec9ca21f2a9485d396fd jupyterlab-logconsole-4.1.4.tgz: e1eb6696d9caeaa14146a1dd31586ea073f8ff09baa5c8fe7ddd6da76fe12067 jupyterlab-logconsole-extension-4.1.4.tgz: fe8198d6b022c7bd3115afde8f02efc830d720738efb67d094be6becfebd97cc jupyterlab-lsp-4.1.4.tgz: 53884c47d31a69cee013ab7bcfa821a5988026e2f88dd4c12ce69dea382019b0 jupyterlab-lsp-extension-4.1.4.tgz: 381f3ec474001eb7aaf6c469c40b4a388571791b1c21bf89967e52118e1ad26d jupyterlab-mainmenu-4.1.4.tgz: 0cf4ec28b6baaa0e08a6478278d8be392c5dce15078e40c34993eef799da1bbe jupyterlab-mainmenu-extension-4.1.4.tgz: 9d854f57d4093ee930b69aef981070e6ff3f0c6fb9877cab624cb70428bc812f jupyterlab-markdownviewer-4.1.4.tgz: 6e802acfae976a6c594ed7ac4eea8f14042ff152a3d565bf09929f216b14a943 jupyterlab-markdownviewer-extension-4.1.4.tgz: 90e16ce6b9cd0cc18d7e8238a7e148461b9bc3cdb39b28405cde0daa7e63b6ff jupyterlab-markedparser-extension-4.1.4.tgz: b690c6cd6a78c8484477fee40aa2b22be9d840325e1f175cfebd897419989888 jupyterlab-mathjax-extension-4.1.4.tgz: 8b86560c5a187b782e14344a70136d4e5e4fc8ee2c40bc3b2f2acf6f27cb5fc1 jupyterlab-mermaid-4.1.4.tgz: 1123141e63bfaed3dc7ac159c54268397f416af1b2b9400224578423066cdba6 jupyterlab-mermaid-extension-4.1.4.tgz: 3997bede69ca9ee394496ed2d901aeee61e81e1c6e41cbbbdf7a3b8472bd21e2 jupyterlab-metadataform-4.1.4.tgz: 21bac1f60d9bb7d4f353b190a867e5fdb7e051c7bc504b12694572a41dfdee98 jupyterlab-metadataform-extension-4.1.4.tgz: 5cfab51ac565f5a36fcd8598c9db0ffb044122d756bd94675104007f010c4063 jupyterlab-metapackage-4.1.4.tgz: 00651af5a59f2cc3a68e884201cdc34b3125fd377c76f225dfdc070b69a1ecd4 jupyterlab-nbconvert-css-4.1.4.tgz: c5300c75c43b2ae3afe0c7e25bc6cf47d6e13c863e23bf67a20e4f874c29da4d jupyterlab-nbformat-4.1.4.tgz: 745734ceb73f20fe8bc1dc82ab2686ac725ef03bad18d8aa891262ffce32f401 jupyterlab-notebook-4.1.4.tgz: 3da3bc3e0e430cb73599b463725593c2c104c7dadba68e24abc49c05a1e66a54 jupyterlab-notebook-extension-4.1.4.tgz: 9f446cb3591a0f576ec614b9827b9fe045301ba255b2aac8e78c4fd7de3f8532 jupyterlab-observables-5.1.4.tgz: a342bff5b9922c1eccb57a2dac30c12ce08d2a44ce3cc117649a376b3c30b08e jupyterlab-outputarea-4.1.4.tgz: a177485be83a9703621bc3ed4801be27257f1d1cff9322f9c3ddbb660267b167 jupyterlab-pdf-extension-4.1.4.tgz: cfd56376f322cd37481b6b8fe3491d1487b3ce67d306fbf7bc14585e15809fc3 jupyterlab-pluginmanager-4.1.4.tgz: c3d59650902f4e287b57d4fb02c0b43bc24026bd5401c2b53ea7d870619d0947 jupyterlab-pluginmanager-extension-4.1.4.tgz: 85043380b459b61e5e13734494ce35400ed4ffad77b3b805fde01f6137859e47 jupyterlab-property-inspector-4.1.4.tgz: 24764bc87b0301c92257c44b873e8c0feb9a161e1a3aa207a70afd2f9f6caa80 jupyterlab-rendermime-4.1.4.tgz: 92ae5bb38630ca8818e428de004bba50d6db81ab52f4c0daeb20956f05f1af34 jupyterlab-rendermime-extension-4.1.4.tgz: 758b69fa4c3bc192113bb7833f8c4ff6b7889826bf7726ff986fb4e3891756d5 jupyterlab-rendermime-interfaces-3.9.4.tgz: a3b8e0427fd2bcdbc857642621ececc30022f4573a1d292983a7919f23eb0e9a jupyterlab-running-4.1.4.tgz: a029e5574e32320d614091d9941ba9e4af5ab6c802a957eba622bf357a63bbcd jupyterlab-running-extension-4.1.4.tgz: 854293fe1c5f55e378ae2549d9b3882f81406ca13e3fa0bcfd17cf39cd19a264 jupyterlab-services-7.1.4.tgz: 4ef476cd3691112ed6a0d5dadce55305049681429bf9a41f1830561c57f86e48 jupyterlab-settingeditor-4.1.4.tgz: ea1ec1c69d49d67ba45ddc5c4677b4657167e5b3f2c577ca74d967fb2be8d81e jupyterlab-settingeditor-extension-4.1.4.tgz: a9e75576a8250552fcfe4f431562ec87abf5e36bdb743378ba7bc1e06583e2d1 jupyterlab-settingregistry-4.1.4.tgz: 020f835d48f202da87bd162af70c8f78db8ada6de47df0ff9b9e2afd23776824 jupyterlab-shortcuts-extension-4.1.4.tgz: 473d31fbb0d1864ed78f97bed2a9b29439bcde19ba791c9ff52c9e4d59e3dc14 jupyterlab-statedb-4.1.4.tgz: 387d436143a262a88dd06f10a7167f4780ea3d5ce556a08fe6b9308bcb86857f jupyterlab-statusbar-4.1.4.tgz: 63589ccb299df9a6403726f30fc53252fe66e476e38de755b4c4778b119b0b73 jupyterlab-statusbar-extension-4.1.4.tgz: db7f9914b72df25d2eded094f9d8e81390bca96bedfb140377a67fc276fee4fa jupyterlab-template-4.1.4.tgz: 913b46371dfaf687b621aca7aac54f0b24f5e3981db6eac26dbc8ce29fe75729 jupyterlab-terminal-4.1.4.tgz: 891a0b0441bd2cdeccfd14aaec0b72cf68b6990c1de03e29f736d9c5fc3a0dfd jupyterlab-terminal-extension-4.1.4.tgz: bc07a7a94343544d53a1386b9f63d212452bd6c96e6c6f86683b0dd823767f59 jupyterlab-testing-4.1.4.tgz: 706d1be8132793c6f05f5ae31eeec65886358ccc5798cdf649172c00e5913fe9 jupyterlab-testutils-4.1.4.tgz: f5a7d78414c5afcf493e092162012897f7a7641cbf033da968ee0a4ce31b73a6 jupyterlab-theme-dark-extension-4.1.4.tgz: 4372e6b33cddc631f407f0be6944e2c3a4188fbd451c9956ecf39c70b8589da5 jupyterlab-theme-light-extension-4.1.4.tgz: ce50bcd229c41303c1b3fc2fe76b081383234e718f1677fe464e5441b8bb7cb9 jupyterlab-toc-6.1.4.tgz: efaca9375cd6e5e0019067a215ec30aeacc0c59282c6224c90a473be6bfc6c5d jupyterlab-toc-extension-6.1.4.tgz: f0c0bf782ce3c05b4fa2374f033e65b3f8d4c9f5d2d50096aea214d4ea93c46d jupyterlab-tooltip-4.1.4.tgz: f8adffc227bc20a9439963be4ea9b13257f304f7ea259fcef50fa77e373ccfb3 jupyterlab-tooltip-extension-4.1.4.tgz: af0d8ec1aefe60e0ea11cb8e7bf757700d01118e3917d471563243e3af11715c jupyterlab-translation-4.1.4.tgz: 8fee5de88946fb1446612c92aa1d2627b5abc4cab69f889a1663d51b702908a2 jupyterlab-translation-extension-4.1.4.tgz: 0da5cc0af5a7d918f431b8417030db9711e76701d9c95767363c6b741470fb7b jupyterlab-ui-components-4.1.4.tgz: 43c796a40011515ff4f1ffcf6ea9e53f0fb9f78b2aae19e561912303240db855 jupyterlab-ui-components-extension-4.1.4.tgz: 0b0dbcd7148cbbf30600490be79b4bd7f65612a28f8914d72498d32583597ccb jupyterlab-vega5-extension-4.1.4.tgz: 0bd0705ac196e001e76dd1bf5178a5d2d59211224d9d121d5d560253f16aaf36 * Backport PR #15935: Fixes filter for Chinese, other non-ASCII filenames (#15950) Co-authored-by: Jason Weill <93281816+JasonWeill@users.noreply.github.com> * Backport PR #15954: Avoid concurrency when computing the items in notebook toolbar (#15961) Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> * Backport PR #15959: Ignore links to GitHub user and organisation profiles (#15963) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15892: Fix browser-test.js (#15975) Co-authored-by: Frédéric Collonval * Backport PR #15970: Short-circuit `selectItemByName()` if already selected (#15983) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15860: Show outline on the full item in file browser, only when needed (#15984) Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Backport PR #15834: Uses the browser window's selection as the default search query (#15994) Co-authored-by: Jason Weill <93281816+JasonWeill@users.noreply.github.com> * Backport PR #15957: Fix Theme color is not applied to Toolbar Button (#15995) Co-authored-by: FoSuCloud <49218295+FoSuCloud@users.noreply.github.com> * [ci skip] Publish 4.1.5 SHA256 hashes: jupyterlab-4.1.5-py3-none-any.whl: 3bc843382a25e1ab7bc31d9e39295a9f0463626692b7995597709c0ab236ab2c jupyterlab-4.1.5.tar.gz: c9ad75290cb10bfaff3624bf3fbb852319b4cce4c456613f8ebbaa98d03524db jupyterlab-application-4.1.5.tgz: 0d3ebbfd0490e337b5d95511972c8e54bf5aea8930cdfb502cad4dffaacb3274 jupyterlab-application-extension-4.1.5.tgz: 2c3d8870cfd7558b65dd38b63e3033d2f8751734b996f0290f3bc5317b12f445 jupyterlab-apputils-4.2.5.tgz: 00fffaf75ea61449c42a9eff0d5c574344fe4ff0bb854336bc69fb8bb43dc606 jupyterlab-apputils-extension-4.1.5.tgz: c2d21ad70c2986aa425eacc4d18d8f0a615a12b2d9d35ee034150f83a366558d jupyterlab-attachments-4.1.5.tgz: 8a4d1ff80bbbc9eee5f0e7383a6adaa6bef8052a32f080bf75e7916679425ee8 jupyterlab-builder-4.1.5.tgz: c04d60e12b6d095c463ce885dd871bbf2766ee8d9ae4164f2b5583e4b4fe3f35 jupyterlab-buildutils-4.1.5.tgz: 462ca38a6d957fad2585aebb0955450a93f143186398f15225b00ff9a501ed16 jupyterlab-cell-toolbar-4.1.5.tgz: ae81834ce4c8c523953064fd49aac3ac0537ecedf862ea98a5adecbf312e27cd jupyterlab-cell-toolbar-extension-4.1.5.tgz: eb3bc0eb3f27c053396499028387a4b07bd3bd5b1c9ce62df7b9fcbdc018404e jupyterlab-cells-4.1.5.tgz: b6d621fcdef508dd8150e33935dedb532e84002ee5c019f57b903b96417df575 jupyterlab-celltags-extension-4.1.5.tgz: 8cdc06128c8afd95bc627b3d160ec02fa30dff13af6b6d0e868c865debf96b95 jupyterlab-codeeditor-4.1.5.tgz: ae55cb6409371e09cdf3997ea0d79e5c3837ca6b024c0b1a176bb50beaaff421 jupyterlab-codemirror-4.1.5.tgz: 2dd2725fae4f5ef5bd052285a0c0fafedf4eb4fa54989c3f1e8ff40c68cd95dd jupyterlab-codemirror-extension-4.1.5.tgz: 43f81594130de03bec276c92adf5085a7c92bf2070afb75151046789f7154c19 jupyterlab-completer-4.1.5.tgz: 35922b4a8a1620347ebfc900bd368df12f75621294d79ddaa0612365dcf89189 jupyterlab-completer-extension-4.1.5.tgz: a3e38cf058a7e00af537210cfd47a4d31fad82fbee04b9ed97acc35539226441 jupyterlab-console-4.1.5.tgz: 935ffa0a5d2cc52a110627f095f3cb968d5404e46fd181bfe3ebbf6436fc8ce7 jupyterlab-console-extension-4.1.5.tgz: df23b52415942063f9a7fff7c2aadd13ab874660aa18d18c47a2a815aeb5de2b jupyterlab-coreutils-6.1.5.tgz: 5a70dc55c8f8ab47b4ec572490cce0dac1b3a6245d5ef24b0ff506f08cdf29a5 jupyterlab-csvviewer-4.1.5.tgz: 5520ab8fe589b58e3db949e6dbf3b08716493d844d08bf22382abd3ddf5d46f1 jupyterlab-csvviewer-extension-4.1.5.tgz: dd5873d227b70a690ba3522b759d32efd0e54b768a9db8fb6103937823dd8b12 jupyterlab-debugger-4.1.5.tgz: 4b5f0063af9d9ea840df7c9ed775d961a0ca58824ea81beac466a96837c79dba jupyterlab-debugger-extension-4.1.5.tgz: 9bf13e193e583d8f7666b7f6a607621e36eb6e84634adecec490c9a7d8026c6f jupyterlab-docmanager-4.1.5.tgz: 575a0ed0e5407f021e0ca9c8717118750e009fa745738906979f7dfb8206f345 jupyterlab-docmanager-extension-4.1.5.tgz: c97ee2cd48b9530800c52cdeeb0365e21ce3675c729eddef107f71bad83c4487 jupyterlab-docregistry-4.1.5.tgz: afd5aa89497926458bf1f20586557c3f23eddc7747d1b8b2d1fe810579ccf261 jupyterlab-documentsearch-4.1.5.tgz: 6604f2ac97e450553e18320dccf4f138f29fe52819beeb6c933f81cb1cf02c46 jupyterlab-documentsearch-extension-4.1.5.tgz: fb9ec0efbed88b54638c9877e35b208e7df84b67fdf3a1c888f2de7e0c3c6d44 jupyterlab-extensionmanager-4.1.5.tgz: 7e685e5d3df74f428687fab3b1db8b1b2102ca89f8122a39ee90fd28136596d2 jupyterlab-extensionmanager-extension-4.1.5.tgz: 3fa5cb59acce3db554df12dd6f44ee238748eafe801ef562b1e74a402e52e90e jupyterlab-filebrowser-4.1.5.tgz: c196ac4e57bf9575d859a16a573fae7845fd69ab2597857b4729ea39464a9337 jupyterlab-filebrowser-extension-4.1.5.tgz: 0f4b62301c7d66404abd48e8161c5253877752f8f1b699b54f69a07813a9b661 jupyterlab-fileeditor-4.1.5.tgz: 97b3d286ff7bfe93a23f313d458c03071dbaadadc78ad6eb09e8f8cd8fcd6c88 jupyterlab-fileeditor-extension-4.1.5.tgz: b34ec28baca6ae414bdcbae26aae755575ef408c73b48aa6842fbb6ed8834c90 jupyterlab-galata-5.1.5.tgz: be2b042216d6d9c9ebce6d2dd69dfc1a5a6c52486717118fefb5d7ddbc772aad jupyterlab-help-extension-4.1.5.tgz: 27880ebe05b72d8fbc8b81aac382070598fc9f0987c992974088210df9e9ed17 jupyterlab-htmlviewer-4.1.5.tgz: 6471666f6ffcb24ce8b509bd597d599c2eed657c82a4f9b5d17d345745374276 jupyterlab-htmlviewer-extension-4.1.5.tgz: 738dd059935332c8d94643476c84e3a18163623375f3f7965d74da58b737b242 jupyterlab-hub-extension-4.1.5.tgz: 70c5ce706cd33387d3b175434bda352aa25fc1cd8aee94dc89b0a018dc4b35e6 jupyterlab-imageviewer-4.1.5.tgz: ebf1195cbbf8aef8e83bdaad82e181791a31f80f4df27e6d1b52ba3765df0ef0 jupyterlab-imageviewer-extension-4.1.5.tgz: cabd80d1f07cf138a681df0371b1f50a098b4f8cdf433c999298a47ca0aa1e76 jupyterlab-inspector-4.1.5.tgz: a74d5f70e55421dc37bb0f7a8d7fc92008a6a09cd723d9234a8b8d08249df66b jupyterlab-inspector-extension-4.1.5.tgz: 3c0d4d3a8d3a9ecfc9f16bd3b5cf5814646247acbaf588c15dc635536bef46bb jupyterlab-javascript-extension-4.1.5.tgz: ee53106754bb8c071d2aa0f5dbea50248af6acbf3f454a9ddff0a86fef42d5d5 jupyterlab-json-extension-4.1.5.tgz: 3c278b9248ffdd24c805367369d1f2977d631308a9903a5286b7686594cfb8ae jupyterlab-launcher-4.1.5.tgz: c56764e5653f4911f04fb161ee02f28946e70647e52b3b65b4ba26fb3a979faa jupyterlab-launcher-extension-4.1.5.tgz: c17c00397707cbfec6d045201921fec92f9547bd66558a130dff5e647eeb9699 jupyterlab-logconsole-4.1.5.tgz: a5a8ebcf9b2e1f996be09ed8691fbeb1a0865576b302a701f017e1bd7f5b8c6c jupyterlab-logconsole-extension-4.1.5.tgz: f372b543459b385dce93d3c0a89c94217c611df44100ea556b3bc349b91fa5a9 jupyterlab-lsp-4.1.5.tgz: 2672784c8e0b551c41fb72f20df57b39fae05147c46f7fcfde34bf729f284e49 jupyterlab-lsp-extension-4.1.5.tgz: f260a2c6aa83eb6dfbe6f91eaeffe532074c0eb340227b5f9826c8f9860bf4cb jupyterlab-mainmenu-4.1.5.tgz: 7417110089fb4d20491d71d91d68fc7b0d7ecfdcc1fcd862a564d8a5f9b37e4a jupyterlab-mainmenu-extension-4.1.5.tgz: 78adea547c0b525bb9f12d56811391ade7cd3a9bf1bdeaf3c4da049f93e83276 jupyterlab-markdownviewer-4.1.5.tgz: 9e7ac1fa22a494bfb9ac79122ff40a1bd59a556876467c30b91a08f7234ebc71 jupyterlab-markdownviewer-extension-4.1.5.tgz: ffb84b4e5ebdb238109519eda520d7434eac53079d8bea9ffde36ad0be38230c jupyterlab-markedparser-extension-4.1.5.tgz: 6d32d7ebcbecba80407575872d7b71e93527e8801b6f61f4096ba8e222deb1a8 jupyterlab-mathjax-extension-4.1.5.tgz: 782d7915f8e59b9181e99fa2d087ff66d14af2c6676400e7cc6753693102a1b5 jupyterlab-mermaid-4.1.5.tgz: 3853513c66ea4c1e3a15c6e846a0839de2f7ef3e2a954b4d36248e0d9ee9a397 jupyterlab-mermaid-extension-4.1.5.tgz: aa923caafab7e501b750400466fee26855e49f33789e3f7fdcd8b856785f6d4a jupyterlab-metadataform-4.1.5.tgz: e265a48232f5f95a8327999a7d6eb7f503ece74dfdf4d730a0c396d9b5a0b8bc jupyterlab-metadataform-extension-4.1.5.tgz: 6ef1c62ebf09ab22e282636a46fec23700cb6f22281f6d93a838ea24095e0fb6 jupyterlab-metapackage-4.1.5.tgz: 69ac696d39628558f93a3150ce4eec1d97363e25a54332de1fbd2dbbfc845b77 jupyterlab-nbconvert-css-4.1.5.tgz: 7045d7cd8daf8e18e62b46b0bd4d407066201b991deebab8f194ba209926bb67 jupyterlab-nbformat-4.1.5.tgz: 5163b079bfc1291936711e73d3a1dec566513a883b6609055814c7632aa1b7ee jupyterlab-notebook-4.1.5.tgz: f287bd73925346e0dd03d28b3dc7a1e2601b77ca094cfd741f1828f9746eaa7b jupyterlab-notebook-extension-4.1.5.tgz: 1f616df18f182da438545ce85dbf533a937d3dc56491138ddab50b2135d08184 jupyterlab-observables-5.1.5.tgz: 22b707e5e80edbb2118b2464673291871b4ac5af0164cdef24f5475c5f3361ef jupyterlab-outputarea-4.1.5.tgz: 85ea5dce80c1ae7af725bd3eb7328b0ce7b11a921d1e757cebdd314fcb04f290 jupyterlab-pdf-extension-4.1.5.tgz: a769e6e685a768279266f47084bc587910cf7938efeee174767526479aca7e9d jupyterlab-pluginmanager-4.1.5.tgz: 18fec989dfbe72d0250bd015bcf570def1ab5b9acff0e51aa002684319708a63 jupyterlab-pluginmanager-extension-4.1.5.tgz: 3f9789b113ec28fb4eb281d05971362692f4269bd931737c59abe532c064413e jupyterlab-property-inspector-4.1.5.tgz: 176ab61583a8dd9c417f8b6c4d4540e3dccbb2fad01ae1eeffed2ce154679d80 jupyterlab-rendermime-4.1.5.tgz: 1ea96dc542b78fecfe93e5460da550deace90394f415ef60bb514f0dae5b5b62 jupyterlab-rendermime-extension-4.1.5.tgz: 8c16117ebf260805565d0361ebd569242b07c9f58c51bc1e4ed152ce3ddf6b16 jupyterlab-rendermime-interfaces-3.9.5.tgz: 72d811d6a0b697fa0cb3aa4ac133b3a2028beb2ee06068f0f94268a15aa15cc5 jupyterlab-running-4.1.5.tgz: eaea7475e8e78911b8828f90605a12c1587cffdd29664766bad37ec863b3d9b5 jupyterlab-running-extension-4.1.5.tgz: 52290bd66bed52d3bebe4fc0cb14273a32c7ccde4ef89b286b6e9e0b86876428 jupyterlab-services-7.1.5.tgz: 90cbbc312f335c8d85d9bf92fce79f95f399a29a23a01feac7e0b5baee1f6bae jupyterlab-settingeditor-4.1.5.tgz: dc7e167bcfba810203635906242164f514b14bdd3a853a9ad048f6ee71ab855c jupyterlab-settingeditor-extension-4.1.5.tgz: 7c7ae7c8383f12a9c1dbaf733d87af10eb6d2cae141fee73f5f609bc361c0b8d jupyterlab-settingregistry-4.1.5.tgz: fbffac396a906f298b3a211fc0ae852eb11d632a373447297bf3119ce7e49b10 jupyterlab-shortcuts-extension-4.1.5.tgz: 32f6c4c7502823dfa8b075ebfebd441d9ff0c8141c8198994ead69730361161e jupyterlab-statedb-4.1.5.tgz: fb78f97627c34d4dcb389c3c97e7e44ef94f13e9c87b5c64dc8f736e3ca2e13f jupyterlab-statusbar-4.1.5.tgz: 5450f4b4a82a61f85d41fede77bc378a0b217a76a01d7faa530fd68dbf416c6c jupyterlab-statusbar-extension-4.1.5.tgz: 504be14e894fd37833e8e95522034d1c1de7ab1c11696f503c8e97f228ba606b jupyterlab-template-4.1.5.tgz: 2d91877b190d90b53217684b2980f4a36b49de896700210c5e0701705c2d03a9 jupyterlab-terminal-4.1.5.tgz: 6d3a7ca381b16cdb74d211d122e83e438fbfe2a85821b01d394a8b2e84daee4f jupyterlab-terminal-extension-4.1.5.tgz: eed8a25d2bc855fabfe4ba37fda05f3e75b3e13399933b494ac28b3b903c7cbd jupyterlab-testing-4.1.5.tgz: a8503b3bdcc5a966558dc547b8c485e7bf73bf5294549bca6f985327ab82c5ef jupyterlab-testutils-4.1.5.tgz: aad462dc0fb3c104511c4512adc3888b8e57d7d08686e0928bcec86f181cbbb2 jupyterlab-theme-dark-extension-4.1.5.tgz: d3656accd20fd42b7888c67c7ce8c39d60d6041bc0e26c0a9d9e601f5696f441 jupyterlab-theme-light-extension-4.1.5.tgz: bc0f50bae6282d2475df11ef8e7bae8d3849c2082fc20801626d4b6368b8e12d jupyterlab-toc-6.1.5.tgz: 654af8dfaadcc9e2cffa7bef33758b8be6b76ea8deee208180a69fe219d68c6e jupyterlab-toc-extension-6.1.5.tgz: 854ab64f98545986216ee4ab919c820015f4e2c6489ad397964c238d98f325cf jupyterlab-tooltip-4.1.5.tgz: fef552ee46f145247542dc4c21a7a39ecd30471e2b89b057f2445a70db591abd jupyterlab-tooltip-extension-4.1.5.tgz: bfb60a4ad0f85bed604d628431699efdf9995461aa062fd9f53bdcea1c2ba321 jupyterlab-translation-4.1.5.tgz: ed77c686843c6ce97c92f12222f107e66f58ce2783297eefb6c2ea356adcd65d jupyterlab-translation-extension-4.1.5.tgz: 71c39e0c547373f2d2b4096b33ec1c7c6324c437e6295a18063d1a64ab745729 jupyterlab-ui-components-4.1.5.tgz: d477f00468602bcdaf8664ebe6189ec9029dbd4e65e355fc90fb3de12b812248 jupyterlab-ui-components-extension-4.1.5.tgz: 63716b66d911e526c91a882d57a62e31bd2efc5776e438d276a7e800c31c1ced jupyterlab-vega5-extension-4.1.5.tgz: c20f549db354f40b7ed252a6b3621273c603a3a1339b6fe3ca28733c21289dfa --------- Signed-off-by: dependabot[bot] Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: krassowski <5832902+krassowski@users.noreply.github.com> Co-authored-by: David Hummel Co-authored-by: github-actions[bot] Co-authored-by: Frédéric Collonval Co-authored-by: Jason Weill <93281816+JasonWeill@users.noreply.github.com> Co-authored-by: Jeremy Tuloup Co-authored-by: g547315 <132482386+g547315@users.noreply.github.com> Co-authored-by: Nicolas Brichet <32258950+brichet@users.noreply.github.com> Co-authored-by: Min RK Co-authored-by: krassowski Co-authored-by: nluetts <44254521+nluetts@users.noreply.github.com> Co-authored-by: gabalafou Co-authored-by: kiliansinger Co-authored-by: Duc Trung Le Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Lumberbot (aka Jack) <39504233+meeseeksmachine@users.noreply.github.com> Co-authored-by: Allan Chain <36528777+AllanChain@users.noreply.github.com> Co-authored-by: Nicolas Brichet Co-authored-by: FoSuCloud <49218295+FoSuCloud@users.noreply.github.com> --- .bumpversion.cfg | 2 +- .../Dockerfile.dockerignore => .dockerignore | 1 + .github/pull_request_template.md | 2 +- .github/workflows/check-release.yml | 4 +- .github/workflows/codeql-analysis.yml | 4 +- .github/workflows/docker-test.yml | 5 + .github/workflows/linuxjs-tests.yml | 4 +- .github/workflows/linuxtests.yml | 6 +- .github/workflows/macostests.yml | 4 +- .github/workflows/windowstests.yml | 4 +- .pre-commit-config.yaml | 4 +- CHANGELOG.md | 201 +- CONTRIBUTING.md | 2 +- README.md | 24 +- RELEASE.md | 15 +- binder/environment.yml | 8 +- builder/package.json | 2 +- buildutils/package.json | 2 +- buildutils/src/clean-packages.ts | 2 +- buildutils/src/ensure-repo.ts | 4 +- buildutils/template/package.json | 4 +- dev_mode/package.json | 292 +-- docker/Dockerfile | 41 +- docker/environment.yml | 17 + docker/start.sh | 7 +- docs/source/conf.py | 2 +- docs/source/developer/accessibility.rst | 2 +- docs/source/developer/components.rst | 2 +- docs/source/developer/contributing.rst | 14 +- docs/source/developer/css.rst | 2 +- docs/source/developer/repo.rst | 2 +- docs/source/extension/extension_dev.rst | 12 +- docs/source/extension/extension_migration.rst | 29 +- docs/source/extension/extension_tutorial.rst | 2 +- docs/source/extension/identity.rst | 2 +- .../source/extension/internationalization.rst | 2 +- docs/source/extension/notebook.rst | 37 + docs/source/extension/ui_components.rst | 3 +- docs/source/getting_started/faq.rst | 10 +- docs/source/getting_started/installation.rst | 7 +- docs/source/getting_started/lifecycle.rst | 34 + docs/source/getting_started/overview.rst | 3 +- docs/source/index.rst | 2 +- docs/source/user/extensions.rst | 6 +- docs/source/user/index.md | 2 +- examples/app/package.json | 68 +- examples/cell/package.json | 22 +- examples/console/package.json | 18 +- examples/federated/core_package/package.json | 168 +- examples/federated/md_package/package.json | 10 +- .../federated/middle_package/package.json | 4 +- examples/federated/package.json | 2 +- examples/filebrowser/package.json | 26 +- .../example-linux.png | Bin 108737 -> 108729 bytes examples/notebook/package.json | 34 +- examples/notebook/src/commands.ts | 24 +- examples/terminal/package.json | 12 +- galata/README.md | 2 +- galata/extension/package.json | 20 +- galata/package.json | 20 +- ...ge-code-notebook-ipynb-benchmark-linux.png | Bin 46173 -> 47966 bytes .../language-chinese-documentation-linux.png | Bin 50758 -> 50689 bytes galata/test/jupyterlab/console.test.ts | 44 + galata/test/jupyterlab/contextmenu.test.ts | 26 + .../console-content-jupyterlab-linux.png | Bin 0 -> 3101 bytes .../console-prompt-jupyterlab-linux.png | Bin 0 -> 3865 bytes .../fileeditor-jupyterlab-linux.png | Bin 8621 -> 8425 bytes ...ession-script-sources-jupyterlab-linux.png | Bin 4800 -> 3297 bytes ...debug-session-sources-jupyterlab-linux.png | Bin 4639 -> 3185 bytes .../mobile-layout-jupyterlab-linux.png | Bin 4929 -> 4967 bytes .../notebook-scroll-no-windowing.test.ts | 101 + .../test/jupyterlab/notebook-scroll.test.ts | 101 + .../search-new-outputs-jupyterlab-linux.png | Bin 10637 -> 10719 bytes .../search-on-new-cell-jupyterlab-linux.png | Bin 23896 -> 23940 bytes ...search-within-outputs-jupyterlab-linux.png | Bin 35933 -> 25601 bytes .../test/jupyterlab/notebook-toolbar.test.ts | 187 +- .../paste-cell-jupyterlab-linux.png | Bin 10986 -> 11214 bytes ...-overlay-hover-normal-jupyterlab-linux.png | Bin 4164 -> 4360 bytes ...-overlay-hover-scroll-jupyterlab-linux.png | Bin 8612 -> 6231 bytes .../test/jupyterlab/outputarea-stdin.test.ts | 64 +- galata/test/jupyterlab/toolbars.test.ts | 44 + galata/test/jupyterlab/utils.ts | 63 +- jupyterlab/_version.py | 2 +- jupyterlab/browser-test.js | 7 +- jupyterlab/commands.py | 4 +- jupyterlab/staging/package.json | 292 +-- jupyterlab/staging/yarn.lock | 2144 ++++++++-------- .../mock_packages/extension/package.json | 6 +- .../interop/consumer/package.json | 6 +- .../interop/provider/package.json | 6 +- .../mock_packages/interop/token/package.json | 2 +- packages/application-extension/package.json | 20 +- .../schema/commands.json | 60 +- packages/application/package.json | 22 +- packages/apputils-extension/package.json | 28 +- .../apputils-extension/src/announcements.ts | 2 +- .../src/workspacesplugin.ts | 2 +- packages/apputils/package.json | 22 +- packages/apputils/src/domutils.ts | 18 + packages/apputils/test/domutils.spec.ts | 68 + packages/attachments/package.json | 10 +- packages/cell-toolbar-extension/package.json | 12 +- packages/cell-toolbar/package.json | 16 +- packages/cells/package.json | 34 +- packages/cells/src/widget.ts | 8 +- packages/cells/test/widget.spec.ts | 29 +- packages/celltags-extension/package.json | 10 +- packages/codeeditor/package.json | 18 +- packages/codemirror-extension/package.json | 16 +- .../codemirror-extension/src/services.tsx | 12 +- packages/codemirror/package.json | 14 +- packages/codemirror/src/commands.ts | 25 + packages/codemirror/src/extension.ts | 4 +- packages/codemirror/src/index.ts | 1 + packages/codemirror/src/language.ts | 11 +- packages/codemirror/src/pythonBuiltin.ts | 159 ++ packages/codemirror/src/searchprovider.ts | 14 +- packages/codemirror/src/theme.ts | 4 + packages/codemirror/style/base.css | 7 +- packages/completer-extension/package.json | 12 +- .../schema/inline-completer.json | 3 +- packages/completer/package.json | 24 +- packages/completer/src/handler.ts | 33 +- packages/console-extension/package.json | 26 +- .../console-extension/schema/tracker.json | 10 + packages/console-extension/src/index.ts | 89 +- packages/console/package.json | 26 +- packages/console/src/widget.ts | 73 +- packages/console/test/widget.spec.ts | 13 + packages/coreutils/package.json | 2 +- packages/csvviewer-extension/package.json | 20 +- packages/csvviewer/package.json | 12 +- packages/debugger-extension/package.json | 34 +- packages/debugger/package.json | 34 +- packages/docmanager-extension/package.json | 22 +- packages/docmanager/package.json | 18 +- packages/docregistry/package.json | 22 +- .../documentsearch-extension/package.json | 12 +- packages/documentsearch/package.json | 10 +- .../extensionmanager-extension/package.json | 14 +- packages/extensionmanager/package.json | 12 +- packages/extensionmanager/src/widget.tsx | 4 +- packages/filebrowser-extension/package.json | 26 +- packages/filebrowser/package.json | 22 +- packages/filebrowser/src/browser.ts | 23 + packages/filebrowser/src/listing.ts | 25 +- packages/filebrowser/style/base.css | 12 +- packages/filebrowser/test/browser.spec.ts | 65 + packages/filebrowser/test/listing.spec.ts | 38 +- packages/fileeditor-extension/package.json | 46 +- packages/fileeditor-extension/src/commands.ts | 10 +- packages/fileeditor/package.json | 26 +- .../fileeditor/src/fileeditorlspadapter.ts | 6 + packages/help-extension/package.json | 16 +- packages/help-extension/src/index.tsx | 4 +- packages/htmlviewer-extension/package.json | 18 +- packages/htmlviewer/package.json | 12 +- packages/hub-extension/package.json | 12 +- packages/imageviewer-extension/package.json | 12 +- packages/imageviewer/package.json | 10 +- packages/inspector-extension/package.json | 18 +- packages/inspector/package.json | 18 +- packages/javascript-extension/README.md | 2 +- packages/javascript-extension/package.json | 6 +- packages/json-extension/README.md | 2 +- packages/json-extension/package.json | 12 +- packages/launcher-extension/package.json | 14 +- packages/launcher/package.json | 8 +- packages/logconsole-extension/package.json | 20 +- packages/logconsole/package.json | 16 +- packages/lsp-extension/package.json | 16 +- packages/lsp/package.json | 18 +- packages/mainmenu-extension/package.json | 18 +- .../mainmenu-extension/schema/plugin.json | 8 +- packages/mainmenu/package.json | 10 +- .../markdownviewer-extension/package.json | 18 +- packages/markdownviewer/package.json | 14 +- packages/markedparser-extension/package.json | 12 +- packages/mathjax-extension/package.json | 6 +- packages/mermaid-extension/package.json | 12 +- packages/mermaid/package.json | 8 +- packages/metadataform-extension/package.json | 14 +- packages/metadataform/package.json | 16 +- packages/metapackage/package.json | 192 +- .../test/completer/handler.spec.ts | 22 +- packages/nbconvert-css/package.json | 16 +- packages/nbformat/package.json | 4 +- packages/notebook-extension/package.json | 60 +- .../notebook-extension/schema/tracker.json | 88 +- packages/notebook-extension/src/index.ts | 15 +- packages/notebook/package.json | 38 +- packages/notebook/src/actions.tsx | 9 +- packages/notebook/src/searchprovider.ts | 17 +- packages/notebook/src/widget.ts | 27 +- packages/notebook/test/actions.spec.ts | 33 +- packages/notebook/test/searchprovider.spec.ts | 25 + packages/observables/package.json | 4 +- packages/outputarea/package.json | 18 +- packages/pdf-extension/package.json | 4 +- packages/pluginmanager-extension/package.json | 12 +- packages/pluginmanager/package.json | 16 +- packages/property-inspector/package.json | 8 +- packages/rendermime-extension/package.json | 12 +- packages/rendermime-interfaces/package.json | 2 +- packages/rendermime/package.json | 18 +- packages/rendermime/src/widgets.ts | 68 +- packages/running-extension/package.json | 18 +- packages/running/package.json | 8 +- packages/services/README.md | 2 +- .../services/examples/browser/package.json | 6 +- packages/services/examples/node/package.json | 4 +- .../package.json | 10 +- packages/services/package.json | 12 +- packages/services/src/config/index.ts | 6 +- packages/services/src/contents/index.ts | 30 +- packages/services/src/kernel/default.ts | 6 +- packages/services/src/kernel/kernel.ts | 4 +- packages/services/src/kernel/restapi.ts | 14 +- packages/services/src/kernelspec/restapi.ts | 4 +- packages/services/src/serverconnection.ts | 11 +- packages/services/src/session/default.ts | 2 +- packages/services/src/session/session.ts | 4 +- packages/services/src/testutils.ts | 98 +- packages/settingeditor-extension/package.json | 22 +- packages/settingeditor/package.json | 22 +- packages/settingregistry/package.json | 8 +- .../settingregistry/src/settingregistry.ts | 33 +- packages/shortcuts-extension/package.json | 12 +- packages/statedb/package.json | 4 +- packages/statusbar-extension/package.json | 12 +- packages/statusbar/package.json | 6 +- packages/terminal-extension/package.json | 22 +- packages/terminal/package.json | 10 +- packages/testing/package.json | 4 +- packages/testing/src/jest-shim.ts | 69 + packages/theme-dark-extension/package.json | 8 +- packages/theme-light-extension/package.json | 8 +- packages/toc-extension/package.json | 12 +- packages/toc/package.json | 20 +- packages/tooltip-extension/package.json | 22 +- packages/tooltip/package.json | 10 +- packages/translation-extension/package.json | 12 +- packages/translation/package.json | 12 +- packages/ui-components-extension/package.json | 6 +- packages/ui-components/docs/source/intro.rst | 2 +- .../ui-components/docs/source/labicon.rst | 2 +- .../simple-windowed-list/package.json | 12 +- packages/ui-components/package.json | 12 +- .../ui-components/src/components/search.tsx | 5 +- .../ui-components/src/components/toolbar.tsx | 86 +- packages/ui-components/style/toolbar.css | 4 + packages/ui-components/test/search.spec.tsx | 46 + packages/vega5-extension/README.md | 2 +- packages/vega5-extension/package.json | 6 +- pyproject.toml | 2 +- testutils/package.json | 12 +- yarn.lock | 2169 +++++++++-------- 257 files changed, 5854 insertions(+), 3992 deletions(-) rename docker/Dockerfile.dockerignore => .dockerignore (99%) create mode 100644 docker/environment.yml create mode 100644 docs/source/getting_started/lifecycle.rst create mode 100644 galata/test/jupyterlab/console.test.ts create mode 100644 galata/test/jupyterlab/contextmenu.test.ts-snapshots/console-content-jupyterlab-linux.png create mode 100644 galata/test/jupyterlab/contextmenu.test.ts-snapshots/console-prompt-jupyterlab-linux.png create mode 100644 packages/apputils/test/domutils.spec.ts create mode 100644 packages/codemirror/src/pythonBuiltin.ts create mode 100644 packages/ui-components/test/search.spec.tsx diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 2bc1b7eb7c7d..d96f15036b38 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4, 1, 0, "final", 0 +current_version = 4, 1, 5, "final", 0 commit = False tag = False parse = (?P\d+)\,\ (?P\d+)\,\ (?P\d+)\,\ \"(?P\S+)\"\,\ (?P\d+) diff --git a/docker/Dockerfile.dockerignore b/.dockerignore similarity index 99% rename from docker/Dockerfile.dockerignore rename to .dockerignore index 2b2e51e32df4..1d24d037066d 100644 --- a/docker/Dockerfile.dockerignore +++ b/.dockerignore @@ -40,3 +40,4 @@ tests/**/coverage tests/**/.cache-loader **/node_modules +.yarn diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9f3671a8ce8d..98dca2f648b8 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,7 +2,7 @@ Thanks for contributing to JupyterLab! Please fill out the following items to submit a pull request. See the contributing guidelines for more information: -https://github.com/jupyterlab/jupyterlab/blob/main/CONTRIBUTING.md +https://github.com/jupyterlab/jupyterlab/blob/4.1.x/CONTRIBUTING.md --> ## References diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml index 37ef8dfcd612..4528a6f2e086 100644 --- a/.github/workflows/check-release.yml +++ b/.github/workflows/check-release.yml @@ -2,9 +2,9 @@ name: Check Release on: push: - branches: [main] + branches: [4.1.x] pull_request: - branches: [main] + branches: [4.1.x] release: types: [published] diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 2fc415830193..f1103c6669b0 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -7,10 +7,10 @@ name: "CodeQL" on: push: - branches: [main] + branches: [4.1.x] pull_request: # The branches below must be a subset of the branches above - branches: [main] + branches: [4.1.x] schedule: - cron: '0 8 * * 3' diff --git a/.github/workflows/docker-test.yml b/.github/workflows/docker-test.yml index 7a05dc79bec0..3b1728416929 100644 --- a/.github/workflows/docker-test.yml +++ b/.github/workflows/docker-test.yml @@ -3,10 +3,15 @@ name: Docker Tests on: schedule: - cron: '0 0 * * *' + push: + branches: [4.1.x] + pull_request: + branches: [4.1.x] jobs: docker: name: Docker Dev Container + if: ${{ github.event_name == 'schedule' }} || contains( github.event.pull_request.title, '[docker]') runs-on: ubuntu-22.04 steps: - name: Checkout diff --git a/.github/workflows/linuxjs-tests.yml b/.github/workflows/linuxjs-tests.yml index 351309a64d68..2f4d0d8f94a6 100644 --- a/.github/workflows/linuxjs-tests.yml +++ b/.github/workflows/linuxjs-tests.yml @@ -2,9 +2,9 @@ name: Linux JS Tests on: push: - branches: [main] + branches: [4.1.x] pull_request: - branches: [main] + branches: [4.1.x] release: types: [published] diff --git a/.github/workflows/linuxtests.yml b/.github/workflows/linuxtests.yml index 4b4b57946d38..d1bf5199621b 100644 --- a/.github/workflows/linuxtests.yml +++ b/.github/workflows/linuxtests.yml @@ -2,9 +2,9 @@ name: Linux Tests on: push: - branches: [main] + branches: [4.1.x] pull_request: - branches: [main] + branches: [4.1.x] release: types: [published] @@ -154,4 +154,4 @@ jobs: - uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1 with: ignore_glob: "docs/api packages/ui-components/docs/source/ui_components.rst images" - ignore_links: ".*/images/[\\w-]+.png https://docs.github.com/en/.* https://jupyterlab.github.io https://mybinder.org/v2/gh/jupyterlab/.*" + ignore_links: ".*/images/[\\w-]+.png https://docs.github.com/en/.* https://jupyterlab.github.io https://mybinder.org/v2/gh/jupyterlab/.* https://github.com/[^/]+/?$" diff --git a/.github/workflows/macostests.yml b/.github/workflows/macostests.yml index a3c3bff3c8b9..40bf2514e132 100644 --- a/.github/workflows/macostests.yml +++ b/.github/workflows/macostests.yml @@ -2,9 +2,9 @@ name: macOS Tests on: push: - branches: [main] + branches: [4.1.x] pull_request: - branches: [main] + branches: [4.1.x] release: types: [published] diff --git a/.github/workflows/windowstests.yml b/.github/workflows/windowstests.yml index e9142e7fa527..49a1edfafcea 100644 --- a/.github/workflows/windowstests.yml +++ b/.github/workflows/windowstests.yml @@ -2,9 +2,9 @@ name: Windows Tests on: push: - branches: [main] + branches: [4.1.x] pull_request: - branches: [main] + branches: [4.1.x] release: types: [published] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7febae4f58a1..a7905f0f12ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,13 +27,13 @@ repos: exclude: (.bumpversion.cfg|yarn.js) - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.27.3 + rev: 0.27.4 hooks: - id: check-github-workflows # Check ruff version is aligned with the one in pyproject.toml - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.15 + rev: v0.2.0 hooks: - id: ruff args: ["--fix"] diff --git a/CHANGELOG.md b/CHANGELOG.md index e514ed4cfe75..8ec1c68189a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,16 +6,16 @@ ## v4.1 -JupyterLab 4.1 includes a number of new features (described below), bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-0-to-4-1) which lists deprecations and changes to the public API. +JupyterLab 4.1 includes a number of new features (described below), bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/stable/extension/extension_migration.html#jupyterlab-4-0-to-4-1) which lists deprecations and changes to the public API. ### Custom CSS -Jupyterlab now supports automatic loading of custom CSS. +JupyterLab now supports automatic loading of custom CSS. Themes are the recommended way for customizing the JupyterLab look and feel, while custom CSS is intended for minor personal adjustments. To opt in, start JupyterLab with the `--custom-css` flag. -The location of the `custom.css` file is documented in the section on [customizing the user interface](https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#custom-css). +The location of the `custom.css` file is documented in the section on [customizing the user interface](https://jupyterlab.readthedocs.io/en/stable/user/interface_customization.html#custom-css). ```{note} `custom.css` is also available in Jupyter Notebook; @@ -43,7 +43,7 @@ C -->|Two| E[Result 2] which renders as: - + ### Inline completer @@ -52,7 +52,7 @@ allowing generative AI models to provide multi-line completions. The suggestions are provided by plugins implementing the ``IInlineCompletionProvider`` API; by default a single provider which uses kernel history is available. - + The suggestions can be invoked as-you-type or manually using a configurable shortcut (by default Alt + \\). The default keyboard shortcuts are displayed in the small widget shown when hovering over the ghost suggestion: @@ -63,10 +63,10 @@ The default keyboard shortcuts are displayed in the small widget shown when hove To enable the inline suggestions based on the kernel history, go to Settings → Inline Completer → History provider → check the "enabled" checkbox. In addition to the built-in history suggestions, -the [`jupyter-ai`](https://github.com/jupyterlab/jupyter-ai) extension will provide +the [`jupyter-ai`](https://github.com/jupyterlab/jupyter-ai) extension can provide suggestions from supported models. -The `jupyter-ai` integration with inline completer can be tested starting with the -[v2.10.0beta1](https://github.com/jupyterlab/jupyter-ai/releases/tag/v2.10.0beta1) pre-release. +The `jupyter-ai` integration with inline completer is available starting with the +[v2.10.0](https://github.com/jupyterlab/jupyter-ai/releases/tag/v2.10.0) release. The Inline Completer API is still considered experimental and may be subject to changes, please share feedback! @@ -77,35 +77,35 @@ Numerous improvements to keyboard navigation with focus on accessibility and usa - the focus can now be moved beyond the active notebook - the toolbars can now be navigated using arrow keys -For more details, see [this post on Jupyter Blog](https://blog.jupyter.org/recent-keyboard-navigation-improvements-in-jupyter-4df32f97628d). +For more details, see [this post on the Jupyter Blog](https://blog.jupyter.org/recent-keyboard-navigation-improvements-in-jupyter-4df32f97628d). ### Execution history in notebook The code from previously executed cells can be used to populate empty cells, -allowing to iterate on code from previous cells or even sessions +allowing to iterate on code from previous cells or even previous sessions (depending on how a specific kernel stores history). -To cycle between history items press Alt + Arrow Up and Alt + Arrow Down. +To cycle between history items, press Alt + Arrow Up and Alt + Arrow Down. To enable execution history, go to Settings → Notebook → check the "Kernel history access" checkbox. This feature was already available in the console in previous releases; it only works with kernels supporting execution history requests. -To clear the execution history consult the documentation of the kernel you are using (e.g., IPython/ipykernel). +To clear the execution history, consult the documentation of the kernel you are using (e.g., IPython/ipykernel). ### Opening files from tracebacks -Paths to code files detected in the tracebacks returned by kernels on execution error are now turned into links. +Paths to code files detected in tracebacks returned by kernels on execution error are now turned into links. These links will open the corresponding file for editing, if it is in the Jupyter root directory, or they will open a read-only preview if the file is outside of the root directory and the active kernel supports the debugger. - + ### Error indicator in the table of contents When a cell fails during execution, an error indicator will be displayed by the corresponding heading, increasing awareness of the notebook state and enabling users to quickly navigate to the cell which requires attention. - + ### Plugin Manager @@ -113,18 +113,18 @@ Individual plugins can now be disabled or enabled from a new Plugin Manager user Each extension is composed of one or more plugins, and plugins form the basis of JupyterLab itself, thus the plugin manager enables more extensive customization of the JupyterLab experience. - + -This feature is intended for advanced users and documented in depth in the [documentation](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#managing-plugins-with-plugin-manager). +This feature is intended for advanced users and is documented in depth in the [documentation](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html#managing-plugins-with-plugin-manager). -Administrators may want to [lock specific plugins](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#locking-and-unlocking-plugins) if they are required for any reason; this will prevent users from disabling the plugins via Plugin Manager and remote API calls. The Plugin Manager itself can be [disabled using the CLI](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#enabling-and-disabling-extensions). +Administrators may want to [lock specific plugins](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html#locking-and-unlocking-plugins) if they are required for any reason; this will prevent users from disabling the plugins via Plugin Manager and remote API calls. The Plugin Manager itself can be [disabled using the CLI](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html#enabling-and-disabling-extensions). ### Virtual scrollbar for notebook in windowed mode The windowed notebook received an optional scrollbar delineating the active cell and selected cells. Users can jump to a specific cell. - + To enable the virtual scrollbar, go to Settings → Notebook → Windowing mode, choose "full", and click on the hamburger icon (≡) which appears in the notebook's toolbar. @@ -186,7 +186,7 @@ Developers can now provide editor extensions, like themes and programming langua #### New extension manager Starting with JupyterLab 3, extensions can be installed via Python packages -(or other providers of [prebuilt extensions](https://jupyterlab.readthedocs.io/en/latest/extension/extension_dev.html#prebuilt-extensions)). +(or other providers of [prebuilt extensions](https://jupyterlab.readthedocs.io/en/stable/extension/extension_dev.html#prebuilt-extensions)). In JupyterLab 4, building on this feature, the Extension Manager now includes extensions from [pypi.org](https://pypi.org/search/?c=Framework+%3A%3A+Jupyter+%3A%3A+JupyterLab). This removes the build step from installation of extension when using Extension Manager. @@ -260,12 +260,149 @@ Here are the main tool updates that will benefit extension authors and developer We recommend using Node.js v18 or newer, because older versions will reach end of life in 2023 or earlier (see [Node release schedule](https://github.com/nodejs/release#release-schedule)). -To ease code migration to JupyterLab 4, developers should review the [migration guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html). A few existing extensions have already been migrated and can be used as examples: +To ease code migration to JupyterLab 4, developers should review the [migration guide](https://jupyterlab.readthedocs.io/en/stable/extension/extension_migration.html). A few existing extensions have already been migrated and can be used as examples: - the [JupyterLab Extensions by Examples](https://github.com/jupyterlab/extension-examples/pull/232) - the [Jupyter MIME type renderers](https://github.com/jupyterlab/jupyter-renderers/pull/296) +## 4.1.5 + +([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.1.4...a5fa0aa9ba3b561f116d9b4d2e9bf775f95b67a1)) + +### Bugs fixed + +- Fix Theme color is not applied to Toolbar Button [#15957](https://github.com/jupyterlab/jupyterlab/pull/15957) ([@FoSuCloud](https://github.com/FoSuCloud)) +- Uses the browser window's selection as the default search query [#15834](https://github.com/jupyterlab/jupyterlab/pull/15834) ([@JasonWeill](https://github.com/JasonWeill)) +- Show outline on the full item in file browser, only when needed [#15860](https://github.com/jupyterlab/jupyterlab/pull/15860) ([@krassowski](https://github.com/krassowski)) +- Short-circuit `selectItemByName()` if already selected [#15970](https://github.com/jupyterlab/jupyterlab/pull/15970) ([@krassowski](https://github.com/krassowski)) +- Fix browser-test.js [#15892](https://github.com/jupyterlab/jupyterlab/pull/15892) ([@fcollonval](https://github.com/fcollonval)) +- Avoid concurrency when computing the items in notebook toolbar [#15954](https://github.com/jupyterlab/jupyterlab/pull/15954) ([@brichet](https://github.com/brichet)) +- Fixes filter for Chinese, other non-ASCII filenames [#15935](https://github.com/jupyterlab/jupyterlab/pull/15935) ([@JasonWeill](https://github.com/JasonWeill)) + +### Maintenance and upkeep improvements + +- Ignore links to GitHub user and organisation profiles [#15959](https://github.com/jupyterlab/jupyterlab/pull/15959) ([@krassowski](https://github.com/krassowski)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupyterlab/jupyterlab/graphs/contributors?from=2024-03-07&to=2024-03-14&type=c)) + +[@andrii-i](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aandrii-i+updated%3A2024-03-07..2024-03-14&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Abrichet+updated%3A2024-03-07..2024-03-14&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajtpio+updated%3A2024-03-07..2024-03-14&type=Issues) | [@jupyterlab-probot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-probot+updated%3A2024-03-07..2024-03-14&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akrassowski+updated%3A2024-03-07..2024-03-14&type=Issues) | [@linlol](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Alinlol+updated%3A2024-03-07..2024-03-14&type=Issues) | [@meeseeksmachine](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ameeseeksmachine+updated%3A2024-03-07..2024-03-14&type=Issues) | [@welcome](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Awelcome+updated%3A2024-03-07..2024-03-14&type=Issues) + + + +## 4.1.4 + +([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.1.3...3eab4adc3053485cacfefc02dd5e8bc6fb256442)) + +### Bugs fixed + +- Fix creating files in custom drives, fix `ContentsManagerMock` [#15291](https://github.com/jupyterlab/jupyterlab/pull/15291) ([@jtpio](https://github.com/jtpio)) +- Fix Theme color is not applied to SwitchKernel ToolbarButton [#15924](https://github.com/jupyterlab/jupyterlab/pull/15924) ([@FoSuCloud](https://github.com/FoSuCloud)) +- Revert "Prevent command shortcuts from preventing user input" [#15938](https://github.com/jupyterlab/jupyterlab/pull/15938) ([@krassowski](https://github.com/krassowski)) +- Fix spurious dedent when opening inspector tooltip [#15898](https://github.com/jupyterlab/jupyterlab/pull/15898) ([@krassowski](https://github.com/krassowski)) +- Add an explicit default for inline completer providers [#15899](https://github.com/jupyterlab/jupyterlab/pull/15899) ([@krassowski](https://github.com/krassowski)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupyterlab/jupyterlab/graphs/contributors?from=2024-03-04&to=2024-03-07&type=c)) + +[@ericsnekbytes](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aericsnekbytes+updated%3A2024-03-04..2024-03-07&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Agithub-actions+updated%3A2024-03-04..2024-03-07&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajtpio+updated%3A2024-03-04..2024-03-07&type=Issues) | [@jupyterlab-probot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-probot+updated%3A2024-03-04..2024-03-07&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akrassowski+updated%3A2024-03-04..2024-03-07&type=Issues) | [@meeseeksmachine](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ameeseeksmachine+updated%3A2024-03-04..2024-03-07&type=Issues) + +## 4.1.3 + +([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.1.2...58a6905e3b29e95d1b7ff00b0fbc5472eaee769b)) + +### Bugs fixed + +- Fix Pressing enter in console with console run keystroke set to enter creates a newline and runs [#15869](https://github.com/jupyterlab/jupyterlab/pull/15869) ([@FoSuCloud](https://github.com/FoSuCloud)) +- Fix saving of item positions in reactive toolbar [#15843](https://github.com/jupyterlab/jupyterlab/pull/15843) ([@brichet](https://github.com/brichet)) +- Prevent command shortcuts from preventing user input [#15790](https://github.com/jupyterlab/jupyterlab/pull/15790) ([@krassowski](https://github.com/krassowski)) +- Fix missing signals in file editor adapter [#15873](https://github.com/jupyterlab/jupyterlab/pull/15873) ([@krassowski](https://github.com/krassowski)) +- Fix codemirror highlight for Python builtin [#15805](https://github.com/jupyterlab/jupyterlab/pull/15805) ([@AllanChain](https://github.com/AllanChain)) +- When attaching only typeset after rendering is completed [#15810](https://github.com/jupyterlab/jupyterlab/pull/15810) ([@krassowski](https://github.com/krassowski)) + +### Maintenance and upkeep improvements + +- Update docstrings to mention Jupyter Server API [#15880](https://github.com/jupyterlab/jupyterlab/pull/15880) ([@jtpio](https://github.com/jtpio)) +- Bump es5-ext from 0.10.62 to 0.10.63 [#15878](https://github.com/jupyterlab/jupyterlab/pull/15878) ([@dependabot\[bot\]](https://github.com/apps/dependabot)) +- Fix clean script [#15854](https://github.com/jupyterlab/jupyterlab/pull/15854) ([@krassowski](https://github.com/krassowski)) +- Update branch configuration for `4.1.x` [#15848](https://github.com/jupyterlab/jupyterlab/pull/15848) ([@krassowski](https://github.com/krassowski)) + +### Documentation improvements + +- Fix broken link [#15851](https://github.com/jupyterlab/jupyterlab/pull/15851) ([@fcollonval](https://github.com/fcollonval)) +- Update branch configuration for `4.1.x` [#15848](https://github.com/jupyterlab/jupyterlab/pull/15848) ([@krassowski](https://github.com/krassowski)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupyterlab/jupyterlab/graphs/contributors?from=2024-02-19&to=2024-03-04&type=c)) + +[@AllanChain](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AAllanChain+updated%3A2024-02-19..2024-03-04&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Abrichet+updated%3A2024-02-19..2024-03-04&type=Issues) | [@ericsnekbytes](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aericsnekbytes+updated%3A2024-02-19..2024-03-04&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Afcollonval+updated%3A2024-02-19..2024-03-04&type=Issues) | [@FoSuCloud](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AFoSuCloud+updated%3A2024-02-19..2024-03-04&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Agithub-actions+updated%3A2024-02-19..2024-03-04&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AJasonWeill+updated%3A2024-02-19..2024-03-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajtpio+updated%3A2024-02-19..2024-03-04&type=Issues) | [@jupyterlab-probot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-probot+updated%3A2024-02-19..2024-03-04&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akrassowski+updated%3A2024-02-19..2024-03-04&type=Issues) | [@linlol](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Alinlol+updated%3A2024-02-19..2024-03-04&type=Issues) | [@lumberbot-app](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Alumberbot-app+updated%3A2024-02-19..2024-03-04&type=Issues) | [@meeseeksmachine](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ameeseeksmachine+updated%3A2024-02-19..2024-03-04&type=Issues) | [@welcome](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Awelcome+updated%3A2024-02-19..2024-03-04&type=Issues) + +## 4.1.2 + +([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.1.1...d835cf35dfd37bbe930c79c90a6d180a800bae69)) + +### Bugs fixed + +- Fix highlight sequencing when replacing text in code cells [#15803](https://github.com/jupyterlab/jupyterlab/pull/15803) ([@JasonWeill](https://github.com/JasonWeill)) +- Windows platforms, erratic pasting of text into Markdown field [#15794](https://github.com/jupyterlab/jupyterlab/pull/15794) ([@kiliansinger](https://github.com/kiliansinger)) +- Restore notebook scrolling on dragging a cell to the viewport edge [#15782](https://github.com/jupyterlab/jupyterlab/pull/15782) ([@krassowski](https://github.com/krassowski)) +- Fix typing in editable elements inside of open shadow DOM [#15774](https://github.com/jupyterlab/jupyterlab/pull/15774) ([@krassowski](https://github.com/krassowski)) + +### Maintenance and upkeep improvements + +- \[docker\] Allow non-unique GID [#15699](https://github.com/jupyterlab/jupyterlab/pull/15699) ([@trungleduc](https://github.com/trungleduc)) + +### Documentation improvements + +- Remove SO links, add more recent issue to FAQ [#15811](https://github.com/jupyterlab/jupyterlab/pull/15811) ([@krassowski](https://github.com/krassowski)) +- Fix outdated link to mybinder.org on index page of documentation [#15800](https://github.com/jupyterlab/jupyterlab/pull/15800) ([@nluetts](https://github.com/nluetts)) +- Fix typing in editable elements inside of open shadow DOM [#15774](https://github.com/jupyterlab/jupyterlab/pull/15774) ([@krassowski](https://github.com/krassowski)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupyterlab/jupyterlab/graphs/contributors?from=2024-02-13&to=2024-02-19&type=c)) + +[@FoSuCloud](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AFoSuCloud+updated%3A2024-02-13..2024-02-19&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Agithub-actions+updated%3A2024-02-13..2024-02-19&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AJasonWeill+updated%3A2024-02-13..2024-02-19&type=Issues) | [@jupyterlab-probot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-probot+updated%3A2024-02-13..2024-02-19&type=Issues) | [@kiliansinger](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akiliansinger+updated%3A2024-02-13..2024-02-19&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akrassowski+updated%3A2024-02-13..2024-02-19&type=Issues) | [@lumberbot-app](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Alumberbot-app+updated%3A2024-02-13..2024-02-19&type=Issues) | [@nluetts](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Anluetts+updated%3A2024-02-13..2024-02-19&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Atrungleduc+updated%3A2024-02-13..2024-02-19&type=Issues) | [@welcome](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Awelcome+updated%3A2024-02-13..2024-02-19&type=Issues) + +## 4.1.1 + +([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.1.0...6abcf80374af290d7ba958a1f1f64f92c0394d0e)) + +### Bugs fixed + +- Correct Alt + number keyboard shortcuts command map [#15791](https://github.com/jupyterlab/jupyterlab/pull/15791) ([@g547315](https://github.com/g547315)) +- Catch errors attempting to access `document.cookie` [#15788](https://github.com/jupyterlab/jupyterlab/pull/15788) ([@minrk](https://github.com/minrk)) +- Fix undo/redo in console, fix undo/redo enabled state in file editor [#15783](https://github.com/jupyterlab/jupyterlab/pull/15783) ([@krassowski](https://github.com/krassowski)) +- Fix console cells not becoming read-only after execution [#15779](https://github.com/jupyterlab/jupyterlab/pull/15779) ([@krassowski](https://github.com/krassowski)) +- Fix migration of command selectors for shortcuts [#15762](https://github.com/jupyterlab/jupyterlab/pull/15762) ([@krassowski](https://github.com/krassowski)) +- Disable (shift + ) alt + number shortcuts on Mac [#15761](https://github.com/jupyterlab/jupyterlab/pull/15761) ([@krassowski](https://github.com/krassowski)) +- Catch `OSError` in addition to `PermissionError` when `sys_prefix` is read-only [#15756](https://github.com/jupyterlab/jupyterlab/pull/15756) ([@dhml](https://github.com/dhml)) +- Fix completer auto-invoking on non-source changes [#15753](https://github.com/jupyterlab/jupyterlab/pull/15753) ([@krassowski](https://github.com/krassowski)) +- Fix outputs preservation on splitting cells [#15751](https://github.com/jupyterlab/jupyterlab/pull/15751) ([@krassowski](https://github.com/krassowski)) + +### Maintenance and upkeep improvements + +- Update `jupyter-collaboration` for the Binder environment [#15767](https://github.com/jupyterlab/jupyterlab/pull/15767) ([@jtpio](https://github.com/jtpio)) +- Fix failing "Notebook Toolbar › Paste cell" test [#15720](https://github.com/jupyterlab/jupyterlab/pull/15720) ([@krassowski](https://github.com/krassowski)) + +### Documentation improvements + +- Add Edge, remove IE 11 from browser support docs [#15784](https://github.com/jupyterlab/jupyterlab/pull/15784) ([@JasonWeill](https://github.com/JasonWeill)) +- Update changelog to reflect jupyter-ai release status [#15775](https://github.com/jupyterlab/jupyterlab/pull/15775) ([@krassowski](https://github.com/krassowski)) +- Add a link to postmortem for 3.6.7 release [#15743](https://github.com/jupyterlab/jupyterlab/pull/15743) ([@krassowski](https://github.com/krassowski)) +- Update maintainers affiliation [#15724](https://github.com/jupyterlab/jupyterlab/pull/15724) ([@fcollonval](https://github.com/fcollonval)) +- Update lifecycle info for JupyterLab major versions [#15626](https://github.com/jupyterlab/jupyterlab/pull/15626) ([@JasonWeill](https://github.com/JasonWeill)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupyterlab/jupyterlab/graphs/contributors?from=2024-02-05&to=2024-02-13&type=c)) + +[@davidbrochart](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adavidbrochart+updated%3A2024-02-05..2024-02-13&type=Issues) | [@dhml](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adhml+updated%3A2024-02-05..2024-02-13&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Afcollonval+updated%3A2024-02-05..2024-02-13&type=Issues) | [@g547315](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ag547315+updated%3A2024-02-05..2024-02-13&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Agithub-actions+updated%3A2024-02-05..2024-02-13&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AJasonWeill+updated%3A2024-02-05..2024-02-13&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajtpio+updated%3A2024-02-05..2024-02-13&type=Issues) | [@jupyterlab-probot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-probot+updated%3A2024-02-05..2024-02-13&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akrassowski+updated%3A2024-02-05..2024-02-13&type=Issues) | [@lumberbot-app](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Alumberbot-app+updated%3A2024-02-05..2024-02-13&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aminrk+updated%3A2024-02-05..2024-02-13&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Apre-commit-ci+updated%3A2024-02-05..2024-02-13&type=Issues) | [@welcome](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Awelcome+updated%3A2024-02-05..2024-02-13&type=Issues) + ## 4.1.0 ([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.0.2...b887949d52310234144dd48496fa7a6f1fbb4645)) @@ -369,7 +506,7 @@ To ease code migration to JupyterLab 4, developers should review the [migration - Remove unnecessary requirement from codemirror service plugin [#15362](https://github.com/jupyterlab/jupyterlab/pull/15362) ([@paulkim3151](https://github.com/paulkim3151)) - Update notebook window on resize if height changes [#15357](https://github.com/jupyterlab/jupyterlab/pull/15357) ([@krassowski](https://github.com/krassowski)) - Fix scrolling past long outputs in presence of un-rendered headings [#15356](https://github.com/jupyterlab/jupyterlab/pull/15356) ([@krassowski](https://github.com/krassowski)) -- Fix missing default property breaking codemirror `overrides.json` [#15346](https://github.com/jupyterlab/jupyterlab/pull/15346) ([@LJMP](https://github.com/LJMP)) +- Fix missing default property breaking codemirror `overrides.json` [#15346](https://github.com/jupyterlab/jupyterlab/pull/15346) ([@LJMP](https://github.com/e4e)) - Fix update button in extension manager [#15331](https://github.com/jupyterlab/jupyterlab/pull/15331) ([@nbowditch-einblick](https://github.com/nbowditch-einblick)) - Fix collapsed cells styling [#15322](https://github.com/jupyterlab/jupyterlab/pull/15322) ([@fcollonval](https://github.com/fcollonval)) - Fix scrolling when dragging files in the file browser [#15318](https://github.com/jupyterlab/jupyterlab/pull/15318) ([@krassowski](https://github.com/krassowski)) @@ -659,8 +796,6 @@ To ease code migration to JupyterLab 4, developers should review the [migration [@afshin](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aafshin+updated%3A2023-06-08..2024-02-05&type=Issues) | [@akx](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aakx+updated%3A2023-06-08..2024-02-05&type=Issues) | [@alden-ilao](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aalden-ilao+updated%3A2023-06-08..2024-02-05&type=Issues) | [@AllanChain](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AAllanChain+updated%3A2023-06-08..2024-02-05&type=Issues) | [@andrewfulton9](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aandrewfulton9+updated%3A2023-06-08..2024-02-05&type=Issues) | [@andrii-i](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aandrii-i+updated%3A2023-06-08..2024-02-05&type=Issues) | [@ashna1jain](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aashna1jain+updated%3A2023-06-08..2024-02-05&type=Issues) | [@bikash30851](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Abikash30851+updated%3A2023-06-08..2024-02-05&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ablink1073+updated%3A2023-06-08..2024-02-05&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Abollwyvl+updated%3A2023-06-08..2024-02-05&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Abrichet+updated%3A2023-06-08..2024-02-05&type=Issues) | [@brijsiyag](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Abrijsiyag+updated%3A2023-06-08..2024-02-05&type=Issues) | [@coriegulik](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Acoriegulik+updated%3A2023-06-08..2024-02-05&type=Issues) | [@davidbrochart](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adavidbrochart+updated%3A2023-06-08..2024-02-05&type=Issues) | [@DcWire](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ADcWire+updated%3A2023-06-08..2024-02-05&type=Issues) | [@Deepali1211](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ADeepali1211+updated%3A2023-06-08..2024-02-05&type=Issues) | [@DenisaCG](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ADenisaCG+updated%3A2023-06-08..2024-02-05&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adependabot+updated%3A2023-06-08..2024-02-05&type=Issues) | [@dharmaquark](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adharmaquark+updated%3A2023-06-08..2024-02-05&type=Issues) | [@divyansshhh](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adivyansshhh+updated%3A2023-06-08..2024-02-05&type=Issues) | [@dolevf](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Adolevf+updated%3A2023-06-08..2024-02-05&type=Issues) | [@DonJayamanne](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ADonJayamanne+updated%3A2023-06-08..2024-02-05&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aecharles+updated%3A2023-06-08..2024-02-05&type=Issues) | [@eliaslma](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aeliaslma+updated%3A2023-06-08..2024-02-05&type=Issues) | [@emmanuel-ferdman](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aemmanuel-ferdman+updated%3A2023-06-08..2024-02-05&type=Issues) | [@ericsnekbytes](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aericsnekbytes+updated%3A2023-06-08..2024-02-05&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Afcollonval+updated%3A2023-06-08..2024-02-05&type=Issues) | [@firai](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Afirai+updated%3A2023-06-08..2024-02-05&type=Issues) | [@FoSuCloud](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AFoSuCloud+updated%3A2023-06-08..2024-02-05&type=Issues) | [@g547315](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ag547315+updated%3A2023-06-08..2024-02-05&type=Issues) | [@gabalafou](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Agabalafou+updated%3A2023-06-08..2024-02-05&type=Issues) | [@GabrielaVives](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AGabrielaVives+updated%3A2023-06-08..2024-02-05&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Agithub-actions+updated%3A2023-06-08..2024-02-05&type=Issues) | [@HaudinFlorence](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AHaudinFlorence+updated%3A2023-06-08..2024-02-05&type=Issues) | [@hbcarlos](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ahbcarlos+updated%3A2023-06-08..2024-02-05&type=Issues) | [@holzman](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aholzman+updated%3A2023-06-08..2024-02-05&type=Issues) | [@isabela-pf](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aisabela-pf+updated%3A2023-06-08..2024-02-05&type=Issues) | [@j264415](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aj264415+updated%3A2023-06-08..2024-02-05&type=Issues) | [@jans-code](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajans-code+updated%3A2023-06-08..2024-02-05&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AJasonWeill+updated%3A2023-06-08..2024-02-05&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajtpio+updated%3A2023-06-08..2024-02-05&type=Issues) | [@jupyterlab-bot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-bot+updated%3A2023-06-08..2024-02-05&type=Issues) | [@jupyterlab-probot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ajupyterlab-probot+updated%3A2023-06-08..2024-02-05&type=Issues) | [@KiranmaiKalla](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AKiranmaiKalla+updated%3A2023-06-08..2024-02-05&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Akrassowski+updated%3A2023-06-08..2024-02-05&type=Issues) | [@LJMP](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ALJMP+updated%3A2023-06-08..2024-02-05&type=Issues) | [@lumberbot-app](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Alumberbot-app+updated%3A2023-06-08..2024-02-05&type=Issues) | [@m158261](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Am158261+updated%3A2023-06-08..2024-02-05&type=Issues) | [@mctoohey](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Amctoohey+updated%3A2023-06-08..2024-02-05&type=Issues) | [@mdengler](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Amdengler+updated%3A2023-06-08..2024-02-05&type=Issues) | [@MFA-X-AI](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AMFA-X-AI+updated%3A2023-06-08..2024-02-05&type=Issues) | [@misterfads](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Amisterfads+updated%3A2023-06-08..2024-02-05&type=Issues) | [@mlucool](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Amlucool+updated%3A2023-06-08..2024-02-05&type=Issues) | [@mmichilot](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ammichilot+updated%3A2023-06-08..2024-02-05&type=Issues) | [@nbowditch-einblick](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Anbowditch-einblick+updated%3A2023-06-08..2024-02-05&type=Issues) | [@nishikantparmariam](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Anishikantparmariam+updated%3A2023-06-08..2024-02-05&type=Issues) | [@paolocarinci](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Apaolocarinci+updated%3A2023-06-08..2024-02-05&type=Issues) | [@parmentelat](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aparmentelat+updated%3A2023-06-08..2024-02-05&type=Issues) | [@pauky](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Apauky+updated%3A2023-06-08..2024-02-05&type=Issues) | [@paulkim3151](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Apaulkim3151+updated%3A2023-06-08..2024-02-05&type=Issues) | [@phil-zxx](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Aphil-zxx+updated%3A2023-06-08..2024-02-05&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Apre-commit-ci+updated%3A2023-06-08..2024-02-05&type=Issues) | [@Rmarieta](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ARmarieta+updated%3A2023-06-08..2024-02-05&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ARRosio+updated%3A2023-06-08..2024-02-05&type=Issues) | [@Sarthug99](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ASarthug99+updated%3A2023-06-08..2024-02-05&type=Issues) | [@sinistersnare](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Asinistersnare+updated%3A2023-06-08..2024-02-05&type=Issues) | [@skyetim](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Askyetim+updated%3A2023-06-08..2024-02-05&type=Issues) | [@smacke](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Asmacke+updated%3A2023-06-08..2024-02-05&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3ASylvainCorlay+updated%3A2023-06-08..2024-02-05&type=Issues) | [@t03857785](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3At03857785+updated%3A2023-06-08..2024-02-05&type=Issues) | [@tibdex](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Atibdex+updated%3A2023-06-08..2024-02-05&type=Issues) | [@timkpaine](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Atimkpaine+updated%3A2023-06-08..2024-02-05&type=Issues) | [@tonyfast](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Atonyfast+updated%3A2023-06-08..2024-02-05&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Atrungleduc+updated%3A2023-06-08..2024-02-05&type=Issues) | [@welcome](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Awelcome+updated%3A2023-06-08..2024-02-05&type=Issues) | [@Wh1isper](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3AWh1isper+updated%3A2023-06-08..2024-02-05&type=Issues) | [@yuvipanda](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab+involves%3Ayuvipanda+updated%3A2023-06-08..2024-02-05&type=Issues) - - ## 4.1.0rc1 ([Full Changelog](https://github.com/jupyterlab/jupyterlab/compare/v4.1.0rc0...5ba76a876091ca80c612a3747fe2767219a19ca5)) @@ -932,7 +1067,7 @@ To ease code migration to JupyterLab 4, developers should review the [migration - Remove unnecessary requirement from codemirror service plugin [#15362](https://github.com/jupyterlab/jupyterlab/pull/15362) ([@paulkim3151](https://github.com/paulkim3151)) - Update notebook window on resize if height changes [#15357](https://github.com/jupyterlab/jupyterlab/pull/15357) ([@krassowski](https://github.com/krassowski)) - Fix scrolling past long outputs in presence of un-rendered headings [#15356](https://github.com/jupyterlab/jupyterlab/pull/15356) ([@krassowski](https://github.com/krassowski)) -- Fix missing default property breaking codemirror `overrides.json` [#15346](https://github.com/jupyterlab/jupyterlab/pull/15346) ([@LJMP](https://github.com/LJMP)) +- Fix missing default property breaking codemirror `overrides.json` [#15346](https://github.com/jupyterlab/jupyterlab/pull/15346) ([@LJMP](https://github.com/e4e)) - Fix update button in extension manager [#15331](https://github.com/jupyterlab/jupyterlab/pull/15331) ([@nbowditch-einblick](https://github.com/nbowditch-einblick)) - Fix collapsed cells styling [#15322](https://github.com/jupyterlab/jupyterlab/pull/15322) ([@fcollonval](https://github.com/fcollonval)) - Fix scrolling when dragging files in the file browser [#15318](https://github.com/jupyterlab/jupyterlab/pull/15318) ([@krassowski](https://github.com/krassowski)) @@ -1305,9 +1440,9 @@ To ease code migration to JupyterLab 4, developers should review the [migration JupyterLab 4 is released! :tada: -Check out the new features, improvements and bug fixes: https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-0 +Check out the new features, improvements and bug fixes: https://jupyterlab.readthedocs.io/en/stable/getting_started/changelog.html#v4-0 -For extension authors, there is a migration guide available to help you migrate your extensions to JupyterLab 4: https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-3-x-to-4-x +For extension authors, there is a migration guide available to help you migrate your extensions to JupyterLab 4: https://jupyterlab.readthedocs.io/en/stable/extension/extension_migration.html#jupyterlab-3-x-to-4-x ______________________________________________________________________ @@ -3210,7 +3345,7 @@ No merged PRs ### Enhancements made -- Add a menu entry to show/hide hidden files in the filebrowser [#11206](https://github.com/jupyterlab/jupyterlab/pull/11206) ([@loichuder](https://github.com/loichuder)) - activation instructions: [see documentation](https://jupyterlab.readthedocs.io/en/latest/user/files.html#displaying-hidden-files) +- Add a menu entry to show/hide hidden files in the filebrowser [#11206](https://github.com/jupyterlab/jupyterlab/pull/11206) ([@loichuder](https://github.com/loichuder)) - activation instructions: [see documentation](https://jupyterlab.readthedocs.io/en/stable/user/files.html#displaying-hidden-files) - Restore Copy shareable link use of `shareUrl` [#11188](https://github.com/jupyterlab/jupyterlab/pull/11188) ([@fcollonval](https://github.com/fcollonval)) - Add Galata in JupyterLab [#11179](https://github.com/jupyterlab/jupyterlab/pull/11179) ([@fcollonval](https://github.com/fcollonval)) - Responsive Toolbar [#11178](https://github.com/jupyterlab/jupyterlab/pull/11178) ([@3coins](https://github.com/3coins)) @@ -3656,9 +3791,9 @@ No merged PRs - From JupyterLab 3.1, file documents and notebooks have collaborative editing using the [Yjs shared editing framework](https://github.com/yjs/yjs). Editors are not collaborative by default; to activate it, start JupyterLab - with the `--collaborative` flag. See full documentation on [collaboration](https://jupyterlab.readthedocs.io/en/latest/user/rtc.html). + with the `--collaborative` flag. See full documentation on [collaboration](https://jupyterlab.readthedocs.io/en/stable/user/rtc.html). - The undo/redo history in the notebook is now document-wide (tracking changes across all cells); the future verisions will enable restoring the previous behaviour of per-cell undo/redo. -- Table of Contents recieved multiple new features and settings described in the [user documentation](https://jupyterlab.readthedocs.io/en/latest/user/toc.html). +- Table of Contents recieved multiple new features and settings described in the [user documentation](https://jupyterlab.readthedocs.io/en/stable/user/toc.html). - The debugger recived many improvements, including basic support for evaluating code at a breakpoint, and for variable inspection. - The closing bracket is no longer automatically added by default; the old behaviour can be re-enabled from the menu bar (`Settings` -> `Auto Close Brackets`) or from the Advanced Settings Editor. - A new visual indicator was introduced to highlight cells in which the code changed in the editor since last execution: @@ -4279,21 +4414,21 @@ extensions does not require rebuilding JupyterLab and does not require having NodeJS installed. The previous way of distributing extensions as npm packages requiring rebuilding JupyterLab is still available as well. See the -[documentation](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html#extensions) +[documentation](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html#extensions) for more details. #### The JupyterLab interface supports multiple languages JupyterLab now provides the ability to set the display language of the user interface. See the -[documentation](https://jupyterlab.readthedocs.io/en/latest/user/language.html) +[documentation](https://jupyterlab.readthedocs.io/en/stable/user/language.html) for more details. #### A new visual debugger JupyterLab now ships with a debugger front-end by default, available for kernels that support the new debugging protocol. See the -[documentation](https://jupyterlab.readthedocs.io/en/latest/user/debugger.html) +[documentation](https://jupyterlab.readthedocs.io/en/stable/user/debugger.html) for more details. #### Improvements to Simple Interface mode and Mobile diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 51ee26aabc0f..a389d39bd1ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,5 +4,5 @@ If you're reading this section, you're probably interested in contributing to JupyterLab. Welcome and thanks for your interest in contributing! Please take a look at Contributing to Jupyterlab on -[Read the Docs](https://jupyterlab.readthedocs.io/en/latest/developer/contributing.html) or +[Read the Docs](https://jupyterlab.readthedocs.io/en/stable/developer/contributing.html) or [Repo docs](docs/source/developer/contributing.rst) (for the latest). diff --git a/README.md b/README.md index 706cf560a7f7..dba46105ddc2 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ via [PyPI](https://pypi.org/search/?q=jupyterlab&o=-created&c=Framework+%3A%3A+J conda, and other package managers. The _source_ extensions can be installed directly from npm (search for [jupyterlab-extension](https://www.npmjs.com/search?q=keywords:jupyterlab-extension)) but require an additional build step. You can also find JupyterLab extensions exploring GitHub topic [jupyterlab-extension](https://github.com/topics/jupyterlab-extension). -To learn more about extensions, see the [user documentation](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html). +To learn more about extensions, see the [user documentation](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html). Read the current JupyterLab documentation on [ReadTheDocs](http://jupyterlab.readthedocs.io/en/stable/). @@ -60,7 +60,7 @@ If you use [conda](https://docs.conda.io/en/latest/), [mamba](https://mamba.read ``` If installing using `pip install --user`, you must add the user-level `bin` directory to your `PATH` environment variable in order to launch `jupyter lab`. If you are using a Unix derivative (e.g., FreeBSD, GNU/Linux, macOS), you can do this by running `export PATH="$HOME/.local/bin:$PATH"`. If you are using a macOS version that comes with Python 2, run `pip3` instead of `pip`. -For more detailed instructions, consult the [installation guide](http://jupyterlab.readthedocs.io/en/latest/getting_started/installation.html). Project installation instructions from the git sources are available in the [contributor documentation](CONTRIBUTING.md). +For more detailed instructions, consult the [installation guide](http://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html). Project installation instructions from the git sources are available in the [contributor documentation](CONTRIBUTING.md). #### Installing with Previous Versions of Jupyter Notebook @@ -78,7 +78,7 @@ Start up JupyterLab using: jupyter lab ``` -JupyterLab will open automatically in the browser. See the [documentation](http://jupyterlab.readthedocs.io/en/latest/getting_started/starting.html) for additional details. +JupyterLab will open automatically in the browser. See the [documentation](http://jupyterlab.readthedocs.io/en/stable/getting_started/starting.html) for additional details. If you encounter an error like "Command 'jupyter' not found", please make sure `PATH` environment variable is set correctly. Alternatively, you can start up JupyterLab using `~/.local/bin/jupyter lab` without changing the `PATH` environment variable. @@ -90,7 +90,7 @@ The latest versions of the following browsers are currently _known to work_: - Chrome - Safari -See our [documentation](http://jupyterlab.readthedocs.io/en/latest/getting_started/installation.html) for additional details. +See our [documentation](http://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html) for additional details. --- @@ -100,7 +100,7 @@ We encourage you to ask questions on the [Discourse forum](https://discourse.jup ### Bug report -To report a bug please read the [guidelines](https://jupyterlab.readthedocs.io/en/latest/getting_started/issue.html) and then open a [Github issue](https://github.com/jupyterlab/jupyterlab/issues/new?labels=bug%2C+status%3ANeeds+Triage&template=bug_report.md). To keep resolved issues self-contained, the [lock bot](https://github.com/apps/lock) will lock closed issues as resolved after a period of inactivity. If a related discussion is still needed after an issue is locked, please open a new issue and reference the old issue. +To report a bug please read the [guidelines](https://jupyterlab.readthedocs.io/en/stable/getting_started/issue.html) and then open a [Github issue](https://github.com/jupyterlab/jupyterlab/issues/new?labels=bug%2C+status%3ANeeds+Triage&template=bug_report.md). To keep resolved issues self-contained, the [lock bot](https://github.com/apps/lock) will lock closed issues as resolved after a period of inactivity. If a related discussion is still needed after an issue is locked, please open a new issue and reference the old issue. ### Feature request @@ -112,37 +112,37 @@ We also welcome suggestions for new features as they help make the project more ### Extending JupyterLab -To start developing an extension for JupyterLab, see the [developer documentation](https://jupyterlab.readthedocs.io/en/latest/extension/extension_dev.html) and the [API docs](https://jupyterlab.readthedocs.io/en/latest/api/). +To start developing an extension for JupyterLab, see the [developer documentation](https://jupyterlab.readthedocs.io/en/stable/extension/extension_dev.html) and the [API docs](https://jupyterlab.readthedocs.io/en/stable/api/). ### Contributing -To contribute code or documentation to JupyterLab itself, please read the [contributor documentation](https://jupyterlab.readthedocs.io/en/latest/developer/contributing.html). +To contribute code or documentation to JupyterLab itself, please read the [contributor documentation](https://jupyterlab.readthedocs.io/en/stable/developer/contributing.html). JupyterLab follows the Jupyter [Community Guides](https://jupyter.readthedocs.io/en/latest/community/content-community.html). ### License JupyterLab uses a shared copyright model that enables all contributors to maintain the -copyright on their contributions. All code is licensed under the terms of the revised [BSD license](https://github.com/jupyterlab/jupyterlab/blob/main/LICENSE). +copyright on their contributions. All code is licensed under the terms of the revised [BSD license](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/LICENSE). ### Team -JupyterLab is part of [Project Jupyter](http://jupyter.org/) and is developed by an open community. The maintenance team is assisted by a much larger group of contributors to JupyterLab and Project Jupyter as a whole. +JupyterLab is part of [Project Jupyter](https://jupyter.org/) and is developed by an open community. The maintenance team is assisted by a much larger group of contributors to JupyterLab and Project Jupyter as a whole. JupyterLab's current maintainers are listed in alphabetical order, with affiliation, and main areas of contribution: - Mehmet Bektas, Netflix (general development, extensions). - Alex Bozarth, IBM (general development, extensions). - Eric Charles, Datalayer, (general development, extensions). -- Frédéric Collonval, QuantStack (general development, extensions). -- Martha Cryan, IBM (general development, extensions). +- Frédéric Collonval, WebScIT (general development, extensions). +- Martha Cryan, Mito (general development, extensions). - Afshin Darian, QuantStack (co-creator, application/high-level architecture, prolific contributions throughout the code base). - Vidar T. Fauske, JPMorgan Chase (general development, extensions). - Brian Granger, AWS (co-creator, strategy, vision, management, UI/UX design, architecture). - Jason Grout, Databricks (co-creator, vision, general development). -- Michał Krassowski, University of Oxford (general development, extensions). +- Michał Krassowski, Quansight (general development, extensions). - Max Klein, JPMorgan Chase (UI Package, build system, general development, extensions). - Gonzalo Peña-Castellanos, QuanSight (general development, i18n, extensions). - Fernando Perez, UC Berkeley (co-creator, vision). diff --git a/RELEASE.md b/RELEASE.md index 4bd657faf5a8..f81148dcd5f6 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -262,9 +262,9 @@ These lines: - [ ] https://github.com/jupyterlab/jupyter-renderers - [ ] Publish a release (with a **updated tag**) to the [extension template](https://github.com/jupyterlab/extension-template/releases) with the new JupyterLab version - [ ] Update the extension examples: - - [ ] [Notebook toolbar button](https://github.com/jupyterlab/jupyterlab/blob/main/docs/source/extension/notebook.rst#adding-a-button-to-the-toolbar) - - [ ] [Notebook widget](https://github.com/jupyterlab/jupyterlab/blob/main/docs/source/extension/notebook.rst#adding-a-widget-to-the-notebook-header) -- [ ] Update the [extension tutorial](https://github.com/jupyterlab/jupyterlab/blob/main/RELEASE.md#updating-the-extension-tutorial) + - [ ] [Notebook toolbar button](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/docs/source/extension/notebook.rst#adding-a-button-to-the-toolbar) + - [ ] [Notebook widget](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/docs/source/extension/notebook.rst#adding-a-widget-to-the-notebook-header) +- [ ] Update the [extension tutorial](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/RELEASE.md#updating-the-extension-tutorial) - [ ] At this point, there may have been some more commits merged. Run `python scripts/milestone_check.py` to check the issues assigned to this milestone one more time. Update changelog if necessary. Now do the actual final release: @@ -276,7 +276,7 @@ Now do the actual final release: - [ ] Update the API [docs](#updating-api-docs) - [ ] Merge the PRs on the other repos and set the default branch of the xckd repo -- [ ] Publish to [conda-forge](https://github.com/jupyterlab/jupyterlab/blob/main/RELEASE.md#publishing-to-conda-forge). +- [ ] Publish to [conda-forge](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/RELEASE.md#publishing-to-conda-forge). After a few days (to allow for possible patch releases), set up development for the next release: @@ -285,7 +285,7 @@ the next release: - [ ] Put the commit and tags to main - [ ] Run `npm run publish:all` to publish the packages - [ ] Release the other repos as appropriate -- [ ] Update version for [binder](https://github.com/jupyterlab/jupyterlab/blob/main/RELEASE.md#update-version-for-binder) +- [ ] Update version for [binder](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/RELEASE.md#update-version-for-binder) ### Updating the extension tutorial @@ -425,7 +425,7 @@ frozen and non-frozen version of the files. - Create a new branch from the previous release branch - Use a ".x" in the branch name so we can continue to use it for patches -- Update branch and RTD config in `ensure_repo.ts` and run `jlpm integrity` to update links - source should be the previous release branch +- Update branch and RTD config in `buildutils/src/ensure-repo.ts` and run `jlpm integrity` to update links - source should be the previous release branch - Update readthedocs branch config as appropriate - Automated Release using "minor" - edit changelog for new section - Move through alpha and beta phases as appropriate @@ -452,7 +452,7 @@ frozen and non-frozen version of the files. ### Alpha and Beta Phase -- Update branch and RTD config in `ensure_repo.ts` and `jlpm integrity` to update links - source should be the previous branch +- Update branch and RTD config in `buildutils/src/ensure-repo.ts` and `jlpm integrity` to update links - source should be the previous branch - Update readthedocs branch config as appropriate - Automated Release using "major" - edit changelog for new section - Move through alpha and beta phases as appropriate @@ -478,3 +478,4 @@ new issues show up in the future: - HTTP Error 502: Bad Gateway (JupyterLab `4.0.0a23`): https://github.com/jupyterlab/jupyterlab/issues/12324 - Degraded performance of npm publish (JupyterLab `4.0.0b2`): https://github.com/jupyterlab/jupyterlab/issues/14431 - Wrong URLs break publishing to npm with provenance: https://github.com/jupyterlab/jupyterlab/pull/15462 +- Release team missing privileges on packages removed in 4.0: https://github.com/jupyterlab/jupyterlab/issues/15677 diff --git a/binder/environment.yml b/binder/environment.yml index cb2fece7bb44..db7b66dc8a4e 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -55,11 +55,5 @@ dependencies: - xeus-python # extra conda stuff - jsonschema-with-format-nongpl - # jupyter-collaboration 1.2.0 - - jupyter_ydoc >=1.0.1,<2.0.0 - - ypy-websocket >=0.12.1,<0.13.0 + - jupyter-collaboration >= 2.0.1 - jupyter_events >=0.7.0 - - jupyter_server_fileid >=0.7.0,<1 - - pip: - # can't be installed with `conda` in binder, due to `jupyterlab-link-share`` - - jupyter-collaboration ==1.2.0 diff --git a/builder/package.json b/builder/package.json index 5915cfe4908e..72d207261efd 100644 --- a/builder/package.json +++ b/builder/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/builder", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Extension Builder", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { diff --git a/buildutils/package.json b/buildutils/package.json index 06774819316c..be6ef0f49782 100644 --- a/buildutils/package.json +++ b/buildutils/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/buildutils", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Build Utilities", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { diff --git a/buildutils/src/clean-packages.ts b/buildutils/src/clean-packages.ts index 026f927c9389..d5927b0621e0 100644 --- a/buildutils/src/clean-packages.ts +++ b/buildutils/src/clean-packages.ts @@ -13,7 +13,7 @@ exitOnUncaughtException(); // Get all of the packages. const basePath = path.resolve('.'); const baseConfig = readJSONFile(path.join(basePath, 'package.json')); -const packageConfig = baseConfig.workspaces.packages; +const packageConfig = baseConfig.workspaces.packages ?? baseConfig.workspaces; const skipSource = process.argv.indexOf('packages') === -1; const skipExamples = process.argv.indexOf('examples') === -1; diff --git a/buildutils/src/ensure-repo.ts b/buildutils/src/ensure-repo.ts index 73238e2a704c..db74d48b1ea5 100644 --- a/buildutils/src/ensure-repo.ts +++ b/buildutils/src/ensure-repo.ts @@ -36,8 +36,8 @@ type CoreData = Map; // All other release branches should target a specific named version const URL_CONFIG = { source: 'main', - target: 'main', - rtdVersion: 'latest' + target: '4.1.x', + rtdVersion: 'stable' }; // Data to ignore. diff --git a/buildutils/template/package.json b/buildutils/template/package.json index 5c24e2410671..ad4993093698 100644 --- a/buildutils/template/package.json +++ b/buildutils/template/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/template", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Package Template", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,7 +37,7 @@ "watch": "tsc -b --watch" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "rimraf": "~5.0.5", "typescript": "~5.1.6" diff --git a/dev_mode/package.json b/dev_mode/package.json index 7f6a42a305ca..813a3deb6753 100644 --- a/dev_mode/package.json +++ b/dev_mode/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/application-top", - "version": "4.1.0", + "version": "4.1.5", "private": true, "license": "BSD-3-Clause", "scripts": { @@ -23,101 +23,101 @@ "@jupyter/react-components": "~0.13.3", "@jupyter/web-components": "~0.13.3", "@jupyter/ydoc": "~1.1.1", - "@jupyterlab/application": "~4.1.0", - "@jupyterlab/application-extension": "~4.1.0", - "@jupyterlab/apputils": "~4.2.0", - "@jupyterlab/apputils-extension": "~4.1.0", - "@jupyterlab/attachments": "~4.1.0", - "@jupyterlab/cell-toolbar": "~4.1.0", - "@jupyterlab/cell-toolbar-extension": "~4.1.0", - "@jupyterlab/cells": "~4.1.0", - "@jupyterlab/celltags-extension": "~4.1.0", - "@jupyterlab/codeeditor": "~4.1.0", - "@jupyterlab/codemirror": "~4.1.0", - "@jupyterlab/codemirror-extension": "~4.1.0", - "@jupyterlab/completer": "~4.1.0", - "@jupyterlab/completer-extension": "~4.1.0", - "@jupyterlab/console": "~4.1.0", - "@jupyterlab/console-extension": "~4.1.0", - "@jupyterlab/coreutils": "~6.1.0", - "@jupyterlab/csvviewer": "~4.1.0", - "@jupyterlab/csvviewer-extension": "~4.1.0", - "@jupyterlab/debugger": "~4.1.0", - "@jupyterlab/debugger-extension": "~4.1.0", - "@jupyterlab/docmanager": "~4.1.0", - "@jupyterlab/docmanager-extension": "~4.1.0", - "@jupyterlab/docregistry": "~4.1.0", - "@jupyterlab/documentsearch": "~4.1.0", - "@jupyterlab/documentsearch-extension": "~4.1.0", - "@jupyterlab/extensionmanager": "~4.1.0", - "@jupyterlab/extensionmanager-extension": "~4.1.0", - "@jupyterlab/filebrowser": "~4.1.0", - "@jupyterlab/filebrowser-extension": "~4.1.0", - "@jupyterlab/fileeditor": "~4.1.0", - "@jupyterlab/fileeditor-extension": "~4.1.0", - "@jupyterlab/help-extension": "~4.1.0", - "@jupyterlab/htmlviewer": "~4.1.0", - "@jupyterlab/htmlviewer-extension": "~4.1.0", - "@jupyterlab/hub-extension": "~4.1.0", - "@jupyterlab/imageviewer": "~4.1.0", - "@jupyterlab/imageviewer-extension": "~4.1.0", - "@jupyterlab/inspector": "~4.1.0", - "@jupyterlab/inspector-extension": "~4.1.0", - "@jupyterlab/javascript-extension": "~4.1.0", - "@jupyterlab/json-extension": "~4.1.0", - "@jupyterlab/launcher": "~4.1.0", - "@jupyterlab/launcher-extension": "~4.1.0", - "@jupyterlab/logconsole": "~4.1.0", - "@jupyterlab/logconsole-extension": "~4.1.0", - "@jupyterlab/lsp": "~4.1.0", - "@jupyterlab/lsp-extension": "~4.1.0", - "@jupyterlab/mainmenu": "~4.1.0", - "@jupyterlab/mainmenu-extension": "~4.1.0", - "@jupyterlab/markdownviewer": "~4.1.0", - "@jupyterlab/markdownviewer-extension": "~4.1.0", - "@jupyterlab/markedparser-extension": "~4.1.0", - "@jupyterlab/mathjax-extension": "~4.1.0", - "@jupyterlab/mermaid": "~4.1.0", - "@jupyterlab/mermaid-extension": "~4.1.0", - "@jupyterlab/metadataform": "~4.1.0", - "@jupyterlab/metadataform-extension": "~4.1.0", - "@jupyterlab/metapackage": "~4.1.0", - "@jupyterlab/nbconvert-css": "~4.1.0", - "@jupyterlab/nbformat": "~4.1.0", - "@jupyterlab/notebook": "~4.1.0", - "@jupyterlab/notebook-extension": "~4.1.0", - "@jupyterlab/observables": "~5.1.0", - "@jupyterlab/outputarea": "~4.1.0", - "@jupyterlab/pdf-extension": "~4.1.0", - "@jupyterlab/pluginmanager": "~4.1.0", - "@jupyterlab/pluginmanager-extension": "~4.1.0", - "@jupyterlab/property-inspector": "~4.1.0", - "@jupyterlab/rendermime": "~4.1.0", - "@jupyterlab/rendermime-extension": "~4.1.0", - "@jupyterlab/rendermime-interfaces": "~3.9.0", - "@jupyterlab/running": "~4.1.0", - "@jupyterlab/running-extension": "~4.1.0", + "@jupyterlab/application": "~4.1.5", + "@jupyterlab/application-extension": "~4.1.5", + "@jupyterlab/apputils": "~4.2.5", + "@jupyterlab/apputils-extension": "~4.1.5", + "@jupyterlab/attachments": "~4.1.5", + "@jupyterlab/cell-toolbar": "~4.1.5", + "@jupyterlab/cell-toolbar-extension": "~4.1.5", + "@jupyterlab/cells": "~4.1.5", + "@jupyterlab/celltags-extension": "~4.1.5", + "@jupyterlab/codeeditor": "~4.1.5", + "@jupyterlab/codemirror": "~4.1.5", + "@jupyterlab/codemirror-extension": "~4.1.5", + "@jupyterlab/completer": "~4.1.5", + "@jupyterlab/completer-extension": "~4.1.5", + "@jupyterlab/console": "~4.1.5", + "@jupyterlab/console-extension": "~4.1.5", + "@jupyterlab/coreutils": "~6.1.5", + "@jupyterlab/csvviewer": "~4.1.5", + "@jupyterlab/csvviewer-extension": "~4.1.5", + "@jupyterlab/debugger": "~4.1.5", + "@jupyterlab/debugger-extension": "~4.1.5", + "@jupyterlab/docmanager": "~4.1.5", + "@jupyterlab/docmanager-extension": "~4.1.5", + "@jupyterlab/docregistry": "~4.1.5", + "@jupyterlab/documentsearch": "~4.1.5", + "@jupyterlab/documentsearch-extension": "~4.1.5", + "@jupyterlab/extensionmanager": "~4.1.5", + "@jupyterlab/extensionmanager-extension": "~4.1.5", + "@jupyterlab/filebrowser": "~4.1.5", + "@jupyterlab/filebrowser-extension": "~4.1.5", + "@jupyterlab/fileeditor": "~4.1.5", + "@jupyterlab/fileeditor-extension": "~4.1.5", + "@jupyterlab/help-extension": "~4.1.5", + "@jupyterlab/htmlviewer": "~4.1.5", + "@jupyterlab/htmlviewer-extension": "~4.1.5", + "@jupyterlab/hub-extension": "~4.1.5", + "@jupyterlab/imageviewer": "~4.1.5", + "@jupyterlab/imageviewer-extension": "~4.1.5", + "@jupyterlab/inspector": "~4.1.5", + "@jupyterlab/inspector-extension": "~4.1.5", + "@jupyterlab/javascript-extension": "~4.1.5", + "@jupyterlab/json-extension": "~4.1.5", + "@jupyterlab/launcher": "~4.1.5", + "@jupyterlab/launcher-extension": "~4.1.5", + "@jupyterlab/logconsole": "~4.1.5", + "@jupyterlab/logconsole-extension": "~4.1.5", + "@jupyterlab/lsp": "~4.1.5", + "@jupyterlab/lsp-extension": "~4.1.5", + "@jupyterlab/mainmenu": "~4.1.5", + "@jupyterlab/mainmenu-extension": "~4.1.5", + "@jupyterlab/markdownviewer": "~4.1.5", + "@jupyterlab/markdownviewer-extension": "~4.1.5", + "@jupyterlab/markedparser-extension": "~4.1.5", + "@jupyterlab/mathjax-extension": "~4.1.5", + "@jupyterlab/mermaid": "~4.1.5", + "@jupyterlab/mermaid-extension": "~4.1.5", + "@jupyterlab/metadataform": "~4.1.5", + "@jupyterlab/metadataform-extension": "~4.1.5", + "@jupyterlab/metapackage": "~4.1.5", + "@jupyterlab/nbconvert-css": "~4.1.5", + "@jupyterlab/nbformat": "~4.1.5", + "@jupyterlab/notebook": "~4.1.5", + "@jupyterlab/notebook-extension": "~4.1.5", + "@jupyterlab/observables": "~5.1.5", + "@jupyterlab/outputarea": "~4.1.5", + "@jupyterlab/pdf-extension": "~4.1.5", + "@jupyterlab/pluginmanager": "~4.1.5", + "@jupyterlab/pluginmanager-extension": "~4.1.5", + "@jupyterlab/property-inspector": "~4.1.5", + "@jupyterlab/rendermime": "~4.1.5", + "@jupyterlab/rendermime-extension": "~4.1.5", + "@jupyterlab/rendermime-interfaces": "~3.9.5", + "@jupyterlab/running": "~4.1.5", + "@jupyterlab/running-extension": "~4.1.5", "@jupyterlab/services": "../packages/services", - "@jupyterlab/settingeditor": "~4.1.0", - "@jupyterlab/settingeditor-extension": "~4.1.0", - "@jupyterlab/settingregistry": "~4.1.0", - "@jupyterlab/shortcuts-extension": "~4.1.0", - "@jupyterlab/statedb": "~4.1.0", - "@jupyterlab/statusbar": "~4.1.0", - "@jupyterlab/statusbar-extension": "~4.1.0", - "@jupyterlab/terminal": "~4.1.0", - "@jupyterlab/terminal-extension": "~4.1.0", - "@jupyterlab/theme-dark-extension": "~4.1.0", - "@jupyterlab/theme-light-extension": "~4.1.0", - "@jupyterlab/toc": "~6.1.0", - "@jupyterlab/toc-extension": "~6.1.0", - "@jupyterlab/tooltip": "~4.1.0", - "@jupyterlab/tooltip-extension": "~4.1.0", - "@jupyterlab/translation": "~4.1.0", - "@jupyterlab/translation-extension": "~4.1.0", - "@jupyterlab/ui-components": "~4.1.0", - "@jupyterlab/ui-components-extension": "~4.1.0", - "@jupyterlab/vega5-extension": "~4.1.0", + "@jupyterlab/settingeditor": "~4.1.5", + "@jupyterlab/settingeditor-extension": "~4.1.5", + "@jupyterlab/settingregistry": "~4.1.5", + "@jupyterlab/shortcuts-extension": "~4.1.5", + "@jupyterlab/statedb": "~4.1.5", + "@jupyterlab/statusbar": "~4.1.5", + "@jupyterlab/statusbar-extension": "~4.1.5", + "@jupyterlab/terminal": "~4.1.5", + "@jupyterlab/terminal-extension": "~4.1.5", + "@jupyterlab/theme-dark-extension": "~4.1.5", + "@jupyterlab/theme-light-extension": "~4.1.5", + "@jupyterlab/toc": "~6.1.5", + "@jupyterlab/toc-extension": "~6.1.5", + "@jupyterlab/tooltip": "~4.1.5", + "@jupyterlab/tooltip-extension": "~4.1.5", + "@jupyterlab/translation": "~4.1.5", + "@jupyterlab/translation-extension": "~4.1.5", + "@jupyterlab/ui-components": "~4.1.5", + "@jupyterlab/ui-components-extension": "~4.1.5", + "@jupyterlab/vega5-extension": "~4.1.5", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lumino/algorithm": "^2.0.0", @@ -142,58 +142,58 @@ "yjs": "^13.5.40" }, "dependencies": { - "@jupyterlab/application": "~4.1.0", - "@jupyterlab/application-extension": "~4.1.0", - "@jupyterlab/apputils-extension": "~4.1.0", - "@jupyterlab/cell-toolbar-extension": "~4.1.0", - "@jupyterlab/celltags-extension": "~4.1.0", - "@jupyterlab/codemirror-extension": "~4.1.0", - "@jupyterlab/completer-extension": "~4.1.0", - "@jupyterlab/console-extension": "~4.1.0", - "@jupyterlab/coreutils": "~6.1.0", - "@jupyterlab/csvviewer-extension": "~4.1.0", - "@jupyterlab/debugger-extension": "~4.1.0", - "@jupyterlab/docmanager-extension": "~4.1.0", - "@jupyterlab/documentsearch-extension": "~4.1.0", - "@jupyterlab/extensionmanager-extension": "~4.1.0", - "@jupyterlab/filebrowser-extension": "~4.1.0", - "@jupyterlab/fileeditor-extension": "~4.1.0", - "@jupyterlab/help-extension": "~4.1.0", - "@jupyterlab/htmlviewer-extension": "~4.1.0", - "@jupyterlab/hub-extension": "~4.1.0", - "@jupyterlab/imageviewer-extension": "~4.1.0", - "@jupyterlab/inspector-extension": "~4.1.0", - "@jupyterlab/javascript-extension": "~4.1.0", - "@jupyterlab/json-extension": "~4.1.0", - "@jupyterlab/launcher-extension": "~4.1.0", - "@jupyterlab/logconsole-extension": "~4.1.0", - "@jupyterlab/lsp-extension": "~4.1.0", - "@jupyterlab/mainmenu-extension": "~4.1.0", - "@jupyterlab/markdownviewer-extension": "~4.1.0", - "@jupyterlab/markedparser-extension": "~4.1.0", - "@jupyterlab/mathjax-extension": "~4.1.0", - "@jupyterlab/mermaid-extension": "~4.1.0", - "@jupyterlab/metadataform-extension": "~4.1.0", - "@jupyterlab/notebook-extension": "~4.1.0", - "@jupyterlab/pdf-extension": "~4.1.0", - "@jupyterlab/pluginmanager-extension": "~4.1.0", - "@jupyterlab/rendermime-extension": "~4.1.0", - "@jupyterlab/running-extension": "~4.1.0", - "@jupyterlab/settingeditor-extension": "~4.1.0", - "@jupyterlab/shortcuts-extension": "~4.1.0", - "@jupyterlab/statusbar-extension": "~4.1.0", - "@jupyterlab/terminal-extension": "~4.1.0", - "@jupyterlab/theme-dark-extension": "~4.1.0", - "@jupyterlab/theme-light-extension": "~4.1.0", - "@jupyterlab/toc-extension": "~6.1.0", - "@jupyterlab/tooltip-extension": "~4.1.0", - "@jupyterlab/translation-extension": "~4.1.0", - "@jupyterlab/ui-components-extension": "~4.1.0", - "@jupyterlab/vega5-extension": "~4.1.0" + "@jupyterlab/application": "~4.1.5", + "@jupyterlab/application-extension": "~4.1.5", + "@jupyterlab/apputils-extension": "~4.1.5", + "@jupyterlab/cell-toolbar-extension": "~4.1.5", + "@jupyterlab/celltags-extension": "~4.1.5", + "@jupyterlab/codemirror-extension": "~4.1.5", + "@jupyterlab/completer-extension": "~4.1.5", + "@jupyterlab/console-extension": "~4.1.5", + "@jupyterlab/coreutils": "~6.1.5", + "@jupyterlab/csvviewer-extension": "~4.1.5", + "@jupyterlab/debugger-extension": "~4.1.5", + "@jupyterlab/docmanager-extension": "~4.1.5", + "@jupyterlab/documentsearch-extension": "~4.1.5", + "@jupyterlab/extensionmanager-extension": "~4.1.5", + "@jupyterlab/filebrowser-extension": "~4.1.5", + "@jupyterlab/fileeditor-extension": "~4.1.5", + "@jupyterlab/help-extension": "~4.1.5", + "@jupyterlab/htmlviewer-extension": "~4.1.5", + "@jupyterlab/hub-extension": "~4.1.5", + "@jupyterlab/imageviewer-extension": "~4.1.5", + "@jupyterlab/inspector-extension": "~4.1.5", + "@jupyterlab/javascript-extension": "~4.1.5", + "@jupyterlab/json-extension": "~4.1.5", + "@jupyterlab/launcher-extension": "~4.1.5", + "@jupyterlab/logconsole-extension": "~4.1.5", + "@jupyterlab/lsp-extension": "~4.1.5", + "@jupyterlab/mainmenu-extension": "~4.1.5", + "@jupyterlab/markdownviewer-extension": "~4.1.5", + "@jupyterlab/markedparser-extension": "~4.1.5", + "@jupyterlab/mathjax-extension": "~4.1.5", + "@jupyterlab/mermaid-extension": "~4.1.5", + "@jupyterlab/metadataform-extension": "~4.1.5", + "@jupyterlab/notebook-extension": "~4.1.5", + "@jupyterlab/pdf-extension": "~4.1.5", + "@jupyterlab/pluginmanager-extension": "~4.1.5", + "@jupyterlab/rendermime-extension": "~4.1.5", + "@jupyterlab/running-extension": "~4.1.5", + "@jupyterlab/settingeditor-extension": "~4.1.5", + "@jupyterlab/shortcuts-extension": "~4.1.5", + "@jupyterlab/statusbar-extension": "~4.1.5", + "@jupyterlab/terminal-extension": "~4.1.5", + "@jupyterlab/theme-dark-extension": "~4.1.5", + "@jupyterlab/theme-light-extension": "~4.1.5", + "@jupyterlab/toc-extension": "~6.1.5", + "@jupyterlab/tooltip-extension": "~4.1.5", + "@jupyterlab/translation-extension": "~4.1.5", + "@jupyterlab/ui-components-extension": "~4.1.5", + "@jupyterlab/vega5-extension": "~4.1.5" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0", - "@jupyterlab/buildutils": "^4.1.0", + "@jupyterlab/builder": "^4.1.5", + "@jupyterlab/buildutils": "^4.1.5", "chokidar": "^3.4.0", "css-loader": "^6.7.1", "duplicate-package-checker-webpack-plugin": "^3.0.0", @@ -222,7 +222,7 @@ }, "jupyterlab": { "name": "JupyterLab", - "version": "4.1.0", + "version": "4.1.5", "extensions": { "@jupyterlab/application-extension": "", "@jupyterlab/apputils-extension": "", diff --git a/docker/Dockerfile b/docker/Dockerfile index 1cb5eef04b93..766c7d045e5d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,41 +1,40 @@ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -FROM mambaorg/micromamba:latest +FROM --platform=linux/amd64 mambaorg/micromamba:1.5.5-jammy # Create new user ARG NEW_MAMBA_USER_ID=57440 ARG NEW_MAMBA_USER_GID=57440 -ARG NEW_MAMBA_USER=labdev + USER root RUN if grep -q '^ID=alpine$' /etc/os-release; then \ - # alpine does not have usermod/groupmod - apk add --no-cache --virtual temp-packages shadow=4.13-r0; \ - fi && \ - usermod "--login=${NEW_MAMBA_USER}" "--home=/home/${NEW_MAMBA_USER}" \ - --move-home "-u ${NEW_MAMBA_USER_ID}" "${MAMBA_USER}" && \ - groupmod "--new-name=${NEW_MAMBA_USER}" \ - "-g ${NEW_MAMBA_USER_GID}" "${MAMBA_USER}" && \ - if grep -q '^ID=alpine$' /etc/os-release; then \ - # remove the packages that were only needed for usermod/groupmod - apk del temp-packages; \ - fi && \ - # Update the expected value of MAMBA_USER for the - # _entrypoint.sh consistency check. - echo "${NEW_MAMBA_USER}" > "/etc/arg_mamba_user" && \ - : -ENV MAMBA_USER=$NEW_MAMBA_USER + # alpine does not have usermod/groupmod + apk add --no-cache --virtual temp-packages shadow=4.13-r0; \ + fi +RUN if [ "$(id ${MAMBA_USER} -u)" != "$NEW_MAMBA_USER_ID" ]; then \ + usermod "-u ${NEW_MAMBA_USER_ID}" "${MAMBA_USER}"; \ + fi +RUN if [ "$(id ${MAMBA_USER} -g)" != "$NEW_MAMBA_USER_GID" ]; then \ + groupmod -o -g ${NEW_MAMBA_USER_GID} ${MAMBA_USER} && \ + usermod -g ${NEW_MAMBA_USER_GID} ${MAMBA_USER}; \ + fi +RUN if grep -q '^ID=alpine$' /etc/os-release; then \ + # remove the packages that were only needed for usermod/groupmod + apk del temp-packages; \ + fi + USER $MAMBA_USER WORKDIR /home/$MAMBA_USER/jupyterlab_cache -COPY --chown=$MAMBA_USER:$MAMBA_USER ../binder/environment.yml ./binder/environment.yml +COPY --chown=$MAMBA_USER:$MAMBA_USER docker/environment.yml ./docker/environment.yml -RUN micromamba install -n base -c conda-forge git rsync -y && micromamba install -y -n base -f ./binder/environment.yml && micromamba clean --all --yes +RUN micromamba install -n base -c conda-forge git rsync -y && micromamba install -y -n base -f ./docker/environment.yml && micromamba clean --all --yes -COPY --chown=$MAMBA_USER:$MAMBA_USER .. . +COPY --chown=$MAMBA_USER:$MAMBA_USER . . RUN micromamba run jlpm install diff --git a/docker/environment.yml b/docker/environment.yml new file mode 100644 index 000000000000..543e566069d4 --- /dev/null +++ b/docker/environment.yml @@ -0,0 +1,17 @@ +name: base + +channels: + - conda-forge + - nodefaults + +dependencies: + # runtimes + - nodejs ==20.1 + - python =3.11 + # package managers + - pip + - yarn >=3,<4 + # build + - hatch-jupyter-builder >=0.3.2 + - hatchling >=1.5.0 + - jupyterlab >=4,<5 diff --git a/docker/start.sh b/docker/start.sh index edaeb49cce6d..ab571f93f22f 100644 --- a/docker/start.sh +++ b/docker/start.sh @@ -8,8 +8,9 @@ set -o pipefail SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) ROOT_DIR=$(dirname $SCRIPT_DIR) -DEV_USER="labdev" +DEV_USER="mambauser" GID=$(id -g) +USER_ID=$(id -u) RSYNC_CMD="rsync -ar /home/$DEV_USER/jupyterlab_cache/node_modules/. /home/$DEV_USER/jupyterlab/node_modules" CMD=$1 # possible command: build, clean, dev, shell @@ -34,7 +35,7 @@ IMAGE_TAG="jupyterlab_dev:$ROOT_DIR_MD5" DEV_CONTAINER="jupyterlab_dev_container_$ROOT_DIR_MD5" build_image () { - docker build --build-arg NEW_MAMBA_USER_ID=$UID --build-arg NEW_MAMBA_USER_GID=$GID $ROOT_DIR -f $SCRIPT_DIR/Dockerfile -t $IMAGE_TAG + docker build --build-arg NEW_MAMBA_USER_ID=$USER_ID --build-arg NEW_MAMBA_USER_GID=$GID $ROOT_DIR -f $SCRIPT_DIR/Dockerfile -t $IMAGE_TAG } stop_contaniner () { @@ -68,5 +69,5 @@ if [[ $CMD == 'build' ]]; then if [[ $CMD == 'dev-detach' ]]; then RUN_MODE="-d" fi - docker run $RUN_MODE --name $DEV_CONTAINER --rm -p $PORT:$PORT -v $ROOT_DIR:/home/$DEV_USER/jupyterlab --entrypoint "/bin/bash" $IMAGE_TAG -i -c "$DOCKER_CMD" + docker run $RUN_MODE --user $USER_ID:$GID --name $DEV_CONTAINER --rm -p $PORT:$PORT -v $ROOT_DIR:/home/$DEV_USER/jupyterlab --entrypoint "/bin/bash" $IMAGE_TAG -i -c "$DOCKER_CMD" fi diff --git a/docs/source/conf.py b/docs/source/conf.py index 4cf9a2419df6..e9eb5f2dcbb9 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -308,7 +308,7 @@ def document_plugins_tokens_list(list_path: Path, output_path: Path) -> None: html_context = { "github_user": "jupyterlab", # Username "github_repo": "jupyterlab", # Repo name - "github_version": "main", # Version + "github_version": "4.1.x", # Version "doc_path": "docs/source/", # Path in the checkout to the docs root } diff --git a/docs/source/developer/accessibility.rst b/docs/source/developer/accessibility.rst index 4cd53dc3cd0b..24cd446a30e5 100644 --- a/docs/source/developer/accessibility.rst +++ b/docs/source/developer/accessibility.rst @@ -86,7 +86,7 @@ be tempting to pick a color and apply it to the part of the UI that you are working on. However, it quickly becomes unmanageable to have color values spread throughout the app across different CSS files. Therefore, the JupyterLab codebase defines a set of `color variables -`__ +`__ that can be used for borders, icons, and such. If you're adding any CSS that needs a color value, please use one of the variables defined. diff --git a/docs/source/developer/components.rst b/docs/source/developer/components.rst index 6e5bcb3b1143..c9c3653d81d6 100644 --- a/docs/source/developer/components.rst +++ b/docs/source/developer/components.rst @@ -11,7 +11,7 @@ IDE-like experience. However, developers are encouraged to use these to bring to life their own visions of what a computational environment should look like. -The JupyterLab repository has `many examples `_ +The JupyterLab repository has `many examples `_ to get you started. The ``examples`` directory contains: diff --git a/docs/source/developer/contributing.rst b/docs/source/developer/contributing.rst index 810267c1abf1..307e2e0c6312 100644 --- a/docs/source/developer/contributing.rst +++ b/docs/source/developer/contributing.rst @@ -86,9 +86,11 @@ breaking changes. Consider documenting your maintenance plans to users in these You may also wish to consider pinning the major version of JupyterLab when developing extensions (in your package metadata). -We maintain the **two most recently released major versions of JupyterLab**, -JupyterLab v3 and JupyterLab v4. JupyterLab v1 and v2 are no longer maintained. -All JupyterLab v2 users are strongly advised to upgrade as soon as possible. +We maintain a major version of JupyterLab for **one year after its successor's first release**. +See `version lifecycle <../getting_started/lifecycle.html>`__ for details. +JupyterLab v4 was released on May 15, 2023, so JupyterLab v3 will be maintained +until May 15, 2024. JupyterLab v1 and v2 are no longer maintained. +All JupyterLab v2 and v3 users are strongly advised to upgrade as soon as possible. Languages, Tools and Processes ------------------------------ @@ -309,7 +311,7 @@ Installing Node.js and jlpm Building JupyterLab from its GitHub source code requires Node.js. The development version requires Node.js version 18+, as defined in the ``engines`` specification in -`dev_mode/package.json `__. +`dev_mode/package.json `__. If you use `conda `__, you can get it with: @@ -635,7 +637,7 @@ Visual Regression and UI Tests ------------------------------ As part of JupyterLab CI workflows, UI tests are run with visual regression checks. -`Galata `__ is used for UI +`Galata `__ is used for UI testing. Galata provides `Playwright `__ helpers to control and inspect JupyterLab UI programmatically. @@ -677,7 +679,7 @@ Main reasons for UI test failures are: The bot will react with +1 emoji to indicate that the run started and then comment back once it concluded. -For more information on UI Testing, please read the `UI Testing developer documentation `__ +For more information on UI Testing, please read the `UI Testing developer documentation `__ and `Playwright documentation `__. Good Practices for Integration tests diff --git a/docs/source/developer/css.rst b/docs/source/developer/css.rst index 0f654c056f02..116cfd70c412 100644 --- a/docs/source/developer/css.rst +++ b/docs/source/developer/css.rst @@ -73,7 +73,7 @@ CSS variable usage ^^^^^^^^^^^^^^^^^^ JupyterLab includes a default set of CSS variables in the file -`packages/theme-light-extension/style/variables.css `_. +`packages/theme-light-extension/style/variables.css `_. To ensure consistent design in JupyterLab, all built-in and third party extensions should use these variables in their styles if at all diff --git a/docs/source/developer/repo.rst b/docs/source/developer/repo.rst index c4da9b19b2f2..fd18c22a2306 100644 --- a/docs/source/developer/repo.rst +++ b/docs/source/developer/repo.rst @@ -13,7 +13,7 @@ In particular, there are many TypeScript packages and a single Python package. The Python package contains server-side code, and also distributes the bundled-and-compiled TypeScript code. -See the `Contributing Guidelines `__ +See the `Contributing Guidelines `__ for detailed developer installation instructions. Directories diff --git a/docs/source/extension/extension_dev.rst b/docs/source/extension/extension_dev.rst index 3609d999a790..e9edb1bd9dad 100644 --- a/docs/source/extension/extension_dev.rst +++ b/docs/source/extension/extension_dev.rst @@ -184,7 +184,7 @@ A mime renderer plugin is an object with the fields listed in the `rendermime-interfaces IExtension <../api/interfaces/rendermime_interfaces.IRenderMime.IExtension.html>`__ object. -JupyterLab has a `pdf mime renderer extension `__, for example. In core JupyterLab, this is used to view pdf files and view pdf data mime data in a notebook. +JupyterLab has a `pdf mime renderer extension `__, for example. In core JupyterLab, this is used to view pdf files and view pdf data mime data in a notebook. We have a `MIME renderer example `__ walking through creating a mime renderer extension which adds mp4 video rendering to JupyterLab. The `extension template `_ supports MIME renderer extensions. @@ -203,7 +203,7 @@ A theme is a special application plugin that registers a theme with the ``ThemeM The extension package containing the theme plugin must include all static assets that are referenced by ``@import`` in its theme CSS files. Local URLs can be used to reference files relative to the location of the referring sibling CSS files. For example ``url('images/foo.png')`` or ``url('../foo/bar.css')`` can be used to refer local files in the theme. Absolute URLs (starting with a ``/``) or external URLs (e.g. ``https:``) can be used to refer to external assets. -See the `JupyterLab Light Theme `__ for an example. +See the `JupyterLab Light Theme `__ for an example. See the `TypeScript extension template `__ (choosing ``theme`` as ``kind`` ) for a quick start to developing a theme plugin. @@ -214,7 +214,7 @@ Source Extensions A source extension is a JavaScript (npm) package that exports one or more plugins. All JupyterLab extensions are developed as source extensions (for example, prebuilt extensions are built from source extensions). -A source extension has metadata in the ``jupyterlab`` field of its ``package.json`` file. The `JSON schema `__ for the metadata is distributed in the ``@jupyterlab/builder`` package. +A source extension has metadata in the ``jupyterlab`` field of its ``package.json`` file. The `JSON schema `__ for the metadata is distributed in the ``@jupyterlab/builder`` package. We will talk about each ``jupyterlab`` metadata field in ``package.json`` for source extensions below. @@ -279,10 +279,10 @@ For example, the JupyterLab ``filebrowser-extension`` package exports the ``@jup "schemaDir": "schema", } -The file browser setting schema file (which specifies some default keyboard shortcuts and other settings for the filebrowser) is located in ``schema/browser.json`` (see `here `__). +The file browser setting schema file (which specifies some default keyboard shortcuts and other settings for the filebrowser) is located in ``schema/browser.json`` (see `here `__). See the -`fileeditor-extension `__ +`fileeditor-extension `__ for another example of an extension that uses settings. Please ensure that the schema files are included in the ``files`` metadata in ``package.json``. @@ -527,7 +527,7 @@ Custom webpack configuration can be used to enable webpack features, configure a } }; -This custom config will be merged with the `prebuilt extension config `_ +This custom config will be merged with the `prebuilt extension config `_ when building the prebuilt extension. .. _prebuilt_dev_workflow: diff --git a/docs/source/extension/extension_migration.rst b/docs/source/extension/extension_migration.rst index 2fe116240807..279d301e31ce 100644 --- a/docs/source/extension/extension_migration.rst +++ b/docs/source/extension/extension_migration.rst @@ -89,10 +89,12 @@ between cells, especially impacting users with accessibility needs. In JupyterLab 4.1+ the focus stays on the active cell when switching to command mode; this requires all shortcut selectors to be adjusted as follows: -- ``.jp-Notebook:focus.jp-mod-commandMode`` should be replaced with ``.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)`` -- ``.jp-Notebook:focus`` should be replaced with ``.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)`` -- ``[data-jp-traversable]:focus`` should be replaced with ``.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)`` -- ``[data-jp-kernel-user]:focus`` should be replaced with ``[data-jp-kernel-user] :focus:not(:read-write)`` +- ``.jp-Notebook:focus.jp-mod-commandMode``, ``.jp-Notebook:focus``, and ``[data-jp-traversable]:focus`` should be replaced with: + - ``.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)`` for JupyterLab 4.1.0+ + - ``.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus`` for JupyterLab 4.1.1+ +- ``[data-jp-kernel-user]:focus`` should be replaced with: + - ``[data-jp-kernel-user] :focus:not(:read-write)`` for JupyterLab 4.1.0+ + - ``[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)`` for JupyterLab 4.1.1+ Please note that ``:not(:read-write)`` fragment disables shortcuts when text fields (such as cell editor) are focused to avoid intercepting @@ -101,6 +103,17 @@ does not correspond to any key/typographic character (e.g. most shortcuts with :kbd:`Ctrl` modifier) you may prefer to drop this fragment if you want the shortcut to be active in text fields. +Further, JupyterLab 4.1.1 introduced indicator class ``.jp-mod-readWrite`` +that is applied to the notebook node when the active element accepts +keyboard input as defined by ``:read-write`` selector. This indicator +class is required to detect ``:read-write`` elements which are nested +within an *open* shadow DOM (such as Panel framework widgets). + +If your framework uses a *closed* shadow DOM, or expects keyboard +interactions on elements that are not recognised as editable by browser +heuristics of ``:read-write`` selector, you need to set a data attribute +`lm-suppress-shortcuts` on the outer host element to suppress shortcuts. + To prevent breaking the user experience these changes are made transparently in the background, but will emit a warning and extension developers should make the change at the source before the next major JupyterLab release. @@ -357,7 +370,7 @@ bumped their major version (following semver convention). We want to point out p ``token.findByFileName(widget.context.path)?.name ?? ''``. - ``@jupyterlab/docprovider`` from 3.x to 4.x This package is no longer present in JupyterLab. For documentation related to Real-Time Collaboration, please check out - `RTC's documentation `_ + `RTC's documentation `_ - ``@jupyterlab/docregistry`` from 3.x to 4.x * Removed the property ``docProviderFactory`` from the interface ``Context.IOptions``. * The constructor of the class ``DocumentModel`` receives a parameter ``DocumentModel.IOptions``. @@ -838,7 +851,7 @@ Upgrading library versions The ``@phosphor/*`` libraries that JupyterLab 1.x uses have been renamed to ``@lumino/*``. Updating your ``package.json`` is straightforward. The easiest way to do this is to look in the -`JupyterLab core packages code base `__ +`JupyterLab core packages code base `__ and to simply adopt the versions of the relevant libraries that are used there. @@ -959,7 +972,7 @@ Using ``Session`` and ``SessionContext`` to manage kernel sessions For full API documentation and examples of how to use ``@jupyterlab/services``, - `consult the repository `__. + `consult the repository `__. ``ConsolePanel`` and ``NotebookPanel`` now expose a ``sessionContext: ISessionContext`` attribute that allows for a uniform way to @@ -994,4 +1007,4 @@ Using the new icon system and ``LabIcon`` For full API documentation and examples of how to use the new icon support based on ``LabIcon`` from ``@jupyterlab/ui-components``, - `consult the repository `__. + `consult the repository `__. diff --git a/docs/source/extension/extension_tutorial.rst b/docs/source/extension/extension_tutorial.rst index 38722861f8a5..d80cca778431 100644 --- a/docs/source/extension/extension_tutorial.rst +++ b/docs/source/extension/extension_tutorial.rst @@ -227,7 +227,7 @@ After you reload the page with the console open, you should see a message that s ``JupyterLab extension jupyterlab_apod is activated!`` in the console. If you do, congratulations, you're ready to start modifying the extension! If not, go back make sure you didn't miss a step, and `reach -out `__ if you're stuck. +out `__ if you're stuck. .. note:: diff --git a/docs/source/extension/identity.rst b/docs/source/extension/identity.rst index 7752eb21cc99..7a96b0433fd2 100644 --- a/docs/source/extension/identity.rst +++ b/docs/source/extension/identity.rst @@ -27,7 +27,7 @@ to the signal ``userChanged``. id: 'jupyterlab-extension', autoStart: true, activate: (app: JupyterFrontEnd) => { - const user = app.services.user; + const user = app.serviceManager.user; user.ready.then(() => { console.debug("Identity:", user.identity); console.debug("Permissions:", user.permissions); diff --git a/docs/source/extension/internationalization.rst b/docs/source/extension/internationalization.rst index 6a66e226eb2b..cc77756b183e 100644 --- a/docs/source/extension/internationalization.rst +++ b/docs/source/extension/internationalization.rst @@ -34,7 +34,7 @@ To internationalize your extension, the following tasks are required: Domain are normalized by replacing ``-`` with ``_`` characters. -3. Wraps all translatable strings with one of the `gettext functions `_. +3. Wraps all translatable strings with one of the `gettext functions `_. Examples: diff --git a/docs/source/extension/notebook.rst b/docs/source/extension/notebook.rst index 67a3ad9d7738..7ae49ccccbc9 100644 --- a/docs/source/extension/notebook.rst +++ b/docs/source/extension/notebook.rst @@ -175,6 +175,43 @@ The ipywidgets widget manager is an example of an extension that adds a notebook-specific renderer, since rendering a widget depends on notebook-specific widget state. +Keyboard interaction model +"""""""""""""""""""""""""" + +Multiple elements can receive focus in the Notebook: +- the main toolbar, +- cells, +- cell components (editor, toolbar, outputs). + +When the focus is outside of the cell input editor, +the Notebook switches to so-called "command" mode. +In the command mode additional keyboard shortcuts are accessible to the user, +enabling quick access to cell- and notebook-specific actions. +These shortcuts are only active when the notebook is in command mode +and the active element is non-editable, +as signalled by absence of ``.jp-mod-readWrite`` class on the notebook node. +This class is set if the active element is editable as ascertained by matching +to the ``:read-write`` pseudo-selector, and accounts for any elements nested +in the open shadow DOM, but not for the closed shadow DOM nor non-editable +elements with custom key event handlers (such as +``
``). +If your output widget (for example created with ``IPython.display.HTML``, +or created by your MIME renderer on cell output in a notebook or console) +uses closed shadow DOM or non-editable elements with custom +key event handlers, you may wish to set ``lm-suppress-shortcuts`` data attribute +on the host element to prevent side-effects from the command-mode actions, e.g: + +.. code:: html + +
+ Click on me and press "A" with and without "lm-suppress-shortcuts" +
+ .. _extend-notebook-plugin: How to extend the Notebook plugin diff --git a/docs/source/extension/ui_components.rst b/docs/source/extension/ui_components.rst index 7261963d5bad..24ae7e736436 100644 --- a/docs/source/extension/ui_components.rst +++ b/docs/source/extension/ui_components.rst @@ -114,8 +114,7 @@ removed from the DOM, you’ll first need to clean it up: This cleanup step is not a special property of ``LabIcon``, but is instead needed for any React component that is rendered directly at the top level by ``ReactDOM``: failure to call ``unmountComponentAtNode`` -can result in a `memory -leak `__. +can result in a memory leak. How to create your own custom ``LabIcon`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/getting_started/faq.rst b/docs/source/getting_started/faq.rst index 55929bf6c333..e48ff2019858 100644 --- a/docs/source/getting_started/faq.rst +++ b/docs/source/getting_started/faq.rst @@ -54,10 +54,10 @@ Development - `How can you - contribute? `__ + contribute? `__ - :ref:`How can you extend or customize JupyterLab? ` -- In the classic Notebook, `I could use custom Javascript outputted by a cell to programmatically - control the Notebook `__. Can I do the same thing in JupyterLab? +- In the classic Notebook, I could use custom Javascript outputted by a cell to programmatically + control the Notebook. Can I do the same thing in JupyterLab? JupyterLab was built to support a wide variety of extensibility, including dynamic behavior based on notebook outputs. To access this extensibility, you should write a custom JupyterLab extension. If you would @@ -65,4 +65,6 @@ Development mimetype (:ref:`rendermime`). We currently don't allow access to the JupyterLab API from the Javascript renderer, because this would tie the kernel and the notebook output to JupyterLab and make it hard for other frontends to support it. - If you have comments or suggestions on changes here, please comment on `this issue `__. + For more discussion and potential alternative solutions, please see issues + `#4623 `__ and + `#5789 `__. diff --git a/docs/source/getting_started/installation.rst b/docs/source/getting_started/installation.rst index 3cb9de0eae45..5189e6a09079 100644 --- a/docs/source/getting_started/installation.rst +++ b/docs/source/getting_started/installation.rst @@ -106,15 +106,10 @@ The latest versions of the following browsers are currently known to work: - Firefox - Chrome - Safari +- Edge Earlier browser versions may also work, but come with no guarantees. -JupyterLab uses CSS Variables for styling, which is one reason for the -minimum versions listed above. IE 11+ or Edge 14 do not support -CSS Variables, and are not directly supported at this time. -A tool like `postcss `__ can be used to convert the CSS files in the -``jupyterlab/build`` directory manually if desired. - Installation problems --------------------- diff --git a/docs/source/getting_started/lifecycle.rst b/docs/source/getting_started/lifecycle.rst new file mode 100644 index 000000000000..b0f845a1566e --- /dev/null +++ b/docs/source/getting_started/lifecycle.rst @@ -0,0 +1,34 @@ +.. Copyright (c) Jupyter Development Team. +.. Distributed under the terms of the Modified BSD License. + +Version lifecycle +================= + +Each major version of JupyterLab is maintained until +**one year after the following version's first generally available release**. +This does not count alpha, beta, or release candidate (RC) versions. + +After the end of maintenance date, no additional releases may be made, not +even to fix security issues. + +.. list-table:: Major version lifecycles + + * - Version + - Release Date + - End of Maintenance + * - 1.0.0 + - 28 Jun 2019 + - 28 Feb 2021 + * - 2.0.0 + - 28 Feb 2020 + - 23 Dec 2021 + * - 3.0.0 + - 23 Dec 2020 + - 15 May 2024 (see below) + * - 4.0.0 + - 15 May 2023 + - *active* + +To help with the transition to JupyterLab 4, JupyterLab maintainers may +make additional patch releases to JupyterLab 3 to fix critical issues +until 31 December 2024. diff --git a/docs/source/getting_started/overview.rst b/docs/source/getting_started/overview.rst index 1e6f15d42b5b..77efe735d8bd 100644 --- a/docs/source/getting_started/overview.rst +++ b/docs/source/getting_started/overview.rst @@ -6,7 +6,7 @@ Get Started =========== -`JupyterLab `_ is a next-generation web-based user interface for +`JupyterLab `_ is a next-generation web-based user interface for `Project Jupyter `_. .. image:: ../images/interface-jupyterlab.png @@ -82,3 +82,4 @@ Jupyter Notebook in the ecosystem, visit the faq changelog accessibility + lifecycle diff --git a/docs/source/index.rst b/docs/source/index.rst index 40590ac914ae..4f8cfa6d377c 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -30,7 +30,7 @@ the `Project Jupyter `_ umbrella, like offers a more advanced, feature rich, customizable experience compared to Jupyter Notebook. -`Try JupyterLab on Binder `__. JupyterLab follows the Jupyter `Community Guides `__. +`Try JupyterLab on Binder `__. JupyterLab follows the Jupyter `Community Guides `__. .. image:: ./images/jupyterlab.png :align: center diff --git a/docs/source/user/extensions.rst b/docs/source/user/extensions.rst index 82ce2ef2626d..236ed2558616 100644 --- a/docs/source/user/extensions.rst +++ b/docs/source/user/extensions.rst @@ -564,6 +564,6 @@ rebuild, you can run the command: If you are rebuilding JupyterLab on Windows, you may encounter a ``FileNotFoundError`` due to the default path length on Windows. Node modules are stored in a deeply nested directory structure, so paths can get - quite long. If you have administrative access and are on Windows 8 or 10, - you can update the registry setting using these instructions: - https://stackoverflow.com/a/37528731. + quite long. If you have administrative access and are on Windows 10 or newer + you can enable long paths by adding a dedicated + `registry key `__. diff --git a/docs/source/user/index.md b/docs/source/user/index.md index 509ffcb84d79..4762c7cceb69 100644 --- a/docs/source/user/index.md +++ b/docs/source/user/index.md @@ -1,6 +1,6 @@ # User Guide -Use this page to navigate to in-depth guides, tutorials, and how-tos for using [JupyterLab](https://jupyterlab.readthedocs.io/en/latest/). +Use this page to navigate to in-depth guides, tutorials, and how-tos for using [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/). ```{toctree} :maxdepth: 2 diff --git a/examples/app/package.json b/examples/app/package.json index ab27be481368..2d7b871ab796 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,45 +1,45 @@ { "name": "@jupyterlab/example-app", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "build": "webpack", "clean": "rimraf build" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/application-extension": "^4.1.0", - "@jupyterlab/apputils-extension": "^4.1.0", - "@jupyterlab/builder": "^4.1.0", - "@jupyterlab/celltags-extension": "^4.1.0", - "@jupyterlab/codemirror-extension": "^4.1.0", - "@jupyterlab/completer-extension": "^4.1.0", - "@jupyterlab/console-extension": "^4.1.0", - "@jupyterlab/csvviewer-extension": "^4.1.0", - "@jupyterlab/docmanager-extension": "^4.1.0", - "@jupyterlab/filebrowser-extension": "^4.1.0", - "@jupyterlab/fileeditor-extension": "^4.1.0", - "@jupyterlab/help-extension": "^4.1.0", - "@jupyterlab/imageviewer-extension": "^4.1.0", - "@jupyterlab/inspector-extension": "^4.1.0", - "@jupyterlab/launcher-extension": "^4.1.0", - "@jupyterlab/mainmenu-extension": "^4.1.0", - "@jupyterlab/markdownviewer-extension": "^4.1.0", - "@jupyterlab/mathjax-extension": "^4.1.0", - "@jupyterlab/metadataform-extension": "^4.1.0", - "@jupyterlab/notebook-extension": "^4.1.0", - "@jupyterlab/rendermime-extension": "^4.1.0", - "@jupyterlab/running-extension": "^4.1.0", - "@jupyterlab/settingeditor-extension": "^4.1.0", - "@jupyterlab/shortcuts-extension": "^4.1.0", - "@jupyterlab/statusbar-extension": "^4.1.0", - "@jupyterlab/theme-dark-extension": "^4.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/toc-extension": "^6.1.0", - "@jupyterlab/tooltip-extension": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/translation-extension": "^4.1.0", - "@jupyterlab/ui-components-extension": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/application-extension": "^4.1.5", + "@jupyterlab/apputils-extension": "^4.1.5", + "@jupyterlab/builder": "^4.1.5", + "@jupyterlab/celltags-extension": "^4.1.5", + "@jupyterlab/codemirror-extension": "^4.1.5", + "@jupyterlab/completer-extension": "^4.1.5", + "@jupyterlab/console-extension": "^4.1.5", + "@jupyterlab/csvviewer-extension": "^4.1.5", + "@jupyterlab/docmanager-extension": "^4.1.5", + "@jupyterlab/filebrowser-extension": "^4.1.5", + "@jupyterlab/fileeditor-extension": "^4.1.5", + "@jupyterlab/help-extension": "^4.1.5", + "@jupyterlab/imageviewer-extension": "^4.1.5", + "@jupyterlab/inspector-extension": "^4.1.5", + "@jupyterlab/launcher-extension": "^4.1.5", + "@jupyterlab/mainmenu-extension": "^4.1.5", + "@jupyterlab/markdownviewer-extension": "^4.1.5", + "@jupyterlab/mathjax-extension": "^4.1.5", + "@jupyterlab/metadataform-extension": "^4.1.5", + "@jupyterlab/notebook-extension": "^4.1.5", + "@jupyterlab/rendermime-extension": "^4.1.5", + "@jupyterlab/running-extension": "^4.1.5", + "@jupyterlab/settingeditor-extension": "^4.1.5", + "@jupyterlab/shortcuts-extension": "^4.1.5", + "@jupyterlab/statusbar-extension": "^4.1.5", + "@jupyterlab/theme-dark-extension": "^4.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/toc-extension": "^6.1.5", + "@jupyterlab/tooltip-extension": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/translation-extension": "^4.1.5", + "@jupyterlab/ui-components-extension": "^4.1.5", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/examples/cell/package.json b/examples/cell/package.json index 319b13a00eb4..7e228188f4b5 100644 --- a/examples/cell/package.json +++ b/examples/cell/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-cell", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "build": "tsc -p src && webpack", @@ -9,16 +9,16 @@ "dependencies": { "@jupyter/web-components": "^0.15.2", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/widgets": "^2.3.1" }, diff --git a/examples/console/package.json b/examples/console/package.json index 93cae7025451..9bb6b24d97e9 100644 --- a/examples/console/package.json +++ b/examples/console/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-console", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "build": "tsc -p src && webpack", @@ -9,14 +9,14 @@ "dependencies": { "@jupyter/web-components": "^0.15.2", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/widgets": "^2.3.1" }, diff --git a/examples/federated/core_package/package.json b/examples/federated/core_package/package.json index 5400c2dd06a3..df98c985b351 100644 --- a/examples/federated/core_package/package.json +++ b/examples/federated/core_package/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-federated-core", - "version": "3.1.0", + "version": "3.1.5", "private": true, "scripts": { "build": "npm run clean && webpack", @@ -8,77 +8,77 @@ "watch": "npm run clean && webpack --watch" }, "resolutions": { - "@jupyterlab/application": "~4.1.0", - "@jupyterlab/application-extension": "~4.1.0", + "@jupyterlab/application": "~4.1.5", + "@jupyterlab/application-extension": "~4.1.5", "@jupyterlab/apputils": "~4.1.0-alpha.0", - "@jupyterlab/apputils-extension": "~4.1.0", + "@jupyterlab/apputils-extension": "~4.1.5", "@jupyterlab/attachments": "~4.1.0-alpha.0", "@jupyterlab/cells": "~4.1.0-alpha.0", - "@jupyterlab/celltags-extension": "~4.1.0", + "@jupyterlab/celltags-extension": "~4.1.5", "@jupyterlab/codeeditor": "~4.1.0-alpha.0", - "@jupyterlab/codemirror-extension": "~4.1.0", + "@jupyterlab/codemirror-extension": "~4.1.5", "@jupyterlab/completer": "~4.1.0-alpha.0", - "@jupyterlab/completer-extension": "~4.1.0", + "@jupyterlab/completer-extension": "~4.1.5", "@jupyterlab/console": "~4.1.0-alpha.0", - "@jupyterlab/console-extension": "~4.1.0", - "@jupyterlab/coreutils": "~6.1.0", - "@jupyterlab/csvviewer-extension": "~4.1.0", + "@jupyterlab/console-extension": "~4.1.5", + "@jupyterlab/coreutils": "~6.1.5", + "@jupyterlab/csvviewer-extension": "~4.1.5", "@jupyterlab/debugger": "~4.1.0-alpha.0", - "@jupyterlab/debugger-extension": "~4.1.0", + "@jupyterlab/debugger-extension": "~4.1.5", "@jupyterlab/docmanager": "~4.1.0-alpha.0", - "@jupyterlab/docmanager-extension": "~4.1.0", + "@jupyterlab/docmanager-extension": "~4.1.5", "@jupyterlab/documentsearch": "~4.1.0-alpha.0", - "@jupyterlab/documentsearch-extension": "~4.1.0", + "@jupyterlab/documentsearch-extension": "~4.1.5", "@jupyterlab/extensionmanager": "~4.1.0-alpha.0", - "@jupyterlab/extensionmanager-extension": "~4.1.0", + "@jupyterlab/extensionmanager-extension": "~4.1.5", "@jupyterlab/filebrowser": "~4.1.0-alpha.0", - "@jupyterlab/filebrowser-extension": "~4.1.0", + "@jupyterlab/filebrowser-extension": "~4.1.5", "@jupyterlab/fileeditor": "~4.1.0-alpha.0", - "@jupyterlab/fileeditor-extension": "~4.1.0", - "@jupyterlab/help-extension": "~4.1.0", - "@jupyterlab/htmlviewer-extension": "~4.1.0", - "@jupyterlab/hub-extension": "~4.1.0", + "@jupyterlab/fileeditor-extension": "~4.1.5", + "@jupyterlab/help-extension": "~4.1.5", + "@jupyterlab/htmlviewer-extension": "~4.1.5", + "@jupyterlab/hub-extension": "~4.1.5", "@jupyterlab/imageviewer": "~4.1.0-alpha.0", - "@jupyterlab/imageviewer-extension": "~4.1.0", + "@jupyterlab/imageviewer-extension": "~4.1.5", "@jupyterlab/inspector": "~4.1.0-alpha.0", - "@jupyterlab/inspector-extension": "~4.1.0", - "@jupyterlab/javascript-extension": "~4.1.0", - "@jupyterlab/json-extension": "~4.1.0", + "@jupyterlab/inspector-extension": "~4.1.5", + "@jupyterlab/javascript-extension": "~4.1.5", + "@jupyterlab/json-extension": "~4.1.5", "@jupyterlab/launcher": "~4.1.0-alpha.0", - "@jupyterlab/launcher-extension": "~4.1.0", + "@jupyterlab/launcher-extension": "~4.1.5", "@jupyterlab/logconsole": "~4.1.0-alpha.0", - "@jupyterlab/logconsole-extension": "~4.1.0", + "@jupyterlab/logconsole-extension": "~4.1.5", "@jupyterlab/lsp": "~4.1.0-alpha.0", - "@jupyterlab/lsp-extension": "~4.1.0", + "@jupyterlab/lsp-extension": "~4.1.5", "@jupyterlab/mainmenu": "~4.1.0-alpha.0", - "@jupyterlab/mainmenu-extension": "~4.1.0", + "@jupyterlab/mainmenu-extension": "~4.1.5", "@jupyterlab/markedparser-extension": "~4.1.0-alpha.0", - "@jupyterlab/mathjax-extension": "~4.1.0", + "@jupyterlab/mathjax-extension": "~4.1.5", "@jupyterlab/metadataform": "~4.1.0-alpha.0", - "@jupyterlab/metadataform-extension": "~4.1.0", + "@jupyterlab/metadataform-extension": "~4.1.5", "@jupyterlab/notebook": "~4.1.0-alpha.0", - "@jupyterlab/notebook-extension": "~4.1.0", - "@jupyterlab/pdf-extension": "~4.1.0", + "@jupyterlab/notebook-extension": "~4.1.5", + "@jupyterlab/pdf-extension": "~4.1.5", "@jupyterlab/rendermime": "~4.1.0-alpha.0", - "@jupyterlab/rendermime-extension": "~4.1.0", + "@jupyterlab/rendermime-extension": "~4.1.5", "@jupyterlab/rendermime-interfaces": "^3.9.0-alpha.1", "@jupyterlab/services": "~7.1.0-alpha.0", "@jupyterlab/settingeditor": "~4.1.0-alpha.0", - "@jupyterlab/settingeditor-extension": "~4.1.0", + "@jupyterlab/settingeditor-extension": "~4.1.5", "@jupyterlab/settingregistry": "~4.1.0-alpha.0", - "@jupyterlab/shortcuts-extension": "~4.1.0", + "@jupyterlab/shortcuts-extension": "~4.1.5", "@jupyterlab/statedb": "~4.1.0-alpha.0", "@jupyterlab/statusbar": "~4.1.0-alpha.0", - "@jupyterlab/statusbar-extension": "~4.1.0", - "@jupyterlab/theme-light-extension": "~4.1.0", - "@jupyterlab/toc-extension": "~6.1.0", + "@jupyterlab/statusbar-extension": "~4.1.5", + "@jupyterlab/theme-light-extension": "~4.1.5", + "@jupyterlab/toc-extension": "~6.1.5", "@jupyterlab/tooltip": "~4.1.0-alpha.0", - "@jupyterlab/tooltip-extension": "~4.1.0", - "@jupyterlab/translation": "~4.1.0", - "@jupyterlab/translation-extension": "~4.1.0", + "@jupyterlab/tooltip-extension": "~4.1.5", + "@jupyterlab/translation": "~4.1.5", + "@jupyterlab/translation-extension": "~4.1.5", "@jupyterlab/ui-components": "~4.1.0-alpha.0", - "@jupyterlab/ui-components-extension": "~4.1.0", - "@jupyterlab/vega5-extension": "~4.1.0", + "@jupyterlab/ui-components-extension": "~4.1.5", + "@jupyterlab/vega5-extension": "~4.1.5", "@lumino/algorithm": "^2.0.0", "@lumino/application": "^2.3.0-alpha.0", "@lumino/commands": "^2.0.1", @@ -96,50 +96,50 @@ "yjs": "^13.5.40" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/application-extension": "^4.1.0", - "@jupyterlab/apputils-extension": "^4.1.0", - "@jupyterlab/celltags-extension": "^4.1.0", - "@jupyterlab/codemirror-extension": "^4.1.0", - "@jupyterlab/completer-extension": "^4.1.0", - "@jupyterlab/console-extension": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/csvviewer-extension": "^4.1.0", - "@jupyterlab/debugger-extension": "^4.1.0", - "@jupyterlab/docmanager-extension": "^4.1.0", - "@jupyterlab/documentsearch-extension": "^4.1.0", - "@jupyterlab/extensionmanager-extension": "^4.1.0", - "@jupyterlab/filebrowser-extension": "^4.1.0", - "@jupyterlab/fileeditor-extension": "^4.1.0", - "@jupyterlab/help-extension": "^4.1.0", - "@jupyterlab/htmlviewer-extension": "^4.1.0", - "@jupyterlab/hub-extension": "^4.1.0", - "@jupyterlab/imageviewer-extension": "^4.1.0", - "@jupyterlab/inspector-extension": "^4.1.0", - "@jupyterlab/javascript-extension": "^4.1.0", - "@jupyterlab/json-extension": "^4.1.0", - "@jupyterlab/launcher-extension": "^4.1.0", - "@jupyterlab/logconsole-extension": "^4.1.0", - "@jupyterlab/lsp-extension": "^4.1.0", - "@jupyterlab/mainmenu-extension": "^4.1.0", - "@jupyterlab/mathjax-extension": "^4.1.0", - "@jupyterlab/metadataform-extension": "^4.1.0", - "@jupyterlab/notebook-extension": "^4.1.0", - "@jupyterlab/pdf-extension": "^4.1.0", - "@jupyterlab/rendermime-extension": "^4.1.0", - "@jupyterlab/settingeditor-extension": "^4.1.0", - "@jupyterlab/shortcuts-extension": "^4.1.0", - "@jupyterlab/statusbar-extension": "^4.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/toc-extension": "^6.1.0", - "@jupyterlab/tooltip-extension": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/translation-extension": "^4.1.0", - "@jupyterlab/ui-components-extension": "^4.1.0", - "@jupyterlab/vega5-extension": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/application-extension": "^4.1.5", + "@jupyterlab/apputils-extension": "^4.1.5", + "@jupyterlab/celltags-extension": "^4.1.5", + "@jupyterlab/codemirror-extension": "^4.1.5", + "@jupyterlab/completer-extension": "^4.1.5", + "@jupyterlab/console-extension": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/csvviewer-extension": "^4.1.5", + "@jupyterlab/debugger-extension": "^4.1.5", + "@jupyterlab/docmanager-extension": "^4.1.5", + "@jupyterlab/documentsearch-extension": "^4.1.5", + "@jupyterlab/extensionmanager-extension": "^4.1.5", + "@jupyterlab/filebrowser-extension": "^4.1.5", + "@jupyterlab/fileeditor-extension": "^4.1.5", + "@jupyterlab/help-extension": "^4.1.5", + "@jupyterlab/htmlviewer-extension": "^4.1.5", + "@jupyterlab/hub-extension": "^4.1.5", + "@jupyterlab/imageviewer-extension": "^4.1.5", + "@jupyterlab/inspector-extension": "^4.1.5", + "@jupyterlab/javascript-extension": "^4.1.5", + "@jupyterlab/json-extension": "^4.1.5", + "@jupyterlab/launcher-extension": "^4.1.5", + "@jupyterlab/logconsole-extension": "^4.1.5", + "@jupyterlab/lsp-extension": "^4.1.5", + "@jupyterlab/mainmenu-extension": "^4.1.5", + "@jupyterlab/mathjax-extension": "^4.1.5", + "@jupyterlab/metadataform-extension": "^4.1.5", + "@jupyterlab/notebook-extension": "^4.1.5", + "@jupyterlab/pdf-extension": "^4.1.5", + "@jupyterlab/rendermime-extension": "^4.1.5", + "@jupyterlab/settingeditor-extension": "^4.1.5", + "@jupyterlab/shortcuts-extension": "^4.1.5", + "@jupyterlab/statusbar-extension": "^4.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/toc-extension": "^6.1.5", + "@jupyterlab/tooltip-extension": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/translation-extension": "^4.1.5", + "@jupyterlab/ui-components-extension": "^4.1.5", + "@jupyterlab/vega5-extension": "^4.1.5" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0", + "@jupyterlab/builder": "^4.1.5", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.1", "fs-extra": "^10.1.0", diff --git a/examples/federated/md_package/package.json b/examples/federated/md_package/package.json index 7871511fd388..30759dd990b0 100644 --- a/examples/federated/md_package/package.json +++ b/examples/federated/md_package/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-federated-md", - "version": "3.1.0", + "version": "3.1.5", "private": true, "main": "./index.js", "scripts": { @@ -8,13 +8,13 @@ "clean": "rimraf ../labextensions/@jupyterlab/example-federated-md" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/example-federated-middle": "^3.0.3", - "@jupyterlab/markdownviewer-extension": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/example-federated-middle": "^3.0.8", + "@jupyterlab/markdownviewer-extension": "^4.1.5", "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0", + "@jupyterlab/builder": "^4.1.5", "rimraf": "~5.0.5" }, "jupyterlab": { diff --git a/examples/federated/middle_package/package.json b/examples/federated/middle_package/package.json index cf98810f1f5a..bfa53ad73c51 100644 --- a/examples/federated/middle_package/package.json +++ b/examples/federated/middle_package/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-federated-middle", - "version": "3.0.3", + "version": "3.0.8", "private": true, "scripts": { "build": "npm run clean && build-labextension --core-path ../core_package .", @@ -10,7 +10,7 @@ "@lumino/coreutils": "^2.1.2" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0", + "@jupyterlab/builder": "^4.1.5", "rimraf": "~5.0.5" }, "publishConfig": { diff --git a/examples/federated/package.json b/examples/federated/package.json index fb9b4edd2a9e..54a3cc06ead6 100644 --- a/examples/federated/package.json +++ b/examples/federated/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-federated", - "version": "3.1.0", + "version": "3.1.5", "private": true, "scripts": { "build": "npm run build:core && npm run build:middle && npm run build:md", diff --git a/examples/filebrowser/package.json b/examples/filebrowser/package.json index 9b0eb6cb48ce..a1af8eb0d051 100644 --- a/examples/filebrowser/package.json +++ b/examples/filebrowser/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-filebrowser", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "build": "tsc -p src && webpack", @@ -8,18 +8,18 @@ }, "dependencies": { "@jupyter/web-components": "^0.15.2", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/fileeditor": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/fileeditor": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/widgets": "^2.3.1" }, diff --git a/examples/notebook/example.spec.ts-snapshots/example-linux.png b/examples/notebook/example.spec.ts-snapshots/example-linux.png index 3bc8522784104dc3abb37343f72814439b1b3199..8a09ec72d3b8fa17d549440423e287bde84b2922 100644 GIT binary patch literal 108729 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 literal 108737 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 AHvj+t diff --git a/examples/notebook/package.json b/examples/notebook/package.json index 714af12ea6bc..6d4aee17331d 100644 --- a/examples/notebook/package.json +++ b/examples/notebook/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-notebook", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "build": "tsc -p src && webpack", @@ -9,22 +9,22 @@ "dependencies": { "@jupyter/web-components": "^0.15.2", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/markedparser-extension": "^4.1.0", - "@jupyterlab/mathjax-extension": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/markedparser-extension": "^4.1.5", + "@jupyterlab/mathjax-extension": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/widgets": "^2.3.1" }, diff --git a/examples/notebook/src/commands.ts b/examples/notebook/src/commands.ts index f55a4ad6daf1..63c2223a86b6 100644 --- a/examples/notebook/src/commands.ts +++ b/examples/notebook/src/commands.ts @@ -396,17 +396,17 @@ export const setupCommands = ( command: COMMAND_IDS.findPrevious }, { - selector: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['I', 'I'], command: COMMAND_IDS.interrupt }, { - selector: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['0', '0'], command: COMMAND_IDS.restart }, { - selector: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['Enter'], command: COMMAND_IDS.editMode }, @@ -416,7 +416,7 @@ export const setupCommands = ( command: COMMAND_IDS.commandMode }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['Shift M'], command: COMMAND_IDS.merge }, @@ -426,42 +426,42 @@ export const setupCommands = ( command: COMMAND_IDS.split }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['J'], command: COMMAND_IDS.selectBelow }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['ArrowDown'], command: COMMAND_IDS.selectBelow }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['K'], command: COMMAND_IDS.selectAbove }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['ArrowUp'], command: COMMAND_IDS.selectAbove }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['Shift K'], command: COMMAND_IDS.extendAbove }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['Shift J'], command: COMMAND_IDS.extendBelow }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['Z'], command: COMMAND_IDS.undo }, { - selector: 'jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + selector: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', keys: ['Y'], command: COMMAND_IDS.redo } diff --git a/examples/terminal/package.json b/examples/terminal/package.json index a8ed7127259e..2bcd9083655a 100644 --- a/examples/terminal/package.json +++ b/examples/terminal/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-terminal", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "build": "tsc -p src && webpack", @@ -8,11 +8,11 @@ }, "dependencies": { "@jupyter/web-components": "^0.15.2", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/terminal": "^4.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/terminal": "^4.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", "@lumino/widgets": "^2.3.1" }, "devDependencies": { diff --git a/galata/README.md b/galata/README.md index 25fb80f93460..08d0a9904fd4 100644 --- a/galata/README.md +++ b/galata/README.md @@ -76,7 +76,7 @@ Then start the server with: jupyter lab --config jupyter_server_test_config.py ``` -> If you need to customize the set up for galata, you can look at the [`configure_jupyter_server`](https://github.com/jupyterlab/jupyterlab/tree/main/jupyterlab/galata/__init__.py) definition. +> If you need to customize the set up for galata, you can look at the [`configure_jupyter_server`](https://github.com/jupyterlab/jupyterlab/tree/4.1.x/jupyterlab/galata/__init__.py) definition. ### Run test project diff --git a/galata/extension/package.json b/galata/extension/package.json index 6cc768f0126a..3a140b5bcf07 100644 --- a/galata/extension/package.json +++ b/galata/extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/galata-extension", - "version": "5.1.0", + "version": "5.1.5", "private": true, "description": "JupyterLab UI Testing Framework Extension.", "keywords": [ @@ -32,20 +32,20 @@ "clean:lib": "rimraf ../lib/extension tsconfig.tsbuildinfo" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/debugger": "^4.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/debugger": "^4.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/signaling": "^2.1.2" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0", + "@jupyterlab/builder": "^4.1.5", "rimraf": "~5.0.5", "typescript": "~5.1.6" }, diff --git a/galata/package.json b/galata/package.json index 800d505cd6ef..76509028475b 100644 --- a/galata/package.json +++ b/galata/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/galata", - "version": "5.1.0", + "version": "5.1.5", "description": "JupyterLab UI Testing Framework", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -44,15 +44,15 @@ "test:update": "jlpm test:base:update && jlpm test:benchmark:update" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/debugger": "^4.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/debugger": "^4.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@playwright/test": "^1.32.2", "@stdlib/stats": "~0.0.13", diff --git a/galata/test/benchmark/notebook.spec.ts-snapshots/large-code-notebook-ipynb-benchmark-linux.png b/galata/test/benchmark/notebook.spec.ts-snapshots/large-code-notebook-ipynb-benchmark-linux.png index d92cf065c4d28f345716459f341e1d94593c8004..195ac18b7bed0c7ca261db27ba99888aba1c7943 100644 GIT binary patch literal 47966 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%0Ax{YUnmM|(lns#pZlyOCJ{~Tv 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 Q>G0nks)lN^vWfTq1G|oz?*IS* diff --git a/galata/test/documentation/internationalization.test.ts-snapshots/language-chinese-documentation-linux.png b/galata/test/documentation/internationalization.test.ts-snapshots/language-chinese-documentation-linux.png index e184a4c00d77bcb362b3774073534b21cd5a142b..03542ba99af0c49c369c7c5ebb84aa813990f8d1 100644 GIT binary patch literal 50689 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%0A7VW1Hi5=h5-=6_luE*MWCw6j~YG) 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 diff --git a/galata/test/jupyterlab/console.test.ts b/galata/test/jupyterlab/console.test.ts new file mode 100644 index 000000000000..6a12e9663637 --- /dev/null +++ b/galata/test/jupyterlab/console.test.ts @@ -0,0 +1,44 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import { expect, test } from '@jupyterlab/galata'; + +const CELL_EDITOR_SELECTOR = '.jp-InputArea-editor'; +const CODE_MIRROR_CURSOR = '.cm-cursor'; + +test.describe('Console', () => { + test.beforeEach(async ({ page }) => { + await page.menu.clickMenuItem('File>New>Console'); + + await page.click('button:has-text("Select")'); + + await page.locator('[aria-label="Code Cell Content"]').waitFor(); + await page.locator('text=| Idle').waitFor(); + }); + + test('Executed cells should become read-only', async ({ page }) => { + await page.keyboard.type('2 + 2'); + await page.keyboard.press('Shift+Enter'); + + const executedCell = page.locator( + '[aria-label="Code Cell Content with Output"]' + ); + await executedCell.waitFor(); + + const cellEditor = executedCell.locator(CELL_EDITOR_SELECTOR); + expect(await cellEditor.innerText()).toBe('2 + 2'); + + // Focus the editor + await cellEditor.click(); + + // Should not display the cursor + const cursor = cellEditor.locator(CODE_MIRROR_CURSOR); + await expect.soft(cursor).toBeHidden(); + + // Try to type something into the editor + await cellEditor.type('more text'); + + // Expect the editor content to not change + expect(await cellEditor.innerText()).toBe('2 + 2'); + }); +}); diff --git a/galata/test/jupyterlab/contextmenu.test.ts b/galata/test/jupyterlab/contextmenu.test.ts index c8d2ce8ba3c3..b535eb308c19 100644 --- a/galata/test/jupyterlab/contextmenu.test.ts +++ b/galata/test/jupyterlab/contextmenu.test.ts @@ -192,4 +192,30 @@ test.describe('Application Context Menu', () => { const menu = await page.menu.getOpenMenu(); expect(await menu.screenshot()).toMatchSnapshot(imageName); }); + + test('Open console context menu', async ({ page }) => { + await page.menu.clickMenuItem('File>New>Console'); + await page.click('button:has-text("Select")'); + + await page.locator('[aria-label="Code Cell Content"]').waitFor(); + await page.locator('text=| Idle').waitFor(); + + // Over prompt cell + await page.click('.jp-CodeConsole-promptCell', { + button: 'right' + }); + expect(await page.menu.isAnyOpen()).toBe(true); + let imageName = `console-prompt.png`; + let menu = await page.menu.getOpenMenu(); + expect.soft(await menu.screenshot()).toMatchSnapshot(imageName); + + // Over console content + await page.click('.jp-CodeConsole-content', { + button: 'right' + }); + imageName = `console-content.png`; + menu = await page.menu.getOpenMenu(); + expect(await page.menu.isAnyOpen()).toBe(true); + expect(await menu.screenshot()).toMatchSnapshot(imageName); + }); }); diff --git a/galata/test/jupyterlab/contextmenu.test.ts-snapshots/console-content-jupyterlab-linux.png b/galata/test/jupyterlab/contextmenu.test.ts-snapshots/console-content-jupyterlab-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2a545bbac013e4a935af07cbf3d5dbd697664d GIT binary patch literal 3101 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 literal 0 HcmV?d00001 diff --git a/galata/test/jupyterlab/contextmenu.test.ts-snapshots/console-prompt-jupyterlab-linux.png b/galata/test/jupyterlab/contextmenu.test.ts-snapshots/console-prompt-jupyterlab-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..fea0e819cb0e971bdd0ccc73c930d9e28f814d8a GIT binary patch literal 3865 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 TTr>s$!f-(YrVD)sv3dDF_E%S# literal 8621 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 Bx4QrU diff --git a/galata/test/jupyterlab/debugger.test.ts-snapshots/start-debug-session-script-sources-jupyterlab-linux.png b/galata/test/jupyterlab/debugger.test.ts-snapshots/start-debug-session-script-sources-jupyterlab-linux.png index 71f4e3df4dad6070d1f67da0fcb214fd38c52974..8c0615310aa5e9b56968c90ae4b9254c32f2a872 100644 GIT binary patch literal 3297 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 literal 4800 zcmai2XEL7ZF8jm1KlxRV;AQ(N-LbNby zbU`wV(My!?_S~$*<0>t>au}CT6N`tz0!& zCXAMU+H#FB1w1c;^v3OsX(+;2kB2_uregc>9zjJq#ee-#zrxM^n2&HB*_{=YY%;{oh zxU?_cQiuEVST%Lr`YALzsQ~KZBNCyzHX?)3D}p;Z3L6NH+100{rbcQ+)8x0ba5&eq z85%1QzH_T_pK7R$%+3hTM%OABSuSNFnxtlfI`&L0TCLYWmQCDSg@wm6UTMl}7bfn|u zCF}mPk=JP5%$iSfX7(Czx`LUppQ&@aaQkWzX-ilF_Os(7S(Wvll`-GLj~}6?U~{ zDHA{;+WP$QEp%Lzv{K^&JQA^&alF+Cj$5FdJ~t%jG&R) z1))hvwCE#z!W~~cayUoT%H*g3m>`H|-|67&Bw~*Rt3T5VhI0(&!_s4!a(D_~j6x9q z>G$;346o-4e}^POUkgPISjW435cU0ElzhMe(C`|_tK|SkZKV~_FEh+Zh>P_u9r#YH zWa$T|t7KNnNK=y}nueG*hMEd@e3GS)YE*M#UeTlrL{9h2U%!S}Hv3eNpkx|N&7*=XKHqp~F5Yu7z#?YV0^!2n7%I~?k_yD7I%*n|KJeZ; zglNJ#20~wej3b0&H-4?fDUmp=AdLmzcFN{QHcFJkm=Dn9yuojZKHUJoxYX{!jd-#^ z!`V_-#}IT{m&3!?J-Lwm^$^-dm71g=?=~Gpl99WN)vBrsFheQPpe~h2Q<*D*A5bWr zs*=8)Rjm}J7))Y~(y|^*I(E3HJH}4NE79*fav)?_$G!^|OHCcQJgBPi05&|mY82Ol8tM;dHXzVh2VScU3lI|mK#x2 zz^oy&72{Hi)@ByHC7^&T{ZNeyiHwX?^!~%JHkcJ%l7sHA4C1!EZ?)$#mg;M)dCyIJ zT$J&rBAHm=td&RF%KbFyjT#IdfbXXZwu!T9I_~J85TaN$am-#sBVRep;ig#D8OWu# zq9#khV;O*`-%dAk{-|Te-aQ9oxeEc6jLc_=9h5F}7n{bsrXVmfzL+8b2=5nwq+Q^BiY6o13CV zXL(sB?;$sZ$?K^WQxiL-IAX`!^(;J9fNppCF9zo{Q&V}Y6p-*5+IpMle?8gzFkcNb zAyIu)rJeNlt)Y1TL?Kg}3tPg3m)TPeUv5rNuLvm0$y3^hVHB@J4$mI^)2%q%r|V~! zY5&3jgeUG3l0U+)R-?+#LhN4e>L6{f@M;&f{$#0fJyQ;eb!IWl zsl&{tryFnnW`;e9k0=SWueFCL58t4UAW)@e0 z#ZWhHnwTtHi1$tlKz6&HP0J`(;0$%wfBR4wLExJ@ux)JvLHZp3HP$z8-Y7OR{1{Z+ zmpMJaO(th$#bst@t}#BfwY427(4o~ygT-tr%5H>)hU)6-h5$rkXUG4kwl+B>B|IX6 zR3~lehI`>bhyynfj4EMBBC;<;Bm826kDiN*i?F*3&*+jqX!rir&lpJP1UCl#m4Blr zaD}YG!kbxtGlEe_Cw_~5(CnnZ-rio#i*-W=X6COzLMzZo>M46zzPP>Z@#wtX-+d9M zEdPG{dxnhS^HmB>W6i)ol{B%(#A#;T0$b0Hx9Wi`y+~O4D#exn(V~-a7^-Vd2n!?r zh^Qe3aHnl=f746(-Ks#Td!c{+Zp(o{N%87LNX-trldG$yiOG$g1a@#53SfgMZ`=g0 zs_NWY&0syXpT?LjJQOUZotOVnB+uQMh*I+I<+Z+n0Sz-VraE(RCUNtKP!h1u#*yyo z*QJI@F(xX2-khDC2>^reiiuITq7R&R*en_*<=tjTQ@%wEW+}`D1 zkn1t?+iibos@gAc?msqXtV z?92=DuA)$=sn!4mN=i!L)6P8=HgT~K`AMSFaGE65oxN+eLt%s06%sk zd9W)V0d8(PKeYJf@nF7_$q%eRhVg5lNSfz6E7;6EDaJZWJC5*x)E_=%lx0hpbA$MM zI*v$MHip2$$vcOKY3u9jkN=ccL0DKEAN3I-4>zX~b&hm`Mmh0)eYzV5Xv_AOoTkMF zHBH+cC)X*mom%6*>mL6|otZHw1%ow8AAE6@Uzw`0^TE!u(r~H7(D7@lmt*;aguu5R zReJedFAM;dJ3y-@a;Z|bTGIj-HHRWZniElHyV{pL_1TU6$Jkhn=Zdy)s@_dOLA{wr zs{LVyX0i1sY}v!9PbezGcgkc&Mn(})QOmYqrao$@_3RQ`PSD}wuHIe^2CbVnZzBJU zmvXwt^^qia1KMw6?bd&&KoHqG2y0#*Js-(`OU1`vRcUFu>FH^!iHm%V=+}TcL2da8 zJSq>Gth7Qj`?xh%H3gpBW)ee;xU&ZwZvNiTqJXlNZ-pu!A8{DZ;^uU%S;KHHlv^i>%lpqlcCDho z2K4ewrp~-VhGq_KU_ebiwc}QOc)T1ZDTUs5Bqb&Fy8G9v^p=YPjwLX6Iia6w!U3XI zd3@|=|MaQ(T(L>1l+72?z{6<=tLLtd)(Cl727=jYL2NZOHJtAJz`m|b3?rkG0z~Y` z$F=0%-rnNYGB3~k>`^G2i?frrYC+1yM!EB6nMVu3+@7AE6jW3$Snqc9f#~~!g5>1n z(5@~`gDm;$Lfj`8P5ygpHiw(VRR)HJhT4{v+1P2jg}}Y*Kp;ERUjR<#5fQnTB6#m= z9{>P^f49$`-6FATI^YHrPD5Ko%}g6scBbs=q>bQQvYvTNDtVSlUaEea@i&y5jYf=bfJ$o;~Sl7isN3%7~% z?ChU^PAVw6i5s}V1r!l0g+Wemqz~O}beNxc(OgSoc1$S4*{iYY| z^1e`jjc+x%6`8zp8Y?CO^~AH1gm;F-#!{Z)ecMy&f&o^E*XD0&ZMAT_11w)`knuys zcYb)-X!pU~RaG(D^W2mg9Di28Rb5Ae$l3xw*Zaw6Wp%v(Zz-q#0Ux z-0=)&!{f2F*Hsa8@A9%I*gB5uoGi;NA|irEMTG-YjqD^2+#l5u78U(cy%4xm($Js) zume^;Ffb4#YZaZB=S!5c?z!A`4G882KQLan-hA$CYI2epDEI(&`Og1jMNIB(`>$UI z&r-D&8j58;sCpRS@%a0qsUx_9iqGD^ZX>KoNMp>3XKJ~AgwI=V0pWWUg!uVZDi{PQ z#UkZAE_`>3Ca8d`C6wq%?_!UjB#`T2^rLl{#O5BKKB79r-QIx#DpmBpIuIx2lfMs6 z*VHd3!jn9nXOVAJ=S@ydYLsJbFE7r;bAUXgV_*=EbvFwT6%{pC!B5vZ#Jwijc%#7J z@-l$KC5o0i@%{VvYg!!K8~v#2O2IPaBAk1LPr+zRk$yU#oE#(IG2~;WfFryX3>I1_ zf8MhT0+~KE4N~i5YEB<5D=Tw;=_4;o?fX(u%#oTlJIGfEaO| z{e1mv)b+2GR?X(FxpFQ{huaHDz+X%arGU9&gQS0%GwXWHx7ym;5UprAvyTX(1Z@&- zZtjTa=-IhDJ0meMZDwQn7(v7AnD5^WK3X>2=n~3va+wg-+Aw-bnN%DonCRGlE0;wuFKLGf>Tm=VYk{ z_(Ti&L*Rv;$B?O#+?SYcNOxtXADqI!ZwcnWLQbjGz-eow+ptRLN=;2&YCW0{H!1A` z+5~j0tam$w3geW#>@A&~M7}?jc_7M&UuaK~Y(KkkRg(gO&7vhyyNB*a69-x}$V*8G z3WdHk5L{hdtpjW=e4%u3$mTtL&67HsTvbw%7MLE8aKhr^-9XNmvD}S@{P5>M>z)5f zfAVbYd&b&B?Pvha-%^C`d?JP0zbY=h!ABxXn)a`3`d^Kg|BG_}zmJ3gQKvatKM`Gr m5L@)0pGHA;HIXdjm*8W=^IQ+4umRAL0^QXz)U1Rf!~O>d^ddR{ diff --git a/galata/test/jupyterlab/debugger.test.ts-snapshots/start-debug-session-sources-jupyterlab-linux.png b/galata/test/jupyterlab/debugger.test.ts-snapshots/start-debug-session-sources-jupyterlab-linux.png index 19d8db7e1078ceb3d51b7658c6c61b022837bff8..a35d44d2c9c059383b95e7d53e0306eb4df11d53 100644 GIT binary patch literal 3185 zcmb`KeK^zY9>7;Qc`Af>ywoTal{`rfF(O22%?>i`rBo=P!VEJjl|5c6Ghvv85W<5P zKcVtg8Rm7i_2bb)#%##Tymxf2b6w|L=kN2!eSiPC@9X+r_xHX(-_IS3L^#Or)Z7Vy zK;#|I+c|H>mCbSYm#v#~P2Ni1X4n$!>|g^a?c6s3fyn7Q+MRU`pDz<7FQW@chy;>^sfE2i<)@%g1ZF-QvIOSLLUO!ZTn0L|=x0 zTkcCB)&z)df}~)#|L#@_QH;-*wPwH*~l{ln6d}HCwJ`=}sD@EEBLJ+C{vuaz< zGrzGU>XP2A%7C37=*qVx9-)Nv`^ptljd}0WNx_t z!7x&n3&iW~LX~;a8B`PH9a$KsALe6E$j8&N%t<~gY%7&}s+Xz;XE|W!9GV3vXt~PD z>Z=`pfvjI}^9>5Jsyo?yG4;3p{(kC!<`et zwHm1hQc#!A$B#pqtc@$vM5%$|9(O_|rZilN%@8hTdjNfhs9~-^a!QJXS4m+=ij|k{ zU9_=TTVK!3tu~I=*mD;fzZg+WdgFH66RT!(<829Cr(No*%l`B|kI>vekvt41xpOHA z(_9fxl*M2$XtXA00^;h6B~fuvYs~L6GYs<3$gwTGE0Y~R@C}fqe7Iz>G0(+ekk@~^ zE9O9*t@La|2Rmd8FaVrgJbO? zHWZb9z3UDju$NP|Q9F60v)1>Er#94EoHytD;7KCbzEX{jGH~z(On3T#Vfb#B$}JK*2qc90i~5sRUZpQ=cuf_) z11v5oN=ix!74ucq)bx~NBO)SRz|!6T#jeMm*xROv7FH4x687jJ;7Cw(Eh@QS?I+mu zkN>*MoAAK;owKx}qT+I~TL;sMJo~l9;hC2AU`0V=hbtBf{qIOeVe+yGz#SN9SmfUx z?_!!}beJK_usLREO1uO?UJ45J2#1k;n?WGGMuAZJ=r5GBqB!KrZ2CDUd!9H6IYbmzS4U!-kNWJ_GBseuUL2EmhUOmFLGvT3T8zFL>gY#FzAYZE$bMF8IGYGE7J!!dS{f3+}(PyrGm3jwxmA~=Nd?>5)wDK%{fJBZF)9~C${ zIT317$JC9|pE$zdA^1Y)Tel{NP2iVITvBqf32*8gr^*v$w#&%K5s8v+-{iebFJR?99qE<6UFIy#@bIt~3xNmooNryY@cF!`Q)@fe z+tXtb_~kTWk%H2^KB-yrxt?6PG_+?Du_Hc#fO9&*t0SBUA>Z%5`ErioTzI1l_Wbad zU`*$|&NcS3sPnbR=u9Mke!aKXuXl(YH8<9mdeooH_W*)Bsb;-N`8>5#YUwA~r;QJ0 z>pZAl>={XIc=h8$b<{}tLR34)91J;V<;I!!}@BDg+$AX7HQ1o*3RJ5w1;-+{??x|9P^4=~*D$*TDcE>E#aiw)Z zD0GO^^HuGNw}ISe)v+hOY2{Bf;6(%36jvi`LnQA&U2m)=4;*{9wQI*}<$;G1W(wI4 zea65t;EurrF1s|$1~hQnW$E8%T5&YB-iS6c8>c~OO>_={sHmt627WtR&>_FqB#aeG z_$ZN=mshAFqR|;m#oy=VY;A0ibym>@JcfDdCB`Kz3ESuOq(M=P1$P`vv{P2fc(3^L zxb*K~3L8VYy;O||f-^E3Dd!W&`0e!RK@s30#^G>*#bDt!KQe9KxvBP<48^ zGf2SjXZ`raUC^+=fDzB6th0p4YQFugEJVag_{iLwKPJ|6SwQcDllu69c*+$_N*z1f zvC|ejXiDRVC%Uswnwgm;UubG-%FW5ScKtd}*r_G>$d=WPoLLc-(Rj8}mp?Wis^)m0 zc`IlsV3dY*y>8!E?DSw#_Sn_dPrqsCJ$cV6qPY43Dcm5xSsaEN-@X&M`GHq)$ literal 4639 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 diff --git a/galata/test/jupyterlab/notebook-mobile.test.ts-snapshots/mobile-layout-jupyterlab-linux.png b/galata/test/jupyterlab/notebook-mobile.test.ts-snapshots/mobile-layout-jupyterlab-linux.png index e7fc0c88e0ec588856070fdd459568bf895f699c..9b99de6442b37c171fceb2c949271e6acfe97678 100644 GIT binary patch literal 4967 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 MiIs8D=}W)=6&SsPEC2ui literal 4929 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 { } }); +test.describe('Notebook scroll on dragging cells (no windowing)', () => { + test.beforeEach(async ({ page, tmpPath }) => { + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${fileName}`), + `${tmpPath}/${fileName}` + ); + + await page.notebook.openByPath(`${tmpPath}/${fileName}`); + await page.notebook.activate(fileName); + }); + const NOTEBOOK_SCROLLER = '.jp-WindowedPanel-outer'; + const NOTEBOOK_CONTENT = '.jp-WindowedPanel-inner'; + const EDGE_MARGIN = 10; + + test.afterEach(async ({ page, tmpPath }) => { + await page.contents.deleteDirectory(tmpPath); + }); + + test('Scroll down on dragging cell to the bottom edge', async ({ page }) => { + const firstCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="0"]' + ); + const lastCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="19"]' + ); + const scroller = page.locator(NOTEBOOK_SCROLLER); + await firstCellLocator.scrollIntoViewIfNeeded(); + + const scrollerBBox = await scroller.boundingBox(); + const notebookContentHeight = ( + await page.locator(NOTEBOOK_CONTENT).boundingBox() + ).height; + + // Ensure the notebook is scrolled correctly and last cell is not visible + const before = await scroller.evaluate(node => node.scrollTop); + expect(before).toBe(0); + await expect(lastCellLocator).not.toBeInViewport(); + + // Emulate drag and drop + await dragCellTo(page, { + cell: firstCellLocator, + x: scrollerBBox.x + 0.5 * scrollerBBox.width, + y: scrollerBBox.y + scrollerBBox.height - EDGE_MARGIN, + stopCondition: async () => { + const scrollTop = await scroller.evaluate(node => node.scrollTop); + return scrollTop >= notebookContentHeight - 100; + } + }); + + // The notebook should have scrolled down and the last cell should be visible + const after = await scroller.evaluate(node => node.scrollTop); + expect(after).toBeGreaterThan(before); + await expect(lastCellLocator).toBeInViewport(); + }); + + test('Scroll up on dragging cell to the top edge', async ({ page }) => { + const firstCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="0"]' + ); + const lastCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="19"]' + ); + + const scroller = page.locator(NOTEBOOK_SCROLLER); + const scrollerBBox = await scroller.boundingBox(); + const notebookContentHeight = ( + await page.locator(NOTEBOOK_CONTENT).boundingBox() + ).height; + + // Scroll notebook to the bottom, leaving top 200px visible + await page.mouse.move( + scrollerBBox.x + 0.5 * scrollerBBox.width, + scrollerBBox.y + 0.5 * scrollerBBox.height + ); + await page.mouse.wheel(0, notebookContentHeight - 200); + await lastCellLocator.scrollIntoViewIfNeeded(); + + // Ensure the notebook is scrolled correctly and first cell is not visible + const before = await scroller.evaluate(node => node.scrollTop); + expect(before).toBeGreaterThan(notebookContentHeight * 0.75); + await expect(firstCellLocator).not.toBeInViewport(); + + // Emulate drag and drop + await dragCellTo(page, { + cell: lastCellLocator, + x: scrollerBBox.x + 0.5 * scrollerBBox.width, + y: scrollerBBox.y + EDGE_MARGIN, + stopCondition: async () => { + const scrollTop = await scroller.evaluate(node => node.scrollTop); + return scrollTop <= 50; + } + }); + + // The notebook should have scrolled up and the first cell should be visible + const after = await scroller.evaluate(node => node.scrollTop); + expect(after).toBeLessThan(before); + await expect(firstCellLocator).toBeInViewport(); + }); +}); + test.describe('Notebook scroll on execution (no windowing)', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( diff --git a/galata/test/jupyterlab/notebook-scroll.test.ts b/galata/test/jupyterlab/notebook-scroll.test.ts index 61fb55b815d2..d50d835e6970 100644 --- a/galata/test/jupyterlab/notebook-scroll.test.ts +++ b/galata/test/jupyterlab/notebook-scroll.test.ts @@ -5,6 +5,7 @@ import { expect, galata, test } from '@jupyterlab/galata'; import * as path from 'path'; import { + dragCellTo, notebookViewportRatio, positionCellPartiallyBelowViewport } from './utils'; @@ -62,6 +63,106 @@ test.describe('Notebook scroll on navigation (with windowing)', () => { } }); +test.describe('Notebook scroll on dragging cells (with windowing)', () => { + test.beforeEach(async ({ page, tmpPath }) => { + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${fileName}`), + `${tmpPath}/${fileName}` + ); + + await page.notebook.openByPath(`${tmpPath}/${fileName}`); + await page.notebook.activate(fileName); + }); + const NOTEBOOK_SCROLLER = '.jp-WindowedPanel-outer'; + const NOTEBOOK_CONTENT = '.jp-WindowedPanel-inner'; + const EDGE_MARGIN = 10; + + test.afterEach(async ({ page, tmpPath }) => { + await page.contents.deleteDirectory(tmpPath); + }); + + test('Scroll down on dragging cell to the bottom edge', async ({ page }) => { + const firstCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="0"]' + ); + const lastCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="19"]' + ); + const scroller = page.locator(NOTEBOOK_SCROLLER); + await firstCellLocator.scrollIntoViewIfNeeded(); + + const scrollerBBox = await scroller.boundingBox(); + const notebookContentHeight = ( + await page.locator(NOTEBOOK_CONTENT).boundingBox() + ).height; + + // Ensure the notebook is scrolled correctly and last cell is not visible + const before = await scroller.evaluate(node => node.scrollTop); + expect(before).toBe(0); + await expect(lastCellLocator).not.toBeInViewport(); + + // Emulate drag and drop + await dragCellTo(page, { + cell: firstCellLocator, + x: scrollerBBox.x + 0.5 * scrollerBBox.width, + y: scrollerBBox.y + scrollerBBox.height - EDGE_MARGIN, + stopCondition: async () => { + const scrollTop = await scroller.evaluate(node => node.scrollTop); + return scrollTop >= notebookContentHeight - 100; + } + }); + + // The notebook should have scrolled down and the last cell should be visible + const after = await scroller.evaluate(node => node.scrollTop); + expect(after).toBeGreaterThan(before); + await expect(lastCellLocator).toBeInViewport(); + }); + + test('Scroll up on dragging cell to the top edge', async ({ page }) => { + const firstCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="0"]' + ); + const lastCellLocator = page.locator( + '.jp-Cell[data-windowed-list-index="19"]' + ); + + const scroller = page.locator(NOTEBOOK_SCROLLER); + const scrollerBBox = await scroller.boundingBox(); + const notebookContentHeight = ( + await page.locator(NOTEBOOK_CONTENT).boundingBox() + ).height; + + // Scroll notebook to the bottom, leaving top 200px visible + await page.mouse.move( + scrollerBBox.x + 0.5 * scrollerBBox.width, + scrollerBBox.y + 0.5 * scrollerBBox.height + ); + await page.mouse.wheel(0, notebookContentHeight - 200); + await lastCellLocator.scrollIntoViewIfNeeded(); + + // Ensure the notebook is scrolled correctly and first cell is not visible + const before = await scroller.evaluate(node => node.scrollTop); + expect(before).toBeGreaterThan(notebookContentHeight * 0.75); + await expect(firstCellLocator).not.toBeInViewport(); + + // Emulate drag and drop + await dragCellTo(page, { + cell: lastCellLocator, + x: scrollerBBox.x + 0.5 * scrollerBBox.width, + y: scrollerBBox.y + EDGE_MARGIN, + stopCondition: async () => { + const scrollTop = await scroller.evaluate(node => node.scrollTop); + return scrollTop <= 50; + } + }); + + // The notebook should have scrolled up and the first cell should be visible + const after = await scroller.evaluate(node => node.scrollTop); + expect(after).toBeLessThan(before); + await expect(firstCellLocator).toBeInViewport(); + }); +}); + test.describe('Notebook scroll on execution (with windowing)', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( diff --git a/galata/test/jupyterlab/notebook-search.test.ts-snapshots/search-new-outputs-jupyterlab-linux.png b/galata/test/jupyterlab/notebook-search.test.ts-snapshots/search-new-outputs-jupyterlab-linux.png index 57819f74e41ce5d2a5438e7b6ace5a45bab44709..baba7c87fca7c2abb5685a754b2f1f3c10542ad6 100644 GIT binary patch literal 10719 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 literal 10637 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 G@BBa0S>@dT diff --git a/galata/test/jupyterlab/notebook-search.test.ts-snapshots/search-on-new-cell-jupyterlab-linux.png b/galata/test/jupyterlab/notebook-search.test.ts-snapshots/search-on-new-cell-jupyterlab-linux.png index 33f07d6f73018337f651b0168eeb2b11d1104736..4c02210b2abd0ebe38cc70829b87982fd832d944 100644 GIT binary patch literal 23940 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 GgZ~YohjiZn literal 23896 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 PftoZ)TB_MZGynep2UJ#l diff --git a/galata/test/jupyterlab/notebook-search.test.ts-snapshots/search-within-outputs-jupyterlab-linux.png b/galata/test/jupyterlab/notebook-search.test.ts-snapshots/search-within-outputs-jupyterlab-linux.png index 686d8e42575a60544cb22601b4013eab09fbdbb6..41bc934410e00e3dc3d78a2dec3c3eb9d1dafdb5 100644 GIT binary patch literal 25601 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 literal 35933 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 { + const { content, afterElem } = options; + + // A minimal widget class, with required field for adding an item in toolbar. + class MinimalWidget { + constructor(node) { + this.node = node; + } + addClass() {} + node = null; + processMessage() {} + hasClass(name) { + return false; + } + _parent = null; + get parent() { + return this._parent; + } + set parent(p) { + this._parent?.layout.removeWidget(this); + this._parent = p; + } + } + + const plugin = { + id: 'my-test-plugin', + activate: app => { + const toolbar = app.shell.activeWidget.toolbar; + const node = document.createElement('div'); + node.classList.add('jp-CommandToolbarButton'); + node.classList.add('jp-Toolbar-item'); + node.textContent = content; + const widget = new MinimalWidget(node); + toolbar.insertAfter(afterElem, content, widget); + } + }; + jupyterapp.registerPlugin(plugin); + jupyterapp.activatePlugin('my-test-plugin'); + }, + { content, afterElem } + ); +} + test.describe('Notebook Toolbar', () => { test.beforeEach(async ({ page }) => { await page.notebook.createNew(fileName); @@ -53,7 +108,7 @@ test.describe('Notebook Toolbar', () => { test('Paste cell', async ({ page }) => { // Cut cell to populate clipboard - await page.notebook.selectCells(1); + await page.notebook.selectCells(0); await page.notebook.clickToolbarItem('cut'); const imageName = 'paste-cell.png'; @@ -61,9 +116,9 @@ test.describe('Notebook Toolbar', () => { await page.notebook.clickToolbarItem('paste'); const nbPanel = await page.notebook.getNotebookInPanel(); - await expect( - page.locator('.jp-Notebook-cell.jp-mod-active .jp-cell-toolbar') - ).toBeVisible(); + await expect + .soft(page.locator('.jp-Notebook-cell.jp-mod-active .jp-cell-toolbar')) + .toBeVisible(); expect(await nbPanel.screenshot()).toMatchSnapshot(imageName); }); @@ -141,3 +196,127 @@ test('Toolbar items act on owner widget', async ({ page }) => { expect(classlistEnd.split(' ')).toContain('jp-mod-current'); expect(await page.notebook.getCellCount()).toEqual(2); }); + +test.describe('Reactive toolbar', () => { + test.beforeEach(async ({ page }) => { + await page.notebook.createNew(fileName); + }); + + test('Reducing toolbar width should display opener item', async ({ + page + }) => { + const toolbar = page.locator('.jp-NotebookPanel-toolbar'); + await expect(toolbar.locator('.jp-Toolbar-item:visible')).toHaveCount(14); + await expect( + toolbar.locator('.jp-Toolbar-responsive-opener') + ).not.toBeVisible(); + + await setSidebarWidth(page, 520); + + await expect( + toolbar.locator('.jp-Toolbar-responsive-opener') + ).toBeVisible(); + + await expect(toolbar.locator('.jp-Toolbar-item:visible')).toHaveCount(12); + }); + + test('Items in popup toolbar should have the same order', async ({ + page + }) => { + const toolbar = page.locator('.jp-NotebookPanel-toolbar'); + + await setSidebarWidth(page, 520); + + await toolbar.locator('.jp-Toolbar-responsive-opener').click(); + + // A 'visible' selector is added because there is another response popup element + // when running in playwright (don't know where it come from, it is an empty + // toolbar). + const popupToolbar = page.locator( + 'body > .jp-Toolbar-responsive-popup:visible' + ); + const popupToolbarItems = popupToolbar.locator('.jp-Toolbar-item:visible'); + await expect(popupToolbarItems).toHaveCount(3); + + const itemChildClasses = [ + '.jp-DebuggerBugButton', + '.jp-Toolbar-kernelName', + '.jp-Notebook-ExecutionIndicator' + ]; + + for (let i = 0; i < (await popupToolbarItems.count()); i++) { + await expect( + popupToolbarItems.nth(i).locator(itemChildClasses[i]) + ).toHaveCount(1); + } + }); + + test('Item added from extension should be correctly placed', async ({ + page + }) => { + const toolbar = page.locator('.jp-NotebookPanel-toolbar'); + await addWidgetsInNotebookToolbar( + page, + 'notebook.ipynb', + 'new item 1', + 'cellType' + ); + + const toolbarItems = toolbar.locator('.jp-Toolbar-item:visible'); + await expect(toolbarItems.nth(10)).toHaveText('new item 1'); + }); + + test('Item should be correctly placed after resize', async ({ page }) => { + const toolbar = page.locator('.jp-NotebookPanel-toolbar'); + await addWidgetsInNotebookToolbar( + page, + 'notebook.ipynb', + 'new item 1', + 'cellType' + ); + + await setSidebarWidth(page, 600); + await toolbar.locator('.jp-Toolbar-responsive-opener').click(); + + // A 'visible' selector is added because there is another response popup element + // when running in playwright (don't know where it come from, it is an empty + // toolbar). + const popupToolbar = page.locator( + 'body > .jp-Toolbar-responsive-popup:visible' + ); + const popupToolbarItems = popupToolbar.locator('.jp-Toolbar-item:visible'); + + await expect(popupToolbarItems.nth(1)).toHaveText('new item 1'); + + await setSidebarWidth(page); + const toolbarItems = toolbar.locator('.jp-Toolbar-item:visible'); + await expect(toolbarItems.nth(10)).toHaveText('new item 1'); + }); + + test('Item added from extension should be correctly placed in popup toolbar', async ({ + page + }) => { + const toolbar = page.locator('.jp-NotebookPanel-toolbar'); + + await setSidebarWidth(page, 600); + + await addWidgetsInNotebookToolbar( + page, + 'notebook.ipynb', + 'new item 1', + 'cellType' + ); + + await toolbar.locator('.jp-Toolbar-responsive-opener').click(); + + // A 'visible' selector is added because there is another response popup element + // when running in playwright (don't know where it come from, it is an empty + // toolbar). + const popupToolbar = page.locator( + 'body > .jp-Toolbar-responsive-popup:visible' + ); + const popupToolbarItems = popupToolbar.locator('.jp-Toolbar-item:visible'); + + await expect(popupToolbarItems.nth(1)).toHaveText('new item 1'); + }); +}); diff --git a/galata/test/jupyterlab/notebook-toolbar.test.ts-snapshots/paste-cell-jupyterlab-linux.png b/galata/test/jupyterlab/notebook-toolbar.test.ts-snapshots/paste-cell-jupyterlab-linux.png index bd86b5bafb42ec250e18c7f136a6984b19df694c..05843142d38ce276c21ab80a8948ef56e03fec73 100644 GIT binary patch literal 11214 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 Ut+4q44Z0*sPt_nL@-N^1587xLx&QzG literal 10986 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 diff --git a/galata/test/jupyterlab/output-scrolling.test.ts-snapshots/prompt-overlay-hover-normal-jupyterlab-linux.png b/galata/test/jupyterlab/output-scrolling.test.ts-snapshots/prompt-overlay-hover-normal-jupyterlab-linux.png index ad0f85ac29563c4b95bd968ed81dca1cb5a20548..52627c4f9cbb1ca2789c784dc2906b6d9fafa392 100644 GIT binary patch literal 4360 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 CTJ4(v literal 4164 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 b+Z%Zy6NnO(sdqo9G!S*=XRuPJS?K=(P1tYP diff --git a/galata/test/jupyterlab/outputarea-stdin.test.ts b/galata/test/jupyterlab/outputarea-stdin.test.ts index 9eb578c440b2..2fefbf3a8dcd 100644 --- a/galata/test/jupyterlab/outputarea-stdin.test.ts +++ b/galata/test/jupyterlab/outputarea-stdin.test.ts @@ -14,6 +14,12 @@ print('before sleep') sleep(0.1) print('after sleep')`; +const openShadowDOM = `\ +from IPython.display import HTML +HTML("""
""")`; + const ACTIVE_INPUT = '.jp-OutputArea-stdin-item:not(.jp-OutputArea-stdin-hiding) .jp-Stdin-input'; @@ -67,31 +73,39 @@ test.describe('Stdin for ipdb', () => { await expect(page.locator(ACTIVE_INPUT)).toHaveValue('foofoox'); }); - test('Typing in stdin box', async ({ page }) => { - // Test to ensure that notebook shortcuts do not capture text typed into inputs. - // This may not be sufficient to ensure no conflicts with other languages but - // should catch the most severe issues. - const alphabet = 'abcdefghijklmnopqrstuvwxyz'; - const digits = '0123456789'; - await page.notebook.setCell(0, 'code', 'input()'); - // Run the selected (only) cell without proceeding and without waiting - // for it to complete (as it should stay waiting for input). - await page.keyboard.press('Control+Enter'); - - await page.waitForSelector('.jp-Stdin-input'); - for (const letter of alphabet) { - await page.keyboard.press(`Key${letter.toUpperCase()}`); - } - for (const letter of alphabet) { - await page.keyboard.press(`Shift+Key${letter.toUpperCase()}`); - } - for (const digit of digits) { - await page.keyboard.press(`Digit${digit}`); - } - await expect(page.locator('.jp-Stdin-input')).toHaveValue( - alphabet + alphabet.toUpperCase() + digits - ); - }); + const typingScenarios = [ + { name: 'stdin box', code: 'input()', selector: '.jp-Stdin-input' }, + { name: 'shadow DOM input', code: openShadowDOM, selector: '#shadow-input' } + ]; + for (const testCase of typingScenarios) { + test(`Typing in ${testCase.name}`, async ({ page }) => { + // Test to ensure that notebook shortcuts do not capture text typed into inputs. + // This may not be sufficient to ensure no conflicts with other languages but + // should catch the most severe issues. + const alphabet = 'abcdefghijklmnopqrstuvwxyz'; + const digits = '0123456789'; + await page.notebook.setCell(0, 'code', testCase.code); + // Run the selected (only) cell without proceeding and without waiting + // for it to complete (as it should stay waiting for input). + await page.keyboard.press('Control+Enter'); + + await page.waitForSelector(testCase.selector); + await page.focus(testCase.selector); + + for (const letter of alphabet) { + await page.keyboard.press(`Key${letter.toUpperCase()}`); + } + for (const letter of alphabet) { + await page.keyboard.press(`Shift+Key${letter.toUpperCase()}`); + } + for (const digit of digits) { + await page.keyboard.press(`Digit${digit}`); + } + await expect(page.locator(testCase.selector)).toHaveValue( + alphabet + alphabet.toUpperCase() + digits + ); + }); + } test('Subsequent execution in short succession', async ({ page }) => { await page.notebook.setCell(0, 'code', loopedInput); diff --git a/galata/test/jupyterlab/toolbars.test.ts b/galata/test/jupyterlab/toolbars.test.ts index 3fe9be02cdd7..e18fb507017f 100644 --- a/galata/test/jupyterlab/toolbars.test.ts +++ b/galata/test/jupyterlab/toolbars.test.ts @@ -37,3 +37,47 @@ toolbars.forEach(([plugin, parameter]) => { expect(missingCommands).toEqual([]); }); }); +test.describe('Toolbar Button', () => { + test.beforeEach(async ({ page, tmpPath }) => { + await page.notebook.createNew(); + }); + + test('Render Switch Kernel ToolbarButton in default theme', async ({ + page + }) => { + const label = await page.$( + 'jp-button.jp-Toolbar-kernelName .jp-ToolbarButtonComponent-label' + ); + const labelColor = await page.evaluate( + el => getComputedStyle(el).color, + label + ); + + const color = await page.evaluate(() => + getComputedStyle(document.body) + .getPropertyValue('--jp-ui-font-color1') + .trim() + ); + + expect(labelColor).toEqual(color); + }); + + test('Render Switch Kernel ToolbarButton in dark theme', async ({ page }) => { + await page.theme.setDarkTheme(); + const label = await page.$( + 'jp-button.jp-Toolbar-kernelName .jp-ToolbarButtonComponent-label' + ); + const labelColor = await page.evaluate( + el => getComputedStyle(el).color, + label + ); + + const color = await page.evaluate(() => + getComputedStyle(document.body) + .getPropertyValue('--jp-ui-font-color1') + .trim() + ); + + expect(labelColor).toEqual(color); + }); +}); diff --git a/galata/test/jupyterlab/utils.ts b/galata/test/jupyterlab/utils.ts index 1fb2568a5816..0c67f53a8f49 100644 --- a/galata/test/jupyterlab/utils.ts +++ b/galata/test/jupyterlab/utils.ts @@ -1,9 +1,10 @@ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { ElementHandle } from '@playwright/test'; +import { ElementHandle, Locator } from '@playwright/test'; const OUTER_SELECTOR = '.jp-WindowedPanel-outer'; +const DRAGGABLE_AREA = '.jp-InputArea-prompt'; /** * Measure how much of the **notebook** viewport does a cell take up. @@ -49,3 +50,63 @@ export async function positionCellPartiallyBelowViewport( cellBbox.y - notebookBbox.y - notebookBbox.height + cellBbox.height * ratio; await page.mouse.wheel(0, scrollOffset); } + +/** + * Drag a cell to a given position, and wait until specified condition is met. + */ +export async function dragCellTo( + page: IJupyterLabPageFixture, + options: { + cell: Locator; + x: number; + y: number; + stopCondition: () => Promise; + } +) { + const dragHandle = options.cell.locator(DRAGGABLE_AREA); + const handleBBox = await dragHandle.boundingBox(); + + // Emulate drag and drop + await dragHandle.click(); + await page.mouse.move( + handleBBox.x + 0.5 * handleBBox.width, + handleBBox.y + 0.5 * handleBBox.height + ); + await page.mouse.down(); + await page.mouse.move(options.x, options.y); + await page.waitForCondition(options.stopCondition); + await page.mouse.up(); +} + +/** + * Set the sidebar width + * + * @param page Page object + * @param width Sidebar width in pixels + * @param side Which sidebar to set: 'left' or 'right' + */ +export async function setSidebarWidth( + page: IJupyterLabPageFixture, + width = 251, + side: 'left' | 'right' = 'left' +): Promise { + const handles = page.locator( + '#jp-main-split-panel > .lm-SplitPanel-handle:not(.lm-mod-hidden)' + ); + const splitHandle = + side === 'left' + ? await handles.first().elementHandle() + : await handles.last().elementHandle(); + const handleBBox = await splitHandle.boundingBox(); + + await page.mouse.move( + handleBBox.x + 0.5 * handleBBox.width, + handleBBox.y + 0.5 * handleBBox.height + ); + await page.mouse.down(); + await page.mouse.move( + side === 'left' ? 33 + width : page.viewportSize().width - 33 - width, + handleBBox.y + 0.5 * handleBBox.height + ); + await page.mouse.up(); +} diff --git a/jupyterlab/_version.py b/jupyterlab/_version.py index 788601965751..c3ecb3c048a8 100644 --- a/jupyterlab/_version.py +++ b/jupyterlab/_version.py @@ -6,7 +6,7 @@ VersionInfo = namedtuple("VersionInfo", ["major", "minor", "micro", "releaselevel", "serial"]) # DO NOT EDIT THIS DIRECTLY! It is managed by bumpversion -version_info = VersionInfo(4, 1, 0, "final", 0) +version_info = VersionInfo(4, 1, 5, "final", 0) _specifier_ = {"alpha": "a", "beta": "b", "candidate": "rc", "final": ""} diff --git a/jupyterlab/browser-test.js b/jupyterlab/browser-test.js index f5905a2c4850..7a5b6c02647a 100644 --- a/jupyterlab/browser-test.js +++ b/jupyterlab/browser-test.js @@ -28,6 +28,7 @@ if (OUTPUT) { async function main() { /* eslint-disable no-console */ console.info(`Starting headless ${BROWSER}...`); + let testError = null; const pwBrowser = playwright[BROWSER]; const browser = await pwBrowser.launch({ @@ -65,11 +66,12 @@ async function main() { console.log('Waiting for page content..'); try { - await page.locator('#jupyter-config-data').waitFor(); + await page.locator('#jupyter-config-data').waitFor({ state: 'attached' }); } catch (reason) { - console.error('Error loading JupyterLab page:'); + console.error('Error loading JupyterLab page:', reason); // Limit to 1000 characters console.error((await page.content()).substring(0, 1000)); + testError = reason; } console.log('Waiting for #main selector...'); @@ -81,7 +83,6 @@ async function main() { state: 'attached' }); console.log('Waiting for application to start...'); - let testError = null; try { await page.waitForSelector('.completed', { state: 'attached' }); diff --git a/jupyterlab/commands.py b/jupyterlab/commands.py index 50ff500c12cf..61f74a3ccd8e 100644 --- a/jupyterlab/commands.py +++ b/jupyterlab/commands.py @@ -641,13 +641,13 @@ def __init__(self, options): # Migrate from 4.0 which did not have "locked" status try: self._maybe_mirror_disabled_in_locked(level="sys_prefix") - except PermissionError: + except (PermissionError, OSError): try: self.logger.info( "`sys_prefix` level settings are read-only, using `user` level for migration to `lockedExtensions`" ) self._maybe_mirror_disabled_in_locked(level="user") - except PermissionError: + except (PermissionError, OSError): self.logger.warning( "Both `sys_prefix` and `user` level settings are read-only, cannot auto-migrate `disabledExtensions` to `lockedExtensions`" ) diff --git a/jupyterlab/staging/package.json b/jupyterlab/staging/package.json index c662d0922b1b..286f66b2146f 100644 --- a/jupyterlab/staging/package.json +++ b/jupyterlab/staging/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/application-top", - "version": "4.1.0", + "version": "4.1.5", "private": true, "license": "BSD-3-Clause", "scripts": { @@ -23,101 +23,101 @@ "@jupyter/react-components": "~0.13.3", "@jupyter/web-components": "~0.13.3", "@jupyter/ydoc": "~1.1.1", - "@jupyterlab/application": "~4.1.0", - "@jupyterlab/application-extension": "~4.1.0", - "@jupyterlab/apputils": "~4.2.0", - "@jupyterlab/apputils-extension": "~4.1.0", - "@jupyterlab/attachments": "~4.1.0", - "@jupyterlab/cell-toolbar": "~4.1.0", - "@jupyterlab/cell-toolbar-extension": "~4.1.0", - "@jupyterlab/cells": "~4.1.0", - "@jupyterlab/celltags-extension": "~4.1.0", - "@jupyterlab/codeeditor": "~4.1.0", - "@jupyterlab/codemirror": "~4.1.0", - "@jupyterlab/codemirror-extension": "~4.1.0", - "@jupyterlab/completer": "~4.1.0", - "@jupyterlab/completer-extension": "~4.1.0", - "@jupyterlab/console": "~4.1.0", - "@jupyterlab/console-extension": "~4.1.0", - "@jupyterlab/coreutils": "~6.1.0", - "@jupyterlab/csvviewer": "~4.1.0", - "@jupyterlab/csvviewer-extension": "~4.1.0", - "@jupyterlab/debugger": "~4.1.0", - "@jupyterlab/debugger-extension": "~4.1.0", - "@jupyterlab/docmanager": "~4.1.0", - "@jupyterlab/docmanager-extension": "~4.1.0", - "@jupyterlab/docregistry": "~4.1.0", - "@jupyterlab/documentsearch": "~4.1.0", - "@jupyterlab/documentsearch-extension": "~4.1.0", - "@jupyterlab/extensionmanager": "~4.1.0", - "@jupyterlab/extensionmanager-extension": "~4.1.0", - "@jupyterlab/filebrowser": "~4.1.0", - "@jupyterlab/filebrowser-extension": "~4.1.0", - "@jupyterlab/fileeditor": "~4.1.0", - "@jupyterlab/fileeditor-extension": "~4.1.0", - "@jupyterlab/help-extension": "~4.1.0", - "@jupyterlab/htmlviewer": "~4.1.0", - "@jupyterlab/htmlviewer-extension": "~4.1.0", - "@jupyterlab/hub-extension": "~4.1.0", - "@jupyterlab/imageviewer": "~4.1.0", - "@jupyterlab/imageviewer-extension": "~4.1.0", - "@jupyterlab/inspector": "~4.1.0", - "@jupyterlab/inspector-extension": "~4.1.0", - "@jupyterlab/javascript-extension": "~4.1.0", - "@jupyterlab/json-extension": "~4.1.0", - "@jupyterlab/launcher": "~4.1.0", - "@jupyterlab/launcher-extension": "~4.1.0", - "@jupyterlab/logconsole": "~4.1.0", - "@jupyterlab/logconsole-extension": "~4.1.0", - "@jupyterlab/lsp": "~4.1.0", - "@jupyterlab/lsp-extension": "~4.1.0", - "@jupyterlab/mainmenu": "~4.1.0", - "@jupyterlab/mainmenu-extension": "~4.1.0", - "@jupyterlab/markdownviewer": "~4.1.0", - "@jupyterlab/markdownviewer-extension": "~4.1.0", - "@jupyterlab/markedparser-extension": "~4.1.0", - "@jupyterlab/mathjax-extension": "~4.1.0", - "@jupyterlab/mermaid": "~4.1.0", - "@jupyterlab/mermaid-extension": "~4.1.0", - "@jupyterlab/metadataform": "~4.1.0", - "@jupyterlab/metadataform-extension": "~4.1.0", - "@jupyterlab/metapackage": "~4.1.0", - "@jupyterlab/nbconvert-css": "~4.1.0", - "@jupyterlab/nbformat": "~4.1.0", - "@jupyterlab/notebook": "~4.1.0", - "@jupyterlab/notebook-extension": "~4.1.0", - "@jupyterlab/observables": "~5.1.0", - "@jupyterlab/outputarea": "~4.1.0", - "@jupyterlab/pdf-extension": "~4.1.0", - "@jupyterlab/pluginmanager": "~4.1.0", - "@jupyterlab/pluginmanager-extension": "~4.1.0", - "@jupyterlab/property-inspector": "~4.1.0", - "@jupyterlab/rendermime": "~4.1.0", - "@jupyterlab/rendermime-extension": "~4.1.0", - "@jupyterlab/rendermime-interfaces": "~3.9.0", - "@jupyterlab/running": "~4.1.0", - "@jupyterlab/running-extension": "~4.1.0", + "@jupyterlab/application": "~4.1.5", + "@jupyterlab/application-extension": "~4.1.5", + "@jupyterlab/apputils": "~4.2.5", + "@jupyterlab/apputils-extension": "~4.1.5", + "@jupyterlab/attachments": "~4.1.5", + "@jupyterlab/cell-toolbar": "~4.1.5", + "@jupyterlab/cell-toolbar-extension": "~4.1.5", + "@jupyterlab/cells": "~4.1.5", + "@jupyterlab/celltags-extension": "~4.1.5", + "@jupyterlab/codeeditor": "~4.1.5", + "@jupyterlab/codemirror": "~4.1.5", + "@jupyterlab/codemirror-extension": "~4.1.5", + "@jupyterlab/completer": "~4.1.5", + "@jupyterlab/completer-extension": "~4.1.5", + "@jupyterlab/console": "~4.1.5", + "@jupyterlab/console-extension": "~4.1.5", + "@jupyterlab/coreutils": "~6.1.5", + "@jupyterlab/csvviewer": "~4.1.5", + "@jupyterlab/csvviewer-extension": "~4.1.5", + "@jupyterlab/debugger": "~4.1.5", + "@jupyterlab/debugger-extension": "~4.1.5", + "@jupyterlab/docmanager": "~4.1.5", + "@jupyterlab/docmanager-extension": "~4.1.5", + "@jupyterlab/docregistry": "~4.1.5", + "@jupyterlab/documentsearch": "~4.1.5", + "@jupyterlab/documentsearch-extension": "~4.1.5", + "@jupyterlab/extensionmanager": "~4.1.5", + "@jupyterlab/extensionmanager-extension": "~4.1.5", + "@jupyterlab/filebrowser": "~4.1.5", + "@jupyterlab/filebrowser-extension": "~4.1.5", + "@jupyterlab/fileeditor": "~4.1.5", + "@jupyterlab/fileeditor-extension": "~4.1.5", + "@jupyterlab/help-extension": "~4.1.5", + "@jupyterlab/htmlviewer": "~4.1.5", + "@jupyterlab/htmlviewer-extension": "~4.1.5", + "@jupyterlab/hub-extension": "~4.1.5", + "@jupyterlab/imageviewer": "~4.1.5", + "@jupyterlab/imageviewer-extension": "~4.1.5", + "@jupyterlab/inspector": "~4.1.5", + "@jupyterlab/inspector-extension": "~4.1.5", + "@jupyterlab/javascript-extension": "~4.1.5", + "@jupyterlab/json-extension": "~4.1.5", + "@jupyterlab/launcher": "~4.1.5", + "@jupyterlab/launcher-extension": "~4.1.5", + "@jupyterlab/logconsole": "~4.1.5", + "@jupyterlab/logconsole-extension": "~4.1.5", + "@jupyterlab/lsp": "~4.1.5", + "@jupyterlab/lsp-extension": "~4.1.5", + "@jupyterlab/mainmenu": "~4.1.5", + "@jupyterlab/mainmenu-extension": "~4.1.5", + "@jupyterlab/markdownviewer": "~4.1.5", + "@jupyterlab/markdownviewer-extension": "~4.1.5", + "@jupyterlab/markedparser-extension": "~4.1.5", + "@jupyterlab/mathjax-extension": "~4.1.5", + "@jupyterlab/mermaid": "~4.1.5", + "@jupyterlab/mermaid-extension": "~4.1.5", + "@jupyterlab/metadataform": "~4.1.5", + "@jupyterlab/metadataform-extension": "~4.1.5", + "@jupyterlab/metapackage": "~4.1.5", + "@jupyterlab/nbconvert-css": "~4.1.5", + "@jupyterlab/nbformat": "~4.1.5", + "@jupyterlab/notebook": "~4.1.5", + "@jupyterlab/notebook-extension": "~4.1.5", + "@jupyterlab/observables": "~5.1.5", + "@jupyterlab/outputarea": "~4.1.5", + "@jupyterlab/pdf-extension": "~4.1.5", + "@jupyterlab/pluginmanager": "~4.1.5", + "@jupyterlab/pluginmanager-extension": "~4.1.5", + "@jupyterlab/property-inspector": "~4.1.5", + "@jupyterlab/rendermime": "~4.1.5", + "@jupyterlab/rendermime-extension": "~4.1.5", + "@jupyterlab/rendermime-interfaces": "~3.9.5", + "@jupyterlab/running": "~4.1.5", + "@jupyterlab/running-extension": "~4.1.5", "@jupyterlab/services": "../../packages/services", - "@jupyterlab/settingeditor": "~4.1.0", - "@jupyterlab/settingeditor-extension": "~4.1.0", - "@jupyterlab/settingregistry": "~4.1.0", - "@jupyterlab/shortcuts-extension": "~4.1.0", - "@jupyterlab/statedb": "~4.1.0", - "@jupyterlab/statusbar": "~4.1.0", - "@jupyterlab/statusbar-extension": "~4.1.0", - "@jupyterlab/terminal": "~4.1.0", - "@jupyterlab/terminal-extension": "~4.1.0", - "@jupyterlab/theme-dark-extension": "~4.1.0", - "@jupyterlab/theme-light-extension": "~4.1.0", - "@jupyterlab/toc": "~6.1.0", - "@jupyterlab/toc-extension": "~6.1.0", - "@jupyterlab/tooltip": "~4.1.0", - "@jupyterlab/tooltip-extension": "~4.1.0", - "@jupyterlab/translation": "~4.1.0", - "@jupyterlab/translation-extension": "~4.1.0", - "@jupyterlab/ui-components": "~4.1.0", - "@jupyterlab/ui-components-extension": "~4.1.0", - "@jupyterlab/vega5-extension": "~4.1.0", + "@jupyterlab/settingeditor": "~4.1.5", + "@jupyterlab/settingeditor-extension": "~4.1.5", + "@jupyterlab/settingregistry": "~4.1.5", + "@jupyterlab/shortcuts-extension": "~4.1.5", + "@jupyterlab/statedb": "~4.1.5", + "@jupyterlab/statusbar": "~4.1.5", + "@jupyterlab/statusbar-extension": "~4.1.5", + "@jupyterlab/terminal": "~4.1.5", + "@jupyterlab/terminal-extension": "~4.1.5", + "@jupyterlab/theme-dark-extension": "~4.1.5", + "@jupyterlab/theme-light-extension": "~4.1.5", + "@jupyterlab/toc": "~6.1.5", + "@jupyterlab/toc-extension": "~6.1.5", + "@jupyterlab/tooltip": "~4.1.5", + "@jupyterlab/tooltip-extension": "~4.1.5", + "@jupyterlab/translation": "~4.1.5", + "@jupyterlab/translation-extension": "~4.1.5", + "@jupyterlab/ui-components": "~4.1.5", + "@jupyterlab/ui-components-extension": "~4.1.5", + "@jupyterlab/vega5-extension": "~4.1.5", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lumino/algorithm": "^2.0.0", @@ -142,58 +142,58 @@ "yjs": "^13.5.40" }, "dependencies": { - "@jupyterlab/application": "~4.1.0", - "@jupyterlab/application-extension": "~4.1.0", - "@jupyterlab/apputils-extension": "~4.1.0", - "@jupyterlab/cell-toolbar-extension": "~4.1.0", - "@jupyterlab/celltags-extension": "~4.1.0", - "@jupyterlab/codemirror-extension": "~4.1.0", - "@jupyterlab/completer-extension": "~4.1.0", - "@jupyterlab/console-extension": "~4.1.0", - "@jupyterlab/coreutils": "~6.1.0", - "@jupyterlab/csvviewer-extension": "~4.1.0", - "@jupyterlab/debugger-extension": "~4.1.0", - "@jupyterlab/docmanager-extension": "~4.1.0", - "@jupyterlab/documentsearch-extension": "~4.1.0", - "@jupyterlab/extensionmanager-extension": "~4.1.0", - "@jupyterlab/filebrowser-extension": "~4.1.0", - "@jupyterlab/fileeditor-extension": "~4.1.0", - "@jupyterlab/help-extension": "~4.1.0", - "@jupyterlab/htmlviewer-extension": "~4.1.0", - "@jupyterlab/hub-extension": "~4.1.0", - "@jupyterlab/imageviewer-extension": "~4.1.0", - "@jupyterlab/inspector-extension": "~4.1.0", - "@jupyterlab/javascript-extension": "~4.1.0", - "@jupyterlab/json-extension": "~4.1.0", - "@jupyterlab/launcher-extension": "~4.1.0", - "@jupyterlab/logconsole-extension": "~4.1.0", - "@jupyterlab/lsp-extension": "~4.1.0", - "@jupyterlab/mainmenu-extension": "~4.1.0", - "@jupyterlab/markdownviewer-extension": "~4.1.0", - "@jupyterlab/markedparser-extension": "~4.1.0", - "@jupyterlab/mathjax-extension": "~4.1.0", - "@jupyterlab/mermaid-extension": "~4.1.0", - "@jupyterlab/metadataform-extension": "~4.1.0", - "@jupyterlab/notebook-extension": "~4.1.0", - "@jupyterlab/pdf-extension": "~4.1.0", - "@jupyterlab/pluginmanager-extension": "~4.1.0", - "@jupyterlab/rendermime-extension": "~4.1.0", - "@jupyterlab/running-extension": "~4.1.0", - "@jupyterlab/settingeditor-extension": "~4.1.0", - "@jupyterlab/shortcuts-extension": "~4.1.0", - "@jupyterlab/statusbar-extension": "~4.1.0", - "@jupyterlab/terminal-extension": "~4.1.0", - "@jupyterlab/theme-dark-extension": "~4.1.0", - "@jupyterlab/theme-light-extension": "~4.1.0", - "@jupyterlab/toc-extension": "~6.1.0", - "@jupyterlab/tooltip-extension": "~4.1.0", - "@jupyterlab/translation-extension": "~4.1.0", - "@jupyterlab/ui-components-extension": "~4.1.0", - "@jupyterlab/vega5-extension": "~4.1.0" + "@jupyterlab/application": "~4.1.5", + "@jupyterlab/application-extension": "~4.1.5", + "@jupyterlab/apputils-extension": "~4.1.5", + "@jupyterlab/cell-toolbar-extension": "~4.1.5", + "@jupyterlab/celltags-extension": "~4.1.5", + "@jupyterlab/codemirror-extension": "~4.1.5", + "@jupyterlab/completer-extension": "~4.1.5", + "@jupyterlab/console-extension": "~4.1.5", + "@jupyterlab/coreutils": "~6.1.5", + "@jupyterlab/csvviewer-extension": "~4.1.5", + "@jupyterlab/debugger-extension": "~4.1.5", + "@jupyterlab/docmanager-extension": "~4.1.5", + "@jupyterlab/documentsearch-extension": "~4.1.5", + "@jupyterlab/extensionmanager-extension": "~4.1.5", + "@jupyterlab/filebrowser-extension": "~4.1.5", + "@jupyterlab/fileeditor-extension": "~4.1.5", + "@jupyterlab/help-extension": "~4.1.5", + "@jupyterlab/htmlviewer-extension": "~4.1.5", + "@jupyterlab/hub-extension": "~4.1.5", + "@jupyterlab/imageviewer-extension": "~4.1.5", + "@jupyterlab/inspector-extension": "~4.1.5", + "@jupyterlab/javascript-extension": "~4.1.5", + "@jupyterlab/json-extension": "~4.1.5", + "@jupyterlab/launcher-extension": "~4.1.5", + "@jupyterlab/logconsole-extension": "~4.1.5", + "@jupyterlab/lsp-extension": "~4.1.5", + "@jupyterlab/mainmenu-extension": "~4.1.5", + "@jupyterlab/markdownviewer-extension": "~4.1.5", + "@jupyterlab/markedparser-extension": "~4.1.5", + "@jupyterlab/mathjax-extension": "~4.1.5", + "@jupyterlab/mermaid-extension": "~4.1.5", + "@jupyterlab/metadataform-extension": "~4.1.5", + "@jupyterlab/notebook-extension": "~4.1.5", + "@jupyterlab/pdf-extension": "~4.1.5", + "@jupyterlab/pluginmanager-extension": "~4.1.5", + "@jupyterlab/rendermime-extension": "~4.1.5", + "@jupyterlab/running-extension": "~4.1.5", + "@jupyterlab/settingeditor-extension": "~4.1.5", + "@jupyterlab/shortcuts-extension": "~4.1.5", + "@jupyterlab/statusbar-extension": "~4.1.5", + "@jupyterlab/terminal-extension": "~4.1.5", + "@jupyterlab/theme-dark-extension": "~4.1.5", + "@jupyterlab/theme-light-extension": "~4.1.5", + "@jupyterlab/toc-extension": "~6.1.5", + "@jupyterlab/tooltip-extension": "~4.1.5", + "@jupyterlab/translation-extension": "~4.1.5", + "@jupyterlab/ui-components-extension": "~4.1.5", + "@jupyterlab/vega5-extension": "~4.1.5" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0", - "@jupyterlab/buildutils": "^4.1.0", + "@jupyterlab/builder": "^4.1.5", + "@jupyterlab/buildutils": "^4.1.5", "chokidar": "^3.4.0", "css-loader": "^6.7.1", "duplicate-package-checker-webpack-plugin": "^3.0.0", @@ -222,7 +222,7 @@ }, "jupyterlab": { "name": "JupyterLab", - "version": "4.1.0", + "version": "4.1.5", "extensions": { "@jupyterlab/application-extension": "", "@jupyterlab/apputils-extension": "", diff --git a/jupyterlab/staging/yarn.lock b/jupyterlab/staging/yarn.lock index 96bead1f31d4..18db4f029b4a 100644 --- a/jupyterlab/staging/yarn.lock +++ b/jupyterlab/staging/yarn.lock @@ -420,26 +420,26 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/application-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/property-inspector": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/application-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/application-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/property-inspector": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 9bed240f219027b9f5674f4f497c575e3df6bdcb8a8e499cdd6ebbdc7d94ea383357297cafd22070f1d3e097f22b3fbbeb1b9e951c7b13910d1d534b07542163 + checksum: 0e07b2a433ad90a2f8fc596f7ed19b78edfb64acd50c9f8bcf6d2f321c340627253e266d5b24f5c2ee276f90d5479795cdbc2490d7e1fdeec89ac7faf5e3d318 languageName: node linkType: hard @@ -447,56 +447,56 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/application-top@workspace:." dependencies: - "@jupyterlab/application": ~4.1.0 - "@jupyterlab/application-extension": ~4.1.0 - "@jupyterlab/apputils-extension": ~4.1.0 - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/buildutils": ^4.1.0 - "@jupyterlab/cell-toolbar-extension": ~4.1.0 - "@jupyterlab/celltags-extension": ~4.1.0 - "@jupyterlab/codemirror-extension": ~4.1.0 - "@jupyterlab/completer-extension": ~4.1.0 - "@jupyterlab/console-extension": ~4.1.0 - "@jupyterlab/coreutils": ~6.1.0 - "@jupyterlab/csvviewer-extension": ~4.1.0 - "@jupyterlab/debugger-extension": ~4.1.0 - "@jupyterlab/docmanager-extension": ~4.1.0 - "@jupyterlab/documentsearch-extension": ~4.1.0 - "@jupyterlab/extensionmanager-extension": ~4.1.0 - "@jupyterlab/filebrowser-extension": ~4.1.0 - "@jupyterlab/fileeditor-extension": ~4.1.0 - "@jupyterlab/help-extension": ~4.1.0 - "@jupyterlab/htmlviewer-extension": ~4.1.0 - "@jupyterlab/hub-extension": ~4.1.0 - "@jupyterlab/imageviewer-extension": ~4.1.0 - "@jupyterlab/inspector-extension": ~4.1.0 - "@jupyterlab/javascript-extension": ~4.1.0 - "@jupyterlab/json-extension": ~4.1.0 - "@jupyterlab/launcher-extension": ~4.1.0 - "@jupyterlab/logconsole-extension": ~4.1.0 - "@jupyterlab/lsp-extension": ~4.1.0 - "@jupyterlab/mainmenu-extension": ~4.1.0 - "@jupyterlab/markdownviewer-extension": ~4.1.0 - "@jupyterlab/markedparser-extension": ~4.1.0 - "@jupyterlab/mathjax-extension": ~4.1.0 - "@jupyterlab/mermaid-extension": ~4.1.0 - "@jupyterlab/metadataform-extension": ~4.1.0 - "@jupyterlab/notebook-extension": ~4.1.0 - "@jupyterlab/pdf-extension": ~4.1.0 - "@jupyterlab/pluginmanager-extension": ~4.1.0 - "@jupyterlab/rendermime-extension": ~4.1.0 - "@jupyterlab/running-extension": ~4.1.0 - "@jupyterlab/settingeditor-extension": ~4.1.0 - "@jupyterlab/shortcuts-extension": ~4.1.0 - "@jupyterlab/statusbar-extension": ~4.1.0 - "@jupyterlab/terminal-extension": ~4.1.0 - "@jupyterlab/theme-dark-extension": ~4.1.0 - "@jupyterlab/theme-light-extension": ~4.1.0 - "@jupyterlab/toc-extension": ~6.1.0 - "@jupyterlab/tooltip-extension": ~4.1.0 - "@jupyterlab/translation-extension": ~4.1.0 - "@jupyterlab/ui-components-extension": ~4.1.0 - "@jupyterlab/vega5-extension": ~4.1.0 + "@jupyterlab/application": ~4.1.5 + "@jupyterlab/application-extension": ~4.1.5 + "@jupyterlab/apputils-extension": ~4.1.5 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/buildutils": ^4.1.5 + "@jupyterlab/cell-toolbar-extension": ~4.1.5 + "@jupyterlab/celltags-extension": ~4.1.5 + "@jupyterlab/codemirror-extension": ~4.1.5 + "@jupyterlab/completer-extension": ~4.1.5 + "@jupyterlab/console-extension": ~4.1.5 + "@jupyterlab/coreutils": ~6.1.5 + "@jupyterlab/csvviewer-extension": ~4.1.5 + "@jupyterlab/debugger-extension": ~4.1.5 + "@jupyterlab/docmanager-extension": ~4.1.5 + "@jupyterlab/documentsearch-extension": ~4.1.5 + "@jupyterlab/extensionmanager-extension": ~4.1.5 + "@jupyterlab/filebrowser-extension": ~4.1.5 + "@jupyterlab/fileeditor-extension": ~4.1.5 + "@jupyterlab/help-extension": ~4.1.5 + "@jupyterlab/htmlviewer-extension": ~4.1.5 + "@jupyterlab/hub-extension": ~4.1.5 + "@jupyterlab/imageviewer-extension": ~4.1.5 + "@jupyterlab/inspector-extension": ~4.1.5 + "@jupyterlab/javascript-extension": ~4.1.5 + "@jupyterlab/json-extension": ~4.1.5 + "@jupyterlab/launcher-extension": ~4.1.5 + "@jupyterlab/logconsole-extension": ~4.1.5 + "@jupyterlab/lsp-extension": ~4.1.5 + "@jupyterlab/mainmenu-extension": ~4.1.5 + "@jupyterlab/markdownviewer-extension": ~4.1.5 + "@jupyterlab/markedparser-extension": ~4.1.5 + "@jupyterlab/mathjax-extension": ~4.1.5 + "@jupyterlab/mermaid-extension": ~4.1.5 + "@jupyterlab/metadataform-extension": ~4.1.5 + "@jupyterlab/notebook-extension": ~4.1.5 + "@jupyterlab/pdf-extension": ~4.1.5 + "@jupyterlab/pluginmanager-extension": ~4.1.5 + "@jupyterlab/rendermime-extension": ~4.1.5 + "@jupyterlab/running-extension": ~4.1.5 + "@jupyterlab/settingeditor-extension": ~4.1.5 + "@jupyterlab/shortcuts-extension": ~4.1.5 + "@jupyterlab/statusbar-extension": ~4.1.5 + "@jupyterlab/terminal-extension": ~4.1.5 + "@jupyterlab/theme-dark-extension": ~4.1.5 + "@jupyterlab/theme-light-extension": ~4.1.5 + "@jupyterlab/toc-extension": ~6.1.5 + "@jupyterlab/tooltip-extension": ~4.1.5 + "@jupyterlab/translation-extension": ~4.1.5 + "@jupyterlab/ui-components-extension": ~4.1.5 + "@jupyterlab/vega5-extension": ~4.1.5 chokidar: ^3.4.0 css-loader: ^6.7.1 duplicate-package-checker-webpack-plugin: ^3.0.0 @@ -522,20 +522,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/application@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/application@npm:4.1.0" +"@jupyterlab/application@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/application@npm:4.1.5" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/application": ^2.3.0 "@lumino/commands": ^2.2.0 @@ -546,27 +546,27 @@ __metadata: "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 1ca13156bee6e07850c008b1c8c510073bfd74c1c5056014313bfda1503db0b19472e727d549bb8461f17fdb6cd10fb3db854aa9f4cefb5599a4fc73017d46e7 + checksum: 53feb2574cecc408aa4fec223dc9e2864f16593b3bdc6fb25904d350908883aef60e8a07ceb4da6224af6b9c810a8f311c6edc1b21ed7e2a9f83567e49f8a029 languageName: node linkType: hard -"@jupyterlab/apputils-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/apputils-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/apputils-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/apputils-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -577,23 +577,23 @@ __metadata: react: ^18.2.0 react-dom: ^18.2.0 react-toastify: ^9.0.8 - checksum: ce6208a1f49d9738097cbc9de9ebc6763b31bbbc038236d020659353240ae55a1cf76ed7276db2ea53e0af441a6c14555e30348b4c8bab4e71023a29e9ddc4f7 + checksum: 21cbe8c4b1e1f5a3afb24a365d4f7c36d79ef3830dfd8e8eee8ba11ae1eb36ea588103266df6635362def813bbb98e9aa7c0e30ea33ce87e646289d1a7d1057b languageName: node linkType: hard -"@jupyterlab/apputils@npm:~4.2.0": - version: 4.2.0 - resolution: "@jupyterlab/apputils@npm:4.2.0" - dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/apputils@npm:~4.2.5": + version: 4.2.5 + resolution: "@jupyterlab/apputils@npm:4.2.5" + dependencies: + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -606,27 +606,27 @@ __metadata: "@types/react": ^18.0.26 react: ^18.2.0 sanitize-html: ~2.7.3 - checksum: aec06e0e1403850676e766061d847e7cefa7225cdf48bbd2f3ab3f8356cb306646bf57dc15bcda149aa700e87850425ab8b79299d3414751a1753747ef9f15ba + checksum: e5652a14d1d7972bcff84cec13fc2849a6520f6e7cb82275eff37869afdb7aa856af88dad5621dfb967ea99733539488164d3b5f54885248a87adf4c86c2ce65 languageName: node linkType: hard -"@jupyterlab/attachments@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/attachments@npm:4.1.0" +"@jupyterlab/attachments@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/attachments@npm:4.1.5" dependencies: - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 - checksum: ddb1716f7e9d0a7272979dc82109c17069b2b618142e289e2127a1b59eecf3ddc02cf8665b1f1ae42a3c8fbbc90f2d6ba270455381cdeec3d5d1be7488ca8a5c + checksum: 82a7c475a0eb4b7622d2d1290e4eb3aef9f9f4d104625def1ae4404628bcdcd543355cbe70a2f7675bca6a08e2a02d7ceedec376dcd3d7115ccfcd3497562690 languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/builder@npm:4.1.0" +"@jupyterlab/builder@npm:^4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/builder@npm:4.1.5" dependencies: "@lumino/algorithm": ^2.0.1 "@lumino/application": ^2.3.0 @@ -661,13 +661,13 @@ __metadata: worker-loader: ^3.0.2 bin: build-labextension: lib/build-labextension.js - checksum: 1a8f684fbf31fef2bae93b84e79af12bd0e70cedc5546f7501a17147425616ffd7ec42586ba23e9d6eb6a79e40d651f6f87d9c1c496ed26f84a2990da8631958 + checksum: f7618f4ab388337248018680456f886d106e096a425c406f743559f11ef21380b9fc1d578bc008f7336e38b050ebe945e45d26bb18e7f6c28b27e2ff72e8be0e languageName: node linkType: hard -"@jupyterlab/buildutils@npm:^4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/buildutils@npm:4.1.0" +"@jupyterlab/buildutils@npm:^4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/buildutils@npm:4.1.5" dependencies: "@yarnpkg/core": ^3.0.0 "@yarnpkg/parsers": ^2.0.0 @@ -695,65 +695,65 @@ __metadata: update-dependency: lib/update-dependency.js update-dist-tag: lib/update-dist-tag.js update-staging-lock: lib/update-staging-lock.js - checksum: 6c4ba4100c01c0ca561b4fe39a90b7d09270c2cec0d10a0a2e94ad33b7d5ba0b1b6f4e6b8f1d6df28943f16ce3d1d54eb249c22ec7855c7195f7d0acb54c8cbe + checksum: 73c069190a555fd4aa52d6b26c2b15e43b321445adfa6558118675957c5565d743a92945077038b15f4550761bda765aa2a117c315419baf3d24a1c519063b1f languageName: node linkType: hard -"@jupyterlab/cell-toolbar-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/cell-toolbar-extension@npm:4.1.0" +"@jupyterlab/cell-toolbar-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/cell-toolbar-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cell-toolbar": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 8ea491f244e112824e0de4308afb475233c9a9c2ed28799edcaee346ce5c95239885af00f07a53927e5d8f82932537b6bc30e4f1f3558adebae5ae497faafca4 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cell-toolbar": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 07e8b9c70bc8dce8febf134e26a9dede3a998d0a83831c6edf8febb51af823ab304e51122a1cbc68f5f9ac29b249671bf704c8ecb97d3640963f0af42688e28f languageName: node linkType: hard -"@jupyterlab/cell-toolbar@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/cell-toolbar@npm:4.1.0" +"@jupyterlab/cell-toolbar@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/cell-toolbar@npm:4.1.5" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 0ea64f5103f6afb0d5f8b158789f0ad749d79098a2baf27847dac8aca2d4b9097e87378a821e41bbe7da0ffea43a52f9ae91a7656bae0e7ba265a5eecfcbaf47 + checksum: bffddd58bc536980e082ecd1521ad5b41730fa1bac2f55f869ed4f4214d19d86c6337c5b51b154324cb5c66d305fa57e30ca76ebae450a2933f2fa9e4d133405 languageName: node linkType: hard -"@jupyterlab/cells@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/cells@npm:4.1.0" +"@jupyterlab/cells@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/cells@npm:4.1.5" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/attachments": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/attachments": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/domutils": ^2.0.1 @@ -764,38 +764,38 @@ __metadata: "@lumino/virtualdom": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 41fb5dddda54ff53d828eff9f142092966214dadff7d93d6d91777746a36fcd192bc5a4055e364185fb367f6d3ed462946d214a33ba0ed63037b83b683958c44 + checksum: 49a9eec0323f4fcc96016303185dae72571a9b846c3ec0fc188e99b66ce7be6cd82efdd8056d041f9a4e55a1156b22004143a4c175b339fe83621e592e11c923 languageName: node linkType: hard -"@jupyterlab/celltags-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/celltags-extension@npm:4.1.0" +"@jupyterlab/celltags-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/celltags-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@rjsf/utils": ^5.13.4 react: ^18.2.0 - checksum: b982d951f5757776472d0c0f47b8b58b9b526723958c3e9c662bc9eeb932cf5e466a84d8d81ce1bd934ba9a7dcd33683dfbf82f8e84cb1dc25513344b6bfa8be + checksum: 4061f787e363211cd86c7505ce43e21440944c5b40237437c37c62f7e11ed1a0b0c11dd144a51cf99b0645ceaca51aee167e0152b8d907c1b383bb09acee1b98 languageName: node linkType: hard -"@jupyterlab/codeeditor@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/codeeditor@npm:4.1.0" +"@jupyterlab/codeeditor@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/codeeditor@npm:4.1.5" dependencies: "@codemirror/state": ^6.2.0 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/dragdrop": ^2.1.4 @@ -803,37 +803,37 @@ __metadata: "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: ae58f6cb446f98b781a956986fcb497b53f380ed86510d67b13e3086cee434423d5a03c26a130ea8d02c762cd6a6cbc62fd088c6f60f78d4bb558102e4c80ad8 + checksum: f9f52122fa90058f716023489a66e2c7c2830580484a4f5474570da302452c4fa8680e55c18988cfe7e19f204839628bfada358d46027d9971ba91f56b79be78 languageName: node linkType: hard -"@jupyterlab/codemirror-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/codemirror-extension@npm:4.1.0" +"@jupyterlab/codemirror-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/codemirror-extension@npm:4.1.5" dependencies: "@codemirror/lang-markdown": ^6.1.1 "@codemirror/language": ^6.6.0 "@codemirror/legacy-modes": ^6.3.2 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 "@rjsf/utils": ^5.13.4 "@rjsf/validator-ajv8": ^5.13.4 react: ^18.2.0 - checksum: d78aee108b8fd9b4f1bc8572ffe03282c07bd3b5095daab208a7425d43a2cfdf30f2b0011132f313f9256caefc1e8f5b5df709be490e579cc88d43e810b56750 + checksum: 81a23ea40845d2c6c175730fa45bbd1fda74b6ebae43edf01a5a0e9784a02a329bc51fbfb2c46d74ead1dbcaf4a0f7753630088ef3d89af062d07544dd9e15df languageName: node linkType: hard -"@jupyterlab/codemirror@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/codemirror@npm:4.1.0" +"@jupyterlab/codemirror@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/codemirror@npm:4.1.5" dependencies: "@codemirror/autocomplete": ^6.5.1 "@codemirror/commands": ^6.2.3 @@ -856,11 +856,11 @@ __metadata: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lezer/common": ^1.0.2 "@lezer/generator": ^1.2.2 "@lezer/highlight": ^1.1.4 @@ -869,44 +869,44 @@ __metadata: "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 yjs: ^13.5.40 - checksum: 92fb4ebebe4b5926fbf5ba2a99f845e8879918b3a095adf99de5f8385b3168412db38ebe2f1ae1eff8f29304d2c8c1b31c3cc1ba66a9c2d16e7a69dced20a768 + checksum: 8f6f30fbaebb2a88d50c5af5732058e2e605077871c079524d6466949973660a862cf75a205100019bd02d9888a9d7d85460269bfe646257dd50e4c61c4d0af3 languageName: node linkType: hard -"@jupyterlab/completer-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/completer-extension@npm:4.1.0" +"@jupyterlab/completer-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/completer-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@rjsf/utils": ^5.13.4 react: ^18.2.0 - checksum: 2435027fb71a263db6c88c7bdc25d60490ae6f549ec579d39d378db50ddb13666cf46574e91f20c12e8dfdea8615d1d21a70a61758b95ffea8c0cfacf6e9379c + checksum: ae198c739290e18230f0509ac8d0b5ed437e6c1ade25e853cdd25782576087aa29622cdfe93e44ebb78bbf4b45973e095a6ecea071ea03ae6661b942bc47a4e5 languageName: node linkType: hard -"@jupyterlab/completer@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/completer@npm:4.1.0" +"@jupyterlab/completer@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/completer@npm:4.1.5" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -914,65 +914,65 @@ __metadata: "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 11c21f95722c2cce8ce91886036e381b6c43bd9b602bf37e38de2aabeab315cb6cc68bed9d12abfa75dc0cad616b4fd9748a77f81016cd739aa1ef8128964cbc + checksum: 49e481b45d73f4cdec6bbf4a01665f946b436c38953f360abf8043fc8952c22192f05dabb3a582d40c5d91ef022b6d969ee797b6976a6e2b462887a524445f56 languageName: node linkType: hard -"@jupyterlab/console-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/console-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/console-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/console-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/widgets": ^2.3.1 - checksum: 89b32641f8716a4396428f5b8c5e07a02ceada5242768efa21260ccb314a89cdc0c0fb3e8ef7d8e5d64f3adda59476fe835144166ed2c479dd22cfd4bda29b41 + checksum: e58d3d63ec6fde0e41e5ea51f915f99555e5cc468cde3d2d18b16161cd168c7244020a4652a5e24fdc8cc7ada4b88f003f0ff976fadd445dcb9d152b4303042b languageName: node linkType: hard -"@jupyterlab/console@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/console@npm:4.1.0" +"@jupyterlab/console@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/console@npm:4.1.5" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.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.1 - checksum: 01c7fd1cd3604b5bfd910a1719a068e06329f2ab7a450f00325b8befcc9f8da6ab2d91d6220d7ffc77ffeff5978e355dd6e560afe39c1de12d6ac70ab9d02e78 + checksum: 01e90b8527583c5ed0ad4b17db3d8062b96cac8517319d6a8a4fecec31e612264c06f5434adf3313b6a16eec190c456116c2095fcb9e4234f30d8d042ee7d734 languageName: node linkType: hard -"@jupyterlab/coreutils@npm:~6.1.0": - version: 6.1.0 - resolution: "@jupyterlab/coreutils@npm:6.1.0" +"@jupyterlab/coreutils@npm:~6.1.5": + version: 6.1.5 + resolution: "@jupyterlab/coreutils@npm:6.1.5" dependencies: "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -980,92 +980,92 @@ __metadata: minimist: ~1.2.0 path-browserify: ^1.0.0 url-parse: ~1.5.4 - checksum: d1fdeb3fa28af76cab52c04c82b51a1f02f9cd7779dc1eecbd1177bf246d0213c4e7234bf74eb1bd1d909123988e40addbec8fd7a027c4f5448f3c968b27642c + checksum: b91c5a374f3c97d62e2442bb5f12cb79c6e440b5f6aa4d4ed6e492e8ca38836f7068106bb7029834a4e5de1947a9c44c342d23bedf9a4611aafca33629aed049 languageName: node linkType: hard -"@jupyterlab/csvviewer-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/csvviewer-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/csvviewer": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/csvviewer-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/csvviewer-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/csvviewer": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/datagrid": ^2.3.0 "@lumino/widgets": ^2.3.1 - checksum: 1386d4fec90fe0099679a7b4edb6bb6e901cef410e1264aac9c5e3a350519cedd3fcfe3e0310d712a4459d9b5f0a14498dcbf1687c4ac70c7633660177e04175 + checksum: 29125c98a1c58511552860e260e3d7c2152679896a19942e32b2d990467aa40741ddeda3ad27e07df3326f6095a1ab0d7c50156f4921499c713e2ce6e331ac96 languageName: node linkType: hard -"@jupyterlab/csvviewer@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/csvviewer@npm:4.1.0" +"@jupyterlab/csvviewer@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/csvviewer@npm:4.1.5" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/datagrid": ^2.3.0 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 45aa7f636f434856652697adb11264b75d857e68f47771f150a6877c0ac8385a910c2a0261dce959c3e37daf77a10256b0ded248c061843b49bc3653557fabda + checksum: 1ceeea1d8dfc6da9bfd800b89ce2e7f0a146ba190b8cf366aa2a2b27ff9013a239fa7beb588b8ff12695feb92e521cd55cfea52631aaa8e634a50167e60210dd languageName: node linkType: hard -"@jupyterlab/debugger-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/debugger-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/debugger": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 77a5e4d13d92b096b97cfa3977457a13647095d5abcb4437c1a0bed0b75363a771441bdb31647fa94b75bd00e26519f964ae91a1a2a7bf2ecc0391881775ca7c - languageName: node - linkType: hard - -"@jupyterlab/debugger@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/debugger@npm:4.1.0" +"@jupyterlab/debugger-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/debugger-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/debugger": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: b93e13531f309d89f00bf106e2d23d4f39f0072131f69635e43ef22a18b2c6c280efc62837d7056995f599c5625d5e843680e12934a737eab4ed8ab72f09d6d7 + languageName: node + linkType: hard + +"@jupyterlab/debugger@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/debugger@npm:4.1.5" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -1077,24 +1077,24 @@ __metadata: "@lumino/widgets": ^2.3.1 "@vscode/debugprotocol": ^1.51.0 react: ^18.2.0 - checksum: 083150201a6a0f8e5713aba643fc916a7f0fb3602c5a410b0c958f7a4d782ce142ccd4ca71a1c2b985f78d927d1f7a2898fb0c2adb4daf4396dff451a6fab561 + checksum: 729fafacac228d2034a42fd216b50502ef34db828f5324731206e3558d8eed91a33ba4422da45a86d239e970a878686a188c8ae443e22cf47ed136a827f4d083 languageName: node linkType: hard -"@jupyterlab/docmanager-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/docmanager-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/docmanager-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/docmanager-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -1102,21 +1102,21 @@ __metadata: "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: a3b6b051901a4ffa01368302aa688ef9720b63695127ac4c876999933077a969c59852137b4eeb2ecd965a6c501a65af781799a8552769f7d7c5b7be75c1daa4 + checksum: a3794e9228d55d68beeabefae1b4acffc3a51f4e745b302408ed663aacd4db727613a18cb2d3ba7650f1104238f38082d45b111a99150511b97574cc95f77275 languageName: node linkType: hard -"@jupyterlab/docmanager@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/docmanager@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/docmanager@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/docmanager@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -1125,24 +1125,24 @@ __metadata: "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 64f63512a862c2539f3eb1eb255ad6d1c3d5380519079b745503b38eebba255af4d12688b57d42c83a0220758b5cd8304012044cab18433f1c35ca6e49356719 + checksum: d56e8ab83f523c5c90593147cd5bf12a704348bcdec243f8ecaa375f91f6f4c7646a76e9c10920f4f7d1cd19f09f79adc5eb0fbc5d1ac817b6031d3ad6ce600b languageName: node linkType: hard -"@jupyterlab/docregistry@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/docregistry@npm:4.1.0" +"@jupyterlab/docregistry@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/docregistry@npm:4.1.5" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -1151,32 +1151,32 @@ __metadata: "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 8407ea92d2f7a094ea47313917b7d32ce6a9e7dd79ab595eeef4064d805f818720210cde3c949b517ba98bae52980ab373df42082ca654f0f483935e104f0335 + checksum: 9b017d775c31dfb4ac60908afd9d24210e9434bf6d090fb3d55fcdc0ec9c16b23b6a009fe54a376f89363882f7c25f5e5eadf3b096fa72ce1a148b14773675e4 languageName: node linkType: hard -"@jupyterlab/documentsearch-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/documentsearch-extension@npm:4.1.0" +"@jupyterlab/documentsearch-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/documentsearch-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 - checksum: 2aabf4801cf2e4a2d99da7e6199fb8e26112cba0a7bd97650588cfc369212dce8164d9cfcb97bd639b73158fee02abae950872fb3dd7987706d611adbc93cda3 + checksum: 5fb96a1e59a52b47f938b311a45f5c83bb03e5e767a8f15159c357400e0aad17ce3720dd86458e0a62e3253c1ffd03bea5b3482a5f875723aec11e793acb2bc3 languageName: node linkType: hard -"@jupyterlab/documentsearch@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/documentsearch@npm:4.1.0" +"@jupyterlab/documentsearch@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/documentsearch@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -1185,79 +1185,79 @@ __metadata: "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 768b02f07c892622b126d8b8f59e4559003f3900f2cb588fba27aa87ebb1eb9a703fe99ebccc9bd8ccba2f8859ba157060b0bb5e5c5572fe9906fd7152caf536 + checksum: 496748a03177574a79305a42e29e996bf3633523cf9a6624ac117c97df2f5d4697cd45bf421033068539f94f568811307d0deccf2d1e24885d8f7d205b13a481 languageName: node linkType: hard -"@jupyterlab/extensionmanager-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/extensionmanager-extension@npm:4.1.0" +"@jupyterlab/extensionmanager-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/extensionmanager-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/extensionmanager": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 - checksum: 16fc49cb0f7ee15443e5be30aaf43d9ae599e478516d511fb4ee645fcca2b3162657a8f2c617a658c4ac5bd8e90741cfc91a1c152c2b7b2f82674a979e285446 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/extensionmanager": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 + checksum: a301ba918e38bee5cd11f4eb817aa386a5a7e7ee15f79e148a19ca54f6b0234c477401acc0d4cbdb450931d83b3b0309f85d136755acc57e7f7587e418ceb8d5 languageName: node linkType: hard -"@jupyterlab/extensionmanager@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/extensionmanager@npm:4.1.0" +"@jupyterlab/extensionmanager@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/extensionmanager@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/messaging": ^2.0.1 "@lumino/polling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 react-paginate: ^6.3.2 semver: ^7.3.2 - checksum: 54a7d4456cd519e694797cf24aa7990054c58b88c4307bab637fbe8b070d4668ad4cd63c6e4e514202e09b04b05897d64c3c3a41c1e20a534655e274cc982480 + checksum: 35a464bba21244dba9515344f57abd3c06b680842f8d8a6805385ab06fba508f6cd8157dfe5036793d7a53c236da9ce4f36529c069e12784e7c40300a6ab51ca languageName: node linkType: hard -"@jupyterlab/filebrowser-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/filebrowser-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/filebrowser-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/filebrowser-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 - checksum: 58a161c3a61f96482b01b1cd833936068c36866d06347e5f9e716bb724eca42ac775fc0cf679b0124d33734295ade5b020a5b1756d022a21e62321ac24764340 + checksum: cf2aa75f18863a4df723a35f0dc3796886ce6a855e90370c7f3b7847894edc85f303e27505bc5b677d7c1287e19b928a1db90a2f3a804621e863b32a7cab0992 languageName: node linkType: hard -"@jupyterlab/filebrowser@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/filebrowser@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/filebrowser@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/filebrowser@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -1269,221 +1269,221 @@ __metadata: "@lumino/virtualdom": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: ee29ad3a5ca3d9477a760179ff8b520cb88b8fd08f62ecd872d0cc0c5e1cc397349b020ba8c24f9b543b9cd5513c3b9da813d41bc5a63464aa3321a31b613115 + checksum: 6ec08114012ab6ec8c3263fcff932c6949445c4d01f1f8aeefb9e6c496628025ca84683ae212aa03c5342b43e5df9082c812c6bf2b05fc0e2dc7aefeedf47cd2 languageName: node linkType: hard -"@jupyterlab/fileeditor-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/fileeditor-extension@npm:4.1.0" +"@jupyterlab/fileeditor-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/fileeditor-extension@npm:4.1.5" dependencies: "@codemirror/commands": ^6.2.3 "@codemirror/search": ^6.3.0 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 617ad059021b6aa82df9d3f685131056606479249dea9dbdefab518d9b8e2502e791426b67926a860644b3140d04a8fc2c7e5cd7900a5494a85796643c24788d + checksum: 91e7d97b71d814cabb75b9f67462dd613f1f1eb5a96254e1598b4e7efb17b6422db58b10a0776f84d91998f221bc7bb08e4ae475e57bd7e99c138d65c6ef8c1d languageName: node linkType: hard -"@jupyterlab/fileeditor@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/fileeditor@npm:4.1.0" +"@jupyterlab/fileeditor@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/fileeditor@npm:4.1.5" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 regexp-match-indices: ^1.0.2 - checksum: 982f37e01cd909e6481f9c0982a23bce26dae71ffe3730b354f93e7a6357a2a6f1dd9c2d82c09649cc14b66ca5ad131fd3bc3667cbb2924fa7535a5c9b4372fb + checksum: 88fe63f91ed7266afa0447f4d919b57cd8bae944d8661bc570562b570a8196cc23c5f92777058515cfeb0c12c5fb98b6906b5d8c91190dd8c961b921f268d1af languageName: node linkType: hard -"@jupyterlab/help-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/help-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/help-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/help-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 4d0504331d5512d46bbca5389048c566be64798dce1dcd5e8cb12ea851dd40087f62c8c24791af8f946f15fcf7f57202e10e7929b24499dff11ce9a6576cfe1f + checksum: f6b5d13d0181a5cd49110a7ba11779f78933da52c2ebfd11839e2a080549be460121ac8a11d441c5a18aeccab4f6885554ad28caa91ea43d8bc91e93652de698 languageName: node linkType: hard -"@jupyterlab/htmlviewer-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/htmlviewer-extension@npm:4.1.0" +"@jupyterlab/htmlviewer-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/htmlviewer-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/htmlviewer": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 - checksum: 6dd1f51b7f14565b3937b95310e513f234658d8826a16f7f6e65a8fd4a42c30783f1b528e5577842f892285541ad5a343f2802bbc3fa77a5a017a5368050a6cb + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/htmlviewer": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 + checksum: e46ed0fc0df1f27eceab067e34f3b45fdb5703f2f98b03b0da352ccd95c8256859fd07b12fd1bf94ee9fa3fc3f20a8dfc9f1bd08de59238d2945d0b61d61495f languageName: node linkType: hard -"@jupyterlab/htmlviewer@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/htmlviewer@npm:4.1.0" +"@jupyterlab/htmlviewer@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/htmlviewer@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 77062d33bd8bf01ae6ef74ca87b438c476e4fc9d2aa6cfaa77fefb11e412eb85a4b6a09a62c4f609368f8b748b8ddf28936a8d742f85b0a3870e84e580e129f6 + checksum: e1bb9fa7d385dca7781d42d665d30f6983fdaf29155f0d7c9f6f7f1f4c47973d8bf3d28a9b711c9abd988b2cc2de5f07f8841e736fb7c5a33cf9855ea03da990 languageName: node linkType: hard -"@jupyterlab/hub-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/hub-extension@npm:4.1.0" +"@jupyterlab/hub-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/hub-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: a193cf7d913884be60e807b30886353e4261a296712b1699f8a982a80519bb92f1288efffcf2fc7461125035757c5f3036279102b72b3e7f0b4961c4cea5d769 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 90a8287e76b7e5f84f73e6a0590c73a287f5f33db7a568e0a01234ef2056d36250ff1ffbfa99d606d46b714fba522409431efbb545a051a4464565540149a130 languageName: node linkType: hard -"@jupyterlab/imageviewer-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/imageviewer-extension@npm:4.1.0" +"@jupyterlab/imageviewer-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/imageviewer-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/imageviewer": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: e6a0e163031b1afff3a4bde36fee6eb8daa2de1d02d6e318b07255b090da92a337bedc6efeafa5f7dbdd2be75a429af908063cefba5269cf6ef9d7ee6c7af732 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/imageviewer": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 57b41a940e7728ea3bbbcd4a243b71fd9108711764e566f6de894ae23816b92046106cd27f46fa42b529565dcdda23e91629e602d5864061f191b4503530c9b9 languageName: node linkType: hard -"@jupyterlab/imageviewer@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/imageviewer@npm:4.1.0" +"@jupyterlab/imageviewer@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/imageviewer@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 - checksum: 8f07c45f488ece2e76c377b16f1b39d82a7fecba5a1a56d3af28dcb6d41e3f3a3ce8e9950e590682a296fb8c0a50da1e874a53c441f6db6bd397a0c00fba1f2c + checksum: 963e9f58f55d63dba9cab7ebe06fd80d0a3f403b0366b91d7161a3d834bd044b32cca3a539923f3dd29003b2bf4b5cb5f581ba40b8fc459ea3e5e45f32e6fe39 languageName: node linkType: hard -"@jupyterlab/inspector-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/inspector-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/inspector": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/inspector-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/inspector-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/inspector": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/widgets": ^2.3.1 - checksum: a134f9decf71c9fe3d8d01a464183df31fc7ca9508156bb4f410073a8a3c9f5c855cbf26640db6584897555b295e9c449880a3e04a79cd6cb4aac4cee3b75418 + checksum: be7f5a2c1452f8722fdecb0b7856925a38286a3a2abe5b06dac167eb405df128e4e8e99c73469d2fbe3e683b236e2c64aaa6797035658ba40e5e6d1a72395461 languageName: node linkType: hard -"@jupyterlab/inspector@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/inspector@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/inspector@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/inspector@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: c3ff6bf4f1b5c702098667ff27424a578a4699507d50954ea54f5feb4123b458d98b1284902bf010c716dbab389b3c9f88633d919a6fe1cf0aa95063d2c22923 + checksum: ab98848ad92a8a38c88a15df79b2d15772aa3bec2d46022ffffb8d80abe57f0ce865f13177ccfb2736921208cb539cd4aef353bb8ee8eade5e59825fcd13ee0f languageName: node linkType: hard -"@jupyterlab/javascript-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/javascript-extension@npm:4.1.0" +"@jupyterlab/javascript-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/javascript-extension@npm:4.1.5" dependencies: - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - checksum: 054f22edecfbf5c01a1f80d6c84a6035a2bd64a1b747ee401923d03cbd14512e0c068d6bd2003182b9965b367c7750ab771e3499c97d65644fd7119af7c46d26 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + checksum: 111ade14cda8d41e636b95c06266c0b9b6b5048256395f2eeafffaadd71ffab9aaf3077f09220e31fb343aa73c109c7ca46244bd54325089a58f099f4c0bf77a languageName: node linkType: hard -"@jupyterlab/json-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/json-extension@npm:4.1.0" +"@jupyterlab/json-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/json-extension@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lezer/highlight": ^1.1.4 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -1493,34 +1493,34 @@ __metadata: react-highlight-words: ^0.20.0 react-json-tree: ^0.18.0 style-mod: ^4.0.0 - checksum: fcf75d8dfc874d83b6b483eb7eb068eb671c32219629e8642a76cf1420ea94e29629a1a4aa78e55d38a493cd15d2d0a1075af53b8ad0cd692ed9f1a57f945a4a + checksum: 0af66d40dc2c81add879a01472e73a34fa9c7cc2d2528c7cbab6f7f8076779cb8fcc378b555e5592236c60740279ef9dc0882cf56365ba6b66f702ac895936c4 languageName: node linkType: hard -"@jupyterlab/launcher-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/launcher-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/launcher-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/launcher-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 0c49da85771ddee8b8c8a29e5d42bf2dad8ccc28f8a982b878f9cd2581500fcc1faab1fe1a640c8ff9bbc49453fc309fced173b3e6f6c83db08dc543bc444799 + checksum: e774e8a0c8493777990536b072b72ff00d9f5e0e01fa9c1d020465d0acb409f79a7120745a03457083c7bca36513085e055dc9fb15f53b70630078dfedb6f5b6 languageName: node linkType: hard -"@jupyterlab/launcher@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/launcher@npm:4.1.0" +"@jupyterlab/launcher@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/launcher@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -1528,81 +1528,81 @@ __metadata: "@lumino/properties": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 1ce05be5d53e80e445e1f9e328298b4cc3409ac155090b69aaf733ff6607c0bcd2135b59ebaa6298e356277ff6a201ff37d3432b1e9f025bca1c2809d009e012 + checksum: 78ffd573f18f21e954969e29e4d2002631b7ccee4f44dc32373e8fe64fdc0ba523aec6f535e636e0395953cc1013a22b1cc520ad75cfc3029c842335030785b1 languageName: node linkType: hard -"@jupyterlab/logconsole-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/logconsole-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/logconsole-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/logconsole-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: ce8f7add1ba0a52bca856bab6fd2876435560f613d97e3ce5c488c0e7ebb7c1a071f2a248a10be6a7d22f2c5ab0546eacf093d8dcce0ca594293c3651ad6bf9c + checksum: 91e98fdddcc3fe5babeb1168cfe018ecbe163542877dd9bb727b6650b10190b98bed923070f2f1de98996ad77b18d8fd465f9d12f1ca952b775dea3b0a880cc3 languageName: node linkType: hard -"@jupyterlab/logconsole@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/logconsole@npm:4.1.0" - dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/logconsole@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/logconsole@npm:4.1.5" + dependencies: + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.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.1 - checksum: 368f2fa0f4b00a6b98ab0298bfbf8f50c3c00b3aaad7ed21538ca71b3b8d896a818d72413064300f0de74f43751023298030ce4b22143ee5dff5ada97eb7b821 + checksum: 9a6ce7edc30d3511d59fc81476539c4508bb117d2a6d9bc276abc48983daa9819584bcc7c8bd61bd5c09b80aa010b70d61f17d128ff480b413cb2206b87e089f languageName: node linkType: hard -"@jupyterlab/lsp-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/lsp-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/lsp-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/lsp-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 "@rjsf/utils": ^5.13.4 react: ^18.2.0 - checksum: 862dd41b92e55116666310296cdbea66e7c410cee6d14229ba8a3eb73fea7256c6fb9d69de94f30bf66f0f928497c302de733b659217b0936c372e48babccc03 + checksum: c51ad772fdff756a53122ddd07e7207753e42342113d94631d3bf74a432b15b681445eda9f881e8b16124ef0d3a23ac2b31c6e7acf0bcde2a306f710b1457bf8 languageName: node linkType: hard -"@jupyterlab/lsp@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/lsp@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/lsp@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/lsp@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 @@ -1611,160 +1611,160 @@ __metadata: vscode-jsonrpc: ^6.0.0 vscode-languageserver-protocol: ^3.17.0 vscode-ws-jsonrpc: ~1.0.2 - checksum: 487e4d2609ed4212be79c00f45f445ebb252d3a37a537adc421d1cc7824a45c782578cbf5876b75e1a184a2d4a0cc9ec232494e4440b082062a63278ede502d3 + checksum: 2f8a63214684c5dde76eed7c7b22dbf3a4b33babdf081d3f321b00caae83045b97d4df216a903ecc0ed22950e8c213b11885f7efc94d1ce0ac30a5ca5b9362f6 languageName: node linkType: hard -"@jupyterlab/mainmenu-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/mainmenu-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/mainmenu-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/mainmenu-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: e4e0997461b0f327af035933fc08126f7cb7a172f444875afddd6329511a94e7df61f28da3541e1cf62be3a4b3fb7d700db3004166acd223e09ab3bab99f3735 + checksum: 6a7e5a2246806cbfb81bfd2acd8095d816381fc08afa7d08684e9e09cce220f7977f673df0fc09604dd64c6413cf8fe1cebc1696614ff635a90736d80ffc014d languageName: node linkType: hard -"@jupyterlab/mainmenu@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/mainmenu@npm:4.1.0" +"@jupyterlab/mainmenu@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/mainmenu@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: d8d0d62723d24f2a9a5741693040890d8deba51dffc9e960f517829ad32165c1b406682509c7d521c960ddc37099b6422c29fa8f0f008dab399e59792de6319e + checksum: 7e0e3fe6635dee022cdc5326306ed0abe4b1a04b4f110c2393c825479e5959b9e33a6fc030e61324d09f7dadfc39dd041a58ad299dc522ce55988e6aa06fdc0b languageName: node linkType: hard -"@jupyterlab/markdownviewer-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/markdownviewer-extension@npm:4.1.0" +"@jupyterlab/markdownviewer-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/markdownviewer-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/markdownviewer": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 90161c79b5ed8fa955c7e397aa62f7106121f3dfae2d352bbb4758d144850e2af1101d579412313cbd09ada417badb44981d600449e998aa951249618f5e6381 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/markdownviewer": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: f125de07cf1f6d62cea6cd0fb518eed285483524af8751c3ff622a86d06997ab1535ab24195f9cfe3acb6052811f74c08e0d62f28caaad22f350f7179261ae4b languageName: node linkType: hard -"@jupyterlab/markdownviewer@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/markdownviewer@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/markdownviewer@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/markdownviewer@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 93131c4d999beacd95db940fd1df2b9f098675489274f4bd961406478c4e52114bb400365b8e6534a99126bf8ba91b85e0945a072c8554970fca46c192710a07 + checksum: 45f4397265fd44144a948588f6770498ba07a7b93a81697fc6f0423d4e9730149eff8213f9371954439d7ee5ba526f43c216696a752d213647c2068b10931686 languageName: node linkType: hard -"@jupyterlab/markedparser-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/markedparser-extension@npm:4.1.0" +"@jupyterlab/markedparser-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/markedparser-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/mermaid": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/mermaid": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 "@lumino/coreutils": ^2.1.2 marked: ^9.1.2 marked-gfm-heading-id: ^3.1.0 marked-mangle: ^1.1.4 - checksum: eeff64b59ec04f7eee427ba06ce3d73605be673125a4c0b02bc868fc5852f3923bf151ae7f0ce1497da1e73692af7fa074e0eb11f30585f20dd6462dfd9577c0 + checksum: d8b651e3e3eb339d4a9f44bb49323dc3c55e27a7afe8c397c149c2b0adca3f36a3d46306e37341f376587af25c60d7e910afb4114e4112056ba677c145dd99b7 languageName: node linkType: hard -"@jupyterlab/mathjax-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/mathjax-extension@npm:4.1.0" +"@jupyterlab/mathjax-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/mathjax-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 "@lumino/coreutils": ^2.1.2 mathjax-full: ^3.2.2 - checksum: 11bcc01fdc0f498342c1163168bec135313050625e376b5f5f2894a9fa304b22fb32d40172da998df3bb49ae539ff373449576d67d47f4ca6ecc278da8cf793f + checksum: 91714e7913c32fd054db9ae0040023eba2addccc1261e109feb4bf58f51f5bd08b447f7cfce3e7cbaf4a1ee3adb300fe4ddcd9bc45d008483dd1483cdb5638b7 languageName: node linkType: hard -"@jupyterlab/mermaid-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/mermaid-extension@npm:4.1.0" +"@jupyterlab/mermaid-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/mermaid-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/mermaid": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/translation": ^4.1.0 - checksum: a0ffd97e64164a435c32ac811939979aae63a903e5985c9eb959319cb72eb1463c3edfe8ce71b0337c7945064f615bb2928a80fcbe3b1a26b283212360d2c64a + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/mermaid": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 60a98c69c382af0ed10cca4aa50f3e744635ba483256360213d648eb2bf2b7eb291c4f2a926b8e8663d5e0b65c95a48fe9b791bfc7cc612982caa508bf7f0342 languageName: node linkType: hard -"@jupyterlab/mermaid@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/mermaid@npm:4.1.0" +"@jupyterlab/mermaid@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/mermaid@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 mermaid: ^10.7.0 - checksum: cf7dd70a1a899d4abdb47084af9fe78e48b1855db209f5584e2534de7b4d798e26fb21a6e600670227eca17b77cf5423d5d83550bbc84b02b07d5e4054b601db + checksum: 32d3d8ec5658a8549cd22b9a78948116d45dc36f741a2a66c3b0f26d87cbe8d7c796a71df4363c4760e9d8b76bd15a76a09893330d2eda89bf117e86988ddfbe languageName: node linkType: hard -"@jupyterlab/metadataform-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/metadataform-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/metadataform": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/metadataform-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/metadataform-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/metadataform": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 - checksum: 17a07b2c380a02bb10344ff2491e4d9fd953b5e61a75c3062fc555d9df6ecbe6f21f6102d781a720fc315ac3ff21eb007c7de3ea465ae78f1455c13dfba8907e + checksum: 0b7a2b39b0a332e4f103c9a93244221c6fab39fc90da7ba961233baaaf58da683ac3f51a5665120f7c1c9fc23eed9def9059f6afe5a4d987069953da09e5eb0b languageName: node linkType: hard -"@jupyterlab/metadataform@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/metadataform@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/metadataform@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/metadataform@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 @@ -1772,53 +1772,53 @@ __metadata: "@rjsf/validator-ajv8": ^5.13.4 json-schema: ^0.4.0 react: ^18.2.0 - checksum: f39a731851cbc11d899aad9a8ba3169e00188341f8885b145689c9c7ad88d3375cf0ff6c82ab613f08ce76a31c1b1286b0b99692b69dd54e6a355e76f8282a1f + checksum: dcb7feffc47a8a72cf7533c4327036fc09ee09cc635a47d45060fe954942424265971ec0223c9991b6466b526f5ba20e2da2ec355facd2c008676fa7a50f3639 languageName: node linkType: hard -"@jupyterlab/nbformat@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/nbformat@npm:4.1.0" +"@jupyterlab/nbformat@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/nbformat@npm:4.1.5" dependencies: "@lumino/coreutils": ^2.1.2 - checksum: 0f10f53d312e1ad386be0cd1db3ea8d76ac5e169a1c470465179b35c7d7bd0e55b9d450b64abe38f447dcbec71224bfe8d4115a1cdb433f986d3a91234ffd391 + checksum: d417d7eade40d389fea8593358b6455158cf3e67fa40c0c4c05c865852520acc466102109723c9cb16eecf95952617d79f7fe6be9da6ca3f601749bdecdfda97 languageName: node linkType: hard -"@jupyterlab/notebook-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/notebook-extension@npm:4.1.0" +"@jupyterlab/notebook-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/notebook-extension@npm:4.1.5" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docmanager-extension": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/metadataform": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/property-inspector": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docmanager-extension": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/metadataform": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/property-inspector": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -1828,32 +1828,32 @@ __metadata: "@lumino/widgets": ^2.3.1 "@rjsf/utils": ^5.13.4 react: ^18.2.0 - checksum: 6addb9f7b596cc094b4b97387c3b439786e0ec3993899e2416eaf63cfd71777a20c5861d5246d4fe8956c6ce065f1595a02e14fa97e86e2985c04f03811a10e8 + checksum: a129f0cf3784624768e75ed4f509b496a56bee8aebfb373a830ec37de4e010add8732330d14f35657b367230a6d6701915d5d9cc5bd474808a5c13f386530c26 languageName: node linkType: hard -"@jupyterlab/notebook@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/notebook@npm:4.1.0" +"@jupyterlab/notebook@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/notebook@npm:4.1.5" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -1865,34 +1865,34 @@ __metadata: "@lumino/virtualdom": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 0083ef437c3db33d5fdbb72e176f4aa74e3f07a9bdd7868dc72deef65ee50de75156c92c9e9be4464d498225867488e7b177668579a3996869819d1e1e14bf53 + checksum: 63ae9f1ec558b48cd81f4155d52a5c0ae9cf4bc76fe21273762e45077a7e5768b071b20aeee616cfdfee767f26667b2b896304c90ced3db96605e6e655a00903 languageName: node linkType: hard -"@jupyterlab/observables@npm:~5.1.0": - version: 5.1.0 - resolution: "@jupyterlab/observables@npm:5.1.0" +"@jupyterlab/observables@npm:~5.1.5": + version: 5.1.5 + resolution: "@jupyterlab/observables@npm:5.1.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: 38ee528b244b06a2813874e11d2c3aa8b576f98ffdf9f77fc6c9ddf49de296b4067b4ad7f41f5eaab1de50d16fc79a31d26a34963e09c259e4332cf15c0c7bd5 + checksum: 6d45de8a137c79566818ff56460366419b2603a06ab5d9cef4f0b311df3fd69c755b357ab3bd9c26ed56dec5a2247ef0cfc15cfa6e2e180aa46af7f96c6ab10c languageName: node linkType: hard -"@jupyterlab/outputarea@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/outputarea@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/outputarea@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/outputarea@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -1900,201 +1900,201 @@ __metadata: "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 069d5d5fa1e75f5a09421e22fbaa15729f8bbc93c3915f9c0a8bee404a663b8def6c0c0d82a85d84cc6c4e3bdda87eb3d7820eb74e1cf1b99b834ee49ccf572f + checksum: 3cd51dd9ba4d613c42ec2917065c8b6f39b418e3a892b7662741f31aceaca816e55af80af97513e783a6b1e4d152497e03062b18ee80dc1bace0b4d2a7f4b439 languageName: node linkType: hard -"@jupyterlab/pdf-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/pdf-extension@npm:4.1.0" +"@jupyterlab/pdf-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/pdf-extension@npm:4.1.5" dependencies: - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 821e1fd08297e92cfbbc1fd911c40443894862f92a0b6dbfd5f8cbf124bae7a1985a6aa60dfdacf9eef686fbe1b5bf4a0fd03cfb25ea9423b7e6fc548f563815 + checksum: a8a567c1dc4d49d6561df272626a44cc8d40c2d859f1860b8d9200831bd0724bb529b93ec3ab614bf677d1ec3ed9abec553cc68a48d256ad835cf0dac98a7b3b languageName: node linkType: hard -"@jupyterlab/pluginmanager-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/pluginmanager-extension@npm:4.1.0" +"@jupyterlab/pluginmanager-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/pluginmanager-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/pluginmanager": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/pluginmanager": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 - checksum: 716d426688e972247ba9564e867b97d5fedcbb940e54794ea7e0dacb0648e8005cd9bddab74fb92cfc5c83648cfff43fca2ae8ce59b58d6a3dd8b47d90abcbb8 + checksum: 34a3799ddc2b1bc0ac29c8084565b37ccac83285500b9df70af7e38b01cdf0f065b38d49037d23c6852cbd74995159131329c9a892997ee82887441603fba289 languageName: node linkType: hard -"@jupyterlab/pluginmanager@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/pluginmanager@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/pluginmanager@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/pluginmanager@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: fa0b5169ed9903ed1912f15645f6b5dd03de14da0040e7a98e7b36fe4a283b463446682dc342829ca2b20557ef2b084cf7570ef89c86350209c8f78d6fd1b322 + checksum: 5b8dc56f2970c57059b2a4429decd61e7062654084008f85abe7ef8eb2580ad1d6776ceb4f4e1709b365812605edd30be61d5d20adcdaba99227ab9819fe7feb languageName: node linkType: hard -"@jupyterlab/property-inspector@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/property-inspector@npm:4.1.0" +"@jupyterlab/property-inspector@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/property-inspector@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 1c570f296341c7b6167fb981ea68adfe9ca1250aacf4e78c170541b5f8421d641fcf50657234b683a21c4047d4bb48a522bac55dc723256d34768445da88cf71 + checksum: b24cfcb8f5aeb598d02b02aefa2b2dab2621fb5c2cf38f3ef6ea24bebdf26a765b87e89869d357eda5a423eb806f1b28f036f33ac3365dae25e3dd655e820b5b languageName: node linkType: hard -"@jupyterlab/rendermime-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/rendermime-extension@npm:4.1.0" +"@jupyterlab/rendermime-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/rendermime-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 31152fa26023f9d99267c6da9bfc66b35f005e057d5c0449a324ee867bf7deab0d834d3ec5ab678e4d3298420434d88a0c547da144d8c012148e61f8890ce1e5 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: d3bec65c77ec5205ade4063a040be632175848d484619b6dc90964e31b9375cdc0cc10e1cdd18d61f98c5680f624fd80680c3c5b85303ff33f984f11b20bffde languageName: node linkType: hard -"@jupyterlab/rendermime-interfaces@npm:~3.9.0": - version: 3.9.0 - resolution: "@jupyterlab/rendermime-interfaces@npm:3.9.0" +"@jupyterlab/rendermime-interfaces@npm:~3.9.5": + version: 3.9.5 + resolution: "@jupyterlab/rendermime-interfaces@npm:3.9.5" dependencies: "@lumino/coreutils": ^1.11.0 || ^2.1.2 "@lumino/widgets": ^1.37.2 || ^2.3.1 - checksum: 462f5d034cd636caf9322245a50045ddaac55e05e056e7c6579e2db55088e724c8054a51a959aa284c44b108a9e0f0053707b50d6d8a9caed5825eeaf715b245 + checksum: 790c8d4d58213c02470599b2c69e8ccff8d3496750fc88403aafe4e7bc26bb262d40c9ed3fdd27fdfd77268b94e7ea4e178f73897dd42d9ab18cbe5a359d925c languageName: node linkType: hard -"@jupyterlab/rendermime@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/rendermime@npm:4.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/rendermime@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/rendermime@npm:4.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 lodash.escape: ^4.0.1 - checksum: 52323a1d907b29f5b60c237b6e1c3085c667f9fd59e76c6dcab29076a50eb4bd39efe5f6e3e49e3dbabb6dc1f5f7820f09af74f211a76e7e7db6c7c0be8d5715 + checksum: b96a56aa5e32cfcb99ac757ccb41cad29f2be9ded204c6f7bdc5b1bf55cdb4e2129aef596c0ee21ac96384e809c3aea59cd2885c7e2c8d39d45bdf373041259b languageName: node linkType: hard -"@jupyterlab/running-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/running-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/running-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/running-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: 443b385bfed5a490dc25727b0cb61230aa506735b704d7fbdc7a3d97890561d58f7e772d716332088be133a940653603c3e2449958d5201f9c96ef737574a804 + checksum: 781997edc1a8f4db25412cf989e52eb4f22e4e7ffb74f3245f1dad696303572b8546180957f3c17acb4fa62c4d38f4d16acae40bc129af22efeafccd91c2cce8 languageName: node linkType: hard -"@jupyterlab/running@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/running@npm:4.1.0" +"@jupyterlab/running@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/running@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.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.1 react: ^18.2.0 - checksum: 6cfe67d8f6fe8ba2aba4413ecf97ae182c10ab52c77eb5ddc9366bac68af4b0dd2aa276a2b63c7bb63d5706d2cc265c85df3580c78de63f4e30dc75330528efc + checksum: 650102b49e54ad725c99e49382921b05418f922ee7ae99f0404a146516e54387ec0ebb26c6e9255beadc94a1fd3111c2fae12148e196879ef7ec3ea4b1fde6f1 languageName: node linkType: hard -"@jupyterlab/services@npm:~7.1.0": - version: 7.1.0 - resolution: "@jupyterlab/services@npm:7.1.0" +"@jupyterlab/services@npm:~7.1.5": + version: 7.1.5 + resolution: "@jupyterlab/services@npm:7.1.5" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.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: 4a4797746c708551a7647c43ecc4dce20dc12ea043bb2bd43ec0c20966825a5e14742258d3bcee9ae832c91030132db895dc9a81bf1596d59c08066c4fecfba5 + checksum: f4b20ee62e5c3c7e0fa5942d3deb95329beb5a9ea6295403eefc0d5a723665379a09c58b21bc6a9fed7a69990570e5cfb66bc314e037a452b678fc4ec237dc55 languageName: node linkType: hard -"@jupyterlab/settingeditor-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/settingeditor-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/pluginmanager": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingeditor": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/settingeditor-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/settingeditor-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/pluginmanager": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingeditor": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/disposable": ^2.1.2 - checksum: 574f4ce594c17fffa06236895e324fcd36247a961eb4f3d077d949c1829b5cf4f6e02362155da0a1d5d2cbcf29797bfdeb7910490aceef4a915a253ff1de1460 + checksum: df1911e98001f3ff5fdde35a2aa101e0c9a21e7d3ee7e69ca8c852d54fb80f5951e0eb01e6a0aa7fe1b1e12da06ea90c445aa970d413ed9973eee5cff17665b0 languageName: node linkType: hard -"@jupyterlab/settingeditor@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/settingeditor@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/inspector": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/settingeditor@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/settingeditor@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/inspector": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2108,16 +2108,16 @@ __metadata: "@rjsf/validator-ajv8": ^5.13.4 json-schema: ^0.4.0 react: ^18.2.0 - checksum: fbbb5f8a6c7324c5c22494172c24a3b78a7c0e71ea2d8372af5c53ba72eba9a3147c4566dd0c0ffa607884c6cf3c4f6ab76a100e3b76a68935fc110cb67b67d8 + checksum: fff554b0a736a724ca8c5df9a8cce44ff540a58402aef348187d7740f0308e0e9ac724f950c18e27925d895e593190bc3e4e0bdfa472561278755609b37fb4c1 languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/settingregistry@npm:4.1.0" +"@jupyterlab/settingregistry@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/settingregistry@npm:4.1.5" dependencies: - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2127,18 +2127,18 @@ __metadata: json5: ^2.2.3 peerDependencies: react: ">=16" - checksum: 1a0c52016806ceda150168cdeae966b15afce454fe24acfd68939f3f380eaf2d4390c40e27c1475877c8e8da6b3f15a952999ebcc9d3838d5306bd24ad5b4b51 + checksum: 576d49cbbb4a18ba5f55230938b67c6dbc6819dfafb75ece2d9d030913e69768ddcb2616de4f7dbd3bcd8aa35e292aee90fe98b91e7dccdaae2610c64ec07f94 languageName: node linkType: hard -"@jupyterlab/shortcuts-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/shortcuts-extension@npm:4.1.0" +"@jupyterlab/shortcuts-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/shortcuts-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2147,41 +2147,41 @@ __metadata: "@lumino/keyboard": ^2.0.1 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: a03343ee8a8f4f0e334beed10bde4a833891cfced123701de54d63dec661d91ad9c20efb8bf81d2060d1e57c89ab9435e977104e458730e3fb0257a1f4ed69b6 + checksum: 07e26178994bb5c147f945d9ecafd5298b5b92b7ef8eb9f13a049375189aee273d133d938375f129838552940f966e840a8e3129ae00c93455cb6b5d76f6c378 languageName: node linkType: hard -"@jupyterlab/statedb@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/statedb@npm:4.1.0" +"@jupyterlab/statedb@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/statedb@npm:4.1.5" dependencies: "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 - checksum: 693d40ba6ce67b41aae2acbae027a5c637c2bfa51d7085b6faecdb1877a5e3bd43ca70f3670f88f038c49bef80e0e09899b05d330dd9010b1d578ca73b13ea17 + checksum: e7f3ea9a5ebb04a602d93d1ddc9175a5b24a0f3814e99410ec3dba2dd3a86572ea61917d8a65e1b4b8c4ed25c8eaa814646a817a3b5d39b8a74a7b6cbb0071c1 languageName: node linkType: hard -"@jupyterlab/statusbar-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/statusbar-extension@npm:4.1.0" +"@jupyterlab/statusbar-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/statusbar-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 624f0b2b2ff89041b9534aaf8e39d8d6216341861329280da8fbff3b764430e3a191e7c7c0ac77540f18a77ec2198d210374b47b9ea99700d6baa59e8f448ef2 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 2a9046edd3e98797ab1b38ea89da24bcf2c8840226277d9e2bd252db74f7fec85e05f30a5082c4290ebef59b79bfad5b4e1c989b3e721a65ed6d16aeb5a55e31 languageName: node linkType: hard -"@jupyterlab/statusbar@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/statusbar@npm:4.1.0" +"@jupyterlab/statusbar@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/statusbar@npm:4.1.5" dependencies: - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2189,36 +2189,36 @@ __metadata: "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 react: ^18.2.0 - checksum: 309d3cb98c924c23dfef2ad91862dfa56ea133d8ae08aa7bc743c4000f15584841b39712bc8829eb09d7382d5c9e0e7b3e85c3ae1165c01597ade96702bcc055 + checksum: 402f3b80495c155f6c08447ca6ef348dbaae030cc6c20d11a7f4f365445f389dd71fefe9649296d59e8c698aa31347fb563b9a962e51b8712ed3bbe2cfd0ca37 languageName: node linkType: hard -"@jupyterlab/terminal-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/terminal-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/terminal": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/terminal-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/terminal-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/terminal": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/widgets": ^2.3.1 - checksum: 6b8571407482d51e76c7ba28fd8f1b0c11b40827599b7321a49583c2c1ad853e64c221a59ada7447067be7298a30467abea6fd9425cb6cb18d8bf439f41f09fd + checksum: dc92ea109d4cd89e84a6dda5259623e8f7c0f315789bb3876d5a63089e889e5b33a9174b81f205533a7261b82b1ea021da9e2f047372889b6693e0e433a7cb8a languageName: node linkType: hard -"@jupyterlab/terminal@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/terminal@npm:4.1.0" +"@jupyterlab/terminal@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/terminal@npm:4.1.5" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/domutils": ^2.0.1 "@lumino/messaging": ^2.0.1 @@ -2228,149 +2228,149 @@ __metadata: xterm-addon-fit: ~0.7.0 xterm-addon-web-links: ~0.8.0 xterm-addon-webgl: ~0.14.0 - checksum: db7000d4c3e3bf0937639a74dd1313b5c0ca25cf305e6483cfe5abb38abd78182c285352f4260a970f99728de188cd9f6a7d540a27627ccec998a0d2f6d9d2ae + checksum: d30bb6e6892d884a9df0de726a2f6c91bc5acec7eaa31e7185ebc65656ee587c019d964ca656e74c7f72c49d5a3ff6a469056c54bd0f8d6fabfafa61024a0ed1 languageName: node linkType: hard -"@jupyterlab/theme-dark-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/theme-dark-extension@npm:4.1.0" +"@jupyterlab/theme-dark-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/theme-dark-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - checksum: ef46029eb12457a32aa908597029169c1369639d248cbaf301b747b9888a343f221267e45d406da0a9c6c71f61d739ab280a6659fb6d1f4d1c6c3c18f97606cd + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 4e56da100c8679f809cf5f9aa5e85f1c4e4a41d89998bd49c1738e7cb25bdad45e7d807aad63855f25c5b66d5967081f03f3dd450f6e870c109d01aceea923e9 languageName: node linkType: hard -"@jupyterlab/theme-light-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/theme-light-extension@npm:4.1.0" +"@jupyterlab/theme-light-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/theme-light-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 409cb3f227eb8818556a3a41b68427a93241172d5d37257c7be049ba1f8a24ae17da79fbf17dc33e9d73b4a0cd0c42da050a32705b003df6eb048429c39ddad1 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + checksum: a70fc06adbe75ad6d34a74c7fa3b17e99619cd2af23d6955fc7644e08b9df2031f91c6532e5d5842c2c32fad1e0a69fa46933fb6eeb8a7d7e53d110ecbd0b573 languageName: node linkType: hard -"@jupyterlab/toc-extension@npm:~6.1.0": - version: 6.1.0 - resolution: "@jupyterlab/toc-extension@npm:6.1.0" +"@jupyterlab/toc-extension@npm:~6.1.5": + version: 6.1.5 + resolution: "@jupyterlab/toc-extension@npm:6.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 - checksum: 0395e56dea0faf3a05555f634d822dc43ce08d3605ed83ecb9255127badb44161d193e3ed068aa63ba45ad3176305956ae88e7e039b52ed5e83c72d9938481ca + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 + checksum: f4b16a6f0330b82bf7fe64098172402bfe84cd95f0be1bcac1fd808bc7a5d80a288fb7ca1c9e65d1ce60c5b245c0a943fe8230d198538daefa18456c6ee7fcfe languageName: node linkType: hard -"@jupyterlab/toc@npm:~6.1.0": - version: 6.1.0 - resolution: "@jupyterlab/toc@npm:6.1.0" - dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 +"@jupyterlab/toc@npm:~6.1.5": + version: 6.1.5 + resolution: "@jupyterlab/toc@npm:6.1.5" + dependencies: + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.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.1 react: ^18.2.0 - checksum: 051f960311e0f9dfba2668411c32480376d04cd05a023e69d25818ca6b7ca9fdc16f5c3ffc966a519cb2653a26e03cb14f2c267a2e40cffd4d06c31c7db138d8 + checksum: 8be983a63ecd0ee33da196e3b9f254704230b4bd3ee5a59064e1bc32599a4c798274d68b0155360b95f5cb2893a2558156039c49cef542ea9aef2354ee82aeab languageName: node linkType: hard -"@jupyterlab/tooltip-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/tooltip-extension@npm:4.1.0" - dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/tooltip": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 +"@jupyterlab/tooltip-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/tooltip-extension@npm:4.1.5" + dependencies: + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/tooltip": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 - checksum: d468d0b5643cbc628798ac68f807fcf3d73806928164bdca068081e42e5f8d1a6f78055b40548db3c81731e2fdd3468be1b479a705dbeb3e46f69bc7badfa11c + checksum: da9a1a085600f27e631db6becfc079bd58b9576596e0268486645d442e14e2fa3b7aa9fe622e4da904f66a743b6d28f52735f046888aa0cfd81ebe07a58b0e39 languageName: node linkType: hard -"@jupyterlab/tooltip@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/tooltip@npm:4.1.0" +"@jupyterlab/tooltip@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/tooltip@npm:4.1.5" dependencies: - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 - checksum: 975cde8c014494b0acb1c5f5c161eb9f5ecad4a287b5da53b5eb4474e514e64ada156b607f7cb7eea73e038c24f05f0ccc0f22a8c2865d6216ce56981eb17d97 + checksum: 03eae761133fc79aca9e28261e5ab98f12b248536d1ee7f03b8d4e002c6645af8decd038b92787af5a9e6008a2e9ce4dd0be0c76ceca9c5594fcc0931086038d languageName: node linkType: hard -"@jupyterlab/translation-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/translation-extension@npm:4.1.0" +"@jupyterlab/translation-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/translation-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - checksum: 21315d0e44b570b02da6596ba7453e7ec10373b9a7b957c120180557eaa516d272457be6f841e411326fa2d1c2f123a159436bdf8bae81b5f208843cf2cd75fb + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + checksum: 6cf2b911e5bd43fbc7b80b624b579edb19778283f13a0c63172e54cb226c48063e0f3143675cc59089086ef7819693e9d2634f49399e7740212eedd764dd7cbf languageName: node linkType: hard -"@jupyterlab/translation@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/translation@npm:4.1.0" +"@jupyterlab/translation@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/translation@npm:4.1.5" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 "@lumino/coreutils": ^2.1.2 - checksum: 88b7422697c1795dfcb85870cb8642cd10be6ae27a61dd1ca9f1304f06460f859202bfb6733cb744e2b4c448e8bfbf7a4793c6626cb4a18a59c80999cf1c5050 + checksum: f12e2f13048cd1628a9a03003401009972a3439a038314e2c7cdf19ab4c29fa02a0091475bdd1ddb7cb26e2175c401a86ab8664f54b99bb47962cbd595e6f643 languageName: node linkType: hard -"@jupyterlab/ui-components-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/ui-components-extension@npm:4.1.0" +"@jupyterlab/ui-components-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/ui-components-extension@npm:4.1.5" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 - checksum: f9419388d0dc4db0563b111bda63570cc46503a4364625656dc3fa9bfd8a78237eecf35974b5cebe232965283c6eb440a95b4e0db046bfbe1451ec6a0e243f74 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 + checksum: 9250e0751857cf02cce82ee7433b94fe31fac600c40cda5ec1876445289d83620de3ac28732ad1d36971e8f2a2a7e531ed2ca1a0033ec72d59e1ba65bc775fe6 languageName: node linkType: hard -"@jupyterlab/ui-components@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/ui-components@npm:4.1.0" +"@jupyterlab/ui-components@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/ui-components@npm:4.1.5" dependencies: "@jupyter/react-components": ^0.15.2 "@jupyter/web-components": ^0.15.2 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2388,21 +2388,21 @@ __metadata: typestyle: ^2.0.4 peerDependencies: react: ^18.2.0 - checksum: 53f8eb432d7ff8890ec748c3b43fbcb67fe6cd218b771c4c334e1ddd80a13b570071f171eca4c15feebc4715427e422f833d7b8e2084bcd2605979a444e1536d + checksum: a50315549c03718b5e953bdb695757b1d39db293131dd5c2c26587612e0ed30ad208d1d65c86ddc153a241df2e01d3a9a162f0e4b5f86d2a20816260c9aefe67 languageName: node linkType: hard -"@jupyterlab/vega5-extension@npm:~4.1.0": - version: 4.1.0 - resolution: "@jupyterlab/vega5-extension@npm:4.1.0" +"@jupyterlab/vega5-extension@npm:~4.1.5": + version: 4.1.5 + resolution: "@jupyterlab/vega5-extension@npm:4.1.5" dependencies: - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 vega: ^5.20.0 vega-embed: ^6.2.1 vega-lite: ^5.6.1-next.1 - checksum: 3f1400c8e982a53bccbbc52ceb5616869e4167ee813ae81c44fff88c4a61ed3508ac42b22ede5bf973b8833fd1da0f68e9b22a31fcbac34511c34ce1f337653e + checksum: 49a128b356c77c39f56bf2e7d8bc42bb102774638fdca94a7f9b282255b1cc405209d069b25c716412ed8a86c7420317f64357c2775139d279b13668b7d34d4f languageName: node linkType: hard @@ -6774,9 +6774,9 @@ __metadata: linkType: hard "ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + version: 2.0.1 + resolution: "ip@npm:2.0.1" + checksum: d765c9fd212b8a99023a4cde6a558a054c298d640fec1020567494d257afd78ca77e37126b1a3ef0e053646ced79a816bf50621d38d5e768cdde0431fa3b0d35 languageName: node linkType: hard diff --git a/jupyterlab/tests/mock_packages/extension/package.json b/jupyterlab/tests/mock_packages/extension/package.json index 7a9050171d8a..d6d406f26a89 100644 --- a/jupyterlab/tests/mock_packages/extension/package.json +++ b/jupyterlab/tests/mock_packages/extension/package.json @@ -1,12 +1,12 @@ { "name": "@jupyterlab/mock-extension", - "version": "4.1.0", + "version": "4.1.5", "private": true, "dependencies": { - "@jupyterlab/launcher": "^4.1.0" + "@jupyterlab/launcher": "^4.1.5" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0" + "@jupyterlab/builder": "^4.1.5" }, "jupyterlab": { "extension": true, diff --git a/jupyterlab/tests/mock_packages/interop/consumer/package.json b/jupyterlab/tests/mock_packages/interop/consumer/package.json index 28622f305485..e0e4ab2bde3a 100644 --- a/jupyterlab/tests/mock_packages/interop/consumer/package.json +++ b/jupyterlab/tests/mock_packages/interop/consumer/package.json @@ -1,12 +1,12 @@ { "name": "@jupyterlab/mock-consumer", - "version": "4.1.0", + "version": "4.1.5", "private": true, "dependencies": { - "@jupyterlab/mock-token": "^4.1.0" + "@jupyterlab/mock-token": "^4.1.5" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0" + "@jupyterlab/builder": "^4.1.5" }, "jupyterlab": { "extension": true, diff --git a/jupyterlab/tests/mock_packages/interop/provider/package.json b/jupyterlab/tests/mock_packages/interop/provider/package.json index 8ac6c88a64d1..147130955478 100644 --- a/jupyterlab/tests/mock_packages/interop/provider/package.json +++ b/jupyterlab/tests/mock_packages/interop/provider/package.json @@ -1,12 +1,12 @@ { "name": "@jupyterlab/mock-provider", - "version": "4.1.0", + "version": "4.1.5", "private": true, "dependencies": { - "@jupyterlab/mock-token": "^4.1.0" + "@jupyterlab/mock-token": "^4.1.5" }, "devDependencies": { - "@jupyterlab/builder": "^4.1.0" + "@jupyterlab/builder": "^4.1.5" }, "jupyterlab": { "extension": true diff --git a/jupyterlab/tests/mock_packages/interop/token/package.json b/jupyterlab/tests/mock_packages/interop/token/package.json index b41a67bb0f2f..27ca6be95e7e 100644 --- a/jupyterlab/tests/mock_packages/interop/token/package.json +++ b/jupyterlab/tests/mock_packages/interop/token/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/mock-token", - "version": "4.1.0", + "version": "4.1.5", "private": true, "dependencies": { "@lumino/coreutils": "^2.1.2" diff --git a/packages/application-extension/package.json b/packages/application-extension/package.json index eee01a1463e8..ca18876f5a67 100644 --- a/packages/application-extension/package.json +++ b/packages/application-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/application-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Application Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,15 +38,15 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/property-inspector": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/property-inspector": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", diff --git a/packages/application-extension/schema/commands.json b/packages/application-extension/schema/commands.json index 8b0368712e6a..1d95ef6daec1 100644 --- a/packages/application-extension/schema/commands.json +++ b/packages/application-extension/schema/commands.json @@ -48,8 +48,9 @@ "selector": "body" }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 1"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -57,8 +58,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 2"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -66,8 +68,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 3"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -75,8 +78,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 4"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -84,8 +88,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 5"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -93,8 +98,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 6"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -102,8 +108,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 7"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -111,8 +118,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 8"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -120,8 +128,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 9"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -129,8 +138,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt 0"], + "macKeys": [""], "selector": "body", "args": { "side": "left", @@ -138,8 +148,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 1"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -147,8 +158,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 2"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -156,8 +168,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 3"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -165,8 +178,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 4"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -174,8 +188,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 5"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -183,8 +198,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 6"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -192,8 +208,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 7"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -201,8 +218,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 8"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -210,8 +228,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 9"], + "macKeys": [""], "selector": "body", "args": { "side": "right", @@ -219,8 +238,9 @@ } }, { - "command": "application:toggle-side-tabbar", + "command": "application:toggle-sidebar-widget", "keys": ["Alt Shift 0"], + "macKeys": [""], "selector": "body", "args": { "side": "right", diff --git a/packages/application/package.json b/packages/application/package.json index 7a067291204b..67bff2cf3d8d 100644 --- a/packages/application/package.json +++ b/packages/application/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/application", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Application", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -43,15 +43,15 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^5.12.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/application": "^2.3.0", "@lumino/commands": "^2.2.0", @@ -64,7 +64,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/apputils-extension/package.json b/packages/apputils-extension/package.json index 6a6e0b7cb677..d9a379f197a9 100644 --- a/packages/apputils-extension/package.json +++ b/packages/apputils-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/apputils-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Application Utilities Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,19 +38,19 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", diff --git a/packages/apputils-extension/src/announcements.ts b/packages/apputils-extension/src/announcements.ts index 8aa5c18488da..61acaed571d3 100644 --- a/packages/apputils-extension/src/announcements.ts +++ b/packages/apputils-extension/src/announcements.ts @@ -17,7 +17,7 @@ const COMMAND_HELP_OPEN = 'help:open'; const NEWS_API_URL = '/lab/api/news'; const UPDATE_API_URL = '/lab/api/update'; const PRIVACY_URL = - 'https://jupyterlab.readthedocs.io/en/latest/privacy_policies.html'; + 'https://jupyterlab.readthedocs.io/en/stable/privacy_policies.html'; /** * Call the announcement API diff --git a/packages/apputils-extension/src/workspacesplugin.ts b/packages/apputils-extension/src/workspacesplugin.ts index b6fac19e448a..06f42402515f 100644 --- a/packages/apputils-extension/src/workspacesplugin.ts +++ b/packages/apputils-extension/src/workspacesplugin.ts @@ -212,7 +212,7 @@ namespace Private { // Navigate to new workspace. const workspacesBase = URLExt.join(this._application, 'workspaces'); const url = URLExt.join(workspacesBase, id); - if (!workspacesBase.startsWith(url)) { + if (!url.startsWith(workspacesBase)) { throw new Error('Can only be used for workspaces'); } if (this._router) { diff --git a/packages/apputils/package.json b/packages/apputils/package.json index a66d34901a02..01dcd585b72a 100644 --- a/packages/apputils/package.json +++ b/packages/apputils/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/apputils", - "version": "4.2.0", + "version": "4.2.5", "description": "JupyterLab - Application Utilities", "keywords": [ "jupyter", @@ -45,15 +45,15 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", @@ -68,7 +68,7 @@ "sanitize-html": "~2.7.3" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/sanitize-html": "^2.3.1", "jest": "^29.2.0", diff --git a/packages/apputils/src/domutils.ts b/packages/apputils/src/domutils.ts index 39d03b810559..3501789c7b61 100644 --- a/packages/apputils/src/domutils.ts +++ b/packages/apputils/src/domutils.ts @@ -50,4 +50,22 @@ export namespace DOMUtils { export function createDomID(): string { return `id-${UUID.uuid4()}`; } + + /** + * Check whether the active element descendant from given parent is editable. + * When checking active elements it includes elements in the open shadow DOM. + */ + export function hasActiveEditableElement( + parent: Node | DocumentFragment, + root: ShadowRoot | Document = document + ): boolean { + const element = root.activeElement; + return !!( + element && + parent.contains(element) && + (element.matches(':read-write') || + (element.shadowRoot && + hasActiveEditableElement(element.shadowRoot, element.shadowRoot))) + ); + } } diff --git a/packages/apputils/test/domutils.spec.ts b/packages/apputils/test/domutils.spec.ts new file mode 100644 index 000000000000..6e5b4d65d421 --- /dev/null +++ b/packages/apputils/test/domutils.spec.ts @@ -0,0 +1,68 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import { DOMUtils } from '@jupyterlab/apputils'; + +describe('@jupyterlab/apputils', () => { + describe('DOMUtils', () => { + describe('hasActiveEditableElement', () => { + const testCases = [ + // editable elements + ['.input', true], + ['.textarea', true], + ['.div-editable', true], + // non-editable elements + ['.input-readonly', false], + ['.textarea-readonly', false], + ['.div', false] + ]; + + const div = document.createElement('div'); + div.innerHTML = ` +
+ + + + +
+
+
+
+
+ `; + document.body.appendChild(div); + + const lightHost = div.querySelector('.light-host')!; + const shadowHost = div.querySelector('.shadow-host')!; + const shadowRoot = shadowHost.attachShadow({ mode: 'open' }); + // mirror test cases from light DOM in the shadow DOM + shadowRoot.innerHTML = lightHost.innerHTML; + + it.each(testCases)( + 'should work in light DOM: `%s` element should result in `%s`', + (selector, expected) => { + const element = lightHost.querySelector( + selector as string + ) as HTMLElement; + element.focus(); + + const result = DOMUtils.hasActiveEditableElement(div); + expect(result).toBe(expected); + } + ); + + it.each(testCases)( + 'should work in shadow DOM: `%s` element should result in `%s`', + (selector, expected) => { + const element = shadowRoot.querySelector( + selector as string + ) as HTMLElement; + element.focus(); + + const result = DOMUtils.hasActiveEditableElement(div); + expect(result).toBe(expected); + } + ); + }); + }); +}); diff --git a/packages/attachments/package.json b/packages/attachments/package.json index bb5496423b00..5e804ccab87b 100644 --- a/packages/attachments/package.json +++ b/packages/attachments/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/attachments", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Notebook Cell Attachments", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,10 +37,10 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", "@lumino/disposable": "^2.1.2", "@lumino/signaling": "^2.1.2" }, diff --git a/packages/cell-toolbar-extension/package.json b/packages/cell-toolbar-extension/package.json index 7e3c8a0b4a26..d27343bf0ce5 100644 --- a/packages/cell-toolbar-extension/package.json +++ b/packages/cell-toolbar-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/cell-toolbar-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "Extension for cell toolbar adapted from jlab-enhanced-cell-toolbar", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -34,11 +34,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cell-toolbar": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cell-toolbar": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/cell-toolbar/package.json b/packages/cell-toolbar/package.json index 4ae916264844..82132fca28c9 100644 --- a/packages/cell-toolbar/package.json +++ b/packages/cell-toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/cell-toolbar", - "version": "4.1.0", + "version": "4.1.5", "description": "Contextual cell toolbar adapted from jlab-enhanced-cell-toolbar", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -41,12 +41,12 @@ }, "dependencies": { "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/disposable": "^2.1.2", @@ -54,7 +54,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/cells/package.json b/packages/cells/package.json index c705e3a1f307..db73b5c52967 100644 --- a/packages/cells/package.json +++ b/packages/cells/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/cells", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Notebook Cells", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -46,21 +46,21 @@ "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.6", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/attachments": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/outputarea": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/attachments": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/outputarea": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/domutils": "^2.0.1", @@ -73,7 +73,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/react": "^18.0.26", "jest": "^29.2.0", diff --git a/packages/cells/src/widget.ts b/packages/cells/src/widget.ts index 0ed6753f7047..d8a3479d2a93 100644 --- a/packages/cells/src/widget.ts +++ b/packages/cells/src/widget.ts @@ -204,6 +204,7 @@ export class Cell extends Widget { // For cells disable searching with CodeMirror search panel. this._editorConfig = { searchWithCM: false, ...options.editorConfig }; + this._editorExtensions = options.editorExtensions ?? []; this._placeholder = true; this._inViewport = false; this.placeholder = options.placeholder ?? true; @@ -615,7 +616,7 @@ export class Cell extends Widget { * @returns Editor options */ protected getEditorOptions(): InputArea.IOptions['editorOptions'] { - return { config: this.editorConfig }; + return { config: this.editorConfig, extensions: this._editorExtensions }; } /** @@ -694,6 +695,7 @@ export class Cell extends Widget { protected _displayChanged = new Signal(this); private _editorConfig: Record = {}; + private _editorExtensions: Extension[] = []; private _input: InputArea | null; private _inputHidden = false; private _inputWrapper: Widget | null; @@ -1776,7 +1778,9 @@ export abstract class AttachmentsCell< continue; } items[i].getAsString(text => { - this.editor!.replaceSelection?.(text); + this.editor!.replaceSelection?.( + text.replace(/\r\n/g, '\n').replace(/\r/g, '\n') + ); }); } this._attachFiles(event.clipboardData.items); diff --git a/packages/cells/test/widget.spec.ts b/packages/cells/test/widget.spec.ts index 3aab72411e9e..d00cbbe79fa4 100644 --- a/packages/cells/test/widget.spec.ts +++ b/packages/cells/test/widget.spec.ts @@ -1,7 +1,7 @@ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. -import { createStandaloneCell, YCodeCell } from '@jupyter/ydoc'; +import { createStandaloneCell, YCodeCell, YMarkdownCell } from '@jupyter/ydoc'; import { ISessionContext, SessionContext } from '@jupyterlab/apputils'; import { createSessionContext } from '@jupyterlab/apputils/lib/testutils'; import { @@ -998,6 +998,33 @@ describe('cells/widget', () => { }); }); + describe('#getEditorOptions()', () => { + it('should normalise line endings on paste', () => { + const model = new MarkdownCellModel({ + sharedModel: createStandaloneCell({ + cell_type: 'markdown' + }) as YMarkdownCell + }); + const widget = new MarkdownCell({ + model, + rendermime, + contentFactory, + placeholder: false + }); + widget.initializeState(); + document.body.appendChild(widget.node); + // todo: replace with user-event + const dt = new DataTransfer(); + dt.setData('text/plain', '\r\nTest\r\nString\r\n.\r\n'); + const event = new ClipboardEvent('paste', { clipboardData: dt }); + widget.editor!.host.querySelector('.cm-content')!.dispatchEvent(event); + + expect(widget.model.sharedModel.getSource()).toEqual( + '\nTest\nString\n.\n' + ); + }); + }); + describe('#rendered', () => { it('should default to true', async () => { const widget = new MarkdownCell({ diff --git a/packages/celltags-extension/package.json b/packages/celltags-extension/package.json index 4c50e58482d4..654915d78383 100644 --- a/packages/celltags-extension/package.json +++ b/packages/celltags-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/celltags-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "An extension for manipulating tags in cell metadata", "keywords": [ "jupyter", @@ -40,10 +40,10 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@rjsf/utils": "^5.13.4", "react": "^18.2.0" diff --git a/packages/codeeditor/package.json b/packages/codeeditor/package.json index a10b9e00dfb4..23da09e9b5dc 100644 --- a/packages/codeeditor/package.json +++ b/packages/codeeditor/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/codeeditor", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Abstract Code Editor", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -44,13 +44,13 @@ "dependencies": { "@codemirror/state": "^6.2.0", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/dragdrop": "^2.1.4", @@ -60,7 +60,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/codemirror-extension/package.json b/packages/codemirror-extension/package.json index 346b78e30e52..467b9e600086 100644 --- a/packages/codemirror-extension/package.json +++ b/packages/codemirror-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/codemirror-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - CodeMirror Provider Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,13 +42,13 @@ "@codemirror/language": "^6.6.0", "@codemirror/legacy-modes": "^6.3.2", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/widgets": "^2.3.1", "@rjsf/utils": "^5.13.4", diff --git a/packages/codemirror-extension/src/services.tsx b/packages/codemirror-extension/src/services.tsx index c9d5627b661d..5190f62e929d 100644 --- a/packages/codemirror-extension/src/services.tsx +++ b/packages/codemirror-extension/src/services.tsx @@ -3,7 +3,7 @@ * Distributed under the terms of the Modified BSD License. */ -import { StreamLanguage } from '@codemirror/language'; +import { LanguageSupport, StreamLanguage } from '@codemirror/language'; import { IYText } from '@jupyter/ydoc'; import { JupyterFrontEnd, @@ -20,6 +20,7 @@ import { IEditorLanguageRegistry, IEditorThemeRegistry, parseMathIPython, + pythonBuiltin, ybinding } from '@jupyterlab/codemirror'; import { ISettingRegistry } from '@jupyterlab/settingregistry'; @@ -62,17 +63,22 @@ export const languagePlugin: JupyterFrontEndPlugin = { name: 'ipythongfm', mime: 'text/x-ipythongfm', load: async () => { - const [m, tex] = await Promise.all([ + const [m, py, tex] = await Promise.all([ import('@codemirror/lang-markdown'), + import('@codemirror/lang-python'), import('@codemirror/legacy-modes/mode/stex') ]); - return m.markdown({ + const mdlang = m.markdown({ base: m.markdownLanguage, codeLanguages: (info: string) => languages.findBest(info) as any, extensions: [ parseMathIPython(StreamLanguage.define(tex.stexMath).parser) ] }); + return new LanguageSupport(mdlang.language, [ + mdlang.support, + pythonBuiltin(py.pythonLanguage) + ]); } }); return languages; diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index 561202fe0d26..c795773141eb 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/codemirror", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - CodeMirror Editor Provider", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -59,11 +59,11 @@ "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.6", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", "@lezer/common": "^1.0.2", "@lezer/generator": "^1.2.2", "@lezer/highlight": "^1.1.4", @@ -74,7 +74,7 @@ "yjs": "^13.5.40" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@lezer/generator": "^1.2.2", "@lezer/lr": "^1.3.3", "@types/jest": "^29.2.0", diff --git a/packages/codemirror/src/commands.ts b/packages/codemirror/src/commands.ts index 9b30c4d556b8..56b5aaf99a7d 100644 --- a/packages/codemirror/src/commands.ts +++ b/packages/codemirror/src/commands.ts @@ -4,6 +4,7 @@ */ import { + indentLess, indentMore, insertNewlineAndIndent, insertTab @@ -19,6 +20,12 @@ import { */ const CODE_RUNNER_SELECTOR = '[data-jp-code-runner]'; +/** + * Selector for a widget that can open a tooltip. + */ +const TOOLTIP_OPENER_SELECTOR = + '.jp-CodeMirrorEditor:not(.jp-mod-has-primary-selection):not(.jp-mod-in-leading-whitespace):not(.jp-mod-completer-active)'; + /** * CodeMirror commands namespace */ @@ -76,4 +83,22 @@ export namespace StateCommands { } return false; } + + /** + * Prevent dedenting when launching inspection request (a.k.a tooltip). + * + * This function should be removed once a better way to prevent default + * CodeMirror commands is implemented, as tracked in + * https://github.com/jupyterlab/jupyterlab/issues/15897 + */ + export function dedentIfNotLaunchingTooltip(target: { + dom: HTMLElement; + state: EditorState; + dispatch: (transaction: Transaction) => void; + }): boolean { + if (target.dom.closest(TOOLTIP_OPENER_SELECTOR)) { + return true; + } + return indentLess(target); + } } diff --git a/packages/codemirror/src/extension.ts b/packages/codemirror/src/extension.ts index 3e0424368772..2c0b65078e67 100644 --- a/packages/codemirror/src/extension.ts +++ b/packages/codemirror/src/extension.ts @@ -2,7 +2,7 @@ // Distributed under the terms of the Modified BSD License. import { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete'; -import { defaultKeymap, indentLess } from '@codemirror/commands'; +import { defaultKeymap } from '@codemirror/commands'; import { bracketMatching, foldGutter, @@ -715,7 +715,7 @@ export namespace EditorExtensionRegistry { { key: 'Tab', run: StateCommands.indentMoreOrInsertTab, - shift: indentLess + shift: StateCommands.dedentIfNotLaunchingTooltip } ], factory: () => diff --git a/packages/codemirror/src/index.ts b/packages/codemirror/src/index.ts index 33b1c4d60ed0..2d34ee896a7b 100644 --- a/packages/codemirror/src/index.ts +++ b/packages/codemirror/src/index.ts @@ -15,3 +15,4 @@ export * from './mimetype'; export * from './searchprovider'; export * from './theme'; export * from './token'; +export * from './pythonBuiltin'; diff --git a/packages/codemirror/src/language.ts b/packages/codemirror/src/language.ts index 3bafd287a416..55017e7a50ab 100644 --- a/packages/codemirror/src/language.ts +++ b/packages/codemirror/src/language.ts @@ -16,6 +16,7 @@ import { highlightTree } from '@lezer/highlight'; import { jupyterHighlightStyle } from './theme'; import { IEditorLanguage, IEditorLanguageRegistry } from './token'; +import { pythonBuiltin } from './pythonBuiltin'; /** * CodeMirror language registry @@ -473,7 +474,10 @@ export namespace EditorLanguageRegistry { filename: /^(BUCK|BUILD)$/, async load() { const m = await import('@codemirror/lang-python'); - return m.python(); + return new LanguageSupport( + m.pythonLanguage, + pythonBuiltin(m.pythonLanguage) + ); } }, { @@ -485,7 +489,10 @@ export namespace EditorLanguageRegistry { // to activate feature such as code folding. // return Promise.resolve(legacy(mkPython({ singleOperators: /\?/ }))); const m = await import('@codemirror/lang-python'); - return m.python(); + return new LanguageSupport( + m.pythonLanguage, + pythonBuiltin(m.pythonLanguage) + ); } }, { diff --git a/packages/codemirror/src/pythonBuiltin.ts b/packages/codemirror/src/pythonBuiltin.ts new file mode 100644 index 000000000000..332a35160dec --- /dev/null +++ b/packages/codemirror/src/pythonBuiltin.ts @@ -0,0 +1,159 @@ +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +import { Language, syntaxTree } from '@codemirror/language'; +import { RangeSetBuilder } from '@codemirror/state'; +import { + Decoration, + DecorationSet, + EditorView, + ViewPlugin, + ViewUpdate +} from '@codemirror/view'; +import { NodeProp, SyntaxNodeRef, Tree } from '@lezer/common'; + +export class PythonBuiltin { + decorations: DecorationSet; + decoratedTo: number; + langPython: Language; + tree: Tree; + mark: Decoration; + + constructor(view: EditorView, langPython: Language) { + this.langPython = langPython; + this.tree = syntaxTree(view.state); + this.mark = Decoration.mark({ class: 'cm-builtin' }); + this.decorations = this.buildDeco(view); + this.decoratedTo = view.viewport.to; + } + + update(update: ViewUpdate) { + let tree = syntaxTree(update.state); + let { viewport } = update.view, + decoratedToMapped = update.changes.mapPos(this.decoratedTo, 1); + if ( + tree.length < viewport.to && + tree.type == this.tree.type && + decoratedToMapped >= viewport.to + ) { + this.decorations = this.decorations.map(update.changes); + this.decoratedTo = decoratedToMapped; + } else if (tree != this.tree || update.viewportChanged) { + this.tree = tree; + this.decorations = this.buildDeco(update.view); + this.decoratedTo = viewport.to; + } + } + + buildDeco(view: EditorView) { + if (!this.tree.length) return Decoration.none; + + let builder = new RangeSetBuilder(); + const enter = (node: SyntaxNodeRef) => { + const cursor = node.node.cursor(); + // Handle nested language, e.g. Markdown + const mounted = cursor.tree && cursor.tree.prop(NodeProp.mounted); + if (mounted && mounted.overlay) { + node.node + .enter(mounted.overlay[0].from + node.from, 1) + ?.cursor() + .iterate(enter); + } + if ( + this.langPython.isActiveAt(view.state, node.from + 1) && + node.name === 'VariableName' + ) { + const variableName = view.state.sliceDoc(node.from, node.to); + if (builtins.includes(variableName)) { + builder.add(node.from, node.to, this.mark); + } + } + }; + for (let { from, to } of view.visibleRanges) { + this.tree.iterate({ enter, from, to }); + } + return builder.finish(); + } +} + +export function pythonBuiltin(langPython: Language) { + return ViewPlugin.define(view => new PythonBuiltin(view, langPython), { + decorations: v => v.decorations + }); +} + +const builtins = [ + 'abs', + 'aiter', + 'all', + 'any', + 'anext', + 'ascii', + 'bin', + 'bool', + 'breakpoint', + 'bytearray', + 'bytes', + 'callable', + 'chr', + 'classmethod', + 'compile', + 'complex', + 'delattr', + 'dict', + 'dir', + 'divmod', + 'enumerate', + 'eval', + 'exec', + 'filter', + 'float', + 'format', + 'frozenset', + 'getattr', + 'globals', + 'hasattr', + 'hash', + 'help', + 'hex', + 'id', + 'input', + 'int', + 'isinstance', + 'issubclass', + 'iter', + 'len', + 'list', + 'locals', + 'map', + 'max', + 'memoryview', + 'min', + 'next', + 'object', + 'oct', + 'open', + 'ord', + 'pow', + 'print', + 'property', + 'range', + 'repr', + 'reversed', + 'round', + 'set', + 'setattr', + 'slice', + 'sorted', + 'staticmethod', + 'str', + 'sum', + 'super', + 'tuple', + 'type', + 'vars', + 'zip', + '__import__' +]; diff --git a/packages/codemirror/src/searchprovider.ts b/packages/codemirror/src/searchprovider.ts index 557b64cf8183..6b9c67a5730d 100644 --- a/packages/codemirror/src/searchprovider.ts +++ b/packages/codemirror/src/searchprovider.ts @@ -319,9 +319,9 @@ export abstract class EditorSearchProvider< * * The caller of this method is expected to call `highlightNext` if after * calling `replaceCurrentMatch()` attribute `this.currentIndex` is null. - * It is necesary to let the caller handle highlighting because this + * It is necessary to let the caller handle highlighting because this * method is used in composition pattern (search engine of notebook cells) - * and highligthing on the composer (notebook) level needs to switch to next + * and highlighting on the composer (notebook) level needs to switch to next * engine (cell) with matches. * * @param newText The replacement text. @@ -343,15 +343,17 @@ export abstract class EditorSearchProvider< this.currentIndex < this.cmHandler.matches.length ) { const match = this.getCurrentMatch(); - // If cursor there is no match selected, highlight the next match if (!match) { this.currentIndex = null; } else { this.cmHandler.matches.splice(this.currentIndex, 1); + const cmMatchesRemaining = this.cmHandler.matches.length; + + // End at the end of the CodeMirror matches list; do not loop + // Let the caller call highlightNext if we've reached the end of the current code cell this.currentIndex = - this.currentIndex < this.cmHandler.matches.length - ? Math.max(this.currentIndex - 1, 0) - : null; + this.currentIndex < cmMatchesRemaining ? this.currentIndex : null; + const substitutedText = options?.regularExpression ? match!.text.replace(this.query!, newText) : newText; diff --git a/packages/codemirror/src/theme.ts b/packages/codemirror/src/theme.ts index eec13b0a5c60..54cd7649fe35 100644 --- a/packages/codemirror/src/theme.ts +++ b/packages/codemirror/src/theme.ts @@ -81,6 +81,10 @@ export const jupyterEditorTheme = EditorView.theme({ '.cm-tooltip': { backgroundColor: 'var(--jp-layout-color1)' + }, + + '.cm-builtin': { + color: 'var(--jp-mirror-editor-builtin-color)' } }); diff --git a/packages/codemirror/style/base.css b/packages/codemirror/style/base.css index d3cf35f6fb93..f81fae3f9499 100644 --- a/packages/codemirror/style/base.css +++ b/packages/codemirror/style/base.css @@ -43,10 +43,15 @@ } } -.cm-editor.jp-mod-readOnly .cm-cursor { +/* stylelint-disable selector-max-class */ + +/* We need all this classes for higher specificity to override CodeMirror's rule */ +.cm-editor.jp-mod-readOnly > .cm-scroller > .cm-cursorLayer .cm-cursor { display: none; } +/* stylelint-enable selector-max-class */ + .jp-CollaboratorCursor { border-left: 5px solid transparent; border-right: 5px solid transparent; diff --git a/packages/completer-extension/package.json b/packages/completer-extension/package.json index 2b51706edba9..9cda80d58200 100644 --- a/packages/completer-extension/package.json +++ b/packages/completer-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/completer-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Completer Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,11 +38,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", "@rjsf/utils": "^5.13.4", diff --git a/packages/completer-extension/schema/inline-completer.json b/packages/completer-extension/schema/inline-completer.json index 0655ff8b3ccd..c9105fc7dee2 100644 --- a/packages/completer-extension/schema/inline-completer.json +++ b/packages/completer-extension/schema/inline-completer.json @@ -29,7 +29,8 @@ "properties": { "providers": { "title": "Inline completion providers", - "type": "object" + "type": "object", + "default": {} }, "showWidget": { "title": "Show widget", diff --git a/packages/completer/package.json b/packages/completer/package.json index eaa7caf3568e..ae99eff0b3a9 100644 --- a/packages/completer/package.json +++ b/packages/completer/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/completer", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Completer", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -49,16 +49,16 @@ "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.6", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -68,7 +68,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/completer/src/handler.ts b/packages/completer/src/handler.ts index 59abf1a383af..fb4bb14d103c 100644 --- a/packages/completer/src/handler.ts +++ b/packages/completer/src/handler.ts @@ -7,7 +7,14 @@ import { COMPLETER_ENABLED_CLASS } from '@jupyterlab/codeeditor'; import { Text } from '@jupyterlab/coreutils'; -import { ISharedText, SourceChange } from '@jupyter/ydoc'; +import { + CellChange, + FileChange, + ISharedBaseCell, + ISharedFile, + ISharedText, + SourceChange +} from '@jupyter/ydoc'; import { IDataConnector } from '@jupyterlab/statedb'; import { LabIcon } from '@jupyterlab/ui-components'; import { IDisposable } from '@lumino/disposable'; @@ -70,7 +77,7 @@ export class CompletionHandler implements IDisposable { editor.host.classList.remove(COMPLETER_ENABLED_CLASS); editor.host.classList.remove(COMPLETER_ACTIVE_CLASS); model.selections.changed.disconnect(this.onSelectionsChanged, this); - model.sharedModel.changed.disconnect(this.onTextChanged, this); + model.sharedModel.changed.disconnect(this._onSharedModelChanged, this); } // Reset completer state. @@ -84,7 +91,15 @@ export class CompletionHandler implements IDisposable { const model = editor.model; this._enabled = false; model.selections.changed.connect(this.onSelectionsChanged, this); - model.sharedModel.changed.connect(this.onTextChanged, this); + // We expect the model to be an editor, a file editor, or a cell. + const sharedModel = model.sharedModel as + | ISharedText + | ISharedFile + | ISharedBaseCell; + // For cells and files the `changed` signal is not limited to text, + // but also fires on changes to metadata, outputs, execution count, + // and state changes, hence we need to filter the change type. + sharedModel.changed.connect(this._onSharedModelChanged, this); // On initial load, manually check the cursor position. this.onSelectionsChanged(); if (this.inlineCompleter) { @@ -382,6 +397,18 @@ export class CompletionHandler implements IDisposable { } } + /** + * Handle a text shared model change signal from an editor. + */ + private async _onSharedModelChanged( + str: ISharedText, + changed: SourceChange | CellChange | FileChange + ): Promise { + if (changed.sourceChange) { + await this.onTextChanged(str, changed); + } + } + /** * Make a completion request. */ diff --git a/packages/console-extension/package.json b/packages/console-extension/package.json index e11fc3b6d3a3..479a277a12d0 100644 --- a/packages/console-extension/package.json +++ b/packages/console-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/console-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Code Console Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,18 +38,18 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", diff --git a/packages/console-extension/schema/tracker.json b/packages/console-extension/schema/tracker.json index 0007b3654b9a..80461189d24a 100644 --- a/packages/console-extension/schema/tracker.json +++ b/packages/console-extension/schema/tracker.json @@ -59,6 +59,16 @@ } ], "context": [ + { + "command": "console:undo", + "selector": ".jp-CodeConsole-promptCell", + "rank": 1 + }, + { + "command": "console:redo", + "selector": ".jp-CodeConsole-promptCell", + "rank": 2 + }, { "command": "console:clear", "selector": ".jp-CodeConsole-content", diff --git a/packages/console-extension/src/index.ts b/packages/console-extension/src/index.ts index b8d06abbe8ff..e82b13ce0de7 100644 --- a/packages/console-extension/src/index.ts +++ b/packages/console-extension/src/index.ts @@ -36,7 +36,12 @@ import { IMainMenu } from '@jupyterlab/mainmenu'; import { IRenderMime, IRenderMimeRegistry } from '@jupyterlab/rendermime'; import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; -import { consoleIcon, IFormRendererRegistry } from '@jupyterlab/ui-components'; +import { + consoleIcon, + IFormRendererRegistry, + redoIcon, + undoIcon +} from '@jupyterlab/ui-components'; import { find } from '@lumino/algorithm'; import { JSONExt, @@ -85,10 +90,14 @@ namespace CommandIDs { export const interactionMode = 'console:interaction-mode'; + export const redo = 'console:redo'; + export const replaceSelection = 'console:replace-selection'; export const shutdown = 'console:shutdown'; + export const undo = 'console:undo'; + export const invokeCompleter = 'completer:invoke-console'; export const selectCompleter = 'completer:select-console'; @@ -550,6 +559,74 @@ async function activateConsole( return widget ?? null; } + /** + * Add undo command + */ + commands.addCommand(CommandIDs.undo, { + execute: args => { + const current = getCurrent(args); + + if (!current) { + return; + } + + const editor = current.console.promptCell?.editor; + if (!editor) { + return; + } + editor.undo(); + }, + isEnabled: args => { + if (!isEnabled()) { + return false; + } + + const editor = getCurrent(args)?.console?.promptCell?.editor; + + if (!editor) { + return false; + } + + return editor.model.sharedModel.canUndo(); + }, + icon: undoIcon.bindprops({ stylesheet: 'menuItem' }), + label: trans.__('Undo') + }); + + /** + * Add redo command + */ + commands.addCommand(CommandIDs.redo, { + execute: args => { + const current = getCurrent(args); + + if (!current) { + return; + } + + const editor = current.console.promptCell?.editor; + if (!editor) { + return; + } + editor.redo(); + }, + isEnabled: args => { + if (!isEnabled()) { + return false; + } + + const editor = getCurrent(args)?.console?.promptCell?.editor; + + if (!editor) { + return false; + } + + return editor.model.sharedModel.canRedo(); + }, + icon: redoIcon.bindprops({ stylesheet: 'menuItem' }), + label: trans.__('Redo') + }); + commands.addCommand(CommandIDs.clear, { label: trans.__('Clear Console Cells'), execute: args => { @@ -790,6 +867,16 @@ async function activateConsole( isEnabled }); + // Add undo/redo hooks to the edit menu. + mainMenu.editMenu.undoers.redo.add({ + id: CommandIDs.redo, + isEnabled + }); + mainMenu.editMenu.undoers.undo.add({ + id: CommandIDs.undo, + isEnabled + }); + // Add kernel information to the application help menu. mainMenu.helpMenu.getKernel.add({ id: CommandIDs.getKernel, diff --git a/packages/console/package.json b/packages/console/package.json index 510463889ab6..2a795e76a7c5 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/console", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Code Console", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -46,16 +46,16 @@ "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.6", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/dragdrop": "^2.1.4", @@ -64,8 +64,8 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/console/src/widget.ts b/packages/console/src/widget.ts index b3fdb0c8677d..79a8661f71d6 100644 --- a/packages/console/src/widget.ts +++ b/packages/console/src/widget.ts @@ -4,7 +4,7 @@ import { Prec } from '@codemirror/state'; import { EditorView } from '@codemirror/view'; import { createStandaloneCell, ISharedRawCell } from '@jupyter/ydoc'; -import { ISessionContext } from '@jupyterlab/apputils'; +import { DOMUtils, ISessionContext } from '@jupyterlab/apputils'; import { AttachmentsCellModel, Cell, @@ -70,6 +70,14 @@ const CONTENT_CLASS = 'jp-CodeConsole-content'; */ const INPUT_CLASS = 'jp-CodeConsole-input'; +/** + * The class name added to the console when an element within it is focused + * and takes keyboard input, such as and
+ * + * This class is also effective when the focused element is in shadow DOM. + */ +const READ_WRITE_CLASS = 'jp-mod-readWrite'; + /** * The timeout in ms for execution requests to the kernel. */ @@ -80,6 +88,16 @@ const EXECUTION_TIMEOUT = 250; */ const JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells'; +/** + * The data attribute added to a widget that can undo. + */ +const UNDOER = 'jpUndoer'; +/** + * The data attribute Whether the console interaction mimics the notebook + * or terminal keyboard shortcuts. + */ +const INTERACTION_MODE = 'jpInteractionMode'; + /** * A widget containing a Jupyter console. * @@ -97,6 +115,7 @@ export class CodeConsole extends Widget { this.addClass(CONSOLE_CLASS); this.node.dataset[KERNEL_USER] = 'true'; this.node.dataset[CODE_RUNNER] = 'true'; + this.node.dataset[UNDOER] = 'true'; this.node.tabIndex = -1; // Allow the widget to take focus. // Create the panels that hold the content and input. @@ -551,6 +570,12 @@ export class CodeConsole extends Widget { case 'mouseup': this._evtMouseUp(event as MouseEvent); break; + case 'focusin': + this._evtFocusIn(event as MouseEvent); + break; + case 'focusout': + this._evtFocusOut(event as MouseEvent); + break; default: break; } @@ -564,6 +589,8 @@ export class CodeConsole extends Widget { node.addEventListener('keydown', this, true); node.addEventListener('click', this); node.addEventListener('mousedown', this); + node.addEventListener('focusin', this); + node.addEventListener('focusout', this); // Create a prompt if necessary. if (!this.promptCell) { this.newPromptCell(); @@ -580,6 +607,8 @@ export class CodeConsole extends Widget { const node = this.node; node.removeEventListener('keydown', this, true); node.removeEventListener('click', this); + node.removeEventListener('focusin', this); + node.removeEventListener('focusout', this); } /** @@ -604,7 +633,16 @@ export class CodeConsole extends Widget { if (promptCell) { promptCell.readOnly = true; promptCell.removeClass(PROMPT_CLASS); - Signal.clearData(promptCell.editor); + + // Schedule execution of signal clearance to happen later so that + // the `readOnly` configuration gets updated before editor signals + // get disconnected (see `Cell.onUpdateRequest`). + const oldCell = promptCell; + requestIdleCallback(() => { + // Clear the signals to avoid memory leaks + Signal.clearData(oldCell.editor); + }); + // Ensure to clear the cursor promptCell.editor?.blur(); const child = input.widgets[0]; @@ -664,6 +702,22 @@ export class CodeConsole extends Widget { } } + /** + * Handle `focus` events for the widget. + */ + private _evtFocusIn(event: FocusEvent): void { + // Update read-write class state. + this._updateReadWrite(); + } + + /** + * Handle `focusout` events for the widget. + */ + private _evtFocusOut(event: FocusEvent): void { + // Update read-write class state. + this._updateReadWrite(); + } + /** * Execute the code in the current prompt cell. */ @@ -740,6 +794,7 @@ export class CodeConsole extends Widget { * Create the options used to initialize a code cell widget. */ private _createCodeCellOptions(): CodeCell.IOptions { + const { node } = this; const contentFactory = this.contentFactory; const modelFactory = this.modelFactory; const model = modelFactory.createCodeCell({}); @@ -749,7 +804,10 @@ export class CodeConsole extends Widget { // Suppress the default "Enter" key handling. const onKeyDown = EditorView.domEventHandlers({ keydown: (event: KeyboardEvent, view: EditorView) => { - if (event.keyCode === 13) { + if ( + event.keyCode === 13 && + node.dataset[INTERACTION_MODE] === 'terminal' + ) { event.preventDefault(); return true; } @@ -846,6 +904,15 @@ export class CodeConsole extends Widget { } } + /** + * Update the console node with class indicating read-write state. + */ + private _updateReadWrite(): void { + // TODO: de-duplicate with code in notebook/src/widget.ts + const inReadWrite = DOMUtils.hasActiveEditableElement(this.node); + this.node.classList.toggle(READ_WRITE_CLASS, inReadWrite); + } + private _banner: RawCell | null = null; private _cells: IObservableList; private _content: Panel; diff --git a/packages/console/test/widget.spec.ts b/packages/console/test/widget.spec.ts index 9d84b82d4e41..000d634ba615 100644 --- a/packages/console/test/widget.spec.ts +++ b/packages/console/test/widget.spec.ts @@ -280,6 +280,19 @@ describe('console/widget', () => { expect.arrayContaining(['newPromptCell']) ); }); + + it('should make previous cell read-only after execution', async () => { + Widget.attach(widget, document.body); + + const old = widget.promptCell; + const force = true; + expect(old).toBeInstanceOf(CodeCell); + + await (widget.sessionContext as SessionContext).initialize(); + await widget.execute(force); + + expect(old!.editor!.getOption('readOnly')).toBe(true); + }); }); describe('#onActivateRequest()', () => { diff --git a/packages/coreutils/package.json b/packages/coreutils/package.json index 3c2fde82ebef..e1c7d28bb5d0 100644 --- a/packages/coreutils/package.json +++ b/packages/coreutils/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/coreutils", - "version": "6.1.0", + "version": "6.1.5", "description": "JupyterLab - Core Utilities", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { diff --git a/packages/csvviewer-extension/package.json b/packages/csvviewer-extension/package.json index ee6c4944d901..f29a9fd6161e 100644 --- a/packages/csvviewer-extension/package.json +++ b/packages/csvviewer-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/csvviewer-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - CSV Widget Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,15 +38,15 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/csvviewer": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/csvviewer": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/datagrid": "^2.3.0", "@lumino/widgets": "^2.3.1" }, diff --git a/packages/csvviewer/package.json b/packages/csvviewer/package.json index 075286473d74..04857c6f4f07 100644 --- a/packages/csvviewer/package.json +++ b/packages/csvviewer/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/csvviewer", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - CSV Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,10 +42,10 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/datagrid": "^2.3.0", "@lumino/disposable": "^2.1.2", @@ -54,7 +54,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "canvas": "^2.11.2", "csv-spectrum": "^1.0.0", diff --git a/packages/debugger-extension/package.json b/packages/debugger-extension/package.json index 426618221eca..0b88ecd8d3af 100644 --- a/packages/debugger-extension/package.json +++ b/packages/debugger-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/debugger-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Debugger Extension", "keywords": [ "jupyter", @@ -44,24 +44,24 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/debugger": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/fileeditor": "^4.1.0", - "@jupyterlab/logconsole": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/debugger": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/fileeditor": "^4.1.5", + "@jupyterlab/logconsole": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/react-dom": "^18.0.9", "rimraf": "~5.0.5", diff --git a/packages/debugger/package.json b/packages/debugger/package.json index 89e1fa0901c8..ccc18f10d36e 100644 --- a/packages/debugger/package.json +++ b/packages/debugger/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/debugger", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Debugger Extension", "keywords": [ "jupyter", @@ -52,21 +52,21 @@ "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.6", "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/fileeditor": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/fileeditor": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", @@ -80,7 +80,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "canvas": "^2.11.2", "jest": "^29.2.0", diff --git a/packages/docmanager-extension/package.json b/packages/docmanager-extension/package.json index 96e114fb3346..438b5688b0e5 100644 --- a/packages/docmanager-extension/package.json +++ b/packages/docmanager-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/docmanager-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Document Manager Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,16 +38,16 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", diff --git a/packages/docmanager/package.json b/packages/docmanager/package.json index a8a7db320663..5866f4c79c59 100644 --- a/packages/docmanager/package.json +++ b/packages/docmanager/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/docmanager", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Document Manager", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,13 +42,13 @@ "watch": "npm run test -- --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -59,7 +59,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/docregistry/package.json b/packages/docregistry/package.json index f483b8fc4955..cb62055648dd 100644 --- a/packages/docregistry/package.json +++ b/packages/docregistry/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/docregistry", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Document Registry", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -43,15 +43,15 @@ }, "dependencies": { "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -62,7 +62,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/documentsearch-extension/package.json b/packages/documentsearch-extension/package.json index c11021ec530e..7a7132ff796c 100644 --- a/packages/documentsearch-extension/package.json +++ b/packages/documentsearch-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/documentsearch-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Document Search Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -34,11 +34,11 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/widgets": "^2.3.1" }, diff --git a/packages/documentsearch/package.json b/packages/documentsearch/package.json index 133f66bfcf47..fd689720fe1a 100644 --- a/packages/documentsearch/package.json +++ b/packages/documentsearch/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/documentsearch", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Document Search", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,9 +38,9 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -51,7 +51,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/extensionmanager-extension/package.json b/packages/extensionmanager-extension/package.json index e4487fa936b4..5cf62dd4b455 100644 --- a/packages/extensionmanager-extension/package.json +++ b/packages/extensionmanager-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/extensionmanager-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Extension Manager Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -39,12 +39,12 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/extensionmanager": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/extensionmanager": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/extensionmanager/package.json b/packages/extensionmanager/package.json index b7aa49deff85..611d464c9750 100644 --- a/packages/extensionmanager/package.json +++ b/packages/extensionmanager/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/extensionmanager", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Extension Manager", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,11 +37,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/messaging": "^2.0.1", "@lumino/polling": "^2.1.2", "@lumino/widgets": "^2.3.1", diff --git a/packages/extensionmanager/src/widget.tsx b/packages/extensionmanager/src/widget.tsx index 78335c44ef2e..ba2d33678ce9 100644 --- a/packages/extensionmanager/src/widget.tsx +++ b/packages/extensionmanager/src/widget.tsx @@ -100,7 +100,7 @@ function ListEntry(props: ListEntry.IProperties): React.ReactElement { )} onClick={() => window.open( - 'https://jupyterlab.readthedocs.io/en/latest/user/extensions.html' + 'https://jupyterlab.readthedocs.io/en/stable/user/extensions.html' ) } /> @@ -415,7 +415,7 @@ to work, this panel needs to fetch data from web services. Do you agree to activate this feature?`)}
diff --git a/packages/filebrowser-extension/package.json b/packages/filebrowser-extension/package.json index f9ee98bac741..a324108a176c 100644 --- a/packages/filebrowser-extension/package.json +++ b/packages/filebrowser-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/filebrowser-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Filebrowser Widget Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,18 +38,18 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/widgets": "^2.3.1" diff --git a/packages/filebrowser/package.json b/packages/filebrowser/package.json index fe7353535e41..7702a0281903 100644 --- a/packages/filebrowser/package.json +++ b/packages/filebrowser/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/filebrowser", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - FileBrowser Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,15 +42,15 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -64,7 +64,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/filebrowser/src/browser.ts b/packages/filebrowser/src/browser.ts index cc280bd3133b..cc14df63cf94 100644 --- a/packages/filebrowser/src/browser.ts +++ b/packages/filebrowser/src/browser.ts @@ -2,6 +2,7 @@ // Distributed under the terms of the Modified BSD License. import { showErrorMessage } from '@jupyterlab/apputils'; +import { PathExt } from '@jupyterlab/coreutils'; import { IDocumentManager } from '@jupyterlab/docmanager'; import { Contents, ServerConnection } from '@jupyterlab/services'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; @@ -252,6 +253,11 @@ export class FileBrowser extends SidePanel { private async _createNew( options: Contents.ICreateOptions ): Promise { + // normalize the path if the file is created from a custom drive + if (options.path) { + const localPath = this._manager.services.contents.localPath(options.path); + options.path = this._toDrivePath(this.model.driveName, localPath); + } try { const model = await this._manager.newUntitled(options); await this.listing.selectItemByName(model.name, true); @@ -403,6 +409,23 @@ export class FileBrowser extends SidePanel { } } + /** + * Given a drive name and a local path, return the full + * drive path which includes the drive name and the local path. + * + * @param driveName: the name of the drive + * @param localPath: the local path on the drive. + * + * @returns the full drive path + */ + private _toDrivePath(driveName: string, localPath: string): string { + if (driveName === '') { + return localPath; + } else { + return `${driveName}:${PathExt.removeSlash(localPath)}`; + } + } + protected listing: DirListing; protected crumbs: BreadCrumbs; protected mainPanel: Panel; diff --git a/packages/filebrowser/src/listing.ts b/packages/filebrowser/src/listing.ts index c5a60b830970..050a4094e02a 100644 --- a/packages/filebrowser/src/listing.ts +++ b/packages/filebrowser/src/listing.ts @@ -647,6 +647,28 @@ export class DirListing extends Widget { * @returns A promise that resolves when the name is selected. */ async selectItemByName(name: string, focus: boolean = false): Promise { + return this._selectItemByName(name, focus); + } + + /** + * Select an item by name. + * + * @param name - The name of the item to select. + * @param focus - Whether to move focus to the selected item. + * @param force - Whether to proceed with selection even if the file was already selected. + * + * @returns A promise that resolves when the name is selected. + */ + private async _selectItemByName( + name: string, + focus: boolean = false, + force: boolean = false + ): Promise { + if (!force && this.isSelected(name)) { + // Avoid API polling and DOM updates if already selected + return; + } + // Make sure the file is available. await this.model.refresh(); @@ -662,7 +684,6 @@ export class DirListing extends Widget { MessageLoop.sendMessage(this, Widget.Msg.UpdateRequest); ElementExt.scrollIntoViewIfNeeded(this.contentNode, this._items[index]); } - /** * Handle the DOM events for the directory listing. * @@ -1935,7 +1956,7 @@ export class DirListing extends Widget { this.selection[item.path] ) { try { - await this.selectItemByName(finalFilename, true); + await this._selectItemByName(finalFilename, true, true); } catch { // do nothing console.warn('After rename, failed to select file', finalFilename); diff --git a/packages/filebrowser/style/base.css b/packages/filebrowser/style/base.css index 8a69e1f9c1b2..9247008308ae 100644 --- a/packages/filebrowser/style/base.css +++ b/packages/filebrowser/style/base.css @@ -276,17 +276,23 @@ user-select: none; } -.jp-DirListing-itemText:focus { +.jp-DirListing-item:has(.jp-DirListing-itemText:focus-visible) { + /* Targeting `.jp-DirListing-itemText` specifically to avoid an extra outline + when it gets replaced with `jp-DirListing-editor` when editing the file name */ outline-width: 2px; outline-color: var(--jp-inverse-layout-color1); outline-style: solid; - outline-offset: 1px; + outline-offset: -4px; } -.jp-DirListing-item.jp-mod-selected .jp-DirListing-itemText:focus { +.jp-DirListing-item.jp-mod-selected:focus-within { outline-color: var(--jp-layout-color1); } +.jp-DirListing-item > .jp-DirListing-itemText:focus { + outline: 0; +} + .jp-DirListing-itemModified { flex: 0 0 125px; text-align: right; diff --git a/packages/filebrowser/test/browser.spec.ts b/packages/filebrowser/test/browser.spec.ts index eeb89e5bfa15..9e1244661aee 100644 --- a/packages/filebrowser/test/browser.spec.ts +++ b/packages/filebrowser/test/browser.spec.ts @@ -10,6 +10,7 @@ import { DocumentManager, IDocumentManager } from '@jupyterlab/docmanager'; import { DocumentRegistry, TextModelFactory } from '@jupyterlab/docregistry'; import { ServiceManager } from '@jupyterlab/services'; import { signalToPromise } from '@jupyterlab/testing'; +import { Drive } from '@jupyterlab/services'; import { ServiceManagerMock } from '@jupyterlab/services/lib/testutils'; import { DocumentWidgetOpenerMock } from '@jupyterlab/docregistry/lib/testutils'; import { simulate } from 'simulate-event'; @@ -130,3 +131,67 @@ describe('filebrowser/browser', () => { }); }); }); + +describe('FileBrowser with Drives', () => { + const DRIVE_NAME = 'TestDrive'; + let fileBrowser: TestFileBrowser; + let manager: IDocumentManager; + let serviceManager: ServiceManager.IManager; + let registry: DocumentRegistry; + let model: FilterFileBrowserModel; + + beforeAll(async () => { + const opener = new DocumentWidgetOpenerMock(); + + registry = new DocumentRegistry({ + textModelFactory: new TextModelFactory() + }); + serviceManager = new ServiceManagerMock(); + manager = new DocumentManager({ + registry, + opener, + manager: serviceManager + }); + + const drive = new Drive({ + name: DRIVE_NAME, + serverSettings: serviceManager.serverSettings + }); + serviceManager.contents.addDrive(drive); + model = new FilterFileBrowserModel({ manager, driveName: drive.name }); + }); + + beforeEach(() => { + const options: FileBrowser.IOptions = { + model, + id: '' + }; + fileBrowser = new TestFileBrowser(options); + Widget.attach(fileBrowser, document.body); + }); + + describe('#createNewFile', () => { + it('should create the file in the drive', async () => { + const created = fileBrowser.createNewFile({ ext: '.txt' }); + await signalToPromise(fileBrowser.renameCalled); + const editNode = document.querySelector(`.${EDITOR_CLASS}`); + if (!editNode) { + throw new Error('Edit node not found'); + } + const itemNode = Array.from( + document.querySelectorAll(`.${ITEM_CLASS}`) + ).find(el => { + return el.contains(editNode); + }); + if (!itemNode) { + throw new Error('Item node not found'); + } + simulate(editNode, 'keydown', { + keyCode: 13, + key: 'Enter' + }); + const fileModel = await created; + expect(fileModel.path).toContain(DRIVE_NAME); + }); + }); +}); diff --git a/packages/filebrowser/test/listing.spec.ts b/packages/filebrowser/test/listing.spec.ts index 71f89ac70a40..9a2f88650d91 100644 --- a/packages/filebrowser/test/listing.spec.ts +++ b/packages/filebrowser/test/listing.spec.ts @@ -7,7 +7,7 @@ import { DocumentManager } from '@jupyterlab/docmanager'; import { DocumentRegistry } from '@jupyterlab/docregistry'; import { DocumentWidgetOpenerMock } from '@jupyterlab/docregistry/lib/testutils'; import { ServiceManagerMock } from '@jupyterlab/services/lib/testutils'; -import { signalToPromise } from '@jupyterlab/testing'; +import { framePromise, signalToPromise } from '@jupyterlab/testing'; import { Signal } from '@lumino/signaling'; import { Widget } from '@lumino/widgets'; import expect from 'expect'; @@ -101,6 +101,42 @@ describe('filebrowser/listing', () => { }); }); + describe('#selectItemByName()', () => { + it('should select item in the current directory by name', async () => { + const name = [...dirListing.sortedItems()][2].name; + expect(dirListing.isSelected(name)).toBe(false); + await dirListing.selectItemByName(name); + expect(dirListing.isSelected(name)).toBe(true); + }); + + it('should trigger update when selecting an item', async () => { + const name = [...dirListing.sortedItems()][2].name; + let updateEmitted = false; + const listener = () => { + updateEmitted = true; + }; + dirListing.updated.connect(listener); + await dirListing.selectItemByName(name); + await framePromise(); + dirListing.updated.disconnect(listener); + expect(updateEmitted).toBe(true); + }); + + it('should be a no-op if the item is already selected', async () => { + const name = [...dirListing.sortedItems()][2].name; + await dirListing.selectItemByName(name); + let updateEmitted = false; + const listener = () => { + updateEmitted = true; + }; + dirListing.updated.connect(listener); + await dirListing.selectItemByName(name); + await framePromise(); + dirListing.updated.disconnect(listener); + expect(updateEmitted).toBe(false); + }); + }); + describe('#rename', () => { it('backspace during rename does not trigger goUp method', async () => { dirListing.selectNext(); diff --git a/packages/fileeditor-extension/package.json b/packages/fileeditor-extension/package.json index 39d6f4d9cc69..a97f0041c9dd 100644 --- a/packages/fileeditor-extension/package.json +++ b/packages/fileeditor-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/fileeditor-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Editor Widget Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -40,28 +40,28 @@ "dependencies": { "@codemirror/commands": "^6.2.3", "@codemirror/search": "^6.3.0", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/fileeditor": "^4.1.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/lsp": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/fileeditor": "^4.1.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/lsp": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", diff --git a/packages/fileeditor-extension/src/commands.ts b/packages/fileeditor-extension/src/commands.ts index 404f3676d7f1..9913c4d6ab73 100644 --- a/packages/fileeditor-extension/src/commands.ts +++ b/packages/fileeditor-extension/src/commands.ts @@ -846,9 +846,8 @@ export namespace Commands { if (!widget) { return false; } - // Ideally enable it when there are undo events stored - // Reference issue #8590: Code mirror editor could expose the history of undo/redo events - return true; + + return widget.editor.model.sharedModel.canUndo(); }, icon: undoIcon.bindprops({ stylesheet: 'menuItem' }), label: trans.__('Undo') @@ -877,9 +876,8 @@ export namespace Commands { if (!widget) { return false; } - // Ideally enable it when there are redo events stored - // Reference issue #8590: Code mirror editor could expose the history of undo/redo events - return true; + + return widget.editor.model.sharedModel.canRedo(); }, icon: redoIcon.bindprops({ stylesheet: 'menuItem' }), label: trans.__('Redo') diff --git a/packages/fileeditor/package.json b/packages/fileeditor/package.json index 87a6db41504a..1e184f6a27e9 100644 --- a/packages/fileeditor/package.json +++ b/packages/fileeditor/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/fileeditor", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Editor Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -41,17 +41,17 @@ }, "dependencies": { "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/lsp": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/lsp": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", @@ -60,7 +60,7 @@ "regexp-match-indices": "^1.0.2" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/fileeditor/src/fileeditorlspadapter.ts b/packages/fileeditor/src/fileeditorlspadapter.ts index c8bccd505e94..7b0245aafc0e 100644 --- a/packages/fileeditor/src/fileeditorlspadapter.ts +++ b/packages/fileeditor/src/fileeditorlspadapter.ts @@ -45,6 +45,9 @@ export class FileEditorAdapter extends WidgetLSPAdapter< .then(async () => { await this.initOnceReady(); this._readyDelegate.resolve(); + this._editorAdded.emit({ + editor: this._virtualEditor + }); }) .catch(console.error); } @@ -151,6 +154,9 @@ export class FileEditorAdapter extends WidgetLSPAdapter< if (this.isDisposed) { return; } + this._editorRemoved.emit({ + editor: this._virtualEditor + }); this.editor.model.mimeTypeChanged.disconnect(this.reloadConnection); super.dispose(); } diff --git a/packages/help-extension/package.json b/packages/help-extension/package.json index f7af7d7de44f..ae2d5b6b02cf 100644 --- a/packages/help-extension/package.json +++ b/packages/help-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/help-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Help Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,13 +38,13 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/signaling": "^2.1.2", "@lumino/virtualdom": "^2.0.1", diff --git a/packages/help-extension/src/index.tsx b/packages/help-extension/src/index.tsx index 37a740139d25..8d001e1b8c9f 100644 --- a/packages/help-extension/src/index.tsx +++ b/packages/help-extension/src/index.tsx @@ -298,11 +298,11 @@ const resources: JupyterFrontEndPlugin = { const resources = [ { text: trans.__('JupyterLab Reference'), - url: 'https://jupyterlab.readthedocs.io/en/latest/' + url: 'https://jupyterlab.readthedocs.io/en/stable/' }, { text: trans.__('JupyterLab FAQ'), - url: 'https://jupyterlab.readthedocs.io/en/latest/getting_started/faq.html' + url: 'https://jupyterlab.readthedocs.io/en/stable/getting_started/faq.html' }, { text: trans.__('Jupyter Reference'), diff --git a/packages/htmlviewer-extension/package.json b/packages/htmlviewer-extension/package.json index 55e1b6890d06..4fa86ad3bc8d 100644 --- a/packages/htmlviewer-extension/package.json +++ b/packages/htmlviewer-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/htmlviewer-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab extension to render HTML files", "keywords": [ "jupyter", @@ -35,14 +35,14 @@ "watch": "tsc -w" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/htmlviewer": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/htmlviewer": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/htmlviewer/package.json b/packages/htmlviewer/package.json index 0d2c22d1a570..fb5975f9f304 100644 --- a/packages/htmlviewer/package.json +++ b/packages/htmlviewer/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/htmlviewer", - "version": "4.1.0", + "version": "4.1.5", "description": "A viewer for HTML documents.", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -33,11 +33,11 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/signaling": "^2.1.2", "@lumino/widgets": "^2.3.1", diff --git a/packages/hub-extension/package.json b/packages/hub-extension/package.json index 001b6133b6b6..257159b41043 100644 --- a/packages/hub-extension/package.json +++ b/packages/hub-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/hub-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab integration for JupyterHub", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -34,11 +34,11 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/imageviewer-extension/package.json b/packages/imageviewer-extension/package.json index 63467ab8d1c2..783bd21c5581 100644 --- a/packages/imageviewer-extension/package.json +++ b/packages/imageviewer-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/imageviewer-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Image Widget Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,11 +38,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/imageviewer": "^4.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/imageviewer": "^4.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/imageviewer/package.json b/packages/imageviewer/package.json index 0041f9d67699..88809dc02425 100644 --- a/packages/imageviewer/package.json +++ b/packages/imageviewer/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/imageviewer", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Image Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,15 +42,15 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/inspector-extension/package.json b/packages/inspector-extension/package.json index dbe4c1f76c26..dd9773684278 100644 --- a/packages/inspector-extension/package.json +++ b/packages/inspector-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/inspector-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Code Inspector Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,14 +38,14 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/inspector": "^4.1.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/inspector": "^4.1.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/widgets": "^2.3.1" }, "devDependencies": { diff --git a/packages/inspector/package.json b/packages/inspector/package.json index d213f818b48a..2e55fb05f85e 100644 --- a/packages/inspector/package.json +++ b/packages/inspector/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/inspector", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Code Inspector", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,13 +42,13 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/polling": "^2.1.2", @@ -56,7 +56,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/javascript-extension/README.md b/packages/javascript-extension/README.md index 0fb96b16f472..bfbb001c3c16 100644 --- a/packages/javascript-extension/README.md +++ b/packages/javascript-extension/README.md @@ -14,4 +14,4 @@ Javascript('alert("hello world");') ## Development -See the [JupyterLab Contributor Documentation](https://github.com/jupyterlab/jupyterlab/blob/main/CONTRIBUTING.md). +See the [JupyterLab Contributor Documentation](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/CONTRIBUTING.md). diff --git a/packages/javascript-extension/package.json b/packages/javascript-extension/package.json index 0783cfb854f7..9ab52ba14ad1 100644 --- a/packages/javascript-extension/package.json +++ b/packages/javascript-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/javascript-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Javascript Renderer", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -33,8 +33,8 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0" + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/json-extension/README.md b/packages/json-extension/README.md index 81c247901c76..6c7280a2af86 100644 --- a/packages/json-extension/README.md +++ b/packages/json-extension/README.md @@ -40,4 +40,4 @@ To render a `.json` file, simply open it: ## Development -See the [JupyterLab Contributor Documentation](https://github.com/jupyterlab/jupyterlab/blob/main/CONTRIBUTING.md). +See the [JupyterLab Contributor Documentation](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/CONTRIBUTING.md). diff --git a/packages/json-extension/package.json b/packages/json-extension/package.json index 81285403a9ef..f7c58bc8c180 100644 --- a/packages/json-extension/package.json +++ b/packages/json-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/json-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - JSON Renderer", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -33,11 +33,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lezer/highlight": "^1.1.4", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", diff --git a/packages/launcher-extension/package.json b/packages/launcher-extension/package.json index c2783f389d6c..c1a0086446c7 100644 --- a/packages/launcher-extension/package.json +++ b/packages/launcher-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/launcher-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Launcher Page Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,12 +38,12 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/widgets": "^2.3.1" diff --git a/packages/launcher/package.json b/packages/launcher/package.json index 360638eaf731..064f5d20ebe9 100644 --- a/packages/launcher/package.json +++ b/packages/launcher/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/launcher", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Launcher Panel", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,9 +37,9 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", diff --git a/packages/logconsole-extension/package.json b/packages/logconsole-extension/package.json index 2e77db4afb48..bf4a05eccfda 100644 --- a/packages/logconsole-extension/package.json +++ b/packages/logconsole-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/logconsole-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Log Console Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -34,15 +34,15 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/logconsole": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/logconsole": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/signaling": "^2.1.2", "@lumino/widgets": "^2.3.1", diff --git a/packages/logconsole/package.json b/packages/logconsole/package.json index 3ec8f3bd0b38..ee106d997671 100644 --- a/packages/logconsole/package.json +++ b/packages/logconsole/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/logconsole", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Log Console", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,12 +38,12 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/outputarea": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/outputarea": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/messaging": "^2.0.1", @@ -51,7 +51,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/lsp-extension/package.json b/packages/lsp-extension/package.json index b901edd7690d..b0c4a8cab65f 100644 --- a/packages/lsp-extension/package.json +++ b/packages/lsp-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/lsp-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -36,13 +36,13 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/lsp": "^4.1.0", - "@jupyterlab/running": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/lsp": "^4.1.5", + "@jupyterlab/running": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/polling": "^2.1.2", "@lumino/signaling": "^2.1.2", diff --git a/packages/lsp/package.json b/packages/lsp/package.json index 234cc4f6e527..901d7c06f49f 100644 --- a/packages/lsp/package.json +++ b/packages/lsp/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/lsp", - "version": "4.1.0", + "version": "4.1.5", "description": "", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -41,13 +41,13 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/signaling": "^2.1.2", @@ -58,7 +58,7 @@ "vscode-ws-jsonrpc": "~1.0.2" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/lodash.mergewith": "^4.6.1", "jest": "^29.2.0", diff --git a/packages/mainmenu-extension/package.json b/packages/mainmenu-extension/package.json index 333b07b52920..df3db7c667e9 100644 --- a/packages/mainmenu-extension/package.json +++ b/packages/mainmenu-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/mainmenu-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Main Menu Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,14 +38,14 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", diff --git a/packages/mainmenu-extension/schema/plugin.json b/packages/mainmenu-extension/schema/plugin.json index 54fee0640a26..c09fa2b5285c 100644 --- a/packages/mainmenu-extension/schema/plugin.json +++ b/packages/mainmenu-extension/schema/plugin.json @@ -270,22 +270,22 @@ { "command": "kernelmenu:interrupt", "keys": ["I", "I"], - "selector": "[data-jp-kernel-user] :focus:not(:read-write)" + "selector": "[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)" }, { "command": "kernelmenu:restart", "keys": ["0", "0"], - "selector": "[data-jp-kernel-user] :focus:not(:read-write)" + "selector": "[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)" }, { "command": "kernelmenu:restart-and-clear", "keys": [""], - "selector": "[data-jp-kernel-user] :focus:not(:read-write)" + "selector": "[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)" }, { "command": "kernelmenu:shutdown", "keys": [""], - "selector": "[data-jp-kernel-user] :focus:not(:read-write)" + "selector": "[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)" }, { "command": "runmenu:restart-and-run-all", diff --git a/packages/mainmenu/package.json b/packages/mainmenu/package.json index 5edcfa797d03..6b99ac33d14d 100644 --- a/packages/mainmenu/package.json +++ b/packages/mainmenu/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/mainmenu", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Main Menu", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,16 +42,16 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/markdownviewer-extension/package.json b/packages/markdownviewer-extension/package.json index 6f35e080d2cb..e4a9f964923f 100644 --- a/packages/markdownviewer-extension/package.json +++ b/packages/markdownviewer-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/markdownviewer-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Markdown Renderer Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,14 +38,14 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/markdownviewer": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/markdownviewer": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/markdownviewer/package.json b/packages/markdownviewer/package.json index d8c6ae02d1a9..2c3ca5971f41 100644 --- a/packages/markdownviewer/package.json +++ b/packages/markdownviewer/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/markdownviewer", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Markdown viewer Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,12 +37,12 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", "@lumino/signaling": "^2.1.2", diff --git a/packages/markedparser-extension/package.json b/packages/markedparser-extension/package.json index 65544d48551a..eb2cdfe54c1b 100644 --- a/packages/markedparser-extension/package.json +++ b/packages/markedparser-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/markedparser-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Markdown parser provider", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -36,11 +36,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/mermaid": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/mermaid": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", "@lumino/coreutils": "^2.1.2", "marked": "^9.1.2", "marked-gfm-heading-id": "^3.1.0", diff --git a/packages/mathjax-extension/package.json b/packages/mathjax-extension/package.json index 0ea9d2c3d98e..db73e1108a25 100644 --- a/packages/mathjax-extension/package.json +++ b/packages/mathjax-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/mathjax-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "A JupyterLab extension providing MathJax Typesetting", "keywords": [ "jupyter", @@ -43,8 +43,8 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", "@lumino/coreutils": "^2.1.2", "mathjax-full": "^3.2.2" }, diff --git a/packages/mermaid-extension/package.json b/packages/mermaid-extension/package.json index 16c0e10d4ec9..a0cdf2c60aac 100644 --- a/packages/mermaid-extension/package.json +++ b/packages/mermaid-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/mermaid-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Mermaid Viewer", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,11 +37,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/mermaid": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/mermaid": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 3786f7ab606f..95f0e0e37ac2 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/mermaid", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Mermaid Renderer", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,9 +42,9 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", "@lumino/coreutils": "^2.1.2", "@lumino/widgets": "^2.3.1", "mermaid": "^10.7.0" diff --git a/packages/metadataform-extension/package.json b/packages/metadataform-extension/package.json index 2dbebfc4d669..8420a3d09fab 100644 --- a/packages/metadataform-extension/package.json +++ b/packages/metadataform-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/metadataform-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "A helper to build form for metadata", "keywords": [ "jupyter", @@ -39,12 +39,12 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/metadataform": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/metadataform": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2" }, "devDependencies": { diff --git a/packages/metadataform/package.json b/packages/metadataform/package.json index f7324ce756c6..789a95cbae87 100644 --- a/packages/metadataform/package.json +++ b/packages/metadataform/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/metadataform", - "version": "4.1.0", + "version": "4.1.5", "description": "A helper to build form for metadata", "keywords": [ "jupyter", @@ -45,12 +45,12 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", "@lumino/widgets": "^2.3.1", @@ -60,7 +60,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/react": "^18.0.26", "jest": "^29.2.0", diff --git a/packages/metapackage/package.json b/packages/metapackage/package.json index 2748f9ee93e9..a39d3f8e743c 100644 --- a/packages/metapackage/package.json +++ b/packages/metapackage/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/metapackage", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Meta Package. All of the packages used by the core JupyterLab application", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,103 +37,103 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/application-extension": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/apputils-extension": "^4.1.0", - "@jupyterlab/attachments": "^4.1.0", - "@jupyterlab/cell-toolbar": "^4.1.0", - "@jupyterlab/cell-toolbar-extension": "^4.1.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/celltags-extension": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/codemirror-extension": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/completer-extension": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/console-extension": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/csvviewer": "^4.1.0", - "@jupyterlab/csvviewer-extension": "^4.1.0", - "@jupyterlab/debugger": "^4.1.0", - "@jupyterlab/debugger-extension": "^4.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docmanager-extension": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/documentsearch-extension": "^4.1.0", - "@jupyterlab/extensionmanager": "^4.1.0", - "@jupyterlab/extensionmanager-extension": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/filebrowser-extension": "^4.1.0", - "@jupyterlab/fileeditor": "^4.1.0", - "@jupyterlab/fileeditor-extension": "^4.1.0", - "@jupyterlab/help-extension": "^4.1.0", - "@jupyterlab/htmlviewer": "^4.1.0", - "@jupyterlab/htmlviewer-extension": "^4.1.0", - "@jupyterlab/hub-extension": "^4.1.0", - "@jupyterlab/imageviewer": "^4.1.0", - "@jupyterlab/imageviewer-extension": "^4.1.0", - "@jupyterlab/inspector": "^4.1.0", - "@jupyterlab/inspector-extension": "^4.1.0", - "@jupyterlab/javascript-extension": "^4.1.0", - "@jupyterlab/json-extension": "^4.1.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/launcher-extension": "^4.1.0", - "@jupyterlab/logconsole": "^4.1.0", - "@jupyterlab/logconsole-extension": "^4.1.0", - "@jupyterlab/lsp": "^4.1.0", - "@jupyterlab/lsp-extension": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/mainmenu-extension": "^4.1.0", - "@jupyterlab/markdownviewer": "^4.1.0", - "@jupyterlab/markdownviewer-extension": "^4.1.0", - "@jupyterlab/markedparser-extension": "^4.1.0", - "@jupyterlab/mathjax-extension": "^4.1.0", - "@jupyterlab/mermaid": "^4.1.0", - "@jupyterlab/mermaid-extension": "^4.1.0", - "@jupyterlab/metadataform": "^4.1.0", - "@jupyterlab/metadataform-extension": "^4.1.0", - "@jupyterlab/nbconvert-css": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/notebook-extension": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/outputarea": "^4.1.0", - "@jupyterlab/pdf-extension": "^4.1.0", - "@jupyterlab/pluginmanager": "^4.1.0", - "@jupyterlab/pluginmanager-extension": "^4.1.0", - "@jupyterlab/property-inspector": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-extension": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/running": "^4.1.0", - "@jupyterlab/running-extension": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingeditor": "^4.1.0", - "@jupyterlab/settingeditor-extension": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/shortcuts-extension": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/statusbar-extension": "^4.1.0", - "@jupyterlab/terminal": "^4.1.0", - "@jupyterlab/terminal-extension": "^4.1.0", - "@jupyterlab/theme-dark-extension": "^4.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/toc-extension": "^6.1.0", - "@jupyterlab/tooltip": "^4.1.0", - "@jupyterlab/tooltip-extension": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/translation-extension": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", - "@jupyterlab/ui-components-extension": "^4.1.0", - "@jupyterlab/vega5-extension": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/application-extension": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/apputils-extension": "^4.1.5", + "@jupyterlab/attachments": "^4.1.5", + "@jupyterlab/cell-toolbar": "^4.1.5", + "@jupyterlab/cell-toolbar-extension": "^4.1.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/celltags-extension": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/codemirror-extension": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/completer-extension": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/console-extension": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/csvviewer": "^4.1.5", + "@jupyterlab/csvviewer-extension": "^4.1.5", + "@jupyterlab/debugger": "^4.1.5", + "@jupyterlab/debugger-extension": "^4.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docmanager-extension": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/documentsearch-extension": "^4.1.5", + "@jupyterlab/extensionmanager": "^4.1.5", + "@jupyterlab/extensionmanager-extension": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/filebrowser-extension": "^4.1.5", + "@jupyterlab/fileeditor": "^4.1.5", + "@jupyterlab/fileeditor-extension": "^4.1.5", + "@jupyterlab/help-extension": "^4.1.5", + "@jupyterlab/htmlviewer": "^4.1.5", + "@jupyterlab/htmlviewer-extension": "^4.1.5", + "@jupyterlab/hub-extension": "^4.1.5", + "@jupyterlab/imageviewer": "^4.1.5", + "@jupyterlab/imageviewer-extension": "^4.1.5", + "@jupyterlab/inspector": "^4.1.5", + "@jupyterlab/inspector-extension": "^4.1.5", + "@jupyterlab/javascript-extension": "^4.1.5", + "@jupyterlab/json-extension": "^4.1.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/launcher-extension": "^4.1.5", + "@jupyterlab/logconsole": "^4.1.5", + "@jupyterlab/logconsole-extension": "^4.1.5", + "@jupyterlab/lsp": "^4.1.5", + "@jupyterlab/lsp-extension": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/mainmenu-extension": "^4.1.5", + "@jupyterlab/markdownviewer": "^4.1.5", + "@jupyterlab/markdownviewer-extension": "^4.1.5", + "@jupyterlab/markedparser-extension": "^4.1.5", + "@jupyterlab/mathjax-extension": "^4.1.5", + "@jupyterlab/mermaid": "^4.1.5", + "@jupyterlab/mermaid-extension": "^4.1.5", + "@jupyterlab/metadataform": "^4.1.5", + "@jupyterlab/metadataform-extension": "^4.1.5", + "@jupyterlab/nbconvert-css": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/notebook-extension": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/outputarea": "^4.1.5", + "@jupyterlab/pdf-extension": "^4.1.5", + "@jupyterlab/pluginmanager": "^4.1.5", + "@jupyterlab/pluginmanager-extension": "^4.1.5", + "@jupyterlab/property-inspector": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-extension": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/running": "^4.1.5", + "@jupyterlab/running-extension": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingeditor": "^4.1.5", + "@jupyterlab/settingeditor-extension": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/shortcuts-extension": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/statusbar-extension": "^4.1.5", + "@jupyterlab/terminal": "^4.1.5", + "@jupyterlab/terminal-extension": "^4.1.5", + "@jupyterlab/theme-dark-extension": "^4.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/toc-extension": "^6.1.5", + "@jupyterlab/tooltip": "^4.1.5", + "@jupyterlab/tooltip-extension": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/translation-extension": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", + "@jupyterlab/ui-components-extension": "^4.1.5", + "@jupyterlab/vega5-extension": "^4.1.5" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "fs-extra": "^10.1.0", "jest": "^29.2.0", diff --git a/packages/metapackage/test/completer/handler.spec.ts b/packages/metapackage/test/completer/handler.spec.ts index 191f94a3bede..5a297e422716 100644 --- a/packages/metapackage/test/completer/handler.spec.ts +++ b/packages/metapackage/test/completer/handler.spec.ts @@ -3,6 +3,7 @@ import { ISessionContext, SessionContext } from '@jupyterlab/apputils'; import { CodeEditorWrapper } from '@jupyterlab/codeeditor'; +import { Signal } from '@lumino/signaling'; import { Completer, CompleterModel, @@ -14,7 +15,7 @@ import { } from '@jupyterlab/completer'; import { createEditorWidget } from '@jupyterlab/completer/lib/testutils'; import { Widget } from '@lumino/widgets'; -import { ISharedText, SourceChange } from '@jupyter/ydoc'; +import { ISharedFile, ISharedText, SourceChange } from '@jupyter/ydoc'; import { createSessionContext } from '@jupyterlab/apputils/lib/testutils'; class TestCompleterModel extends CompleterModel { @@ -217,10 +218,9 @@ describe('@jupyterlab/completer', () => { ); editor.model.sharedModel.setSource('bar'); editor.setCursorPosition({ line: 0, column: 2 }); - // This signal is emitted (again) because the cursor position that - // a natural user would create need to be recreated here. - // (editor.model.value.changed as any).emit({ type: 'set', value: 'bar' }); @todo remove? - (editor.model.sharedModel.changed as any).emit([]); + ( + editor.model.sharedModel.changed as Signal + ).emit({ sourceChange: {} as any }); expect(model.methods).toEqual( expect.arrayContaining(['handleTextChange']) ); @@ -398,6 +398,18 @@ describe('@jupyterlab/completer', () => { ); }); + it('should not trigger on non-source changes to the model', async () => { + provider.triggers.length = 0; + + (handler.editor!.model.sharedModel as ISharedFile).setState( + 'state-variable', + 'new-value' + ); + await new Promise(process.nextTick); + + expect(provider.triggers.length).toEqual(0); + }); + it('should pass context to `shouldShowContinuousHint()`', async () => { handler.editor!.model.sharedModel.setSource('foo.'); await new Promise(process.nextTick); diff --git a/packages/nbconvert-css/package.json b/packages/nbconvert-css/package.json index 0be73cba43ae..052e17c5c3b6 100644 --- a/packages/nbconvert-css/package.json +++ b/packages/nbconvert-css/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/nbconvert-css", - "version": "4.1.0", + "version": "4.1.5", "description": "CSS bundle for the JupyterLab nbconvert template", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -31,13 +31,13 @@ "watch": "webpack --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/outputarea": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/outputarea": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5" }, "devDependencies": { "css-loader": "^6.7.1", diff --git a/packages/nbformat/package.json b/packages/nbformat/package.json index d2c48ad8f63e..6b251e3e4655 100644 --- a/packages/nbformat/package.json +++ b/packages/nbformat/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/nbformat", - "version": "4.1.0", + "version": "4.1.5", "description": "Notebook format interfaces", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -41,7 +41,7 @@ "@lumino/coreutils": "^2.1.2" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/notebook-extension/package.json b/packages/notebook-extension/package.json index b98b2e32170f..529286beca37 100644 --- a/packages/notebook-extension/package.json +++ b/packages/notebook-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/notebook-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Notebook Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,35 +38,35 @@ }, "dependencies": { "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/completer": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/docmanager-extension": "^4.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/filebrowser": "^4.1.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/logconsole": "^4.1.0", - "@jupyterlab/lsp": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/metadataform": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/property-inspector": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/completer": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/docmanager-extension": "^4.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/filebrowser": "^4.1.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/logconsole": "^4.1.5", + "@jupyterlab/lsp": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/metadataform": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/property-inspector": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", diff --git a/packages/notebook-extension/schema/tracker.json b/packages/notebook-extension/schema/tracker.json index 728c606f6ee9..151c08e029c0 100644 --- a/packages/notebook-extension/schema/tracker.json +++ b/packages/notebook-extension/schema/tracker.json @@ -369,62 +369,62 @@ { "command": "notebook:change-cell-to-code", "keys": ["Y"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-heading-1", "keys": ["1"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-heading-2", "keys": ["2"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-heading-3", "keys": ["3"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-heading-4", "keys": ["4"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-heading-5", "keys": ["5"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-heading-6", "keys": ["6"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-markdown", "keys": ["M"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:change-cell-to-raw", "keys": ["R"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:copy-cell", "keys": ["C"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:cut-cell", "keys": ["X"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:delete-cell", "keys": ["D", "D"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:enter-command-mode", @@ -454,123 +454,123 @@ { "command": "notebook:extend-marked-cells-above", "keys": ["Shift ArrowUp"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:extend-marked-cells-above", "keys": ["Shift K"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:extend-marked-cells-top", "keys": ["Shift Home"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:extend-marked-cells-below", "keys": ["Shift ArrowDown"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:extend-marked-cells-bottom", "keys": ["Shift End"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:extend-marked-cells-below", "keys": ["Shift J"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:insert-cell-above", "keys": ["A"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:insert-cell-below", "keys": ["B"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:merge-cells", "keys": ["Shift M"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:merge-cell-above", "keys": ["Ctrl Backspace"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:merge-cell-below", "keys": ["Ctrl Shift M"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cursor-down", "keys": ["ArrowDown"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cursor-down", "keys": ["J"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cursor-up", "keys": ["ArrowUp"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cursor-up", "keys": ["K"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cursor-heading-above-or-collapse", "keys": ["ArrowLeft"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cursor-heading-below-or-expand", "keys": ["ArrowRight"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:insert-heading-above", "keys": ["Shift A"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:insert-heading-below", "keys": ["Shift B"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:collapse-all-headings", "keys": ["Ctrl Shift ArrowLeft"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:expand-all-headings", "keys": ["Ctrl Shift ArrowRight"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:paste-cell-below", "keys": ["V"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:redo-cell-action", "keys": ["Shift Z"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:run-cell", "macKeys": ["Ctrl Enter"], "keys": [], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:run-cell", @@ -581,7 +581,7 @@ { "command": "notebook:run-cell", "keys": ["Accel Enter"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:run-cell", @@ -591,7 +591,7 @@ { "command": "notebook:run-cell-and-insert-below", "keys": ["Alt Enter"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:run-cell-and-insert-below", @@ -611,7 +611,7 @@ { "command": "viewmenu:line-numbering", "keys": ["Shift L"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "viewmenu:match-brackets", @@ -621,7 +621,7 @@ { "command": "notebook:select-all", "keys": ["Accel A"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:split-cell-at-cursor", @@ -631,22 +631,22 @@ { "command": "notebook:undo-cell-action", "keys": ["Z"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:toggle-render-side-by-side-current", "keys": ["Shift R"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cell-up", "keys": ["Ctrl Shift ArrowUp"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" }, { "command": "notebook:move-cell-down", "keys": ["Ctrl Shift ArrowDown"], - "selector": ".jp-Notebook.jp-mod-commandMode :focus:not(:read-write)" + "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" } ], "title": "Notebook", diff --git a/packages/notebook-extension/src/index.ts b/packages/notebook-extension/src/index.ts index bf752f608bc9..8de9debe0c17 100644 --- a/packages/notebook-extension/src/index.ts +++ b/packages/notebook-extension/src/index.ts @@ -48,7 +48,10 @@ import { IDocumentManager } from '@jupyterlab/docmanager'; import { ToolbarItems as DocToolbarItems } from '@jupyterlab/docmanager-extension'; import { DocumentRegistry, IDocumentWidget } from '@jupyterlab/docregistry'; import { ISearchProviderRegistry } from '@jupyterlab/documentsearch'; -import { IDefaultFileBrowser } from '@jupyterlab/filebrowser'; +import { + IDefaultFileBrowser, + IFileBrowserFactory +} from '@jupyterlab/filebrowser'; import { ILauncher } from '@jupyterlab/launcher'; import { ILSPCodeExtractorsManager, @@ -363,7 +366,8 @@ const trackerPlugin: JupyterFrontEndPlugin = { ISettingRegistry, ISessionContextDialogs, ITranslator, - IFormRendererRegistry + IFormRendererRegistry, + IFileBrowserFactory ], activate: activateNotebookHandler, autoStart: true @@ -1594,7 +1598,8 @@ function activateNotebookHandler( settingRegistry: ISettingRegistry | null, sessionDialogs_: ISessionContextDialogs | null, translator_: ITranslator | null, - formRegistry: IFormRendererRegistry | null + formRegistry: IFormRendererRegistry | null, + filebrowserFactory: IFileBrowserFactory | null ): INotebookTracker { const translator = translator_ ?? nullTranslator; const sessionDialogs = @@ -1957,7 +1962,9 @@ function activateNotebookHandler( caption: trans.__('Create a new notebook'), icon: args => (args['isPalette'] ? undefined : notebookIcon), execute: args => { - const cwd = (args['cwd'] as string) || (defaultBrowser?.model.path ?? ''); + const currentBrowser = + filebrowserFactory?.tracker.currentWidget ?? defaultBrowser; + const cwd = (args['cwd'] as string) || (currentBrowser?.model.path ?? ''); const kernelId = (args['kernelId'] as string) || ''; const kernelName = (args['kernelName'] as string) || ''; return createNew(cwd, kernelId, kernelName); diff --git a/packages/notebook/package.json b/packages/notebook/package.json index e9dfd7b8e15c..9d2e84d35327 100644 --- a/packages/notebook/package.json +++ b/packages/notebook/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/notebook", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Notebook", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,23 +42,23 @@ }, "dependencies": { "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/cells": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/codemirror": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/documentsearch": "^4.1.0", - "@jupyterlab/lsp": "^4.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/cells": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/codemirror": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/documentsearch": "^4.1.5", + "@jupyterlab/lsp": "^4.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -72,7 +72,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/notebook/src/actions.tsx b/packages/notebook/src/actions.tsx index d76f74bdc679..c80ba41b8c39 100644 --- a/packages/notebook/src/actions.tsx +++ b/packages/notebook/src/actions.tsx @@ -200,8 +200,9 @@ export namespace NotebookActions { offsets.push(orig.length); + const cellCountAfterSplit = offsets.length - 1; const clones = offsets.slice(0, -1).map((offset, offsetIdx) => { - const { cell_type, metadata } = child.model.sharedModel.toJSON(); + const { cell_type, metadata, outputs } = child.model.sharedModel.toJSON(); return { cell_type, @@ -209,7 +210,11 @@ export namespace NotebookActions { source: orig .slice(offset, offsets[offsetIdx + 1]) .replace(/^\n+/, '') - .replace(/\n+$/, '') + .replace(/\n+$/, ''), + outputs: + offsetIdx === cellCountAfterSplit - 1 && cell_type === 'code' + ? outputs + : undefined }; }); diff --git a/packages/notebook/src/searchprovider.ts b/packages/notebook/src/searchprovider.ts index c1166118bb2d..9a79d00c174a 100644 --- a/packages/notebook/src/searchprovider.ts +++ b/packages/notebook/src/searchprovider.ts @@ -9,10 +9,7 @@ import { ICellModel, MarkdownCell } from '@jupyterlab/cells'; -import { - CodeMirrorEditor, - IHighlightAdjacentMatchOptions -} from '@jupyterlab/codemirror'; +import { IHighlightAdjacentMatchOptions } from '@jupyterlab/codemirror'; import { CodeEditor } from '@jupyterlab/codeeditor'; import { IChangedArgs } from '@jupyterlab/coreutils'; import { @@ -286,16 +283,8 @@ export class NotebookSearchProvider extends SearchProvider { * @returns Initial value used to populate the search box. */ getInitialQuery(): string { - const activeCell = this.widget.content.activeCell; - const editor = activeCell?.editor as CodeMirrorEditor | undefined; - if (!editor) { - return ''; - } - const selection = editor.state.sliceDoc( - editor.state.selection.main.from, - editor.state.selection.main.to - ); - return selection; + // Get whatever is selected in the browser window. + return window.getSelection()?.toString() || ''; } /** diff --git a/packages/notebook/src/widget.ts b/packages/notebook/src/widget.ts index 01280e7ae282..e125fa64176b 100644 --- a/packages/notebook/src/widget.ts +++ b/packages/notebook/src/widget.ts @@ -1,6 +1,7 @@ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. +import { DOMUtils } from '@jupyterlab/apputils'; import { Cell, CodeCell, @@ -92,6 +93,14 @@ const OTHER_SELECTED_CLASS = 'jp-mod-multiSelected'; */ const UNCONFINED_CLASS = 'jp-mod-unconfined'; +/** + * The class name added to the notebook when an element within it is focused + * and takes keyboard input, such as focused or
. + * + * This class is also effective when the focused element is in shadow DOM. + */ +const READ_WRITE_CLASS = 'jp-mod-readWrite'; + /** * The class name added to drag images. */ @@ -1334,7 +1343,7 @@ export class Notebook extends StaticNotebook { ...options }); // Allow the node to scroll while dragging items. - this.node.setAttribute('data-lm-dragscroll', 'true'); + this.outerNode.setAttribute('data-lm-dragscroll', 'true'); this.activeCellChanged.connect(this._updateSelectedCells, this); this.jumped.connect((_, index: number) => (this.activeCellIndex = index)); this.selectionChanged.connect(this._updateSelectedCells, this); @@ -2771,10 +2780,21 @@ export class Notebook extends StaticNotebook { }); } + /** + * Update the notebook node with class indicating read-write state. + */ + private _updateReadWrite(): void { + const inReadWrite = DOMUtils.hasActiveEditableElement(this.node); + this.node.classList.toggle(READ_WRITE_CLASS, inReadWrite); + } + /** * Handle `focus` events for the widget. */ private _evtFocusIn(event: FocusEvent): void { + // Update read-write class state. + this._updateReadWrite(); + const target = event.target as HTMLElement; const index = this._findCell(target); if (index !== -1) { @@ -2829,7 +2849,10 @@ export class Notebook extends StaticNotebook { /** * Handle `focusout` events for the notebook. */ - private _evtFocusOut(event: MouseEvent): void { + private _evtFocusOut(event: FocusEvent): void { + // Update read-write class state. + this._updateReadWrite(); + const relatedTarget = event.relatedTarget as HTMLElement; // Bail if the window is losing focus, to preserve edit mode. This test diff --git a/packages/notebook/test/actions.spec.ts b/packages/notebook/test/actions.spec.ts index d4f230c89e6d..8f2b66529bad 100644 --- a/packages/notebook/test/actions.spec.ts +++ b/packages/notebook/test/actions.spec.ts @@ -3,7 +3,12 @@ import { ISessionContext, SessionContext } from '@jupyterlab/apputils'; import { createSessionContext } from '@jupyterlab/apputils/lib/testutils'; -import { CodeCell, MarkdownCell, RawCell } from '@jupyterlab/cells'; +import { + CodeCell, + ICodeCellModel, + MarkdownCell, + RawCell +} from '@jupyterlab/cells'; import { CodeEditor } from '@jupyterlab/codeeditor'; import { CellType, IMimeBundle } from '@jupyterlab/nbformat'; import { @@ -190,6 +195,32 @@ describe('@jupyterlab/notebook', () => { ); }); + it('should preserve all outputs in the second cell', async () => { + const cell = widget.activeCell as CodeCell; + // Produce two outputs (note, first will be `text/plain`, + // while second will be `application/vnd.jupyter.stdout`, + // which guarantees these will not be merged). + const index = widget.activeCellIndex; + const source = 'print(1)\ndisplay(2)'; + cell.model.sharedModel.setSource(source); + + // Should populate outputs + await NotebookActions.run(widget, ipySessionContext); + expect(cell.model.outputs).toHaveLength(2); + + // Split cell + const editor = cell.editor as CodeEditor.IEditor; + editor.setCursorPosition(editor.getPositionAt(9)!); + NotebookActions.splitCell(widget); + + // The output should now be only in the second cell + const cells = widget.model!.cells; + const first = cells.get(index) as ICodeCellModel; + const second = cells.get(index + 1) as ICodeCellModel; + expect(first.outputs).toHaveLength(0); + expect(second.outputs).toHaveLength(2); + }); + it('should clear the existing selection', () => { for (const child of widget.widgets) { widget.select(child); diff --git a/packages/notebook/test/searchprovider.spec.ts b/packages/notebook/test/searchprovider.spec.ts index 80893b2366d5..f6ff54451603 100644 --- a/packages/notebook/test/searchprovider.spec.ts +++ b/packages/notebook/test/searchprovider.spec.ts @@ -214,6 +214,31 @@ describe('@jupyterlab/notebook', () => { expect(provider.currentMatchIndex).toBe(0); }); + it('should start in the middle of a code cell, replace, and highlight next', async () => { + panel.model!.sharedModel.deleteCellRange(0, 2); + panel.model!.sharedModel.insertCells(0, [ + { cell_type: 'code', source: 'test1 test2 test3' } + ]); + panel.content.activeCellIndex = 0; + await provider.cellChangeHandled; + panel.content.mode = 'edit'; + + // Pick the spot before the second element. + await panel.content.activeCell!.editor!.setCursorPosition({ + line: 0, + column: 'test1 '.length + }); + + await provider.startQuery(/test\d/, { selection: true }); + + expect(provider.currentMatchIndex).toBe(1); + let replaced = await provider.replaceCurrentMatch('bar'); + expect(replaced).toBe(true); + const source = panel.model!.cells.get(0).sharedModel.getSource(); + expect(source).toBe('test1 bar test3'); + expect(provider.currentMatchIndex).toBe(1); + }); + it('should substitute groups in regular expressions', async () => { await provider.startQuery(/test(\d)/, undefined); expect(provider.currentMatchIndex).toBe(0); diff --git a/packages/observables/package.json b/packages/observables/package.json index 7c407b9ef254..99a1b1c9cd4c 100644 --- a/packages/observables/package.json +++ b/packages/observables/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/observables", - "version": "5.1.0", + "version": "5.1.5", "description": "Data structures which may be observed for changes.", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -44,7 +44,7 @@ "@lumino/signaling": "^2.1.2" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/outputarea/package.json b/packages/outputarea/package.json index 58cbb10d9ab8..da11f98d1640 100644 --- a/packages/outputarea/package.json +++ b/packages/outputarea/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/outputarea", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Notebook Output Area", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,13 +42,13 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -58,7 +58,7 @@ "@lumino/widgets": "^2.3.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/pdf-extension/package.json b/packages/pdf-extension/package.json index d3ddbd60cc69..51f4e24c5431 100644 --- a/packages/pdf-extension/package.json +++ b/packages/pdf-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/pdf-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - PDF Viewer", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,7 +37,7 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/rendermime-interfaces": "^3.9.0", + "@jupyterlab/rendermime-interfaces": "^3.9.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/widgets": "^2.3.1" diff --git a/packages/pluginmanager-extension/package.json b/packages/pluginmanager-extension/package.json index 6454d40870c8..293e9adc97d8 100644 --- a/packages/pluginmanager-extension/package.json +++ b/packages/pluginmanager-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/pluginmanager-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "Enable/disable plugins from user interface", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -35,11 +35,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/pluginmanager": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/pluginmanager": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2" }, "devDependencies": { diff --git a/packages/pluginmanager/package.json b/packages/pluginmanager/package.json index e887bb874c07..50e37765c8be 100644 --- a/packages/pluginmanager/package.json +++ b/packages/pluginmanager/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/pluginmanager", - "version": "4.1.0", + "version": "4.1.5", "description": "List, enable or disable individual plugins.", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -39,19 +39,19 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/signaling": "^2.1.2", "@lumino/widgets": "^2.3.1", "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/property-inspector/package.json b/packages/property-inspector/package.json index b0cf6d43eedf..bf7b96cfe5b2 100644 --- a/packages/property-inspector/package.json +++ b/packages/property-inspector/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/property-inspector", - "version": "4.1.0", + "version": "4.1.5", "description": "A property inspector display for widgets", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -34,9 +34,9 @@ "watch": "tsc -w --listEmittedFiles" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/signaling": "^2.1.2", diff --git a/packages/rendermime-extension/package.json b/packages/rendermime-extension/package.json index a53a6e734ad6..6f06ce348dd3 100644 --- a/packages/rendermime-extension/package.json +++ b/packages/rendermime-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/rendermime-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "A rendermime extension for JupyterLab", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -34,11 +34,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/docmanager": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/docmanager": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/rendermime-interfaces/package.json b/packages/rendermime-interfaces/package.json index 76ce6d8e4f67..597b8ddd5a85 100644 --- a/packages/rendermime-interfaces/package.json +++ b/packages/rendermime-interfaces/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/rendermime-interfaces", - "version": "3.9.0", + "version": "3.9.5", "description": "JupyterLab - Interfaces for Mime Renderers", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { diff --git a/packages/rendermime/package.json b/packages/rendermime/package.json index 8612638e520d..4c75e0affe5f 100644 --- a/packages/rendermime/package.json +++ b/packages/rendermime/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/rendermime", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - RenderMime", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,13 +42,13 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", "@lumino/signaling": "^2.1.2", @@ -56,7 +56,7 @@ "lodash.escape": "^4.0.1" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/lodash.escape": "^4.0.6", "fs-extra": "^10.1.0", diff --git a/packages/rendermime/src/widgets.ts b/packages/rendermime/src/widgets.ts index 879dcd94af46..78eb93aa55cf 100644 --- a/packages/rendermime/src/widgets.ts +++ b/packages/rendermime/src/widgets.ts @@ -184,7 +184,7 @@ export class RenderedHTML extends RenderedHTMLCommon { * @returns A promise which resolves when rendering is complete. */ render(model: IRenderMime.IMimeModel): Promise { - return renderers.renderHTML({ + return (this._rendered = renderers.renderHTML({ host: this.node, source: String(model.data[this.mimeType]), trusted: model.trusted, @@ -194,17 +194,24 @@ export class RenderedHTML extends RenderedHTMLCommon { shouldTypeset: this.isAttached, latexTypesetter: this.latexTypesetter, translator: this.translator - }); + })); } /** * A message handler invoked on an `'after-attach'` message. */ onAfterAttach(msg: Message): void { - if (this.latexTypesetter) { - this.latexTypesetter.typeset(this.node); - } + this._rendered + .then(() => { + if (this.latexTypesetter) { + this.latexTypesetter.typeset(this.node); + } + }) + .catch(console.warn); } + + // A promise which resolves when most recent rendering is complete. + private _rendered: Promise = Promise.resolve(); } /** @@ -229,22 +236,29 @@ export class RenderedLatex extends RenderedCommon { * @returns A promise which resolves when rendering is complete. */ render(model: IRenderMime.IMimeModel): Promise { - return renderers.renderLatex({ + return (this._rendered = renderers.renderLatex({ host: this.node, source: String(model.data[this.mimeType]), shouldTypeset: this.isAttached, latexTypesetter: this.latexTypesetter - }); + })); } /** * A message handler invoked on an `'after-attach'` message. */ onAfterAttach(msg: Message): void { - if (this.latexTypesetter) { - this.latexTypesetter.typeset(this.node); - } + this._rendered + .then(() => { + if (this.latexTypesetter) { + this.latexTypesetter.typeset(this.node); + } + }) + .catch(console.warn); } + + // A promise which resolves when most recent rendering is complete. + private _rendered: Promise = Promise.resolve(); } /** @@ -306,7 +320,7 @@ export class RenderedMarkdown extends RenderedHTMLCommon { * @returns A promise which resolves when rendering is complete. */ render(model: IRenderMime.IMimeModel): Promise { - return renderers.renderMarkdown({ + return (this._rendered = renderers.renderMarkdown({ host: this.node, source: String(model.data[this.mimeType]), trusted: model.trusted, @@ -317,7 +331,7 @@ export class RenderedMarkdown extends RenderedHTMLCommon { latexTypesetter: this.latexTypesetter, markdownParser: this.markdownParser, translator: this.translator - }); + })); } /** @@ -335,10 +349,17 @@ export class RenderedMarkdown extends RenderedHTMLCommon { * A message handler invoked on an `'after-attach'` message. */ onAfterAttach(msg: Message): void { - if (this.latexTypesetter) { - this.latexTypesetter.typeset(this.node); - } + this._rendered + .then(() => { + if (this.latexTypesetter) { + this.latexTypesetter.typeset(this.node); + } + }) + .catch(console.warn); } + + // A promise which resolves when most recent rendering is complete. + private _rendered: Promise = Promise.resolve(); } /** @@ -366,23 +387,30 @@ export class RenderedSVG extends RenderedCommon { const metadata = model.metadata[this.mimeType] as | ReadonlyJSONObject | undefined; - return renderers.renderSVG({ + return (this._rendered = renderers.renderSVG({ host: this.node, source: String(model.data[this.mimeType]), trusted: model.trusted, unconfined: metadata && (metadata.unconfined as boolean | undefined), translator: this.translator - }); + })); } /** * A message handler invoked on an `'after-attach'` message. */ onAfterAttach(msg: Message): void { - if (this.latexTypesetter) { - this.latexTypesetter.typeset(this.node); - } + this._rendered + .then(() => { + if (this.latexTypesetter) { + this.latexTypesetter.typeset(this.node); + } + }) + .catch(console.warn); } + + // A promise which resolves when most recent rendering is complete. + private _rendered: Promise = Promise.resolve(); } /** diff --git a/packages/running-extension/package.json b/packages/running-extension/package.json index a5baa31ab78d..7a8c7963bfd7 100644 --- a/packages/running-extension/package.json +++ b/packages/running-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/running-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Running Sessions Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,14 +38,14 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/running": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/running": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/polling": "^2.1.2", "@lumino/signaling": "^2.1.2", diff --git a/packages/running/package.json b/packages/running/package.json index c960f3390c58..339f2d7714a0 100644 --- a/packages/running/package.json +++ b/packages/running/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/running", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Running Sessions Panel", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,9 +37,9 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/messaging": "^2.0.1", diff --git a/packages/services/README.md b/packages/services/README.md index fb1ecb90a920..0a2834cef8a8 100644 --- a/packages/services/README.md +++ b/packages/services/README.md @@ -2,7 +2,7 @@ Javascript client for the Jupyter services REST APIs -[API Docs](https://jupyterlab.readthedocs.io/en/latest/api/) +[API Docs](https://jupyterlab.readthedocs.io/en/stable/api/) [REST API Docs](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml) diff --git a/packages/services/examples/browser/package.json b/packages/services/examples/browser/package.json index d80b8861c5d8..49e5429883b6 100644 --- a/packages/services/examples/browser/package.json +++ b/packages/services/examples/browser/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-services-browser", - "version": "4.1.0", + "version": "4.1.5", "private": true, "files": [ "lib/*.{d.ts,js,js.map}" @@ -10,8 +10,8 @@ "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo" }, "dependencies": { - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/services": "^7.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/services": "^7.1.5", "@lumino/coreutils": "^2.1.2" }, "devDependencies": { diff --git a/packages/services/examples/node/package.json b/packages/services/examples/node/package.json index 67050d5e8ddf..4874ae1ac014 100644 --- a/packages/services/examples/node/package.json +++ b/packages/services/examples/node/package.json @@ -1,13 +1,13 @@ { "name": "node-example", - "version": "4.1.0", + "version": "4.1.5", "private": true, "scripts": { "clean": "rimraf node_modules", "update": "rimraf node_modules/@jupyterlab/services && npm install" }, "dependencies": { - "@jupyterlab/services": "^7.1.0", + "@jupyterlab/services": "^7.1.5", "ws": "^8.11.0" }, "devDependencies": { diff --git a/packages/services/examples/typescript-browser-with-output/package.json b/packages/services/examples/typescript-browser-with-output/package.json index 5d02154f260e..515473b7783d 100644 --- a/packages/services/examples/typescript-browser-with-output/package.json +++ b/packages/services/examples/typescript-browser-with-output/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-services-outputarea", - "version": "4.1.0", + "version": "4.1.5", "private": true, "sideEffects": [ "style/*" @@ -16,10 +16,10 @@ "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo" }, "dependencies": { - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/outputarea": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0" + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/outputarea": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5" }, "devDependencies": { "css-loader": "^6.7.1", diff --git a/packages/services/package.json b/packages/services/package.json index 1957cc0d5e0a..fdee0c92e382 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/services", - "version": "7.1.0", + "version": "7.1.5", "description": "Client APIs for the Jupyter services REST APIs", "keywords": [ "jupyter", @@ -47,10 +47,10 @@ }, "dependencies": { "@jupyter/ydoc": "^1.1.1", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/polling": "^2.1.2", @@ -59,7 +59,7 @@ "ws": "^8.11.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/ws": "^8.5.3", "jest": "^29.2.0", diff --git a/packages/services/src/config/index.ts b/packages/services/src/config/index.ts index 176f4d601bfa..a9ea28916683 100644 --- a/packages/services/src/config/index.ts +++ b/packages/services/src/config/index.ts @@ -104,7 +104,7 @@ class DefaultConfigSection implements IConfigSection { * Load the initial data for this section. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config). * * The promise is fulfilled on a valid response and rejected otherwise. */ @@ -125,7 +125,7 @@ class DefaultConfigSection implements IConfigSection { * Modify the stored config values. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config). * * The promise is fulfilled on a valid response and rejected otherwise. * @@ -181,7 +181,7 @@ export class ConfigWithDefaults { * Set a config value. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config). * * The promise is fulfilled on a valid response and rejected otherwise. * diff --git a/packages/services/src/contents/index.ts b/packages/services/src/contents/index.ts index 1ef17cd1056d..98fdab702afc 100644 --- a/packages/services/src/contents/index.ts +++ b/packages/services/src/contents/index.ts @@ -1127,7 +1127,7 @@ export class Drive implements Contents.IDrive { * * @returns A promise which resolves with the file content. * - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async get( localPath: string, @@ -1169,7 +1169,13 @@ export class Drive implements Contents.IDrive { getDownloadUrl(localPath: string): Promise { const baseUrl = this.serverSettings.baseUrl; let url = URLExt.join(baseUrl, FILES_URL, URLExt.encodeParts(localPath)); - const xsrfTokenMatch = document.cookie.match('\\b_xsrf=([^;]*)\\b'); + let cookie = ''; + try { + cookie = document.cookie; + } catch (e) { + // e.g. SecurityError in case of CSP Sandbox + } + const xsrfTokenMatch = cookie.match('\\b_xsrf=([^;]*)\\b'); if (xsrfTokenMatch) { const fullUrl = new URL(url); fullUrl.searchParams.append('_xsrf', xsrfTokenMatch[1]); @@ -1187,7 +1193,7 @@ export class Drive implements Contents.IDrive { * file is created. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async newUntitled( options: Contents.ICreateOptions = {} @@ -1229,7 +1235,7 @@ export class Drive implements Contents.IDrive { * @returns A promise which resolves when the file is deleted. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). */ async delete(localPath: string): Promise { const url = this._getUrl(localPath); @@ -1260,7 +1266,7 @@ export class Drive implements Contents.IDrive { * the file is renamed. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async rename( oldLocalPath: string, @@ -1300,7 +1306,7 @@ export class Drive implements Contents.IDrive { * #### Notes * Ensure that `model.content` is populated for the file. * - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async save( localPath: string, @@ -1341,7 +1347,7 @@ export class Drive implements Contents.IDrive { * #### Notes * The server will select the name of the copied file. * - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async copy(fromFile: string, toDir: string): Promise { const settings = this.serverSettings; @@ -1374,7 +1380,7 @@ export class Drive implements Contents.IDrive { * checkpoint is created. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async createCheckpoint( localPath: string @@ -1404,7 +1410,7 @@ export class Drive implements Contents.IDrive { * the file. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model. */ async listCheckpoints( localPath: string @@ -1439,7 +1445,7 @@ export class Drive implements Contents.IDrive { * @returns A promise which resolves when the checkpoint is restored. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). */ async restoreCheckpoint( localPath: string, @@ -1468,7 +1474,7 @@ export class Drive implements Contents.IDrive { * @returns A promise which resolves when the checkpoint is deleted. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). */ async deleteCheckpoint( localPath: string, @@ -1543,7 +1549,7 @@ export namespace Drive { /** * A REST endpoint for drive requests. * If not given, defaults to the Jupyter - * REST API given by [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). + * REST API given by [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents). */ apiEndpoint?: string; } diff --git a/packages/services/src/kernel/default.ts b/packages/services/src/kernel/default.ts index 4b5877f4d52e..125b69a89190 100644 --- a/packages/services/src/kernel/default.ts +++ b/packages/services/src/kernel/default.ts @@ -439,7 +439,7 @@ export class KernelConnection implements Kernel.IKernelConnection { * Interrupt a kernel. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). * * The promise is fulfilled on a valid response and rejected otherwise. * @@ -460,7 +460,7 @@ export class KernelConnection implements Kernel.IKernelConnection { * Request a kernel restart. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) * and validates the response model. * * Any existing Future or Comm objects are cleared once the kernel has @@ -528,7 +528,7 @@ export class KernelConnection implements Kernel.IKernelConnection { * Shutdown a kernel. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). * * The promise is fulfilled on a valid response and rejected otherwise. * diff --git a/packages/services/src/kernel/kernel.ts b/packages/services/src/kernel/kernel.ts index 2e4655f3f8de..abe443fa250a 100644 --- a/packages/services/src/kernel/kernel.ts +++ b/packages/services/src/kernel/kernel.ts @@ -175,7 +175,7 @@ export interface IKernelConnection extends IObservableDisposable { * @returns A promise that resolves when the kernel has interrupted. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). * * The promise is fulfilled on a valid response and rejected otherwise. * @@ -192,7 +192,7 @@ export interface IKernelConnection extends IObservableDisposable { * @returns A promise that resolves when the kernel has restarted. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * Any existing Future or Comm objects are cleared. * diff --git a/packages/services/src/kernel/restapi.ts b/packages/services/src/kernel/restapi.ts index 01920fe94aa0..f2399cc1f3d8 100644 --- a/packages/services/src/kernel/restapi.ts +++ b/packages/services/src/kernel/restapi.ts @@ -9,7 +9,7 @@ import { validateModel, validateModels } from './validate'; * The kernel model provided by the server. * * #### Notes - * See the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). + * See the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). */ export interface IModel { /** @@ -62,7 +62,7 @@ export const KERNEL_SERVICE_URL = 'api/kernels'; * @returns A promise that resolves with the list of running kernels. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ @@ -88,7 +88,7 @@ export async function listRunning( * @returns A promise that resolves with a kernel connection object. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ @@ -120,7 +120,7 @@ export type IKernelOptions = Partial>; * Restart a kernel. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response (and thus after a restart) and rejected otherwise. */ @@ -149,7 +149,7 @@ export async function restartKernel( * Interrupt a kernel. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ @@ -182,7 +182,7 @@ export async function interruptKernel( * * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ @@ -210,7 +210,7 @@ export async function shutdownKernel( * Get a full kernel model from the server by kernel id string. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ diff --git a/packages/services/src/kernelspec/restapi.ts b/packages/services/src/kernelspec/restapi.ts index 169190f6e5ed..2e06a20f3c00 100644 --- a/packages/services/src/kernelspec/restapi.ts +++ b/packages/services/src/kernelspec/restapi.ts @@ -21,7 +21,7 @@ const KERNELSPEC_SERVICE_URL = 'api/kernelspecs'; * @returns A promise that resolves with the kernel specs. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernelspecs). + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernelspecs). */ export async function getSpecs( settings: ServerConnection.ISettings = ServerConnection.makeSettings() @@ -83,7 +83,7 @@ export interface ISpecModel extends PartialJSONObject { * The available kernelSpec models. * * #### Notes - * See the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernelspecs). + * See the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernelspecs). */ export interface ISpecModels extends PartialJSONObject { /** diff --git a/packages/services/src/serverconnection.ts b/packages/services/src/serverconnection.ts index 01d799112586..b162c81ba1c9 100644 --- a/packages/services/src/serverconnection.ts +++ b/packages/services/src/serverconnection.ts @@ -306,7 +306,7 @@ namespace Private { authenticated = true; request.headers.append('Authorization', `token ${settings.token}`); } - if (typeof document !== 'undefined' && document?.cookie) { + if (typeof document !== 'undefined') { const xsrfToken = getCookie('_xsrf'); if (xsrfToken !== undefined) { authenticated = true; @@ -334,7 +334,14 @@ namespace Private { */ function getCookie(name: string): string | undefined { // From http://www.tornadoweb.org/en/stable/guide/security.html - const matches = document.cookie.match('\\b' + name + '=([^;]*)\\b'); + let cookie = ''; + try { + cookie = document.cookie; + } catch (e) { + // e.g. SecurityError in case of CSP Sandbox + return; + } + const matches = cookie.match('\\b' + name + '=([^;]*)\\b'); return matches?.[1]; } } diff --git a/packages/services/src/session/default.ts b/packages/services/src/session/default.ts index 448ed71b42b1..05ffeb314043 100644 --- a/packages/services/src/session/default.ts +++ b/packages/services/src/session/default.ts @@ -290,7 +290,7 @@ export class SessionConnection implements Session.ISessionConnection { * @returns - The promise fulfilled on a valid response from the server. * * #### Notes - * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions), and validates the response. + * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions), and validates the response. * Disposes of the session and emits a [sessionDied] signal on success. */ async shutdown(): Promise { diff --git a/packages/services/src/session/session.ts b/packages/services/src/session/session.ts index 517894efbb2c..7a28f4b5498b 100644 --- a/packages/services/src/session/session.ts +++ b/packages/services/src/session/session.ts @@ -367,7 +367,7 @@ export interface IManager extends IDisposable { * The session model returned by the server. * * #### Notes - * See the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions). + * See the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions). */ export interface IModel { /** @@ -388,7 +388,7 @@ export interface IModel { * parameter is not technically required, but is often assumed to be nonempty, * so we require it too. * - * See the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions). + * See the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions). */ export type ISessionOptions = Pick & { kernel?: Partial>; diff --git a/packages/services/src/testutils.ts b/packages/services/src/testutils.ts index eaa7d9aafcf5..229297fe9e07 100644 --- a/packages/services/src/testutils.ts +++ b/packages/services/src/testutils.ts @@ -307,31 +307,48 @@ export const SessionConnectionMock = jest.fn< * A mock contents manager. */ export const ContentsManagerMock = jest.fn(() => { - const files = new Map(); + const files = new Map>(); const dummy = new ContentsManager(); const checkpoints = new Map(); const checkPointContent = new Map(); const baseModel = Private.createFile({ type: 'directory' }); - files.set('', { ...baseModel, path: '', name: '' }); + // create the default drive + files.set( + '', + new Map([ + ['', { ...baseModel, path: '', name: '' }] + ]) + ); const thisObject: Contents.IManager = { ...jest.requireActual('@jupyterlab/services'), newUntitled: jest.fn(options => { - const model = Private.createFile(options || {}); - files.set(model.path, model); + const driveName = dummy.driveName(options?.path || ''); + const localPath = dummy.localPath(options?.path || ''); + // create the test file without the drive name + const createOptions = { ...options, path: localPath }; + const model = Private.createFile(createOptions || {}); + // re-add the drive name to the model + const drivePath = driveName ? `${driveName}:${model.path}` : model.path; + const driveModel = { + ...model, + path: drivePath + }; + files.get(driveName)!.set(model.path, driveModel); fileChangedSignal.emit({ type: 'new', oldValue: null, - newValue: model + newValue: driveModel }); - return Promise.resolve(model); + return Promise.resolve(driveModel); }), createCheckpoint: jest.fn(path => { const lastModified = new Date().toISOString(); const data = { id: UUID.uuid4(), last_modified: lastModified }; checkpoints.set(path, data); - checkPointContent.set(path, files.get(path)?.content); + // TODO: handle drives + checkPointContent.set(path, files.get('')!.get(path)?.content); return Promise.resolve(data); }), listCheckpoints: jest.fn(path => { @@ -352,7 +369,8 @@ export const ContentsManagerMock = jest.fn(() => { if (!checkpoints.has(path)) { return Private.makeResponseError(404); } - (files.get(path) as any).content = checkPointContent.get(path); + // TODO: handle drives + (files.get('')!.get(path) as any).content = checkPointContent.get(path); return Promise.resolve(); }), getSharedModelFactory: jest.fn(() => { @@ -368,11 +386,14 @@ export const ContentsManagerMock = jest.fn(() => { return dummy.resolvePath(root, path); }), get: jest.fn((path, options) => { - path = Private.fixSlash(path); - if (!files.has(path)) { + const driveName = dummy.driveName(path); + const localPath = dummy.localPath(path); + const drive = files.get(driveName)!; + path = Private.fixSlash(localPath); + if (!drive.has(path)) { return Private.makeResponseError(404); } - const model = files.get(path)!; + const model = drive.get(path)!; const overrides: { hash?: string; last_modified?: string } = {}; if (path == 'random-hash.txt') { overrides.hash = Math.random().toString(); @@ -385,10 +406,11 @@ export const ContentsManagerMock = jest.fn(() => { if (model.type === 'directory') { if (options?.content !== false) { const content: Contents.IModel[] = []; - files.forEach(fileModel => { + drive.forEach(fileModel => { + const localPath = dummy.localPath(fileModel.path); if ( // If file path is under this directory, add it to contents array. - PathExt.dirname(fileModel.path) == model.path && + PathExt.dirname(localPath) == model.path && // But the directory should exclude itself from the contents array. fileModel !== model ) { @@ -408,16 +430,20 @@ export const ContentsManagerMock = jest.fn(() => { return dummy.driveName(path); }), rename: jest.fn((oldPath, newPath) => { - oldPath = Private.fixSlash(oldPath); - newPath = Private.fixSlash(newPath); - if (!files.has(oldPath)) { + const driveName = dummy.driveName(oldPath); + const drive = files.get(driveName)!; + let oldLocalPath = dummy.localPath(oldPath); + let newLocalPath = dummy.localPath(newPath); + oldLocalPath = Private.fixSlash(oldLocalPath); + newLocalPath = Private.fixSlash(newLocalPath); + if (!drive.has(oldLocalPath)) { return Private.makeResponseError(404); } - const oldValue = files.get(oldPath)!; - files.delete(oldPath); - const name = PathExt.basename(newPath); - const newValue = { ...oldValue, name, path: newPath }; - files.set(newPath, newValue); + const oldValue = drive.get(oldPath)!; + drive.delete(oldPath); + const name = PathExt.basename(newLocalPath); + const newValue = { ...oldValue, name, path: newLocalPath }; + drive.set(newPath, newValue); fileChangedSignal.emit({ type: 'rename', oldValue, @@ -426,12 +452,15 @@ export const ContentsManagerMock = jest.fn(() => { return Promise.resolve(newValue); }), delete: jest.fn(path => { - path = Private.fixSlash(path); - if (!files.has(path)) { + const driveName = dummy.driveName(path); + const localPath = dummy.localPath(path); + const drive = files.get(driveName)!; + path = Private.fixSlash(localPath); + if (!drive.has(path)) { return Private.makeResponseError(404); } - const oldValue = files.get(path)!; - files.delete(path); + const oldValue = drive.get(path)!; + drive.delete(path); fileChangedSignal.emit({ type: 'delete', oldValue, @@ -445,7 +474,8 @@ export const ContentsManagerMock = jest.fn(() => { } path = Private.fixSlash(path); const timeStamp = new Date().toISOString(); - if (files.has(path)) { + const drive = files.get(dummy.driveName(path))!; + if (drive.has(path)) { const updates = path == 'frozen-time-and-hash.txt' ? {} @@ -453,13 +483,13 @@ export const ContentsManagerMock = jest.fn(() => { last_modified: timeStamp, hash: timeStamp }; - files.set(path, { - ...files.get(path)!, + drive.set(path, { + ...drive.get(path)!, ...options, ...updates }); } else { - files.set(path, { + drive.set(path, { path, name: PathExt.basename(path), content: '', @@ -477,15 +507,21 @@ export const ContentsManagerMock = jest.fn(() => { fileChangedSignal.emit({ type: 'save', oldValue: null, - newValue: files.get(path)! + newValue: drive.get(path)! }); - return Promise.resolve(files.get(path)!); + return Promise.resolve(drive.get(path)!); }), getDownloadUrl: jest.fn(path => { return dummy.getDownloadUrl(path); }), addDrive: jest.fn(drive => { dummy.addDrive(drive); + files.set( + drive.name, + new Map([ + ['', { ...baseModel, path: '', name: '' }] + ]) + ); }), dispose: jest.fn() }; diff --git a/packages/settingeditor-extension/package.json b/packages/settingeditor-extension/package.json index df2ef3014c24..7de507c9ff10 100644 --- a/packages/settingeditor-extension/package.json +++ b/packages/settingeditor-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/settingeditor-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Setting Editor Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,16 +38,16 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/pluginmanager": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/settingeditor": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/pluginmanager": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/settingeditor": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/disposable": "^2.1.2" }, "devDependencies": { diff --git a/packages/settingeditor/package.json b/packages/settingeditor/package.json index 6140a25f66da..36f985964530 100644 --- a/packages/settingeditor/package.json +++ b/packages/settingeditor/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/settingeditor", - "version": "4.1.0", + "version": "4.1.5", "description": "The JupyterLab default setting editor interface", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,15 +42,15 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/inspector": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/inspector": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", @@ -66,7 +66,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/react": "^18.0.26", "@types/react-test-renderer": "^18.0.0", diff --git a/packages/settingregistry/package.json b/packages/settingregistry/package.json index 3fb23c4037e0..123279b34032 100644 --- a/packages/settingregistry/package.json +++ b/packages/settingregistry/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/settingregistry", - "version": "4.1.0", + "version": "4.1.5", "description": "Settings registry for Jupyterlab", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,8 +37,8 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/nbformat": "^4.1.0", - "@jupyterlab/statedb": "^4.1.0", + "@jupyterlab/nbformat": "^4.1.5", + "@jupyterlab/statedb": "^4.1.5", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -48,7 +48,7 @@ "json5": "^2.2.3" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/settingregistry/src/settingregistry.ts b/packages/settingregistry/src/settingregistry.ts index d69d13dfc183..803ce7567931 100644 --- a/packages/settingregistry/src/settingregistry.ts +++ b/packages/settingregistry/src/settingregistry.ts @@ -1538,38 +1538,47 @@ namespace Private { const changes = [ { old: '.jp-Notebook:focus.jp-mod-commandMode', - new: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + new: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', versionDeprecated: 'JupyterLab 4.1' }, + { + old: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + new: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', + versionDeprecated: 'JupyterLab 4.1.1' + }, { old: '.jp-Notebook:focus', - new: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + new: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', versionDeprecated: 'JupyterLab 4.1' }, { old: '[data-jp-traversable]:focus', - new: '.jp-Notebook.jp-mod-commandMode :focus:not(:read-write)', + new: '.jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus', versionDeprecated: 'JupyterLab 4.1' }, { old: '[data-jp-kernel-user]:focus', - new: '[data-jp-kernel-user] :focus:not(:read-write)', + new: '[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)', versionDeprecated: 'JupyterLab 4.1' + }, + { + old: '[data-jp-kernel-user] :focus:not(:read-write)', + new: '[data-jp-kernel-user]:not(.jp-mod-readWrite) :focus:not(:read-write)', + versionDeprecated: 'JupyterLab 4.1.1' } ]; const upgraded = shortcuts.map(shortcut => { const oldSelector = shortcut.selector; let newSelector = oldSelector; for (const change of changes) { - if ( - oldSelector.includes(change.old) && - !selectorsAlreadyWarnedAbout.has(oldSelector) - ) { + if (oldSelector.includes(change.old)) { newSelector = oldSelector.replace(change.old, change.new); - selectorDeprecationWarnings.add( - `"${change.old}" was replaced with "${change.new}" in ${change.versionDeprecated} (present in "${oldSelector}")` - ); - selectorsAlreadyWarnedAbout.add(oldSelector); + if (!selectorsAlreadyWarnedAbout.has(oldSelector)) { + selectorDeprecationWarnings.add( + `"${change.old}" was replaced with "${change.new}" in ${change.versionDeprecated} (present in "${oldSelector}")` + ); + selectorsAlreadyWarnedAbout.add(oldSelector); + } } } shortcut.selector = newSelector; diff --git a/packages/shortcuts-extension/package.json b/packages/shortcuts-extension/package.json index ee71c021a111..a9af526aa791 100644 --- a/packages/shortcuts-extension/package.json +++ b/packages/shortcuts-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/shortcuts-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Shortcuts Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -41,10 +41,10 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", @@ -55,7 +55,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/statedb/package.json b/packages/statedb/package.json index d0cef1020fc0..28a19e0531e8 100644 --- a/packages/statedb/package.json +++ b/packages/statedb/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/statedb", - "version": "4.1.0", + "version": "4.1.5", "description": "Package for managing state in Jupyterlab", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -43,7 +43,7 @@ "@lumino/signaling": "^2.1.2" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/statusbar-extension/package.json b/packages/statusbar-extension/package.json index a95ef49801ae..2f41f32c8e28 100644 --- a/packages/statusbar-extension/package.json +++ b/packages/statusbar-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/statusbar-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Statusbar Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,11 +37,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/statusbar": "^4.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/statusbar": "^4.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "@types/react": "^18.0.26", diff --git a/packages/statusbar/package.json b/packages/statusbar/package.json index e9252c1bd69a..c82e1e9c7a4a 100644 --- a/packages/statusbar/package.json +++ b/packages/statusbar/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/statusbar", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab statusbar package.", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,7 +37,7 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", @@ -47,7 +47,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/terminal-extension/package.json b/packages/terminal-extension/package.json index 095584799024..152bf01eb65a 100644 --- a/packages/terminal-extension/package.json +++ b/packages/terminal-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/terminal-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Terminal Emulator Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,16 +38,16 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/launcher": "^4.1.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/running": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/terminal": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/launcher": "^4.1.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/running": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/terminal": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/widgets": "^2.3.1" }, "devDependencies": { diff --git a/packages/terminal/package.json b/packages/terminal/package.json index 7894e8d6738d..26bfc0fd659a 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/terminal", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Terminal Emulator Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -42,9 +42,9 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/domutils": "^2.0.1", "@lumino/messaging": "^2.0.1", @@ -56,7 +56,7 @@ "xterm-addon-webgl": "~0.14.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "canvas": "^2.11.2", "jest": "^29.2.0", diff --git a/packages/testing/package.json b/packages/testing/package.json index fc52c24db9d8..beb8f62cfd21 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/testing", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab basic testing utilities.", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -35,7 +35,7 @@ "dependencies": { "@babel/core": "^7.10.2", "@babel/preset-env": "^7.10.2", - "@jupyterlab/coreutils": "^6.1.0", + "@jupyterlab/coreutils": "^6.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/signaling": "^2.1.2", "child_process": "~1.0.2", diff --git a/packages/testing/src/jest-shim.ts b/packages/testing/src/jest-shim.ts index fbcacc5c6bcd..e11cb703d626 100644 --- a/packages/testing/src/jest-shim.ts +++ b/packages/testing/src/jest-shim.ts @@ -85,6 +85,75 @@ class ResizeObserverMock { window.ResizeObserver = ResizeObserverMock; +// https://github.com/jsdom/jsdom/issues/2913 +class DataTransferItemMock implements DataTransferItem { + constructor( + protected format: string, + protected value: string + ) { + // no-op + } + get kind() { + return 'string'; + } + get type() { + return this.format; + } + getAsString(callback: (v: string) => undefined): undefined { + callback(this.value); + } + getAsFile() { + return null as any; + } + webkitGetAsEntry() { + return null as any; + } +} + +// https://github.com/jsdom/jsdom/issues/2913 +class DataTransferMock implements DataTransfer { + dropEffect: DataTransfer['dropEffect'] = 'none'; + effectAllowed: DataTransfer['dropEffect'] = 'none'; + files: DataTransfer['files']; + get items(): DataTransfer['items'] { + return [ + ...Object.entries(this._data).map( + ([k, v]) => new DataTransferItemMock(k, v) + ) + ] as unknown as DataTransferItemList; + } + readonly types: DataTransfer['types'] = []; + getData(format: string) { + return this._data[format]; + } + setData(format: string, data: string) { + this._data[format] = data; + } + clearData() { + this._data = {}; + } + setDragImage(imgElement: Element, xOffset: number, yOffset: number) { + // no-op + } + private _data: Record = {}; +} + +window.DataTransfer = DataTransferMock; + +// https://github.com/jsdom/jsdom/issues/1568 +class ClipboardEventMock extends Event implements ClipboardEvent { + constructor( + type: 'copy' | 'cut' | 'paste', + options: { clipboardData: DataTransfer } + ) { + super(type); + this.clipboardData = options.clipboardData; + } + clipboardData: DataTransfer; +} + +window.ClipboardEvent = ClipboardEventMock; + (window as any).document.elementFromPoint = (left: number, top: number) => document.body; diff --git a/packages/theme-dark-extension/package.json b/packages/theme-dark-extension/package.json index c60f10b9ff1e..bc537984aa99 100644 --- a/packages/theme-dark-extension/package.json +++ b/packages/theme-dark-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/theme-dark-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Default Dark Theme", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -32,9 +32,9 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/theme-light-extension/package.json b/packages/theme-light-extension/package.json index 9dda913b77c9..66cf62783fe4 100644 --- a/packages/theme-light-extension/package.json +++ b/packages/theme-light-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/theme-light-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Default Light Theme", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -32,9 +32,9 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/toc-extension/package.json b/packages/toc-extension/package.json index e0a297a6acf5..953424269c17 100644 --- a/packages/toc-extension/package.json +++ b/packages/toc-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/toc-extension", - "version": "6.1.0", + "version": "6.1.5", "description": "JupyterLab - Table of Contents widget extension", "keywords": [ "jupyter", @@ -41,11 +41,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/toc": "^6.1.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/toc": "^6.1.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/toc/package.json b/packages/toc/package.json index ab1090f47291..b65af9bea111 100644 --- a/packages/toc/package.json +++ b/packages/toc/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/toc", - "version": "6.1.0", + "version": "6.1.5", "description": "JupyterLab - Table of Contents widget", "keywords": [ "jupyterlab" @@ -41,14 +41,14 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/docregistry": "^4.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/translation": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/docregistry": "^4.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/translation": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/disposable": "^2.1.2", "@lumino/messaging": "^2.0.1", @@ -57,7 +57,7 @@ "react": "^18.2.0" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/react": "^18.0.26", "jest": "^29.2.0", diff --git a/packages/tooltip-extension/package.json b/packages/tooltip-extension/package.json index 48f4a053da8a..721285ba877a 100644 --- a/packages/tooltip-extension/package.json +++ b/packages/tooltip-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/tooltip-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Tooltip Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,16 +38,16 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/console": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/fileeditor": "^4.1.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/tooltip": "^4.1.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/console": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/fileeditor": "^4.1.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/tooltip": "^4.1.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/coreutils": "^2.1.2", "@lumino/widgets": "^2.3.1" diff --git a/packages/tooltip/package.json b/packages/tooltip/package.json index 9e9153cc2274..c3be1e41cccb 100644 --- a/packages/tooltip/package.json +++ b/packages/tooltip/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/tooltip", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Tooltip Widget", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -37,10 +37,10 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/codeeditor": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/codeeditor": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/coreutils": "^2.1.2", "@lumino/messaging": "^2.0.1", "@lumino/widgets": "^2.3.1" diff --git a/packages/translation-extension/package.json b/packages/translation-extension/package.json index 7ae71306c1a9..04827918e906 100644 --- a/packages/translation-extension/package.json +++ b/packages/translation-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/translation-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Translation services", "keywords": [ "jupyter", @@ -37,11 +37,11 @@ "watch": "tsc -w" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/mainmenu": "^4.1.0", - "@jupyterlab/settingregistry": "^4.1.0", - "@jupyterlab/translation": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/mainmenu": "^4.1.5", + "@jupyterlab/settingregistry": "^4.1.5", + "@jupyterlab/translation": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/translation/package.json b/packages/translation/package.json index 757bdc87f959..6caffecad6b4 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/translation", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Translation services", "keywords": [ "jupyter", @@ -38,14 +38,14 @@ "watch": "tsc -w" }, "dependencies": { - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/services": "^7.1.0", - "@jupyterlab/statedb": "^4.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/services": "^7.1.5", + "@jupyterlab/statedb": "^4.1.5", "@lumino/coreutils": "^2.1.2" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "jest": "^29.2.0", "rimraf": "~5.0.5", diff --git a/packages/ui-components-extension/package.json b/packages/ui-components-extension/package.json index 3b4ef6375333..bda168ded8a6 100644 --- a/packages/ui-components-extension/package.json +++ b/packages/ui-components-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/ui-components-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - UI component plugins", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -33,8 +33,8 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/packages/ui-components/docs/source/intro.rst b/packages/ui-components/docs/source/intro.rst index 389d5bc76969..5ec5aee30e10 100644 --- a/packages/ui-components/docs/source/intro.rst +++ b/packages/ui-components/docs/source/intro.rst @@ -1,7 +1,7 @@ .. Copyright (c) Jupyter Development Team. .. Distributed under the terms of the Modified BSD License. -The `@jupyterlab/ui-components `__ +The `@jupyterlab/ui-components `__ package provides UI elements that are widely used in JupyterLab core, and that can be reused in your own extensions. diff --git a/packages/ui-components/docs/source/labicon.rst b/packages/ui-components/docs/source/labicon.rst index 480c83e61b08..6124d68d674c 100644 --- a/packages/ui-components/docs/source/labicon.rst +++ b/packages/ui-components/docs/source/labicon.rst @@ -150,7 +150,7 @@ Available icon classes .. raw:: html - Icon-related CSS classes are defined in ui-components/style/icons.css + Icon-related CSS classes are defined in ui-components/style/icons.css | | All colors shown are for the standard light/dark theme, mouse over for hex values. diff --git a/packages/ui-components/examples/simple-windowed-list/package.json b/packages/ui-components/examples/simple-windowed-list/package.json index f7813959f8d7..ace66b819a79 100644 --- a/packages/ui-components/examples/simple-windowed-list/package.json +++ b/packages/ui-components/examples/simple-windowed-list/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/example-simple-list", - "version": "4.1.0", + "version": "4.1.5", "private": true, "style": "style/index.css", "scripts": { @@ -9,11 +9,11 @@ "watch": "webpack --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/theme-light-extension": "^4.1.0", - "@jupyterlab/ui-components": "^4.1.0", + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/theme-light-extension": "^4.1.5", + "@jupyterlab/ui-components": "^4.1.5", "@lumino/messaging": "^2.0.1", "@lumino/widgets": "^2.3.1" }, diff --git a/packages/ui-components/package.json b/packages/ui-components/package.json index 10f93410e149..89980a480a2a 100644 --- a/packages/ui-components/package.json +++ b/packages/ui-components/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/ui-components", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - UI components written in React", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -43,10 +43,10 @@ "dependencies": { "@jupyter/react-components": "^0.15.2", "@jupyter/web-components": "^0.15.2", - "@jupyterlab/coreutils": "^6.1.0", - "@jupyterlab/observables": "^5.1.0", - "@jupyterlab/rendermime-interfaces": "^3.9.0", - "@jupyterlab/translation": "^4.1.0", + "@jupyterlab/coreutils": "^6.1.5", + "@jupyterlab/observables": "^5.1.5", + "@jupyterlab/rendermime-interfaces": "^3.9.5", + "@jupyterlab/translation": "^4.1.5", "@lumino/algorithm": "^2.0.1", "@lumino/commands": "^2.2.0", "@lumino/coreutils": "^2.1.2", @@ -64,7 +64,7 @@ "typestyle": "^2.0.4" }, "devDependencies": { - "@jupyterlab/testing": "^4.1.0", + "@jupyterlab/testing": "^4.1.5", "@types/jest": "^29.2.0", "@types/react": "^18.0.26", "jest": "^29.2.0", diff --git a/packages/ui-components/src/components/search.tsx b/packages/ui-components/src/components/search.tsx index f41c3bfb2922..1262e2761917 100644 --- a/packages/ui-components/src/components/search.tsx +++ b/packages/ui-components/src/components/search.tsx @@ -77,9 +77,8 @@ export function fuzzySearch(source: string, query: string): IScore | null { let score = Infinity; let indices: number[] | null = null; - // The regex for search word boundaries - const rgx = /\b\w/g; - + // Look for letters (including in Asian scripts), numbers, and diacritical marks. + const rgx = /[\p{L}\p{N}\p{M}]+/gu; let continueSearch = true; // Search the source by word boundary. diff --git a/packages/ui-components/src/components/toolbar.tsx b/packages/ui-components/src/components/toolbar.tsx index 1089770e0c62..ff118e2dc29f 100644 --- a/packages/ui-components/src/components/toolbar.tsx +++ b/packages/ui-components/src/components/toolbar.tsx @@ -376,7 +376,7 @@ export class ReactiveToolbar extends Toolbar { this.popupOpener.hide(); this._resizer = new Throttler(async (callTwice = false) => { await this._onResize(callTwice); - }, 300); + }, 500); } /** @@ -429,11 +429,6 @@ export class ReactiveToolbar extends Toolbar { ): boolean { const targetPosition = this._widgetPositions.get(at); const position = (targetPosition ?? 0) + offset; - this._widgetPositions.forEach((value, key) => { - if (key !== TOOLBAR_OPENER_NAME && value >= position) { - this._widgetPositions.set(key, value + 1); - } - }); return this.insertItem(position, name, widget); } @@ -465,12 +460,34 @@ export class ReactiveToolbar extends Toolbar { status = super.insertItem(j, name, widget); } - // Save the widgets position when a new widget is inserted. + // Save the widgets position when a widget is inserted or moved. if ( name !== TOOLBAR_OPENER_NAME && - this._widgetPositions.get(name) === undefined + this._widgetPositions.get(name) !== index ) { + // If the widget is inserted, set its current position as last. + const currentPosition = + this._widgetPositions.get(name) ?? this._widgetPositions.size; + + // Change the position of moved widgets. + this._widgetPositions.forEach((value, key) => { + if (key !== TOOLBAR_OPENER_NAME) { + if (value >= index && value < currentPosition) { + this._widgetPositions.set(key, value + 1); + } else if (value <= index && value > currentPosition) { + this._widgetPositions.set(key, value - 1); + } + } + }); + + // Save the new position of the widget. this._widgetPositions.set(name, index); + + // Invokes resizing to ensure correct display of items after an addition, only + // if the toolbar is rendered. + if (this.isVisible) { + void this._resizer.invoke(); + } } return status; } @@ -526,7 +543,7 @@ export class ReactiveToolbar extends Toolbar { } const toolbarWidth = this.node.clientWidth; const opener = this.popupOpener; - const openerWidth = 30; + const openerWidth = 32; // left and right padding. const toolbarPadding = 2 + 5; let width = opener.isHidden ? toolbarPadding : toolbarPadding + openerWidth; @@ -535,13 +552,27 @@ export class ReactiveToolbar extends Toolbar { .then(values => { let { width, widgetsToRemove } = values; while (widgetsToRemove.length > 0) { - // Insert the widget in the right position in the opener popup. + // Insert the widget at the right position in the opener popup, relatively + // to the saved position of the first item of the popup toolbar. + + // Get the saved position of the widget to insert. const widget = widgetsToRemove.pop() as Widget; const name = Private.nameProperty.get(widget); - width -= this._widgetWidths![name]; + width -= this._widgetWidths.get(name) || 0; const position = this._widgetPositions.get(name) ?? 0; - const index = - opener.widgetCount() + position - this._widgetPositions.size; + + // Get the saved position of the first item in the popup toolbar. + // If there is no widget, set the value at last item. + let openerFirstIndex = this._widgetPositions.size; + const openerFirst = opener.widgetAt(0); + if (openerFirst) { + const openerFirstName = Private.nameProperty.get(openerFirst); + openerFirstIndex = + this._widgetPositions.get(openerFirstName) ?? openerFirstIndex; + } + + // Insert the widget in the popup toolbar. + const index = position - openerFirstIndex; opener.insertWidget(index, widget); } if (opener.widgetCount() > 0) { @@ -606,17 +637,19 @@ export class ReactiveToolbar extends Toolbar { let index = 0; while (index < toIndex) { const widget = layout.widgets[index]; + const name = Private.nameProperty.get(widget); // Compute the widget size only if // - the zoom has changed. // - the widget size has not been computed yet. let widgetWidth: number; if (this._zoomChanged) { - widgetWidth = await this._saveWidgetWidth(widget); + widgetWidth = await this._saveWidgetWidth(name, widget); } else { // The widget widths can be 0px if it has been added to the toolbar but // not rendered, this is why we must use '||' instead of '??'. widgetWidth = - this._getWidgetWidth(widget) || (await this._saveWidgetWidth(widget)); + this._getWidgetWidth(widget) || + (await this._saveWidgetWidth(name, widget)); } width += widgetWidth; if ( @@ -626,12 +659,18 @@ export class ReactiveToolbar extends Toolbar { ) { width += openerWidth; } - if (width > toolbarWidth) { + // Remove the widget if it is out of the toolbar or incorrectly positioned. + // Incorrect positioning can occur when the widget is added after the toolbar + // has been rendered and should be in the popup. E.g. debugger icon with a + // narrow notebook toolbar. + if ( + width > toolbarWidth || + (this._widgetPositions.get(name) ?? 0) > index + ) { widgetsToRemove.push(widget); } index++; } - this._zoomChanged = false; return { width: width, @@ -639,27 +678,28 @@ export class ReactiveToolbar extends Toolbar { }; } - private async _saveWidgetWidth(widget: Widget): Promise { + private async _saveWidgetWidth( + name: string, + widget: Widget + ): Promise { if (widget instanceof ReactWidget) { await widget.renderPromise; } - const widgetName = Private.nameProperty.get(widget); - const widgetWidth = widget.hasClass(TOOLBAR_SPACER_CLASS) ? 2 : widget.node.clientWidth; - this._widgetWidths![widgetName] = widgetWidth; + this._widgetWidths.set(name, widgetWidth); return widgetWidth; } private _getWidgetWidth(widget: Widget): number { const widgetName = Private.nameProperty.get(widget); - return this._widgetWidths![widgetName]; + return this._widgetWidths.get(widgetName) || 0; } protected readonly popupOpener: ToolbarPopupOpener = new ToolbarPopupOpener(); - private readonly _widgetWidths: { [key: string]: number } = {}; private readonly _resizer: Throttler; + private readonly _widgetWidths = new Map(); private _widgetPositions = new Map(); // The zoom property is not the real browser zoom, but a value proportional to // the zoom, which is modified when the zoom changes. diff --git a/packages/ui-components/style/toolbar.css b/packages/ui-components/style/toolbar.css index 27b512f90d66..230974e1cc7f 100644 --- a/packages/ui-components/style/toolbar.css +++ b/packages/ui-components/style/toolbar.css @@ -74,6 +74,10 @@ button.jp-ToolbarButtonComponent .jp-ToolbarButtonComponent-label { font-family: var(--jp-ui-font-family); } +.jp-Toolbar .jp-ToolbarButtonComponent { + color: var(--jp-ui-font-color1); +} + .jp-ToolbarButtonComponent::part(content) { display: flex; align-items: center; diff --git a/packages/ui-components/test/search.spec.tsx b/packages/ui-components/test/search.spec.tsx new file mode 100644 index 000000000000..572465bacf1a --- /dev/null +++ b/packages/ui-components/test/search.spec.tsx @@ -0,0 +1,46 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import { fuzzySearch } from '@jupyterlab/ui-components'; + +describe('@jupyterlab/ui-components', () => { + describe('fuzzySearch()', () => { + // The search logic is in StringExt.matchSumOfDeltas, which is already + // tested in the lumino package. + it('should find an ASCII match in text', () => { + const result = fuzzySearch('food', 'foo'); + expect(result).not.toBeNull(); + }); + + it('should find an ASCII match in text with a space', () => { + const result = fuzzySearch('fast food', 'foo'); + expect(result).not.toBeNull(); + }); + + it('should fail to find an ASCII match in text', () => { + const result = fuzzySearch('fast food', 'bar'); + expect(result).toBeNull(); + }); + + it('should find a French match in text', () => { + const result = fuzzySearch('Liberté, égalité, fraternité', 'erté'); + expect(result).not.toBeNull(); + }); + + it('should fail to find a French match in text', () => { + const result = fuzzySearch('Liberté, égalité, fraternité', 'ègal'); + expect(result).toBeNull(); + }); + + // CJK = Chinese, Japanese, and Korean characters + it('should find a CJK match in ASCII+CJK text', () => { + const result = fuzzySearch('2测试', '测'); + expect(result).not.toBeNull(); + }); + + it('should find a ASCII match in ASCII+CJK text', () => { + const result = fuzzySearch('测试1.ipynb', '1'); + expect(result).not.toBeNull(); + }); + }); +}); diff --git a/packages/vega5-extension/README.md b/packages/vega5-extension/README.md index 3be91d7db821..958ee25e2610 100644 --- a/packages/vega5-extension/README.md +++ b/packages/vega5-extension/README.md @@ -102,4 +102,4 @@ To render a `.vl`, `.vg`, `vl.json` or `.vg.json` file, simply open it: ## Development -See the [JupyterLab Contributor Documentation](https://github.com/jupyterlab/jupyterlab/blob/main/CONTRIBUTING.md). +See the [JupyterLab Contributor Documentation](https://github.com/jupyterlab/jupyterlab/blob/4.1.x/CONTRIBUTING.md). diff --git a/packages/vega5-extension/package.json b/packages/vega5-extension/package.json index 959bd892f612..942b12bb5df2 100644 --- a/packages/vega5-extension/package.json +++ b/packages/vega5-extension/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/vega5-extension", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Vega 5 and Vega-Lite 5 Mime Renderer Extension", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -38,7 +38,7 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/rendermime-interfaces": "^3.9.0", + "@jupyterlab/rendermime-interfaces": "^3.9.5", "@lumino/coreutils": "^2.1.2", "@lumino/widgets": "^2.3.1", "vega": "^5.20.0", @@ -46,7 +46,7 @@ "vega-lite": "^5.6.1-next.1" }, "devDependencies": { - "@jupyterlab/testutils": "^4.1.0", + "@jupyterlab/testutils": "^4.1.5", "@types/jest": "^29.2.0", "@types/webpack-env": "^1.18.0", "jest": "^29.2.0", diff --git a/pyproject.toml b/pyproject.toml index cd88592bd310..0d1563513243 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,7 +120,7 @@ dev = [ "coverage", "hatch", "bump2version", - "ruff==0.1.15", + "ruff==0.2.0", ] [tool.check-wheel-contents] diff --git a/testutils/package.json b/testutils/package.json index 4178f4d130cf..c0a0f5aac65f 100644 --- a/testutils/package.json +++ b/testutils/package.json @@ -1,6 +1,6 @@ { "name": "@jupyterlab/testutils", - "version": "4.1.0", + "version": "4.1.5", "description": "JupyterLab - Test Utilities", "homepage": "https://github.com/jupyterlab/jupyterlab", "bugs": { @@ -31,11 +31,11 @@ "watch": "tsc -b --watch" }, "dependencies": { - "@jupyterlab/application": "^4.1.0", - "@jupyterlab/apputils": "^4.2.0", - "@jupyterlab/notebook": "^4.1.0", - "@jupyterlab/rendermime": "^4.1.0", - "@jupyterlab/testing": "^4.1.0" + "@jupyterlab/application": "^4.1.5", + "@jupyterlab/apputils": "^4.2.5", + "@jupyterlab/notebook": "^4.1.5", + "@jupyterlab/rendermime": "^4.1.5", + "@jupyterlab/testing": "^4.1.5" }, "devDependencies": { "rimraf": "~5.0.5", diff --git a/yarn.lock b/yarn.lock index 55262cb90259..a8e0063b2a86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2096,19 +2096,19 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application-extension@^4.1.0, @jupyterlab/application-extension@workspace:packages/application-extension, @jupyterlab/application-extension@~4.1.0": +"@jupyterlab/application-extension@^4.1.5, @jupyterlab/application-extension@workspace:packages/application-extension, @jupyterlab/application-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/application-extension@workspace:packages/application-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/property-inspector": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/property-inspector": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2125,56 +2125,56 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/application-top@workspace:dev_mode" dependencies: - "@jupyterlab/application": ~4.1.0 - "@jupyterlab/application-extension": ~4.1.0 - "@jupyterlab/apputils-extension": ~4.1.0 - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/buildutils": ^4.1.0 - "@jupyterlab/cell-toolbar-extension": ~4.1.0 - "@jupyterlab/celltags-extension": ~4.1.0 - "@jupyterlab/codemirror-extension": ~4.1.0 - "@jupyterlab/completer-extension": ~4.1.0 - "@jupyterlab/console-extension": ~4.1.0 - "@jupyterlab/coreutils": ~6.1.0 - "@jupyterlab/csvviewer-extension": ~4.1.0 - "@jupyterlab/debugger-extension": ~4.1.0 - "@jupyterlab/docmanager-extension": ~4.1.0 - "@jupyterlab/documentsearch-extension": ~4.1.0 - "@jupyterlab/extensionmanager-extension": ~4.1.0 - "@jupyterlab/filebrowser-extension": ~4.1.0 - "@jupyterlab/fileeditor-extension": ~4.1.0 - "@jupyterlab/help-extension": ~4.1.0 - "@jupyterlab/htmlviewer-extension": ~4.1.0 - "@jupyterlab/hub-extension": ~4.1.0 - "@jupyterlab/imageviewer-extension": ~4.1.0 - "@jupyterlab/inspector-extension": ~4.1.0 - "@jupyterlab/javascript-extension": ~4.1.0 - "@jupyterlab/json-extension": ~4.1.0 - "@jupyterlab/launcher-extension": ~4.1.0 - "@jupyterlab/logconsole-extension": ~4.1.0 - "@jupyterlab/lsp-extension": ~4.1.0 - "@jupyterlab/mainmenu-extension": ~4.1.0 - "@jupyterlab/markdownviewer-extension": ~4.1.0 - "@jupyterlab/markedparser-extension": ~4.1.0 - "@jupyterlab/mathjax-extension": ~4.1.0 - "@jupyterlab/mermaid-extension": ~4.1.0 - "@jupyterlab/metadataform-extension": ~4.1.0 - "@jupyterlab/notebook-extension": ~4.1.0 - "@jupyterlab/pdf-extension": ~4.1.0 - "@jupyterlab/pluginmanager-extension": ~4.1.0 - "@jupyterlab/rendermime-extension": ~4.1.0 - "@jupyterlab/running-extension": ~4.1.0 - "@jupyterlab/settingeditor-extension": ~4.1.0 - "@jupyterlab/shortcuts-extension": ~4.1.0 - "@jupyterlab/statusbar-extension": ~4.1.0 - "@jupyterlab/terminal-extension": ~4.1.0 - "@jupyterlab/theme-dark-extension": ~4.1.0 - "@jupyterlab/theme-light-extension": ~4.1.0 - "@jupyterlab/toc-extension": ~6.1.0 - "@jupyterlab/tooltip-extension": ~4.1.0 - "@jupyterlab/translation-extension": ~4.1.0 - "@jupyterlab/ui-components-extension": ~4.1.0 - "@jupyterlab/vega5-extension": ~4.1.0 + "@jupyterlab/application": ~4.1.5 + "@jupyterlab/application-extension": ~4.1.5 + "@jupyterlab/apputils-extension": ~4.1.5 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/buildutils": ^4.1.5 + "@jupyterlab/cell-toolbar-extension": ~4.1.5 + "@jupyterlab/celltags-extension": ~4.1.5 + "@jupyterlab/codemirror-extension": ~4.1.5 + "@jupyterlab/completer-extension": ~4.1.5 + "@jupyterlab/console-extension": ~4.1.5 + "@jupyterlab/coreutils": ~6.1.5 + "@jupyterlab/csvviewer-extension": ~4.1.5 + "@jupyterlab/debugger-extension": ~4.1.5 + "@jupyterlab/docmanager-extension": ~4.1.5 + "@jupyterlab/documentsearch-extension": ~4.1.5 + "@jupyterlab/extensionmanager-extension": ~4.1.5 + "@jupyterlab/filebrowser-extension": ~4.1.5 + "@jupyterlab/fileeditor-extension": ~4.1.5 + "@jupyterlab/help-extension": ~4.1.5 + "@jupyterlab/htmlviewer-extension": ~4.1.5 + "@jupyterlab/hub-extension": ~4.1.5 + "@jupyterlab/imageviewer-extension": ~4.1.5 + "@jupyterlab/inspector-extension": ~4.1.5 + "@jupyterlab/javascript-extension": ~4.1.5 + "@jupyterlab/json-extension": ~4.1.5 + "@jupyterlab/launcher-extension": ~4.1.5 + "@jupyterlab/logconsole-extension": ~4.1.5 + "@jupyterlab/lsp-extension": ~4.1.5 + "@jupyterlab/mainmenu-extension": ~4.1.5 + "@jupyterlab/markdownviewer-extension": ~4.1.5 + "@jupyterlab/markedparser-extension": ~4.1.5 + "@jupyterlab/mathjax-extension": ~4.1.5 + "@jupyterlab/mermaid-extension": ~4.1.5 + "@jupyterlab/metadataform-extension": ~4.1.5 + "@jupyterlab/notebook-extension": ~4.1.5 + "@jupyterlab/pdf-extension": ~4.1.5 + "@jupyterlab/pluginmanager-extension": ~4.1.5 + "@jupyterlab/rendermime-extension": ~4.1.5 + "@jupyterlab/running-extension": ~4.1.5 + "@jupyterlab/settingeditor-extension": ~4.1.5 + "@jupyterlab/shortcuts-extension": ~4.1.5 + "@jupyterlab/statusbar-extension": ~4.1.5 + "@jupyterlab/terminal-extension": ~4.1.5 + "@jupyterlab/theme-dark-extension": ~4.1.5 + "@jupyterlab/theme-light-extension": ~4.1.5 + "@jupyterlab/toc-extension": ~6.1.5 + "@jupyterlab/tooltip-extension": ~4.1.5 + "@jupyterlab/translation-extension": ~4.1.5 + "@jupyterlab/ui-components-extension": ~4.1.5 + "@jupyterlab/vega5-extension": ~4.1.5 chokidar: ^3.4.0 css-loader: ^6.7.1 duplicate-package-checker-webpack-plugin: ^3.0.0 @@ -2200,21 +2200,21 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/application@^4.1.0, @jupyterlab/application@workspace:packages/application, @jupyterlab/application@~4.1.0": +"@jupyterlab/application@^4.1.5, @jupyterlab/application@workspace:packages/application, @jupyterlab/application@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/application@workspace:packages/application" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/application": ^2.3.0 "@lumino/commands": ^2.2.0 @@ -2233,23 +2233,23 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/apputils-extension@^4.1.0, @jupyterlab/apputils-extension@workspace:packages/apputils-extension, @jupyterlab/apputils-extension@~4.1.0": +"@jupyterlab/apputils-extension@^4.1.5, @jupyterlab/apputils-extension@workspace:packages/apputils-extension, @jupyterlab/apputils-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/apputils-extension@workspace:packages/apputils-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2266,20 +2266,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/apputils@^4.2.0, @jupyterlab/apputils@workspace:packages/apputils": +"@jupyterlab/apputils@^4.2.5, @jupyterlab/apputils@workspace:packages/apputils": version: 0.0.0-use.local resolution: "@jupyterlab/apputils@workspace:packages/apputils" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2301,14 +2301,14 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/attachments@^4.1.0, @jupyterlab/attachments@workspace:packages/attachments": +"@jupyterlab/attachments@^4.1.5, @jupyterlab/attachments@workspace:packages/attachments": version: 0.0.0-use.local resolution: "@jupyterlab/attachments@workspace:packages/attachments" dependencies: - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 rimraf: ~5.0.5 @@ -2317,7 +2317,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/builder@^4.1.0, @jupyterlab/builder@workspace:builder": +"@jupyterlab/builder@^4.1.5, @jupyterlab/builder@workspace:builder": version: 0.0.0-use.local resolution: "@jupyterlab/builder@workspace:builder" dependencies: @@ -2363,7 +2363,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/buildutils@^4.1.0, @jupyterlab/buildutils@workspace:buildutils": +"@jupyterlab/buildutils@^4.1.5, @jupyterlab/buildutils@workspace:buildutils": version: 0.0.0-use.local resolution: "@jupyterlab/buildutils@workspace:buildutils" dependencies: @@ -2403,32 +2403,32 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/cell-toolbar-extension@^4.1.0, @jupyterlab/cell-toolbar-extension@workspace:packages/cell-toolbar-extension, @jupyterlab/cell-toolbar-extension@~4.1.0": +"@jupyterlab/cell-toolbar-extension@^4.1.5, @jupyterlab/cell-toolbar-extension@workspace:packages/cell-toolbar-extension, @jupyterlab/cell-toolbar-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/cell-toolbar-extension@workspace:packages/cell-toolbar-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cell-toolbar": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cell-toolbar": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/cell-toolbar@^4.1.0, @jupyterlab/cell-toolbar@workspace:packages/cell-toolbar": +"@jupyterlab/cell-toolbar@^4.1.5, @jupyterlab/cell-toolbar@workspace:packages/cell-toolbar": version: 0.0.0-use.local resolution: "@jupyterlab/cell-toolbar@workspace:packages/cell-toolbar" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/disposable": ^2.1.2 @@ -2441,29 +2441,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/cells@^4.1.0, @jupyterlab/cells@workspace:packages/cells": +"@jupyterlab/cells@^4.1.5, @jupyterlab/cells@workspace:packages/cells": version: 0.0.0-use.local resolution: "@jupyterlab/cells@workspace:packages/cells" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/attachments": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/attachments": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/domutils": ^2.0.1 @@ -2483,14 +2483,14 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/celltags-extension@^4.1.0, @jupyterlab/celltags-extension@workspace:packages/celltags-extension, @jupyterlab/celltags-extension@~4.1.0": +"@jupyterlab/celltags-extension@^4.1.5, @jupyterlab/celltags-extension@workspace:packages/celltags-extension, @jupyterlab/celltags-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/celltags-extension@workspace:packages/celltags-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@rjsf/utils": ^5.13.4 react: ^18.2.0 @@ -2499,20 +2499,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/codeeditor@^4.1.0, @jupyterlab/codeeditor@workspace:packages/codeeditor": +"@jupyterlab/codeeditor@^4.1.5, @jupyterlab/codeeditor@workspace:packages/codeeditor": version: 0.0.0-use.local resolution: "@jupyterlab/codeeditor@workspace:packages/codeeditor" dependencies: "@codemirror/state": ^6.2.0 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/dragdrop": ^2.1.4 @@ -2528,7 +2528,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/codemirror-extension@^4.1.0, @jupyterlab/codemirror-extension@workspace:packages/codemirror-extension, @jupyterlab/codemirror-extension@~4.1.0": +"@jupyterlab/codemirror-extension@^4.1.5, @jupyterlab/codemirror-extension@workspace:packages/codemirror-extension, @jupyterlab/codemirror-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/codemirror-extension@workspace:packages/codemirror-extension" dependencies: @@ -2536,13 +2536,13 @@ __metadata: "@codemirror/language": ^6.6.0 "@codemirror/legacy-modes": ^6.3.2 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 "@rjsf/utils": ^5.13.4 @@ -2555,7 +2555,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/codemirror@^4.1.0, @jupyterlab/codemirror@workspace:packages/codemirror": +"@jupyterlab/codemirror@^4.1.5, @jupyterlab/codemirror@workspace:packages/codemirror": version: 0.0.0-use.local resolution: "@jupyterlab/codemirror@workspace:packages/codemirror" dependencies: @@ -2580,12 +2580,12 @@ __metadata: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lezer/common": ^1.0.2 "@lezer/generator": ^1.2.2 "@lezer/highlight": ^1.1.4 @@ -2603,15 +2603,15 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/completer-extension@^4.1.0, @jupyterlab/completer-extension@workspace:packages/completer-extension, @jupyterlab/completer-extension@~4.1.0": +"@jupyterlab/completer-extension@^4.1.5, @jupyterlab/completer-extension@workspace:packages/completer-extension, @jupyterlab/completer-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/completer-extension@workspace:packages/completer-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@rjsf/utils": ^5.13.4 @@ -2622,24 +2622,24 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/completer@^4.1.0, @jupyterlab/completer@workspace:packages/completer": +"@jupyterlab/completer@^4.1.5, @jupyterlab/completer@workspace:packages/completer": version: 0.0.0-use.local resolution: "@jupyterlab/completer@workspace:packages/completer" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2655,22 +2655,22 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/console-extension@^4.1.0, @jupyterlab/console-extension@workspace:packages/console-extension, @jupyterlab/console-extension@~4.1.0": +"@jupyterlab/console-extension@^4.1.5, @jupyterlab/console-extension@workspace:packages/console-extension, @jupyterlab/console-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/console-extension@workspace:packages/console-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2682,25 +2682,25 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/console@^4.1.0, @jupyterlab/console@workspace:packages/console": +"@jupyterlab/console@^4.1.5, @jupyterlab/console@workspace:packages/console": version: 0.0.0-use.local resolution: "@jupyterlab/console@workspace:packages/console" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/dragdrop": ^2.1.4 @@ -2715,7 +2715,7 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/coreutils@^6.1.0, @jupyterlab/coreutils@workspace:packages/coreutils, @jupyterlab/coreutils@~6.1.0": +"@jupyterlab/coreutils@^6.1.5, @jupyterlab/coreutils@workspace:packages/coreutils, @jupyterlab/coreutils@~6.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/coreutils@workspace:packages/coreutils" dependencies: @@ -2740,19 +2740,19 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/csvviewer-extension@^4.1.0, @jupyterlab/csvviewer-extension@workspace:packages/csvviewer-extension, @jupyterlab/csvviewer-extension@~4.1.0": +"@jupyterlab/csvviewer-extension@^4.1.5, @jupyterlab/csvviewer-extension@workspace:packages/csvviewer-extension, @jupyterlab/csvviewer-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/csvviewer-extension@workspace:packages/csvviewer-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/csvviewer": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/csvviewer": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/datagrid": ^2.3.0 "@lumino/widgets": ^2.3.1 rimraf: ~5.0.5 @@ -2761,15 +2761,15 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/csvviewer@^4.1.0, @jupyterlab/csvviewer@workspace:packages/csvviewer": +"@jupyterlab/csvviewer@^4.1.5, @jupyterlab/csvviewer@workspace:packages/csvviewer": version: 0.0.0-use.local resolution: "@jupyterlab/csvviewer@workspace:packages/csvviewer" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/datagrid": ^2.3.0 "@lumino/disposable": ^2.1.2 @@ -2786,26 +2786,26 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/debugger-extension@^4.1.0, @jupyterlab/debugger-extension@workspace:packages/debugger-extension, @jupyterlab/debugger-extension@~4.1.0": +"@jupyterlab/debugger-extension@^4.1.5, @jupyterlab/debugger-extension@workspace:packages/debugger-extension, @jupyterlab/debugger-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/debugger-extension@workspace:packages/debugger-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/debugger": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/debugger": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@types/jest": ^29.2.0 "@types/react-dom": ^18.0.9 rimraf: ~5.0.5 @@ -2814,29 +2814,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/debugger@^4.1.0, @jupyterlab/debugger@workspace:packages/debugger": +"@jupyterlab/debugger@^4.1.5, @jupyterlab/debugger@workspace:packages/debugger": version: 0.0.0-use.local resolution: "@jupyterlab/debugger@workspace:packages/debugger" dependencies: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.6 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2857,20 +2857,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/docmanager-extension@^4.1.0, @jupyterlab/docmanager-extension@workspace:packages/docmanager-extension, @jupyterlab/docmanager-extension@~4.1.0": +"@jupyterlab/docmanager-extension@^4.1.5, @jupyterlab/docmanager-extension@workspace:packages/docmanager-extension, @jupyterlab/docmanager-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/docmanager-extension@workspace:packages/docmanager-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -2884,18 +2884,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/docmanager@^4.1.0, @jupyterlab/docmanager@workspace:packages/docmanager": +"@jupyterlab/docmanager@^4.1.5, @jupyterlab/docmanager@workspace:packages/docmanager": version: 0.0.0-use.local resolution: "@jupyterlab/docmanager@workspace:packages/docmanager" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2912,21 +2912,21 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/docregistry@^4.1.0, @jupyterlab/docregistry@workspace:packages/docregistry": +"@jupyterlab/docregistry@^4.1.5, @jupyterlab/docregistry@workspace:packages/docregistry": version: 0.0.0-use.local resolution: "@jupyterlab/docregistry@workspace:packages/docregistry" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2943,15 +2943,15 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/documentsearch-extension@^4.1.0, @jupyterlab/documentsearch-extension@workspace:packages/documentsearch-extension, @jupyterlab/documentsearch-extension@~4.1.0": +"@jupyterlab/documentsearch-extension@^4.1.5, @jupyterlab/documentsearch-extension@workspace:packages/documentsearch-extension, @jupyterlab/documentsearch-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/documentsearch-extension@workspace:packages/documentsearch-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 rimraf: ~5.0.5 @@ -2959,14 +2959,14 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/documentsearch@^4.1.0, @jupyterlab/documentsearch@workspace:packages/documentsearch": +"@jupyterlab/documentsearch@^4.1.5, @jupyterlab/documentsearch@workspace:packages/documentsearch": version: 0.0.0-use.local resolution: "@jupyterlab/documentsearch@workspace:packages/documentsearch" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2986,39 +2986,39 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/example-app@workspace:examples/app" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/application-extension": ^4.1.0 - "@jupyterlab/apputils-extension": ^4.1.0 - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/celltags-extension": ^4.1.0 - "@jupyterlab/codemirror-extension": ^4.1.0 - "@jupyterlab/completer-extension": ^4.1.0 - "@jupyterlab/console-extension": ^4.1.0 - "@jupyterlab/csvviewer-extension": ^4.1.0 - "@jupyterlab/docmanager-extension": ^4.1.0 - "@jupyterlab/filebrowser-extension": ^4.1.0 - "@jupyterlab/fileeditor-extension": ^4.1.0 - "@jupyterlab/help-extension": ^4.1.0 - "@jupyterlab/imageviewer-extension": ^4.1.0 - "@jupyterlab/inspector-extension": ^4.1.0 - "@jupyterlab/launcher-extension": ^4.1.0 - "@jupyterlab/mainmenu-extension": ^4.1.0 - "@jupyterlab/markdownviewer-extension": ^4.1.0 - "@jupyterlab/mathjax-extension": ^4.1.0 - "@jupyterlab/metadataform-extension": ^4.1.0 - "@jupyterlab/notebook-extension": ^4.1.0 - "@jupyterlab/rendermime-extension": ^4.1.0 - "@jupyterlab/running-extension": ^4.1.0 - "@jupyterlab/settingeditor-extension": ^4.1.0 - "@jupyterlab/shortcuts-extension": ^4.1.0 - "@jupyterlab/statusbar-extension": ^4.1.0 - "@jupyterlab/theme-dark-extension": ^4.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/toc-extension": ^6.1.0 - "@jupyterlab/tooltip-extension": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/translation-extension": ^4.1.0 - "@jupyterlab/ui-components-extension": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/application-extension": ^4.1.5 + "@jupyterlab/apputils-extension": ^4.1.5 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/celltags-extension": ^4.1.5 + "@jupyterlab/codemirror-extension": ^4.1.5 + "@jupyterlab/completer-extension": ^4.1.5 + "@jupyterlab/console-extension": ^4.1.5 + "@jupyterlab/csvviewer-extension": ^4.1.5 + "@jupyterlab/docmanager-extension": ^4.1.5 + "@jupyterlab/filebrowser-extension": ^4.1.5 + "@jupyterlab/fileeditor-extension": ^4.1.5 + "@jupyterlab/help-extension": ^4.1.5 + "@jupyterlab/imageviewer-extension": ^4.1.5 + "@jupyterlab/inspector-extension": ^4.1.5 + "@jupyterlab/launcher-extension": ^4.1.5 + "@jupyterlab/mainmenu-extension": ^4.1.5 + "@jupyterlab/markdownviewer-extension": ^4.1.5 + "@jupyterlab/mathjax-extension": ^4.1.5 + "@jupyterlab/metadataform-extension": ^4.1.5 + "@jupyterlab/notebook-extension": ^4.1.5 + "@jupyterlab/rendermime-extension": ^4.1.5 + "@jupyterlab/running-extension": ^4.1.5 + "@jupyterlab/settingeditor-extension": ^4.1.5 + "@jupyterlab/shortcuts-extension": ^4.1.5 + "@jupyterlab/statusbar-extension": ^4.1.5 + "@jupyterlab/theme-dark-extension": ^4.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/toc-extension": ^6.1.5 + "@jupyterlab/tooltip-extension": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/translation-extension": ^4.1.5 + "@jupyterlab/ui-components-extension": ^4.1.5 css-loader: ^6.7.1 fs-extra: ^10.1.0 glob: ~7.1.6 @@ -3040,16 +3040,16 @@ __metadata: dependencies: "@jupyter/web-components": ^0.15.2 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 css-loader: ^6.7.1 @@ -3070,14 +3070,14 @@ __metadata: dependencies: "@jupyter/web-components": ^0.15.2 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 css-loader: ^6.7.1 @@ -3095,48 +3095,48 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/example-federated-core@workspace:examples/federated/core_package" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/application-extension": ^4.1.0 - "@jupyterlab/apputils-extension": ^4.1.0 - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/celltags-extension": ^4.1.0 - "@jupyterlab/codemirror-extension": ^4.1.0 - "@jupyterlab/completer-extension": ^4.1.0 - "@jupyterlab/console-extension": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/csvviewer-extension": ^4.1.0 - "@jupyterlab/debugger-extension": ^4.1.0 - "@jupyterlab/docmanager-extension": ^4.1.0 - "@jupyterlab/documentsearch-extension": ^4.1.0 - "@jupyterlab/extensionmanager-extension": ^4.1.0 - "@jupyterlab/filebrowser-extension": ^4.1.0 - "@jupyterlab/fileeditor-extension": ^4.1.0 - "@jupyterlab/help-extension": ^4.1.0 - "@jupyterlab/htmlviewer-extension": ^4.1.0 - "@jupyterlab/hub-extension": ^4.1.0 - "@jupyterlab/imageviewer-extension": ^4.1.0 - "@jupyterlab/inspector-extension": ^4.1.0 - "@jupyterlab/javascript-extension": ^4.1.0 - "@jupyterlab/json-extension": ^4.1.0 - "@jupyterlab/launcher-extension": ^4.1.0 - "@jupyterlab/logconsole-extension": ^4.1.0 - "@jupyterlab/lsp-extension": ^4.1.0 - "@jupyterlab/mainmenu-extension": ^4.1.0 - "@jupyterlab/mathjax-extension": ^4.1.0 - "@jupyterlab/metadataform-extension": ^4.1.0 - "@jupyterlab/notebook-extension": ^4.1.0 - "@jupyterlab/pdf-extension": ^4.1.0 - "@jupyterlab/rendermime-extension": ^4.1.0 - "@jupyterlab/settingeditor-extension": ^4.1.0 - "@jupyterlab/shortcuts-extension": ^4.1.0 - "@jupyterlab/statusbar-extension": ^4.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/toc-extension": ^6.1.0 - "@jupyterlab/tooltip-extension": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/translation-extension": ^4.1.0 - "@jupyterlab/ui-components-extension": ^4.1.0 - "@jupyterlab/vega5-extension": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/application-extension": ^4.1.5 + "@jupyterlab/apputils-extension": ^4.1.5 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/celltags-extension": ^4.1.5 + "@jupyterlab/codemirror-extension": ^4.1.5 + "@jupyterlab/completer-extension": ^4.1.5 + "@jupyterlab/console-extension": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/csvviewer-extension": ^4.1.5 + "@jupyterlab/debugger-extension": ^4.1.5 + "@jupyterlab/docmanager-extension": ^4.1.5 + "@jupyterlab/documentsearch-extension": ^4.1.5 + "@jupyterlab/extensionmanager-extension": ^4.1.5 + "@jupyterlab/filebrowser-extension": ^4.1.5 + "@jupyterlab/fileeditor-extension": ^4.1.5 + "@jupyterlab/help-extension": ^4.1.5 + "@jupyterlab/htmlviewer-extension": ^4.1.5 + "@jupyterlab/hub-extension": ^4.1.5 + "@jupyterlab/imageviewer-extension": ^4.1.5 + "@jupyterlab/inspector-extension": ^4.1.5 + "@jupyterlab/javascript-extension": ^4.1.5 + "@jupyterlab/json-extension": ^4.1.5 + "@jupyterlab/launcher-extension": ^4.1.5 + "@jupyterlab/logconsole-extension": ^4.1.5 + "@jupyterlab/lsp-extension": ^4.1.5 + "@jupyterlab/mainmenu-extension": ^4.1.5 + "@jupyterlab/mathjax-extension": ^4.1.5 + "@jupyterlab/metadataform-extension": ^4.1.5 + "@jupyterlab/notebook-extension": ^4.1.5 + "@jupyterlab/pdf-extension": ^4.1.5 + "@jupyterlab/rendermime-extension": ^4.1.5 + "@jupyterlab/settingeditor-extension": ^4.1.5 + "@jupyterlab/shortcuts-extension": ^4.1.5 + "@jupyterlab/statusbar-extension": ^4.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/toc-extension": ^6.1.5 + "@jupyterlab/tooltip-extension": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/translation-extension": ^4.1.5 + "@jupyterlab/ui-components-extension": ^4.1.5 + "@jupyterlab/vega5-extension": ^4.1.5 copy-webpack-plugin: ^11.0.0 css-loader: ^6.7.1 fs-extra: ^10.1.0 @@ -3157,20 +3157,20 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/example-federated-md@workspace:examples/federated/md_package" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/example-federated-middle": ^3.0.3 - "@jupyterlab/markdownviewer-extension": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/example-federated-middle": ^3.0.8 + "@jupyterlab/markdownviewer-extension": ^4.1.5 "@lumino/widgets": ^2.3.1 rimraf: ~5.0.5 languageName: unknown linkType: soft -"@jupyterlab/example-federated-middle@^3.0.3, @jupyterlab/example-federated-middle@workspace:examples/federated/middle_package": +"@jupyterlab/example-federated-middle@^3.0.8, @jupyterlab/example-federated-middle@workspace:examples/federated/middle_package": version: 0.0.0-use.local resolution: "@jupyterlab/example-federated-middle@workspace:examples/federated/middle_package" dependencies: - "@jupyterlab/builder": ^4.1.0 + "@jupyterlab/builder": ^4.1.5 "@lumino/coreutils": ^2.1.2 rimraf: ~5.0.5 languageName: unknown @@ -3187,18 +3187,18 @@ __metadata: resolution: "@jupyterlab/example-filebrowser@workspace:examples/filebrowser" dependencies: "@jupyter/web-components": ^0.15.2 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 css-loader: ^6.7.1 @@ -3219,22 +3219,22 @@ __metadata: dependencies: "@jupyter/web-components": ^0.15.2 "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/markedparser-extension": ^4.1.0 - "@jupyterlab/mathjax-extension": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/markedparser-extension": ^4.1.5 + "@jupyterlab/mathjax-extension": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 css-loader: ^6.7.1 @@ -3253,8 +3253,8 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/example-services-browser@workspace:packages/services/examples/browser" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 "@lumino/coreutils": ^2.1.2 rimraf: ~5.0.5 typescript: ~5.1.6 @@ -3267,10 +3267,10 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/example-services-outputarea@workspace:packages/services/examples/typescript-browser-with-output" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 css-loader: ^6.7.1 rimraf: ~5.0.5 style-loader: ~3.3.1 @@ -3284,11 +3284,11 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/example-simple-list@workspace:packages/ui-components/examples/simple-windowed-list" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 css-loader: ^6.7.1 @@ -3307,11 +3307,11 @@ __metadata: resolution: "@jupyterlab/example-terminal@workspace:examples/terminal" dependencies: "@jupyter/web-components": ^0.15.2 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/terminal": ^4.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/terminal": ^4.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 "@lumino/widgets": ^2.3.1 css-loader: ^6.7.1 mini-css-extract-plugin: ^2.7.0 @@ -3325,31 +3325,31 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/extensionmanager-extension@^4.1.0, @jupyterlab/extensionmanager-extension@workspace:packages/extensionmanager-extension, @jupyterlab/extensionmanager-extension@~4.1.0": +"@jupyterlab/extensionmanager-extension@^4.1.5, @jupyterlab/extensionmanager-extension@workspace:packages/extensionmanager-extension, @jupyterlab/extensionmanager-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/extensionmanager-extension@workspace:packages/extensionmanager-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/extensionmanager": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/extensionmanager": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/extensionmanager@^4.1.0, @jupyterlab/extensionmanager@workspace:packages/extensionmanager": +"@jupyterlab/extensionmanager@^4.1.5, @jupyterlab/extensionmanager@workspace:packages/extensionmanager": version: 0.0.0-use.local resolution: "@jupyterlab/extensionmanager@workspace:packages/extensionmanager" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/messaging": ^2.0.1 "@lumino/polling": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -3366,22 +3366,22 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/filebrowser-extension@^4.1.0, @jupyterlab/filebrowser-extension@workspace:packages/filebrowser-extension, @jupyterlab/filebrowser-extension@~4.1.0": +"@jupyterlab/filebrowser-extension@^4.1.5, @jupyterlab/filebrowser-extension@workspace:packages/filebrowser-extension, @jupyterlab/filebrowser-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/filebrowser-extension@workspace:packages/filebrowser-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/widgets": ^2.3.1 @@ -3391,20 +3391,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/filebrowser@^4.1.0, @jupyterlab/filebrowser@workspace:packages/filebrowser": +"@jupyterlab/filebrowser@^4.1.5, @jupyterlab/filebrowser@workspace:packages/filebrowser": version: 0.0.0-use.local resolution: "@jupyterlab/filebrowser@workspace:packages/filebrowser" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -3424,34 +3424,34 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/fileeditor-extension@^4.1.0, @jupyterlab/fileeditor-extension@workspace:packages/fileeditor-extension, @jupyterlab/fileeditor-extension@~4.1.0": +"@jupyterlab/fileeditor-extension@^4.1.5, @jupyterlab/fileeditor-extension@workspace:packages/fileeditor-extension, @jupyterlab/fileeditor-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/fileeditor-extension@workspace:packages/fileeditor-extension" dependencies: "@codemirror/commands": ^6.2.3 "@codemirror/search": ^6.3.0 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -3462,23 +3462,23 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/fileeditor@^4.1.0, @jupyterlab/fileeditor@workspace:packages/fileeditor": +"@jupyterlab/fileeditor@^4.1.5, @jupyterlab/fileeditor@workspace:packages/fileeditor": version: 0.0.0-use.local resolution: "@jupyterlab/fileeditor@workspace:packages/fileeditor" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -3497,15 +3497,15 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/galata-extension@workspace:galata/extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/debugger": ^4.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/debugger": ^4.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 @@ -3518,15 +3518,15 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/galata@workspace:galata" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/debugger": ^4.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/debugger": ^4.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@playwright/test": ^1.32.2 "@stdlib/stats": ~0.0.13 @@ -3542,17 +3542,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/help-extension@^4.1.0, @jupyterlab/help-extension@workspace:packages/help-extension, @jupyterlab/help-extension@~4.1.0": +"@jupyterlab/help-extension@^4.1.5, @jupyterlab/help-extension@workspace:packages/help-extension, @jupyterlab/help-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/help-extension@workspace:packages/help-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 @@ -3564,32 +3564,32 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/htmlviewer-extension@^4.1.0, @jupyterlab/htmlviewer-extension@workspace:packages/htmlviewer-extension, @jupyterlab/htmlviewer-extension@~4.1.0": +"@jupyterlab/htmlviewer-extension@^4.1.5, @jupyterlab/htmlviewer-extension@workspace:packages/htmlviewer-extension, @jupyterlab/htmlviewer-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/htmlviewer-extension@workspace:packages/htmlviewer-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/htmlviewer": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/htmlviewer": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/htmlviewer@^4.1.0, @jupyterlab/htmlviewer@workspace:packages/htmlviewer": +"@jupyterlab/htmlviewer@^4.1.5, @jupyterlab/htmlviewer@workspace:packages/htmlviewer": version: 0.0.0-use.local resolution: "@jupyterlab/htmlviewer@workspace:packages/htmlviewer" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -3599,43 +3599,43 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/hub-extension@^4.1.0, @jupyterlab/hub-extension@workspace:packages/hub-extension, @jupyterlab/hub-extension@~4.1.0": +"@jupyterlab/hub-extension@^4.1.5, @jupyterlab/hub-extension@workspace:packages/hub-extension, @jupyterlab/hub-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/hub-extension@workspace:packages/hub-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/imageviewer-extension@^4.1.0, @jupyterlab/imageviewer-extension@workspace:packages/imageviewer-extension, @jupyterlab/imageviewer-extension@~4.1.0": +"@jupyterlab/imageviewer-extension@^4.1.5, @jupyterlab/imageviewer-extension@workspace:packages/imageviewer-extension, @jupyterlab/imageviewer-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/imageviewer-extension@workspace:packages/imageviewer-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/imageviewer": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/imageviewer": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/imageviewer@^4.1.0, @jupyterlab/imageviewer@workspace:packages/imageviewer": +"@jupyterlab/imageviewer@^4.1.5, @jupyterlab/imageviewer@workspace:packages/imageviewer": version: 0.0.0-use.local resolution: "@jupyterlab/imageviewer@workspace:packages/imageviewer" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 @@ -3647,18 +3647,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/inspector-extension@^4.1.0, @jupyterlab/inspector-extension@workspace:packages/inspector-extension, @jupyterlab/inspector-extension@~4.1.0": +"@jupyterlab/inspector-extension@^4.1.5, @jupyterlab/inspector-extension@workspace:packages/inspector-extension, @jupyterlab/inspector-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/inspector-extension@workspace:packages/inspector-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/inspector": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/inspector": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/widgets": ^2.3.1 rimraf: ~5.0.5 typedoc: ~0.24.7 @@ -3666,18 +3666,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/inspector@^4.1.0, @jupyterlab/inspector@workspace:packages/inspector": +"@jupyterlab/inspector@^4.1.5, @jupyterlab/inspector@workspace:packages/inspector": version: 0.0.0-use.local resolution: "@jupyterlab/inspector@workspace:packages/inspector" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/polling": ^2.1.2 @@ -3691,27 +3691,27 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/javascript-extension@^4.1.0, @jupyterlab/javascript-extension@workspace:packages/javascript-extension, @jupyterlab/javascript-extension@~4.1.0": +"@jupyterlab/javascript-extension@^4.1.5, @jupyterlab/javascript-extension@workspace:packages/javascript-extension, @jupyterlab/javascript-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/javascript-extension@workspace:packages/javascript-extension" dependencies: - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/json-extension@^4.1.0, @jupyterlab/json-extension@workspace:packages/json-extension, @jupyterlab/json-extension@~4.1.0": +"@jupyterlab/json-extension@^4.1.5, @jupyterlab/json-extension@workspace:packages/json-extension, @jupyterlab/json-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/json-extension@workspace:packages/json-extension" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lezer/highlight": ^1.1.4 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -3730,16 +3730,16 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/launcher-extension@^4.1.0, @jupyterlab/launcher-extension@workspace:packages/launcher-extension, @jupyterlab/launcher-extension@~4.1.0": +"@jupyterlab/launcher-extension@^4.1.5, @jupyterlab/launcher-extension@workspace:packages/launcher-extension, @jupyterlab/launcher-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/launcher-extension@workspace:packages/launcher-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -3749,13 +3749,13 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/launcher@^4.1.0, @jupyterlab/launcher@workspace:packages/launcher": +"@jupyterlab/launcher@^4.1.5, @jupyterlab/launcher@workspace:packages/launcher": version: 0.0.0-use.local resolution: "@jupyterlab/launcher@workspace:packages/launcher" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -3770,19 +3770,19 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/logconsole-extension@^4.1.0, @jupyterlab/logconsole-extension@workspace:packages/logconsole-extension, @jupyterlab/logconsole-extension@~4.1.0": +"@jupyterlab/logconsole-extension@^4.1.5, @jupyterlab/logconsole-extension@workspace:packages/logconsole-extension, @jupyterlab/logconsole-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/logconsole-extension@workspace:packages/logconsole-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -3792,17 +3792,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/logconsole@^4.1.0, @jupyterlab/logconsole@workspace:packages/logconsole": +"@jupyterlab/logconsole@^4.1.5, @jupyterlab/logconsole@workspace:packages/logconsole": version: 0.0.0-use.local resolution: "@jupyterlab/logconsole@workspace:packages/logconsole" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -3815,17 +3815,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/lsp-extension@^4.1.0, @jupyterlab/lsp-extension@workspace:packages/lsp-extension, @jupyterlab/lsp-extension@~4.1.0": +"@jupyterlab/lsp-extension@^4.1.5, @jupyterlab/lsp-extension@workspace:packages/lsp-extension, @jupyterlab/lsp-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/lsp-extension@workspace:packages/lsp-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 @@ -3836,18 +3836,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/lsp@^4.1.0, @jupyterlab/lsp@workspace:packages/lsp": +"@jupyterlab/lsp@^4.1.5, @jupyterlab/lsp@workspace:packages/lsp": version: 0.0.0-use.local resolution: "@jupyterlab/lsp@workspace:packages/lsp" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 @@ -3865,18 +3865,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/mainmenu-extension@^4.1.0, @jupyterlab/mainmenu-extension@workspace:packages/mainmenu-extension, @jupyterlab/mainmenu-extension@~4.1.0": +"@jupyterlab/mainmenu-extension@^4.1.5, @jupyterlab/mainmenu-extension@workspace:packages/mainmenu-extension, @jupyterlab/mainmenu-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/mainmenu-extension@workspace:packages/mainmenu-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -3887,14 +3887,14 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/mainmenu@^4.1.0, @jupyterlab/mainmenu@workspace:packages/mainmenu": +"@jupyterlab/mainmenu@^4.1.5, @jupyterlab/mainmenu@workspace:packages/mainmenu": version: 0.0.0-use.local resolution: "@jupyterlab/mainmenu@workspace:packages/mainmenu" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -3907,34 +3907,34 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/markdownviewer-extension@^4.1.0, @jupyterlab/markdownviewer-extension@workspace:packages/markdownviewer-extension, @jupyterlab/markdownviewer-extension@~4.1.0": +"@jupyterlab/markdownviewer-extension@^4.1.5, @jupyterlab/markdownviewer-extension@workspace:packages/markdownviewer-extension, @jupyterlab/markdownviewer-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/markdownviewer-extension@workspace:packages/markdownviewer-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/markdownviewer": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/markdownviewer": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/markdownviewer@^4.1.0, @jupyterlab/markdownviewer@workspace:packages/markdownviewer": +"@jupyterlab/markdownviewer@^4.1.5, @jupyterlab/markdownviewer@workspace:packages/markdownviewer": version: 0.0.0-use.local resolution: "@jupyterlab/markdownviewer@workspace:packages/markdownviewer" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 @@ -3945,15 +3945,15 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/markedparser-extension@^4.1.0, @jupyterlab/markedparser-extension@workspace:packages/markedparser-extension, @jupyterlab/markedparser-extension@~4.1.0": +"@jupyterlab/markedparser-extension@^4.1.5, @jupyterlab/markedparser-extension@workspace:packages/markedparser-extension, @jupyterlab/markedparser-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/markedparser-extension@workspace:packages/markedparser-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/mermaid": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/mermaid": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@types/d3": ^7.4.0 "@types/dompurify": ^2.4.0 @@ -3966,12 +3966,12 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/mathjax-extension@^4.1.0, @jupyterlab/mathjax-extension@workspace:packages/mathjax-extension, @jupyterlab/mathjax-extension@~4.1.0": +"@jupyterlab/mathjax-extension@^4.1.5, @jupyterlab/mathjax-extension@workspace:packages/mathjax-extension, @jupyterlab/mathjax-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/mathjax-extension@workspace:packages/mathjax-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 "@lumino/coreutils": ^2.1.2 mathjax-full: ^3.2.2 rimraf: ~5.0.5 @@ -3980,28 +3980,28 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/mermaid-extension@^4.1.0, @jupyterlab/mermaid-extension@workspace:packages/mermaid-extension, @jupyterlab/mermaid-extension@~4.1.0": +"@jupyterlab/mermaid-extension@^4.1.5, @jupyterlab/mermaid-extension@workspace:packages/mermaid-extension, @jupyterlab/mermaid-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/mermaid-extension@workspace:packages/mermaid-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/mermaid": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/mermaid": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/mermaid@^4.1.0, @jupyterlab/mermaid@workspace:packages/mermaid": +"@jupyterlab/mermaid@^4.1.5, @jupyterlab/mermaid@workspace:packages/mermaid": version: 0.0.0-use.local resolution: "@jupyterlab/mermaid@workspace:packages/mermaid" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 "@types/jest": ^29.2.0 @@ -4013,33 +4013,33 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/metadataform-extension@^4.1.0, @jupyterlab/metadataform-extension@workspace:packages/metadataform-extension, @jupyterlab/metadataform-extension@~4.1.0": +"@jupyterlab/metadataform-extension@^4.1.5, @jupyterlab/metadataform-extension@workspace:packages/metadataform-extension, @jupyterlab/metadataform-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/metadataform-extension@workspace:packages/metadataform-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/metadataform": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/metadataform": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/metadataform@^4.1.0, @jupyterlab/metadataform@workspace:packages/metadataform": +"@jupyterlab/metadataform@^4.1.5, @jupyterlab/metadataform@workspace:packages/metadataform": version: 0.0.0-use.local resolution: "@jupyterlab/metadataform@workspace:packages/metadataform" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 @@ -4060,101 +4060,101 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/metapackage@workspace:packages/metapackage" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/application-extension": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/apputils-extension": ^4.1.0 - "@jupyterlab/attachments": ^4.1.0 - "@jupyterlab/cell-toolbar": ^4.1.0 - "@jupyterlab/cell-toolbar-extension": ^4.1.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/celltags-extension": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/codemirror-extension": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/completer-extension": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/console-extension": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/csvviewer": ^4.1.0 - "@jupyterlab/csvviewer-extension": ^4.1.0 - "@jupyterlab/debugger": ^4.1.0 - "@jupyterlab/debugger-extension": ^4.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docmanager-extension": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/documentsearch-extension": ^4.1.0 - "@jupyterlab/extensionmanager": ^4.1.0 - "@jupyterlab/extensionmanager-extension": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/filebrowser-extension": ^4.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/fileeditor-extension": ^4.1.0 - "@jupyterlab/help-extension": ^4.1.0 - "@jupyterlab/htmlviewer": ^4.1.0 - "@jupyterlab/htmlviewer-extension": ^4.1.0 - "@jupyterlab/hub-extension": ^4.1.0 - "@jupyterlab/imageviewer": ^4.1.0 - "@jupyterlab/imageviewer-extension": ^4.1.0 - "@jupyterlab/inspector": ^4.1.0 - "@jupyterlab/inspector-extension": ^4.1.0 - "@jupyterlab/javascript-extension": ^4.1.0 - "@jupyterlab/json-extension": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/launcher-extension": ^4.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/logconsole-extension": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/lsp-extension": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/mainmenu-extension": ^4.1.0 - "@jupyterlab/markdownviewer": ^4.1.0 - "@jupyterlab/markdownviewer-extension": ^4.1.0 - "@jupyterlab/markedparser-extension": ^4.1.0 - "@jupyterlab/mathjax-extension": ^4.1.0 - "@jupyterlab/mermaid": ^4.1.0 - "@jupyterlab/mermaid-extension": ^4.1.0 - "@jupyterlab/metadataform": ^4.1.0 - "@jupyterlab/metadataform-extension": ^4.1.0 - "@jupyterlab/nbconvert-css": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/notebook-extension": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/pdf-extension": ^4.1.0 - "@jupyterlab/pluginmanager": ^4.1.0 - "@jupyterlab/pluginmanager-extension": ^4.1.0 - "@jupyterlab/property-inspector": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-extension": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/running-extension": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingeditor": ^4.1.0 - "@jupyterlab/settingeditor-extension": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/shortcuts-extension": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/statusbar-extension": ^4.1.0 - "@jupyterlab/terminal": ^4.1.0 - "@jupyterlab/terminal-extension": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/theme-dark-extension": ^4.1.0 - "@jupyterlab/theme-light-extension": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/toc-extension": ^6.1.0 - "@jupyterlab/tooltip": ^4.1.0 - "@jupyterlab/tooltip-extension": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/translation-extension": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 - "@jupyterlab/ui-components-extension": ^4.1.0 - "@jupyterlab/vega5-extension": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/application-extension": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/apputils-extension": ^4.1.5 + "@jupyterlab/attachments": ^4.1.5 + "@jupyterlab/cell-toolbar": ^4.1.5 + "@jupyterlab/cell-toolbar-extension": ^4.1.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/celltags-extension": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/codemirror-extension": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/completer-extension": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/console-extension": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/csvviewer": ^4.1.5 + "@jupyterlab/csvviewer-extension": ^4.1.5 + "@jupyterlab/debugger": ^4.1.5 + "@jupyterlab/debugger-extension": ^4.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docmanager-extension": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/documentsearch-extension": ^4.1.5 + "@jupyterlab/extensionmanager": ^4.1.5 + "@jupyterlab/extensionmanager-extension": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/filebrowser-extension": ^4.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/fileeditor-extension": ^4.1.5 + "@jupyterlab/help-extension": ^4.1.5 + "@jupyterlab/htmlviewer": ^4.1.5 + "@jupyterlab/htmlviewer-extension": ^4.1.5 + "@jupyterlab/hub-extension": ^4.1.5 + "@jupyterlab/imageviewer": ^4.1.5 + "@jupyterlab/imageviewer-extension": ^4.1.5 + "@jupyterlab/inspector": ^4.1.5 + "@jupyterlab/inspector-extension": ^4.1.5 + "@jupyterlab/javascript-extension": ^4.1.5 + "@jupyterlab/json-extension": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/launcher-extension": ^4.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/logconsole-extension": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/lsp-extension": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/mainmenu-extension": ^4.1.5 + "@jupyterlab/markdownviewer": ^4.1.5 + "@jupyterlab/markdownviewer-extension": ^4.1.5 + "@jupyterlab/markedparser-extension": ^4.1.5 + "@jupyterlab/mathjax-extension": ^4.1.5 + "@jupyterlab/mermaid": ^4.1.5 + "@jupyterlab/mermaid-extension": ^4.1.5 + "@jupyterlab/metadataform": ^4.1.5 + "@jupyterlab/metadataform-extension": ^4.1.5 + "@jupyterlab/nbconvert-css": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/notebook-extension": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/pdf-extension": ^4.1.5 + "@jupyterlab/pluginmanager": ^4.1.5 + "@jupyterlab/pluginmanager-extension": ^4.1.5 + "@jupyterlab/property-inspector": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-extension": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/running-extension": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingeditor": ^4.1.5 + "@jupyterlab/settingeditor-extension": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/shortcuts-extension": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/statusbar-extension": ^4.1.5 + "@jupyterlab/terminal": ^4.1.5 + "@jupyterlab/terminal-extension": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/theme-dark-extension": ^4.1.5 + "@jupyterlab/theme-light-extension": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/toc-extension": ^6.1.5 + "@jupyterlab/tooltip": ^4.1.5 + "@jupyterlab/tooltip-extension": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/translation-extension": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 + "@jupyterlab/ui-components-extension": ^4.1.5 + "@jupyterlab/vega5-extension": ^4.1.5 "@types/jest": ^29.2.0 fs-extra: ^10.1.0 jest: ^29.2.0 @@ -4169,8 +4169,8 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/mock-consumer@workspace:jupyterlab/tests/mock_packages/interop/consumer" dependencies: - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/mock-token": ^4.1.0 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/mock-token": ^4.1.5 languageName: unknown linkType: soft @@ -4178,8 +4178,8 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/mock-extension@workspace:jupyterlab/tests/mock_packages/extension" dependencies: - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 languageName: unknown linkType: soft @@ -4187,12 +4187,12 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/mock-provider@workspace:jupyterlab/tests/mock_packages/interop/provider" dependencies: - "@jupyterlab/builder": ^4.1.0 - "@jupyterlab/mock-token": ^4.1.0 + "@jupyterlab/builder": ^4.1.5 + "@jupyterlab/mock-token": ^4.1.5 languageName: unknown linkType: soft -"@jupyterlab/mock-token@^4.1.0, @jupyterlab/mock-token@workspace:jupyterlab/tests/mock_packages/interop/token": +"@jupyterlab/mock-token@^4.1.5, @jupyterlab/mock-token@workspace:jupyterlab/tests/mock_packages/interop/token": version: 0.0.0-use.local resolution: "@jupyterlab/mock-token@workspace:jupyterlab/tests/mock_packages/interop/token" dependencies: @@ -4200,17 +4200,17 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/nbconvert-css@^4.1.0, @jupyterlab/nbconvert-css@workspace:packages/nbconvert-css": +"@jupyterlab/nbconvert-css@^4.1.5, @jupyterlab/nbconvert-css@workspace:packages/nbconvert-css": version: 0.0.0-use.local resolution: "@jupyterlab/nbconvert-css@workspace:packages/nbconvert-css" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/outputarea": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/outputarea": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 css-loader: ^6.7.1 mini-css-extract-plugin: ^2.7.0 null-loader: ^4.0.0 @@ -4220,11 +4220,11 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/nbformat@^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@^4.1.0, @jupyterlab/nbformat@workspace:packages/nbformat": +"@jupyterlab/nbformat@^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@^4.1.5, @jupyterlab/nbformat@workspace:packages/nbformat": version: 0.0.0-use.local resolution: "@jupyterlab/nbformat@workspace:packages/nbformat" dependencies: - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/testing": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@types/jest": ^29.2.0 jest: ^29.2.0 @@ -4233,40 +4233,40 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/notebook-extension@^4.1.0, @jupyterlab/notebook-extension@workspace:packages/notebook-extension, @jupyterlab/notebook-extension@~4.1.0": +"@jupyterlab/notebook-extension@^4.1.5, @jupyterlab/notebook-extension@workspace:packages/notebook-extension, @jupyterlab/notebook-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/notebook-extension@workspace:packages/notebook-extension" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/completer": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/docmanager-extension": ^4.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/filebrowser": ^4.1.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/logconsole": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/metadataform": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/property-inspector": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/completer": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/docmanager-extension": ^4.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/filebrowser": ^4.1.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/logconsole": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/metadataform": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/property-inspector": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -4282,29 +4282,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/notebook@^4.1.0, @jupyterlab/notebook@workspace:packages/notebook": +"@jupyterlab/notebook@^4.1.5, @jupyterlab/notebook@workspace:packages/notebook": version: 0.0.0-use.local resolution: "@jupyterlab/notebook@workspace:packages/notebook" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/cells": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/codemirror": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/documentsearch": ^4.1.0 - "@jupyterlab/lsp": ^4.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/cells": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/codemirror": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/documentsearch": ^4.1.5 + "@jupyterlab/lsp": ^4.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -4324,11 +4324,11 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/observables@^5.1.0, @jupyterlab/observables@workspace:packages/observables": +"@jupyterlab/observables@^5.1.5, @jupyterlab/observables@workspace:packages/observables": version: 0.0.0-use.local resolution: "@jupyterlab/observables@workspace:packages/observables" dependencies: - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/testing": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -4342,18 +4342,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/outputarea@^4.1.0, @jupyterlab/outputarea@workspace:packages/outputarea": +"@jupyterlab/outputarea@^4.1.5, @jupyterlab/outputarea@workspace:packages/outputarea": version: 0.0.0-use.local resolution: "@jupyterlab/outputarea@workspace:packages/outputarea" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -4369,11 +4369,11 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/pdf-extension@^4.1.0, @jupyterlab/pdf-extension@workspace:packages/pdf-extension, @jupyterlab/pdf-extension@~4.1.0": +"@jupyterlab/pdf-extension@^4.1.5, @jupyterlab/pdf-extension@workspace:packages/pdf-extension, @jupyterlab/pdf-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/pdf-extension@workspace:packages/pdf-extension" dependencies: - "@jupyterlab/rendermime-interfaces": ^3.9.0 + "@jupyterlab/rendermime-interfaces": ^3.9.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -4383,32 +4383,32 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/pluginmanager-extension@^4.1.0, @jupyterlab/pluginmanager-extension@workspace:packages/pluginmanager-extension, @jupyterlab/pluginmanager-extension@~4.1.0": +"@jupyterlab/pluginmanager-extension@^4.1.5, @jupyterlab/pluginmanager-extension@workspace:packages/pluginmanager-extension, @jupyterlab/pluginmanager-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/pluginmanager-extension@workspace:packages/pluginmanager-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/pluginmanager": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/pluginmanager": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/pluginmanager@^4.1.0, @jupyterlab/pluginmanager@workspace:packages/pluginmanager": +"@jupyterlab/pluginmanager@^4.1.5, @jupyterlab/pluginmanager@workspace:packages/pluginmanager": version: 0.0.0-use.local resolution: "@jupyterlab/pluginmanager@workspace:packages/pluginmanager" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -4420,13 +4420,13 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/property-inspector@^4.1.0, @jupyterlab/property-inspector@workspace:packages/property-inspector": +"@jupyterlab/property-inspector@^4.1.5, @jupyterlab/property-inspector@workspace:packages/property-inspector": version: 0.0.0-use.local resolution: "@jupyterlab/property-inspector@workspace:packages/property-inspector" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 @@ -4438,22 +4438,22 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/rendermime-extension@^4.1.0, @jupyterlab/rendermime-extension@workspace:packages/rendermime-extension, @jupyterlab/rendermime-extension@~4.1.0": +"@jupyterlab/rendermime-extension@^4.1.5, @jupyterlab/rendermime-extension@workspace:packages/rendermime-extension, @jupyterlab/rendermime-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/rendermime-extension@workspace:packages/rendermime-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/docmanager": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/docmanager": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/rendermime-interfaces@^3.9.0, @jupyterlab/rendermime-interfaces@workspace:packages/rendermime-interfaces": +"@jupyterlab/rendermime-interfaces@^3.9.5, @jupyterlab/rendermime-interfaces@workspace:packages/rendermime-interfaces": version: 0.0.0-use.local resolution: "@jupyterlab/rendermime-interfaces@workspace:packages/rendermime-interfaces" dependencies: @@ -4465,18 +4465,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/rendermime@^4.1.0, @jupyterlab/rendermime@workspace:packages/rendermime": +"@jupyterlab/rendermime@^4.1.5, @jupyterlab/rendermime@workspace:packages/rendermime": version: 0.0.0-use.local resolution: "@jupyterlab/rendermime@workspace:packages/rendermime" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 @@ -4516,18 +4516,18 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/running-extension@^4.1.0, @jupyterlab/running-extension@workspace:packages/running-extension, @jupyterlab/running-extension@~4.1.0": +"@jupyterlab/running-extension@^4.1.5, @jupyterlab/running-extension@workspace:packages/running-extension, @jupyterlab/running-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/running-extension@workspace:packages/running-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 @@ -4538,13 +4538,13 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/running@^4.1.0, @jupyterlab/running@workspace:packages/running": +"@jupyterlab/running@^4.1.5, @jupyterlab/running@workspace:packages/running": version: 0.0.0-use.local resolution: "@jupyterlab/running@workspace:packages/running" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -4557,16 +4557,16 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/services@^7.1.0, @jupyterlab/services@workspace:packages/services": +"@jupyterlab/services@^7.1.5, @jupyterlab/services@workspace:packages/services": version: 0.0.0-use.local resolution: "@jupyterlab/services@workspace:packages/services" dependencies: "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/polling": ^2.1.2 @@ -4584,20 +4584,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/settingeditor-extension@^4.1.0, @jupyterlab/settingeditor-extension@workspace:packages/settingeditor-extension, @jupyterlab/settingeditor-extension@~4.1.0": +"@jupyterlab/settingeditor-extension@^4.1.5, @jupyterlab/settingeditor-extension@workspace:packages/settingeditor-extension, @jupyterlab/settingeditor-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/settingeditor-extension@workspace:packages/settingeditor-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/pluginmanager": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingeditor": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/pluginmanager": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingeditor": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/disposable": ^2.1.2 rimraf: ~5.0.5 typedoc: ~0.24.7 @@ -4605,20 +4605,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/settingeditor@^4.1.0, @jupyterlab/settingeditor@workspace:packages/settingeditor": +"@jupyterlab/settingeditor@^4.1.5, @jupyterlab/settingeditor@workspace:packages/settingeditor": version: 0.0.0-use.local resolution: "@jupyterlab/settingeditor@workspace:packages/settingeditor" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/inspector": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/inspector": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -4644,13 +4644,13 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/settingregistry@^4.1.0, @jupyterlab/settingregistry@workspace:packages/settingregistry": +"@jupyterlab/settingregistry@^4.1.5, @jupyterlab/settingregistry@workspace:packages/settingregistry": version: 0.0.0-use.local resolution: "@jupyterlab/settingregistry@workspace:packages/settingregistry" dependencies: - "@jupyterlab/nbformat": ^4.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/nbformat": ^4.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -4667,15 +4667,15 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/shortcuts-extension@^4.1.0, @jupyterlab/shortcuts-extension@workspace:packages/shortcuts-extension, @jupyterlab/shortcuts-extension@~4.1.0": +"@jupyterlab/shortcuts-extension@^4.1.5, @jupyterlab/shortcuts-extension@workspace:packages/shortcuts-extension, @jupyterlab/shortcuts-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/shortcuts-extension@workspace:packages/shortcuts-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -4692,11 +4692,11 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/statedb@^4.1.0, @jupyterlab/statedb@workspace:packages/statedb": +"@jupyterlab/statedb@^4.1.5, @jupyterlab/statedb@workspace:packages/statedb": version: 0.0.0-use.local resolution: "@jupyterlab/statedb@workspace:packages/statedb" dependencies: - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/testing": ^4.1.5 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -4710,15 +4710,15 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/statusbar-extension@^4.1.0, @jupyterlab/statusbar-extension@workspace:packages/statusbar-extension, @jupyterlab/statusbar-extension@~4.1.0": +"@jupyterlab/statusbar-extension@^4.1.5, @jupyterlab/statusbar-extension@workspace:packages/statusbar-extension, @jupyterlab/statusbar-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/statusbar-extension@workspace:packages/statusbar-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/statusbar": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/statusbar": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@types/react": ^18.0.26 "@types/react-dom": ^18.0.9 rimraf: ~5.0.5 @@ -4727,12 +4727,12 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/statusbar@^4.1.0, @jupyterlab/statusbar@workspace:packages/statusbar": +"@jupyterlab/statusbar@^4.1.5, @jupyterlab/statusbar@workspace:packages/statusbar": version: 0.0.0-use.local resolution: "@jupyterlab/statusbar@workspace:packages/statusbar" dependencies: - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -4751,27 +4751,27 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlab/template@workspace:buildutils/template" dependencies: - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/testing": ^4.1.5 "@types/jest": ^29.2.0 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/terminal-extension@^4.1.0, @jupyterlab/terminal-extension@workspace:packages/terminal-extension, @jupyterlab/terminal-extension@~4.1.0": +"@jupyterlab/terminal-extension@^4.1.5, @jupyterlab/terminal-extension@workspace:packages/terminal-extension, @jupyterlab/terminal-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/terminal-extension@workspace:packages/terminal-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/launcher": ^4.1.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/running": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/terminal": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/launcher": ^4.1.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/running": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/terminal": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/widgets": ^2.3.1 "@types/webpack-env": ^1.18.0 rimraf: ~5.0.5 @@ -4780,14 +4780,14 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/terminal@^4.1.0, @jupyterlab/terminal@workspace:packages/terminal": +"@jupyterlab/terminal@^4.1.5, @jupyterlab/terminal@workspace:packages/terminal": version: 0.0.0-use.local resolution: "@jupyterlab/terminal@workspace:packages/terminal" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/domutils": ^2.0.1 "@lumino/messaging": ^2.0.1 @@ -4806,13 +4806,13 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/testing@^4.1.0, @jupyterlab/testing@workspace:packages/testing": +"@jupyterlab/testing@^4.1.5, @jupyterlab/testing@workspace:packages/testing": version: 0.0.0-use.local resolution: "@jupyterlab/testing@workspace:packages/testing" dependencies: "@babel/core": ^7.10.2 "@babel/preset-env": ^7.10.2 - "@jupyterlab/coreutils": ^6.1.0 + "@jupyterlab/coreutils": ^6.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 "@types/jest": ^29.2.0 @@ -4835,74 +4835,74 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/testutils@^4.1.0, @jupyterlab/testutils@workspace:testutils": +"@jupyterlab/testutils@^4.1.5, @jupyterlab/testutils@workspace:testutils": version: 0.0.0-use.local resolution: "@jupyterlab/testutils@workspace:testutils" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/theme-dark-extension@^4.1.0, @jupyterlab/theme-dark-extension@workspace:packages/theme-dark-extension, @jupyterlab/theme-dark-extension@~4.1.0": +"@jupyterlab/theme-dark-extension@^4.1.5, @jupyterlab/theme-dark-extension@workspace:packages/theme-dark-extension, @jupyterlab/theme-dark-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/theme-dark-extension@workspace:packages/theme-dark-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/theme-light-extension@^4.1.0, @jupyterlab/theme-light-extension@workspace:packages/theme-light-extension, @jupyterlab/theme-light-extension@~4.1.0": +"@jupyterlab/theme-light-extension@^4.1.5, @jupyterlab/theme-light-extension@workspace:packages/theme-light-extension, @jupyterlab/theme-light-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/theme-light-extension@workspace:packages/theme-light-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/toc-extension@^6.1.0, @jupyterlab/toc-extension@workspace:packages/toc-extension, @jupyterlab/toc-extension@~6.1.0": +"@jupyterlab/toc-extension@^6.1.5, @jupyterlab/toc-extension@workspace:packages/toc-extension, @jupyterlab/toc-extension@~6.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/toc-extension@workspace:packages/toc-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/toc": ^6.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/toc": ^6.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/toc@^6.1.0, @jupyterlab/toc@workspace:packages/toc": +"@jupyterlab/toc@^6.1.5, @jupyterlab/toc@workspace:packages/toc": version: 0.0.0-use.local resolution: "@jupyterlab/toc@workspace:packages/toc" dependencies: - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/docregistry": ^4.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/docregistry": ^4.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -4918,20 +4918,20 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/tooltip-extension@^4.1.0, @jupyterlab/tooltip-extension@workspace:packages/tooltip-extension, @jupyterlab/tooltip-extension@~4.1.0": +"@jupyterlab/tooltip-extension@^4.1.5, @jupyterlab/tooltip-extension@workspace:packages/tooltip-extension, @jupyterlab/tooltip-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/tooltip-extension@workspace:packages/tooltip-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/console": ^4.1.0 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/fileeditor": ^4.1.0 - "@jupyterlab/notebook": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/tooltip": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/console": ^4.1.5 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/fileeditor": ^4.1.5 + "@jupyterlab/notebook": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/tooltip": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 @@ -4941,14 +4941,14 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/tooltip@^4.1.0, @jupyterlab/tooltip@workspace:packages/tooltip": +"@jupyterlab/tooltip@^4.1.5, @jupyterlab/tooltip@workspace:packages/tooltip": version: 0.0.0-use.local resolution: "@jupyterlab/tooltip@workspace:packages/tooltip" dependencies: - "@jupyterlab/codeeditor": ^4.1.0 - "@jupyterlab/rendermime": ^4.1.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/codeeditor": ^4.1.5 + "@jupyterlab/rendermime": ^4.1.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/ui-components": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/widgets": ^2.3.1 @@ -4958,29 +4958,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/translation-extension@^4.1.0, @jupyterlab/translation-extension@workspace:packages/translation-extension, @jupyterlab/translation-extension@~4.1.0": +"@jupyterlab/translation-extension@^4.1.5, @jupyterlab/translation-extension@workspace:packages/translation-extension, @jupyterlab/translation-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/translation-extension@workspace:packages/translation-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/mainmenu": ^4.1.0 - "@jupyterlab/settingregistry": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/apputils": ^4.2.5 + "@jupyterlab/mainmenu": ^4.1.5 + "@jupyterlab/settingregistry": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 rimraf: ~5.0.5 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/translation@^4.1.0, @jupyterlab/translation@workspace:packages/translation": +"@jupyterlab/translation@^4.1.5, @jupyterlab/translation@workspace:packages/translation": version: 0.0.0-use.local resolution: "@jupyterlab/translation@workspace:packages/translation" dependencies: - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/services": ^7.1.0 - "@jupyterlab/statedb": ^4.1.0 - "@jupyterlab/testing": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/services": ^7.1.5 + "@jupyterlab/statedb": ^4.1.5 + "@jupyterlab/testing": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@types/jest": ^29.2.0 jest: ^29.2.0 @@ -4989,29 +4989,29 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/ui-components-extension@^4.1.0, @jupyterlab/ui-components-extension@workspace:packages/ui-components-extension, @jupyterlab/ui-components-extension@~4.1.0": +"@jupyterlab/ui-components-extension@^4.1.5, @jupyterlab/ui-components-extension@workspace:packages/ui-components-extension, @jupyterlab/ui-components-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/ui-components-extension@workspace:packages/ui-components-extension" dependencies: - "@jupyterlab/application": ^4.1.0 - "@jupyterlab/ui-components": ^4.1.0 + "@jupyterlab/application": ^4.1.5 + "@jupyterlab/ui-components": ^4.1.5 rimraf: ~5.0.5 typedoc: ~0.24.7 typescript: ~5.1.6 languageName: unknown linkType: soft -"@jupyterlab/ui-components@^4.1.0, @jupyterlab/ui-components@workspace:packages/ui-components": +"@jupyterlab/ui-components@^4.1.5, @jupyterlab/ui-components@workspace:packages/ui-components": version: 0.0.0-use.local resolution: "@jupyterlab/ui-components@workspace:packages/ui-components" dependencies: "@jupyter/react-components": ^0.15.2 "@jupyter/web-components": ^0.15.2 - "@jupyterlab/coreutils": ^6.1.0 - "@jupyterlab/observables": ^5.1.0 - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/testing": ^4.1.0 - "@jupyterlab/translation": ^4.1.0 + "@jupyterlab/coreutils": ^6.1.5 + "@jupyterlab/observables": ^5.1.5 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/testing": ^4.1.5 + "@jupyterlab/translation": ^4.1.5 "@lumino/algorithm": ^2.0.1 "@lumino/commands": ^2.2.0 "@lumino/coreutils": ^2.1.2 @@ -5039,12 +5039,12 @@ __metadata: languageName: unknown linkType: soft -"@jupyterlab/vega5-extension@^4.1.0, @jupyterlab/vega5-extension@workspace:packages/vega5-extension, @jupyterlab/vega5-extension@~4.1.0": +"@jupyterlab/vega5-extension@^4.1.5, @jupyterlab/vega5-extension@workspace:packages/vega5-extension, @jupyterlab/vega5-extension@~4.1.5": version: 0.0.0-use.local resolution: "@jupyterlab/vega5-extension@workspace:packages/vega5-extension" dependencies: - "@jupyterlab/rendermime-interfaces": ^3.9.0 - "@jupyterlab/testutils": ^4.1.0 + "@jupyterlab/rendermime-interfaces": ^3.9.5 + "@jupyterlab/testutils": ^4.1.5 "@lumino/coreutils": ^2.1.2 "@lumino/widgets": ^2.3.1 "@types/jest": ^29.2.0 @@ -11267,14 +11267,15 @@ __metadata: languageName: node linkType: hard -"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.50, es5-ext@npm:^0.10.53, es5-ext@npm:~0.10.14, es5-ext@npm:~0.10.2, es5-ext@npm:~0.10.46": - version: 0.10.62 - resolution: "es5-ext@npm:0.10.62" +"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.50, es5-ext@npm:^0.10.53, es5-ext@npm:^0.10.62, es5-ext@npm:~0.10.14, es5-ext@npm:~0.10.2, es5-ext@npm:~0.10.46": + version: 0.10.63 + resolution: "es5-ext@npm:0.10.63" dependencies: es6-iterator: ^2.0.3 es6-symbol: ^3.1.3 + esniff: ^2.0.1 next-tick: ^1.1.0 - checksum: 25f42f6068cfc6e393cf670bc5bba249132c5f5ec2dd0ed6e200e6274aca2fed8e9aec8a31c76031744c78ca283c57f0b41c7e737804c6328c7b8d3fbcba7983 + checksum: 3bf04d9bac12a14e716a0a00b1706f538a3211da82703babd3e907deaeadaa30eab71202785027058d44d2a7c0e92e34631fb03fa63ef1097191e88de5223fda languageName: node linkType: hard @@ -11528,6 +11529,18 @@ __metadata: languageName: node linkType: hard +"esniff@npm:^2.0.1": + version: 2.0.1 + resolution: "esniff@npm:2.0.1" + dependencies: + d: ^1.0.1 + es5-ext: ^0.10.62 + event-emitter: ^0.3.5 + type: ^2.7.2 + checksum: d814c0e5c39bce9925b2e65b6d8767af72c9b54f35a65f9f3d6e8c606dce9aebe35a9599d30f15b0807743f88689f445163cfb577a425de4fb8c3c5bc16710cc + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -13292,9 +13305,9 @@ __metadata: linkType: hard "ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + version: 2.0.1 + resolution: "ip@npm:2.0.1" + checksum: d765c9fd212b8a99023a4cde6a558a054c298d640fec1020567494d257afd78ca77e37126b1a3ef0e053646ced79a816bf50621d38d5e768cdde0431fa3b0d35 languageName: node linkType: hard @@ -16272,7 +16285,7 @@ __metadata: version: 0.0.0-use.local resolution: "node-example@workspace:packages/services/examples/node" dependencies: - "@jupyterlab/services": ^7.1.0 + "@jupyterlab/services": ^7.1.5 rimraf: ~5.0.5 ws: ^8.11.0 languageName: unknown