diff --git a/packages/core/ui/ResizeBar.tsx b/packages/core/ui/ResizeBar.tsx index b128d691f6..e7f08dcf60 100644 --- a/packages/core/ui/ResizeBar.tsx +++ b/packages/core/ui/ResizeBar.tsx @@ -24,6 +24,7 @@ const useStyles = makeStyles()(theme => ({ width: 5, }, })) +const clickAreaWidth = 5 function Tick({ left, @@ -48,6 +49,7 @@ function Tick({ onDrag(lastFrameDistance, totalDistance, idx), [idx, onDrag], ) + const l = left - scrollLeft // has an invisible wider than tick mark (1px) clickable area (5px) return ( @@ -57,9 +59,9 @@ function Tick({ onMouseDown={onMouseDown} vertical className={classes.hiddenTick} - style={{ left: left - scrollLeft - 2.5 }} + style={{ left: l - clickAreaWidth / 2 }} /> -
+
) } @@ -89,10 +91,8 @@ export default function ResizeBar({
{offsets.map((left, i) => ( { - setInitial([...widths]) - }} + key={`${left}-${i}`} + onMouseDown={() => setInitial([...widths])} left={i === offsets.length - 1 ? left - 3 : left} onDrag={(_: number, totalDistance: number, idx: number) => { const newWidths = [...widths] diff --git a/packages/core/ui/ResizeHandle.tsx b/packages/core/ui/ResizeHandle.tsx index 3584800e13..40e66cf4a6 100644 --- a/packages/core/ui/ResizeHandle.tsx +++ b/packages/core/ui/ResizeHandle.tsx @@ -12,11 +12,14 @@ const useStyles = makeStyles()({ }, flexbox_verticalHandle: { cursor: 'col-resize', - alignSelf: 'stretch', // the height: 100% is actually unable to function inside flexbox + alignSelf: 'stretch', + // uses alignSelf:stretch with flexbox as the height: 100% is actually + // unable to function inside flexbox }, flexbox_horizontalHandle: { cursor: 'row-resize', - alignSelf: 'stretch', // similar to above + alignSelf: 'stretch', + // similar to above }, }) diff --git a/packages/core/ui/index.ts b/packages/core/ui/index.ts index 88bb6ba9b4..2c8a3da44e 100644 --- a/packages/core/ui/index.ts +++ b/packages/core/ui/index.ts @@ -14,5 +14,6 @@ export { default as PrerenderedCanvas } from './PrerenderedCanvas' export { default as Tooltip } from './Tooltip' export { default as ReturnToImportFormDialog } from './ReturnToImportFormDialog' export { default as ResizeHandle } from './ResizeHandle' +export { default as ResizeBar } from './ResizeBar' export { default as SanitizedHTML } from './SanitizedHTML' export * from './Menu' diff --git a/plugins/bed/src/BigBedAdapter/BigBedAdapter.ts b/plugins/bed/src/BigBedAdapter/BigBedAdapter.ts index 7995312957..c7b2242ef1 100644 --- a/plugins/bed/src/BigBedAdapter/BigBedAdapter.ts +++ b/plugins/bed/src/BigBedAdapter/BigBedAdapter.ts @@ -4,10 +4,9 @@ import { BaseFeatureDataAdapter, BaseOptions, } from '@jbrowse/core/data_adapters/BaseAdapter' -import { Region } from '@jbrowse/core/util/types' import { openLocation } from '@jbrowse/core/util/io' import { ObservableCreate } from '@jbrowse/core/util/rxjs' -import SimpleFeature, { Feature } from '@jbrowse/core/util/simpleFeature' +import { SimpleFeature, Feature, Region } from '@jbrowse/core/util' import { map, mergeAll } from 'rxjs/operators' // locals diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts b/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts index 0988e3f57e..97425bbe1e 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts @@ -1,23 +1,20 @@ -import { getSession, Feature, Region } from '@jbrowse/core/util' +import { Feature, AbstractSessionModel } from '@jbrowse/core/util' import ViewType from '@jbrowse/core/pluggableElementTypes/ViewType' import { parseBreakend } from '@gmod/vcf' -import { IStateTreeNode } from 'mobx-state-tree' export default class BreakpointSplitViewType extends ViewType { - snapshotFromBreakendFeature( + async snapshotFromBreakendFeature( feature: Feature, - view: { displayedRegions: Region[] } & IStateTreeNode, + assemblyName: string, + session: AbstractSessionModel, ) { const alt = feature.get('ALT')?.[0] const bnd = alt ? parseBreakend(alt) : undefined const startPos = feature.get('start') let endPos const bpPerPx = 10 - - // TODO: Figure this out for multiple assembly names - const { assemblyName } = view.displayedRegions[0] - const { assemblyManager } = getSession(view) - const assembly = assemblyManager.get(assemblyName) + const { assemblyManager } = session + const assembly = await assemblyManager.waitForAssembly(assemblyName) if (!assembly) { throw new Error(`assembly ${assemblyName} not found`) diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/AlignmentConnections.tsx b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/AlignmentConnections.tsx index d9f0c9690d..b194f454ee 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/AlignmentConnections.tsx +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/AlignmentConnections.tsx @@ -84,20 +84,15 @@ const AlignmentConnections = observer(function ({ if (!showIntraviewLinks && level1 === level2) { return null } - const f1ref = assembly.getCanonicalRefName(f1.get('refName')) - const f2ref = assembly.getCanonicalRefName(f2.get('refName')) - - if (!f1ref || !f2ref) { - throw new Error(`unable to find ref for ${f1ref || f2ref}`) - } - + const f1ref = f1.get('refName') + const f2ref = f2.get('refName') const s1 = f1.get('strand') const s2 = f2.get('strand') const p1 = c1[s1 === -1 ? LEFT : RIGHT] const sn1 = s2 === -1 const p2 = hasPaired ? c2[sn1 ? LEFT : RIGHT] : c2[sn1 ? RIGHT : LEFT] - const x1 = getPxFromCoordinate(views[level1], f1ref, p1) - const x2 = getPxFromCoordinate(views[level2], f2ref, p2) + const x1 = getPxFromCoordinate(views[level1], f1ref, p1, assembly) + const x2 = getPxFromCoordinate(views[level2], f2ref, p2, assembly) const reversed1 = views[level1].pxToBp(x1).reversed const reversed2 = views[level2].pxToBp(x2).reversed const tracks = views.map(v => v.getTrack(trackId)) diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Breakends.tsx b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Breakends.tsx index 59096317cf..84ec3ba7d3 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Breakends.tsx +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Breakends.tsx @@ -37,11 +37,7 @@ const Breakends = observer(function ({ const [mouseoverElt, setMouseoverElt] = useState() const snap = getSnapshot(model) useNextFrame(snap) - const assembly = assemblyManager.get(views[0].assemblyNames[0]) - - if (!assembly) { - return null - } + const asm = assemblyManager.get(views[0].assemblyNames[0]) let yoff = 0 if (ref.current) { @@ -49,7 +45,7 @@ const Breakends = observer(function ({ yoff = rect.top } - return ( + return asm ? ( - ) + ) : null }) export default Breakends diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx index 0b6e46ec17..2c47f8b5ec 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx @@ -50,10 +50,6 @@ const Translocations = observer(function ({ useNextFrame(snap) const assembly = assemblyManager.get(views[0].assemblyNames[0]) - if (!assembly) { - return null - } - let yOffset = 0 if (ref.current) { const rect = ref.current.getBoundingClientRect() @@ -64,10 +60,8 @@ const Translocations = observer(function ({ // just return null here note: would need to do processing of the INFO // CHR2/END and see which view could contain those coordinates to really do // it properly - if (views.length < 2) { - return null - } - return ( + + return !assembly || views.length < 2 ? null : ( ) { self.widths = args }, + })) + .actions(self => ({ afterAttach() { addDisposer( self, autorun(() => { - this.setVisible(Object.fromEntries(self.fields.map(c => [c, true]))) + self.setVisible(Object.fromEntries(self.fields.map(c => [c, true]))) }), ) addDisposer( self, autorun(() => { - this.setWidths({ + self.setWidths({ name: measureGridWidth( self.rows.map(r => r.name), diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx index ce96ca129f..e1311df78e 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx @@ -44,10 +44,9 @@ export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { const { width, views, middleComparativeHeight: synH, tracks } = model const shift = 50 const offset = headerHeight + rulerHeight - // eslint-disable-next-line @typescript-eslint/no-explicit-any const { createRootFn } = getRoot(model) const heights = views.map( - v => totalHeight(v.tracks, textHeight, trackLabels) + offset, + view => totalHeight(view.tracks, textHeight, trackLabels) + offset, ) const totalHeightSvg = sum(heights) + synH + 100 const displayResults = await Promise.all( @@ -93,18 +92,18 @@ export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { }), ) + const padding = 40 const trackLabelMaxLen = max( views.flatMap(view => - view.tracks.map(t => - measureText(getTrackName(t.configuration, session), fontSize), - ), + view.tracks + .map(track => getTrackName(track.configuration, session)) + .map(label => measureText(label, fontSize)), ), 0, - ) + 40 + ) + padding const trackLabelOffset = trackLabels === 'left' ? trackLabelMaxLen : 0 const w = width + trackLabelOffset - const t = createJBrowseTheme(theme) // the xlink namespace is used for rendering tag diff --git a/plugins/spreadsheet-view/src/LaunchSpreadsheetView/index.ts b/plugins/spreadsheet-view/src/LaunchSpreadsheetView/index.ts index b85b02c942..1b159d77b6 100644 --- a/plugins/spreadsheet-view/src/LaunchSpreadsheetView/index.ts +++ b/plugins/spreadsheet-view/src/LaunchSpreadsheetView/index.ts @@ -22,19 +22,12 @@ export default function LaunchSpreadsheetViewF(pluginManager: PluginManager) { if (!view) { throw new Error('Failed to initialize view') } - const exts = uri.split('.') - let ext = exts?.pop()?.toUpperCase() - if (ext === 'GZ') { - ext = exts?.pop()?.toUpperCase() - } - view.importWizard.setFileType(fileType || ext || '') view.importWizard.setSelectedAssemblyName(assembly) - view.importWizard.setFileSource({ + view.importWizard.setSpreadsheetFilehandle({ uri, locationType: 'UriLocation', }) - await view.importWizard.import(assembly) }, ) } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/CellData.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/CellData.tsx deleted file mode 100644 index ae2b765989..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/CellData.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react' -import { observer } from 'mobx-react' -import { Instance } from 'mobx-state-tree' - -// locals -import SpreadsheetStateModel from '../models/Spreadsheet' - -type SpreadsheetModel = Instance - -const CellData = observer(function ({ - cell, - spreadsheetModel, - columnNumber, -}: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - cell: any - spreadsheetModel: SpreadsheetModel - columnNumber: number -}) { - const ret = spreadsheetModel.columns[columnNumber] - if (ret && 'dataType' in ret && ret.dataType.DataCellReactComponent) { - return ( - - ) - } - - return cell.text -}) - -export default CellData diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/ColumnFilterControls.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/ColumnFilterControls.tsx deleted file mode 100644 index e903bf7c94..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/ColumnFilterControls.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react' -import { Grid, IconButton, Typography } from '@mui/material' -import { observer } from 'mobx-react' -import { getParent } from 'mobx-state-tree' -import { makeStyles } from 'tss-react/mui' - -// icons -import FilterIcon from '@mui/icons-material/FilterList' -import CloseIcon from '@mui/icons-material/Close' - -const useStyles = makeStyles()(theme => ({ - columnName: { - verticalAlign: 'middle', - paddingRight: '0.3em', - }, - columnFilter: { - overflow: 'hidden', - whiteSpace: 'nowrap', - boxSizing: 'border-box', - width: '100%', - position: 'relative', - }, - filterIcon: { - position: 'relative', - top: '12px', - }, - filterIconBg: { - background: theme.palette.tertiary.main, - color: 'white', - padding: theme.spacing(1.5), - }, -})) - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function FilterOperations({ filterModel }: { filterModel: any }) { - if (filterModel) { - return - } - return null -} - -const ColumnFilterControls = observer(function ({ - viewModel, - filterModel, - columnNumber, - height, -}: // eslint-disable-next-line @typescript-eslint/no-explicit-any -any) { - const { classes } = useStyles() - - const columnDefinition = viewModel.spreadsheet.columns[columnNumber] - if (!columnDefinition) { - throw new Error('no column definition! filters are probably out of date') - } - return ( - - - - - - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getParent(filterModel, 2).removeColumnFilter(filterModel) - } - title="remove filter" - > - - - - {columnDefinition.name} - {' '} - - - - ) -}) - -export default ColumnFilterControls diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/ColumnMenu.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/ColumnMenu.tsx deleted file mode 100644 index 5b4bd51b59..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/ColumnMenu.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import React from 'react' -import { observer } from 'mobx-react' -import { iterMap } from '@jbrowse/core/util' -import { Menu } from '@jbrowse/core/ui' -import { MenuItem } from '@jbrowse/core/ui/Menu' -import { SpreadsheetModel } from '../models/Spreadsheet' -import { SpreadsheetViewModel } from '../models/SpreadsheetView' - -// icons -import CheckIcon from '@mui/icons-material/Check' -import FilterListIcon from '@mui/icons-material/FilterList' -import PermDataSettingIcon from '@mui/icons-material/PermDataSetting' -import SortIcon from '@mui/icons-material/Sort' - -const ColumnMenu = observer(function ({ - viewModel, - spreadsheetModel, - currentColumnMenu, - setColumnMenu, -}: { - spreadsheetModel: SpreadsheetModel - viewModel: SpreadsheetViewModel - currentColumnMenu?: { colNumber: number; anchorEl: HTMLElement } - setColumnMenu: (arg?: { anchorEl: HTMLElement; colNumber: number }) => void -}) { - const columnMenuClose = () => setColumnMenu(undefined) - const columnNumber = currentColumnMenu?.colNumber || 0 - const sortMenuClick = (descending: boolean) => { - spreadsheetModel.setSortColumns([ - { - columnNumber, - descending, - }, - ]) - } - - const { dataTypeChoices } = spreadsheetModel - - // make a Map of categoryName => [entry...] - type Record = (typeof dataTypeChoices)[0] - interface RecordGroup { - isCategory: boolean - subMenuItems: Record[] - } - const dataTypeTopLevelMenu = new Map() - dataTypeChoices.forEach(dataTypeRecord => { - const { displayName, categoryName } = dataTypeRecord - if (categoryName) { - let entry = dataTypeTopLevelMenu.get(categoryName) as RecordGroup - if (!entry) { - entry = { - isCategory: true, - subMenuItems: [], - } - dataTypeTopLevelMenu.set(categoryName, entry) - } - entry.subMenuItems.push(dataTypeRecord) - } else { - dataTypeTopLevelMenu.set(displayName, dataTypeRecord) - } - }) - - const { columns, sortColumns } = spreadsheetModel - const dataType = currentColumnMenu && columns[columnNumber].dataType - const dataTypeName = dataType?.type || '' - const dataTypeDisplayName = - (currentColumnMenu && columns[columnNumber].dataType.displayName) || '' - - const isSortingAscending = - !!currentColumnMenu && - sortColumns.some( - c => c.columnNumber === currentColumnMenu.colNumber && !c.descending, - ) - const isSortingDescending = - !!currentColumnMenu && - sortColumns.some( - c => c.columnNumber === currentColumnMenu.colNumber && c.descending, - ) - - const menuItems = [ - // top-level column menu - { - label: 'Sort ascending', - icon: SortIcon, - type: 'radio', - checked: isSortingAscending, - onClick: () => sortMenuClick(false), - }, - { - label: 'Sort descending', - icon: SortIcon, - type: 'radio', - checked: isSortingDescending, - onClick: () => sortMenuClick(true), - }, - { - label: 'No sort', - icon: SortIcon, - type: 'radio', - checked: !isSortingDescending && !isSortingAscending, - onClick: () => spreadsheetModel.setSortColumns([]), - }, - // data type menu - { - label: `Type: ${dataTypeDisplayName}`, - icon: PermDataSettingIcon, - subMenu: iterMap( - dataTypeTopLevelMenu.entries(), - ([displayName, record]) => { - if ('typeName' in record && record.typeName) { - const { typeName } = record - return { - label: displayName || typeName, - icon: dataTypeName === typeName ? CheckIcon : undefined, - onClick: () => - spreadsheetModel.setColumnType(columnNumber, typeName), - } - } else if ('subMenuItems' in record && record.subMenuItems) { - const { subMenuItems } = record - return { - label: displayName, - icon: subMenuItems.some(i => i.typeName === dataTypeName) - ? CheckIcon - : undefined, - subMenu: subMenuItems.map(({ typeName, displayName }) => ({ - label: displayName, - icon: typeName === dataTypeName ? CheckIcon : undefined, - onClick: () => - spreadsheetModel.setColumnType(columnNumber, typeName), - })), - } - } else { - return null - } - }, - ).filter(Boolean), - }, - ] as MenuItem[] - - // don't display the filter item if this data type doesn't have filtering - // implemented - if (dataType?.hasFilter) { - menuItems.push({ - label: 'Create filter', - icon: FilterListIcon, - onClick: () => - viewModel.filterControls.addBlankColumnFilter(columnNumber), - }) - } - - return ( - { - callback() - columnMenuClose() - }} - onClose={columnMenuClose} - menuItems={menuItems} - anchorOrigin={{ - vertical: 'bottom', - horizontal: 'right', - }} - /> - ) -}) - -export default ColumnMenu diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/DataRow.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/DataRow.tsx deleted file mode 100644 index 5ea3c1703b..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/DataRow.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import React from 'react' -import { Checkbox, IconButton, FormControlLabel } from '@mui/material' -import { observer } from 'mobx-react' -import { Instance } from 'mobx-state-tree' -import { indigo } from '@mui/material/colors' -import { makeStyles } from 'tss-react/mui' - -// icons -import ArrowDropDown from '@mui/icons-material/ArrowDropDown' - -// locals -import SpreadsheetStateModel from '../models/Spreadsheet' -import RowStateModel from '../models/Row' -import CellData from './CellData' - -type SpreadsheetModel = Instance -type RowModel = Instance - -const useStyles = makeStyles()(theme => ({ - rowNumCell: { - textAlign: 'left', - border: `1px solid ${theme.palette.action.disabledBackground}`, - position: 'relative', - padding: '0 2px 0 0', - whiteSpace: 'nowrap', - userSelect: 'none', - }, - rowNumber: { - fontWeight: 'normal', - display: 'inline-block', - flex: 'none', - paddingRight: '20px', - margin: 0, - whiteSpace: 'nowrap', - }, - rowMenuButton: { - padding: 0, - margin: 0, - position: 'absolute', - right: 0, - display: 'inline-block', - whiteSpace: 'nowrap', - flex: 'none', - }, - rowMenuButtonIcon: {}, - rowSelector: { - position: 'relative', - top: '-2px', - margin: 0, - padding: '0 0.2rem', - }, - - dataRowSelected: { - background: indigo[100], - '& th': { - background: indigo[100], - }, - }, -})) - -const DataRow = observer(function ({ - rowModel, - rowNumber, - spreadsheetModel, -}: { - rowModel: RowModel - rowNumber: string - spreadsheetModel: SpreadsheetModel -}) { - const { classes } = useStyles() - const { hideRowSelection, columnDisplayOrder } = spreadsheetModel - let rowClass = '' - if (rowModel.isSelected) { - rowClass += `${classes.dataRowSelected}` - } - - function labelClick(evt: React.MouseEvent) { - rowModel.toggleSelect() - evt.stopPropagation() - evt.preventDefault() - } - - return ( - - - {hideRowSelection ? ( - - } - label={rowModel.id} - /> - ) : null} - { - spreadsheetModel.setRowMenuPosition({ - anchorEl: event.currentTarget, - rowNumber, - }) - event.preventDefault() - event.stopPropagation() - }} - > - - - - {columnDisplayOrder.map(colNumber => ( - - - - ))} - - ) -}) - -export default DataRow diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/DataTable.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/DataTable.tsx deleted file mode 100644 index 34c083cbce..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/DataTable.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import React from 'react' -import { observer } from 'mobx-react' -import { getParent, Instance } from 'mobx-state-tree' -import { makeStyles } from 'tss-react/mui' - -// locals -import SpreadsheetStateModel from '../models/Spreadsheet' -import RowStateModel from '../models/Row' -import RowMenu from './RowMenu' -import DataRow from './DataRow' -import DataTableHeader from './DataTableHeader' - -type SpreadsheetModel = Instance -type RowModel = Instance - -const useStyles = makeStyles()(theme => ({ - dataTable: { - borderCollapse: 'collapse', - '& td': { - border: `1px solid ${theme.palette.action.disabledBackground}`, - padding: '0.2rem', - maxWidth: '50em', - overflow: 'hidden', - textOverflow: 'ellipsis', - }, - }, - - emptyMessage: { - captionSide: 'bottom', - }, -})) - -const DataTableBody = observer(function ({ - rows, - spreadsheetModel, - page, - rowsPerPage, -}: { - rows: RowModel[] - spreadsheetModel: SpreadsheetModel - page: number - rowsPerPage: number -}) { - return ( - - {rows.slice(rowsPerPage * page, rowsPerPage * (page + 1)).map(row => ( - - ))} - - ) -}) - -const DataTable = observer(function ({ - model, - page, - rowsPerPage, -}: { - model: SpreadsheetModel - page: number - rowsPerPage: number -}) { - const { rowSet } = model - const { classes } = useStyles() - const rows = rowSet.sortedFilteredRows - return ( - <> - - - - - {!rows.length ? ( - - ) : null} -
- {rowSet.count ? 'no rows match criteria' : 'no rows present'} -
- - ) -}) - -export default DataTable diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/DataTableHeader.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/DataTableHeader.tsx deleted file mode 100644 index a0aca2f6e1..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/DataTableHeader.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import React, { useState } from 'react' -import { IconButton, Tooltip } from '@mui/material' -import { observer } from 'mobx-react' -import { getParent } from 'mobx-state-tree' -import { makeStyles } from 'tss-react/mui' - -// icons -import CropFreeIcon from '@mui/icons-material/CropFree' -import ArrowDropDown from '@mui/icons-material/ArrowDropDown' - -// locals -import { SpreadsheetModel } from '../models/Spreadsheet' -import ColumnMenu from './ColumnMenu' -import SortIndicator from './SortIndicator' -import { numToColName } from './util' - -interface ColMenu { - colNumber: number - anchorEl: HTMLElement -} - -const useStyles = makeStyles()(theme => ({ - columnHead: { - fontWeight: 'normal', - background: theme.palette.mode === 'dark' ? '#333' : '#eee', - position: 'sticky', - top: 0, - zIndex: 2, - whiteSpace: 'nowrap', - }, - - columnButtonContainer: { - display: 'none', - position: 'absolute', - right: 0, - top: 0, - background: theme.palette.background.paper, - height: '100%', - }, - - topLeftCorner: { - background: theme.palette.mode === 'dark' ? '#333' : '#eee', - zIndex: 2, - position: 'sticky', - top: 0, - minWidth: theme.spacing(2), - textAlign: 'left', - }, -})) - -const DataTableHeader = observer(function ({ - model, -}: { - model: SpreadsheetModel -}) { - const { classes } = useStyles() - const { columnDisplayOrder, columns, hasColumnNames, rowSet } = model - const [currentColumnMenu, setColumnMenu] = useState() - const [currentHoveredColumn, setHoveredColumn] = useState() - - return ( - <> - - - - - - model.unselectAll()} - disabled={!rowSet.selectedCount} - > - - - - - - {columnDisplayOrder.map(colNumber => ( - setHoveredColumn(colNumber)} - onMouseOut={() => setHoveredColumn(undefined)} - > - - {(hasColumnNames && columns[colNumber]?.name) || - numToColName(colNumber)} -
- { - setColumnMenu({ - colNumber, - anchorEl: evt.currentTarget, - }) - }} - > - - -
- - ))} - - - - - ) -}) - -export default DataTableHeader diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/GlobalFilterControls.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/GlobalFilterControls.tsx deleted file mode 100644 index 1dc44e13fa..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/GlobalFilterControls.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React, { useState, useEffect } from 'react' - -import { IconButton, InputAdornment, TextField } from '@mui/material' -import ClearIcon from '@mui/icons-material/Clear' -import FilterIcon from '@mui/icons-material/FilterList' - -import { observer } from 'mobx-react' -import { makeStyles } from 'tss-react/mui' -import { useDebounce } from '@jbrowse/core/util' - -const useStyles = makeStyles()({ - textFilterControlEndAdornment: { - marginRight: '-18px', - }, -}) - -const TextFilter = observer(function ({ - textFilter, -}: { - textFilter: { stringToFind: string; setString: (arg: string) => void } -}) { - const { classes } = useStyles() - // this paragraph is silliness to debounce the text filter input - const [textFilterValue, setTextFilterValue] = useState( - textFilter.stringToFind, - ) - const debouncedTextFilter = useDebounce(textFilterValue, 500) - useEffect(() => { - textFilter.setString(debouncedTextFilter) - }, [debouncedTextFilter, textFilter]) - - return ( -
- setTextFilterValue(evt.target.value)} - variant="outlined" - InputProps={{ - startAdornment: ( - - - - ), - endAdornment: ( - - setTextFilterValue('')} - > - - - - ), - }} - /> -
- ) -}) - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const GlobalFilterControls = observer(({ model }: { model: any }) => { - const textFilter = model.filterControls.rowFullText - return -}) - -export default GlobalFilterControls diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx index e53d8a230d..fdd2f081a0 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx +++ b/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx @@ -1,7 +1,6 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { Button, - Checkbox, FormControl, FormGroup, FormLabel, @@ -11,13 +10,18 @@ import { } from '@mui/material' import { observer } from 'mobx-react' import { getRoot } from 'mobx-state-tree' -import { AbstractRootModel, getSession } from '@jbrowse/core/util' -import { FileSelector, ErrorMessage, AssemblySelector } from '@jbrowse/core/ui' +import { makeStyles } from 'tss-react/mui' +import { AbstractRootModel, FileLocation, getSession } from '@jbrowse/core/util' +import { + FileSelector, + ErrorMessage, + AssemblySelector, + LoadingEllipses, +} from '@jbrowse/core/ui' // locals import { ImportWizardModel } from '../models/ImportWizard' -import NumberEditor from './NumberEditor' -import { makeStyles } from 'tss-react/mui' +import { getFileType } from './util' const useStyles = makeStyles()({ container: { @@ -27,80 +31,57 @@ const useStyles = makeStyles()({ }, }) +function FormControl2({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ) +} + const ImportWizard = observer(({ model }: { model: ImportWizardModel }) => { const session = getSession(model) const { classes } = useStyles() const { assemblyNames, assemblyManager } = session - const { - fileType, - canCancel, - fileSource, - isReadyToOpen, - fileTypes, - hasColumnNameLine, - error, - } = model + const { fileTypes, error, loading } = model const [selected, setSelected] = useState(assemblyNames[0]) const err = assemblyManager.get(selected)?.error || error - const showRowControls = fileType === 'CSV' || fileType === 'TSV' - const rootModel = getRoot(model) + const rootModel = getRoot(model) + const [tmp, setTmp] = useState() + const [fileType, setFileType] = useState(getFileType(tmp)) + useEffect(() => { + setFileType(getFileType(tmp)) + }, [tmp]) return (
{err ? : null} -
- - Tabular file - - model.setFileSource(arg)} - rootModel={rootModel as AbstractRootModel} - /> - - -
-
- - File Type - - {fileTypes.map(fileTypeName => ( - model.setFileType(fileTypeName)} - control={} - label={fileTypeName} - /> - ))} - - -
- {showRowControls ? ( -
- - Column Names + {loading ? : null} + + File + + setTmp(arg)} + rootModel={rootModel} + /> + + + + File type + + {fileTypes.map(fileTypeName => ( model.toggleHasColumnNameLine()} - /> - } + key={fileTypeName} + checked={fileType === fileTypeName} + value={fileTypeName} + onClick={() => setFileType(fileTypeName)} + control={} + label={fileTypeName} /> - - -
- ) : null} + ))} + +
{ onChange={val => setSelected(val)} />
-
- {canCancel ? ( - - ) : null}{' '} - -
+
) }) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/NumberEditor.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/NumberEditor.tsx deleted file mode 100644 index 73cab60dbf..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/NumberEditor.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { TextField } from '@mui/material' -import { makeStyles } from 'tss-react/mui' -import { observer } from 'mobx-react' - -// locals -import { ImportWizardModel } from '../models/ImportWizard' - -const useStyles = makeStyles()({ - textField: { - width: '2rem', - verticalAlign: 'baseline', - }, -}) - -const NumberEditor = observer(function ({ - model, - disabled, - modelPropName, - modelSetterName, -}: { - model: ImportWizardModel - disabled: boolean - modelPropName: string - modelSetterName: string -}) { - // @ts-expect-error - const [val, setVal] = useState(model[modelPropName]) - const { classes } = useStyles() - useEffect(() => { - const num = Number.parseInt(val, 10) - if (!Number.isNaN(num)) { - if (num > 0) { - // @ts-expect-error - model[modelSetterName](num) - } else { - setVal(1) - } - } - }, [model, modelSetterName, val]) - return ( - setVal(evt.target.value)} - className={classes.textField} - /> - ) -}) - -export default NumberEditor diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/RowCountMessage.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/RowCountMessage.tsx deleted file mode 100644 index 701adb5c33..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/RowCountMessage.tsx +++ /dev/null @@ -1,45 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import React from 'react' -import { observer } from 'mobx-react' -import { Instance } from 'mobx-state-tree' - -// locals -import SpreadsheetStateModel from '../models/Spreadsheet' - -type SpreadsheetModel = Instance - -const RowCountMessage = observer(function ({ - spreadsheet, -}: { - spreadsheet: SpreadsheetModel -}) { - if (spreadsheet.rowSet.isLoaded) { - const { - passingFiltersCount, - count, - selectedCount, - selectedAndPassingFiltersCount, - } = spreadsheet.rowSet - - let rowMessage - if (passingFiltersCount !== count) { - rowMessage = `${spreadsheet.rowSet.passingFiltersCount} rows of ${spreadsheet.rowSet.count} total` - if (selectedCount) { - rowMessage += `, ${selectedAndPassingFiltersCount} selected` - const selectedAndNotPassingFiltersCount = - selectedCount - selectedAndPassingFiltersCount - if (selectedAndNotPassingFiltersCount) { - rowMessage += ` (${selectedAndNotPassingFiltersCount} selected rows do not pass filters)` - } - } - } else { - rowMessage = `${spreadsheet.rowSet.count} rows` - if (selectedCount) { - rowMessage += `, ${selectedCount} selected` - } - } - return rowMessage - } - return null -}) -export default RowCountMessage diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/RowMenu.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/RowMenu.tsx deleted file mode 100644 index 928605b455..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/RowMenu.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react' -import { observer } from 'mobx-react' -import { Menu, MenuItem } from '@jbrowse/core/ui' -import { Instance } from 'mobx-state-tree' - -// locals -import SpreadsheetModel from '../models/Spreadsheet' -import ViewModel from '../models/SpreadsheetView' - -const RowMenu = observer(function ({ - viewModel, - spreadsheetModel, -}: { - viewModel: Instance - spreadsheetModel: Instance -}) { - const currentRowMenu = spreadsheetModel.rowMenuPosition - const { setRowMenuPosition } = spreadsheetModel - - const rowMenuClose = () => { - setRowMenuPosition(null) - } - - const rowNumber = spreadsheetModel.rowMenuPosition?.rowNumber - if (rowNumber === undefined) { - return null - } - - const row = spreadsheetModel.rowSet.rows[+rowNumber - 1] - - function handleMenuItemClick(_event: unknown, callback: Function) { - callback(viewModel, spreadsheetModel, rowNumber, row) - rowMenuClose() - } - - // got through and evaluate all the `disabled` callbacks of the menu items - const menuItems: MenuItem[] = viewModel.rowMenuItems.map(item => { - if (typeof item.disabled === 'function') { - const disabled = item.disabled( - viewModel, - spreadsheetModel, - +rowNumber, - row, - ) - return { ...item, disabled } - } - return item - }) - - return ( - - ) -}) - -export default RowMenu diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/SortIndicator.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/SortIndicator.tsx deleted file mode 100644 index 95259aca1b..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/SortIndicator.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' -import { makeStyles } from 'tss-react/mui' - -// icons -import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp' -import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown' -import { SpreadsheetModel } from '../models/Spreadsheet' - -const useStyles = makeStyles()({ - sortIndicator: { - position: 'relative', - top: '0.2rem', - fontSize: '1rem', - }, -}) - -export default function SortIndicator({ - model, - columnNumber, -}: { - model: SpreadsheetModel - columnNumber: number -}) { - const { classes } = useStyles() - const sortSpec = model.sortColumns.find(c => c.columnNumber === columnNumber) - - if (sortSpec) { - const { descending } = sortSpec - return descending ? ( - - ) : ( - - ) - } - return null -} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/Spreadsheet.test.ts b/plugins/spreadsheet-view/src/SpreadsheetView/components/Spreadsheet.test.ts deleted file mode 100644 index 567f09aa73..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/Spreadsheet.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { numToColName } from './util' - -describe('num to col name', () => { - const cases = [ - [10, 'K'], - [26, 'AA'], - [0, 'A'], - [25, 'Z'], - [27 * 26 - 1, 'ZZ'], - ] as const - - cases.forEach(([input, output]) => { - test(`${input} -> ${output}`, () => { - expect(numToColName(input)).toBe(output) - }) - }) -}) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/Spreadsheet.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/Spreadsheet.tsx deleted file mode 100644 index 97eb2490d3..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/Spreadsheet.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react' -import { observer } from 'mobx-react' -import { Instance } from 'mobx-state-tree' -import { makeStyles } from 'tss-react/mui' - -// locals -import SpreadsheetStateModel from '../models/Spreadsheet' -import { LoadingEllipses } from '@jbrowse/core/ui' -import DataTable from './DataTable' - -type SpreadsheetModel = Instance - -const useStyles = makeStyles()(theme => ({ - root: { - position: 'relative', - marginBottom: theme.spacing(1), - background: theme.palette.background.paper, - overflow: 'auto', - }, -})) - -const Spreadsheet = observer(function ({ - model, - height, - page, - rowsPerPage, -}: { - model: SpreadsheetModel - height: number - page: number - rowsPerPage: number -}) { - const { classes } = useStyles() - - return ( -
- {model?.rowSet?.isLoaded && model.initialized ? ( - - ) : ( - - )} -
- ) -}) - -export default Spreadsheet diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetDataGrid.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetDataGrid.tsx new file mode 100644 index 0000000000..43467158c0 --- /dev/null +++ b/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetDataGrid.tsx @@ -0,0 +1,54 @@ +import React from 'react' +import { observer } from 'mobx-react' +import { DataGrid, GridToolbar } from '@mui/x-data-grid' +import { ResizeBar } from '@jbrowse/core/ui' +import { useResizeBar } from '@jbrowse/core/ui/useResizeBar' + +// locals +import { SpreadsheetModel } from '../models/Spreadsheet' + +const SpreadsheetDataGrid = observer(function ({ + model, +}: { + model: SpreadsheetModel +}) { + const { ref, scrollLeft } = useResizeBar() + const { rows, visibleColumns, columns, columnWidths } = model + console.log({ columns }) + + return ( +
+ f ?? 100)} + setWidths={newWidths => + model.setColumnWidths( + Object.fromEntries( + Object.entries(columnWidths).map((entry, idx) => [ + entry[0], + newWidths[idx], + ]), + ), + ) + } + scrollLeft={scrollLeft} + /> + model.setVisibleColumns(n)} + rowHeight={25} + hideFooter={rows.length < 100} + slots={{ toolbar: GridToolbar }} + slotProps={{ + toolbar: { + showQuickFilter: true, + }, + }} + rows={rows} + columns={columns!} + /> +
+ ) +}) + +export default SpreadsheetDataGrid diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetView.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetView.tsx index 1a6c8f0b19..429571eba7 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetView.tsx +++ b/plugins/spreadsheet-view/src/SpreadsheetView/components/SpreadsheetView.tsx @@ -1,39 +1,25 @@ -import React, { useState } from 'react' -import { Grid } from '@mui/material' +import React, { Suspense, lazy, useState } from 'react' import { makeStyles } from 'tss-react/mui' import { observer } from 'mobx-react' import { ResizeHandle } from '@jbrowse/core/ui' // locals -import ImportWizard from './ImportWizard' -import Spreadsheet from './Spreadsheet' -import GlobalFilterControls from './GlobalFilterControls' -import ColumnFilterControls from './ColumnFilterControls' import { SpreadsheetViewModel } from '../models/SpreadsheetView' -import StatusBar from './StatusBar' +import SpreadsheetDataGrid from './SpreadsheetDataGrid' -const headerHeight = 52 -const colFilterHeight = 46 -const statusBarHeight = 40 +const ImportWizard = lazy(() => import('./ImportWizard')) const useStyles = makeStyles()(theme => ({ - header: { - overflow: 'hidden', - whiteSpace: 'nowrap', - boxSizing: 'border-box', - height: headerHeight, - paddingLeft: theme.spacing(1), - }, contentArea: { overflow: 'auto', + position: 'relative', + marginBottom: theme.spacing(1), + background: theme.palette.background.paper, }, resizeHandle: { - height: 3, - position: 'absolute', - bottom: 0, - left: 0, - background: theme.palette.action.disabled, + height: 5, boxSizing: 'border-box', + background: theme.palette.action.disabled, borderTop: '1px solid #fafafa', }, })) @@ -43,83 +29,37 @@ const SpreadsheetView = observer(function ({ }: { model: SpreadsheetViewModel }) { + const [initialHeight, setInitialHeight] = useState(0) const { classes } = useStyles() - const { - spreadsheet, - filterControls, - hideFilterControls, - hideVerticalResizeHandle, - mode, - height, - } = model - const [page, setPage] = useState(0) - const [rowsPerPage, setRowsPerPage] = useState(100) - + const { spreadsheet, hideVerticalResizeHandle, height } = model return ( -
- {mode !== 'display' || hideFilterControls ? null : ( - <> - - - - - - {filterControls.columnFilters.map((f, i) => ( - - ))} - - )} - - {mode === 'import' ? ( - - ) : ( -
-
- {spreadsheet ? ( - - ) : null} -
-
- )} - {spreadsheet ? ( - - ) : null} + <> +
+ +
{hideVerticalResizeHandle ? null : ( setInitialHeight(height)} + onDrag={(_, dist) => model.setHeight(initialHeight - dist)} className={classes.resizeHandle} /> )} -
+ + ) +}) + +const SpreadsheetContainer = observer(function ({ + model, +}: { + model: SpreadsheetViewModel +}) { + return !model.initialized ? ( + + + + ) : ( + ) }) -export default SpreadsheetView +export default SpreadsheetContainer diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/StatusBar.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/StatusBar.tsx deleted file mode 100644 index d24b5b1b4e..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/StatusBar.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react' -import { FormGroup, TablePagination } from '@mui/material' -import { makeStyles } from 'tss-react/mui' - -// locals -import RowCountMessage from './RowCountMessage' -import { SpreadsheetModel } from '../models/Spreadsheet' -import { observer } from 'mobx-react' - -const statusBarHeight = 40 - -const useStyles = makeStyles()(theme => ({ - statusBar: { - height: statusBarHeight, - boxSizing: 'border-box', - borderTop: '1px outset #b1b1b1', - paddingLeft: theme.spacing(1), - }, - verticallyCenter: { - display: 'flex', - justifyContent: 'center', - flexDirection: 'column', - }, - spacer: { - flexGrow: 1, - }, -})) - -const StatusBar = observer(function StatusBar({ - page, - rowsPerPage, - setPage, - setRowsPerPage, - spreadsheet, - mode, -}: { - page: number - mode: string - spreadsheet: SpreadsheetModel - rowsPerPage: number - setPage: (arg: number) => void - setRowsPerPage: (arg: number) => void -}) { - const { classes } = useStyles() - return ( -
- {spreadsheet ? ( - -
- -
-
- setPage(newPage)} - onRowsPerPageChange={event => { - setRowsPerPage(+event.target.value) - setPage(0) - }} - /> -
- - ) : null} -
- ) -}) - -export default StatusBar diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/util.ts b/plugins/spreadsheet-view/src/SpreadsheetView/components/util.ts index fc1bafa1a4..20aff34410 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/util.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/components/util.ts @@ -1,16 +1,54 @@ -function letterFor(n: number) { - return String.fromCharCode(n + 65) +import { FileLocation, getSession } from '@jbrowse/core/util' +import { getParent } from 'mobx-state-tree' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel +type MaybeLGV = LinearGenomeViewModel | undefined + +export function locationLinkClick( + spreadsheet: { assemblyName?: string }, + locString: string, +) { + const session = getSession(spreadsheet) + const { assemblyName } = spreadsheet + const { id } = getParent<{ id: string }>(spreadsheet) + + const newViewId = `${id}_${assemblyName}` + let view = session.views.find(v => v.id === newViewId) as MaybeLGV + if (!view) { + view = session.addView('LinearGenomeView', { id: newViewId }) as LGV + } + return view.navToLocString(locString, assemblyName) } -export function numToColName(num: number) { - if (num >= 0) { - if (num < 26) { - return letterFor(num) - } - if (num < 27 * 26) { - return letterFor(Math.floor(num / 26 - 1)) + letterFor(num % 26) +export const fileTypes = ['VCF', 'BED', 'BEDPE', 'STAR-Fusion'] + +export const fileTypesRegexp = new RegExp( + `\\.(${fileTypes.join('|')})(\\.gz)?$`, + 'i', +) + +export function getFilename(file?: FileLocation) { + return file + ? // @ts-expect-error + file.uri || + // @ts-expect-error + file.localPath || + // @ts-expect-error + (file.blobId && file.name) + : undefined +} + +export function getFileType(file?: FileLocation) { + const name = getFilename(file) + + if (name) { + const firstMatch = fileTypesRegexp.exec(name)?.[1] + if (firstMatch) { + return firstMatch === 'tsv' && name.includes('star-fusion') + ? 'STAR-Fusion' + : firstMatch.toUpperCase() } } - - throw new RangeError('column number out of range') + return 'VCF' } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.test.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.test.ts deleted file mode 100644 index f20f9126be..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { promises as fsPromises } from 'fs' -import path from 'path' - -import { removeBedHeaders } from './BedImport' - -test('bed header trimming', async () => { - const filepath = path.join(__dirname, '..', 'test_data', 'foo.bed') - const buf = await fsPromises.readFile(filepath) - expect(buf[0]).toEqual(98) - expect(buf[1]).toEqual(114) - const trimmedBuffer = removeBedHeaders(buf) - expect(trimmedBuffer[0]).toEqual(99) - expect(trimmedBuffer.length).toBe(275) -}) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts index 07c4a0a70a..2a7871dd15 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts @@ -1,155 +1,94 @@ -import { ParseOptions, parseTsvBuffer } from './ImportUtils' +import { assembleLocString } from '@jbrowse/core/util' +import { parseStrand } from './util' +import LocString from './components/LocString' -const browserBytes = 'browser '.split('').map(c => c.charCodeAt(0)) -const trackBytes = 'track '.split('').map(c => c.charCodeAt(0)) -const commentBytes = '#'.split('').map(c => c.charCodeAt(0)) +const MAX_SET_SCAN = 100 +const MAX_BED_COL = 6 -function bytesAreFoundAt(position: number, buffer: Buffer, bytes: number[]) { +export async function parseBedBuffer(buffer: Buffer) { + const data = new TextDecoder('utf8', { fatal: true }).decode(buffer) + const lines = data.split(/\n|\r\n|\r/).filter(f => !!f) + const headerLines = [] let i = 0 - for (; i < bytes.length; i += 1) { - if (buffer[position + i] !== bytes[i]) { - return false - } + for ( + ; + i < lines.length && + (lines[i].startsWith('#') || + lines[i].startsWith('browser') || + lines[i].startsWith('track')); + i++ + ) { + headerLines.push(lines[i]) } - return true -} -export function removeBedHeaders(buffer: Buffer) { - // slice off the first lines of the buffer if it starts with one or more - // header lines - let i = 0 - for (; i < buffer.length; i += 1) { - if ( - bytesAreFoundAt(i, buffer, browserBytes) || - bytesAreFoundAt(i, buffer, trackBytes) || - bytesAreFoundAt(i, buffer, commentBytes) - ) { - // consume up to the next newline - do { - i += 1 - } while (buffer[i] !== 10) - } else { - // end of headers, return - break - } + const header = headerLines.join('\n') + const lastHeaderLine = headerLines.at(-1) + let names = [] as string[] + if (lastHeaderLine?.startsWith('#')) { + names = lastHeaderLine + .slice(1) + .split('\t') + .map(f => f.trim()) } - if (i) { - return buffer.slice(i) - } - return buffer -} -export async function parseBedBuffer(buffer: Buffer, options: ParseOptions) { - const b = removeBedHeaders(buffer) - const data = await parseTsvBuffer(b) - const bedColumns = [ - { name: 'chrom', dataType: { type: 'LocRef' } }, - { name: 'chromStart', dataType: { type: 'LocStart' } }, - { name: 'chromEnd', dataType: { type: 'LocEnd' } }, - { name: 'name', dataType: { type: 'Text' } }, - { name: 'score', dataType: { type: 'Number' } }, - { name: 'strand', dataType: { type: 'Text' } }, - ] - data.columns.forEach((col, colNumber) => { - const bedColumn = bedColumns[colNumber] - if (bedColumn) { - col.name = bedColumn.name - col.dataType = bedColumn.dataType - } - }) - data.hasColumnNames = true - data.assemblyName = options.selectedAssemblyName + const columns = new Set([ + 'refName', + 'start', + 'end', + 'mate.refName', + 'mate.start', + 'mate.end', + 'name', + 'score', + 'strand', + 'mate.strand', + ...names.slice(9), + ]) + const rows = [] + for (let j = 0; i < lines.length; i++, j++) { + const line = lines[i] + const l = line.split('\t') + const refName = l[0] + const start = +l[1] + const end = +l[2] + const name = l[3] + const score = +l[4] + const strand = parseStrand(l[5]) - data.columnDisplayOrder.push(data.columnDisplayOrder.length) - data.columns.unshift({ - name: 'Location', - dataType: { type: 'LocString' }, - isDerived: true, - derivationFunctionText: `jexl:{text:row.cells[0].text+':'+row.cells[1].text+'..'+row.cells[2].text,\n - extendedData: {refName: row.cells.ref.text, start: parseInt(row.cells.start.text,10), end: parseInt(row.cells.end.text,10)}}`, - }) - return data -} - -export async function parseBedPEBuffer(buffer: Buffer, options: ParseOptions) { - const b = removeBedHeaders(buffer) - const data = await parseTsvBuffer(b) - interface BedColumn { - name: string - dataType: { - type: string - } - featureField: string[] - } - const bedColumns: BedColumn[] = [ - { name: 'chrom1', dataType: { type: 'Text' }, featureField: ['refName'] }, - { name: 'start1', dataType: { type: 'Number' }, featureField: ['start'] }, - { name: 'end1', dataType: { type: 'Number' }, featureField: ['end'] }, - { - name: 'chrom2', - dataType: { type: 'Text' }, - featureField: ['mate', 'refName'], - }, - { - name: 'start2', - dataType: { type: 'Number' }, - featureField: ['mate', 'start'], - }, - { - name: 'end2', - dataType: { type: 'Number' }, - featureField: ['mate', 'end'], - }, - { name: 'name', dataType: { type: 'Text' }, featureField: ['name'] }, - { name: 'score', dataType: { type: 'Number' }, featureField: ['score'] }, - { name: 'strand1', dataType: { type: 'Text' }, featureField: ['strand'] }, - { - name: 'strand2', - dataType: { type: 'Text' }, - featureField: ['mate', 'strand'], - }, - ] - data.columns.forEach((col, colNumber) => { - const bedColumn = bedColumns[colNumber] - if (bedColumn) { - col.name = bedColumn.name - col.dataType = bedColumn.dataType - } - }) - data.hasColumnNames = true + const extra = l.slice(MAX_BED_COL) + const rest = Object.fromEntries( + extra.map((e, idx) => { + const key = names[idx + MAX_BED_COL] || `extra_${idx}` - // decorate each row with a feature object in its extendedData - data.rowSet.rows.forEach((row, rowNumber) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const featureData: Record = {} - row.cells.forEach(({ text }, columnNumber) => { - const bedColumn = bedColumns[columnNumber] - const val = - bedColumn && bedColumn.dataType.type === 'Number' && text - ? parseFloat(text) - : text - if (bedColumn) { - // a predefined column - if (bedColumn.featureField.length === 2) { - if (!featureData[bedColumn.featureField[0]]) { - featureData[bedColumn.featureField[0]] = {} - } - featureData[bedColumn.featureField[0]][bedColumn.featureField[1]] = - val - } else { - featureData[bedColumn.featureField[0]] = val + if (j < MAX_SET_SCAN) { + columns.add(key) } - } else { - // some other column - featureData[`column${columnNumber + 1}`] = val - } - }) - featureData.uniqueId = `bedpe-${rowNumber}` - row.extendedData = { - feature: featureData, - } - }) + return [key, e] + }), + ) - data.assemblyName = options.selectedAssemblyName + rows.push({ + ...rest, + loc: assembleLocString({ + refName, + start, + end, + }), + id: `row_${i}`, + start, + end, + refName, + strand, + name, + score, + }) + } - return data + return { + header, + rows, + columns: [...columns], + customComponents: { + loc: LocString, + }, + } } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts new file mode 100644 index 0000000000..5751953b6c --- /dev/null +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts @@ -0,0 +1,97 @@ +import { parseStrand } from './util' + +const MAX_SET_SCAN = 100 +const MAX_BEDPE_COL = 10 + +export async function parseBedPEBuffer(buffer: Buffer) { + const data = new TextDecoder('utf8', { fatal: true }).decode(buffer) + const lines = data.split(/\n|\r\n|\r/).filter(f => !!f) + const headerLines = [] + let i = 0 + for ( + ; + i < lines.length && + (lines[i].startsWith('#') || + lines[i].startsWith('browser') || + lines[i].startsWith('track')); + i++ + ) { + headerLines.push(lines[i]) + } + const header = headerLines.join('\n') + const lastHeaderLine = headerLines.at(-1) + let names = [] as string[] + if (lastHeaderLine?.startsWith('#')) { + names = lastHeaderLine + .slice(1) + .split('\t') + .map(f => f.trim()) + } + + const columns = new Set([ + 'refName', + 'start', + 'end', + 'mate.refName', + 'mate.start', + 'mate.end', + 'name', + 'score', + 'strand', + 'mate.strand', + ...names.slice(9), + ]) + const rows = [] + for (let j = 0; i < lines.length; i++, j++) { + const line = lines[i] + const l = line.split('\t') + const ref1 = l[0] + const start1 = +l[1] + const end1 = +l[2] + const ref2 = l[3] + const start2 = +l[4] + const end2 = +l[5] + const name = l[6] + const score = +l[7] + const strand1 = parseStrand(l[8]) + const strand2 = parseStrand(l[9]) + + let extra = l.slice(MAX_BEDPE_COL) + let ALT + if (['DUP', 'TRA', 'INV', 'CNV', 'DEL'].includes(extra[0])) { + ALT = `<${extra[0]}>` + if (j < MAX_SET_SCAN) { + columns.add('ALT') + } + extra = extra.slice(1) + } + const rest = Object.fromEntries( + extra.map((e, idx) => { + const key = names[idx + MAX_BEDPE_COL] || `extra_${idx}` + + if (j < MAX_SET_SCAN) { + columns.add(key) + } + return [key, e] + }), + ) + + rows.push({ + ...rest, + id: `row_${i}`, + start: start1, + end: end1, + refName: ref1, + strand: strand1, + name, + ALT, + score, + 'mate.refName': ref2, + 'mate.start': start2, + 'mate.end': end2, + 'mate.strand': strand2, + }) + } + + return { header, rows, columns: [...columns] } +} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/ImportUtils.test.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/ImportUtils.test.ts deleted file mode 100644 index 3347ef3d77..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/ImportUtils.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { promises as fsPromises } from 'fs' -import path from 'path' - -// locals -import { parseCsvBuffer } from './ImportUtils' -import SpreadsheetModel from '../models/Spreadsheet' - -test('csv to spreadsheet snapshot', async () => { - const filepath = path.join( - __dirname, - '..', - 'test_data', - 'breast_cancer.subset.csv', - ) - const buf = await fsPromises.readFile(filepath) - const spreadsheetSnap = await parseCsvBuffer(buf, { - hasColumnNameLine: true, - columnNameLineNumber: 1, - isValidRefName: () => true, - }) - expect(spreadsheetSnap).toMatchSnapshot() - // @ts-expect-error - const spreadsheet = SpreadsheetModel.create(spreadsheetSnap) - expect(spreadsheet.rowSet.rows.length).toBe(49) -}) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/ImportUtils.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/ImportUtils.ts deleted file mode 100644 index d0a1b16833..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/ImportUtils.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { parseLocString } from '@jbrowse/core/util' - -export function bufferToString(buffer: Buffer) { - return new TextDecoder('utf8', { fatal: true }).decode(buffer) -} - -async function parseWith(buffer: Buffer, options = {}) { - const csv = await import('csvtojson').then(module => module.default) - return csv({ noheader: true, output: 'csv', ...options }).fromString( - bufferToString(buffer), - ) -} - -export interface Row { - id: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - extendedData?: any - cells: { - text: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - extendedData?: any - }[] -} - -export interface RowSet { - isLoaded: boolean - rows: Row[] -} - -export interface ParseOptions { - hasColumnNameLine?: boolean - columnNameLineNumber?: number - selectedAssemblyName?: string - isValidRefName?: (refName: string, assemblyName?: string) => boolean -} - -export interface Column { - name: string - dataType: { type: string } - isDerived?: boolean - derivationFunctionText?: string -} - -function guessColumnType( - rowSet: RowSet, - columnNumber: number, - isValidRefName: (refName: string, assemblyName?: string) => boolean, -) { - const text = rowSet.rows[0].cells[columnNumber].text || '' - - let guessedType = 'Text' - - let parsedLoc - try { - parsedLoc = parseLocString(text, isValidRefName) - } catch (error) { - // - } - if (parsedLoc?.refName && typeof parsedLoc.start === 'number') { - guessedType = 'LocString' - } else if (/^\d+(\.\d+)?$/.test(text)) { - guessedType = 'Number' - } - - // MAYBE TODO: iterate over the rest of the rows to confirm - // the type for all the rows - - return guessedType -} - -function dataToSpreadsheetSnapshot( - rows: string[][], - options: ParseOptions = {}, -) { - const { - hasColumnNameLine = false, - columnNameLineNumber = 1, - isValidRefName = () => false, - selectedAssemblyName, - } = options - // rows is an array of row objects and columnNames - // is an array of column names (in import order) - let maxCols = 0 - const rowSet: RowSet = { - isLoaded: true, - rows: rows.map((row, rowNumber) => { - const id = rowNumber + (hasColumnNameLine ? 0 : 1) - if (row.length > maxCols) { - maxCols = row.length - } - return { - id: String(id), - cells: row.map((text, columnNumber) => { - return { columnNumber, text } - }), - } - }), - } - - // process the column names row if present - const columnNames: Record = {} - if (hasColumnNameLine && columnNameLineNumber !== undefined) { - const [colNamesRow] = rowSet.rows.splice(columnNameLineNumber - 1, 1) - - if (colNamesRow) { - colNamesRow.cells.forEach((cell, columnNumber) => { - columnNames[columnNumber] = cell.text || '' - }) - } - } - - // make our column definitions - const columns: Column[] = [] - const columnDisplayOrder = [] - for (let columnNumber = 0; columnNumber < maxCols; columnNumber += 1) { - columnDisplayOrder.push(columnNumber) - const guessedType = guessColumnType(rowSet, columnNumber, isValidRefName) - - // store extendeddata for LocString column - if (guessedType === 'LocString') { - for (const row of rowSet.rows) { - const cell = row.cells[columnNumber] - cell.extendedData = parseLocString(cell.text, isValidRefName) - } - } - - columns[columnNumber] = { - name: columnNames[columnNumber], - dataType: { - type: guessedType, - }, - } - } - - return { - rowSet, - columnDisplayOrder, - hasColumnNames: !!hasColumnNameLine, - columns, - assemblyName: selectedAssemblyName, - } -} - -export async function parseCsvBuffer(buffer: Buffer, options?: ParseOptions) { - const rows = await parseWith(buffer) - return dataToSpreadsheetSnapshot(rows, options) -} - -export async function parseTsvBuffer(buffer: Buffer, options?: ParseOptions) { - const rows = await parseWith(buffer, { delimiter: '\t' }) - return dataToSpreadsheetSnapshot(rows, options) -} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.test.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.test.ts deleted file mode 100644 index 22a31768be..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { promises as fsPromises } from 'fs' -import path from 'path' - -// locals -import { parseSTARFusionBuffer } from './STARFusionImport' -import SpreadsheetModel from '../models/Spreadsheet' - -test('starfusion import', async () => { - const filepath = path.join( - __dirname, - '..', - 'test_data', - 'starfusion_example.fusion_predictions.tsv', - ) - const buf = await fsPromises.readFile(filepath) - const spreadsheetSnap = await parseSTARFusionBuffer(buf, { - selectedAssemblyName: 'fogbat', - isValidRefName() { - return true - }, - }) - expect(spreadsheetSnap).toMatchSnapshot() - - // @ts-expect-error - const spreadsheet = SpreadsheetModel.create(spreadsheetSnap) - expect(spreadsheet.rowSet.rows.length).toBe(24) -}) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts index 4cfd7444ca..ca8c7f4583 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts @@ -1,74 +1,13 @@ -import { parseTsvBuffer, ParseOptions } from './ImportUtils' - -function parseSTARFusionBreakpointString(str: string) { - const fields = str.split(':') - const refName = fields[0] - const pos = Number.parseInt(fields[1], 10) - const strand = fields[2] === '-' ? -1 : 1 - return { refName, pos, strand } -} - -const numericColumns: Record = { - SpanningFragCount: true, - FFPM: true, - LeftBreakEntropy: true, - RightBreakEntropy: true, - JunctionReadCount: true, -} - -export async function parseSTARFusionBuffer( - buffer: Buffer, - options: ParseOptions, -) { - const data = await parseTsvBuffer(buffer, { - hasColumnNameLine: true, - columnNameLineNumber: 1, - selectedAssemblyName: options.selectedAssemblyName, - isValidRefName: () => false, - }) - - // remove the # in #FusionName - data.columns[0].name = data.columns[0].name.replace('#', '') - // set some columns to be numeric - data.columns.forEach(col => { - if (numericColumns[col.name]) { - col.dataType = { type: 'Number' } - } - }) - - // decorate each row with a feature object in its extendedData - data.rowSet.rows.forEach((row, rowNumber) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const featureData: Record = {} - row.cells.forEach(({ text }, columnNumber) => { - const column = data.columns[columnNumber] - if (column.name === 'LeftBreakpoint' && text) { - const { refName, pos, strand } = parseSTARFusionBreakpointString(text) - featureData.refName = refName - featureData.start = pos - featureData.end = pos - featureData.strand = strand - } else if (column.name === 'RightBreakpoint' && text) { - const { refName, pos, strand } = parseSTARFusionBreakpointString(text) - featureData.mate = { - refName, - start: pos, - end: pos, - strand, - } - } else if (text && numericColumns[column.name]) { - // some other column, numeric - featureData[column.name] = parseFloat(text) - } else { - // some other column, text - featureData[column.name] = text - } - }) - featureData.uniqueId = `sf-${rowNumber + 1}` - row.extendedData = { - feature: featureData, - } - }) - - return data +export function parseSTARFusionBuffer(buffer: Buffer) { + const str = new TextDecoder('utf8').decode(buffer) + const lines = str.split(/\n|\r\n/) + const header = lines[0].slice(1).split('\t') + return { + rows: lines + .slice(1) + .map(row => + Object.fromEntries(row.split('\t').map((c, i) => [header[i], c])), + ), + columns: header, + } } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.test.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.test.ts deleted file mode 100644 index eb5f934ed9..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { promises as fsPromises } from 'fs' -import path from 'path' -import { parseVcfBuffer, splitVcfFileHeaderAndBody } from './VcfImport' -import SpreadsheetModel from '../models/Spreadsheet' - -describe('vcf file splitter', () => { - const cases: [string, {}][] = [ - [ - '##fileformat=VCFv4.3\nfogbat\n', - { header: '##fileformat=VCFv4.3\n', body: 'fogbat\n' }, - ], - [ - '##fileformat=VCFv4.3\n##zonker\n##deek\n##donk\nfogbat\n', - { - header: '##fileformat=VCFv4.3\n##zonker\n##deek\n##donk\n', - body: 'fogbat\n', - }, - ], - ] - - cases.forEach(([input, output], caseNumber) => { - test(`case ${caseNumber}`, () => { - expect(splitVcfFileHeaderAndBody(input)).toEqual(output) - }) - }) -}) - -test('vcf file import', async () => { - const filepath = path.join( - __dirname, - '..', - 'test_data', - '1801160099-N32519_26611_S51_56704.hard-filtered.vcf', - ) - const buf = await fsPromises.readFile(filepath) - const spreadsheetSnap = parseVcfBuffer(buf) - expect(spreadsheetSnap).toMatchSnapshot() - - // @ts-expect-error - const spreadsheet = SpreadsheetModel.create(spreadsheetSnap) - expect(spreadsheet.rowSet.rows.length).toBe(101) -}) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts index 0e7abc2d6b..89a61c027a 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts @@ -1,118 +1,70 @@ import VCF from '@gmod/vcf' import { VcfFeature } from '@jbrowse/plugin-variants' -import { - bufferToString, - Row, - RowSet, - Column, - ParseOptions, -} from './ImportUtils' -const vcfCoreColumns: { name: string; type: string }[] = [ - { name: 'CHROM', type: 'Text' }, // 0 - { name: 'POS', type: 'Number' }, // 1 - { name: 'ID', type: 'Text' }, // 2 - { name: 'REF', type: 'Text' }, // 3 - { name: 'ALT', type: 'Text' }, // 4 - { name: 'QUAL', type: 'Number' }, // 5 - { name: 'FILTER', type: 'Text' }, // 6 - { name: 'INFO', type: 'Text' }, // 7 - { name: 'FORMAT', type: 'Text' }, // 8 -] - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function vcfRecordToRow(vcfParser: any, line: string, lineNumber: number): Row { - const vcfVariant = vcfParser.parseLine(line) - const vcfFeature = new VcfFeature({ - variant: vcfVariant, - parser: vcfParser, - id: `vcf-${lineNumber}`, - }) - - const data = line.split('\t').map(d => (d === '.' ? '' : d)) - // no format column, add blank - if (data.length === 8) { - data.push('') - } - const row: Row = { - id: String(lineNumber + 1), - extendedData: { vcfFeature: vcfFeature.toJSON() }, - cells: data.map((text, columnNumber) => { - return { - columnNumber, - text, - } - }), - } - return row -} - -export function parseVcfBuffer(buffer: Buffer, options: ParseOptions = {}) { - const { selectedAssemblyName } = options - let { header, body } = splitVcfFileHeaderAndBody(bufferToString(buffer)) - const rows: Row[] = [] - const vcfParser = new VCF({ header }) - header = '' // garbage collect - body.split(/\n|\r\n|\r/).forEach((line: string, lineNumber) => { - if (/\S/.test(line)) { - rows.push(vcfRecordToRow(vcfParser, line, lineNumber)) +function getRows(lines: string[], vcfParser: VCF) { + const keys = new Set() + const rows = lines.map((l, id) => { + const [CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO, FORMAT] = l.split('\t') + const ret = Object.fromEntries( + INFO?.split(';') + .map(f => f.trim()) + .map(e => { + const [key, val = 'true'] = e.split('=') + const k = `INFO.${key.trim()}` + keys.add(k) + return [k, val.trim()] + }) || [], + ) + return { + CHROM, + POS, + ID, + REF, + ALT, + QUAL, + FILTER, + FORMAT, + id, + feature: new VcfFeature({ + parser: vcfParser, + variant: vcfParser.parseLine(l), + id: `${id}`, + }), + ___lineData: l, + ...ret, } }) - body = '' // garbage collect - - const rowSet: RowSet = { - isLoaded: true, - rows, - } - - const columnDisplayOrder: number[] = [] - const columns: Column[] = [] - for (let i = 0; i < vcfCoreColumns.length; i += 1) { - columnDisplayOrder.push(i) - columns[i] = { - name: vcfCoreColumns[i].name, - dataType: { type: vcfCoreColumns[i].type }, - } - } - for (let i = 0; i < vcfParser.samples.length; i += 1) { - const oi = vcfCoreColumns.length + i - columnDisplayOrder.push(oi) - columns[oi] = { name: vcfParser.samples[i], dataType: { type: 'Text' } } - } - - columnDisplayOrder.push(columnDisplayOrder.length) - columns.unshift({ - name: 'Location', - dataType: { type: 'LocString' }, - isDerived: true, - derivationFunctionText: `jexl:{text:row.extendedData.vcfFeature.refName+':'\n - +row.extendedData.vcfFeature.start+'..'+row.extendedData.vcfFeature.end, extendedData:\n - {refName:row.extendedData.vcfFeature.refName,start:row.extendedData.vcfFeature.start,end:row.extendedData.vcfFeature.end}}`, - }) - - return { - rowSet, - columnDisplayOrder, - hasColumnNames: true, - columns, - assemblyName: selectedAssemblyName, - } + return { keys, rows } } -export function splitVcfFileHeaderAndBody(wholeFile: string) { - // split into header and the rest of the file - let headerEndIndex = 0 - let prevChar - for (; headerEndIndex < wholeFile.length; headerEndIndex += 1) { - const c = wholeFile[headerEndIndex] - if (prevChar === '\n' && c !== '#') { - break - } - prevChar = c +export function parseVcfBuffer(buffer: Buffer) { + const str = new TextDecoder('utf8').decode(buffer) + const lines = str + .split(/\n|\r\n/) + .map(f => f.trim()) + .filter(f => !!f) + const headerLines = [] + let i = 0 + for (; i < lines.length && lines[i].startsWith('#'); i++) { + headerLines.push(lines[i]) } + const header = headerLines.join('\n') + const vcfParser = new VCF({ header }) + const { keys, rows } = getRows(lines.slice(i), vcfParser) return { - header: wholeFile.slice(0, Math.max(0, headerEndIndex)), - body: wholeFile.slice(headerEndIndex), + vcfParser, + rows, + columns: [ + 'CHROM', + 'POS', + 'ID', + 'REF', + 'ALT', + 'QUAL', + 'FILTER', + 'FORMAT', + ...keys, + ], } } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/components/FeatureMenu.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/components/FeatureMenu.tsx new file mode 100644 index 0000000000..5b78864ee4 --- /dev/null +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/components/FeatureMenu.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { getSession } from '@jbrowse/core/util' +import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton' +// icons +import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown' +// locals +import { locationLinkClick } from '../../components/util' + +export default function FeatureMenu({ + value, + model, +}: { + value: string + model: { assemblyName?: string } +}) { + return ( + { + try { + await locationLinkClick(model, value) + } catch (e) { + console.error(e) + getSession(model).notify(`${e}`, 'error') + } + }, + }, + ]} + > + + + ) +} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/components/LocString.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/components/LocString.tsx new file mode 100644 index 0000000000..39e3f3b71d --- /dev/null +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/components/LocString.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import { Link } from '@mui/material' +import { getSession } from '@jbrowse/core/util' + +// locals +import { locationLinkClick } from '../../components/util' + +export default function LocString({ + value, + model, +}: { + value: string + model: { assemblyName?: string } +}) { + return ( + { + try { + event.preventDefault() + await locationLinkClick(model, value) + } catch (e) { + console.error(e) + getSession(model).notify(`${e}`, 'error') + } + }} + > + {value} + + ) +} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts new file mode 100644 index 0000000000..af2f9ee16b --- /dev/null +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts @@ -0,0 +1,135 @@ +import { + Feature, + assembleLocString, + getEnv, + getSession, +} from '@jbrowse/core/util' +import { getParent } from 'mobx-state-tree' +import { VcfFeature } from '@jbrowse/plugin-variants' +import VCF, { parseBreakend } from '@gmod/vcf' + +// locals +import { locationLinkClick } from '../components/util' +import { SpreadsheetModel } from '../models/Spreadsheet' + +export function parseStrand(strand: string) { + if (strand === '+') { + return 1 + } else if (strand === '-') { + return -1 + } else if (strand === '.') { + return 0 + } else { + return undefined + } +} + +export async function launchLinearGenomeView({ + model, + value, +}: { + model: SpreadsheetModel + value: string +}) { + try { + await locationLinkClick(model, value) + } catch (e) { + console.error(e) + getSession(model).notify(`${e}`, 'error') + } +} + +export async function launchBreakpointSplitView({ + model, + row, + vcfParser, +}: { + model: SpreadsheetModel + row: Record + vcfParser: VCF +}) { + try { + const session = getSession(model) + const { pluginManager } = getEnv(model) + const { assemblyName } = model + if (!assemblyName) { + throw new Error('assemblyName not set') + } + const viewType = pluginManager.getViewType('BreakpointSplitView') + const feat = new VcfFeature({ + id: row.id as string, + // eslint-disable-next-line no-underscore-dangle + variant: vcfParser.parseLine(row.___lineData as string), + parser: vcfParser, + }) + // @ts-expect-error + const snap = await viewType.snapshotFromBreakendFeature( + feat, + assemblyName, + session, + ) + const v = getParent<{ width: number }>(model) + snap.views[0].offsetPx -= v.width / 2 + 100 + snap.views[1].offsetPx -= v.width / 2 + 100 + + session.addView('BreakpointSplitView', snap) + } catch (e) { + console.error(e) + getSession(model).notify(`${e}`, 'error') + } +} + +function getBreakpoints(feature: Feature) { + const alt = feature.get('ALT')?.[0] + + const bnd = alt ? parseBreakend(alt) : undefined + let endPos + let mateRefName: string | undefined + + // a VCF breakend feature + if (alt === '') { + const INFO = feature.get('INFO') + endPos = INFO.END[0] - 1 + mateRefName = INFO.CHR2[0] + } else if (bnd?.MatePosition) { + const matePosition = bnd.MatePosition.split(':') + endPos = +matePosition[1] - 1 + mateRefName = matePosition[0] + } else if (feature.get('mate')) { + const mate = feature.get('mate') + mateRefName = mate.refName + endPos = mate.start + } + + return [ + { + refName: feature.get('refName'), + start: feature.get('start') - 1000, + end: feature.get('end') + 1000, + }, + { + refName: mateRefName!, + start: endPos - 1000, + end: endPos + 1000, + }, + ] as const +} +export async function launchLinearGenomeViewWithEndFocus({ + model, + row, +}: { + model: SpreadsheetModel + row: Record +}) { + try { + const { feature } = row + const [s1, s2] = getBreakpoints(feature as Feature) + await locationLinkClick( + model, + `${assembleLocString(s1)} ${assembleLocString(s2)}`, + ) + } catch (e) { + console.error(e) + getSession(model).notify(`${e}`, 'error') + } +} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/index.ts b/plugins/spreadsheet-view/src/SpreadsheetView/index.ts index 9679e550b9..583c766e25 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/index.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/index.ts @@ -1,10 +1,12 @@ import { lazy } from 'react' import { ViewType } from '@jbrowse/core/pluggableElementTypes' import PluginManager from '@jbrowse/core/PluginManager' -import stateModel from './models/SpreadsheetView' +// locals +import stateModelFactory from './models/SpreadsheetView' export default function SpreadsheetViewF(pluginManager: PluginManager) { pluginManager.addViewType(() => { + const stateModel = stateModelFactory() return new ViewType({ name: 'SpreadsheetView', displayName: 'Spreadsheet view', diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts deleted file mode 100644 index c2ee0bbe40..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts +++ /dev/null @@ -1,21 +0,0 @@ -import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType' -import { FilterModelType as NumberFilterModel } from './Number' -import { types } from 'mobx-state-tree' - -const FilterModelType = types.compose( - NumberFilterModel, - types.model({ - type: types.literal('LocEnd'), - }), -) - -const LocEnd = MakeSpreadsheetColumnType('LocEnd', { - categoryName: 'Location', - displayName: 'End', - compare(cellA: { text: string }, cellB: { text: string }) { - return parseFloat(cellA.text) - parseFloat(cellB.text) - }, - FilterModelType, -}) - -export default LocEnd diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts deleted file mode 100644 index a9e57037e5..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts +++ /dev/null @@ -1,21 +0,0 @@ -import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType' -import { FilterModelType as NumberFilterModel } from './Text' -import { types } from 'mobx-state-tree' - -const FilterModelType = types.compose( - NumberFilterModel, - types.model({ - type: types.literal('LocRef'), - }), -) - -const LocRef = MakeSpreadsheetColumnType('LocRef', { - categoryName: 'Location', - displayName: 'Reference seq', - compare(cellA: { text: string }, cellB: { text: string }) { - return cellA.text.localeCompare(cellB.text) - }, - FilterModelType, -}) - -export default LocRef diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts deleted file mode 100644 index ae204f57a7..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts +++ /dev/null @@ -1,21 +0,0 @@ -import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType' -import { types } from 'mobx-state-tree' -import { FilterModelType as NumberFilterModel } from './Number' - -const FilterModelType = types.compose( - NumberFilterModel, - types.model({ - type: types.literal('LocStart'), - }), -) - -const LocStart = MakeSpreadsheetColumnType('LocStart', { - categoryName: 'Location', - displayName: 'Start', - compare(cellA: { text: string }, cellB: { text: string }) { - return parseFloat(cellA.text) - parseFloat(cellB.text) - }, - FilterModelType, -}) - -export default LocStart diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx deleted file mode 100644 index 77d4783ee3..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx +++ /dev/null @@ -1,328 +0,0 @@ -import React from 'react' -import { - IconButton, - TextField, - MenuItem, - InputAdornment, - Select, -} from '@mui/material' -import { makeStyles } from 'tss-react/mui' -import { observer } from 'mobx-react' -import { types, getParent, getPropertyMembers } from 'mobx-state-tree' - -// jbrowse imports -import { - getPropertyType, - getEnumerationValues, - getSubType, -} from '@jbrowse/core/util/mst-reflection' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' -import { - doesIntersect2, - isContainedWithin, - compareLocs, - getSession, - parseLocString, -} from '@jbrowse/core/util' - -// icons -import ClearIcon from '@mui/icons-material/Clear' - -// locals -import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType' - -type LGV = LinearGenomeViewModel - -const useStyles = makeStyles()({ - textFilterControlAdornment: { marginRight: '-18px' }, - textFilterControl: { - '& .MuiInput-formControl': { - marginTop: 8, - }, - '& .MuiInputLabel-formControl': { - top: '-7px', - '&.MuiInputLabel-shrink': { - top: '-3px', - }, - }, - }, -}) - -// React component for the column filter control -const FilterReactComponent = observer(function ({ - filterModel, -}: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - filterModel: any -}) { - const { classes } = useStyles() - const operationChoices = getEnumerationValues( - getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')), - ) - return ( - <> - {' '} - filterModel.setLocString(evt.target.value)} - className={classes.textFilterControl} - InputProps={{ - endAdornment: ( - - filterModel.setLocString('')} - > - - - - ), - }} - /> - - ) -}) - -const OPERATIONS = [ - 'overlaps with', - 'contained within', - 'fully contains', - 'does not overlap', - 'not contained within', - 'does not contain', -] - -interface Loc { - start: number - end: number - refName: string -} - -// NOTE: assembly names, if present, are ignored in all of these predicates -const OPERATION_PREDICATES = { - 'overlaps with': (cellLocation, specifiedLocation) => { - return ( - cellLocation.refName === specifiedLocation.refName && - doesIntersect2( - cellLocation.start, - cellLocation.end, - specifiedLocation.start, - specifiedLocation.end, - ) - ) - }, - 'contained within': (cellLocation, specifiedLocation) => { - return ( - cellLocation.refName === specifiedLocation.refName && - isContainedWithin( - cellLocation.start, - cellLocation.end, - specifiedLocation.start, - specifiedLocation.end, - ) - ) - }, - 'fully contains': (cellLocation, specifiedLocation) => { - return ( - cellLocation.refName === specifiedLocation.refName && - isContainedWithin( - specifiedLocation.start, - specifiedLocation.end, - cellLocation.start, - cellLocation.end, - ) - ) - }, -} as Record boolean> - -OPERATION_PREDICATES['does not overlap'] = ( - cellLocation, - specifiedLocation, -) => { - return !OPERATION_PREDICATES['overlaps with'](cellLocation, specifiedLocation) -} -OPERATION_PREDICATES['not contained within'] = ( - cellLocation, - specifiedLocation, -) => { - return !OPERATION_PREDICATES['contained within']( - cellLocation, - specifiedLocation, - ) -} -OPERATION_PREDICATES['does not contain'] = ( - cellLocation, - specifiedLocation, -) => { - return !OPERATION_PREDICATES['fully contains']( - cellLocation, - specifiedLocation, - ) -} - -// MST model for the column filter control -const FilterModelType = types - .model('ColumnLocStringFilter', { - type: types.literal('LocString'), - columnNumber: types.integer, - locString: '', - operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]), - }) - .views(self => ({ - get locStringIsInvalid() { - if (self.locString) { - const parsed = this.parsedLocString - return ( - !parsed || - parsed.refName === '' || - typeof parsed.start !== 'number' || - typeof parsed.end !== 'number' || - parsed.start > parsed.end - ) - } - return false - }, - get parsedLocString() { - const session = getSession(self) - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const model = getParent(self, 3).spreadsheet - const { assemblyName } = model - try { - return parseLocString(self.locString, refName => - session.assemblyManager.isValidRefName(refName, assemblyName), - ) - } catch (e) { - return undefined - } - }, - })) - .views(self => ({ - // returns a function that tests the given row - get predicate() { - const { - locString, - locStringIsInvalid, - parsedLocString, - operation, - columnNumber, - } = self // avoid closing over self - if (!locString || locStringIsInvalid || !parsedLocString) { - return function alwaysTrue() { - return true - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return function stringPredicate(_sheet: any, row: any) { - const { cellsWithDerived: cells } = row - const cell = cells[columnNumber] - - if (!cell?.text || !cell.extendedData) { - return false - } - const parsedCellText = cell.extendedData - if (!parsedCellText.refName) { - return false - } - - const predicate = OPERATION_PREDICATES[operation] - if (!predicate) { - throw new Error(`"${operation}" not implemented in location filter`) - } - - return predicate(parsedCellText, parsedLocString as Loc) - } - }, - })) - .actions(self => ({ - setLocString(s: string) { - self.locString = s - }, - setOperation(op: string) { - self.operation = op - }, - })) - .volatile(() => ({ ReactComponent: FilterReactComponent })) - -// opens a new LGV at the location described in the locString in the cell text - -async function locationLinkClick( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - spreadsheet: any, - _columnNumber: number, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - cell: any, -) { - const session = getSession(spreadsheet) - const { assemblyName } = spreadsheet - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { id } = getParent(spreadsheet) - - const newViewId = `${id}_${assemblyName}` - let view = session.views.find(v => v.id === newViewId) as LGV - if (!view) { - view = session.addView('LinearGenomeView', { - id: newViewId, - }) as LGV - } - await view.navToLocString(cell.text, assemblyName) -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type DataCell = any - -const DataCellReactComponent = observer(function ({ - cell, - columnNumber, - spreadsheet, -}: DataCell) { - return ( - { - evt.preventDefault() - const session = getSession(spreadsheet) - try { - await locationLinkClick(spreadsheet, columnNumber, cell) - } catch (e) { - console.error(e) - session.notifyError(`${e}`, e) - } - }} - title="open a new linear genome view here" - href="#link" - > - {cell.text} - - ) -}) - -const LocStringColumnType = MakeSpreadsheetColumnType('LocString', { - categoryName: 'Location', - displayName: 'Full location', - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - compare(cellA: { extendedData: any }, cellB: { extendedData: any }) { - return compareLocs(cellA.extendedData, cellB.extendedData) - }, - FilterModelType, - DataCellReactComponent, -}) - -export default LocStringColumnType diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx deleted file mode 100644 index 6a50f04914..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React from 'react' -import { types } from 'mobx-state-tree' - -/** utility function for assembling the MST model of a column data type */ -export default function MakeSpreadsheetColumnType( - name: string, - { - DataCellReactComponent = null, - FilterModelType = null, - compare, - displayName = undefined, - categoryName = undefined, - }: { - compare?: any - DataCellReactComponent?: React.FC | null - FilterModelType?: any - displayName?: string - categoryName?: string - }, -) { - return types - .model(`ColumnDataType${name}`, { - type: types.literal(name), - }) - .volatile(() => ({ - DataCellReactComponent, - FilterModelType: FilterModelType, - displayName: displayName || name, - categoryName, - })) - .views(() => ({ - compare, - get hasFilter() { - return !!FilterModelType - }, - })) -} diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx deleted file mode 100644 index b4a8c44c29..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import React from 'react' -import { types } from 'mobx-state-tree' -import { observer } from 'mobx-react' -import { MenuItem, Select, TextField } from '@mui/material' -import { makeStyles } from 'tss-react/mui' -import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType' - -const OPERATIONS = [ - 'equals', - 'greater than', - 'less than', - 'between', - 'not between', -] - -// NOTE: assembly names, if present, are ignored in all of these predicates -const OPERATION_PREDICATES = { - equals: (numberInCell, firstNumber) => { - return numberInCell === firstNumber - }, - 'greater than': (numberInCell, firstNumber) => { - return numberInCell > firstNumber - }, - 'less than': (numberInCell, firstNumber) => { - return numberInCell < firstNumber - }, - between: (numberInCell, firstNumber, secondNumber) => { - return ( - numberInCell > firstNumber && - secondNumber !== undefined && - numberInCell < secondNumber - ) - }, -} as Record boolean> - -OPERATION_PREDICATES['not between'] = ( - numberInCell, - firstNumber, - secondNumber, -) => { - return !OPERATION_PREDICATES.between(numberInCell, firstNumber, secondNumber) -} - -const useStyles = makeStyles()({ - textFilterControlAdornment: { marginRight: '-18px' }, - textFilterControl: { - '& .MuiInput-formControl': { - marginTop: 8, - }, - '& .MuiInputLabel-formControl': { - top: '-7px', - '&.MuiInputLabel-shrink': { - top: '-3px', - }, - }, - }, -}) - -// React component for the column filter control -const FilterReactComponent = observer( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ({ filterModel }: { filterModel: any }) => { - const { classes } = useStyles() - - const operationChoices = OPERATIONS - - return ( - <> - {' '} - { - filterModel.setFirstNumber(parseFloat(evt.target.value)) - }} - className={classes.textFilterControl} - /> - {filterModel.operation !== 'between' && - filterModel.operation !== 'not between' ? null : ( - <> - {' and '} - - filterModel.setSecondNumber(parseFloat(evt.target.value)) - } - className={classes.textFilterControl} - /> - - )} - - ) - }, -) - -// MST model for the column filter control -const FilterModelType = types - .model('ColumnNumberFilter', { - type: types.literal('Number'), - columnNumber: types.integer, - firstNumber: types.maybe(types.number), - secondNumber: types.maybe(types.number), - operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]), - }) - .views(self => ({ - // returns a function that tests the given row - get predicate() { - if (typeof self.firstNumber !== 'number') { - return function alwaysTrue() { - return true - } - } - - const { firstNumber, secondNumber, operation, columnNumber } = self // avoid closing over self - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return function stringPredicate(_sheet: any, row: any) { - const { cellsWithDerived } = row - const cell = cellsWithDerived[columnNumber] - - if (!cell?.text) { - return false - } - - const parsedCellText = parseFloat(cell.text) - if (typeof parsedCellText !== 'number') { - return false - } - - const predicate = OPERATION_PREDICATES[operation] - if (!predicate) { - throw new Error(`"${operation}" not implemented in location filter`) - } - - return predicate(parsedCellText, firstNumber, secondNumber) - } - }, - })) - .actions(self => ({ - setFirstNumber(n: number) { - self.firstNumber = - Number.isNaN(n) || typeof n !== 'number' ? undefined : n - }, - setSecondNumber(n: number) { - self.secondNumber = - Number.isNaN(n) || typeof n !== 'number' ? undefined : n - }, - setOperation(op: string) { - self.operation = op - }, - })) - .volatile(() => ({ ReactComponent: FilterReactComponent })) - -const NumberColumn = MakeSpreadsheetColumnType('Number', { - compare(cellA: { text: string }, cellB: { text: string }) { - return parseFloat(cellA.text) - parseFloat(cellB.text) - }, - FilterModelType, -}) - -export { NumberColumn, FilterModelType } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx deleted file mode 100644 index 4c704ca138..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import React from 'react' -import { - IconButton, - TextField, - MenuItem, - InputAdornment, - Select, -} from '@mui/material' -import { makeStyles } from 'tss-react/mui' -import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType' -import { types, getPropertyMembers } from 'mobx-state-tree' -import { observer } from 'mobx-react' -import { - getPropertyType, - getEnumerationValues, - getSubType, -} from '@jbrowse/core/util/mst-reflection' - -// icons -import ClearIcon from '@mui/icons-material/Clear' - -const OPERATIONS = [ - 'equals', - 'contains', - 'does not contain', - 'does not equal', - 'starts with', - 'ends with', -] - -// NOTE: assembly names, if present, are ignored in all of these predicates -const OPERATION_PREDICATES = { - contains: (textInCell, stringToFind) => { - return textInCell.toLowerCase().includes(stringToFind) - }, - equals: (textInCell, stringToFind) => { - return textInCell.toLowerCase() === stringToFind - }, - 'starts with': (textInCell, stringToFind) => { - return textInCell.toLowerCase().startsWith(stringToFind) - }, - 'ends with': (textInCell, stringToFind) => { - const index = textInCell.toLowerCase().indexOf(stringToFind) - if (index === -1) { - return false - } - return index === textInCell.length - stringToFind.length - }, -} as Record boolean> - -OPERATION_PREDICATES['does not contain'] = (textInCell, stringToFind) => { - return !OPERATION_PREDICATES.contains(textInCell, stringToFind) -} -OPERATION_PREDICATES['does not equal'] = (textInCell, stringToFind) => { - return !OPERATION_PREDICATES.equals(textInCell, stringToFind) -} - -const useStyles = makeStyles()({ - textFilterControlAdornment: { marginRight: '-18px' }, - textFilterControl: { - margin: 0, - '& .MuiInput-formControl': { - marginTop: 8, - }, - '& .MuiInputLabel-formControl': { - top: '-7px', - '&.MuiInputLabel-shrink': { - top: '-3px', - }, - }, - }, -}) - -// React component for the column filter control -const FilterReactComponent = observer( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ({ filterModel }: { filterModel: any }) => { - const { classes } = useStyles() - const operationChoices = getEnumerationValues( - getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')), - ) - return ( - <> - {' '} - filterModel.setString(evt.target.value)} - className={classes.textFilterControl} - InputProps={{ - endAdornment: ( - - filterModel.setString('')} - > - - - - ), - }} - /> - - ) - }, -) - -// MST model for the column filter control -const ColumnTextFilter = types - .model('ColumnTextFilter', { - type: types.literal('Text'), - columnNumber: types.integer, - stringToFind: '', - operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]), - }) - .views(self => ({ - // returns a function that tests the given row - get predicate() { - const { stringToFind, columnNumber, operation } = self // avoid closing over self - if (!stringToFind) { - return function alwaysTrue() { - return true - } - } - const s = stringToFind.toLowerCase() // case insensitive match - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return function stringPredicate(_sheet: any, row: any) { - const { cellsWithDerived } = row - const cell = cellsWithDerived[columnNumber] - if (!cell?.text) { - return false - } - const predicate = OPERATION_PREDICATES[operation] - if (!predicate) { - throw new Error(`"${operation}" not implemented in location filter`) - } - return predicate(cell.text, s) - } - }, - })) - .actions(self => ({ - setString(s: string) { - self.stringToFind = s - }, - setOperation(op: string) { - self.operation = op - }, - })) - .volatile(() => ({ ReactComponent: FilterReactComponent })) - -const TextColumnType = MakeSpreadsheetColumnType('Text', { - compare(cellA: { text: string }, cellB: { text: string }) { - return cellA.text.localeCompare(cellB.text) - }, - FilterModelType: ColumnTextFilter, -}) - -export { TextColumnType as TextColumn, ColumnTextFilter as FilterModelType } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/index.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/index.ts deleted file mode 100644 index 02eb921348..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import LocString from './LocString' -import LocRef from './LocRef' -import LocStart from './LocStart' -import LocEnd from './LocEnd' -import { NumberColumn as Number } from './Number' -import { TextColumn as Text } from './Text' -import { types, IAnyModelType } from 'mobx-state-tree' - -const ColumnTypes = { - Number, - Text, - LocString, - LocRef, - LocStart, - LocEnd, -} - -const allColumnTypes = Object.values(ColumnTypes) -const AnyColumnType = types.union(...allColumnTypes) -const AnyFilterModelType = types.union( - ...allColumnTypes - .map(columnType => { - // just instantiate the blank types to get their filter model types - const { FilterModelType } = columnType.create({ - // @ts-expect-error - type: columnType.properties.type.value, - }) - return FilterModelType as unknown as IAnyModelType - }) - // some column types might not have filter machinery, filter those out - .filter(t => !!t), -) - -export { ColumnTypes, AnyColumnType, AnyFilterModelType } diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/FilterControls.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/FilterControls.ts deleted file mode 100644 index 8438a15246..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/FilterControls.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { types, getParent, SnapshotIn } from 'mobx-state-tree' -import { AnyFilterModelType as AnyColumnFilter } from './ColumnDataTypes' - -// filter that finds a simple string in any of the cells of a row -const RowFullTextFilter = types - .model('RowFullTextFilter', { - type: types.literal('RowFullText'), - stringToFind: '', - }) - .views(self => ({ - // returns a function that tests the given row - get predicate() { - let s = self.stringToFind // avoid closing over self - if (!s) { - return function alwaysTrue() { - return true - } - } - s = s.toLowerCase() - return function stringPredicate( - _sheet: unknown, - row: { cellsWithDerived: { text: string }[] }, - ) { - const { cellsWithDerived } = row - for (const cell of cellsWithDerived) { - // note: case insensitive - if (cell.text?.toLowerCase().includes(s)) { - return true - } - } - return false - } - }, - })) - .actions(self => ({ - setString(s: string) { - self.stringToFind = s - }, - clear() { - self.stringToFind = '' - }, - })) - -const model = types - .model('SpreadsheetFilterControls', { - rowFullText: types.optional( - RowFullTextFilter, - () => - ({ - type: 'RowFullText', - stringToFind: '', - }) as SnapshotIn, - ), - columnFilters: types.array(AnyColumnFilter), - }) - .views(self => ({ - get filters() { - return [self.rowFullText, ...self.columnFilters].filter(f => !!f) - }, - setRowFullTextFilter(stringToFind: string) { - // @ts-expect-error - self.rowFullText = { - type: 'RowFullText', - stringToFind, - } - }, - rowPassesFilters(sheet: unknown, row: unknown) { - for (const filter of this.filters) { - if (!filter.predicate(sheet, row)) { - return false - } - } - return true - }, - })) - .actions(self => ({ - addBlankColumnFilter(columnNumber: number) { - const { dataType } = - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getParent(self).spreadsheet.columns[columnNumber] - self.columnFilters.push({ - type: dataType.type, - columnNumber, - }) - }, - removeColumnFilter(filter: typeof AnyColumnFilter) { - return self.columnFilters.remove(filter) - }, - clearAllFilters() { - self.columnFilters.clear() - self.rowFullText.clear() - }, - })) - -export default model diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts index a055935e93..78e8fad130 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts @@ -1,203 +1,184 @@ -import { types, getParent, Instance } from 'mobx-state-tree' +import { types, getParent, addDisposer, Instance } from 'mobx-state-tree' import { openLocation } from '@jbrowse/core/util/io' -import { getSession, getEnv } from '@jbrowse/core/util' +import { + getSession, + getEnv, + FileLocation as FileLocationType, +} from '@jbrowse/core/util' +import { GenericFilehandle } from 'generic-filehandle' -// 30MB -const IMPORT_SIZE_LIMIT = 30_000_000 +// locals +import { SpreadsheetViewStateModel } from './SpreadsheetView' +import { autorun } from 'mobx' +import { getFileType, getFilename } from '../components/util' -const fileTypes = ['CSV', 'TSV', 'VCF', 'BED', 'BEDPE', 'STAR-Fusion'] +const IMPORT_SIZE_LIMIT = 40_000_000 + +const fileTypes = ['VCF', 'BED', 'BEDPE', 'STAR-Fusion'] const fileTypeParsers = { - CSV: () => - import('../importAdapters/ImportUtils').then(r => r.parseCsvBuffer), - TSV: () => - import('../importAdapters/ImportUtils').then(r => r.parseTsvBuffer), VCF: () => import('../importAdapters/VcfImport').then(r => r.parseVcfBuffer), BED: () => import('../importAdapters/BedImport').then(r => r.parseBedBuffer), BEDPE: () => - import('../importAdapters/BedImport').then(r => r.parseBedPEBuffer), + import('../importAdapters/BedpeImport').then(r => r.parseBedPEBuffer), 'STAR-Fusion': () => import('../importAdapters/STARFusionImport').then( r => r.parseSTARFusionBuffer, ), } -// regexp used to guess the type of a file or URL from its file extension -const fileTypesRegexp = new RegExp(`\\.(${fileTypes.join('|')})(\\.gz)?$`, 'i') +async function maybeStat(f: GenericFilehandle) { + let stat + try { + stat = await f.stat() + } catch (e) { + // not required for stat to succeed to proceed, but it is helpful + console.warn(e) + } + return stat +} /** * #stateModel SpreadsheetImportWizard - * #category view */ -function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars - -const ImportWizard = types - .model('SpreadsheetImportWizard', { - /** - * #property - */ - fileType: types.optional(types.enumeration(fileTypes), 'CSV'), - /** - * #property - */ - hasColumnNameLine: true, - /** - * #property - */ - columnNameLineNumber: 1, - /** - * #property - */ - selectedAssemblyName: types.maybe(types.string), - }) - .volatile(() => ({ - fileTypes, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - fileSource: undefined as any, - error: undefined as unknown, - loading: false, - })) - .views(self => ({ - get isReadyToOpen() { - return ( - !self.error && - self.fileSource && - (self.fileSource.blobId || - self.fileSource.localPath || - self.fileSource.uri) - ) - }, - get canCancel() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return getParent(self).readyToDisplay - }, - - get fileName() { - return ( - self.fileSource.uri || - self.fileSource.localPath || - (self.fileSource.blobId && self.fileSource.name) - ) - }, - - get requiresUnzip() { - return this.fileName.endsWith('gz') - }, - - isValidRefName(refName: string, assemblyName?: string) { - const { assemblyManager } = getSession(self) - if (!assemblyName) { - return false - } - return assemblyManager.isValidRefName(refName, assemblyName) - }, - })) - .actions(self => ({ - setSelectedAssemblyName(s: string) { - self.selectedAssemblyName = s - }, - setFileSource(newSource: unknown) { - self.fileSource = newSource - self.error = undefined - - if (self.fileSource) { - // try to autodetect the file type, ignore errors - const name = self.fileName - - if (name) { - const firstMatch = fileTypesRegexp.exec(name)?.[1] - if (firstMatch) { - self.fileType = - firstMatch === 'tsv' && name.includes('star-fusion') - ? 'STAR-Fusion' - : firstMatch.toUpperCase() - } +function stateModelFactory() { + return types + .model('SpreadsheetImportWizard', { + /** + * #property + */ + fileTypeOverride: types.maybe(types.string), + /** + * #property + */ + selectedAssemblyName: types.maybe(types.string), + /** + * #property + */ + spreadsheetFilehandle: types.frozen(), + }) + .volatile(() => ({ + fileTypes, + error: undefined as unknown, + loading: false, + })) + .views(self => ({ + /** + * #getter + */ + get fileType() { + if (self.fileTypeOverride) { + return self.fileTypeOverride + } else if (self.spreadsheetFilehandle) { + return getFileType(self.spreadsheetFilehandle) + } else { + return 'VCF' } - } - }, - - toggleHasColumnNameLine() { - self.hasColumnNameLine = !self.hasColumnNameLine - }, - - setColumnNameLineNumber(newnumber: number) { - if (newnumber > 0) { - self.columnNameLineNumber = newnumber - } - }, - - setFileType(typeName: string) { - self.fileType = typeName - }, - - setError(error: unknown) { - console.error(error) - self.loading = false - self.error = error - }, - - setLoaded() { - self.loading = false - self.error = undefined - }, - - cancelButton() { - self.error = undefined - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getParent(self).setDisplayMode() - }, - - // fetch and parse the file, make a new Spreadsheet model for it, - // then set the parent to display it - async import(assemblyName: string) { - if (!self.fileSource) { - return - } - - if (self.loading) { - throw new Error('Cannot import, load already in progress') - } - - self.selectedAssemblyName = assemblyName - self.loading = true - const type = self.fileType as keyof typeof fileTypeParsers - const typeParser = await fileTypeParsers[type]() - if (!typeParser) { - throw new Error(`cannot open files of type '${self.fileType}'`) - } - - const { unzip } = await import('@gmod/bgzf-filehandle') - const { pluginManager } = getEnv(self) - const filehandle = openLocation(self.fileSource, pluginManager) - try { - const stat = await filehandle.stat() - if (stat.size > IMPORT_SIZE_LIMIT) { - throw new Error( - `File is too big. Tabular files are limited to at most ${( - IMPORT_SIZE_LIMIT / 1000 - ).toLocaleString()}kb.`, - ) - } - } catch (e) { - // not required for stat to succeed to proceed, but it is helpful - console.warn(e) - } - - try { - await filehandle - .readFile() - .then(buffer => (self.requiresUnzip ? unzip(buffer) : buffer)) - .then(buffer => typeParser(buffer, self)) - .then(spreadsheet => { - this.setLoaded() - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getParent(self).displaySpreadsheet(spreadsheet) - }) - } catch (e) { - this.setError(e) - } - }, - })) + }, + + /** + * #getter + */ + get fileName(): string | undefined { + return getFilename(self.spreadsheetFilehandle) + }, + /** + * #getter + */ + get requiresUnzip() { + return this.fileName?.endsWith('gz') + }, + /** + * #method + */ + isValidRefName(refName: string, assemblyName?: string) { + const { assemblyManager } = getSession(self) + return assemblyName + ? assemblyManager.isValidRefName(refName, assemblyName) + : false + }, + })) + .actions(self => ({ + /** + * #action + */ + setSelectedAssemblyName(s: string) { + self.selectedAssemblyName = s + }, + /** + * #action + */ + setSpreadsheetFilehandle(newSource?: FileLocationType) { + self.spreadsheetFilehandle = newSource + self.error = undefined + }, + /** + * #action + */ + setFileType(typeName: string) { + self.fileTypeOverride = typeName + }, + /** + * #action + */ + setError(error: unknown) { + self.error = error + }, + /** + * #action + */ + setLoading(arg: boolean) { + self.loading = arg + }, + afterAttach() { + addDisposer( + self, + autorun(async () => { + const { spreadsheetFilehandle } = self + if (!spreadsheetFilehandle) { + return + } + + this.setLoading(true) + const typeParser = + await fileTypeParsers[ + self.fileType as keyof typeof fileTypeParsers + ]() + + if (!typeParser) { + throw new Error(`cannot open files of type '${self.fileType}'`) + } + + const { unzip } = await import('@gmod/bgzf-filehandle') + const { pluginManager } = getEnv(self) + const f = openLocation(spreadsheetFilehandle, pluginManager) + const stat = await maybeStat(f) + try { + if (stat && stat.size > IMPORT_SIZE_LIMIT) { + throw new Error( + `File is too big. Tabular files are limited to at most ${( + IMPORT_SIZE_LIMIT / 1_000_000 + ).toLocaleString()}Mb.`, + ) + } + const buffer = await f.readFile() + const buf2 = self.requiresUnzip ? await unzip(buffer) : buffer + const spreadsheet = await typeParser(buf2) + getParent(self).displaySpreadsheet( + spreadsheet, + self.selectedAssemblyName, + ) + } catch (e) { + console.error(e) + this.setError(e) + } finally { + this.setLoading(false) + } + }), + ) + }, + })) +} -export type ImportWizardStateModel = typeof ImportWizard +export type ImportWizardStateModel = ReturnType export type ImportWizardModel = Instance -export default ImportWizard +export default stateModelFactory diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/Row.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/Row.ts deleted file mode 100644 index 45445bb0e7..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/Row.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { types, getParent } from 'mobx-state-tree' - -const CellModel = types.model('SpreadsheetCell', { - text: types.string, - extendedData: types.maybe(types.frozen()), -}) - -const RowModel = types - .model('SpreadsheetRow', { - id: types.identifier, - cells: types.array(CellModel), - extendedData: types.maybe(types.frozen()), - isSelected: false, - }) - .actions(self => ({ - toggleSelect() { - self.isSelected = !self.isSelected - }, - unSelect() { - self.isSelected = false - }, - select() { - self.isSelected = true - }, - setExtendedData(data: unknown) { - self.extendedData = data - }, - })) - .views(self => ({ - get cellsWithDerived() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { columns } = getParent(self, 3) - let i = 0 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return columns.map((column: { isDerived: boolean; expr: any }) => { - if (column.isDerived) { - return column.expr.evalSync({ - row: self, - }) - } - return self.cells[i++] - }) - }, - })) - -export default RowModel diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.ts deleted file mode 100644 index 40a88a9dd9..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { stringToJexlExpression } from '@jbrowse/core/util/jexlStrings' -import { getSession, getEnv } from '@jbrowse/core/util' -import { autorun } from 'mobx' -import { - addDisposer, - types, - getParent, - SnapshotIn, - Instance, -} from 'mobx-state-tree' - -// locals -import { ColumnTypes, AnyColumnType } from './ColumnDataTypes' -import StaticRowSetModel from './StaticRowSet' -import RowModel from './Row' - -type Row = Instance - -const ColumnDefinition = types - .model('ColumnDefinition', { - name: types.maybe(types.string), - dataType: types.optional(AnyColumnType, () => ({ - type: 'Text', - })), - // set to true if column is derived from other columns - // if the column is derived, each cell will have a - // `derivationFunction` that is called to get its value - isDerived: false, - // if this cell is derived from other cells, execute this function to get - // the value - derivationFunctionText: types.maybe(types.string), - }) - .views(self => ({ - get expr() { - if (self.isDerived) { - // compile this as a jexl expression - return stringToJexlExpression( - String(self.derivationFunctionText), - getEnv(self).pluginManager.jexl, - ) - } - return undefined - }, - })) - -type RowMenuPosition = { anchorEl: Element; rowNumber: string } | null - -/** - * #stateModel SpreadsheetViewSpreadsheet - * #category view - */ -function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars - -const Spreadsheet = types - .model('Spreadsheet', { - /** - * #property - */ - rowSet: types.optional(StaticRowSetModel, () => StaticRowSetModel.create()), - /** - * #property - */ - columns: types.array(ColumnDefinition), - /** - * #property - */ - columnDisplayOrder: types.array(types.number), - /** - * #property - */ - hasColumnNames: false, - /** - * #property - */ - sortColumns: types.array( - types - .model('SortColumns', { - columnNumber: types.number, - descending: false, - }) - .actions(self => ({ - switchDirection() { - self.descending = !self.descending - }, - })), - ), - - assemblyName: types.maybe(types.string), - }) - .volatile(() => ({ - defaultDataType: ColumnTypes.Text, - rowMenuPosition: null as RowMenuPosition, - isLoaded: false, - })) - .views(self => ({ - /** - * #getter - */ - get initialized() { - const session = getSession(self) - const name = self.assemblyName - return name ? session.assemblyManager.get(name)?.initialized : false - }, - /** - * #getter - */ - get hideRowSelection() { - // just delegates to parent - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return getParent(self).hideRowSelection - }, - - /** - * #getter - * list of data type names to be made available in the column - * dropdown menu - */ - get dataTypeChoices() { - const typeNames = Object.keys(ColumnTypes) as (keyof typeof ColumnTypes)[] - return typeNames.map(typeName => { - const dataType = ColumnTypes[typeName].create({ type: typeName }) - const { displayName, categoryName } = dataType - return { typeName, displayName, categoryName } - }) - }, - - /** - * #method - */ - rowSortingComparisonFunction(rowA: Row, rowB: Row) { - for (const { columnNumber, descending } of self.sortColumns) { - const { dataType } = self.columns[columnNumber] - const result = dataType.compare( - rowA.cellsWithDerived[columnNumber], - rowB.cellsWithDerived[columnNumber], - ) - if (result) { - return descending ? -result : result - } - } - return 0 - }, - })) - .actions(self => ({ - afterAttach() { - addDisposer( - self, - autorun(async () => { - const session = getSession(self) - const { assemblyManager } = session - try { - if (self.assemblyName) { - await assemblyManager.waitForAssembly(self.assemblyName) - this.setLoaded(true) - } - } catch (error) { - session.notify( - `failed to load assembly ${self.assemblyName} ${error}`, - 'error', - ) - } - }), - ) - }, - - /** - * #action - */ - setLoaded(flag: boolean) { - self.isLoaded = flag - }, - - /** - * #action - */ - setRowMenuPosition(newPosition: RowMenuPosition) { - self.rowMenuPosition = newPosition - }, - - /** - * #action - */ - setSortColumns(newSort: NonNullable>) { - if (newSort) { - // @ts-expect-error - self.sortColumns = newSort - } - }, - - /** - * #action - */ - setColumnType(columnNumber: number, newTypeName: string) { - self.columns[columnNumber].dataType = { type: newTypeName } - }, - - /** - * #action - */ - unselectAll() { - return self.rowSet.unselectAll() - }, - })) - -export type SpreadsheetStateModel = typeof Spreadsheet -export type SpreadsheetModel = Instance - -export default Spreadsheet diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.tsx new file mode 100644 index 0000000000..637beb70a3 --- /dev/null +++ b/plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.tsx @@ -0,0 +1,179 @@ +import React from 'react' +import { + Feature, + assembleLocString, + measureGridWidth, +} from '@jbrowse/core/util' +import { autorun } from 'mobx' +import { addDisposer, types, Instance } from 'mobx-state-tree' +import { FileLocation } from '@jbrowse/core/util/types/mst' + +// locals +import FeatureMenu from '../importAdapters/components/FeatureMenu' +import { GridColDef } from '@mui/x-data-grid' +import LocString from '../importAdapters/components/LocString' + +interface Row { + feature: Feature + [key: string]: unknown +} + +interface ComponentRecord { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Component: React.FC + props: Record +} + +export interface SpreadsheetData { + rows: Row[] + columns: string[] + ColumnComponentMap?: Record +} + +/** + * #stateModel SpreadsheetViewSpreadsheet + * #category view + */ +function stateModelFactory() { + return types + .model('Spreadsheet', { + /** + * #property + */ + assemblyName: types.maybe(types.string), + }) + .volatile(() => ({ + data: undefined as SpreadsheetData | undefined, + visibleColumns: {} as Record, + columnWidths: {} as Record, + })) + .views(self => ({ + /** + * #getter + */ + get initialized() { + return !!self.data + }, + })) + .actions(self => ({ + /** + * #action + */ + setVisibleColumns(args: Record) { + self.visibleColumns = args + }, + /** + * #action + */ + setData(data?: SpreadsheetData, assemblyName?: string) { + self.data = data + self.assemblyName = assemblyName + }, + /** + * #action + */ + setColumnWidths(w: Record) { + self.columnWidths = w + }, + })) + .views(self => ({ + /** + * #getter + */ + get columns(): GridColDef[] { + const { columnWidths } = self + return this.columnsNoWidth.map(c => ({ + ...c, + width: columnWidths[c.field], + })) + }, + + get columnsNoWidth(): GridColDef[] { + const { data } = self + return [ + { + field: 'menu', + renderCell: arg => ( + + ), + }, + { + field: 'loc', + renderCell: arg => , + }, + ...(data?.columns.map(m => { + const res = data.ColumnComponentMap?.[m] as any + return { + field: m, + renderCell: res, + } + }) || []), + ] as const + }, + /** + * #getter + */ + get rows() { + return (self.data?.rows.map(r => ({ + menu: 'a', + loc: assembleLocString({ + refName: r.feature.get('refName'), + start: r.feature.get('start'), + end: r.feature.get('end'), + }), + ...r, + })) || []) as Record[] + }, + /** + * #getter + */ + get widthList() { + return Object.values(self.columnWidths).map(f => f ?? 100) + }, + /** + * #getter + */ + get features() { + return self.data?.rows.map(r => r.feature) + }, + })) + .actions(self => ({ + afterAttach() { + addDisposer( + self, + autorun(() => { + const { data } = self + self.setVisibleColumns({ + loc: true, + menu: true, + ...Object.fromEntries(data?.columns.map(c => [c, true]) || []), + }) + }), + ) + addDisposer( + self, + autorun(() => { + self.setColumnWidths( + Object.fromEntries( + self.columnsNoWidth + .map(f => f.field) + .filter(f => self.visibleColumns[f]) + .map(e => [ + e, + measureGridWidth( + self.rows.map(r => r[e]), + { minWidth: 20 }, + ), + ]), + ), + ) + }), + ) + }, + })) +} + +export type SpreadsheetStateModel = ReturnType +export type SpreadsheetModel = Instance + +export default stateModelFactory diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.test.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.test.ts deleted file mode 100644 index 6b5b4b395a..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import SpreadsheetView from './SpreadsheetView' - -describe('Spreadsheet View mst model', () => { - it('can instantiate with empty args', () => { - const view = SpreadsheetView.create({ type: 'SpreadsheetView' }) - expect(view).toBeTruthy() - }) -}) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.ts index 510272c4b0..49f7450630 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.ts @@ -1,243 +1,157 @@ -import { - types, - getParent, - getEnv, - cast, - SnapshotIn, - Instance, -} from 'mobx-state-tree' +import { types, getParent, Instance } from 'mobx-state-tree' import { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models' -import { readConfObject } from '@jbrowse/core/configuration' -import { MenuItem } from '@jbrowse/core/ui' import { getSession } from '@jbrowse/core/util' // icons -import DoneIcon from '@mui/icons-material/Done' import FolderOpenIcon from '@mui/icons-material/FolderOpen' -import SpreadsheetModel from './Spreadsheet' -import ImportWizardModel from './ImportWizard' -import FilterControlsModel from './FilterControls' +// locals +import spreadsheetModelFactory, { SpreadsheetData } from './Spreadsheet' +import importWizardFactory from './ImportWizard' -type Spreadsheet = Instance - -export type MenuItemWithDisabledCallback = MenuItem & { - disabled?: - | boolean - | (( - viewModel: unknown, - spreadsheetModel: Spreadsheet, - rowNumber: number, - row: Spreadsheet['rowSet']['rows'][0], - ) => boolean) -} - -const defaultRowMenuItems: MenuItemWithDisabledCallback[] = [ - { - label: 'Toggle select', - icon: DoneIcon, - onClick(_view: unknown, spreadsheet: Spreadsheet) { - const rowNumber = spreadsheet.rowMenuPosition?.rowNumber - if (rowNumber !== undefined) { - spreadsheet.rowSet.rows[+rowNumber - 1].toggleSelect() - } - }, - }, -] - -const minHeight = 40 const defaultHeight = 440 /** * #stateModel SpreadsheetView * #category view + * + * extends + * - [BaseViewModel](../baseviewmodel) */ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars -const model = types - .model('SpreadsheetView', { - /** - * #property - */ - type: types.literal('SpreadsheetView'), - /** - * #property - */ - offsetPx: 0, - /** - * #property - */ - height: types.optional( - types.refinement( - 'SpreadsheetViewHeight', - types.number, - n => n >= minHeight, - ), - defaultHeight, - ), - /** - * #property - */ - hideVerticalResizeHandle: false, - /** - * #property - */ - hideFilterControls: false, - /** - * #property - */ - filterControls: types.optional(FilterControlsModel, () => - FilterControlsModel.create({}), - ), - /** - * #property - * switch specifying whether we are showing the import wizard or the - * spreadsheet in our viewing area - */ - mode: types.optional( - types.enumeration('SpreadsheetViewMode', ['import', 'display']), - 'import', - ), - /** - * #property - */ - importWizard: types.optional(ImportWizardModel, () => - ImportWizardModel.create(), - ), - /** - * #property - */ - spreadsheet: types.maybe(SpreadsheetModel), - }) - .volatile(() => ({ - width: 400, - rowMenuItems: defaultRowMenuItems, - })) - .views(self => ({ - /** - * #getter - */ - get readyToDisplay() { - return !!self.spreadsheet && self.spreadsheet.isLoaded - }, - /** - * #getter - */ - get hideRowSelection() { - return !!getEnv(self).hideRowSelection - }, - /** - * #getter - */ - get outputRows() { - if (self.spreadsheet && self.spreadsheet.rowSet.isLoaded) { - const selected = self.spreadsheet.rowSet.selectedFilteredRows - if (selected.length) { - return selected - } - return self.spreadsheet.rowSet.sortedFilteredRows - } - return undefined - }, - /** - * #getter - */ - get assembly() { - const name = self.spreadsheet?.assemblyName - if (name) { - const assemblies = getSession(self).assemblies - return assemblies?.find(asm => readConfObject(asm, 'name') === name) - } - return undefined - }, - })) - .actions(self => ({ - /** - * #action - */ - setRowMenuItems(newItems: MenuItem[]) { - self.rowMenuItems = newItems - }, - /** - * #action - */ - setWidth(newWidth: number) { - self.width = newWidth - return self.width - }, - /** - * #action - */ - setHeight(newHeight: number) { - self.height = newHeight > minHeight ? newHeight : minHeight - return self.height - }, - /** - * #action - */ - resizeHeight(distance: number) { - const oldHeight = self.height - const newHeight = this.setHeight(self.height + distance) - return newHeight - oldHeight - }, - /** - * #action - */ - resizeWidth(distance: number) { - const oldWidth = self.width - const newWidth = this.setWidth(self.width + distance) - return newWidth - oldWidth - }, +function stateModelFactory() { + const ImportWizard = importWizardFactory() + const SpreadsheetModelType = spreadsheetModelFactory() + return types + .compose( + BaseViewModel, + types.model('SpreadsheetView', { + /** + * #property + */ + type: types.literal('SpreadsheetView'), + /** + * #property + */ + height: types.optional(types.number, defaultHeight), + /** + * #property + */ + hideVerticalResizeHandle: false, + /** + * #property + */ + importWizard: types.optional(ImportWizard, {}), + /** + * #property + */ + spreadsheet: types.optional(SpreadsheetModelType, {}), + }), + ) + .volatile(() => ({ + width: 400, + })) + .views(self => ({ + /** + * #getter + */ + get assemblyName() { + return self.spreadsheet.assemblyName + }, + /** + * #getter + */ + get initialized() { + return self.spreadsheet.initialized + }, + /** + * #getter + */ + get assembly() { + const name = self.spreadsheet.assemblyName + return name ? getSession(self).assemblyManager.get(name) : undefined + }, + /** + * #getter + */ + get features() { + return self.spreadsheet.features + }, + })) + .actions(self => ({ + /** + * #action + */ + setWidth(newWidth: number) { + self.width = newWidth + return self.width + }, + /** + * #action + */ + setHeight(newHeight: number) { + self.height = newHeight + return self.height + }, + /** + * #action + */ + resizeHeight(distance: number) { + const oldHeight = self.height + const newHeight = this.setHeight(self.height + distance) + return newHeight - oldHeight + }, + /** + * #action + */ + resizeWidth(distance: number) { + const oldWidth = self.width + const newWidth = this.setWidth(self.width + distance) + return newWidth - oldWidth + }, + + /** + * #action + * load a new spreadsheet and set our mode to display it + */ + displaySpreadsheet(spreadsheet?: SpreadsheetData, assemblyName?: string) { + self.spreadsheet.setData(spreadsheet, assemblyName) + }, - /** - * #action - * load a new spreadsheet and set our mode to display it - */ - displaySpreadsheet(spreadsheet: SnapshotIn) { - self.filterControls.clearAllFilters() - self.spreadsheet = cast(spreadsheet) - self.mode = 'display' - }, - /** - * #action - */ - setImportMode() { - self.mode = 'import' - }, - /** - * #action - */ - setDisplayMode() { - if (self.readyToDisplay) { - self.mode = 'display' - } - }, - /** - * #action - */ - closeView() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getParent(self, 2).removeView(self) - }, - })) - .views(self => ({ - /** - * #method - */ - menuItems() { - return [ - { - label: 'Return to import form', - onClick: () => self.setImportMode(), - icon: FolderOpenIcon, - }, - ] - }, - })) + /** + * #action + */ + clearData() { + self.spreadsheet.setData() + self.importWizard.setSpreadsheetFilehandle() + }, -const SpreadsheetView = types.compose(BaseViewModel, model) + /** + * #action + */ + closeView() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getParent(self, 2).removeView(self) + }, + })) + .views(self => ({ + /** + * #method + */ + menuItems() { + return [ + { + label: 'Return to import form', + onClick: () => self.clearData(), + icon: FolderOpenIcon, + }, + ] + }, + })) +} -export type SpreadsheetViewStateModel = typeof SpreadsheetView +export type SpreadsheetViewStateModel = ReturnType export type SpreadsheetViewModel = Instance -export default SpreadsheetView +export default stateModelFactory diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/StaticRowSet.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/StaticRowSet.ts deleted file mode 100644 index 0ad5ff77e7..0000000000 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/StaticRowSet.ts +++ /dev/null @@ -1,65 +0,0 @@ -import RowModel from './Row' -import { types, getParent } from 'mobx-state-tree' - -const StaticRowModel = types - .model('StaticRowSet', { - isLoaded: types.literal(true), - rows: types.array(RowModel), - }) - .views(self => ({ - get count() { - return self.rows.length - }, - - get passingFiltersCount() { - return this.sortedFilteredRows.length - }, - - get selectedCount() { - return this.selectedRows.length - }, - - get selectedAndPassingFiltersCount() { - return this.selectedFilteredRows.length - }, - - get sortedRows() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const parent = getParent(self) - return [...self.rows].sort(parent.rowSortingComparisonFunction) - }, - - get selectedRows() { - return self.rows.filter(r => r.isSelected) - }, - - get selectedFilteredRows() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const sheet = getParent(self) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const view = getParent(sheet) - const { filterControls } = view - return this.selectedRows.filter(row => - filterControls.rowPassesFilters(sheet, row), - ) - }, - - // the set of all rows that pass the filters, sorted - get sortedFilteredRows() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const sheet = getParent(self) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const view = getParent(sheet) - const { filterControls } = view - return self.rows - .filter(row => filterControls.rowPassesFilters(sheet, row)) - .sort(sheet.rowSortingComparisonFunction) - }, - })) - .actions(self => ({ - unselectAll() { - self.rows.forEach(row => row.unSelect()) - }, - })) - -export default StaticRowModel diff --git a/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts b/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts index a624789a04..9111cdf05e 100644 --- a/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts +++ b/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts @@ -23,19 +23,12 @@ export default function LaunchSvInspectorViewF(pluginManager: PluginManager) { if (!view) { throw new Error('Failed to initialize view') } - const exts = uri.split('.') - let ext = exts?.pop()?.toUpperCase() - if (ext === 'GZ') { - ext = exts?.pop()?.toUpperCase() - } - view.spreadsheetView.importWizard.setFileType(fileType || ext || '') view.spreadsheetView.importWizard.setSelectedAssemblyName(assembly) - view.spreadsheetView.importWizard.setFileSource({ + view.spreadsheetView.importWizard.setSpreadsheetFilehandle({ uri, locationType: 'UriLocation', }) - await view.spreadsheetView.importWizard.import(assembly) }, ) } diff --git a/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx b/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx index 63c1f75bff..f31e0339dd 100644 --- a/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx +++ b/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useState } from 'react' import { observer } from 'mobx-react' import { makeStyles } from 'tss-react/mui' import { ResizeHandle } from '@jbrowse/core/ui' @@ -41,36 +41,39 @@ const SvInspectorView = observer(function ({ const { SpreadsheetViewReactComponent, CircularViewReactComponent, - showCircularView, + spreadsheetView, + circularView, } = model + const [initialCircWidth, setInitialCircWidth] = useState(0) + const [initialSpreadsheetWidth, setInitialSpreadsheetWidth] = useState(0) return (
- +
- {showCircularView ? ( - <> - { - const ret1 = model.circularView.resizeWidth(-distance) - return model.spreadsheetView.resizeWidth(-ret1) - }} - vertical - flexbox - className={classes.resizeHandleVert} - /> -
- - -
- - ) : null} + { + circularView.setWidth(initialCircWidth + total) + spreadsheetView.setWidth(initialSpreadsheetWidth - total) + }} + onMouseDown={() => { + setInitialSpreadsheetWidth(spreadsheetView.width) + setInitialCircWidth(circularView.width) + }} + vertical + flexbox + className={classes.resizeHandleVert} + /> +
+ + +
+ ) : ( + + ) +}) + +export default SvInspectorViewContainer diff --git a/plugins/sv-inspector/src/SvInspectorView/index.ts b/plugins/sv-inspector/src/SvInspectorView/index.ts index b911fb557c..7188ee600b 100644 --- a/plugins/sv-inspector/src/SvInspectorView/index.ts +++ b/plugins/sv-inspector/src/SvInspectorView/index.ts @@ -8,7 +8,7 @@ import { IAnyStateTreeNode } from 'mobx-state-tree' import BreakpointSplitViewType from '@jbrowse/plugin-breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView' import { CircularViewModel } from '@jbrowse/plugin-circular-view' -function defaultOnChordClick( +async function defaultOnChordClick( feature: Feature, chordTrack: IAnyStateTreeNode, pluginManager: PluginManager, @@ -19,7 +19,12 @@ function defaultOnChordClick( const viewType = pluginManager.getViewType( 'BreakpointSplitView', ) as BreakpointSplitViewType - const viewSnapshot = viewType.snapshotFromBreakendFeature(feature, view) + const [assemblyName] = view.assemblyNames + const viewSnapshot = await viewType.snapshotFromBreakendFeature( + feature, + assemblyName, + session, + ) // try to center the offsetPx viewSnapshot.views[0].offsetPx -= view.width / 2 + 100 diff --git a/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts b/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts index 7f557ff2c7..357c04f5a7 100644 --- a/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts +++ b/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts @@ -1,25 +1,24 @@ import clone from 'clone' -import { autorun, reaction } from 'mobx' +import { autorun } from 'mobx' import { types, getParent, addDisposer, Instance } from 'mobx-state-tree' import PluginManager from '@jbrowse/core/PluginManager' import { getSession, Region } from '@jbrowse/core/util' -import { readConfObject } from '@jbrowse/core/configuration' import { ElementId } from '@jbrowse/core/util/types/mst' import { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models' import { SpreadsheetViewStateModel } from '@jbrowse/plugin-spreadsheet-view' import { CircularViewStateModel } from '@jbrowse/plugin-circular-view' // icons -import OpenInNewIcon from '@mui/icons-material/OpenInNew' +// import OpenInNewIcon from '@mui/icons-material/OpenInNew' import FolderOpenIcon from '@mui/icons-material/FolderOpen' // locals -import { - canOpenBreakpointSplitViewFromTableRow, - openBreakpointSplitViewFromTableRow, - getFeatureForRow, -} from './breakpointSplitViewFromTableRow' +// import { +// canOpenBreakpointSplitViewFromTableRow, +// openBreakpointSplitViewFromTableRow, +// getFeatureForRow, +// } from './breakpointSplitViewFromTableRow' /** * #stateModel SvInspectorView @@ -41,7 +40,6 @@ function SvInspectorViewF(pluginManager: PluginManager) { const minHeight = 400 const defaultHeight = 550 - const headerHeight = 52 const circularViewOptionsBarHeight = 52 return types .compose( @@ -60,53 +58,40 @@ function SvInspectorViewF(pluginManager: PluginManager) { /** * #property */ - height: types.optional( - types.refinement( - 'SvInspectorViewHeight', - types.number, - n => n >= minHeight, - ), - defaultHeight, - ), + height: types.optional(types.number, defaultHeight), /** * #property */ onlyDisplayRelevantRegionsInCircularView: false, + /** * #property - * switch specifying whether we are showing the import wizard or the - * spreadsheet in our viewing area */ - mode: types.optional( - types.enumeration('SvInspectorViewMode', ['import', 'display']), - 'import', - ), + spreadsheetView: types.optional(SpreadsheetModel, { + hideVerticalResizeHandle: true, + type: 'SpreadsheetView', + }), /** * #property */ - spreadsheetView: types.optional(SpreadsheetModel, () => - SpreadsheetModel.create({ - type: 'SpreadsheetView', - hideVerticalResizeHandle: true, - }), - ), - /** - * #property - */ - circularView: types.optional(CircularModel, () => - CircularModel.create({ - type: 'CircularView', - hideVerticalResizeHandle: true, - hideTrackSelectorButton: true, - disableImportForm: true, - }), - ), + circularView: types.optional(CircularModel, { + type: 'CircularView', + hideVerticalResizeHandle: true, + hideTrackSelectorButton: true, + disableImportForm: true, + }), }), ) .volatile(() => ({ width: 800, })) .views(self => ({ + /** + * #getter + */ + get initialized() { + return self.spreadsheetView.initialized + }, /** * #getter */ @@ -118,43 +103,43 @@ function SvInspectorViewF(pluginManager: PluginManager) { * #getter */ get assemblyName() { - const { assembly } = self.spreadsheetView - return assembly ? readConfObject(assembly, 'name') : undefined + return self.spreadsheetView.assemblyName }, /** * #getter */ get showCircularView() { - return self.spreadsheetView.mode === 'display' + return self.spreadsheetView.initialized }, /** * #getter */ get features() { - const session = getSession(self) - const { spreadsheetView } = self - const { outputRows = [] } = spreadsheetView - return outputRows - .map((r, i) => getFeatureForRow(session, spreadsheetView, r, i)) - .filter(f => !!f) + return self.spreadsheetView.features }, /** * #getter */ get featuresAdapterConfigSnapshot() { + console.log(this.features?.map(f => f.toJSON()) || []) return { type: 'FromConfigAdapter', - features: this.features, + features: this.features?.map(f => f.toJSON()) || [], } }, /** * #getter */ get featureRefNames() { - const refs = this.features.map(r => r.refName) - const CHR2 = this.features.flatMap(r => r.INFO?.CHR2).filter(f => !!f) - return [...refs, ...CHR2] + if (this.features) { + const refs = this.features.map(r => r.get('refName') as string) + const CHR2 = this.features + .flatMap(r => r.get('INFO')?.CHR2 as string) + .filter(f => !!f) + return [...refs, ...CHR2] + } + return undefined }, /** * #getter @@ -171,7 +156,9 @@ function SvInspectorViewF(pluginManager: PluginManager) { type: 'ChordVariantDisplay', displayId: `sv-inspector-variant-track-chord-display-${self.id}`, onChordClick: `jexl:defaultOnChordClick(feature, track, pluginManager)`, - renderer: { type: 'StructuralVariantChordRenderer' }, + renderer: { + type: 'StructuralVariantChordRenderer', + }, }, ], } @@ -196,18 +183,6 @@ function SvInspectorViewF(pluginManager: PluginManager) { self.height = newHeight > minHeight ? newHeight : minHeight return self.height }, - /** - * #action - */ - setImportMode() { - self.spreadsheetView.setImportMode() - }, - /** - * #action - */ - setDisplayMode() { - self.spreadsheetView.setDisplayMode() - }, /** * #action */ @@ -225,7 +200,7 @@ function SvInspectorViewF(pluginManager: PluginManager) { * #action */ setOnlyDisplayRelevantRegionsInCircularView(val: boolean) { - self.onlyDisplayRelevantRegionsInCircularView = Boolean(val) + self.onlyDisplayRelevantRegionsInCircularView = val }, })) .views(self => ({ @@ -236,7 +211,9 @@ function SvInspectorViewF(pluginManager: PluginManager) { return [ { label: 'Return to import form', - onClick: () => self.setImportMode(), + onClick: () => { + self.spreadsheetView.spreadsheet.setData(undefined) + }, icon: FolderOpenIcon, }, ] @@ -255,151 +232,125 @@ function SvInspectorViewF(pluginManager: PluginManager) { // synchronize subview widths addDisposer( self, - autorun( - () => { - const borderWidth = 1 - if (self.showCircularView) { - const spreadsheetWidth = Math.round(self.width * 0.66) - const circularViewWidth = self.width - spreadsheetWidth - self.spreadsheetView.setWidth(spreadsheetWidth - borderWidth) - self.circularView.setWidth(circularViewWidth) - } else { - self.spreadsheetView.setWidth(self.width) - } - }, - { name: 'SvInspectorView width binding' }, - ), + autorun(() => { + const borderWidth = 1 + if (self.showCircularView) { + const spreadsheetWidth = Math.round(self.width * 0.66) + const circularViewWidth = self.width - spreadsheetWidth + self.spreadsheetView.setWidth(spreadsheetWidth - borderWidth) + self.circularView.setWidth(circularViewWidth) + } else { + self.spreadsheetView.setWidth(self.width) + } + }), ) // synchronize subview heights addDisposer( self, - autorun( - () => { - self.spreadsheetView.setHeight(self.height - headerHeight) - self.circularView.setHeight( - self.height - headerHeight - circularViewOptionsBarHeight, - ) - }, - { name: 'SvInspectorView height binding' }, - ), + autorun(() => { + const { height } = self + self.spreadsheetView.setHeight(height) + self.circularView.setHeight(height - circularViewOptionsBarHeight) + }), ) - // bind circularview displayedRegions to spreadsheet assembly, mediated // by the onlyRelevantRegions toggle addDisposer( self, - autorun( - async () => { - const { - assemblyName, - onlyDisplayRelevantRegionsInCircularView, - circularView, - featureRefNames, - } = self + autorun(async () => { + const { + assemblyName, + onlyDisplayRelevantRegionsInCircularView, + circularView, + featureRefNames, + } = self + console.log({ featureRefNames }) + try { + if (!circularView.initialized) { + return + } const { tracks } = circularView const { assemblyManager } = getSession(self) if (!assemblyName) { return } - const asm = await assemblyManager.waitForAssembly(assemblyName) + const asm = assemblyManager.get(assemblyName) if (!asm) { return } - - const { getCanonicalRefName, regions = [] } = asm + const { regions = [] } = asm if (onlyDisplayRelevantRegionsInCircularView) { if (tracks.length === 1) { - try { - // canonicalize the store's ref names if necessary - const refSet = new Set( - featureRefNames.map(r => getCanonicalRefName(r) || r), - ) - - circularView.setDisplayedRegions( - clone(regions.filter(r => refSet.has(r.refName))), - ) - } catch (e) { - circularView.setError(e) - } + // canonicalize the store's ref names if necessary + const refSet = new Set( + featureRefNames?.map( + r => asm.getCanonicalRefName(r) || r, + ) || [], + ) + circularView.setDisplayedRegions( + clone(regions.filter(r => refSet.has(r.refName))), + ) } } else { circularView.setDisplayedRegions(regions) } - }, - { name: 'SvInspectorView displayed regions bind' }, - ), + } catch (e) { + console.error(e) + circularView.setError(e) + } + }), ) - // bind circularview tracks to our track snapshot view addDisposer( self, - reaction( - () => ({ - generatedTrackConf: self?.featuresCircularTrackConfiguration, - assemblyName: self?.assemblyName, - }), - data => { - if (!data) { - return - } - const { assemblyName, generatedTrackConf } = data - const { circularView } = self - // hide any visible tracks - circularView.tracks.forEach(t => - circularView.hideTrack(t.configuration.trackId), - ) - - // put our track in as the only track - if (assemblyName && generatedTrackConf) { - // @ts-expect-error - circularView.addTrackConf(generatedTrackConf, { - assemblyName, - }) - } - }, - { - name: 'SvInspectorView track configuration binding', - fireImmediately: true, - }, - ), + autorun(() => { + const { assemblyName, featuresCircularTrackConfiguration } = self + const { circularView } = self + // hide any visible tracks + circularView.tracks.forEach(t => + circularView.hideTrack(t.configuration.trackId), + ) + // put our track in as the only track + if (assemblyName && featuresCircularTrackConfiguration) { + circularView.addTrackConf(featuresCircularTrackConfiguration) + } + }), ) - - // bind spreadsheetView row menu actions to us + // // bind spreadsheetView row menu actions to us addDisposer( self, autorun(() => { - self.spreadsheetView.setRowMenuItems( - // these are the MenuItem entries for the row menu actions in the - // spreadsheet view. these are installed into the child - // SpreadsheetView using an autorun below - [ - { - label: 'Open split detail view', - icon: OpenInNewIcon, - // @ts-expect-error - disabled(spreadsheetView, spreadsheet, rowNumber, row) { - return !canOpenBreakpointSplitViewFromTableRow( - self, - spreadsheetView, - spreadsheet, - row, - rowNumber, - ) - }, - - // @ts-expect-error - onClick(spreadsheetView, spreadsheet, rowNumber, row) { - openBreakpointSplitViewFromTableRow( - self, - spreadsheetView, - spreadsheet, - row, - rowNumber, - ) - }, - }, - ], - ) + // self.spreadsheetView.setRowMenuItems( + // // these are the MenuItem entries for the row menu actions in the + // // spreadsheet view. these are installed into the child + // // SpreadsheetView using an autorun below + // [ + // { + // label: 'Open split detail view', + // icon: OpenInNewIcon, + // // @ts-expect-error + // disabled(spreadsheetView, spreadsheet, rowNumber, row) { + // return !canOpenBreakpointSplitViewFromTableRow( + // self, + // spreadsheetView, + // spreadsheet, + // row, + // rowNumber, + // ) + // }, + // // @ts-expect-error + // onClick(spreadsheetView, spreadsheet, rowNumber, row) { + // openBreakpointSplitViewFromTableRow( + // self, + // spreadsheetView, + // spreadsheet, + // row, + // rowNumber, + // ) + // }, + // }, + // ], + // ) }), ) }, diff --git a/plugins/sv-inspector/src/SvInspectorView/models/adhocFeatureUtils.js b/plugins/sv-inspector/src/SvInspectorView/models/adhocFeatureUtils.js deleted file mode 100644 index 8a7baf1420..0000000000 --- a/plugins/sv-inspector/src/SvInspectorView/models/adhocFeatureUtils.js +++ /dev/null @@ -1,152 +0,0 @@ -// this file contains the rather verbose functions for -// creating features from CSV/TSV lines -import { parseLocString } from '@jbrowse/core/util' - -export function makeAdHocFeature( - columns, - columnsAlreadyUsedInLocations, - row, - loc1, - loc2, - rowNumber, -) { - // load all the other data in the row into an `otherData` object - const otherData = {} - columns.forEach((column, columnNumber) => { - if (columnsAlreadyUsedInLocations.includes(columnNumber)) { - return - } - let { text } = row.cells[columnNumber] - if (column.dataType.type === 'Number') { - text = parseFloat(text) - } - otherData[column.name] = text - }) - - // make the final feature data out of otherData + the parsed locations - return { - ...otherData, - uniqueId: `sv-inspector-adhoc-${rowNumber}`, - refName: loc1.refName, - start: loc1.start, - end: loc1.end, - mate: { - refName: loc2.refName, - start: loc2.start, - end: loc2.end, - }, - } -} - -export function makeAdHocSvFeatureFromTwoLocations( - columns, - locationColumnNumbers, - row, - rowNumber, - isValidRefName, -) { - // use the first two locations we found (first according to *displayed* order) - const loc1 = parseLocString( - row.cells[locationColumnNumbers[0]].text, - isValidRefName, - ) - const loc2 = parseLocString( - row.cells[locationColumnNumbers[1]].text, - isValidRefName, - ) - - const columnsAlreadyUsedInLocations = [ - locationColumnNumbers[0], - locationColumnNumbers[1], - ] - - return makeAdHocFeature( - columns, - columnsAlreadyUsedInLocations, - row, - loc1, - loc2, - rowNumber, - ) -} - -export function makeAdHocSvFeatureFromTwoRefStartEndSets( - columns, - locRefColumnNumbers, - locStartColumnNumbers, - locEndColumnNumbers, - row, - rowNumber, -) { - const textOf = colno => row.cells[colno].text - const loc1 = { - refName: textOf(locRefColumnNumbers[0]), - start: parseInt(textOf(locStartColumnNumbers[0]), 10) - 1, - end: parseInt(textOf(locEndColumnNumbers[0]), 10), - } - const loc2 = { - refName: textOf(locRefColumnNumbers[1]), - start: parseInt(textOf(locStartColumnNumbers[1]), 10) - 1, - end: parseInt(textOf(locEndColumnNumbers[1]), 10), - } - const columnsAlreadyUsedInLocations = [ - locRefColumnNumbers[0], - locStartColumnNumbers[0], - locEndColumnNumbers[0], - locRefColumnNumbers[1], - locStartColumnNumbers[1], - locEndColumnNumbers[1], - ] - return makeAdHocFeature( - columns, - columnsAlreadyUsedInLocations, - row, - loc1, - loc2, - rowNumber, - ) -} - -// makes a feature data object (passed as `data` to a SimpleFeature constructor) -// out of table row if the row has 2 location columns. undefined if not -export function makeAdHocSvFeature(sheet, rowNumber, row, isValidRefName) { - const { columns, columnDisplayOrder } = sheet - const columnTypes = {} - columnDisplayOrder.forEach(columnNumber => { - const columnDefinition = columns[columnNumber] - if (!columnTypes[columnDefinition.dataType.type]) { - columnTypes[columnDefinition.dataType.type] = [] - } - columnTypes[columnDefinition.dataType.type].push(columnNumber) - }) - const locationColumnNumbers = columnTypes.LocString || [] - const locStartColumnNumbers = columnTypes.LocStart || [] - const locEndColumnNumbers = columnTypes.LocEnd || [] - const locRefColumnNumbers = columnTypes.LocRef || [] - - // if we have 2 or more columns of type location, make a feature from them - if (locationColumnNumbers.length >= 2) { - return makeAdHocSvFeatureFromTwoLocations( - columns, - locationColumnNumbers, - row, - rowNumber, - isValidRefName, - ) - } - if ( - locRefColumnNumbers.length >= 2 && - locStartColumnNumbers.length >= 2 && - locEndColumnNumbers.length >= 2 - ) { - return makeAdHocSvFeatureFromTwoRefStartEndSets( - columns, - locRefColumnNumbers, - locStartColumnNumbers, - locEndColumnNumbers, - row, - rowNumber, - ) - } - return undefined -} diff --git a/plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.js b/plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.js deleted file mode 100644 index 0b0eb8d429..0000000000 --- a/plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.js +++ /dev/null @@ -1,84 +0,0 @@ -import { SimpleFeature, getEnv, getSession } from '@jbrowse/core/util' -import { makeAdHocSvFeature } from './adhocFeatureUtils' - -export function getFeatureForRow(session, spreadsheetView, row, rowNumber) { - return ( - row.extendedData?.vcfFeature || - row.extendedData?.feature || - makeAdHocSvFeature( - spreadsheetView.spreadsheet, - rowNumber, - row, - session.assemblyManager.isValidRefName, - ) - ) -} - -export function breakpointSplitViewSnapshotFromTableRow( - svInspectorView, - spreadsheetView, - spreadsheet, - row, - rowNumber, -) { - const { pluginManager } = getEnv(svInspectorView) - const session = getSession(spreadsheetView) - const featureData = getFeatureForRow(session, spreadsheet, row, rowNumber) - - if (featureData) { - const feature = new SimpleFeature(featureData) - session.setSelection(feature) - return pluginManager - .getViewType('BreakpointSplitView') - .snapshotFromBreakendFeature(feature, svInspectorView.circularView) - } - return undefined -} - -export function openBreakpointSplitViewFromTableRow( - svInspectorView, - spreadsheetView, - spreadsheet, - row, - rowNumber, -) { - const viewSnapshot = breakpointSplitViewSnapshotFromTableRow( - svInspectorView, - spreadsheetView, - spreadsheet, - row, - rowNumber, - ) - if (viewSnapshot) { - // try to center the offsetPx - const { circularView } = svInspectorView - viewSnapshot.views[0].offsetPx -= circularView.width / 2 + 100 - viewSnapshot.views[1].offsetPx -= circularView.width / 2 + 100 - - const session = getSession(spreadsheetView) - session.addView('BreakpointSplitView', viewSnapshot) - } -} - -export function canOpenBreakpointSplitViewFromTableRow( - svInspectorView, - spreadsheetView, - spreadsheet, - row, - rowNumber, -) { - try { - return Boolean( - breakpointSplitViewSnapshotFromTableRow( - svInspectorView, - spreadsheetView, - spreadsheet, - row, - rowNumber, - ), - ) - } catch (e) { - console.error('Unable to open breakpoint split view from table row', e) - return false - } -} diff --git a/plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.ts b/plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.ts new file mode 100644 index 0000000000..f5eaba0a1b --- /dev/null +++ b/plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.ts @@ -0,0 +1,88 @@ +// import { SimpleFeature, getEnv, getSession } from '@jbrowse/core/util' +// import { makeAdHocSvFeature } from './adhocFeatureUtils' +// import BreakpointSplitViewType from '@jbrowse/plugin-breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView' + +// export function getFeatureForRow(session, spreadsheetView, row, rowNumber) { +// return ( +// row.extendedData?.vcfFeature || +// row.extendedData?.feature || +// makeAdHocSvFeature( +// spreadsheetView.spreadsheet, +// rowNumber, +// row, +// session.assemblyManager.isValidRefName, +// ) +// ) +// } + +// export async function breakpointSplitViewSnapshotFromTableRow( +// svInspectorView, +// spreadsheetView, +// spreadsheet, +// row, +// rowNumber, +// ) { +// const { pluginManager } = getEnv(svInspectorView) +// const session = getSession(spreadsheetView) +// const featureData = getFeatureForRow(session, spreadsheet, row, rowNumber) + +// if (featureData) { +// const feature = new SimpleFeature(featureData) +// session.setSelection(feature) +// const { assemblyName } = spreadsheetView +// const viewType = pluginManager.getViewType( +// 'BreakpointSplitView', +// ) as BreakpointSplitViewType + +// return viewType.snapshotFromBreakendFeature(feature, assemblyName, session) +// } +// return undefined +// } + +// export function openBreakpointSplitViewFromTableRow( +// svInspectorView, +// spreadsheetView, +// spreadsheet, +// row, +// rowNumber, +// ) { +// const viewSnapshot = breakpointSplitViewSnapshotFromTableRow( +// svInspectorView, +// spreadsheetView, +// spreadsheet, +// row, +// rowNumber, +// ) +// if (viewSnapshot) { +// // try to center the offsetPx +// const { circularView } = svInspectorView +// viewSnapshot.views[0].offsetPx -= circularView.width / 2 + 100 +// viewSnapshot.views[1].offsetPx -= circularView.width / 2 + 100 + +// const session = getSession(spreadsheetView) +// session.addView('BreakpointSplitView', viewSnapshot) +// } +// } + +// export function canOpenBreakpointSplitViewFromTableRow( +// svInspectorView, +// spreadsheetView, +// spreadsheet, +// row, +// rowNumber, +// ) { +// try { +// return Boolean( +// breakpointSplitViewSnapshotFromTableRow( +// svInspectorView, +// spreadsheetView, +// spreadsheet, +// row, +// rowNumber, +// ), +// ) +// } catch (e) { +// console.error('Unable to open breakpoint split view from table row', e) +// return false +// } +// } diff --git a/plugins/variants/src/LinearVariantDisplay/configSchema.ts b/plugins/variants/src/LinearVariantDisplay/configSchema.ts index 2a80ada3a0..ade30430e1 100644 --- a/plugins/variants/src/LinearVariantDisplay/configSchema.ts +++ b/plugins/variants/src/LinearVariantDisplay/configSchema.ts @@ -5,9 +5,12 @@ import { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-ge /** * #config LinearVariantDisplay - * mostly empty, this display type is very much - * like a `FeatureTrack` with a `LinearBasicDisplay` except it has a custom - * feature details widget + * + * mostly empty, this display type is very much like a `FeatureTrack` with a + * `LinearBasicDisplay` except it has a custom feature details widget + * + * extends + * - [LinearBasicDisplay](../linearbasicdisplay) */ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars diff --git a/plugins/variants/src/LinearVariantDisplay/model.ts b/plugins/variants/src/LinearVariantDisplay/model.ts index fc1ea0aab7..f55121a911 100644 --- a/plugins/variants/src/LinearVariantDisplay/model.ts +++ b/plugins/variants/src/LinearVariantDisplay/model.ts @@ -14,9 +14,8 @@ import { AnyConfigurationSchemaType } from '@jbrowse/core/configuration' /** * #stateModel LinearVariantDisplay - * similar to basic display, but provides custom widget on feature click - * extends * + * extends * - [LinearBasicDisplay](../linearbasicdisplay) */ export default function stateModelFactory( diff --git a/plugins/variants/src/VariantFeatureWidget/VariantSampleGrid.tsx b/plugins/variants/src/VariantFeatureWidget/VariantSampleGrid.tsx index 331c172468..f7fcf956dd 100644 --- a/plugins/variants/src/VariantFeatureWidget/VariantSampleGrid.tsx +++ b/plugins/variants/src/VariantFeatureWidget/VariantSampleGrid.tsx @@ -143,7 +143,11 @@ export default function VariantSamples(props: { disableColumnMenu slots={{ toolbar: checked ? GridToolbar : null }} slotProps={{ - toolbar: { printOptions: { disableToolbarButton: true } }, + toolbar: { + printOptions: { + disableToolbarButton: true, + }, + }, }} />
diff --git a/yarn.lock b/yarn.lock index c32cafecd9..b5266eb8c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,15 +110,15 @@ tslib "^1.11.1" "@aws-sdk/client-cloudfront@^3.535.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.554.0.tgz#ce6e45b8c34bb95d00f4792be07dc0ab059bc7e7" - integrity sha512-cFKqFew8xuQWVFH1ZAI2a/Gs66bI8+OlHj/5ED1ZKoBGiBQRC+EUT/0bhbzAYJLB9jeSRPGRL/jOgcL6Sw4Hcg== + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.540.0.tgz#e7faccdb8f1307923a4b81dc6c2a7fe469a0ed9d" + integrity sha512-FjdOLAcIFQImfE18uqWS+H4ZMXMsG25o/Jfb0Avnm0BOnpPoHS2sjnUiJxqqQiO7lc8F5Oomc4OTgrX70Mi3LA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.554.0" - "@aws-sdk/core" "3.554.0" - "@aws-sdk/credential-provider-node" "3.554.0" + "@aws-sdk/client-sts" "3.540.0" + "@aws-sdk/core" "3.535.0" + "@aws-sdk/credential-provider-node" "3.540.0" "@aws-sdk/middleware-host-header" "3.535.0" "@aws-sdk/middleware-logger" "3.535.0" "@aws-sdk/middleware-recursion-detection" "3.535.0" @@ -130,26 +130,26 @@ "@aws-sdk/util-user-agent-node" "3.535.0" "@aws-sdk/xml-builder" "3.535.0" "@smithy/config-resolver" "^2.2.0" - "@smithy/core" "^1.4.2" + "@smithy/core" "^1.4.0" "@smithy/fetch-http-handler" "^2.5.0" "@smithy/hash-node" "^2.2.0" "@smithy/invalid-dependency" "^2.2.0" "@smithy/middleware-content-length" "^2.2.0" - "@smithy/middleware-endpoint" "^2.5.1" - "@smithy/middleware-retry" "^2.3.1" + "@smithy/middleware-endpoint" "^2.5.0" + "@smithy/middleware-retry" "^2.2.0" "@smithy/middleware-serde" "^2.3.0" "@smithy/middleware-stack" "^2.2.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/node-http-handler" "^2.5.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/url-parser" "^2.2.0" "@smithy/util-base64" "^2.3.0" "@smithy/util-body-length-browser" "^2.2.0" "@smithy/util-body-length-node" "^2.3.0" - "@smithy/util-defaults-mode-browser" "^2.2.1" - "@smithy/util-defaults-mode-node" "^2.3.1" + "@smithy/util-defaults-mode-browser" "^2.2.0" + "@smithy/util-defaults-mode-node" "^2.3.0" "@smithy/util-endpoints" "^1.2.0" "@smithy/util-middleware" "^2.2.0" "@smithy/util-retry" "^2.2.0" @@ -158,17 +158,17 @@ "@smithy/util-waiter" "^2.2.0" tslib "^2.6.2" -"@aws-sdk/client-s3@^3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.554.0.tgz#1097c2646ce749932a989eaf7ab081bcd1723fe3" - integrity sha512-d5TKKtGWhN0vl9QovUFrf3UsM7jgFQkowDPx1O+E/yeQUj1FBDOoRfDCcQOKW/9ghloI6k7f0bBpNxdd+x0oKA== +"@aws-sdk/client-s3@^3.535.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.540.0.tgz#ab9f0e488009c79f676d7b3489b9de0ec6a1cde3" + integrity sha512-rYBuNB7uqCO9xZc0OAwM2K6QJAo2Syt1L5OhEaf7zG7FulNMyrK6kJPg1WrvNE90tW6gUdDaTy3XsQ7lq6O7uA== dependencies: "@aws-crypto/sha1-browser" "3.0.0" "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.554.0" - "@aws-sdk/core" "3.554.0" - "@aws-sdk/credential-provider-node" "3.554.0" + "@aws-sdk/client-sts" "3.540.0" + "@aws-sdk/core" "3.535.0" + "@aws-sdk/credential-provider-node" "3.540.0" "@aws-sdk/middleware-bucket-endpoint" "3.535.0" "@aws-sdk/middleware-expect-continue" "3.535.0" "@aws-sdk/middleware-flexible-checksums" "3.535.0" @@ -176,19 +176,19 @@ "@aws-sdk/middleware-location-constraint" "3.535.0" "@aws-sdk/middleware-logger" "3.535.0" "@aws-sdk/middleware-recursion-detection" "3.535.0" - "@aws-sdk/middleware-sdk-s3" "3.552.0" - "@aws-sdk/middleware-signing" "3.552.0" + "@aws-sdk/middleware-sdk-s3" "3.535.0" + "@aws-sdk/middleware-signing" "3.535.0" "@aws-sdk/middleware-ssec" "3.537.0" "@aws-sdk/middleware-user-agent" "3.540.0" "@aws-sdk/region-config-resolver" "3.535.0" - "@aws-sdk/signature-v4-multi-region" "3.552.0" + "@aws-sdk/signature-v4-multi-region" "3.535.0" "@aws-sdk/types" "3.535.0" "@aws-sdk/util-endpoints" "3.540.0" "@aws-sdk/util-user-agent-browser" "3.535.0" "@aws-sdk/util-user-agent-node" "3.535.0" "@aws-sdk/xml-builder" "3.535.0" "@smithy/config-resolver" "^2.2.0" - "@smithy/core" "^1.4.2" + "@smithy/core" "^1.4.0" "@smithy/eventstream-serde-browser" "^2.2.0" "@smithy/eventstream-serde-config-resolver" "^2.2.0" "@smithy/eventstream-serde-node" "^2.2.0" @@ -199,21 +199,21 @@ "@smithy/invalid-dependency" "^2.2.0" "@smithy/md5-js" "^2.2.0" "@smithy/middleware-content-length" "^2.2.0" - "@smithy/middleware-endpoint" "^2.5.1" - "@smithy/middleware-retry" "^2.3.1" + "@smithy/middleware-endpoint" "^2.5.0" + "@smithy/middleware-retry" "^2.2.0" "@smithy/middleware-serde" "^2.3.0" "@smithy/middleware-stack" "^2.2.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/node-http-handler" "^2.5.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/url-parser" "^2.2.0" "@smithy/util-base64" "^2.3.0" "@smithy/util-body-length-browser" "^2.2.0" "@smithy/util-body-length-node" "^2.3.0" - "@smithy/util-defaults-mode-browser" "^2.2.1" - "@smithy/util-defaults-mode-node" "^2.3.1" + "@smithy/util-defaults-mode-browser" "^2.2.0" + "@smithy/util-defaults-mode-node" "^2.3.0" "@smithy/util-endpoints" "^1.2.0" "@smithy/util-retry" "^2.2.0" "@smithy/util-stream" "^2.2.0" @@ -221,15 +221,15 @@ "@smithy/util-waiter" "^2.2.0" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.554.0.tgz#c4002879c89cf5e4a45f39c63b2963f8fab88385" - integrity sha512-M86rkiRqbZBF5VyfTQ/vttry9VSoQkZ1oCqYF+SAGlXmD0Of8587yRSj2M4rYe0Uj7nRQIfSnhDYp1UzsZeRfQ== +"@aws-sdk/client-sso-oidc@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.540.0.tgz#e4c52889d33ca969add269011b790f2d634fb6d2" + integrity sha512-LZYK0lBRQK8D8M3Sqc96XiXkAV2v70zhTtF6weyzEpgwxZMfSuFJjs0jFyhaeZBZbZv7BBghIdhJ5TPavNxGMQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.554.0" - "@aws-sdk/core" "3.554.0" + "@aws-sdk/client-sts" "3.540.0" + "@aws-sdk/core" "3.535.0" "@aws-sdk/middleware-host-header" "3.535.0" "@aws-sdk/middleware-logger" "3.535.0" "@aws-sdk/middleware-recursion-detection" "3.535.0" @@ -240,40 +240,40 @@ "@aws-sdk/util-user-agent-browser" "3.535.0" "@aws-sdk/util-user-agent-node" "3.535.0" "@smithy/config-resolver" "^2.2.0" - "@smithy/core" "^1.4.2" + "@smithy/core" "^1.4.0" "@smithy/fetch-http-handler" "^2.5.0" "@smithy/hash-node" "^2.2.0" "@smithy/invalid-dependency" "^2.2.0" "@smithy/middleware-content-length" "^2.2.0" - "@smithy/middleware-endpoint" "^2.5.1" - "@smithy/middleware-retry" "^2.3.1" + "@smithy/middleware-endpoint" "^2.5.0" + "@smithy/middleware-retry" "^2.2.0" "@smithy/middleware-serde" "^2.3.0" "@smithy/middleware-stack" "^2.2.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/node-http-handler" "^2.5.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/url-parser" "^2.2.0" "@smithy/util-base64" "^2.3.0" "@smithy/util-body-length-browser" "^2.2.0" "@smithy/util-body-length-node" "^2.3.0" - "@smithy/util-defaults-mode-browser" "^2.2.1" - "@smithy/util-defaults-mode-node" "^2.3.1" + "@smithy/util-defaults-mode-browser" "^2.2.0" + "@smithy/util-defaults-mode-node" "^2.3.0" "@smithy/util-endpoints" "^1.2.0" "@smithy/util-middleware" "^2.2.0" "@smithy/util-retry" "^2.2.0" "@smithy/util-utf8" "^2.3.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.554.0.tgz#fef7b7ee47cad3987b50e9218ec1d11dcd42e32b" - integrity sha512-yj6CgIxCT3UwMumEO481KH4QvwArkAPzD7Xvwe1QKgJATc9bKNEo/FxV8LfnWIJ7nOtMDxbNxYLMXH/Fs1qGaQ== +"@aws-sdk/client-sso@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.540.0.tgz#732a7f325de3905a719c20ce05e555b445f82b4a" + integrity sha512-rrQZMuw4sxIo3eyAUUzPQRA336mPRnrAeSlSdVHBKZD8Fjvoy0lYry2vNhkPLpFZLso1J66KRyuIv4LzRR3v1Q== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.554.0" + "@aws-sdk/core" "3.535.0" "@aws-sdk/middleware-host-header" "3.535.0" "@aws-sdk/middleware-logger" "3.535.0" "@aws-sdk/middleware-recursion-detection" "3.535.0" @@ -284,40 +284,40 @@ "@aws-sdk/util-user-agent-browser" "3.535.0" "@aws-sdk/util-user-agent-node" "3.535.0" "@smithy/config-resolver" "^2.2.0" - "@smithy/core" "^1.4.2" + "@smithy/core" "^1.4.0" "@smithy/fetch-http-handler" "^2.5.0" "@smithy/hash-node" "^2.2.0" "@smithy/invalid-dependency" "^2.2.0" "@smithy/middleware-content-length" "^2.2.0" - "@smithy/middleware-endpoint" "^2.5.1" - "@smithy/middleware-retry" "^2.3.1" + "@smithy/middleware-endpoint" "^2.5.0" + "@smithy/middleware-retry" "^2.2.0" "@smithy/middleware-serde" "^2.3.0" "@smithy/middleware-stack" "^2.2.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/node-http-handler" "^2.5.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/url-parser" "^2.2.0" "@smithy/util-base64" "^2.3.0" "@smithy/util-body-length-browser" "^2.2.0" "@smithy/util-body-length-node" "^2.3.0" - "@smithy/util-defaults-mode-browser" "^2.2.1" - "@smithy/util-defaults-mode-node" "^2.3.1" + "@smithy/util-defaults-mode-browser" "^2.2.0" + "@smithy/util-defaults-mode-node" "^2.3.0" "@smithy/util-endpoints" "^1.2.0" "@smithy/util-middleware" "^2.2.0" "@smithy/util-retry" "^2.2.0" "@smithy/util-utf8" "^2.3.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.554.0.tgz#511f1bafe628613f1824274f9c11a9df31ac0b09" - integrity sha512-EhaA6T0M0DNg5M8TCF1a7XJI5D/ZxAF3dgVIchyF98iNzjYgl/7U8K6hJay2A11aFvVu70g46xYMpz3Meky4wQ== +"@aws-sdk/client-sts@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.540.0.tgz#16ce14db1c5387be3ad9be6dd4f8ed33b63193c8" + integrity sha512-ITHUQxvpqfQX6obfpIi3KYGzZYfe/I5Ixjfxoi5lB7ISCtmxqObKB1fzD93wonkMJytJ7LUO8panZl/ojiJ1uw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.554.0" + "@aws-sdk/core" "3.535.0" "@aws-sdk/middleware-host-header" "3.535.0" "@aws-sdk/middleware-logger" "3.535.0" "@aws-sdk/middleware-recursion-detection" "3.535.0" @@ -328,41 +328,41 @@ "@aws-sdk/util-user-agent-browser" "3.535.0" "@aws-sdk/util-user-agent-node" "3.535.0" "@smithy/config-resolver" "^2.2.0" - "@smithy/core" "^1.4.2" + "@smithy/core" "^1.4.0" "@smithy/fetch-http-handler" "^2.5.0" "@smithy/hash-node" "^2.2.0" "@smithy/invalid-dependency" "^2.2.0" "@smithy/middleware-content-length" "^2.2.0" - "@smithy/middleware-endpoint" "^2.5.1" - "@smithy/middleware-retry" "^2.3.1" + "@smithy/middleware-endpoint" "^2.5.0" + "@smithy/middleware-retry" "^2.2.0" "@smithy/middleware-serde" "^2.3.0" "@smithy/middleware-stack" "^2.2.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/node-http-handler" "^2.5.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/url-parser" "^2.2.0" "@smithy/util-base64" "^2.3.0" "@smithy/util-body-length-browser" "^2.2.0" "@smithy/util-body-length-node" "^2.3.0" - "@smithy/util-defaults-mode-browser" "^2.2.1" - "@smithy/util-defaults-mode-node" "^2.3.1" + "@smithy/util-defaults-mode-browser" "^2.2.0" + "@smithy/util-defaults-mode-node" "^2.3.0" "@smithy/util-endpoints" "^1.2.0" "@smithy/util-middleware" "^2.2.0" "@smithy/util-retry" "^2.2.0" "@smithy/util-utf8" "^2.3.0" tslib "^2.6.2" -"@aws-sdk/core@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.554.0.tgz#84def70777ace823efb54451da403bfc125a8571" - integrity sha512-JrG7ToTLeNf+/S3IiCUPVw9jEDB0DXl5ho8n/HwOa946mv+QyCepCuV2U/8f/1KAX0mD8Ufm/E4/cbCbFHgbSg== +"@aws-sdk/core@3.535.0": + version "3.535.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.535.0.tgz#f3a726c297cea9634d19a1db4e958c918c506c8b" + integrity sha512-+Yusa9HziuaEDta1UaLEtMAtmgvxdxhPn7jgfRY6PplqAqgsfa5FR83sxy5qr2q7xjQTwHtV4MjQVuOjG9JsLw== dependencies: - "@smithy/core" "^1.4.2" + "@smithy/core" "^1.4.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/signature-v4" "^2.2.1" - "@smithy/smithy-client" "^2.5.1" + "@smithy/signature-v4" "^2.2.0" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" fast-xml-parser "4.2.5" tslib "^2.6.2" @@ -377,31 +377,31 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.552.0": - version "3.552.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.552.0.tgz#ecc88d02cba95621887e6b85b2583e756ad29eb6" - integrity sha512-vsmu7Cz1i45pFEqzVb4JcFmAmVnWFNLsGheZc8SCptlqCO5voETrZZILHYIl4cjKkSDk3pblBOf0PhyjqWW6WQ== +"@aws-sdk/credential-provider-http@3.535.0": + version "3.535.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz#0a42f6b1a61d927bbce9f4afd25112f486bd05da" + integrity sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw== dependencies: "@aws-sdk/types" "3.535.0" "@smithy/fetch-http-handler" "^2.5.0" "@smithy/node-http-handler" "^2.5.0" "@smithy/property-provider" "^2.2.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/util-stream" "^2.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.554.0.tgz#09c6b8f38cdbca3b27f0d71c53465ca9c3f2a5cf" - integrity sha512-BQenhg43S6TMJHxrdjDVdVF+HH5tA1op9ZYLyJrvV5nn7CCO4kyAkkOuSAv1NkL+RZsIkW0/vHTXwQOQw3cUsg== +"@aws-sdk/credential-provider-ini@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.540.0.tgz#8e17b23bf242152775db1473f7d2952beb6a5ef9" + integrity sha512-igN/RbsnulIBwqXbwsWmR3srqmtbPF1dm+JteGvUY31FW65fTVvWvSr945Y/cf1UbhPmIQXntlsqESqpkhTHwg== dependencies: - "@aws-sdk/client-sts" "3.554.0" + "@aws-sdk/client-sts" "3.540.0" "@aws-sdk/credential-provider-env" "3.535.0" "@aws-sdk/credential-provider-process" "3.535.0" - "@aws-sdk/credential-provider-sso" "3.554.0" - "@aws-sdk/credential-provider-web-identity" "3.554.0" + "@aws-sdk/credential-provider-sso" "3.540.0" + "@aws-sdk/credential-provider-web-identity" "3.540.0" "@aws-sdk/types" "3.535.0" "@smithy/credential-provider-imds" "^2.3.0" "@smithy/property-provider" "^2.2.0" @@ -409,17 +409,17 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.554.0.tgz#74e8ae0b69cfba716e57881ace9d6466deedfb5e" - integrity sha512-poX/+2OE3oxqp4f5MiaJh251p8l+bzcFwgcDBwz0e2rcpvMSYl9jw4AvGnCiG2bmf9yhNJdftBiS1A+KjxV0qA== +"@aws-sdk/credential-provider-node@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.540.0.tgz#e6fd3404de68e7f9580f01aa542b16e9abc58e5c" + integrity sha512-HKQZJbLHlrHX9A0B1poiYNXIIQfy8whTjuosTCYKPDBhhUyVAQfxy/KG726j0v43IhaNPLgTGZCJve4hAsazSw== dependencies: "@aws-sdk/credential-provider-env" "3.535.0" - "@aws-sdk/credential-provider-http" "3.552.0" - "@aws-sdk/credential-provider-ini" "3.554.0" + "@aws-sdk/credential-provider-http" "3.535.0" + "@aws-sdk/credential-provider-ini" "3.540.0" "@aws-sdk/credential-provider-process" "3.535.0" - "@aws-sdk/credential-provider-sso" "3.554.0" - "@aws-sdk/credential-provider-web-identity" "3.554.0" + "@aws-sdk/credential-provider-sso" "3.540.0" + "@aws-sdk/credential-provider-web-identity" "3.540.0" "@aws-sdk/types" "3.535.0" "@smithy/credential-provider-imds" "^2.3.0" "@smithy/property-provider" "^2.2.0" @@ -438,25 +438,25 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.554.0.tgz#83e950685aaadb18d48d51c39f6201d820a5de41" - integrity sha512-8QPpwBA31i/fZ7lDZJC4FA9EdxLg5SJ8sPB2qLSjp5UTGTYL2HRl0Eznkb7DXyp/wImsR/HFR1NxuFCCVotLCg== +"@aws-sdk/credential-provider-sso@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.540.0.tgz#1fc5c53a0df8227249c73a3cb7660b1accb79186" + integrity sha512-tKkFqK227LF5ajc5EL6asXS32p3nkofpP8G7NRpU7zOEOQCg01KUc4JRX+ItI0T007CiN1J19yNoFqHLT/SqHg== dependencies: - "@aws-sdk/client-sso" "3.554.0" - "@aws-sdk/token-providers" "3.554.0" + "@aws-sdk/client-sso" "3.540.0" + "@aws-sdk/token-providers" "3.540.0" "@aws-sdk/types" "3.535.0" "@smithy/property-provider" "^2.2.0" "@smithy/shared-ini-file-loader" "^2.4.0" "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.554.0.tgz#6076a32066b633a18fc90cae7ed0b874db78a556" - integrity sha512-HN54DzLjepw5ZWSF9ycGevhFTyg6pjLuLKy5Y8t/f1jFDComzYdGEDe0cdV9YO653W3+PQwZZGz09YVygGYBLg== +"@aws-sdk/credential-provider-web-identity@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.540.0.tgz#775a2090e9f4f89efe2ebdf1e2c109a47561c0e9" + integrity sha512-OpDm9w3A168B44hSjpnvECP4rvnFzD86rN4VYdGADuCvEa5uEcdA/JuT5WclFPDqdWEmFBqS1pxBIJBf0g2Q9Q== dependencies: - "@aws-sdk/client-sts" "3.554.0" + "@aws-sdk/client-sts" "3.540.0" "@aws-sdk/types" "3.535.0" "@smithy/property-provider" "^2.2.0" "@smithy/types" "^2.12.0" @@ -537,30 +537,30 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.552.0": - version "3.552.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.552.0.tgz#501200ec833add342578fd7d1ee2ecf4d8b9788d" - integrity sha512-9KzOqsbwJJuQcpmrpkkIftjPahB1bsrcWalYzcVqKCgHCylhkSHW2tX+uGHRnvAl9iobQD5D7LUrS+cv0NeQ/Q== +"@aws-sdk/middleware-sdk-s3@3.535.0": + version "3.535.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.535.0.tgz#3cb76342d91a5e0e94d9a380dbaba9a9ee4849e0" + integrity sha512-/dLG/E3af6ohxkQ5GBHT8tZfuPIg6eItKxCXuulvYj0Tqgf3Mb+xTsvSkxQsJF06RS4sH7Qsg/PnB8ZfrJrXpg== dependencies: "@aws-sdk/types" "3.535.0" "@aws-sdk/util-arn-parser" "3.535.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/signature-v4" "^2.2.1" - "@smithy/smithy-client" "^2.5.1" + "@smithy/signature-v4" "^2.2.0" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/util-config-provider" "^2.3.0" tslib "^2.6.2" -"@aws-sdk/middleware-signing@3.552.0": - version "3.552.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.552.0.tgz#07edabef2f9d42ea49e9bad4382d8c572fc65f12" - integrity sha512-ZjOrlEmwjhbmkINa4Zx9LJh+xb/kgEiUrcfud2kq/r8ath1Nv1/4zalI9jHnou1J+R+yS+FQlXLXHSZ7vqyFbA== +"@aws-sdk/middleware-signing@3.535.0": + version "3.535.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.535.0.tgz#cf98354e6d48e275689db6a4a513f62bd1555518" + integrity sha512-Rb4sfus1Gc5paRl9JJgymJGsb/i3gJKK/rTuFZICdd1PBBE5osIOHP5CpzWYBtc5LlyZE1a2QoxPMCyG+QUGPw== dependencies: "@aws-sdk/types" "3.535.0" "@smithy/property-provider" "^2.2.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/signature-v4" "^2.2.1" + "@smithy/signature-v4" "^2.2.0" "@smithy/types" "^2.12.0" "@smithy/util-middleware" "^2.2.0" tslib "^2.6.2" @@ -597,24 +597,24 @@ "@smithy/util-middleware" "^2.2.0" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.552.0": - version "3.552.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.552.0.tgz#ab8fb3aaf7b3dfbef1589e2f0cb7f60117d7a93b" - integrity sha512-cC11/5ahp+LaBCq7cR+51AM2ftf6m9diRd2oWkbEpjSiEKQzZRAltUPZAJM6NXGypmDODQDJphLGt45tvS+8kg== +"@aws-sdk/signature-v4-multi-region@3.535.0": + version "3.535.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.535.0.tgz#6a5413ab087d984794e12b04cac5d64c1e37a53f" + integrity sha512-tqCsEsEj8icW0SAh3NvyhRUq54Gz2pu4NM2tOSrFp7SO55heUUaRLSzYteNZCTOupH//AAaZvbN/UUTO/DrOog== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.552.0" + "@aws-sdk/middleware-sdk-s3" "3.535.0" "@aws-sdk/types" "3.535.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/signature-v4" "^2.2.1" + "@smithy/signature-v4" "^2.2.0" "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.554.0": - version "3.554.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.554.0.tgz#5a20ce273451654a1382f772ef119a9a156f537c" - integrity sha512-KMMQ5Cw0FUPL9H8g69Lp08xtzRo7r/MK+lBV6LznWBbCP/NwtZ8awVHaPy2P31z00cWtu9MYkUTviWPqJTaBvg== +"@aws-sdk/token-providers@3.540.0": + version "3.540.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.540.0.tgz#06fb874a62d3c496875768ac648bc6cca4c75a79" + integrity sha512-9BvtiVEZe5Ev88Wa4ZIUbtT6BVcPwhxmVInQ6c12MYNb0WNL54BN6wLy/eknAfF05gpX2/NDU2pUDOyMPdm/+g== dependencies: - "@aws-sdk/client-sso-oidc" "3.554.0" + "@aws-sdk/client-sso-oidc" "3.540.0" "@aws-sdk/types" "3.535.0" "@smithy/property-provider" "^2.2.0" "@smithy/shared-ini-file-loader" "^2.4.0" @@ -696,23 +696,23 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.3.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" - integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.4" + "@babel/generator" "^7.24.1" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.4" - "@babel/parser" "^7.24.4" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" "@babel/template" "^7.24.0" "@babel/traverse" "^7.24.1" "@babel/types" "^7.24.0" @@ -722,10 +722,10 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== +"@babel/generator@^7.23.0", "@babel/generator@^7.24.1", "@babel/generator@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== dependencies: "@babel/types" "^7.24.0" "@jridgewell/gen-mapping" "^0.3.5" @@ -757,10 +757,10 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" - integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== +"@babel/helper-create-class-features-plugin@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" + integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -912,10 +912,10 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" - integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== +"@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== dependencies: "@babel/template" "^7.24.0" "@babel/traverse" "^7.24.1" @@ -931,18 +931,10 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" - integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" @@ -1161,10 +1153,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" - integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== +"@babel/plugin-transform-block-scoping@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" + integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -1176,12 +1168,12 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz#4e37efcca1d9f2fcb908d1bae8b56b4b6e9e1cb6" + integrity sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -1526,12 +1518,12 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-typescript@^7.24.1": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15" - integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz#5c05e28bb76c7dfe7d6c5bed9951324fd2d3ab07" + integrity sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-typescript" "^7.24.1" @@ -1567,15 +1559,14 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.23.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" - integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.3.tgz#f3f138c844ffeeac372597b29c51b5259e8323a3" + integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== dependencies: - "@babel/compat-data" "^7.24.4" + "@babel/compat-data" "^7.24.1" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" @@ -1602,9 +1593,9 @@ "@babel/plugin-transform-async-generator-functions" "^7.24.3" "@babel/plugin-transform-async-to-generator" "^7.24.1" "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.4" + "@babel/plugin-transform-block-scoping" "^7.24.1" "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" + "@babel/plugin-transform-class-static-block" "^7.24.1" "@babel/plugin-transform-classes" "^7.24.1" "@babel/plugin-transform-computed-properties" "^7.24.1" "@babel/plugin-transform-destructuring" "^7.24.1" @@ -1711,9 +1702,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== dependencies: regenerator-runtime "^0.14.0" @@ -2082,7 +2073,7 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -2140,9 +2131,9 @@ "@floating-ui/dom" "^1.6.1" "@floating-ui/react@^0.26.3": - version "0.26.12" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.12.tgz#6908f774d8e3167d89b37fd83be975c7e5d8be99" - integrity sha512-D09o62HrWdIkstF2kGekIKAC0/N/Dl6wo3CQsnLcOmO3LkW6Ik8uIb3kw8JYkwxNCcg+uJ2bpWUiIijTBep05w== + version "0.26.10" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.10.tgz#d4a4878bcfaed70963ec0eaa67a71bead5924ee5" + integrity sha512-sh6f9gVvWQdEzLObrWbJ97c0clJObiALsFe0LiR/kb3tDRKwEhObASEH2QyfdoO/ZBPzwxa9j+nYFo+sqgbioA== dependencies: "@floating-ui/react-dom" "^2.0.0" "@floating-ui/utils" "^0.2.0" @@ -2322,58 +2313,54 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@inquirer/confirm@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.4.tgz#851d2c74ddcf46018c9540caed6bd05e1f081ac7" - integrity sha512-2z2RC0JyQCmggQfRxFnQitGp8YZgdM/AqcOuLaUtL0dZHFByk5jgtzxECX4z5MsH8aq2WzdLPI2AHmHOkh8eRA== +"@inquirer/confirm@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.0.tgz#526cb71ceab28ba827ea287aa81c969e437017b6" + integrity sha512-nH5mxoTEoqk6WpoBz80GMpDSm9jH5V9AF8n+JZAZfMzd9gHeEG9w1o3KawPRR72lfzpP+QxBHLkOKLEApwhDiQ== dependencies: - "@inquirer/core" "^8.0.0" - "@inquirer/type" "^1.3.0" + "@inquirer/core" "^7.1.0" + "@inquirer/type" "^1.2.1" -"@inquirer/core@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-8.0.0.tgz#401c901ae2d93f8be6a58c0c04577920f964eaed" - integrity sha512-RAszmjXj+grbT9yQ9B+me40LskytwBYPhyl6yHI8h+J5BmL0gNI3pdvBBFD6S9LV0lzhzfCRMBMH5UvuUPYzZQ== +"@inquirer/core@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-7.1.0.tgz#fb78738fd6624de50f027c08d6f24298b72a402b" + integrity sha512-FRCiDiU54XHt5B/D8hX4twwZuzSP244ANHbu3R7CAsJfiv1dUOz24ePBgCZjygEjDUi6BWIJuk4eWLKJ7LATUw== dependencies: - "@inquirer/figures" "^1.0.0" - "@inquirer/type" "^1.3.0" + "@inquirer/type" "^1.2.1" "@types/mute-stream" "^0.0.4" - "@types/node" "^20.12.7" + "@types/node" "^20.11.26" "@types/wrap-ansi" "^3.0.0" ansi-escapes "^4.3.2" chalk "^4.1.2" cli-spinners "^2.9.2" cli-width "^4.1.0" + figures "^3.2.0" mute-stream "^1.0.0" + run-async "^3.0.0" signal-exit "^4.1.0" strip-ansi "^6.0.1" wrap-ansi "^6.2.0" -"@inquirer/figures@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.0.tgz#f28ee68d08c5ada5284ee0d58ae1d177e80dabda" - integrity sha512-3fw+7+77/duTnMJTeSS44wneszghI4tkr0m0xdIJabbYRe36ElzmsqyboMZ1nFRon6sT+ckVvYDVjwapKv+2sw== - -"@inquirer/input@^2.1.1": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.1.4.tgz#b517e8ade8c4db19c1ba85db574f7abf6d83d0d2" - integrity sha512-FnskIUMM0ogcYu9zHIuIx8McSnXC69CMm5qzBSo27joFATe/dbK2SXrq9/i/y2dCGFfETSaiYI6q5Rp7jhDbWg== +"@inquirer/input@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.1.0.tgz#5ff7028245acd9fa9a25e8a04d71611f76bd82ba" + integrity sha512-o57pST+xxZfGww1h4G7ISiX37KlLcajhKgKGG7/h8J6ClWtsyqwMv1el9Ds/4geuYN/HcPj0MyX9gTEO62UpcA== dependencies: - "@inquirer/core" "^8.0.0" - "@inquirer/type" "^1.3.0" + "@inquirer/core" "^7.1.0" + "@inquirer/type" "^1.2.1" -"@inquirer/select@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.3.0.tgz#7edc17f6502b46a0d320091ae4d9aabed990d662" - integrity sha512-FHZkDUIfGfENxzH/M4tskSWUgRnszKUXb/qlrqbvjwUeFFFSOaWztMkAg4sLwnw2nbT+bdi+WlBn98C/j0NOlQ== +"@inquirer/select@^2.0.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.2.0.tgz#f0a6c523f24a7eefd3b912a2a473a2dc82e561d9" + integrity sha512-Pml3DhVM1LnfqasUMIzaBtw+s5UjM5k0bzDeWrWOgqAMWe16AOg0DcAhXHf+SYbnj2CFBeP/TvkvedL4aAEWww== dependencies: - "@inquirer/core" "^8.0.0" - "@inquirer/figures" "^1.0.0" - "@inquirer/type" "^1.3.0" + "@inquirer/core" "^7.1.0" + "@inquirer/type" "^1.2.1" ansi-escapes "^4.3.2" chalk "^4.1.2" + figures "^3.2.0" -"@inquirer/type@^1.3.0": +"@inquirer/type@^1.2.1": version "1.3.0" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.3.0.tgz#9dcb4e0e8bbec03063aff7806072cc90eea2c61d" integrity sha512-RW4Zf6RCTnInRaOZuRHTqAUl+v6VJuQGglir7nW2BkT3OXOphMhkIFhvFRjorBx2l0VwtC/M4No8vYR65TdN9Q== @@ -2793,27 +2780,27 @@ clsx "^2.1.0" prop-types "^15.8.1" -"@mui/core-downloads-tracker@^5.15.15": - version "5.15.15" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz#2bc2bda50db66c12f10aefec907c48c8f669ef59" - integrity sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg== +"@mui/core-downloads-tracker@^5.15.14": + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz#f7c57b261904831877220182303761c012d05046" + integrity sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA== "@mui/icons-material@^5.0.0", "@mui/icons-material@^5.0.1", "@mui/icons-material@^5.0.2": - version "5.15.15" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.15.15.tgz#84ce08225a531d9f5dc5132009d91164b456a0ae" - integrity sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g== + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.15.14.tgz#333468c94988d96203946d1cfeb8f4d7e8e7de34" + integrity sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw== dependencies: "@babel/runtime" "^7.23.9" "@mui/material@^5.10.17": - version "5.15.15" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.15.15.tgz#e3ba35f50b510aa677cec3261abddc2db7b20b59" - integrity sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA== + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.15.14.tgz#a40bd5eccfa9fc925535e1f4d70c6cef77fa3a75" + integrity sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ== dependencies: "@babel/runtime" "^7.23.9" "@mui/base" "5.0.0-beta.40" - "@mui/core-downloads-tracker" "^5.15.15" - "@mui/system" "^5.15.15" + "@mui/core-downloads-tracker" "^5.15.14" + "@mui/system" "^5.15.14" "@mui/types" "^7.2.14" "@mui/utils" "^5.15.14" "@types/react-transition-group" "^4.4.10" @@ -2842,10 +2829,10 @@ csstype "^3.1.3" prop-types "^15.8.1" -"@mui/system@^5.14.4", "@mui/system@^5.15.14", "@mui/system@^5.15.15": - version "5.15.15" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.15.15.tgz#658771b200ce3c4a0f28e58169f02e5e718d1c53" - integrity sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ== +"@mui/system@^5.14.4", "@mui/system@^5.15.14": + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.15.14.tgz#8a0c6571077eeb6b5f1ff7aa7ff6a3dc4a14200d" + integrity sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg== dependencies: "@babel/runtime" "^7.23.9" "@mui/private-theming" "^5.15.14" @@ -2872,9 +2859,9 @@ react-is "^18.2.0" "@mui/x-data-grid@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-7.2.0.tgz#9f908d695467fbeaa02a3d82d94172b7db7894bc" - integrity sha512-WKmFo0eKhj3W7Fv8u5n2XP4UcdzuJ+mEYALiMUDAYsah/hPBH9mA1miXn9DjXF3i3dxgzrTjdJemTgTJxAQZKg== + version "7.1.0" + resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-7.1.0.tgz#9c8ce9471be543659a20fc1903978fea921e2578" + integrity sha512-VnvX6ZyVUw/cjosh6SvkPtTmukFIa587JHcnWDPnaOijSOg6Zq72xbzEqqwZn9oOZCj88FD7lEDVHUIjoncDvg== dependencies: "@babel/runtime" "^7.24.0" "@mui/system" "^5.15.14" @@ -3042,27 +3029,27 @@ node-gyp "^10.0.0" which "^4.0.0" -"@nrwl/devkit@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.2.4.tgz#9856e8e40e9ad1811a5de6478405ec753d548364" - integrity sha512-dLK8MMb3eEFWlhtI1kNDNbWIT1Xbrgg3eAQ+Ix/N5JDbxJkJhE28WsIJgQb1NTwe/N87O5JtOpxz4/TsSLJCsQ== +"@nrwl/devkit@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.2.1.tgz#4c0e60a5c5e73ca7b2b69a772ecd03630d45892e" + integrity sha512-D//NSihg/hyoinB+CpNMjecwdMIagoQgLlc2HLZtEpmBxM9b3ilX6J7js9HOqEO+jY5YBJWwHg20+qPDYz1Kqw== dependencies: - "@nx/devkit" "18.2.4" + "@nx/devkit" "18.2.1" -"@nrwl/tao@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.2.4.tgz#fe5d115f7d24a64e2a561c5d5df3bdcf19b3566e" - integrity sha512-kgJwZ26F+AzvFXaW5eh1g4HLntPcJ6+EE7JyEvrdRzpw7KxTqWy6Ql7dYys6zGlpP4c3PbsXwdc7tGM3Df2PNg== +"@nrwl/tao@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.2.1.tgz#dfa24e2d02c7c17f3c8dc296544947dd56bf7293" + integrity sha512-QOk9pCNBtu8Qk8Cr7WVbI4+Q/PdxXX+nWMU+xk1KyTjH+XYdAvVksrMqFndPAThIsPvC1fP2XCcMCxOX10F3rQ== dependencies: - nx "18.2.4" + nx "18.2.1" tslib "^2.3.0" -"@nx/devkit@18.2.4", "@nx/devkit@>=17.1.2 < 19": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.2.4.tgz#3feeedf70772f93030c5e808a60f31428a111217" - integrity sha512-Ws3BcA/aeXuwsCQ5e7PYy2H7DswareTOEfgs7izxNyGugpydktVH9DZZTOFNDsc06yzgvyTucDbDQ+JsrJ9PcQ== +"@nx/devkit@18.2.1", "@nx/devkit@>=17.1.2 < 19": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.2.1.tgz#ea409c13be5fde073eee7378194b069c997764c0" + integrity sha512-zEWm/lYgD0fHUU2Qgdd1OkIuBDbp8sCIiwv0iMITJy9CZf+fxg3rzRaUwVSbIXXSdeaSIFT75WI4zoI+7EQ/9w== dependencies: - "@nrwl/devkit" "18.2.4" + "@nrwl/devkit" "18.2.1" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -3071,57 +3058,91 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/nx-darwin-arm64@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.4.tgz#594dd0d475293f5767eb68a6ec5cb7d1b54a3177" - integrity sha512-RYhMImghdyHmwnbNoR2CkLz4Opj9EmuHY3lMfsorg+T4wIOql/iXACrqjnreN7Hy9myJDo1EIbYZ4x8VSxFWtA== - -"@nx/nx-darwin-x64@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.4.tgz#7d3e498440067643ee5f938d7e1ac41ac29761d1" - integrity sha512-2mXMslSRD/ZoI/oaX+0Mh9J/hucXtNgdwC4YFbp1u8UKquAaQ6hf4uo0s4i+AfLX0F7roMtkFPaG/+MQUJE1Rw== - -"@nx/nx-freebsd-x64@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.4.tgz#ac0414909b1ff5e99fb35e7b69e795baf6755bed" - integrity sha512-QUiYLvyUT0PS7D8erf49xa1Jyw4Gfev5gtYfME34Twmn/JPx/99ZkBG4wHbzLqRGwlO5K6m6P4qs30Pzfwtw7A== - -"@nx/nx-linux-arm-gnueabihf@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.4.tgz#ca04b00b65e3692da822708cdb6efc0921d8b04a" - integrity sha512-+fjFciSUhvDV8dPa97Brwb83k3Xa4gHPI2Un8wlpp28Cv4horeGruRZrrifR1VmD2wp2UBIMl5n7YsDP8KvYhQ== - -"@nx/nx-linux-arm64-gnu@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.4.tgz#b9b708d8a189bb70cd7bf0eb58bdc4a5c0690785" - integrity sha512-lfaTc+AvV56Uv5mXROiRwh2REiI/7IsqeRDfL+prcuuvJ5Oxi2wYVgnmqcHL+ryQnk0Qn7/d+j/BmYHX5Ve5jQ== - -"@nx/nx-linux-arm64-musl@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.4.tgz#229f82776c0fcfc86b906bed36e3f8527d20c31c" - integrity sha512-U6eoLTQmbxUWU9kZxx6hsYN4zmmOrsDDeW+i3aj5aeahfYlmyz6TsT0V3FSB70WGJC5aMVgEi4RkntQMKkm5vQ== - -"@nx/nx-linux-x64-gnu@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.4.tgz#34f02b4578da3924df11a8c50e68026ad70f0641" - integrity sha512-q8WcJhmcRNORkKjax6WcUwMJe/1mQs+RYlUkGqmi7tD7lfcLSqdLPJVjqVmQAwmy1Wh/MHPsbqRwSerUnCxB1A== - -"@nx/nx-linux-x64-musl@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.4.tgz#0cc6f7195203d1aa87de5de2d97e03d537829af8" - integrity sha512-0MDuoPgHa6kkBrjg7hwZ2qQivhJbh3lk7r3q4osDrqZcGxq5XVJqeAmYFyChQy4dbQfUm4hhYkEfzpU8M2lnvQ== - -"@nx/nx-win32-arm64-msvc@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.4.tgz#100df4c69c85e894d643803dc1ac73c82168b5da" - integrity sha512-uLhSRtfnXzN000Qf27GOjEPXzd4/jBWqv2x419IMh+AEtKHuCEpQNBUAyLvBbQ79SMr+FmCXHB8AeeJ7bEUiRw== - -"@nx/nx-win32-x64-msvc@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.4.tgz#8e7eb0f9c7bee12977f37ebddc935463d9251793" - integrity sha512-Y52Afz02Ub1kRZXd6NUTwPMjKQqBKZ35e5dUEpl14na2fWvdgdMz4bYOBPUcmQrovlxBGhmFXtFzxkdW3zyRbQ== - -"@oclif/core@^3.22.0", "@oclif/core@^3.26.0", "@oclif/core@^3.26.2", "@oclif/core@^3.26.3": +"@nx/nx-darwin-arm64@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.1.tgz#b59468e4c82bd5d83044fa683cb099a94b5a6306" + integrity sha512-s6ilEYpzyBoeyjM4PkK0nOPWu2uBL2TPDAVIwVh7J2RuM3xINy45zgbmYBUwC4JZUCSJv7e0GQ7OpxEQVlOjDA== + +"@nx/nx-darwin-x64@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.1.tgz#7f643015ff2cd2df73eb6f488bca4292c039be66" + integrity sha512-WpsnI+Z4qfqs0uyFyERLGKZSw3OIpKx3yr7fgFEyfUQS9pqIzqngh2gnoAnf/eYHKBZ2GNPjJ1n+fPHIuLP/dw== + +"@nx/nx-freebsd-x64@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.1.tgz#e694bc8fc7e39112652f173ebd104b06c27b09b6" + integrity sha512-AnbYoxvGHQPDXA5A+nPsVTYEQnXayKnC+NLUcxwoH5gW0Io4oBpck+RW4yf8Dt3zoB/RUw4X/TMKPAMXbD7HuA== + +"@nx/nx-linux-arm-gnueabihf@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.1.tgz#6b6d72518d55b046add163429a8aaa93845fabff" + integrity sha512-01M5fq1hYQQPlSJ7VIJ+ADmadlRvrvrOngbhBWPdWM70XKNz46Z8Z8JrOq1n67QviAPwIYELBMR2c8Bi/NU7FQ== + +"@nx/nx-linux-arm64-gnu@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.1.tgz#91cc02c62c0113cf0d50ffabd5cdd6e743661f2e" + integrity sha512-mQf0/NAAYDrvhhkHbw8/xFiIJ8ldzMxT0sHe2syYbWdnAYWxbXUlDvaalHgILZNiELNsLopbZ6zyKbyj7gTMbw== + +"@nx/nx-linux-arm64-musl@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.1.tgz#e893f35e17f3b458d5abefd6d22b34199a2f4855" + integrity sha512-iP2vKQfiCNNUZm81jbIVz2IshtyUUFw7BLi4vTWYIxcknbRJIchNb0dubJBmJUx4593z3O3wst252rg2QlP+cw== + +"@nx/nx-linux-x64-gnu@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.1.tgz#50fcb0398506070a7674c52fbb788b4da3b406d5" + integrity sha512-LHO+MlMgnm/v1CR0E/UfCUD9bfQWrA8btohv1ju/uHw32wW5P/MiMuLk0jrythWk++NZxpMzBIqcZrO2AcQgUg== + +"@nx/nx-linux-x64-musl@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.1.tgz#0d68185b8e2c809097714c0e35dec6decf82d86a" + integrity sha512-dXNf2P5bRg+u+xDCkqmmP5OABlHZ+zw7D5++uOnGT0D3Y9ZfNl7LVrTqKrTAFJlR6Ycb4ffjhauXF5Yh2tedeA== + +"@nx/nx-win32-arm64-msvc@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.1.tgz#6c0aeb65f593a764c87f01adaad6d1d9182f3dbb" + integrity sha512-6Dt3/qU2qKwzfXeaB+dS+oEasMbC16ZMC7E6pZTsiXqyjkh25lomiOYLBxBlHdGR4M06CzhFI3Vxtk8Hr7ltuQ== + +"@nx/nx-win32-x64-msvc@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.1.tgz#5027e833c368a15609d24ae11df9c077d9d0f7ff" + integrity sha512-FsX7Y22WezvH+Z2sUUXSTKUyG8MGL7ObmIRTZxacY2sV1IiaXY5i3J/46AKkJ+lfp6ALULJ4lRlLwXo9jDHbiA== + +"@oclif/core@^3.21.0", "@oclif/core@^3.22.0", "@oclif/core@^3.26.0": + version "3.26.0" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-3.26.0.tgz#959d5e9f13f4ad6a4e98235ad125189df9ee4279" + integrity sha512-TpMdfD4tfA2tVVbd4l0PrP02o5KoUXYmudBbTC7CeguDo/GLoprw4uL8cMsaVA26+cbcy7WYtOEydQiHVtJixA== + dependencies: + "@types/cli-progress" "^3.11.5" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.12.0" + color "^4.2.3" + debug "^4.3.4" + ejs "^3.1.9" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + minimatch "^9.0.3" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.3" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/core@^3.26.2", "@oclif/core@^3.26.3": version "3.26.3" resolved "https://registry.yarnpkg.com/@oclif/core/-/core-3.26.3.tgz#2416f4f5e3e5b9434999edb2f94983c5ac07e8a2" integrity sha512-e6Vwu+cb2Sn4qFFpmY1fQLRWIY5ugruMuN94xb7+kyUzxrirYjJATPhuCT1G5xj9Dk+hTMH+Sp6XcHcVTS1lHg== @@ -3155,7 +3176,7 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@oclif/plugin-help@^6.0.15", "@oclif/plugin-help@^6.0.21": +"@oclif/plugin-help@^6.0.15", "@oclif/plugin-help@^6.0.18": version "6.0.21" resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.0.21.tgz#c48e688bf6df574e74557ebe2f877556f08dc60b" integrity sha512-w860r9d456xhw1GPaos9yQF+BZeFY9UKdrINbL3fZFX5ZHhr/zGT4Fep5wUkHogjjnSB8+ZHi3D6j2jScIizUw== @@ -3163,12 +3184,12 @@ "@oclif/core" "^3.26.2" "@oclif/plugin-not-found@^3.0.14": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.1.4.tgz#76418b994fbba7347e8dfb0125cd01c3d05f3466" - integrity sha512-2YzBCBhieiu3BXjsmyb5jGs1ivYVxLG/3pSbPvo5oJGi5D5SWB038v4y61PzrUZ+2LWPLBfDQIMWccoI2r7cew== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.1.1.tgz#4ac43cc2485d0ea75454e8518edf57a5ddadedf7" + integrity sha512-F582PxBvViD9ksUeJPh1mvsHEL2mdrnEUQ7UZ0BIsw//nmTxOcssWvhMMOxCbLIAp4M/SG1fUL8c7MBXzc/D7Q== dependencies: - "@inquirer/confirm" "^3.1.4" - "@oclif/core" "^3.26.3" + "@inquirer/confirm" "^3.0.0" + "@oclif/core" "^3.26.0" chalk "^5.3.0" fast-levenshtein "^3.0.0" @@ -3184,11 +3205,11 @@ lodash.template "^4.5.0" "@oclif/test@^3.2.1": - version "3.2.10" - resolved "https://registry.yarnpkg.com/@oclif/test/-/test-3.2.10.tgz#48fdf3ebb339e81955a42c1e9a23f5f673c39261" - integrity sha512-9h6rMHnFS7zf0CLmfqtbAmdDSLpYF8otu25YpeqQXOX3b9TYeyfOvD61TkkxJ2T3zpqnrViNzifsF6gfM6xanQ== + version "3.2.8" + resolved "https://registry.yarnpkg.com/@oclif/test/-/test-3.2.8.tgz#ce2388e1910d315005c6a66fbde8cffaf1b77a20" + integrity sha512-aC523gJxzRxzL1P1m2Mrdu/xl0FG+ho8GAcZtdUKNOMM6te2iwR481GRzs8B0xDtAPNi0jZWiPFetbyR7mh/kA== dependencies: - "@oclif/core" "^3.26.3" + "@oclif/core" "^3.26.0" chai "^4.4.1" fancy-test "^3.0.14" @@ -3529,16 +3550,16 @@ "@smithy/util-middleware" "^2.2.0" tslib "^2.6.2" -"@smithy/core@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-1.4.2.tgz#1c3ed886d403041ce5bd2d816448420c57baa19c" - integrity sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA== +"@smithy/core@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-1.4.0.tgz#5f9f86b681b9cbf23904041dad6f0531efe8375e" + integrity sha512-uu9ZDI95Uij4qk+L6kyFjdk11zqBkcJ3Lv0sc6jZrqHvLyr0+oeekD3CnqMafBn/5PRI6uv6ulW3kNLRBUHeVw== dependencies: - "@smithy/middleware-endpoint" "^2.5.1" - "@smithy/middleware-retry" "^2.3.1" + "@smithy/middleware-endpoint" "^2.5.0" + "@smithy/middleware-retry" "^2.2.0" "@smithy/middleware-serde" "^2.3.0" "@smithy/protocol-http" "^3.3.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/util-middleware" "^2.2.0" tslib "^2.6.2" @@ -3672,6 +3693,19 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/middleware-endpoint@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz#9f1459e9b4cbf00fadfd99e98f88d4b1a2aeb987" + integrity sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA== + dependencies: + "@smithy/middleware-serde" "^2.3.0" + "@smithy/node-config-provider" "^2.3.0" + "@smithy/shared-ini-file-loader" "^2.4.0" + "@smithy/types" "^2.12.0" + "@smithy/url-parser" "^2.2.0" + "@smithy/util-middleware" "^2.2.0" + tslib "^2.6.2" + "@smithy/middleware-endpoint@^2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz#1333c58304aff4d843e8ef4b85c8cb88975dd5ad" @@ -3685,20 +3719,20 @@ "@smithy/util-middleware" "^2.2.0" tslib "^2.6.2" -"@smithy/middleware-retry@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz#d6fdce94f2f826642c01b4448e97a509c4556ede" - integrity sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA== +"@smithy/middleware-retry@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.2.0.tgz#ff48ac01ad57394eeea15a0146a86079cf6364b7" + integrity sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA== dependencies: "@smithy/node-config-provider" "^2.3.0" "@smithy/protocol-http" "^3.3.0" "@smithy/service-error-classification" "^2.1.5" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" "@smithy/util-middleware" "^2.2.0" "@smithy/util-retry" "^2.2.0" tslib "^2.6.2" - uuid "^9.0.1" + uuid "^8.3.2" "@smithy/middleware-serde@^2.3.0": version "2.3.0" @@ -3785,11 +3819,12 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@smithy/signature-v4@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.3.0.tgz#c30dd4028ae50c607db99459981cce8cdab7a3fd" - integrity sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q== +"@smithy/signature-v4@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.2.0.tgz#8fe6a574188b71fba6056111b88d50c84babb060" + integrity sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg== dependencies: + "@smithy/eventstream-codec" "^2.2.0" "@smithy/is-array-buffer" "^2.2.0" "@smithy/types" "^2.12.0" "@smithy/util-hex-encoding" "^2.2.0" @@ -3798,7 +3833,7 @@ "@smithy/util-utf8" "^2.3.0" tslib "^2.6.2" -"@smithy/smithy-client@^2.5.1": +"@smithy/smithy-client@^2.5.0": version "2.5.1" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.5.1.tgz#0fd2efff09dc65500d260e590f7541f8a387eae3" integrity sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ== @@ -3864,27 +3899,27 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.1.tgz#9db31416daf575d2963c502e0528cfe8055f0c4e" - integrity sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw== +"@smithy/util-defaults-mode-browser@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz#963a9d3c3351272764dd1c5dc07c26f2c8abcb02" + integrity sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g== dependencies: "@smithy/property-provider" "^2.2.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz#4613210a3d107aadb3f85bd80cb71c796dd8bf0a" - integrity sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA== +"@smithy/util-defaults-mode-node@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz#5005058ca0a299f0948b47c288f7c3d4f36cb26e" + integrity sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw== dependencies: "@smithy/config-resolver" "^2.2.0" "@smithy/credential-provider-imds" "^2.3.0" "@smithy/node-config-provider" "^2.3.0" "@smithy/property-provider" "^2.2.0" - "@smithy/smithy-client" "^2.5.1" + "@smithy/smithy-client" "^2.5.0" "@smithy/types" "^2.12.0" tslib "^2.6.2" @@ -3959,54 +3994,54 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@storybook/addon-actions@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.0.8.tgz#0b625b36e738a3b02c25d7b0b0b9f28c4e68c918" - integrity sha512-F3qpN0n53d058EroW1A2IlzrsFNR5p2srLY4FmXB80nxAKV8oqoDI4jp15zYlf8ThcJoQl36plT8gx3r1BpANA== +"@storybook/addon-actions@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.0.5.tgz#a3b6cb4ab319c200b498c379ff54672e460a1ce7" + integrity sha512-l1UBvD61DRcfuBTkdqMp2K+60M1QpvhNpYxMmJ/JEYQjzWTg/s9gLmX8eSjgA5bi0sjjJ5i1ddr9d8nHrmwfPA== dependencies: - "@storybook/core-events" "8.0.8" + "@storybook/core-events" "8.0.5" "@storybook/global" "^5.0.0" "@types/uuid" "^9.0.1" dequal "^2.0.2" polished "^4.2.2" uuid "^9.0.0" -"@storybook/addon-backgrounds@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.0.8.tgz#da119e0fa0f0c6d44c2c44c34b9861953fedd653" - integrity sha512-lrAJjVxDeXSK116rDajb56TureZiT76ygraP22/IvU3IcWCEcRiKYwlay8WgCTbJHtFmdBpelLBapoT46+IR9Q== +"@storybook/addon-backgrounds@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.0.5.tgz#d96c2a7f92d5ec4be720d951f21511e20d2db2be" + integrity sha512-XKSnJm6bGVkG9hv6VSK+djz7ZbxEHwVpsSEUKtOEt/ScLFxU0mlsH8dd5aMy9/MAYuB93Y+bJ2SR5kyOjmi1zQ== dependencies: "@storybook/global" "^5.0.0" memoizerific "^1.11.3" ts-dedent "^2.0.0" -"@storybook/addon-controls@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.0.8.tgz#1c8e39ee9ac71704c60da79b363977006d587d75" - integrity sha512-7xANN18CLYsVthuSXwxKezqpelEKJlT9xaYLtw5vvD00btW5g3vxq+Z/A31OkS2OuaH2bE0GfRCoG2OLR8yQQA== +"@storybook/addon-controls@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.0.5.tgz#5e67ad43959002f26667f5daf5ca8bf8c7008c98" + integrity sha512-iUL89OJQse9DlZkwY8jhyl12L/qziUkwbdSgQJxRIEceW6vrHAmc5VGwneS7N3pBuiOIKQQmMhAQ660JXHM7eQ== dependencies: - "@storybook/blocks" "8.0.8" + "@storybook/blocks" "8.0.5" lodash "^4.17.21" ts-dedent "^2.0.0" -"@storybook/addon-docs@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.0.8.tgz#0b5a7e60e32d955f42f3fcae9197e2de06946af4" - integrity sha512-HNiY4ESH9WxGS6QpIpURzdSbyDxbRh7VIgbvUrePSKajlsL4RFN/gdnn5TnSL00tOP/w+Cy/fXcbljMUKy7Ivg== +"@storybook/addon-docs@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.0.5.tgz#fd718a50d30c10b8aff3687348c5b46d098043f4" + integrity sha512-FMlJLPjyNpqY68/9SJH7350/ncySKMGBQQAQnPrMtGVBld8eeOo3DB+GSffOSbmitomq+t16HOprvPSekTMlPw== dependencies: "@babel/core" "^7.12.3" "@mdx-js/react" "^3.0.0" - "@storybook/blocks" "8.0.8" - "@storybook/client-logger" "8.0.8" - "@storybook/components" "8.0.8" - "@storybook/csf-plugin" "8.0.8" - "@storybook/csf-tools" "8.0.8" + "@storybook/blocks" "8.0.5" + "@storybook/client-logger" "8.0.5" + "@storybook/components" "8.0.5" + "@storybook/csf-plugin" "8.0.5" + "@storybook/csf-tools" "8.0.5" "@storybook/global" "^5.0.0" - "@storybook/node-logger" "8.0.8" - "@storybook/preview-api" "8.0.8" - "@storybook/react-dom-shim" "8.0.8" - "@storybook/theming" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/node-logger" "8.0.5" + "@storybook/preview-api" "8.0.5" + "@storybook/react-dom-shim" "8.0.5" + "@storybook/theming" "8.0.5" + "@storybook/types" "8.0.5" "@types/react" "^16.8.0 || ^17.0.0 || ^18.0.0" fs-extra "^11.1.0" react "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -4016,77 +4051,77 @@ ts-dedent "^2.0.0" "@storybook/addon-essentials@^8.0.0": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.0.8.tgz#b3e07dbce5fd8d903597b94a1ec99c4c08cd5472" - integrity sha512-bc9KJk7SPM2I5CCJEAP8R5leP+74IYxhWPiTN8Y1YFmf3MA1lpDJbwy+RfuRZ2ZKnSKszCXCVzU/T10HKUHLZw== - dependencies: - "@storybook/addon-actions" "8.0.8" - "@storybook/addon-backgrounds" "8.0.8" - "@storybook/addon-controls" "8.0.8" - "@storybook/addon-docs" "8.0.8" - "@storybook/addon-highlight" "8.0.8" - "@storybook/addon-measure" "8.0.8" - "@storybook/addon-outline" "8.0.8" - "@storybook/addon-toolbars" "8.0.8" - "@storybook/addon-viewport" "8.0.8" - "@storybook/core-common" "8.0.8" - "@storybook/manager-api" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/preview-api" "8.0.8" + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.0.5.tgz#53992c730ec8f945850e6dece13ab694795d14de" + integrity sha512-1yjwf9ibKn2rVqv+fqxACoIjsaUsimSEx8QwjIl2krDNhMULXzFeVubTQ09gXSVEnHUR1nKX3X9qOXJQ2bOFlQ== + dependencies: + "@storybook/addon-actions" "8.0.5" + "@storybook/addon-backgrounds" "8.0.5" + "@storybook/addon-controls" "8.0.5" + "@storybook/addon-docs" "8.0.5" + "@storybook/addon-highlight" "8.0.5" + "@storybook/addon-measure" "8.0.5" + "@storybook/addon-outline" "8.0.5" + "@storybook/addon-toolbars" "8.0.5" + "@storybook/addon-viewport" "8.0.5" + "@storybook/core-common" "8.0.5" + "@storybook/manager-api" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/preview-api" "8.0.5" ts-dedent "^2.0.0" -"@storybook/addon-highlight@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.0.8.tgz#e4c1d2df7d4b4e325a007e4a7de5042cc5101625" - integrity sha512-KKD7xiNhxZQM4fdDidtcla6jSzgN1f9qe1AwFSHLXwIW22+4c97Vgf+AookN7cJvB77HxRUnvQH//zV1CJEDug== +"@storybook/addon-highlight@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.0.5.tgz#896ad48d7402e8bc95e45e1e678045dde1cbd92b" + integrity sha512-z4Aad6Dcf9gQIEPkR8WVIdRj/5RARI6SeIX3JRJoZ4l6fu7AvTZKDWPRpwLXSpEQqdeOb7l7FrZHISmXdrPoiQ== dependencies: "@storybook/global" "^5.0.0" -"@storybook/addon-measure@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.0.8.tgz#297834f54331bcfd50b28cc935844ff13ba3aff9" - integrity sha512-akyoa+1F2ripV6ELF2UbxiSHv791LWSAVK7gsD/a5eJfKZMm5yoHjcY7Icdkc/ctE+pyjAQNhkXTixUngge09w== +"@storybook/addon-measure@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.0.5.tgz#abd357e3a03ba1d7b9ea9685dd7e1f4cee7d0876" + integrity sha512-B5c33aREHbTA+An7Q5Q1yEXUB0ETE5yPnGgsXuxVl6LyYqyqjai1qE48vcmkA7S+vt5MR6Sf9Lmy3UL+kkyYzQ== dependencies: "@storybook/global" "^5.0.0" tiny-invariant "^1.3.1" -"@storybook/addon-outline@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.0.8.tgz#3441617f7f9246be1958ae3ce421bb4f691860ec" - integrity sha512-8Gxs095ekpa5YZolLSs5cWbWK94GZTevEUX8GFeLGIz9sf1KO3kmEO3eC5ogzDoB0cloqvbmVAJvYJ3FWiUx8w== +"@storybook/addon-outline@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.0.5.tgz#af5dcf0214a29f8fb48afd913ce3092ed7754671" + integrity sha512-ouQ4IOBw7AAyukkaQwNe2MRTpDbCv+j4z76BRE7qvu9PckifsWsm00pTQwvbNdjiogS8c3EPMV5aBGIPoK/zAQ== dependencies: "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.0.8.tgz#64d54974941633aef1814d557275127de1a7da9d" - integrity sha512-PZxlK+/Fwk2xcrpr5kkXYjCbBaEjAWcEHWq7mhQReMFaAs5AJE8dvmeQ7rmPDOHnlg4+YsARDFKz5FJtthRIgg== +"@storybook/addon-toolbars@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.0.5.tgz#93625e39f31327199eb9bed78261c5ab4ac52895" + integrity sha512-1QrvHtsQI1RNzDrkTMUFaEzZRRKHYrkj/rYpf6B2QyFvaZ6XY4urxSrmssLENuPsoDF4ABU2j6j4BAUgWjIe4A== -"@storybook/addon-viewport@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.0.8.tgz#ed7a7fa0a9b89cc27130a549c3bea9a91404472c" - integrity sha512-nOuc6DquGvm24c/A0HFTgeEN/opd58ebs1KLaEEq1f6iYV0hT2Gpnk0Usg/seOiFtJnj3NyAM46HSkZz06T8Sw== +"@storybook/addon-viewport@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.0.5.tgz#bfa508a181927222a73e317b2fcad16d31caae53" + integrity sha512-Y2sTsNeQctfLBPQYuOjMGSQY4lUycZRZblToU0q6siJ030QjgpuEMcu1yDt654T6jnp/s4VwRS6yaZHnqZ97Mw== dependencies: memoizerific "^1.11.3" -"@storybook/blocks@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.0.8.tgz#b31e01f53d534eed5380917ffce2a4a213496f9e" - integrity sha512-kwsjhvnmFEaIl51QHJt/83G7mZ5YbzFKnWCwy8WUpi0xvVcyoFQSGGgwR3XRrzGfUEPK8P2FDHeKw1bLzyIejA== +"@storybook/blocks@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.0.5.tgz#74e68f9c0508740888f92d78104959e24716e220" + integrity sha512-zfcwJ0yE5HM28BxZeNU4SYF8zxq2PEqLP1aWCdRuZT9k8lgnBwAKzlvt50LtPzOfGtKuGnvIEriELx/i+Qh4Sw== dependencies: - "@storybook/channels" "8.0.8" - "@storybook/client-logger" "8.0.8" - "@storybook/components" "8.0.8" - "@storybook/core-events" "8.0.8" + "@storybook/channels" "8.0.5" + "@storybook/client-logger" "8.0.5" + "@storybook/components" "8.0.5" + "@storybook/core-events" "8.0.5" "@storybook/csf" "^0.1.2" - "@storybook/docs-tools" "8.0.8" + "@storybook/docs-tools" "8.0.5" "@storybook/global" "^5.0.0" "@storybook/icons" "^1.2.5" - "@storybook/manager-api" "8.0.8" - "@storybook/preview-api" "8.0.8" - "@storybook/theming" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/manager-api" "8.0.5" + "@storybook/preview-api" "8.0.5" + "@storybook/theming" "8.0.5" + "@storybook/types" "8.0.5" "@types/lodash" "^4.14.167" color-convert "^2.0.1" dequal "^2.0.2" @@ -4100,15 +4135,15 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/builder-manager@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/builder-manager/-/builder-manager-8.0.8.tgz#23ed7b13aa98662ccc6bd1fb5525246a4469bd33" - integrity sha512-0uihNTpTou0RFMM6PQLlfCxDxse9nIDEb83AmWE/OUnpKDDY9+WFupVWGaZc9HfH9h4Yqre2fiuK1b7KNYe7AQ== +"@storybook/builder-manager@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/builder-manager/-/builder-manager-8.0.5.tgz#90eac812ad706e9a642dbc5aef54a7940388e8d7" + integrity sha512-63gIHfgdhpL3rcHkOcGm29PbIkgx2bLRxi2RYa0osGMtfBIePFXJh7nol+4KpaRkNR8RZg+N9omVGjyhLj7IWg== dependencies: "@fal-works/esbuild-plugin-global-externals" "^2.1.2" - "@storybook/core-common" "8.0.8" - "@storybook/manager" "8.0.8" - "@storybook/node-logger" "8.0.8" + "@storybook/core-common" "8.0.5" + "@storybook/manager" "8.0.5" + "@storybook/node-logger" "8.0.5" "@types/ejs" "^3.1.1" "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10" browser-assert "^1.2.1" @@ -4120,19 +4155,19 @@ process "^0.11.10" util "^0.12.4" -"@storybook/builder-webpack5@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.0.8.tgz#78649eeae401eaae4d9d76f6197d0211242b096e" - integrity sha512-NG7XHNSZ0+1DtHYhE36vDtXlZHVUUjC0TqqYQ3+On6Ormih80MndbmPjL6XhfleES8YzG28MhNePdOY867rehg== - dependencies: - "@storybook/channels" "8.0.8" - "@storybook/client-logger" "8.0.8" - "@storybook/core-common" "8.0.8" - "@storybook/core-events" "8.0.8" - "@storybook/core-webpack" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/preview" "8.0.8" - "@storybook/preview-api" "8.0.8" +"@storybook/builder-webpack5@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.0.5.tgz#64343ba374bb3e73ad84de642aca87e5c0970d19" + integrity sha512-tt7ZrRscsg+AJayOLXYCsDleNzNy0UHjfs7FnDzh331Ulyt2WeGkcELTZmHnBg5WwVBgjGTYmxYKSgGXF0hKXQ== + dependencies: + "@storybook/channels" "8.0.5" + "@storybook/client-logger" "8.0.5" + "@storybook/core-common" "8.0.5" + "@storybook/core-events" "8.0.5" + "@storybook/core-webpack" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/preview" "8.0.5" + "@storybook/preview-api" "8.0.5" "@types/node" "^18.0.0" "@types/semver" "^7.3.4" browser-assert "^1.2.1" @@ -4156,37 +4191,37 @@ util "^0.12.4" util-deprecate "^1.0.2" webpack "5" - webpack-dev-middleware "^6.1.2" + webpack-dev-middleware "^6.1.1" webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.5.0" -"@storybook/channels@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-8.0.8.tgz#571b1ff9a58ae01a2172c877d87b1398d95c5579" - integrity sha512-L3EGVkabv3fweXnykD/GlNUDO5HtwlIfSovC7BF4MmP7662j2/eqlZrJxDojGtbv11XHjWp/UJHUIfKpcHXYjQ== +"@storybook/channels@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-8.0.5.tgz#85744e03c18366b45a5e108c25cd9975d9828bf2" + integrity sha512-UWzjt4STzBgg28Q6FxqyJWwXLWYM6oSz9gGKMUJbn2vRAlEJaG3XwvpT39YFVDUIuiFSHguV5cisXY5Be4nOZw== dependencies: - "@storybook/client-logger" "8.0.8" - "@storybook/core-events" "8.0.8" + "@storybook/client-logger" "8.0.5" + "@storybook/core-events" "8.0.5" "@storybook/global" "^5.0.0" telejson "^7.2.0" tiny-invariant "^1.3.1" -"@storybook/cli@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-8.0.8.tgz#e1c73a9c009823fdda795f3c3cf074a7fef8ea91" - integrity sha512-RnSdgykh2i7es1rQ7CNGpDrKK/PN1f0xjwpkAHXCEB6T9KpHBmqDquzZp+N127a1HBHHXy018yi4wT8mSQyEoA== +"@storybook/cli@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-8.0.5.tgz#a42ac6f27c8b06e6a49c9f24d3b36b7ac32cb61c" + integrity sha512-6t0d2ILXonC7bsq6Dx6tFTls2a/JeOR7lr3UgoVaiFu5l1M5pOB6uI9JG14F+UmsCifXGJdvxR38CBwVSKtg/Q== dependencies: "@babel/core" "^7.23.0" "@babel/types" "^7.23.0" "@ndelangen/get-tarball" "^3.0.7" - "@storybook/codemod" "8.0.8" - "@storybook/core-common" "8.0.8" - "@storybook/core-events" "8.0.8" - "@storybook/core-server" "8.0.8" - "@storybook/csf-tools" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/telemetry" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/codemod" "8.0.5" + "@storybook/core-common" "8.0.5" + "@storybook/core-events" "8.0.5" + "@storybook/core-server" "8.0.5" + "@storybook/csf-tools" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/telemetry" "8.0.5" + "@storybook/types" "8.0.5" "@types/semver" "^7.3.4" "@yarnpkg/fslib" "2.10.3" "@yarnpkg/libzip" "2.3.0" @@ -4213,25 +4248,25 @@ tiny-invariant "^1.3.1" ts-dedent "^2.0.0" -"@storybook/client-logger@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-8.0.8.tgz#351cc47629e91f188c6862038bf3a13cabb7d034" - integrity sha512-a4BKwl9NLFcuRgMyI7S4SsJeLFK0LCQxIy76V6YyrE1DigoXz4nA4eQxdjLf7JVvU0EZFmNSfbVL/bXzzWKNXA== +"@storybook/client-logger@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-8.0.5.tgz#8cafa514e9a9af054f926bc179264bef2198c0ce" + integrity sha512-6D7zvPPnLuTVlBNpZSdzEbk5xfWKhEG0gejtPnhjG9R5YzC/dFckdUI0gtvwGWUVMWhL3H/0gjRjhKujUMRY1Q== dependencies: "@storybook/global" "^5.0.0" -"@storybook/codemod@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-8.0.8.tgz#1480bfc7c005ade0ec3181158103c82e70ffdf3f" - integrity sha512-ufEBLciLmLlAh+L6lGgBObTiny6odXMKqiJOewQ9XfIN0wdWdyRUf5QdZIPOdfgHhWF2Q2HeswiulsoHm8Z/hA== +"@storybook/codemod@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-8.0.5.tgz#ab181282633df8e0b3dfaf8d2caafbae513ccd45" + integrity sha512-1ub3RRT+/ziJUdS2rz5UkQWu6teGULxHDMDRFhTrGYHVOgkc/lLnFuF0rgrLxsFdTmKIBTKN2xFfSE7z9Palsg== dependencies: "@babel/core" "^7.23.2" "@babel/preset-env" "^7.23.2" "@babel/types" "^7.23.0" "@storybook/csf" "^0.1.2" - "@storybook/csf-tools" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/csf-tools" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/types" "8.0.5" "@types/cross-spawn" "^6.0.2" cross-spawn "^7.0.3" globby "^11.0.2" @@ -4241,30 +4276,30 @@ recast "^0.23.5" tiny-invariant "^1.3.1" -"@storybook/components@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.0.8.tgz#e189a9eb2891e0677317d8e016c217ff35a8565e" - integrity sha512-EpBExH4kHWQJSfA8QXJJ5AsLRUGi5X/zWY7ffiYW8rtnBmEnk3T9FpmnyJlY1A8sdd3b1wQ07JGBDHfL1mdELw== +"@storybook/components@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.0.5.tgz#e526b4600b4b8049108a1b63e71fee8d75ff8d3d" + integrity sha512-trBWV9gc4YhFhMKUevkBY9Mdk9WmYmthpBfmF0Y2vgrJQidUqkkQqfAMQThSJ0KLpV8k3fB27s5d93rgrr50Rg== dependencies: "@radix-ui/react-slot" "^1.0.2" - "@storybook/client-logger" "8.0.8" + "@storybook/client-logger" "8.0.5" "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" "@storybook/icons" "^1.2.5" - "@storybook/theming" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/theming" "8.0.5" + "@storybook/types" "8.0.5" memoizerific "^1.11.3" util-deprecate "^1.0.2" -"@storybook/core-common@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-8.0.8.tgz#3a6136097559bcfa581a372516f67f13ace85655" - integrity sha512-CL15M2oeQW+Rb1l7ciunLDI2Re+ojL2lX1ZFAiDedcOU+JHsdq43zAuXoZVzp8icUi2AUSwEjZIxGCSingj+JQ== +"@storybook/core-common@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-8.0.5.tgz#694349c26cba7755db9a08f4b01b893ad4d2f6a5" + integrity sha512-WCu2ZPMq1FuO33tYuCPb9joWaZGtJgfKvXXVGLYYg6LufpbWOI+IB7OWmHahtEdKuaNoIr3CEf1p3zm12NNiYA== dependencies: - "@storybook/core-events" "8.0.8" - "@storybook/csf-tools" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/core-events" "8.0.5" + "@storybook/csf-tools" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/types" "8.0.5" "@yarnpkg/fslib" "2.10.3" "@yarnpkg/libzip" "2.3.0" chalk "^4.1.0" @@ -4290,35 +4325,35 @@ ts-dedent "^2.0.0" util "^0.12.4" -"@storybook/core-events@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-8.0.8.tgz#70b606bdcfd153b0e94ded4414069aac89e38419" - integrity sha512-PtuvR7vS4glDEdCfKB4f1k3Vs1C3rTWP2DNbF+IjjPhNLMBznCdzTAPcz+NUIBvpjjGnhKwWikJ0yj931YjSVg== +"@storybook/core-events@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-8.0.5.tgz#fa73281edd7d839439360259a0be48b04cd9a06a" + integrity sha512-26c0m7P7qt9zUKcD1noWLPJmZ+iS6MKXNngUgNBSxTtG20NFV3nxD0/tx9FzNfDVZDF6cHINkWj+FVBAaVuBVQ== dependencies: ts-dedent "^2.0.0" -"@storybook/core-server@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-8.0.8.tgz#2cb60f2ca58720f6257cb70327b93aea8f0df074" - integrity sha512-tSEueEBttbSohzhZVN2bFNlFx3eoqQ7p57cjQLKXXwKygS2qKxISKnFy+Y0nj20APz68Wj51kx0rN0nGALeegw== +"@storybook/core-server@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-8.0.5.tgz#166f703ed838625a92dde340d238675e6fe44dfc" + integrity sha512-aQGHRQZF4jbMqBT0sGptql+S3hiNksi4n6pPJPxGf6TE8TyRA1x7USjmvXHwv59vpmMm9HaRpGWzWCo4SqwNqw== dependencies: "@aw-web-design/x-default-browser" "1.4.126" "@babel/core" "^7.23.9" "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-manager" "8.0.8" - "@storybook/channels" "8.0.8" - "@storybook/core-common" "8.0.8" - "@storybook/core-events" "8.0.8" + "@storybook/builder-manager" "8.0.5" + "@storybook/channels" "8.0.5" + "@storybook/core-common" "8.0.5" + "@storybook/core-events" "8.0.5" "@storybook/csf" "^0.1.2" - "@storybook/csf-tools" "8.0.8" + "@storybook/csf-tools" "8.0.5" "@storybook/docs-mdx" "3.0.0" "@storybook/global" "^5.0.0" - "@storybook/manager" "8.0.8" - "@storybook/manager-api" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/preview-api" "8.0.8" - "@storybook/telemetry" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/manager" "8.0.5" + "@storybook/manager-api" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/preview-api" "8.0.5" + "@storybook/telemetry" "8.0.5" + "@storybook/types" "8.0.5" "@types/detect-port" "^1.3.0" "@types/node" "^18.0.0" "@types/pretty-hrtime" "^1.0.0" @@ -4346,36 +4381,36 @@ watchpack "^2.2.0" ws "^8.2.3" -"@storybook/core-webpack@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.0.8.tgz#bbf4bb37eae32e0ea7bd1faf51a40a281e749b6b" - integrity sha512-wt7Ty2/aVAWSYbtXkpJ/oCi+NKc2SVrZVqqsasdt9IjAS4LTATZ89Ku0u1FKI61OhZbckVXBW5bPXJYibCK24Q== +"@storybook/core-webpack@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.0.5.tgz#f01969cbd256cf7921db516de643825bdeed23e3" + integrity sha512-xGjOgMFPEiQeofXyUM1rlnpqSJ3FVcuPkrbh8rDLC8mTzGeEqqhNH5hluywk1H8UqYlaNrVhPi6/iGWhRUvlgw== dependencies: - "@storybook/core-common" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/core-common" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/types" "8.0.5" "@types/node" "^18.0.0" ts-dedent "^2.0.0" -"@storybook/csf-plugin@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.0.8.tgz#91d5ad52236b7977f193f36c536a460aeae297e9" - integrity sha512-x9WspjZGcqXENj/Vn4Qmn0oTW93KN2V9wqpflWwCUJTByl2MugQsh5xRuDbs2yM7dD6zKcqRyPaTY+GFZBW+Vg== +"@storybook/csf-plugin@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.0.5.tgz#c7e21eb7baf8e29f4d92b2d4fee11364be013cb6" + integrity sha512-R6VjQl+I9k4oc3OfOHOFzz5T20WROHOZ5/zkkFKM/1YUa6QNpMcuStOtr/qcAx+QizmQqmxgJwTFapFBP5yWjg== dependencies: - "@storybook/csf-tools" "8.0.8" + "@storybook/csf-tools" "8.0.5" unplugin "^1.3.1" -"@storybook/csf-tools@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-8.0.8.tgz#04f843bfc3961271adbb3e64be7e5e32396c51f8" - integrity sha512-Ji5fpoGym/MSyHJ6ALghVUUecwhEbN0On+jOZ2VPkrkATi9UDtryHQPdF60HKR63Iv53xRuWRzudB6zm43RTzw== +"@storybook/csf-tools@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-8.0.5.tgz#395163f3240f45ce0298246d9393f68afd59b2b3" + integrity sha512-fW2hAO57ayq7eHjpS5jXy/AKm3oZxApngd9QU/bC800EyTWENwLPxFnHLAE86N57Dc3bcE4PTFCyqpxzE4Uc7g== dependencies: "@babel/generator" "^7.23.0" "@babel/parser" "^7.23.0" "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" "@storybook/csf" "^0.1.2" - "@storybook/types" "8.0.8" + "@storybook/types" "8.0.5" fs-extra "^11.1.0" recast "^0.23.5" ts-dedent "^2.0.0" @@ -4392,14 +4427,14 @@ resolved "https://registry.yarnpkg.com/@storybook/docs-mdx/-/docs-mdx-3.0.0.tgz#5c9b5ce35dcb00ad8aa5dddbabf52ad09fab3974" integrity sha512-NmiGXl2HU33zpwTv1XORe9XG9H+dRUC1Jl11u92L4xr062pZtrShLmD4VKIsOQujxhhOrbxpwhNOt+6TdhyIdQ== -"@storybook/docs-tools@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-8.0.8.tgz#4a46a474dec06ea1f87ea577de5cbfb57f3ce71f" - integrity sha512-p/MIrDshXMl/fiCRlfG9StkRYI1QlUyUSQQ/YDBFlBfWcJYARIt3TIvQyvs3Q/apnQNcDXIW663W57s7WHTO2w== +"@storybook/docs-tools@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-8.0.5.tgz#ae03d181e24f8c4c5fca594b42d204ef5f4f8de4" + integrity sha512-IzQMlsumiBgHAh5TTZTinNcedU98l0S0hczbTgjXQWgTp3//RHO36LYowAeFrB6V9SACYs/Q47iB15K4b2dqUg== dependencies: - "@storybook/core-common" "8.0.8" - "@storybook/preview-api" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/core-common" "8.0.5" + "@storybook/preview-api" "8.0.5" + "@storybook/types" "8.0.5" "@types/doctrine" "^0.0.3" assert "^2.1.0" doctrine "^3.0.0" @@ -4415,20 +4450,20 @@ resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.2.9.tgz#bb4a51a79e186b62e2dd0e04928b8617ac573838" integrity sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg== -"@storybook/manager-api@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.0.8.tgz#e9c2661a8b2fe060076e9bb02fcdc7d498f6caed" - integrity sha512-1HU4nfLRi0sD2uw229gb8EQyufNWrLvMNpg013kBsBXRd+Dj4dqF3v+KrYFNtteY7riC4mAJ6YcQ4tBUNYZDug== +"@storybook/manager-api@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.0.5.tgz#7fdc49803f1507bea97392bfd05760071a19d838" + integrity sha512-2Q+DI9XU1U4EBrihnyfo+kuRK7T3Ce2eSlWEHHkTZ3OYSf+EhFxLUA6AOfMoA1B0nzNEr6SUkW8DBvMrtdTQMA== dependencies: - "@storybook/channels" "8.0.8" - "@storybook/client-logger" "8.0.8" - "@storybook/core-events" "8.0.8" + "@storybook/channels" "8.0.5" + "@storybook/client-logger" "8.0.5" + "@storybook/core-events" "8.0.5" "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" "@storybook/icons" "^1.2.5" - "@storybook/router" "8.0.8" - "@storybook/theming" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/router" "8.0.5" + "@storybook/theming" "8.0.5" + "@storybook/types" "8.0.5" dequal "^2.0.2" lodash "^4.17.21" memoizerific "^1.11.3" @@ -4436,25 +4471,25 @@ telejson "^7.2.0" ts-dedent "^2.0.0" -"@storybook/manager@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-8.0.8.tgz#a90dd62b64348698308738d8a5986f02fb5671e8" - integrity sha512-pWYHSDmgT8p/XbQMKuDPdgB6KzjePI6dU5KQ5MERYfch1UiuGPVm1HHDlxxSfHW0IIXw9Qnwq4L0Awe4qhvJKQ== - -"@storybook/node-logger@8.0.8", "@storybook/node-logger@^8.0.0": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-8.0.8.tgz#12d29cac99ef439aba0050f2fb03894ed4c52c86" - integrity sha512-ymps3MMTxtMWq0eDiXk1iO7iv0Eg0PuUvOpPPohEJauGzU9THv81xx01aaHKSprFFJYD2LMQr1aFuUplItO12g== - -"@storybook/preset-react-webpack@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.0.8.tgz#ccf766d5cc8cd8b8bca5ac96a8c7e0342b67984c" - integrity sha512-ucdSQWE3VzleDprd5pmVbUbPPfkU9yLYvJ9pOO4XZngPY4fZdL3vWMsjhBL/PPs2tQ+pC3s6rWnrOqkSMmJ+7w== - dependencies: - "@storybook/core-webpack" "8.0.8" - "@storybook/docs-tools" "8.0.8" - "@storybook/node-logger" "8.0.8" - "@storybook/react" "8.0.8" +"@storybook/manager@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-8.0.5.tgz#af451f314a0decb206fc35adaafa505cf13859aa" + integrity sha512-eJtf2SaAzOmRV03zn/pFRTqBua8/qy+VDtgaaCFmAyrjsUHO/bcHpbu9vnwP8a+C8ojJnthooi3yz755UTDYYg== + +"@storybook/node-logger@8.0.5", "@storybook/node-logger@^8.0.0": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-8.0.5.tgz#ed2fff319f36fe47f429752499b4c5acf3fb8c9d" + integrity sha512-ssT8YCcCqgc89ee+EeExCxcOpueOsU05iek2roR+NCZnoCL1DmzcUp8H9t0utLaK/ngPV8zatlzSDVgKTHSIJw== + +"@storybook/preset-react-webpack@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.0.5.tgz#ef79904dd2e3450b3588a8413e5eb39df31351e9" + integrity sha512-+V4eEtbsaDcSgRFP6/8ZAUcmyEyF2o6iBVZ72prs2GO4rInrYFMUZZRIXRSvH92x8BurJck2ap9EGjFt08o0Ag== + dependencies: + "@storybook/core-webpack" "8.0.5" + "@storybook/docs-tools" "8.0.5" + "@storybook/node-logger" "8.0.5" + "@storybook/react" "8.0.5" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" "@types/node" "^18.0.0" "@types/semver" "^7.3.4" @@ -4467,17 +4502,17 @@ tsconfig-paths "^4.2.0" webpack "5" -"@storybook/preview-api@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.0.8.tgz#0684226cd822b9266cceced26ce288b91ea6aa02" - integrity sha512-khgw2mNiBrSZS3KNGQPzjneL3Csh3BOq0yLAtJpT7CRSrI/YjlE7jjcTkKzoxW+UCgvNTnLvsowcuzu82e69fA== +"@storybook/preview-api@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.0.5.tgz#789ee9791f04da44a22c1df58067da5914a402e3" + integrity sha512-BSDVTR9/X6DHVA4rIhN6d/SB6PiaRdns8ky/TKTzwFEyO3NOASHe8051O+uNtXzgCtMUj/8imNrTdMTYgUm1LA== dependencies: - "@storybook/channels" "8.0.8" - "@storybook/client-logger" "8.0.8" - "@storybook/core-events" "8.0.8" + "@storybook/channels" "8.0.5" + "@storybook/client-logger" "8.0.5" + "@storybook/core-events" "8.0.5" "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" - "@storybook/types" "8.0.8" + "@storybook/types" "8.0.5" "@types/qs" "^6.9.5" dequal "^2.0.2" lodash "^4.17.21" @@ -4487,10 +4522,10 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/preview@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/preview/-/preview-8.0.8.tgz#4a914fa1a512d664c77a43395453ddc4a229989a" - integrity sha512-J/ooKcvDV1s7ROH7lF/0vOyWDOgDB7bN6vS67J1WK0HLvMGaqUzU+q3ndakGzu0LU/jvUBqEFSZd1ALWyZINDQ== +"@storybook/preview@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/preview/-/preview-8.0.5.tgz#b7ab29774a9e7636086d63243c5f3cdc75e40438" + integrity sha512-D2uY0LTjkGbpNwJJeqtv1NieBTtvt0IEEKH+srMNXOOM+KascTYGbBlEPkYSf5bZdMft5c1GXglVIhJIqTZntg== "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": version "1.0.6--canary.9.0c3f3b7.0" @@ -4505,32 +4540,32 @@ react-docgen-typescript "^2.2.2" tslib "^2.0.0" -"@storybook/react-dom-shim@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.0.8.tgz#28370b050be3e5ebea296efa6bde01a792ac96fd" - integrity sha512-vOMlAz2HH/xfgZmSO28fCEmp5/tPxINDEdBDVLdZeYG6R1j5jlMRyaNcXt4cPNDkyc///PkB/K767hg4goca/Q== +"@storybook/react-dom-shim@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.0.5.tgz#2929cd09ef03d2c6ed47601072c8acc8406579ed" + integrity sha512-KIcLkCml5dIiVeChMyudz8Q/pZ/T86Y1LrHZvYD/t3iXH+HOOvg6KNsY6TZFM93Rqhk10AIEUNCgYzj2/QjddA== "@storybook/react-webpack5@^8.0.0": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.0.8.tgz#f89010ee0fc0d5393bd1ce4d591f3bb89be6f06b" - integrity sha512-7K2hsT2H9B746bxrcFzIfbbaRajWkeZfeL7W8coSODpTUjC78Dno2bZO5FE3O0HdnbhJe2jJhDpJKVhFR0MKiQ== + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.0.5.tgz#e6b88a5a680012bddd8e6106d5cd35a5cecf3a53" + integrity sha512-EFhCxt2oEH69glk5CXMipO/my/EzqF8c4uqriKyiTCQr7wPAFRkEJT3+HaRrjiOiuafwtvxfDQHgTC2fg1DNwA== dependencies: - "@storybook/builder-webpack5" "8.0.8" - "@storybook/preset-react-webpack" "8.0.8" - "@storybook/react" "8.0.8" + "@storybook/builder-webpack5" "8.0.5" + "@storybook/preset-react-webpack" "8.0.5" + "@storybook/react" "8.0.5" "@types/node" "^18.0.0" -"@storybook/react@8.0.8", "@storybook/react@^8.0.0": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.0.8.tgz#04374fd813e87763678c0c34eb1f2b91b01525e4" - integrity sha512-pPTlQntl09kv7qkAFYsxUq6qCLeeZC/K3yGFBGMy2Dc+PFjBYdT6mt2I8GB3twK0Cq5gJESlLj48QnYLQ/9PbA== +"@storybook/react@8.0.5", "@storybook/react@^8.0.0": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.0.5.tgz#bc01882f10f7d3b1f2d07bd4bde0d960d4c6633a" + integrity sha512-Vwq4xt8eSKE/PLPvunOFDlzBki6L3mP7LNVWCLkQba7vzuCOPjSZ0+95v/K8XQn3jVRXAMUnlPW1SKg21aKJdw== dependencies: - "@storybook/client-logger" "8.0.8" - "@storybook/docs-tools" "8.0.8" + "@storybook/client-logger" "8.0.5" + "@storybook/docs-tools" "8.0.5" "@storybook/global" "^5.0.0" - "@storybook/preview-api" "8.0.8" - "@storybook/react-dom-shim" "8.0.8" - "@storybook/types" "8.0.8" + "@storybook/preview-api" "8.0.5" + "@storybook/react-dom-shim" "8.0.5" + "@storybook/types" "8.0.5" "@types/escodegen" "^0.0.6" "@types/estree" "^0.0.51" "@types/node" "^18.0.0" @@ -4547,45 +4582,45 @@ type-fest "~2.19" util-deprecate "^1.0.2" -"@storybook/router@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-8.0.8.tgz#9688ff51590b303725e4db065483ec134dffe571" - integrity sha512-wdFdNsEKweigU9VkGZtpb7GhBJLWzbABcwOuEy2h0d5m7egB97hy9BxhANdqkC+PbAHrabxC99Ca3wTj50MoDg== +"@storybook/router@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-8.0.5.tgz#b2c3e7fc763003a6d74d0b7061e8cb0a78e5bf66" + integrity sha512-1d4CqNJB5sA25HCd7jZ4eVqMsdlD4r4SuFA/eR6fas0lk7yjVCpG1zWfvSSk5tKoVcNLSptc/TYBiSr2rcGRvw== dependencies: - "@storybook/client-logger" "8.0.8" + "@storybook/client-logger" "8.0.5" memoizerific "^1.11.3" qs "^6.10.0" -"@storybook/telemetry@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-8.0.8.tgz#d477d9fcdc5d7a50692d39ba1e061c1e5e500d46" - integrity sha512-Uvj4nN01vQgjXZYKF/GKTFE85//Qm4ZTlJxTFWid+oYWc8NpAyJvlsJkj/dsEn4cLrgnJx2e4xvnx0Umr2ck+A== +"@storybook/telemetry@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-8.0.5.tgz#28c1a854e3a4b0129f5eb318083de3f96ec3151a" + integrity sha512-KTt6wP78dn9hfsc0sR2CcFT/DWJgYqYuFBhc3NDgtT41ATLGgGniCQW9PtKLQc+FMofKejz1S+XXk0W322Pjxg== dependencies: - "@storybook/client-logger" "8.0.8" - "@storybook/core-common" "8.0.8" - "@storybook/csf-tools" "8.0.8" + "@storybook/client-logger" "8.0.5" + "@storybook/core-common" "8.0.5" + "@storybook/csf-tools" "8.0.5" chalk "^4.1.0" detect-package-manager "^2.0.1" fetch-retry "^5.0.2" fs-extra "^11.1.0" read-pkg-up "^7.0.1" -"@storybook/theming@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.0.8.tgz#ef72edf6b7f37c0e7e2d6134eccfdff54618d8c6" - integrity sha512-43hkNz7yo8Bl97AO2WbxIGprUqMhUZyK9g8383bd30gSxy9nfND/bdSdcgmA8IokDn8qp37Q4QmxtUZdhjMzZQ== +"@storybook/theming@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.0.5.tgz#e98aa8b761b93c2cff21213770a1bafb971f2c07" + integrity sha512-Hy4hJaKg6UUyivkUM77nCHccv4/lO++ZG9F88qBFVPdBlCwMHHnUrR7Hgje5cCVAy0jK6LyYlD3cWO6nS9OR8w== dependencies: "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@storybook/client-logger" "8.0.8" + "@storybook/client-logger" "8.0.5" "@storybook/global" "^5.0.0" memoizerific "^1.11.3" -"@storybook/types@8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@storybook/types/-/types-8.0.8.tgz#bf226aad7a3036490359e261607e6f7f234f6c9c" - integrity sha512-NGsgCsXnWlaZmHenHDgHGs21zhweZACkqTNsEQ7hvsiF08QeiKAdgJLQg3YeGK73h9mFDRP9djprUtJYab6vnQ== +"@storybook/types@8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@storybook/types/-/types-8.0.5.tgz#268566058ee2871b13ba42df21abf861e823abf2" + integrity sha512-lYXwYF9qooQhYJkg3HWr6PD/vnQK+iO8fSKS8jtntwgJUKJvTbGZKAhNnS8WzNEI9jIp5QXFsSA367NjIDPaeQ== dependencies: - "@storybook/channels" "8.0.8" + "@storybook/channels" "8.0.5" "@types/express" "^4.7.0" file-system-cache "2.3.0" @@ -4917,9 +4952,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.9" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.9.tgz#403e9ced04a34e63f1c383c5b8ee1a94442c8cc4" - integrity sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg== + version "8.56.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.6.tgz#d5dc16cac025d313ee101108ba5714ea10eb3ed0" + integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -5075,7 +5110,7 @@ resolved "https://registry.yarnpkg.com/@types/json-parse-better-errors/-/json-parse-better-errors-1.0.3.tgz#3f03464a47aa116a54683efdfd1f8c1f46855a31" integrity sha512-wbwigqXeGQq+liQIqxYNylOV4c3ilUqB9czasOS26TSy21Ti1l2Q8c8TEjmaTnc0CgdJDBhIMFJssIbY1FanYA== -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -5100,9 +5135,9 @@ integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== "@types/mdx@^2.0.0": - version "2.0.13" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" - integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.12.tgz#38db34cc8999b982beaec01399620bee6c65ef2e" + integrity sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw== "@types/mime@^1": version "1.3.5" @@ -5146,17 +5181,17 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^20.0.0", "@types/node@^20.12.7", "@types/node@^20.9.0": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== +"@types/node@*", "@types/node@^20.0.0", "@types/node@^20.11.26", "@types/node@^20.9.0": + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== dependencies: undici-types "~5.26.4" "@types/node@^18.0.0": - version "18.19.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" - integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== + version "18.19.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.26.tgz#18991279d0a0e53675285e8cf4a0823766349729" + integrity sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw== dependencies: undici-types "~5.26.4" @@ -5238,9 +5273,9 @@ integrity sha512-lX55lR0iYCgapxD3IrgujpQA1zDxwZI5qMRelKvmKAsSMplFVr7wmMpG7/6+Op2tjrgEex8o3vjg8CRDrRNYxg== "@types/react-dom@^18.0.0": - version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" - integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== + version "18.2.23" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.23.tgz#112338760f622a16d64271b408355f2f27f6302c" + integrity sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A== dependencies: "@types/react" "*" @@ -5259,9 +5294,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^18.0.26": - version "18.2.79" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" - integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== + version "18.2.73" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" + integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -5283,7 +5318,7 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== -"@types/semver@^7.3.4", "@types/semver@^7.5.8": +"@types/semver@^7.3.4", "@types/semver@^7.5.0": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -5408,90 +5443,90 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^7.0.1": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3" - integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/type-utils" "7.7.0" - "@typescript-eslint/utils" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz#de61c3083842fc6ac889d2fc83c9a96b55ab8328" + integrity sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/type-utils" "7.4.0" + "@typescript-eslint/utils" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.3.1" + ignore "^5.2.4" natural-compare "^1.4.0" - semver "^7.6.0" - ts-api-utils "^1.3.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" "@typescript-eslint/parser@^7.0.1": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" - integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== - dependencies: - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.4.0.tgz#540f4321de1e52b886c0fa68628af1459954c1f1" + integrity sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ== + dependencies: + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" - integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== +"@typescript-eslint/scope-manager@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz#acfc69261f10ece7bf7ece1734f1713392c3655f" + integrity sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" -"@typescript-eslint/type-utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" - integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== +"@typescript-eslint/type-utils@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz#cfcaab21bcca441c57da5d3a1153555e39028cbd" + integrity sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw== dependencies: - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/utils" "7.7.0" + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/utils" "7.4.0" debug "^4.3.4" - ts-api-utils "^1.3.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" - integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== +"@typescript-eslint/types@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.4.0.tgz#ee9dafa75c99eaee49de6dcc9348b45d354419b6" + integrity sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw== -"@typescript-eslint/typescript-estree@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" - integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== +"@typescript-eslint/typescript-estree@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz#12dbcb4624d952f72c10a9f4431284fca24624f4" + integrity sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" - integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== +"@typescript-eslint/utils@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.4.0.tgz#d889a0630cab88bddedaf7c845c64a00576257bd" + integrity sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - semver "^7.6.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + semver "^7.5.4" -"@typescript-eslint/visitor-keys@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" - integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== +"@typescript-eslint/visitor-keys@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz#0c8ff2c1f8a6fe8d7d1a57ebbd4a638e86a60a94" + integrity sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA== dependencies: - "@typescript-eslint/types" "7.7.0" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "7.4.0" + eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" @@ -6909,9 +6944,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587: - version "1.0.30001610" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz#2f44ed6e21d359e914271ae35b68903632628ccf" - integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA== + version "1.0.30001600" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" + integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== canvas-sequencer@^3.1.0: version "3.1.0" @@ -8555,9 +8590,9 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" dompurify@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.0.tgz#8c6b9fe986969a33aa4686bd829cbe8e14dd9445" - integrity sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA== + version "3.0.11" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.11.tgz#c163f5816eaac6aeef35dae2b77fca0504564efe" + integrity sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg== domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" @@ -8720,9 +8755,9 @@ electron-publish@24.13.1: mime "^2.5.2" electron-to-chromium@^1.4.668: - version "1.4.737" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz#3a774a58e04980741f65d440f5fdf57af18b6dde" - integrity sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw== + version "1.4.721" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.721.tgz#a9ee55ba7e54d9ecbcc19825116f3752e7d60ef2" + integrity sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ== electron-updater@^6.1.1: version "6.1.8" @@ -8876,9 +8911,9 @@ error-stack-parser@^2.0.6: stackframe "^1.3.4" es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + version "1.23.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" + integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" @@ -8919,11 +8954,11 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 safe-regex-test "^1.0.3" string.prototype.trim "^1.2.9" string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.2" typed-array-byte-length "^1.0.1" typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" + typed-array-length "^1.0.5" unbox-primitive "^1.0.2" which-typed-array "^1.1.15" @@ -9551,7 +9586,7 @@ fetch-retry@^5.0.2: resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.6.tgz#17d0bc90423405b7a88b74355bf364acd2a7fa56" integrity sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ== -figures@3.2.0, figures@^3.0.0: +figures@3.2.0, figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -9736,9 +9771,9 @@ flatted@^3.2.9: integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== flow-parser@0.*: - version "0.233.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.233.0.tgz#b983e65812d5ecae79f08ae3ed8ad2e131a9b966" - integrity sha512-E/mv51GYJfLuRX6fZnw4M52gBxYa8pkHUOgNEZOcQK2RTXS8YXeU5rlalkTcY99UpwbeNVCSUFKaavpOksi/pQ== + version "0.232.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.232.0.tgz#db93a660e7017bd366290944c3328ca506ca7d2b" + integrity sha512-U8vcKyYdM+Kb0tPzfPJ5JyPMU0uXKwHxp0L6BcEc+wBlbTW9qRhOqV5DeGXclgclVvtqQNGEG8Strj/b6c/IxA== follow-redirects@^1.0.0, follow-redirects@^1.15.6: version "1.15.6" @@ -10824,7 +10859,7 @@ ignore-walk@^6.0.4: dependencies: minimatch "^9.0.0" -ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -12728,9 +12763,9 @@ memfs@^3.1.2, memfs@^3.4.1, memfs@^3.4.12: fs-monkey "^1.0.4" memfs@^4.6.0: - version "4.8.2" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.8.2.tgz#9bb7c3e43647348451082557f05fb170b7442949" - integrity sha512-j4WKth315edViMBGkHW6NTF0QBjsTrcRDmYNcGsPq+ozMEyCCCIlX2d2mJ5wuh6iHvJ3FevUrr48v58YRqVdYg== + version "4.8.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.8.0.tgz#0ea1ecb137219883c2e7c5139f4fa109935f7e39" + integrity sha512-fcs7trFxZlOMadmTw5nyfOwS3il9pr3y+6xzLfXNwmuR/D0i4wz6rJURxArAbcJDGalbpbMvQ/IFI0NojRZgRg== dependencies: tslib "^2.0.0" @@ -12914,7 +12949,7 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3, minimatch@^9.0.4: +minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== @@ -13548,12 +13583,12 @@ nwsapi@^2.2.2, nwsapi@^2.2.7: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@18.2.4, "nx@>=17.1.2 < 19": - version "18.2.4" - resolved "https://registry.yarnpkg.com/nx/-/nx-18.2.4.tgz#207c5db6b00701a6202cdf7728d4a0deb458147a" - integrity sha512-GxqJcDOhfLa9jsPmip0jG73CZKA96wCryss2DhixCiCU66I3GLYF4+585ObO8Tx7Z1GqhT92RaNGjCxjMIwaPg== +nx@18.2.1, "nx@>=17.1.2 < 19": + version "18.2.1" + resolved "https://registry.yarnpkg.com/nx/-/nx-18.2.1.tgz#6eab05216615acc83e2f888f6aed11d4e1303bf0" + integrity sha512-wUYr1x6GnPvtHMY5pHVijuJbD077ObwGCX+pHZc1IreugAQBLmQ6bxPNCxuI0YjGeM39PD9ME+rxi6aAcJbUKw== dependencies: - "@nrwl/tao" "18.2.4" + "@nrwl/tao" "18.2.1" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" @@ -13588,16 +13623,16 @@ nx@18.2.4, "nx@>=17.1.2 < 19": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "18.2.4" - "@nx/nx-darwin-x64" "18.2.4" - "@nx/nx-freebsd-x64" "18.2.4" - "@nx/nx-linux-arm-gnueabihf" "18.2.4" - "@nx/nx-linux-arm64-gnu" "18.2.4" - "@nx/nx-linux-arm64-musl" "18.2.4" - "@nx/nx-linux-x64-gnu" "18.2.4" - "@nx/nx-linux-x64-musl" "18.2.4" - "@nx/nx-win32-arm64-msvc" "18.2.4" - "@nx/nx-win32-x64-msvc" "18.2.4" + "@nx/nx-darwin-arm64" "18.2.1" + "@nx/nx-darwin-x64" "18.2.1" + "@nx/nx-freebsd-x64" "18.2.1" + "@nx/nx-linux-arm-gnueabihf" "18.2.1" + "@nx/nx-linux-arm64-gnu" "18.2.1" + "@nx/nx-linux-arm64-musl" "18.2.1" + "@nx/nx-linux-x64-gnu" "18.2.1" + "@nx/nx-linux-x64-musl" "18.2.1" + "@nx/nx-win32-arm64-msvc" "18.2.1" + "@nx/nx-win32-x64-msvc" "18.2.1" nypm@^0.3.8: version "0.3.8" @@ -13696,17 +13731,17 @@ obuf@^1.0.0, obuf@^1.1.2: integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== oclif@^4.0.0: - version "4.8.5" - resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.8.5.tgz#e6425aa13bf41e97746f14de6b68aedf88fc1273" - integrity sha512-7f6gYBAugi/+98lrsjnGtQnrva6JS2fDjyBzUZETi+EQHg/Gq55yvknHkMw4mLO5iA2MIEvClYdgyKR4keAdPA== + version "4.7.1" + resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.7.1.tgz#377f7babdee62b428fca0c6c6015663b7cf91eee" + integrity sha512-6GGtbKISjlyxH6QK9jVw0nYf0uaHg26L+B+ke7gJEqjVQ6O23D6Eu/O7xxvt+Tj7/6Hnt0AVNL/vy7tBJ4W37w== dependencies: "@aws-sdk/client-cloudfront" "^3.535.0" - "@aws-sdk/client-s3" "^3.554.0" - "@inquirer/confirm" "^3.1.4" - "@inquirer/input" "^2.1.1" - "@inquirer/select" "^2.2.1" - "@oclif/core" "^3.26.0" - "@oclif/plugin-help" "^6.0.21" + "@aws-sdk/client-s3" "^3.535.0" + "@inquirer/confirm" "^3.0.0" + "@inquirer/input" "^2.1.0" + "@inquirer/select" "^2.0.0" + "@oclif/core" "^3.21.0" + "@oclif/plugin-help" "^6.0.18" "@oclif/plugin-not-found" "^3.0.14" "@oclif/plugin-warn-if-update-available" "^3.0.14" async-retry "^1.3.3" @@ -13721,7 +13756,7 @@ oclif@^4.0.0: lodash.template "^4.5.0" normalize-package-data "^3.0.3" semver "^7.6.0" - sort-package-json "^2.10.0" + sort-package-json "^2.8.0" validate-npm-package-name "^5.0.0" ohash@^1.1.3: @@ -15550,6 +15585,11 @@ run-async@^2.4.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -16055,10 +16095,10 @@ sort-object-keys@^1.1.3: resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== -sort-package-json@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.10.0.tgz#6be07424bf3b7db9fbb1bdd69e7945f301026d8a" - integrity sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g== +sort-package-json@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.9.0.tgz#99084f0a1f36e2f3047e1bd6ad22096e5f7d41da" + integrity sha512-vlEd6i57Eb9+ruta1+hID+emmAmGzWKraEX1kk5LAQ0k1glgDHOENeieqzfir0m8MHcebzDH4FEwqjPnMEjy2g== dependencies: detect-indent "^7.0.1" detect-newline "^4.0.0" @@ -16066,7 +16106,6 @@ sort-package-json@^2.10.0: git-hooks-list "^3.0.0" globby "^13.1.2" is-plain-obj "^4.1.0" - semver "^7.6.0" sort-object-keys "^1.1.3" source-list-map@^2.0.1: @@ -16268,11 +16307,11 @@ store2@^2.14.2: integrity sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg== storybook@^8.0.0: - version "8.0.8" - resolved "https://registry.yarnpkg.com/storybook/-/storybook-8.0.8.tgz#1ef69577d8eb174f8d62e1bd3302a9baa157e670" - integrity sha512-9gTnnAakJBtMCg8oPGqnpy7g/C3Tj2IWiVflHiFg1SDD9zXBoc4mZhaYPTne4LRBUhXk7XuFagKfiRN2V/MuKA== + version "8.0.5" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-8.0.5.tgz#6a65b2b1a632a88216ad2e13252839b7f61fb88d" + integrity sha512-rdxfjkED5CBKj6T01NKr9MRakyXkffV8dvLXj5bWN4AlQ1OOm5Sw9B1z+rQ/FN7RYIU5b63xiX2pu3gy5t6nRQ== dependencies: - "@storybook/cli" "8.0.8" + "@storybook/cli" "8.0.5" stream-browserify@^3.0.0: version "3.0.0" @@ -16310,7 +16349,16 @@ string-template@^1.0.0: resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96" integrity sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -16375,7 +16423,7 @@ string.prototype.trimend@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.8: +string.prototype.trimstart@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== @@ -16398,7 +16446,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16702,9 +16757,9 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.1, terser-webpack-plugi terser "^5.26.0" terser@^5.10.0, terser@^5.26.0: - version "5.30.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" - integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== + version "5.30.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.0.tgz#64cb2af71e16ea3d32153f84d990f9be0cdc22bf" + integrity sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -16881,7 +16936,7 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -ts-api-utils@^1.3.0: +ts-api-utils@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== @@ -17026,9 +17081,9 @@ type-fest@^2.19.0, type-fest@~2.19: integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-fest@^4.4.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.15.0.tgz#21da206b89c15774cc718c4f2d693e13a1a14a43" - integrity sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA== + version "4.14.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.14.0.tgz#46f9a358e605f0ec5ca99ab83deaa7257a7ae379" + integrity sha512-on5/Cw89wwqGZQu+yWO0gGMGu8VNxsaW9SB2HE8yJjllEk7IDTwnSN1dUVldYILhYPN5HzD7WAaw2cc/jBfn0Q== type-is@1.6.18, type-is@~1.6.18: version "1.6.18" @@ -17070,7 +17125,7 @@ typed-array-byte-offset@^1.0.2: has-proto "^1.0.3" is-typed-array "^1.1.13" -typed-array-length@^1.0.6: +typed-array-length@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== @@ -17088,9 +17143,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== "typescript@>=3 < 6", typescript@^5.1.3, typescript@^5.3.3: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== ufo@^1.4.0: version "1.5.3" @@ -17345,7 +17400,7 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0, uuid@^9.0.1: +uuid@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -17486,10 +17541,10 @@ webpack-cli@^5.1.4: rechoir "^0.8.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^6.1.2: - version "6.1.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz#79f4103f8c898564c9e96c3a9c2422de50f249bc" - integrity sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw== +webpack-dev-middleware@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz#0463232e59b7d7330fa154121528d484d36eb973" + integrity sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ== dependencies: colorette "^2.0.10" memfs "^3.4.12" @@ -17498,9 +17553,9 @@ webpack-dev-middleware@^6.1.2: schema-utils "^4.0.0" webpack-dev-middleware@^7.1.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz#2af00538b6e4eda05f5afdd5d711dbebc05958f7" - integrity sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA== + version "7.1.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz#29aefd73720a03889e1c5c8dd7e552c4d333d572" + integrity sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA== dependencies: colorette "^2.0.10" memfs "^4.6.0" @@ -17781,7 +17836,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -17799,6 +17854,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"