diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d0c1e6a2cf50..1879f9ec26151 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - [core] `updateThemePreference` and `updateThemeFromPreference` removed from `CommonFrontendContribution`. Corresponding functionality as been moved to the respective theme service. `load` removed from `IconThemeService` [#11473](https://github.com/eclipse-theia/theia/issues/11473) - [core] updated `react` and `react-dom` dependencies to version 18, which introduce new root API for rendering (replaces ReactDOM.render). Since React no longer supports render callbacks, the `onRender` field from `ReactDialog` and `ReactWidget` was removed. [#11455](https://github.com/eclipse-theia/theia/pull/11455) - Contributed on behalf of STMicroelectronics - [core] removed `WidgetManager.widgetPromises`; use `WidgetManager.widgets` instead. [#11555](https://github.com/eclipse-theia/theia/pull/11555) +- [core] Replaced `react-virtualized` with `react-virtuoso` for tree rendering. Removed the `TreeWidget#forceUpdate`, `TreeWidget#handleScroll` and `TreeWidget.View#renderTreeRow` methods in the process. [#11553](https://github.com/eclipse-theia/theia/pull/11553) ## v1.28.0 - 7/28/2022 diff --git a/dependency-check-baseline.json b/dependency-check-baseline.json index 6c8f59d49d9b7..d90ac5d17de4e 100644 --- a/dependency-check-baseline.json +++ b/dependency-check-baseline.json @@ -3,5 +3,6 @@ "npm/npmjs/-/jschardet/2.3.0": "Approved for Eclipse Theia: https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22481", "npm/npmjs/-/jsdom/11.12.0": "Approved as 'works-with': https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23640https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23640", "npm/npmjs/-/lzma-native/8.0.6": "Approved as 'works-with': https://gitlab.eclipse.org/eclipsefdn/emo-team/iplab/-/issues/1850", - "npm/npmjs/-/playwright-core/1.22.2": "Approved as 'works-with': https://gitlab.eclipse.org/eclipsefdn/emo-team/iplab/-/issues/2734" + "npm/npmjs/-/playwright-core/1.22.2": "Approved as 'works-with': https://gitlab.eclipse.org/eclipsefdn/emo-team/iplab/-/issues/2734", + "npm/npmjs/-/virtuoso.dev/0.2.13": "Approved manually: https://github.com/eclipse-theia/theia/pull/11553" } diff --git a/doc/Migration.md b/doc/Migration.md index 85439a2cc4be8..5a6378a50e586 100644 --- a/doc/Migration.md +++ b/doc/Migration.md @@ -25,19 +25,10 @@ For example: The `react` and `react-dom` dependencies were upgraded to version 18. Some relevant changes include: - - `ReactDOM.render` is now deprecated and is replaced by `createRoot` from `react-dom/client` - - the new API no longer supports render callbacks - - updates in promises, setTimeout, event handlers are automatically batched - - Because the currently used version of `react-virtualized` still depends on React 16, a `resolutions` block is needed in the `package.json` for the React 18 dependencies: - - ```json -"resolutions": { - "@types/react": "18.0.15", - "@types/react-dom": "18.0.6" - ... - } - ``` +- `ReactDOM.render` is now deprecated and is replaced by `createRoot` from `react-dom/client` +- the new API no longer supports render callbacks +- updates in promises, setTimeout, event handlers are automatically batched +- the dependency `react-virtualized` has been removed in favor of `react-virtuoso` ### v1.24.0 diff --git a/package.json b/package.json index a713dd5141c98..1c79f066d9484 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,7 @@ "node": ">=14" }, "resolutions": { - "**/@types/node": "14", - "@types/react": "18.0.15", - "@types/react-dom": "18.0.6" + "**/@types/node": "14" }, "devDependencies": { "@types/chai": "4.3.0", diff --git a/packages/core/README.md b/packages/core/README.md index d9226e45e4c76..8906df276f9b5 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -97,7 +97,7 @@ export class SomeClass { - `inversify` (from [`inversify@^5.1.1`](https://www.npmjs.com/package/inversify)) - `react-dom` (from [`react-dom@^18.2.0`](https://www.npmjs.com/package/react-dom)) - `react-dom/client` (from [`react-dom@^18.2.0`](https://www.npmjs.com/package/react-dom)) - - `react-virtualized` (from [`react-virtualized@^9.20.0`](https://www.npmjs.com/package/react-virtualized)) + - `react-virtuoso` (from [`react-virtuoso@^2.17.0`](https://www.npmjs.com/package/react-virtuoso)) - `vscode-languageserver-protocol` (from [`vscode-languageserver-protocol@~3.15.3`](https://www.npmjs.com/package/vscode-languageserver-protocol)) - `vscode-uri` (from [`vscode-uri@^2.1.1`](https://www.npmjs.com/package/vscode-uri)) - `dompurify` (from [`dompurify@^2.2.9`](https://www.npmjs.com/package/dompurify)) diff --git a/packages/core/package.json b/packages/core/package.json index 7093f5c597819..2741e08f7d648 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -28,7 +28,6 @@ "@types/markdown-it": "^12.2.3", "@types/react": "^18.0.15", "@types/react-dom": "^18.0.6", - "@types/react-virtualized": "^9.18.3", "@types/route-parser": "^0.1.1", "@types/safer-buffer": "^2.1.0", "@types/ws": "^5.1.2", @@ -62,7 +61,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-tooltip": "^4.2.21", - "react-virtualized": "^9.20.0", + "react-virtuoso": "^2.17.0", "reflect-metadata": "^0.1.10", "route-parser": "^0.0.5", "safer-buffer": "^2.1.2", @@ -112,7 +111,7 @@ "inversify", "react-dom", "react-dom/client", - "react-virtualized", + "react-virtuoso", "vscode-languageserver-protocol", "vscode-uri" ], diff --git a/packages/core/shared/react-virtualized/index.d.ts b/packages/core/shared/react-virtualized/index.d.ts deleted file mode 100644 index ec9267289b407..0000000000000 --- a/packages/core/shared/react-virtualized/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from 'react-virtualized'; diff --git a/packages/core/shared/react-virtualized/index.js b/packages/core/shared/react-virtualized/index.js deleted file mode 100644 index 760c203cf32da..0000000000000 --- a/packages/core/shared/react-virtualized/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('react-virtualized'); diff --git a/packages/core/shared/react-virtuoso/index.d.ts b/packages/core/shared/react-virtuoso/index.d.ts new file mode 100644 index 0000000000000..3755866f6fdce --- /dev/null +++ b/packages/core/shared/react-virtuoso/index.d.ts @@ -0,0 +1 @@ +export * from 'react-virtuoso'; diff --git a/packages/core/shared/react-virtuoso/index.js b/packages/core/shared/react-virtuoso/index.js new file mode 100644 index 0000000000000..b286c102fcb2c --- /dev/null +++ b/packages/core/shared/react-virtuoso/index.js @@ -0,0 +1 @@ +module.exports = require('react-virtuoso'); diff --git a/packages/core/src/browser/tree/tree-widget.tsx b/packages/core/src/browser/tree/tree-widget.tsx index 3dc6ab5242123..cd4e0a3cf7178 100644 --- a/packages/core/src/browser/tree/tree-widget.tsx +++ b/packages/core/src/browser/tree/tree-widget.tsx @@ -32,7 +32,7 @@ import { notEmpty } from '../../common/objects'; import { isOSX } from '../../common/os'; import { ReactWidget } from '../widgets/react-widget'; import * as React from 'react'; -import { List, ListRowRenderer, ScrollParams, CellMeasurer, CellMeasurerCache } from 'react-virtualized'; +import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'; import { TopDownTreeIterator } from './tree-iterator'; import { SearchBox, SearchBoxFactory, SearchBoxProps } from './search-box'; import { TreeSearch } from './tree-search'; @@ -256,7 +256,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { this.labelProvider.onDidChange(e => { for (const row of this.rows.values()) { if (e.affects(row)) { - this.forceUpdate(); + this.update(); return; } } @@ -347,9 +347,9 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { * Update the `scrollToRow`. * @param updateOptions the tree widget force update options. */ - protected updateScrollToRow(updateOptions?: TreeWidget.ForceUpdateOptions): void { + protected updateScrollToRow(): void { this.scrollToRow = this.getScrollToRow(); - this.forceUpdate(updateOptions); + this.update(); } protected scheduleUpdateScrollToRow = debounce(this.updateScrollToRow); @@ -374,22 +374,6 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { protected readonly updateDecorations = debounce(() => this.doUpdateDecorations(), 150); protected async doUpdateDecorations(): Promise { this.decorations = await this.decoratorService.getDecorations(this.model); - this.forceUpdate(); - } - - /** - * Force deep resizing and rendering of rows. - * https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#recomputerowheights-index-number - */ - protected forceUpdate({ resize }: TreeWidget.ForceUpdateOptions = { resize: false }): void { - if (this.view && this.view.list) { - if (resize && this.isVisible) { - this.view.cache.clearAll(); - this.view.list.recomputeRowHeights(); - } else { - this.view.list.forceUpdateGrid(); - } - } this.update(); } @@ -436,7 +420,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { protected override onResize(msg: Widget.ResizeMessage): void { super.onResize(msg); - this.forceUpdate({ resize: true }); + this.update(); } protected render(): React.ReactNode { @@ -491,7 +475,6 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { rows={rows} renderNodeRow={this.renderNodeRow} scrollToRow={this.scrollToRow} - handleScroll={this.handleScroll} />; } // eslint-disable-next-line no-null/no-null @@ -517,13 +500,6 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { } } - /** - * Handle the scroll event. - */ - protected readonly handleScroll = (info: ScrollParams) => { - this.node.scrollTop = info.scrollTop; - }; - /** * Render the node row. */ @@ -531,7 +507,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { /** * Actually render the node row. */ - protected doRenderNodeRow({ index, node, depth }: TreeWidget.NodeRow): React.ReactNode { + protected doRenderNodeRow({ node, depth }: TreeWidget.NodeRow): React.ReactNode { return {this.renderIndent(node, { depth })} {this.renderNode(node, { depth })} @@ -1128,9 +1104,11 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { this.addKeyListener(this.node, Key.ESCAPE, event => this.handleEscape(event)); // eslint-disable-next-line @typescript-eslint/no-explicit-any this.addEventListener(this.node, 'ps-scroll-y', (e: Event & { target: { scrollTop: number } }) => { - if (this.view && this.view.list && this.view.list.Grid) { + if (this.view && this.view.list) { const { scrollTop } = e.target; - this.view.list.Grid.handleScrollEvent({ scrollTop }); + this.view.list.scrollTo({ + top: scrollTop + }); } }); } @@ -1444,15 +1422,6 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { } export namespace TreeWidget { - /** - * Representation of the tree force update options. - */ - export interface ForceUpdateOptions { - /** - * Controls whether to force a resize of the widget. - */ - resize: boolean - } /** * Representation of a tree node row. */ @@ -1490,38 +1459,29 @@ export namespace TreeWidget { * The list of node rows. */ rows: NodeRow[] - handleScroll: (info: ScrollParams) => void renderNodeRow: (row: NodeRow) => React.ReactNode } export class View extends React.Component { - list: List | undefined; - readonly cache = new CellMeasurerCache({ - fixedWidth: true - }); + list: VirtuosoHandle | undefined; override render(): React.ReactNode { - const { rows, width, height, scrollToRow, handleScroll } = this.props; - return this.list = (list || undefined)} + const { rows, width, height, scrollToRow } = this.props; + return { + this.list = (list || undefined); + if (this.list && scrollToRow !== undefined) { + this.list.scrollIntoView({ + index: scrollToRow, + align: 'center' + }); + } + }} + totalCount={rows.length} + itemContent={index => this.props.renderNodeRow(rows[index])} width={width} height={height} - rowCount={rows.length} - rowHeight={this.cache.rowHeight} - rowRenderer={this.renderTreeRow} - scrollToIndex={scrollToRow} - onScroll={handleScroll} - tabIndex={-1} + // This is a pixel value, it will scan 200px to the top and bottom of the current view + overscan={500} />; } - protected renderTreeRow: ListRowRenderer = ({ key, index, style, parent }) => { - const row = this.props.rows[index]!; - return -
{this.props.renderNodeRow(row)}
-
; - }; } } diff --git a/packages/git/src/browser/history/git-history-support.ts b/packages/git/src/browser/history/git-history-support.ts index c6a67816d97af..38d28bda978c5 100644 --- a/packages/git/src/browser/history/git-history-support.ts +++ b/packages/git/src/browser/history/git-history-support.ts @@ -34,6 +34,7 @@ export class GitHistorySupport implements ScmHistorySupport { const gitOptions: Git.Options.Log = { uri: options ? options.uri : undefined, maxCount: options ? options.maxCount : undefined, + range: options?.range, shortSha: true }; diff --git a/packages/scm-extra/src/browser/history/scm-history-widget.tsx b/packages/scm-extra/src/browser/history/scm-history-widget.tsx index bd43736372245..6bae5883a8218 100644 --- a/packages/scm-extra/src/browser/history/scm-history-widget.tsx +++ b/packages/scm-extra/src/browser/history/scm-history-widget.tsx @@ -19,7 +19,7 @@ import { Event as TheiaEvent, DisposableCollection } from '@theia/core'; import { OpenerService, open, StatefulWidget, SELECTED_CLASS, WidgetManager, ApplicationShell, codicon } from '@theia/core/lib/browser'; import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { AutoSizer, List, ListRowRenderer, ListRowProps, InfiniteLoader, IndexRange, ScrollParams, CellMeasurerCache, CellMeasurer } from '@theia/core/shared/react-virtualized'; +import { Virtuoso, VirtuosoHandle } from '@theia/core/shared/react-virtuoso'; import URI from '@theia/core/lib/common/uri'; import { SCM_HISTORY_ID, SCM_HISTORY_MAX_COUNT, SCM_HISTORY_LABEL } from './scm-history-contribution'; import { ScmHistoryCommit, ScmFileChange, ScmFileChangeNode } from '../scm-file-change-node'; @@ -30,6 +30,7 @@ import { AlertMessage } from '@theia/core/lib/browser/widgets/alert-message'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { nls } from '@theia/core/lib/common/nls'; import { ScmHistoryProvider } from './scm-history-provider'; +import throttle = require('@theia/core/shared/lodash.throttle'); export const ScmHistorySupport = Symbol('scm-history-support'); export interface ScmHistorySupport { @@ -52,12 +53,12 @@ export namespace ScmCommitNode { } export interface HistoryWidgetOptions { - readonly range?: { - readonly toRevision?: string; - readonly fromRevision?: string; + range?: { + toRevision?: string; + fromRevision?: string; }; - readonly uri?: string; - readonly maxCount?: number; + uri?: string; + maxCount?: number; } export type ScmHistoryListNode = (ScmCommitNode | ScmFileChangeNode); @@ -101,6 +102,7 @@ export class ScmHistoryWidget extends ScmNavigableListWidget this.title.closable = true; this.addClass('theia-scm'); this.addClass('theia-scm-history'); + this.status = { state: 'loading' }; this.resetState(); this.cancelIndicator = new CancellationTokenSource(); } @@ -131,11 +133,17 @@ export class ScmHistoryWidget extends ScmNavigableListWidget this.setContent(this.options); // If switching repository, discard options because they are specific to a repository - this.options = {}; + this.options = this.createHistoryOptions(); this.refresh(); } + protected createHistoryOptions(): HistoryWidgetOptions { + return { + maxCount: SCM_HISTORY_MAX_COUNT + }; + } + protected readonly toDisposeOnRefresh = new DisposableCollection(); protected refresh(): void { this.toDisposeOnRefresh.dispose(); @@ -166,21 +174,18 @@ export class ScmHistoryWidget extends ScmNavigableListWidget this.addListNavigationKeyListeners(this.node); // eslint-disable-next-line @typescript-eslint/no-explicit-any this.addEventListener(this.node, 'ps-scroll-y', (e: Event & { target: { scrollTop: number } }) => { - if (this.listView && this.listView.list && this.listView.list.Grid) { + if (this.listView?.list) { const { scrollTop } = e.target; - this.listView.list.Grid.handleScrollEvent({ scrollTop }); + this.listView.list.scrollTo({ + top: scrollTop + }); } }); } - override update(): void { - if (this.listView && this.listView.list) { - this.listView.list.forceUpdateGrid(); - } - super.update(); - } + setContent = throttle((options?: HistoryWidgetOptions) => this.doSetContent(options), 100); - async setContent(options?: HistoryWidgetOptions): Promise { + protected async doSetContent(options?: HistoryWidgetOptions): Promise { this.resetState(options); if (options && options.uri) { try { @@ -198,9 +203,7 @@ export class ScmHistoryWidget extends ScmNavigableListWidget } protected resetState(options?: HistoryWidgetOptions): void { - this.options = options || {}; - this.status = { state: 'loading' }; - this.scmNodes = []; + this.options = options || this.createHistoryOptions(); this.hasMoreCommits = true; this.allowScrollToSelected = true; } @@ -302,6 +305,7 @@ export class ScmHistoryWidget extends ScmNavigableListWidget // eslint-disable-next-line @typescript-eslint/no-explicit-any restoreState(oldState: any): void { this.options = oldState['options']; + this.options.maxCount = SCM_HISTORY_MAX_COUNT; this.singleFileMode = oldState['singleFileMode']; this.setContent(this.options); } @@ -378,8 +382,6 @@ export class ScmHistoryWidget extends ScmNavigableListWidget ref={listView => this.listView = (listView || undefined)} rows={this.scmNodes} hasMoreRows={this.hasMoreCommits} - indexOfSelected={this.allowScrollToSelected ? this.indexOfSelected : -1} - handleScroll={this.handleScroll} loadMoreRows={this.loadMoreRows} renderCommit={this.renderCommit} renderFileChangeList={this.renderFileChangeList} @@ -389,17 +391,11 @@ export class ScmHistoryWidget extends ScmNavigableListWidget return list; } - protected readonly handleScroll = (info: ScrollParams) => this.doHandleScroll(info); - protected doHandleScroll(info: ScrollParams): void { - this.node.scrollTop = info.scrollTop; - } - - protected readonly loadMoreRows = (params: IndexRange) => this.doLoadMoreRows(params); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - protected doLoadMoreRows(params: IndexRange): Promise { + protected readonly loadMoreRows = (index: number) => this.doLoadMoreRows(index); + protected doLoadMoreRows(index: number): Promise { let resolver: () => void; const promise = new Promise(resolve => resolver = resolve); - const lastRow = this.scmNodes[params.stopIndex - 1]; + const lastRow = this.scmNodes[index - 1]; if (ScmCommitNode.is(lastRow)) { const toRevision = lastRow.commitDetails.id; this.addCommits({ @@ -549,17 +545,14 @@ export class ScmHistoryWidget extends ScmNavigableListWidget export namespace ScmHistoryList { export interface Props { readonly rows: ScmHistoryListNode[] - readonly indexOfSelected: number readonly hasMoreRows: boolean - readonly handleScroll: (info: { clientHeight: number; scrollHeight: number; scrollTop: number }) => void - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly loadMoreRows: (params: IndexRange) => Promise + readonly loadMoreRows: (index: number) => Promise readonly renderCommit: (commit: ScmCommitNode) => React.ReactNode readonly renderFileChangeList: (fileChange: ScmFileChangeNode) => React.ReactNode } } export class ScmHistoryList extends React.Component { - list: List | undefined; + list: VirtuosoHandle | undefined; protected readonly checkIfRowIsLoaded = (opts: { index: number }) => this.doCheckIfRowIsLoaded(opts); protected doCheckIfRowIsLoaded(opts: { index: number }): boolean { @@ -568,79 +561,34 @@ export class ScmHistoryList extends React.Component { } override render(): React.ReactNode { - return - { - ({ onRowsRendered, registerChild }) => ( - - { - ({ width, height }) => { - this.list = (list || undefined); - registerChild(list); - }} - width={width} - height={height} - onRowsRendered={onRowsRendered} - rowRenderer={this.measureRowRenderer} - rowHeight={this.measureCache.rowHeight} - rowCount={this.props.hasMoreRows ? this.props.rows.length + 1 : this.props.rows.length} - tabIndex={-1} - onScroll={this.props.handleScroll} - scrollToIndex={this.props.indexOfSelected} - style={{ - overflowY: 'visible', - overflowX: 'visible' - }} - /> - } - - ) - } - ; - } - - override componentWillUpdate(): void { - this.measureCache.clearAll(); - } - - protected measureCache = new CellMeasurerCache(); - - protected measureRowRenderer: ListRowRenderer = (params: ListRowProps) => { - const { index, key, parent } = params; - return ( - - {() => this.renderRow(params)} - - ); - }; - - protected renderRow: ListRowRenderer = ({ index, key, style }) => { + const { hasMoreRows, loadMoreRows, rows } = this.props; + return this.list = (list || undefined)} + data={rows} + itemContent={index => this.renderRow(index)} + endReached={hasMoreRows ? loadMoreRows : undefined} + overscan={500} + style={{ + overflowX: 'hidden' + }} + />; + } + + protected renderRow(index: number): React.ReactNode { if (this.checkIfRowIsLoaded({ index })) { const row = this.props.rows[index]; if (ScmCommitNode.is(row)) { const head = this.props.renderCommit(row); - return
+ return
{head}
; } else if (ScmFileChangeNode.is(row)) { - return
+ return
{this.props.renderFileChangeList(row)}
; } } else { - return
+ return
; } diff --git a/packages/scm-extra/src/browser/scm-navigable-list-widget.tsx b/packages/scm-extra/src/browser/scm-navigable-list-widget.tsx index 889bb3ab90efb..25b67aa7919dd 100644 --- a/packages/scm-extra/src/browser/scm-navigable-list-widget.tsx +++ b/packages/scm-extra/src/browser/scm-navigable-list-widget.tsx @@ -29,7 +29,7 @@ import { ScmFileChangeNode } from './scm-file-change-node'; @injectable() export abstract class ScmNavigableListWidget extends ReactWidget { - protected scmNodes: T[]; + protected scmNodes: T[] = []; private _scrollContainer: string; @inject(ScmService) protected readonly scmService: ScmService; diff --git a/yarn.lock b/yarn.lock index 4a378aa376ea7..48c1e6a5864d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -875,7 +875,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.10.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.10.0", "@babel/runtime@^7.8.4": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== @@ -2549,22 +2549,14 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@18.0.6", "@types/react-dom@^18.0.6": +"@types/react-dom@^18.0.6": version "18.0.6" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== dependencies: "@types/react" "*" -"@types/react-virtualized@^9.18.3": - version "9.21.21" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.21.tgz#65c96f25314f0fb3d40536929dc78112753b49e1" - integrity sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA== - dependencies: - "@types/prop-types" "*" - "@types/react" "^17" - -"@types/react@*", "@types/react@18.0.15", "@types/react@^17", "@types/react@^18.0.15": +"@types/react@*": version "18.0.15" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== @@ -2573,6 +2565,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.0.15": + version "18.0.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" + integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/request@^2.0.3": version "2.48.8" resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.8.tgz#0b90fde3b655ab50976cb8c5ac00faca22f5a82c" @@ -2834,6 +2835,18 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" +"@virtuoso.dev/react-urx@^0.2.12": + version "0.2.13" + resolved "https://registry.yarnpkg.com/@virtuoso.dev/react-urx/-/react-urx-0.2.13.tgz#e2cfc42d259d2a002695e7517d34cb97b64ee9c4" + integrity sha512-MY0ugBDjFb5Xt8v2HY7MKcRGqw/3gTpMlLXId2EwQvYJoC8sP7nnXjAxcBtTB50KTZhO0SbzsFimaZ7pSdApwA== + dependencies: + "@virtuoso.dev/urx" "^0.2.13" + +"@virtuoso.dev/urx@^0.2.12", "@virtuoso.dev/urx@^0.2.13": + version "0.2.13" + resolved "https://registry.yarnpkg.com/@virtuoso.dev/urx/-/urx-0.2.13.tgz#a65e7e8d923cb03397ac876bfdd45c7f71c8edf1" + integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw== + "@vscode/codicons@*": version "0.0.31" resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.31.tgz#1dc56f9442c3928b1c851965cf360e7e051e6511" @@ -4097,11 +4110,6 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -clsx@^1.0.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - cmd-shim@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" @@ -4874,14 +4882,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-helpers@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -9505,11 +9505,6 @@ react-is@^16.13.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - react-perfect-scrollbar@^1.5.3: version "1.5.8" resolved "https://registry.yarnpkg.com/react-perfect-scrollbar/-/react-perfect-scrollbar-1.5.8.tgz#380959387a325c5c9d0268afc08b3f73ed5b3078" @@ -9526,17 +9521,13 @@ react-tooltip@^4.2.21: prop-types "^15.7.2" uuid "^7.0.3" -react-virtualized@^9.20.0: - version "9.22.3" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== +react-virtuoso@^2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-2.17.0.tgz#5bd0e36c95ef442ac611cc2a0c5530b2c1c989de" + integrity sha512-vWYC/ususGOlBQMlymVjYXMa/++cyAIURAuSn4K+tCtJZTgDwXzIQgXBv8RQzwiGZ6O9uXDVq21Xk0eW4d5ukQ== dependencies: - "@babel/runtime" "^7.7.2" - clsx "^1.0.4" - dom-helpers "^5.1.3" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.4" + "@virtuoso.dev/react-urx" "^0.2.12" + "@virtuoso.dev/urx" "^0.2.12" react@^18.2.0: version "18.2.0"