diff --git a/auth_test_utils/HTTPBasicAuthServer/app.ts b/auth_test_utils/HTTPBasicAuthServer/app.ts new file mode 100644 index 0000000000..1ca6d1cad4 --- /dev/null +++ b/auth_test_utils/HTTPBasicAuthServer/app.ts @@ -0,0 +1,23 @@ +/* eslint-disable no-console */ +import express from 'express' +import path from 'path' +import expressBasicAuth from 'express-basic-auth' +import cors from 'cors' + +const app = express() +const port = 3040 + +app.use(cors()) + +app.use( + '/data', + expressBasicAuth({ + users: { + admin: 'password', + }, + }), + express.static(path.join(__dirname, '..', '..', 'test_data', 'volvox')), +) + +console.log('HTTP BasicAuth Server listening on port', port) +app.listen(port) diff --git a/products/jbrowse-web/src/tests/OAuthServer/routes/auth.ts b/auth_test_utils/OAuthServer/app.ts similarity index 55% rename from products/jbrowse-web/src/tests/OAuthServer/routes/auth.ts rename to auth_test_utils/OAuthServer/app.ts index ecf94a141d..c355417cdc 100644 --- a/products/jbrowse-web/src/tests/OAuthServer/routes/auth.ts +++ b/auth_test_utils/OAuthServer/app.ts @@ -1,9 +1,11 @@ -import path from 'path' +/* eslint-disable no-console */ import express, { Request } from 'express' +import path from 'path' +import cors from 'cors' +import bodyParser from 'body-parser' +import oauthServer from './oauth/server' -import oauthServer from '../oauth/server' - -const router = express.Router() // Instantiate a new router +const router = express.Router() const filePath = path.join(__dirname, '../public/oauthAuthenticate.html') @@ -44,4 +46,25 @@ router.post( router.post('/token', oauthServer.token()) // Sends back token -export default router +const app = express() +const port = 3030 + +app.use(cors()) + +// Here we are configuring express to use body-parser as middle-ware. +app.use(bodyParser.urlencoded({ extended: false })) +app.use(bodyParser.json()) + +app.use('/oauth', router) // routes to access the auth stuff +app.use( + '/data', + oauthServer.authenticate(), + express.static(path.join(__dirname, '..', '..', 'test_data', 'volvox')), +) + +console.log( + 'The redirect-uri is http://localhost:3000, must be running jbrowse-web on this port e.g. the default dev server port', +) + +console.log('OAuth Server listening on port', port) +app.listen(port) diff --git a/products/jbrowse-web/src/tests/OAuthServer/oauth/model.ts b/auth_test_utils/OAuthServer/oauth/model.ts similarity index 100% rename from products/jbrowse-web/src/tests/OAuthServer/oauth/model.ts rename to auth_test_utils/OAuthServer/oauth/model.ts diff --git a/products/jbrowse-web/src/tests/OAuthServer/oauth/server.ts b/auth_test_utils/OAuthServer/oauth/server.ts similarity index 100% rename from products/jbrowse-web/src/tests/OAuthServer/oauth/server.ts rename to auth_test_utils/OAuthServer/oauth/server.ts diff --git a/products/jbrowse-web/src/tests/OAuthServer/public/oauthAuthenticate.html b/auth_test_utils/OAuthServer/public/oauthAuthenticate.html similarity index 100% rename from products/jbrowse-web/src/tests/OAuthServer/public/oauthAuthenticate.html rename to auth_test_utils/OAuthServer/public/oauthAuthenticate.html diff --git a/auth_test_utils/README.md b/auth_test_utils/README.md new file mode 100644 index 0000000000..a7dd49659a --- /dev/null +++ b/auth_test_utils/README.md @@ -0,0 +1,11 @@ +# extra_test_utils + +These start up authenticated servers for testing HTTP Basic and OAuth based file +access in jbrowse-web + +## Usage + +1. Run `yarn oauth` in a tab +2. Run `yarn basicauth` in another tab +3. Start jbrowse-web dev server +4. Visit http://localhost:3000/?config=test_data/volvox/config_auth.json diff --git a/auth_test_utils/package.json b/auth_test_utils/package.json new file mode 100644 index 0000000000..82e8ba3eca --- /dev/null +++ b/auth_test_utils/package.json @@ -0,0 +1,10 @@ +{ + "scripts": { + "oauth": "tsx OAuthServer/app.ts", + "basicauth": "tsx HTTPBasicAuthServer/app.ts" + }, + "packages": {}, + "dependencies": { + "tsx": "^4.19.1" + } +} diff --git a/package.json b/package.json index d25749a111..dc1ff6478d 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@types/dompurify": "^3.0.1", "@types/escape-html": "^1.0.2", "@types/express": "^4.17.8", - "@types/express-oauth-server": "^2.0.4", + "@types/express-oauth-server": "^2.0.7", "@types/get-value": "^3.0.1", "@types/is-object": "^1.0.0", "@types/jest": "^29.2.4", @@ -101,7 +101,7 @@ "dotenv": "^16.3.1", "dotenv-expand": "^11.0.3", "electron": "32.1.0", - "electron-builder": "next", + "electron-builder": "^25.1.6", "electron-mock-ipc": "^0.3.8", "eslint": "^9.0.0", "eslint-plugin-react": "^7.33.2", @@ -109,7 +109,7 @@ "eslint-plugin-react-refresh": "^0.4.3", "eslint-plugin-tsdoc": "^0.3.0", "eslint-plugin-unicorn": "^55.0.0", - "express": "^4.18.2", + "express": "^4.0.0", "express-basic-auth": "^1.2.1", "find-yarn-workspace-root": "^2.0.0", "globals": "^15.9.0", diff --git a/packages/app-core/src/ui/App/App.tsx b/packages/app-core/src/ui/App/App.tsx index 1e774b35f1..d68ef19af9 100644 --- a/packages/app-core/src/ui/App/App.tsx +++ b/packages/app-core/src/ui/App/App.tsx @@ -13,6 +13,7 @@ import DialogQueue from './DialogQueue' import AppFab from './AppFab' import ViewsContainer from './ViewsContainer' +// lazies const DrawerWidget = lazy(() => import('./DrawerWidget')) const useStyles = makeStyles()(theme => ({ @@ -39,9 +40,12 @@ interface Props { HeaderButtons?: React.ReactElement session: SessionWithFocusedViewAndDrawerWidgets & { savedSessionNames: string[] - menus: { label: string; menuItems: JBMenuItem[] }[] - renameCurrentSession: (arg: string) => void + menus: { + label: string + menuItems: JBMenuItem[] + }[] snackbarMessages: SnackbarMessage[] + renameCurrentSession: (arg: string) => void popSnackbarMessage: () => unknown } } diff --git a/packages/app-core/src/ui/App/ViewLauncher.tsx b/packages/app-core/src/ui/App/ViewLauncher.tsx index 8686f51360..6bb99cbefc 100644 --- a/packages/app-core/src/ui/App/ViewLauncher.tsx +++ b/packages/app-core/src/ui/App/ViewLauncher.tsx @@ -37,7 +37,7 @@ const useStyles = makeStyles()(theme => ({ const ViewLauncher = observer(({ session }: { session: AppSession }) => { const { classes } = useStyles() const { pluginManager } = getEnv(session) - const viewTypes = pluginManager.getElementTypeRecord('view').all() + const viewTypes = pluginManager.getViewElements() const [value, setValue] = useState(viewTypes[0]?.name || '') return ( @@ -49,11 +49,13 @@ const ViewLauncher = observer(({ session }: { session: AppSession }) => { setValue(event.target.value) }} > - {viewTypes.map(({ displayName, name }) => ( - - {displayName} - - ))} + {viewTypes + .filter(({ viewMetadata }) => !viewMetadata.hiddenFromGUI) + .map(({ displayName, name }) => ( + + {displayName} + + ))} diff --git a/packages/core/PluginManager.ts b/packages/core/PluginManager.ts index 3f503812f2..d478a922f6 100644 --- a/packages/core/PluginManager.ts +++ b/packages/core/PluginManager.ts @@ -353,6 +353,10 @@ export default class PluginManager { return this.getElementTypeRecord(groupName).all() } + getViewElements() { + return this.getElementTypesInGroup('view') as ViewType[] + } + getTrackElements() { return this.getElementTypesInGroup('track') as TrackType[] } diff --git a/packages/core/assemblyManager/assemblyManager.ts b/packages/core/assemblyManager/assemblyManager.ts index 0534f9072b..11a04830a0 100644 --- a/packages/core/assemblyManager/assemblyManager.ts +++ b/packages/core/assemblyManager/assemblyManager.ts @@ -1,13 +1,14 @@ import { addDisposer, - cast, getParent, types, Instance, IAnyType, } from 'mobx-state-tree' -import { when } from '../util' import { reaction } from 'mobx' + +// locals +import { when } from '../util' import { readConfObject, AnyConfigurationModel } from '../configuration' import assemblyFactory, { Assembly } from './assembly' import PluginManager from '../PluginManager' @@ -164,20 +165,17 @@ function assemblyManagerFactory(conf: IAnyType, pm: PluginManager) { reaction( () => self.assemblyList, assemblyConfs => { - self.assemblies.forEach(asm => { + for (const asm of self.assemblies) { if (!asm.configuration) { this.removeAssembly(asm) } - }) - assemblyConfs.forEach(conf => { - if ( - !self.assemblies.some( - a => a.name === readConfObject(conf, 'name'), - ) - ) { + } + for (const conf of assemblyConfs) { + const name = readConfObject(conf, 'name') + if (!self.assemblies.some(a => a.name === name)) { this.addAssembly(conf) } - }) + } }, { fireImmediately: true, name: 'assemblyManagerAfterAttach' }, ), @@ -207,16 +205,6 @@ function assemblyManagerFactory(conf: IAnyType, pm: PluginManager) { addAssembly(configuration: Conf) { self.assemblies.push({ configuration }) }, - - /** - * #action - * private: you would generally want to add to manipulate - * jbrowse.assemblies, session.sessionAssemblies, or - * session.temporaryAssemblies instead of using this directly - */ - replaceAssembly(idx: number, configuration: Conf) { - self.assemblies[idx] = cast({ configuration }) - }, })) } diff --git a/packages/core/pluggableElementTypes/ViewType.ts b/packages/core/pluggableElementTypes/ViewType.ts index 8aa7d94f04..48233b3332 100644 --- a/packages/core/pluggableElementTypes/ViewType.ts +++ b/packages/core/pluggableElementTypes/ViewType.ts @@ -9,8 +9,13 @@ type BasicView = React.ComponentType<{ model: any session?: IAnyStateTreeNode }> + type ViewComponentType = React.LazyExoticComponent | BasicView +interface ViewMetadata { + hiddenFromGUI?: boolean +} + export default class ViewType extends PluggableElementBase { ReactComponent: ViewComponentType @@ -18,6 +23,8 @@ export default class ViewType extends PluggableElementBase { displayTypes: DisplayType[] = [] + viewMetadata: ViewMetadata = {} + // extendedName can be used for when you extend a given view type, and want // to register all of that view types displays to yourself // @@ -30,12 +37,14 @@ export default class ViewType extends PluggableElementBase { constructor(stuff: { name: string displayName?: string - ReactComponent: ViewComponentType stateModel: IAnyModelType extendedName?: string + viewMetadata?: ViewMetadata + ReactComponent: ViewComponentType }) { super(stuff) this.ReactComponent = stuff.ReactComponent + this.viewMetadata = stuff.viewMetadata || {} this.stateModel = stuff.stateModel this.extendedName = stuff.extendedName } diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.tsx b/plugins/breakpoint-split-view/src/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.tsx index 4adf6e3ae3..98a2f93a2d 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.tsx +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.tsx @@ -90,15 +90,16 @@ export async function renderToSvg(model: BSV, opts: ExportSvgOptions) { - + + + ) : null} @@ -110,15 +111,16 @@ export async function renderToSvg(model: BSV, opts: ExportSvgOptions) { - + + + ) : null} diff --git a/plugins/comparative-adapters/src/MCScanAnchorsAdapter/MCScanAnchorsAdapter.ts b/plugins/comparative-adapters/src/MCScanAnchorsAdapter/MCScanAnchorsAdapter.ts index f6da0a47fa..197dcf3640 100644 --- a/plugins/comparative-adapters/src/MCScanAnchorsAdapter/MCScanAnchorsAdapter.ts +++ b/plugins/comparative-adapters/src/MCScanAnchorsAdapter/MCScanAnchorsAdapter.ts @@ -73,14 +73,31 @@ export default class MCScanAnchorsAdapter extends BaseFeatureDataAdapter { } async hasDataForRefName() { - // determining this properly is basically a call to getFeatures - // so is not really that important, and has to be true or else - // getFeatures is never called (BaseFeatureDataAdapter filters it out) + // determining this properly is basically a call to getFeatures so is not + // really that important, and has to be true or else getFeatures is never + // called (BaseFeatureDataAdapter filters it out) return true } - async getRefNames() { - // we cannot determine this accurately + getAssemblyNames() { + const assemblyNames = this.getConf('assemblyNames') as string[] + return assemblyNames + } + + async getRefNames(opts: BaseOptions = {}) { + // @ts-expect-error + const r1 = opts.regions?.[0].assemblyName + const { feats } = await this.setup(opts) + + const idx = this.getAssemblyNames().indexOf(r1) + if (idx !== -1) { + const set = new Set() + for (const feat of feats) { + set.add(idx === 0 ? feat[0].refName : feat[1].refName) + } + return [...set] + } + console.warn('Unable to do ref renaming on adapter') return [] } diff --git a/plugins/comparative-adapters/src/MCScanSimpleAnchorsAdapter/MCScanSimpleAnchorsAdapter.ts b/plugins/comparative-adapters/src/MCScanSimpleAnchorsAdapter/MCScanSimpleAnchorsAdapter.ts index 00903fb828..0e3d884557 100644 --- a/plugins/comparative-adapters/src/MCScanSimpleAnchorsAdapter/MCScanSimpleAnchorsAdapter.ts +++ b/plugins/comparative-adapters/src/MCScanSimpleAnchorsAdapter/MCScanSimpleAnchorsAdapter.ts @@ -93,8 +93,31 @@ export default class MCScanAnchorsAdapter extends BaseFeatureDataAdapter { return true } - async getRefNames() { - // we cannot determine this accurately + getAssemblyNames() { + const assemblyNames = this.getConf('assemblyNames') as string[] + return assemblyNames + } + + async getRefNames(opts: BaseOptions = {}) { + // @ts-expect-error + const r1 = opts.regions?.[0].assemblyName + const { feats } = await this.setup(opts) + + const idx = this.getAssemblyNames().indexOf(r1) + if (idx !== -1) { + const set = new Set() + for (const feat of feats) { + if (idx === 0) { + set.add(feat[0].refName) + set.add(feat[1].refName) + } else { + set.add(feat[2].refName) + set.add(feat[3].refName) + } + } + return [...set] + } + console.warn('Unable to do ref renaming on adapter') return [] } diff --git a/plugins/config/src/index.ts b/plugins/config/src/index.ts index 0b77fdef97..ba689b738c 100644 --- a/plugins/config/src/index.ts +++ b/plugins/config/src/index.ts @@ -25,6 +25,4 @@ export default class ConfigurationPlugin extends Plugin { } } -export { default as JsonEditor } from './ConfigurationEditorWidget/components/JsonEditor' - export { LazyConfigurationEditorComponent as ConfigurationEditor } diff --git a/plugins/dotplot-view/src/DotplotView/components/DotplotControls.tsx b/plugins/dotplot-view/src/DotplotView/components/DotplotControls.tsx index 6343c0e7f2..d3db9afd36 100644 --- a/plugins/dotplot-view/src/DotplotView/components/DotplotControls.tsx +++ b/plugins/dotplot-view/src/DotplotView/components/DotplotControls.tsx @@ -20,11 +20,19 @@ const DotplotControls = observer(function ({ }) { return (
- + { + model.zoomOut() + }} + > - + { + model.zoomIn() + }} + > diff --git a/plugins/dotplot-view/src/DotplotView/components/DotplotView.tsx b/plugins/dotplot-view/src/DotplotView/components/DotplotView.tsx index 6cf585528f..60cc775554 100644 --- a/plugins/dotplot-view/src/DotplotView/components/DotplotView.tsx +++ b/plugins/dotplot-view/src/DotplotView/components/DotplotView.tsx @@ -325,7 +325,7 @@ const DotplotViewInternal = observer(function ({ label: 'Zoom in', onClick: () => { if (mousedown && mouseup) { - model.zoomIn(mousedown, mouseup) + model.zoomInToMouseCoords(mousedown, mouseup) } // below line is needed to prevent tooltip from sticking setMouseOvered(false) diff --git a/plugins/dotplot-view/src/DotplotView/components/PanButtons.tsx b/plugins/dotplot-view/src/DotplotView/components/PanButtons.tsx index 6ef3f9c960..8c0c9d8a56 100644 --- a/plugins/dotplot-view/src/DotplotView/components/PanButtons.tsx +++ b/plugins/dotplot-view/src/DotplotView/components/PanButtons.tsx @@ -41,7 +41,9 @@ const PanButtons = observer(function PanButtons({
model.vview.scroll(100)} + onClick={() => { + model.vview.scroll(100) + }} > @@ -49,14 +51,18 @@ const PanButtons = observer(function PanButtons({ model.hview.scroll(-100)} + onClick={() => { + model.hview.scroll(-100) + }} >
model.hview.scroll(100)} + onClick={() => { + model.hview.scroll(100) + }} > @@ -64,7 +70,9 @@ const PanButtons = observer(function PanButtons({
model.vview.scroll(-100)} + onClick={() => { + model.vview.scroll(-100) + }} > @@ -72,8 +80,7 @@ const PanButtons = observer(function PanButtons({ { - model.hview.zoomIn() - model.vview.zoomIn() + model.zoomIn() }} > @@ -82,8 +89,7 @@ const PanButtons = observer(function PanButtons({ { - model.hview.zoomOut() - model.vview.zoomOut() + model.zoomOut() }} > diff --git a/plugins/dotplot-view/src/DotplotView/model.ts b/plugins/dotplot-view/src/DotplotView/model.ts index 40f417f7dd..2b39ae20cd 100644 --- a/plugins/dotplot-view/src/DotplotView/model.ts +++ b/plugins/dotplot-view/src/DotplotView/model.ts @@ -339,14 +339,14 @@ export default function stateModelFactory(pm: PluginManager) { /** * #action */ - zoomOutButton() { + zoomOut() { self.hview.zoomOut() self.vview.zoomOut() }, /** * #action */ - zoomInButton() { + zoomIn() { self.hview.zoomIn() self.vview.zoomIn() }, @@ -454,7 +454,7 @@ export default function stateModelFactory(pm: PluginManager) { * #action * zooms into clicked and dragged region */ - zoomIn(mousedown: Coord, mouseup: Coord) { + zoomInToMouseCoords(mousedown: Coord, mouseup: Coord) { const result = this.getCoords(mousedown, mouseup) if (result) { const [x1, x2, y1, y2] = result diff --git a/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts b/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts index 1fabd46c0d..2029e5fc55 100644 --- a/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts +++ b/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts @@ -1,5 +1,5 @@ import PluginManager from '@jbrowse/core/PluginManager' -import { AbstractSessionModel } from '@jbrowse/core/util' +import { AbstractSessionModel, notEmpty } from '@jbrowse/core/util' import { when } from 'mobx' // locals @@ -13,6 +13,12 @@ interface ViewData { tracks?: string[] } +type MaybeString = string | undefined + +function makeMultiDimArray(str: string[] | string[][]) { + return Array.isArray(str[0]) ? (str as string[][]) : ([str] as string[][]) +} + export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { pluginManager.addToExtensionPoint( 'LaunchView-LinearSyntenyView', @@ -24,7 +30,7 @@ export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { }: { session: AbstractSessionModel views: ViewData[] - tracks?: string[] + tracks?: string[] | string[][] }) => { try { const { assemblyManager } = session @@ -52,7 +58,7 @@ export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { await Promise.all(model.views.map(view => when(() => view.initialized))) - const idsNotFound = [] as string[] + let idsNotFound = [] as MaybeString[] await Promise.all( views.map(async (data, idx) => { const view = model.views[idx]! @@ -62,17 +68,32 @@ export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { throw new Error(`Assembly ${data.assembly} failed to load`) } await view.navToSearchString({ input: loc, assembly: asm }) - tracks.forEach(track => { - tryTrack(view, track, idsNotFound) - }) + idsNotFound = [ + ...idsNotFound, + ...tracks.map(trackId => + tryTrackLGV({ + model: view, + trackId, + }), + ), + ] }), ) - tracks.forEach(track => { - tryTrack(model, track, idsNotFound) - }) + idsNotFound = [ + ...idsNotFound, + ...makeMultiDimArray(tracks).flatMap((trackSet, level) => + trackSet.map(trackId => + tryTrackSynteny({ + model, + trackId, + level, + }), + ), + ), + ] - if (idsNotFound.length) { + if (idsNotFound.filter(notEmpty).length) { throw new Error( `Could not resolve identifiers: ${idsNotFound.join(',')}`, ) @@ -85,18 +106,52 @@ export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { ) } -function tryTrack( - model: { showTrack: (arg: string) => void }, - trackId: string, - idsNotFound: string[], -) { +function tryTrackLGV({ + model, + trackId, +}: { + model: { + showTrack: (arg: string) => void + } + trackId: string +}) { try { model.showTrack(trackId) } catch (e) { - if (/Could not resolve identifier/.exec(`${e}`)) { - idsNotFound.push(trackId) + if ( + /Could not resolve identifier/.exec(`${e}`) || + /track not found/.exec(`${e}`) + ) { + return trackId + } else { + throw e + } + } + return undefined +} + +function tryTrackSynteny({ + model, + trackId, + level, +}: { + model: { + showTrack: (arg: string, level?: number) => void + } + trackId: string + level: number +}) { + try { + model.showTrack(trackId, level) + } catch (e) { + if ( + /Could not resolve identifier/.exec(`${e}`) || + /track not found/.exec(`${e}`) + ) { + return trackId } else { throw e } } + return undefined } diff --git a/plugins/linear-comparative-view/src/LinearComparativeDisplay/stateModelFactory.ts b/plugins/linear-comparative-view/src/LinearComparativeDisplay/stateModelFactory.ts index 040b774122..3023c9bb75 100644 --- a/plugins/linear-comparative-view/src/LinearComparativeDisplay/stateModelFactory.ts +++ b/plugins/linear-comparative-view/src/LinearComparativeDisplay/stateModelFactory.ts @@ -3,7 +3,7 @@ import { ConfigurationReference, AnyConfigurationSchemaType, } from '@jbrowse/core/configuration' -import { types, getSnapshot, Instance } from 'mobx-state-tree' +import { types, getSnapshot, Instance, getParent } from 'mobx-state-tree' import { dedupe, Feature, @@ -34,10 +34,6 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { * #property */ configuration: ConfigurationReference(configSchema), - /** - * #property - */ - height: 100, }), ) .volatile((/* self */) => ({ @@ -165,20 +161,22 @@ function renderBlockData(self: LinearComparativeDisplay) { const { rpcManager } = getSession(self) const display = self - // Alternative to readConfObject(config) is below used because renderProps is - // something under our control. Compare to serverSideRenderedBlock + // Alternative to readConfObject(config) is below used because + // renderProps is something under our control. Compare to + // serverSideRenderedBlock readConfObject(self.configuration) const { adapterConfig } = self const parent = getContainingView(self) as LinearComparativeViewModel const sessionId = getRpcSessionId(self) getSnapshot(parent) - return parent.initialized ? { rpcManager, renderProps: { ...display.renderProps(), + // @ts-expect-error + level: getParent(self, 4).level as number, view: parent, adapterConfig, sessionId, @@ -195,11 +193,10 @@ async function renderBlockEffect(props: ReturnType) { } const { rpcManager, renderProps } = props - const { adapterConfig } = renderProps - const view0 = renderProps.view.views[0] - + const { adapterConfig, level } = renderProps + const view = renderProps.view.views[level] const features = (await rpcManager.call('getFeats', 'CoreGetFeatures', { - regions: view0.staticBlocks.contentBlocks, + regions: view.staticBlocks.contentBlocks, sessionId: 'getFeats', adapterConfig, })) as Feature[] diff --git a/plugins/linear-comparative-view/src/LinearComparativeView/components/Header.tsx b/plugins/linear-comparative-view/src/LinearComparativeView/components/Header.tsx index e26fbbdecd..6affdb3adc 100644 --- a/plugins/linear-comparative-view/src/LinearComparativeView/components/Header.tsx +++ b/plugins/linear-comparative-view/src/LinearComparativeView/components/Header.tsx @@ -1,116 +1,115 @@ import React, { useState } from 'react' -import { IconButton, Typography } from '@mui/material' -import { makeStyles } from 'tss-react/mui' -import { SearchBox } from '@jbrowse/plugin-linear-genome-view' import { observer } from 'mobx-react' -import { Menu } from '@jbrowse/core/ui' +import { FormGroup } from '@mui/material' +import { makeStyles } from 'tss-react/mui' +import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton' // icons import MoreVertIcon from '@mui/icons-material/MoreVert' +import SearchIcon from '@mui/icons-material/Search' +import { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons' // locals import { LinearComparativeViewModel } from '../model' -import { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons' -import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton' - -type LCV = LinearComparativeViewModel +import HeaderSearchBoxes from './HeaderSearchBoxes' -const useStyles = makeStyles()(() => ({ - headerBar: { - gridArea: '1/1/auto/span 2', - display: 'flex', - }, - spacer: { - flexGrow: 1, - }, - iconButton: { - margin: 5, +const useStyles = makeStyles()({ + inline: { + display: 'inline-flex', }, - bp: { - display: 'flex', - alignItems: 'center', - marginLeft: 10, - }, - searchContainer: { - marginLeft: 5, - }, - searchBox: { - display: 'flex', - }, -})) - -const TrackSelector = observer(({ model }: { model: LCV }) => { - return ( - model.activateTrackSelector(), - }, - ...model.views.map((view, idx) => ({ - label: `View ${idx + 1} track selector`, - onClick: () => view.activateTrackSelector(), - })), - ]} - > - - - ) }) -const Header = observer(function ({ model }: { model: LCV }) { +const Header = observer(function ({ + model, +}: { + model: LinearComparativeViewModel +}) { const { classes } = useStyles() - const [menuAnchorEl, setMenuAnchorEl] = useState() - const anyShowHeaders = model.views.some(view => !view.hideHeader) + const { views } = model + const [showSearchBoxes, setShowSearchBoxes] = useState(views.length <= 3) + const [sideBySide, setSideBySide] = useState(views.length <= 3) return ( -
- + + ({ + label: `Synteny track selector (row ${idx + 1}->${idx + 2})`, + onClick: () => { + model.activateTrackSelector(idx) + }, + })), + }, - { - setMenuAnchorEl(event.currentTarget) - }} - className={classes.iconButton} + { + label: 'Row track selectors', + type: 'subMenu', + subMenu: views.map((view, idx) => ({ + label: `Row ${idx + 1} track selector`, + onClick: () => view.activateTrackSelector(), + })), + }, + ]} + > + + + ({ + label: `View ${idx + 1} Menu`, + subMenu: view.menuItems(), + })), + }, + ...model.headerMenuItems(), + ]} > - - {!anyShowHeaders - ? model.views.map(view => ( -
-
- -
-
- - {Math.round(view.coarseTotalBp).toLocaleString('en-US')} bp - -
-
- )) - : null} +
+ { + setShowSearchBoxes(!showSearchBoxes) + }, + }, -
+ { + label: 'Orientation - Side-by-side', + type: 'radio', + checked: sideBySide, + onClick: () => { + setSideBySide(!sideBySide) + }, + }, + { + label: 'Orientation - Vertical', + type: 'radio', + checked: !sideBySide, + onClick: () => { + setSideBySide(!sideBySide) + }, + }, + ]} + > + + - {menuAnchorEl ? ( - { - callback() - setMenuAnchorEl(undefined) - }} - menuItems={model.headerMenuItems()} - onClose={() => { - setMenuAnchorEl(undefined) - }} - /> + {showSearchBoxes ? ( + + {views.map(view => ( + + ))} + ) : null} -
+
) }) - export default Header diff --git a/plugins/linear-comparative-view/src/LinearComparativeView/components/HeaderSearchBoxes.tsx b/plugins/linear-comparative-view/src/LinearComparativeView/components/HeaderSearchBoxes.tsx new file mode 100644 index 0000000000..0243d2303a --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearComparativeView/components/HeaderSearchBoxes.tsx @@ -0,0 +1,40 @@ +import React from 'react' +import { observer } from 'mobx-react' +import { Typography } from '@mui/material' +import { makeStyles } from 'tss-react/mui' +// jbrowse +import { + LinearGenomeViewModel, + SearchBox, +} from '@jbrowse/plugin-linear-genome-view' +import { toLocale } from '@jbrowse/core/util' + +const useStyles = makeStyles()(() => ({ + bp: { + display: 'flex', + alignItems: 'center', + marginLeft: 10, + }, + searchBox: { + display: 'flex', + }, +})) + +const HeaderSearchBoxes = observer(function ({ + view, +}: { + view: LinearGenomeViewModel +}) { + const { classes } = useStyles() + const { assemblyNames, coarseTotalBp } = view + return ( + + + + {assemblyNames.join(',')} {toLocale(Math.round(coarseTotalBp))} bp + + + ) +}) + +export default HeaderSearchBoxes diff --git a/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeRenderArea.tsx b/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeRenderArea.tsx new file mode 100644 index 0000000000..f0d3e3020d --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeRenderArea.tsx @@ -0,0 +1,92 @@ +import React from 'react' +import { makeStyles } from 'tss-react/mui' +import { observer } from 'mobx-react' +import { getEnv } from '@jbrowse/core/util' +import { ResizeHandle } from '@jbrowse/core/ui' + +// locals +import { LinearComparativeViewModel } from '../model' +import { getConf } from '@jbrowse/core/configuration' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +const useStyles = makeStyles()({ + container: { + display: 'grid', + }, + overlay: { + zIndex: 100, + gridArea: '1/1', + }, + resizeHandle: { + height: 4, + background: '#ccc', + }, +}) + +function View({ view }: { view: LinearGenomeViewModel }) { + const { pluginManager } = getEnv(view) + const { ReactComponent } = pluginManager.getViewType(view.type)! + return +} + +const LinearComparativeRenderArea = observer(function ({ + model, +}: { + model: LinearComparativeViewModel +}) { + const { classes } = useStyles() + const { views, levels } = model + const RenderList = [ + , + ] as React.ReactNode[] + for (let i = 1; i < views.length; i++) { + const view = views[i]! + const level = levels[i - 1] + RenderList.push( + +
+ +
+ level?.setHeight(level.height + n)} + className={classes.resizeHandle} + /> + +
, + ) + } + return
{RenderList}
+}) + +const Overlays = observer(function ({ + model, + level, +}: { + model: LinearComparativeViewModel + level: number +}) { + const { classes } = useStyles() + return ( + <> + {model.levels[level]?.tracks.map(track => { + const [display] = track.displays + const { RenderingComponent } = display + const trackId = getConf(track, 'trackId') + return RenderingComponent ? ( +
+ +
+ ) : null + })} + + ) +}) + +export default LinearComparativeRenderArea diff --git a/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeView.tsx b/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeView.tsx index 048576c12b..0ba322ee09 100644 --- a/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeView.tsx +++ b/plugins/linear-comparative-view/src/LinearComparativeView/components/LinearComparativeView.tsx @@ -1,34 +1,14 @@ import React from 'react' import { makeStyles } from 'tss-react/mui' import { observer } from 'mobx-react' -import { getConf, AnyConfigurationModel } from '@jbrowse/core/configuration' -import { getEnv } from '@jbrowse/core/util' -import { ResizeHandle } from '@jbrowse/core/ui' // locals import { LinearComparativeViewModel } from '../model' import Rubberband from './Rubberband' import Header from './Header' +import LinearComparativeRenderArea from './LinearComparativeRenderArea' const useStyles = makeStyles()(theme => ({ - container: { - display: 'grid', - }, - overlay: { - zIndex: 100, - gridArea: '1/1', - }, - content: { - gridArea: '1/1', - position: 'relative', - }, - grid: { - display: 'grid', - }, - relative: { - position: 'relative', - }, - // this helps keep the vertical guide inside the parent view container, // similar style exists in the single LGV's trackscontainer rubberbandContainer: { @@ -46,39 +26,12 @@ const useStyles = makeStyles()(theme => ({ }, })) -type LCV = LinearComparativeViewModel - -const Overlays = observer(({ model }: { model: LCV }) => { - const { classes } = useStyles() - return ( - <> - {model.tracks.map(track => { - const [display] = track.displays - const { RenderingComponent } = display - const trackId = getConf(track, 'trackId') - return RenderingComponent ? ( -
- -
- ) : null - })} - - ) -}) - -// The comparative is in the middle of the views -const MiddleComparativeView = observer(({ model }: { model: LCV }) => { +const LinearComparativeView = observer(function ({ + model, +}: { + model: LinearComparativeViewModel +}) { const { classes } = useStyles() - const { views } = model - const { pluginManager } = getEnv(model) - const { ReactComponent } = pluginManager.getViewType(views[0]!.type)! return (
@@ -87,68 +40,9 @@ const MiddleComparativeView = observer(({ model }: { model: LCV }) => { model={model} ControlComponent={
} /> -
- -
- -
- - model.setMiddleComparativeHeight(model.middleComparativeHeight + n) - } - style={{ - height: 4, - background: '#ccc', - }} - /> - -
+
) }) -const OverlayComparativeView = observer(({ model }: { model: LCV }) => { - const { classes } = useStyles() - const { views } = model - const { pluginManager } = getEnv(model) - return ( -
-
- } - /> - -
-
-
- {views.map(view => { - const { ReactComponent } = pluginManager.getViewType(view.type)! - return - })} -
- -
-
-
- ) -}) - -const LinearComparativeView = observer(function (props: { - ExtraButtons?: React.ReactNode - model: LCV -}) { - const { model } = props - - const middle = model.tracks.some(({ displays }) => - displays.some((d: { configuration: AnyConfigurationModel }) => - getConf(d, 'middle'), - ), - ) - return middle ? ( - - ) : ( - - ) -}) export default LinearComparativeView diff --git a/plugins/linear-comparative-view/src/LinearComparativeView/index.ts b/plugins/linear-comparative-view/src/LinearComparativeView/index.ts index 989b01479a..9c2e6809f1 100644 --- a/plugins/linear-comparative-view/src/LinearComparativeView/index.ts +++ b/plugins/linear-comparative-view/src/LinearComparativeView/index.ts @@ -7,6 +7,9 @@ export default function LinearComparativeViewF(pluginManager: PluginManager) { pluginManager.addViewType(() => { return new ViewType({ name: 'LinearComparativeView', + viewMetadata: { + hiddenFromGUI: true, + }, displayName: 'Linear comparative view', stateModel: modelFactory(pluginManager), ReactComponent: lazy(() => import('./components/LinearComparativeView')), diff --git a/plugins/linear-comparative-view/src/LinearComparativeView/model.ts b/plugins/linear-comparative-view/src/LinearComparativeView/model.ts index edc9b796ad..90419148cd 100644 --- a/plugins/linear-comparative-view/src/LinearComparativeView/model.ts +++ b/plugins/linear-comparative-view/src/LinearComparativeView/model.ts @@ -3,20 +3,17 @@ import { addDisposer, cast, getPath, - getRoot, - resolveIdentifier, types, Instance, SnapshotIn, } from 'mobx-state-tree' -import { autorun, transaction } from 'mobx' +import { autorun } from 'mobx' // jbrowse import BaseViewModel from '@jbrowse/core/pluggableElementTypes/models/BaseViewModel' import { MenuItem } from '@jbrowse/core/ui' import { getSession, isSessionModelWithWidgets, avg } from '@jbrowse/core/util' import PluginManager from '@jbrowse/core/PluginManager' -import { AnyConfigurationModel } from '@jbrowse/core/configuration' import { ElementId } from '@jbrowse/core/util/types/mst' import { LinearGenomeViewModel, @@ -24,9 +21,11 @@ import { } from '@jbrowse/plugin-linear-genome-view' // icons -import { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons' import FolderOpenIcon from '@mui/icons-material/FolderOpen' +// locals +import { LinearSyntenyViewHelperStateModel } from '../LinearSyntenyViewHelper/stateModelFactory' + // lazies const ReturnToImportFormDialog = lazy( () => import('@jbrowse/core/ui/ReturnToImportFormDialog'), @@ -38,6 +37,9 @@ const ReturnToImportFormDialog = lazy( * - [BaseViewModel](../baseviewmodel) */ function stateModelFactory(pluginManager: PluginManager) { + const LinearSyntenyViewHelper = pluginManager.getViewType( + 'LinearSyntenyViewHelper', + )?.stateModel as LinearSyntenyViewHelperStateModel return types .compose( 'LinearComparativeView', @@ -66,13 +68,7 @@ function stateModelFactory(pluginManager: PluginManager) { /** * #property */ - middleComparativeHeight: 100, - /** - * #property - */ - tracks: types.array( - pluginManager.pluggableMstType('track', 'stateModel'), - ), + levels: types.array(LinearSyntenyViewHelper), /** * #property * currently this is limited to an array of two @@ -100,12 +96,6 @@ function stateModelFactory(pluginManager: PluginManager) { width: undefined as number | undefined, })) .views(self => ({ - /** - * #getter - */ - get highResolutionScaling() { - return 2 - }, /** * #getter */ @@ -178,27 +168,29 @@ function stateModelFactory(pluginManager: PluginManager) { /** * #action */ - setMiddleComparativeHeight(n: number) { - self.middleComparativeHeight = n - return self.middleComparativeHeight + setLevelHeight(newHeight: number, level = 0) { + const l = self.levels[level]! + l.setHeight(newHeight) + return l.height }, /** * #action */ - activateTrackSelector() { + activateTrackSelector(level: number) { if (self.trackSelectorType === 'hierarchical') { const session = getSession(self) if (isSessionModelWithWidgets(session)) { const selector = session.addWidget( 'HierarchicalTrackSelectorWidget', 'hierarchicalTrackSelector', - { view: self }, + { + view: self.levels[level], + }, ) session.showWidget(selector) return selector } - return undefined } throw new Error(`invalid track selector type ${self.trackSelectorType}`) }, @@ -206,82 +198,44 @@ function stateModelFactory(pluginManager: PluginManager) { /** * #action */ - toggleTrack(trackId: string) { - const hiddenCount = this.hideTrack(trackId) - if (!hiddenCount) { - this.showTrack(trackId) - return true - } - return false + toggleTrack(trackId: string, level = 0) { + self.levels[level]?.toggleTrack(trackId) }, - /** * #action */ - showTrack(trackId: string, initialSnapshot = {}) { - const schema = pluginManager.pluggableConfigSchemaType('track') - const configuration = resolveIdentifier(schema, getRoot(self), trackId) - if (!configuration) { - throw new Error(`track not found ${trackId}`) - } - const trackType = pluginManager.getTrackType(configuration.type) - if (!trackType) { - throw new Error(`unknown track type ${configuration.type}`) + showTrack(trackId: string, level = 0, initialSnapshot = {}) { + if (!self.levels[level]) { + self.levels[level] = cast({ level }) } - const viewType = pluginManager.getViewType(self.type)! - const supportedDisplays = new Set( - viewType.displayTypes.map(d => d.name), - ) - const displayConf = configuration.displays.find( - (d: AnyConfigurationModel) => supportedDisplays.has(d.type), - ) - if (!displayConf) { - throw new Error( - `could not find a compatible display for view type ${self.type}`, - ) - } - self.tracks.push( - trackType.stateModel.create({ - ...initialSnapshot, - type: configuration.type, - configuration, - displays: [{ type: displayConf.type, configuration: displayConf }], - }), - ) + self.levels[level].showTrack(trackId, initialSnapshot) }, /** * #action */ - hideTrack(trackId: string) { - const schema = pluginManager.pluggableConfigSchemaType('track') - const config = resolveIdentifier(schema, getRoot(self), trackId) - const shownTracks = self.tracks.filter(t => t.configuration === config) - transaction(() => { - shownTracks.forEach(t => self.tracks.remove(t)) - }) - return shownTracks.length + hideTrack(trackId: string, level = 0) { + self.levels[level]?.hideTrack(trackId) }, /** * #action */ squareView() { const average = avg(self.views.map(v => v.bpPerPx)) - self.views.forEach(view => { + for (const view of self.views) { const center = view.pxToBp(view.width / 2) view.setNewView(average, view.offsetPx) - if (!center.refName) { - return + if (center.refName) { + view.centerAt(center.coord, center.refName, center.index) } - view.centerAt(center.coord, center.refName, center.index) - }) + } }, /** * #action */ clearView() { self.views = cast([]) - self.tracks = cast([]) + self.levels = cast([]) }, })) .views(() => ({ @@ -300,24 +254,19 @@ function stateModelFactory(pluginManager: PluginManager) { */ menuItems(): MenuItem[] { return [ - ...self.views - .map((view, idx) => [idx, view.menuItems()] as const) - .map(f => ({ label: `View ${f[0] + 1} Menu`, subMenu: f[1] })), { label: 'Return to import form', onClick: () => { getSession(self).queueDialog(handleClose => [ ReturnToImportFormDialog, - { model: self, handleClose }, + { + model: self, + handleClose, + }, ]) }, icon: FolderOpenIcon, }, - { - label: 'Open track selector', - onClick: self.activateTrackSelector, - icon: TrackSelectorIcon, - }, ] }, /** @@ -328,12 +277,12 @@ function stateModelFactory(pluginManager: PluginManager) { { label: 'Zoom to region(s)', onClick: () => { - self.views.forEach(view => { + for (const view of self.views) { const { leftOffset, rightOffset } = view if (leftOffset && rightOffset) { view.moveTo(leftOffset, rightOffset) } - }) + } }, }, ] @@ -345,14 +294,23 @@ function stateModelFactory(pluginManager: PluginManager) { self, autorun(() => { if (self.width) { - self.views.forEach(v => { - v.setWidth(self.width) - }) + for (const view of self.views) { + view.setWidth(self.width) + } } }), ) }, })) + .preProcessSnapshot(snap => { + // @ts-expect-error + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const { tracks, levels = [{ tracks, level: 0 }], ...rest } = snap || {} + return { + ...rest, + levels, + } + }) } export type LinearComparativeViewStateModel = ReturnType< diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/afterAttach.ts b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/afterAttach.ts index dfc44ec240..d41449edc8 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/afterAttach.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/afterAttach.ts @@ -1,4 +1,4 @@ -import { addDisposer, getSnapshot } from 'mobx-state-tree' +import { addDisposer, getParent, getSnapshot } from 'mobx-state-tree' import { Feature, getContainingView, getSession } from '@jbrowse/core/util' import { bpToPx } from '@jbrowse/core/util/Base1DUtils' @@ -39,7 +39,7 @@ export function doAfterAttach(self: LinearSyntenyDisplayModel) { return } - const height = view.middleComparativeHeight + const height = self.height const width = view.width ctx1.clearRect(0, 0, width, height) ctx3.clearRect(0, 0, width, height) @@ -86,6 +86,8 @@ export function doAfterAttach(self: LinearSyntenyDisplayModel) { } const { assemblyManager } = getSession(self) const view = getContainingView(self) as LSV + // @ts-expect-error + const level = getParent(self, 4).level const viewSnaps = view.views.map(view => ({ ...getSnapshot(view), width: view.width, @@ -113,8 +115,8 @@ export function doAfterAttach(self: LinearSyntenyDisplayModel) { const r2 = mate.refName const ref1 = a1?.getCanonicalRefName(r1) || r1 const ref2 = a2?.getCanonicalRefName(r2) || r2 - const v1 = viewSnaps[0]! - const v2 = viewSnaps[1]! + const v1 = viewSnaps[level]! + const v2 = viewSnaps[level + 1]! const p11 = bpToPx({ self: v1, refName: ref1, coord: f1s }) const p12 = bpToPx({ self: v1, refName: ref1, coord: f1e }) const p21 = bpToPx({ self: v2, refName: ref2, coord: f2s }) diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/LinearSyntenyRendering.tsx b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/LinearSyntenyRendering.tsx index ce2bad11ac..6ecceb84a9 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/LinearSyntenyRendering.tsx +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/LinearSyntenyRendering.tsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback, useRef, lazy } from 'react' +import React, { useState, useCallback, useRef, lazy, useEffect } from 'react' import { observer } from 'mobx-react' import { getContainingView } from '@jbrowse/core/util' import { transaction } from 'mobx' @@ -25,12 +25,13 @@ const useStyles = makeStyles()({ rel: { position: 'relative', }, - abs: { + mouseoverCanvas: { position: 'absolute', - }, - none: { pointEvents: 'none', }, + mainCanvas: { + position: 'absolute', + }, }) const LinearSyntenyRendering = observer(function ({ @@ -38,13 +39,13 @@ const LinearSyntenyRendering = observer(function ({ }: { model: LinearSyntenyDisplayModel }) { - const { classes, cx } = useStyles() - const xOffset = useRef(0) - const currScrollFrame = useRef() + const { classes } = useStyles() + const xOffset = useRef(0) const view = getContainingView(model) as LinearSyntenyViewModel - const height = view.middleComparativeHeight const width = view.width const delta = useRef(0) + + const scheduled = useRef(false) const timeout = useRef() const [anchorEl, setAnchorEl] = useState() const [tooltip, setTooltip] = useState('') @@ -52,7 +53,8 @@ const LinearSyntenyRendering = observer(function ({ const [mouseCurrDownX, setMouseCurrDownX] = useState() const [mouseInitialDownX, setMouseInitialDownX] = useState() const [currY, setCurrY] = useState() - const { mouseoverId } = model + const { mouseoverId, height } = model + const k2p = useRef() // these useCallbacks avoid new refs from being created on any mouseover, // etc. @@ -64,63 +66,67 @@ const LinearSyntenyRendering = observer(function ({ // eslint-disable-next-line react-hooks/exhaustive-deps [model, height, width], ) + // biome-ignore lint/correctness/useExhaustiveDependencies: const k2 = useCallback( (ref: HTMLCanvasElement | null) => { model.setMainCanvasRef(ref) - function onWheel(event: WheelEvent) { - event.preventDefault() - if (event.ctrlKey) { - delta.current += event.deltaY / 500 + k2p.current = ref // this ref is additionally used in useEffect below + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [model, height, width], + ) + // biome-ignore lint/correctness/useExhaustiveDependencies: + useEffect(() => { + function onWheel(event: WheelEvent) { + event.preventDefault() + if (event.ctrlKey) { + delta.current += event.deltaY / 500 + for (const v of view.views) { + v.setScaleFactor( + delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current), + ) + } + if (timeout.current) { + clearTimeout(timeout.current) + } + timeout.current = setTimeout(() => { for (const v of view.views) { - v.setScaleFactor( - delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current), + v.setScaleFactor(1) + v.zoomTo( + delta.current > 0 + ? v.bpPerPx * (1 + delta.current) + : v.bpPerPx / (1 - delta.current), + event.clientX - (k2p.current?.getBoundingClientRect().left || 0), ) } - if (timeout.current) { - clearTimeout(timeout.current) - } - timeout.current = setTimeout(() => { - for (const v of view.views) { - v.setScaleFactor(1) - v.zoomTo( - delta.current > 0 - ? v.bpPerPx * (1 + delta.current) - : v.bpPerPx / (1 - delta.current), - event.clientX - (ref?.getBoundingClientRect().left || 0), - ) - } - delta.current = 0 - }, 300) - } else { - if (Math.abs(event.deltaY) < Math.abs(event.deltaX)) { - xOffset.current += event.deltaX / 2 - } - if (currScrollFrame.current === undefined) { - currScrollFrame.current = requestAnimationFrame(() => { - transaction(() => { - for (const v of view.views) { - v.horizontalScroll(xOffset.current) - } - xOffset.current = 0 - currScrollFrame.current = undefined - }) + delta.current = 0 + }, 300) + } else { + if (Math.abs(event.deltaY) < Math.abs(event.deltaX)) { + xOffset.current += event.deltaX / 2 + } + if (!scheduled.current) { + scheduled.current = true + window.requestAnimationFrame(() => { + transaction(() => { + for (const v of view.views) { + v.horizontalScroll(xOffset.current) + } + xOffset.current = 0 + scheduled.current = false }) - } + }) } } - ref?.addEventListener('wheel', onWheel) - - // this is a react 19-ism to have a cleanup in the ref callback - // https://react.dev/blog/2024/04/25/react-19#cleanup-functions-for-refs - // note: it warns in earlier versions of react - return () => { - ref?.removeEventListener('wheel', onWheel) - } - }, + } + k2p.current?.addEventListener('wheel', onWheel) + return () => { + k2p.current?.removeEventListener('wheel', onWheel) + } // eslint-disable-next-line react-hooks/exhaustive-deps - [model, height, width], - ) + }, [model, height, width]) + // biome-ignore lint/correctness/useExhaustiveDependencies: const k3 = useCallback( (ref: HTMLCanvasElement | null) => { @@ -144,7 +150,7 @@ const LinearSyntenyRendering = observer(function ({ ref={k1} width={width} height={height} - className={cx(classes.abs, classes.none)} + className={classes.mouseoverCanvas} /> { + if (!scheduled.current) { + scheduled.current = true + window.requestAnimationFrame(() => { transaction(() => { for (const v of view.views) { v.horizontalScroll(xOffset.current) } xOffset.current = 0 - currScrollFrame.current = undefined + scheduled.current = false }) }) } @@ -217,7 +224,7 @@ const LinearSyntenyRendering = observer(function ({ onSynContextClick(evt, model, setAnchorEl) }} data-testid="synteny_canvas" - className={classes.abs} + className={classes.mainCanvas} width={width} height={height} /> diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/SyntenyContextMenu.tsx b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/SyntenyContextMenu.tsx index b578580b94..9df93e7adf 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/SyntenyContextMenu.tsx +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/SyntenyContextMenu.tsx @@ -1,6 +1,7 @@ import React from 'react' import { getContainingView, getSession, Feature } from '@jbrowse/core/util' import { Menu } from '@jbrowse/core/ui' +import { getParent } from 'mobx-state-tree' // locals import { LinearSyntenyDisplayModel } from '../model' @@ -54,21 +55,28 @@ export default function SyntenyContextMenu({ label: 'Center on feature', onClick: () => { const { f } = feature + const track = getParent<{ level: number }>(model, 4) const start = f.get('start') const end = f.get('end') const refName = f.get('refName') const mate = f.get('mate') - view.views[0]!.navToLocString(`${refName}:${start}-${end}`).catch( + + const l1 = view.views[track.level]! + const l2 = view.views[track.level + 1]! + l1.navToLocString(`${refName}:${start}-${end}`).catch( (e: unknown) => { - console.error(e) - getSession(model).notifyError(`${e}`, e) + const err = `${l1.assemblyNames[0]}:${e}` + console.error(err) + getSession(model).notifyError(err, e) }, ) - view.views[1]!.navToLocString( + + l2.navToLocString( `${mate.refName}:${mate.start}-${mate.end}`, ).catch((e: unknown) => { - console.error(e) - getSession(model).notifyError(`${e}`, e) + const err = `${l2.assemblyNames[0]}:${e}` + console.error(err) + getSession(model).notifyError(err, e) }) }, }, diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/util.ts b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/util.ts index da745730d4..c626d74300 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/util.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/util.ts @@ -36,6 +36,7 @@ export function drawMatchSimple({ feature, ctx, offsets, + level, cb, height, drawCurves, @@ -46,6 +47,7 @@ export function drawMatchSimple({ feature: FeatPos ctx: CanvasRenderingContext2D offsets: number[] + level: number oobLimit: number viewWidth: number cb: (ctx: CanvasRenderingContext2D) => void @@ -55,10 +57,10 @@ export function drawMatchSimple({ }) { const { p11, p12, p21, p22 } = feature - const x11 = p11.offsetPx - offsets[0]! - const x12 = p12.offsetPx - offsets[0]! - const x21 = p21.offsetPx - offsets[1]! - const x22 = p22.offsetPx - offsets[1]! + const x11 = p11.offsetPx - offsets[level]! + const x12 = p12.offsetPx - offsets[level]! + const x21 = p21.offsetPx - offsets[level + 1]! + const x22 = p22.offsetPx - offsets[level + 1]! const l1 = Math.abs(x12 - x11) const l2 = Math.abs(x22 - x21) diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/drawSynteny.ts b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/drawSynteny.ts index 0dbfa0ebfa..759896da7c 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/drawSynteny.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/drawSynteny.ts @@ -3,6 +3,7 @@ import { doesIntersect2, getContainingView } from '@jbrowse/core/util' import { LinearSyntenyViewModel } from '../LinearSyntenyView/model' import { LinearSyntenyDisplayModel } from './model' import { draw, drawMatchSimple } from './components/util' +import { getParent } from 'mobx-state-tree' export const MAX_COLOR_RANGE = 255 * 255 * 255 // max color range @@ -36,9 +37,11 @@ export function drawRef( ctx3?: CanvasRenderingContext2D, ) { const view = getContainingView(model) as LinearSyntenyViewModel + // @ts-expect-error + const level = getParent(model, 4).level const drawCurves = view.drawCurves const drawCIGAR = view.drawCIGAR - const height = view.middleComparativeHeight + const { height, featPositions } = model const width = view.width const bpPerPxs = view.views.map(v => v.bpPerPx) @@ -47,20 +50,18 @@ export function drawRef( } ctx1.beginPath() - const featPos = model.featPositions const offsets = view.views.map(v => v.offsetPx) - - const unitMultiplier = Math.floor(MAX_COLOR_RANGE / featPos.length) + const unitMultiplier = Math.floor(MAX_COLOR_RANGE / featPositions.length) // this loop is optimized to draw many thin lines with a single ctx.stroke // call, a separate loop below draws larger boxes ctx1.fillStyle = colorMap.M ctx1.strokeStyle = colorMap.M - for (const { p11, p12, p21, p22 } of featPos) { - const x11 = p11.offsetPx - offsets[0]! - const x12 = p12.offsetPx - offsets[0]! - const x21 = p21.offsetPx - offsets[1]! - const x22 = p22.offsetPx - offsets[1]! + for (const { p11, p12, p21, p22 } of featPositions) { + const x11 = p11.offsetPx - offsets[level]! + const x12 = p12.offsetPx - offsets[level]! + const x21 = p21.offsetPx - offsets[level + 1]! + const x22 = p22.offsetPx - offsets[level + 1]! const l1 = Math.abs(x12 - x11) const l2 = Math.abs(x22 - x21) const y1 = 0 @@ -89,11 +90,11 @@ export function drawRef( // ctx.stroke once is much more efficient than calling stroke() many times ctx1.fillStyle = colorMap.M ctx1.strokeStyle = colorMap.M - for (const { p11, p12, p21, p22, f, cigar } of featPos) { - const x11 = p11.offsetPx - offsets[0]! - const x12 = p12.offsetPx - offsets[0]! - const x21 = p21.offsetPx - offsets[1]! - const x22 = p22.offsetPx - offsets[1]! + for (const { p11, p12, p21, p22, f, cigar } of featPositions) { + const x11 = p11.offsetPx - offsets[level]! + const x12 = p12.offsetPx - offsets[level]! + const x21 = p21.offsetPx - offsets[level + 1]! + const x22 = p22.offsetPx - offsets[level + 1]! const l1 = Math.abs(x12 - x11) const l2 = Math.abs(x22 - x21) const minX = Math.min(x21, x22) @@ -137,8 +138,8 @@ export function drawRef( px2 = cx2 } - const d1 = len / bpPerPxs[0]! - const d2 = len / bpPerPxs[1]! + const d1 = len / bpPerPxs[level]! + const d2 = len / bpPerPxs[level + 1]! if (op === 'M' || op === '=' || op === 'X') { cx1 += d1 * rev1 @@ -170,9 +171,9 @@ export function drawRef( ) { continuingFlag = true } else { - // allow rendering the dominant color when using continuing flag - // if the last element of continuing was a large feature, else - // just use match + // allow rendering the dominant color when using continuing + // flag if the last element of continuing was a large + // feature, else just use match ctx1.fillStyle = colorMap[(continuingFlag && d1 > 1) || d2 > 1 ? op : 'M'] continuingFlag = false @@ -198,8 +199,8 @@ export function drawRef( } ctx2.imageSmoothingEnabled = false ctx2.clearRect(0, 0, width, height) - for (let i = 0; i < featPos.length; i++) { - const feature = featPos[i]! + for (let i = 0; i < featPositions.length; i++) { + const feature = featPositions[i]! const idx = i * unitMultiplier + 1 ctx2.fillStyle = makeColor(idx) @@ -211,6 +212,7 @@ export function drawRef( feature, ctx: ctx2, drawCurves, + level, offsets, oobLimit, viewWidth: view.width, @@ -218,7 +220,6 @@ export function drawRef( height, }) } - return undefined } export function drawMouseoverSynteny(model: LinearSyntenyDisplayModel) { @@ -226,10 +227,12 @@ export function drawMouseoverSynteny(model: LinearSyntenyDisplayModel) { const highResolutionScaling = 1 const view = getContainingView(model) as LinearSyntenyViewModel const drawCurves = view.drawCurves - const height = view.middleComparativeHeight + const height = model.height const width = view.width const ctx = model.mouseoverCanvas?.getContext('2d') const offsets = view.views.map(v => v.offsetPx) + // @ts-expect-error + const level = getParent(model, 4).level if (!ctx) { return @@ -245,6 +248,7 @@ export function drawMouseoverSynteny(model: LinearSyntenyDisplayModel) { ctx.fill() }, feature: feature1, + level, ctx, oobLimit, viewWidth: view.width, @@ -263,6 +267,7 @@ export function drawMouseoverSynteny(model: LinearSyntenyDisplayModel) { }, feature: feature2, ctx, + level, oobLimit, viewWidth: view.width, drawCurves, diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/index.ts b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/index.ts index 4f41a1d91e..0422fa6bb1 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/index.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/index.ts @@ -14,7 +14,7 @@ export default function LinearSyntenyDisplayF(pluginManager: PluginManager) { configSchema, stateModel: stateModelFactory(configSchema), trackType: 'SyntenyTrack', - viewType: 'LinearSyntenyView', + viewType: 'LinearSyntenyViewHelper', ReactComponent: lazy(() => import('./components/Component')), }) }) diff --git a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/model.ts b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/model.ts index 3efaa999de..a95d5fdc8c 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyDisplay/model.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyDisplay/model.ts @@ -1,4 +1,4 @@ -import { types, Instance } from 'mobx-state-tree' +import { types, Instance, getParent } from 'mobx-state-tree' import { getConf, ConfigurationReference, @@ -143,6 +143,13 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { get trackIds() { return getConf(self, 'trackIds') as string[] }, + /** + * #getter + */ + get height() { + // @ts-expect-error + return getParent(self, 4).height as number + }, /** * #getter */ diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/ImportCustomTrack.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/AddCustomTrack.tsx similarity index 98% rename from plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/ImportCustomTrack.tsx rename to plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/AddCustomTrack.tsx index 41e9f816c5..98442663ab 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/ImportCustomTrack.tsx +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/AddCustomTrack.tsx @@ -94,12 +94,11 @@ type Conf = SnapshotIn const ImportCustomTrack = observer(function ({ assembly1, assembly2, - setSessionTrackData, + setUserOpenedSyntenyTrack, }: { - sessionTrackData: Conf assembly1: string assembly2: string - setSessionTrackData: (arg: Conf) => void + setUserOpenedSyntenyTrack: (arg: Conf) => void }) { const [bed2Location, setBed2Location] = useState() const [bed1Location, setBed1Location] = useState() @@ -118,7 +117,7 @@ const ImportCustomTrack = observer(function ({ const trackId = `${fn}-${Date.now()}` setError(undefined) - setSessionTrackData({ + setUserOpenedSyntenyTrack({ trackId, name: fn, assemblyNames: [assembly2, assembly1], @@ -147,7 +146,7 @@ const ImportCustomTrack = observer(function ({ fileLocation, indexFileLocation, radioOption, - setSessionTrackData, + setUserOpenedSyntenyTrack, ]) return ( diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.tsx deleted file mode 100644 index 7a8941e003..0000000000 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { Select, MenuItem, Paper, Typography } from '@mui/material' -import { getSession } from '@jbrowse/core/util' -import { getTrackName } from '@jbrowse/core/util/tracks' -import { ErrorMessage } from '@jbrowse/core/ui' -import { - AnyConfigurationModel, - readConfObject, -} from '@jbrowse/core/configuration' -import { observer } from 'mobx-react' - -// locals -import { LinearSyntenyViewModel } from '../../model' - -function f(track: AnyConfigurationModel, assembly1: string, assembly2: string) { - const assemblyNames = readConfObject(track, 'assemblyNames') - return ( - assemblyNames.includes(assembly1) && - assemblyNames.includes(assembly2) && - track.type.includes('Synteny') - ) -} - -const Selector = observer( - ({ - model, - assembly1, - assembly2, - setShowTrackId, - }: { - model: LinearSyntenyViewModel - assembly1: string - assembly2: string - setShowTrackId: (arg: string) => void - }) => { - const session = getSession(model) - const { tracks = [], sessionTracks = [] } = session - const allTracks = [...tracks, ...sessionTracks] as AnyConfigurationModel[] - const filteredTracks = allTracks.filter(t => f(t, assembly2, assembly1)) - const resetTrack = filteredTracks[0]?.trackId || '' - const [value, setValue] = useState(resetTrack) - useEffect(() => { - // if assembly1/assembly2 changes, then we will want to use this effect to - // change the state of the useState because it otherwise gets locked to a - // stale value - setValue(resetTrack) - }, [resetTrack]) - - useEffect(() => { - // sets track data in a useEffect because the initial load is needed as well - // as onChange's to the select box - setShowTrackId(value) - }, [value, setShowTrackId]) - return ( - - - Select a track from the select box below, the track will be shown when - you hit "Launch". - - - {filteredTracks.length ? ( - - ) : ( - - )} - - ) - }, -) - -export default Selector diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.tsx new file mode 100644 index 0000000000..476a8d37fb --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.tsx @@ -0,0 +1,264 @@ +import React, { useState } from 'react' +import { Button, Container, IconButton } from '@mui/material' +import { makeStyles } from 'tss-react/mui' +import { observer } from 'mobx-react' +import { AnyConfigurationModel } from '@jbrowse/core/configuration' +import { SnapshotIn } from 'mobx-state-tree' +import { + getSession, + isSessionWithAddTracks, + notEmpty, +} from '@jbrowse/core/util' +import { ErrorMessage, AssemblySelector } from '@jbrowse/core/ui' +// icons +import CloseIcon from '@mui/icons-material/Close' +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos' +// locals +import { LinearSyntenyViewModel } from '../../model' +import TrackSelector from './TrackSelectorUtil' +import Spacer from './Spacer' + +const useStyles = makeStyles()(theme => ({ + importFormContainer: { + padding: theme.spacing(4), + }, + button: { + margin: theme.spacing(2), + }, + rel: { + position: 'relative', + }, + synbutton: { + position: 'absolute', + top: 30, + }, + flex: { + display: 'flex', + }, + mb: { + marginBottom: 10, + }, + bg: { + background: theme.palette.divider, + }, + fixedWidth: { + width: 700, + }, +})) + +type Conf = SnapshotIn +type MaybeConf = Conf | undefined +type MaybeString = string | undefined + +const LinearSyntenyViewImportForm = observer(function ({ + model, +}: { + model: LinearSyntenyViewModel +}) { + const { classes, cx } = useStyles() + const session = getSession(model) + const { assemblyNames } = session + const defaultAssemblyName = assemblyNames[0] || '' + const [selectedRow, setSelectedRow] = useState(0) + const [selectedAssemblyNames, setSelectedAssemblyNames] = useState([ + defaultAssemblyName, + defaultAssemblyName, + ]) + const [error, setError] = useState() + const [userOpenedSyntenyTracksToShow, setUserOpenedSyntenyTracksToShow] = + useState([]) + const [ + preConfiguredSyntenyTracksToShow, + setPreConfiguredSyntenyTracksToShow, + ] = useState([]) + + return ( + + {error ? : null} +
+ +
+
+ Select assemblies for linear synteny view +
+ {selectedAssemblyNames.map((assemblyName, idx) => ( +
+ Row {idx + 1}: + + { + setSelectedAssemblyNames( + selectedAssemblyNames + .map((asm, idx2) => (idx2 === idx ? undefined : asm)) + .filter(notEmpty), + ) + setPreConfiguredSyntenyTracksToShow( + preConfiguredSyntenyTracksToShow + .map((asm, idx2) => (idx2 === idx ? undefined : asm)) + .filter(notEmpty), + ) + setUserOpenedSyntenyTracksToShow( + userOpenedSyntenyTracksToShow + .map((asm, idx2) => (idx2 === idx ? undefined : asm)) + .filter(notEmpty), + ) + if (selectedRow >= selectedAssemblyNames.length - 2) { + setSelectedRow(0) + } + }} + > + + + { + setSelectedAssemblyNames( + selectedAssemblyNames.map((asm, idx2) => + idx2 === idx ? newAssembly : asm, + ), + ) + }} + session={session} + /> + {idx !== selectedAssemblyNames.length - 1 ? ( + { + setSelectedRow(idx) + }} + > + + + ) : null} +
+ ))} +
+ + +
+
+ + +
+
+ Synteny dataset to display between row {selectedRow + 1} and{' '} + {selectedRow + 2} +
+ { + const clone = [...preConfiguredSyntenyTracksToShow] + clone[selectedRow] = arg + setPreConfiguredSyntenyTracksToShow(clone) + }} + setUserOpenedSyntenyTrack={arg => { + const clone = [...userOpenedSyntenyTracksToShow] + clone[selectedRow] = arg + setUserOpenedSyntenyTracksToShow(clone) + }} + /> +
+
+ +
+ ) +}) + +async function doSubmit({ + selectedAssemblyNames, + model, + preConfiguredSyntenyTracksToShow, + userOpenedSyntenyTracksToShow, +}: { + selectedAssemblyNames: string[] + model: LinearSyntenyViewModel + userOpenedSyntenyTracksToShow: Conf[] + preConfiguredSyntenyTracksToShow: (string | undefined)[] +}) { + const session = getSession(model) + const { assemblyManager } = session + + model.setViews( + await Promise.all( + selectedAssemblyNames.map(async assemblyName => { + const asm = await assemblyManager.waitForAssembly(assemblyName) + if (!asm) { + throw new Error(`Assembly "${assemblyName}" failed to load`) + } + return { + type: 'LinearGenomeView' as const, + bpPerPx: 1, + offsetPx: 0, + hideHeader: true, + displayedRegions: asm.regions, + } + }), + ), + ) + for (const view of model.views) { + view.setWidth(model.width) + view.showAllRegions() + } + if (!isSessionWithAddTracks(session)) { + session.notify("Can't add tracks", 'warning') + } else { + userOpenedSyntenyTracksToShow.map((f, idx) => { + if (f) { + session.addTrackConf(f) + model.toggleTrack(f.trackId, idx) + } + }) + } + preConfiguredSyntenyTracksToShow.map((f, idx) => { + if (f) { + model.showTrack(f, idx) + } + }) +} + +export default LinearSyntenyViewImportForm diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/Spacer.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/Spacer.tsx new file mode 100644 index 0000000000..105b358775 --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/Spacer.tsx @@ -0,0 +1,5 @@ +import React from 'react' + +export default function Spacer() { + return
+} diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/TrackSelector.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/TrackSelector.tsx new file mode 100644 index 0000000000..684b4b62b7 --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/TrackSelector.tsx @@ -0,0 +1,78 @@ +import React, { useState, useEffect } from 'react' +import { Select, MenuItem, Paper, Typography } from '@mui/material' +import { getSession } from '@jbrowse/core/util' +import { getTrackName } from '@jbrowse/core/util/tracks' +import { ErrorMessage } from '@jbrowse/core/ui' +import { + AnyConfigurationModel, + readConfObject, +} from '@jbrowse/core/configuration' +import { observer } from 'mobx-react' + +// locals +import { LinearSyntenyViewModel } from '../../model' + +const ImportSyntenyTrackSelector = observer(function ({ + model, + assembly1, + assembly2, + preConfiguredSyntenyTrack, + setPreConfiguredSyntenyTrack, +}: { + model: LinearSyntenyViewModel + assembly1: string + assembly2: string + preConfiguredSyntenyTrack: string | undefined + setPreConfiguredSyntenyTrack: (arg: string) => void +}) { + const session = getSession(model) + const { tracks = [], sessionTracks = [] } = session + const allTracks = [...tracks, ...sessionTracks] as AnyConfigurationModel[] + const filteredTracks = allTracks.filter(track => { + const assemblyNames = readConfObject(track, 'assemblyNames') + return ( + assemblyNames.includes(assembly1) && + assemblyNames.includes(assembly2) && + track.type.includes('Synteny') + ) + }) + const resetTrack = filteredTracks[0]?.trackId || '' + const [value, setValue] = useState(resetTrack) + + useEffect(() => { + // sets track data in a useEffect because the initial load is needed as + // well as onChange's to the select box + if (value !== preConfiguredSyntenyTrack) { + setPreConfiguredSyntenyTrack(value) + } + }, [value, preConfiguredSyntenyTrack, setPreConfiguredSyntenyTrack]) + return ( + + + Select a track from the select box below, the track will be shown when + you hit "Launch". + + + {filteredTracks.length ? ( + + ) : ( + + )} + + ) +}) + +export default ImportSyntenyTrackSelector diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.tsx new file mode 100644 index 0000000000..98c8a50883 --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.tsx @@ -0,0 +1,79 @@ +import React, { useState, useEffect } from 'react' +import { FormControl, FormControlLabel, Radio, RadioGroup } from '@mui/material' +import { SnapshotIn } from 'mobx-state-tree' +import { AnyConfigurationModel } from '@jbrowse/core/configuration' + +// locals +import { LinearSyntenyViewModel } from '../../model' +import ImportCustomTrack from './AddCustomTrack' +import ImportSyntenyTrackSelector from './TrackSelector' + +type Conf = SnapshotIn + +export default function TrackSelector({ + model, + assembly1, + assembly2, + preConfiguredSyntenyTrack, + setPreConfiguredSyntenyTrack, + setUserOpenedSyntenyTrack, +}: { + model: LinearSyntenyViewModel + assembly1: string + assembly2: string + preConfiguredSyntenyTrack: string | undefined + setUserOpenedSyntenyTrack: (arg: Conf) => void + setPreConfiguredSyntenyTrack: (arg?: string) => void +}) { + const [choice, setChoice] = useState('tracklist') + + useEffect(() => { + if (choice === 'none') { + setPreConfiguredSyntenyTrack(undefined) + setUserOpenedSyntenyTrack(undefined) + } + }, [choice, setPreConfiguredSyntenyTrack, setUserOpenedSyntenyTrack]) + return ( +
+ + { + setChoice(event.target.value) + }} + aria-labelledby="group-label" + > + } label="None" /> + } + label="Existing track" + /> + } + label="New track" + /> + + + {choice === 'custom' ? ( + + ) : null} + {choice === 'tracklist' ? ( + + ) : null} +
+ ) +} diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/index.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/index.tsx deleted file mode 100644 index 04ed6a4001..0000000000 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/components/ImportForm/index.tsx +++ /dev/null @@ -1,234 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { - Button, - Container, - FormControl, - FormLabel, - FormControlLabel, - Grid, - Paper, - Radio, - RadioGroup, -} from '@mui/material' -import { makeStyles } from 'tss-react/mui' -import { observer } from 'mobx-react' -import { AnyConfigurationModel } from '@jbrowse/core/configuration' -import { SnapshotIn } from 'mobx-state-tree' -import { getSession, isSessionWithAddTracks } from '@jbrowse/core/util' -import { ErrorMessage, AssemblySelector } from '@jbrowse/core/ui' - -// locals -import { LinearSyntenyViewModel } from '../../model' -import ImportCustomTrack from './ImportCustomTrack' -import ImportSyntenyTrackSelector from './ImportSyntenyTrackSelector' - -const useStyles = makeStyles()(theme => ({ - importFormContainer: { - padding: theme.spacing(4), - margin: '0 auto', - }, - assemblySelector: { - width: '75%', - margin: '0 auto', - }, -})) - -type Conf = SnapshotIn - -function TrackSelector({ - setSessionTrackData, - setShowTrackId, - sessionTrackData, - assembly1, - assembly2, - model, -}: { - sessionTrackData: Conf - setSessionTrackData: (arg: Conf) => void - setShowTrackId: (arg?: string) => void - model: LinearSyntenyViewModel - assembly1: string - assembly2: string -}) { - const [choice, setChoice] = useState('tracklist') - - useEffect(() => { - if (choice === 'none') { - setSessionTrackData(undefined) - setShowTrackId(undefined) - } - }, [choice, setSessionTrackData, setShowTrackId]) - return ( - <> - - - (Optional) Select or add a synteny track - - { - setChoice(event.target.value) - }} - aria-labelledby="group-label" - > - } label="None" /> - } - label="Existing track" - /> - } - label="New track" - /> - - - {choice === 'custom' ? ( - - ) : null} - {choice === 'tracklist' ? ( - - ) : null} - - ) -} - -const LinearSyntenyViewImportForm = observer(function ({ - model, -}: { - model: LinearSyntenyViewModel -}) { - const { classes } = useStyles() - const session = getSession(model) - const { assemblyNames } = session - const [assembly2, setAssembly2] = useState(assemblyNames[0] || '') - const [assembly1, setAssembly1] = useState(assemblyNames[0] || '') - const [error, setError] = useState() - const [sessionTrackData, setSessionTrackData] = useState() - const [showTrackId, setShowTrackId] = useState() - - async function onOpenClick() { - try { - if (!isSessionWithAddTracks(session)) { - return - } - setError(undefined) - - const { assemblyManager } = session - const assemblies = [assembly1, assembly2] - model.setViews( - await Promise.all( - assemblies.map(async sel => { - const asm = await assemblyManager.waitForAssembly(sel) - if (!asm) { - throw new Error(`Assembly ${sel} failed to load`) - } - return { - type: 'LinearGenomeView' as const, - bpPerPx: 1, - offsetPx: 0, - hideHeader: true, - displayedRegions: asm.regions, - } - }), - ), - ) - model.views.forEach(view => { - view.setWidth(model.width) - }) - model.views.forEach(view => { - view.showAllRegions() - }) - if (sessionTrackData) { - session.addTrackConf(sessionTrackData) - model.toggleTrack(sessionTrackData.trackId) - } else if (showTrackId) { - model.showTrack(showTrackId) - } - } catch (e) { - console.error(e) - setError(e) - } - } - - // this is a combination of any displayed error message we have - const displayError = error - return ( - - {displayError ? : null} - - - -

- Select assemblies for linear synteny view -

- - - { - setAssembly1(val) - }} - session={session} - /> - - - { - setAssembly2(val) - }} - session={session} - /> - - - - - - - -
- -
-
-
- ) -}) - -export default LinearSyntenyViewImportForm diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/components/LinearSyntenyView.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/components/LinearSyntenyView.tsx index b7145c4907..dfb4a779fd 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/components/LinearSyntenyView.tsx +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/components/LinearSyntenyView.tsx @@ -5,13 +5,15 @@ import { observer } from 'mobx-react' import LinearComparativeViewComponent from '../../LinearComparativeView/components/LinearComparativeView' import { LinearSyntenyViewModel } from '../model' -const ImportForm = lazy(() => import('./ImportForm')) +const LinearSyntenyImportForm = lazy( + () => import('./ImportForm/LinearSyntenyImportForm'), +) type LSV = LinearSyntenyViewModel -const LinearSyntenyView = observer(({ model }: { model: LSV }) => { +const LinearSyntenyView = observer(function ({ model }: { model: LSV }) { return !model.initialized ? ( - + ) : ( ) diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/index.ts b/plugins/linear-comparative-view/src/LinearSyntenyView/index.ts index 8d9f4746ab..3df0ed4d3a 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/index.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/index.ts @@ -1,8 +1,9 @@ import { lazy } from 'react' import PluginManager from '@jbrowse/core/PluginManager' -import modelFactory from './model' import ViewType from '@jbrowse/core/pluggableElementTypes/ViewType' +import modelFactory from './model' + export default function LinearSyntenyViewF(pluginManager: PluginManager) { pluginManager.addViewType(() => { return new ViewType({ diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/model.test.ts b/plugins/linear-comparative-view/src/LinearSyntenyView/model.test.ts deleted file mode 100644 index 5761fb9989..0000000000 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/model.test.ts +++ /dev/null @@ -1,1605 +0,0 @@ -import PluginManager from '@jbrowse/core/PluginManager' -import LinearGenomeViewPlugin from '@jbrowse/plugin-linear-genome-view' -import SequencePlugin from '@jbrowse/plugin-sequence' -import stateModelFactory from './model' - -test('creation', () => { - const pluginManager = new PluginManager([ - new LinearGenomeViewPlugin(), - new SequencePlugin(), - ]) - .createPluggableElements() - .configure() - const model = stateModelFactory(pluginManager) - model.create({ - // @ts-expect-error - type: 'LinearSyntenyView', - views: [ - { - type: 'LinearGenomeView', - displayedRegions: [ - { - refName: 'Pp01', - start: 0, - end: 47851208, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp02', - start: 0, - end: 30405870, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp03', - start: 0, - end: 27368013, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp04', - start: 0, - end: 25843236, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp05', - start: 0, - end: 18496696, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp06', - start: 0, - end: 30767194, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp07', - start: 0, - end: 22388614, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'Pp08', - start: 0, - end: 22573980, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_12', - start: 0, - end: 167479, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_15', - start: 0, - end: 72028, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_13', - start: 0, - end: 69962, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_16', - start: 0, - end: 38727, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_18', - start: 0, - end: 32503, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_19', - start: 0, - end: 32043, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_20', - start: 0, - end: 30119, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_21', - start: 0, - end: 28663, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_23', - start: 0, - end: 27846, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_24', - start: 0, - end: 25707, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_26', - start: 0, - end: 23005, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_32', - start: 0, - end: 22324, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_28', - start: 0, - end: 21453, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_40', - start: 0, - end: 18616, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_30', - start: 0, - end: 18507, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_38', - start: 0, - end: 18477, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_34', - start: 0, - end: 18055, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_33', - start: 0, - end: 17159, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_35', - start: 0, - end: 16788, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_37', - start: 0, - end: 16633, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_39', - start: 0, - end: 15657, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_101', - start: 0, - end: 15118, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_42', - start: 0, - end: 14945, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_58', - start: 0, - end: 14802, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_57', - start: 0, - end: 13972, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_199', - start: 0, - end: 13173, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_51', - start: 0, - end: 12576, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_295', - start: 0, - end: 12535, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_69', - start: 0, - end: 12322, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_53', - start: 0, - end: 12283, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_54', - start: 0, - end: 12175, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_62', - start: 0, - end: 12137, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_55', - start: 0, - end: 12005, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_61', - start: 0, - end: 11986, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_60', - start: 0, - end: 11897, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_67', - start: 0, - end: 11828, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_68', - start: 0, - end: 11057, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_73', - start: 0, - end: 11032, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_66', - start: 0, - end: 11015, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_78', - start: 0, - end: 10992, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_70', - start: 0, - end: 10689, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_104', - start: 0, - end: 10646, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_72', - start: 0, - end: 10595, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_71', - start: 0, - end: 10576, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_77', - start: 0, - end: 10450, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_196', - start: 0, - end: 10371, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_80', - start: 0, - end: 9725, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_84', - start: 0, - end: 9539, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_297', - start: 0, - end: 8994, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_92', - start: 0, - end: 8951, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_90', - start: 0, - end: 8670, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_135', - start: 0, - end: 8639, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_129', - start: 0, - end: 8426, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_121', - start: 0, - end: 8362, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_97', - start: 0, - end: 8262, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_136', - start: 0, - end: 8239, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_144', - start: 0, - end: 7971, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_260', - start: 0, - end: 7959, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_111', - start: 0, - end: 7938, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_108', - start: 0, - end: 7601, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_123', - start: 0, - end: 7505, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_158', - start: 0, - end: 7410, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_112', - start: 0, - end: 7332, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_130', - start: 0, - end: 7301, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_225', - start: 0, - end: 7279, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_167', - start: 0, - end: 7275, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_127', - start: 0, - end: 7029, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_143', - start: 0, - end: 7028, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_116', - start: 0, - end: 7027, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_125', - start: 0, - end: 6961, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_242', - start: 0, - end: 6946, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_157', - start: 0, - end: 6895, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_149', - start: 0, - end: 6780, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_155', - start: 0, - end: 6743, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_353', - start: 0, - end: 6571, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_137', - start: 0, - end: 6550, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_328', - start: 0, - end: 6504, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_200', - start: 0, - end: 6486, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_134', - start: 0, - end: 6400, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_194', - start: 0, - end: 6379, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_302', - start: 0, - end: 6282, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_138', - start: 0, - end: 6232, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_232', - start: 0, - end: 6198, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_139', - start: 0, - end: 6164, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_146', - start: 0, - end: 6143, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_140', - start: 0, - end: 6128, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_141', - start: 0, - end: 6087, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_166', - start: 0, - end: 6011, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_335', - start: 0, - end: 6007, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_147', - start: 0, - end: 6001, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_171', - start: 0, - end: 6000, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_339', - start: 0, - end: 5997, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_325', - start: 0, - end: 5815, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_162', - start: 0, - end: 5735, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_151', - start: 0, - end: 5646, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_164', - start: 0, - end: 5625, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_211', - start: 0, - end: 5602, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_153', - start: 0, - end: 5581, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_165', - start: 0, - end: 5579, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_340', - start: 0, - end: 5575, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_156', - start: 0, - end: 5507, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_202', - start: 0, - end: 5495, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_161', - start: 0, - end: 5491, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_213', - start: 0, - end: 5334, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_187', - start: 0, - end: 5301, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_168', - start: 0, - end: 5300, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_183', - start: 0, - end: 5295, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_163', - start: 0, - end: 5263, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_169', - start: 0, - end: 5261, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_174', - start: 0, - end: 5192, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_249', - start: 0, - end: 5131, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_189', - start: 0, - end: 5090, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_175', - start: 0, - end: 5047, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_181', - start: 0, - end: 5029, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_326', - start: 0, - end: 5022, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_256', - start: 0, - end: 4999, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_332', - start: 0, - end: 4969, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_234', - start: 0, - end: 4914, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_319', - start: 0, - end: 4850, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_272', - start: 0, - end: 4837, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_208', - start: 0, - end: 4817, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_182', - start: 0, - end: 4817, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_219', - start: 0, - end: 4624, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_188', - start: 0, - end: 4608, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_191', - start: 0, - end: 4575, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_192', - start: 0, - end: 4533, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_247', - start: 0, - end: 4525, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_221', - start: 0, - end: 4499, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_220', - start: 0, - end: 4478, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_258', - start: 0, - end: 4446, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_231', - start: 0, - end: 4391, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_203', - start: 0, - end: 4346, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_236', - start: 0, - end: 4257, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_288', - start: 0, - end: 4251, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_237', - start: 0, - end: 4247, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_228', - start: 0, - end: 4116, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_215', - start: 0, - end: 4100, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_281', - start: 0, - end: 4092, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_244', - start: 0, - end: 4017, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_246', - start: 0, - end: 4016, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_285', - start: 0, - end: 3892, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_280', - start: 0, - end: 3885, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_298', - start: 0, - end: 3815, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_286', - start: 0, - end: 3789, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_276', - start: 0, - end: 3789, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_336', - start: 0, - end: 3708, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_259', - start: 0, - end: 3708, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_239', - start: 0, - end: 3699, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_254', - start: 0, - end: 3576, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_248', - start: 0, - end: 3541, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_250', - start: 0, - end: 3536, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_255', - start: 0, - end: 3476, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_330', - start: 0, - end: 3429, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_279', - start: 0, - end: 3424, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_266', - start: 0, - end: 3415, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_337', - start: 0, - end: 3411, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_270', - start: 0, - end: 3362, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_291', - start: 0, - end: 3320, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_324', - start: 0, - end: 3154, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_271', - start: 0, - end: 3153, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_296', - start: 0, - end: 3020, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_307', - start: 0, - end: 2997, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_346', - start: 0, - end: 2995, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_306', - start: 0, - end: 2957, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_284', - start: 0, - end: 2907, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_311', - start: 0, - end: 2890, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_347', - start: 0, - end: 2805, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_321', - start: 0, - end: 2536, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_308', - start: 0, - end: 2380, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_313', - start: 0, - end: 2374, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_312', - start: 0, - end: 2068, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_334', - start: 0, - end: 1821, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_327', - start: 0, - end: 1589, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_331', - start: 0, - end: 1501, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_333', - start: 0, - end: 1452, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_338', - start: 0, - end: 1306, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_343', - start: 0, - end: 1164, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_344', - start: 0, - end: 1163, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_345', - start: 0, - end: 1145, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_349', - start: 0, - end: 1099, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_350', - start: 0, - end: 1092, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_351', - start: 0, - end: 1071, - reversed: false, - assemblyName: 'peach', - }, - { - refName: 'scaffold_352', - start: 0, - end: 1061, - reversed: false, - assemblyName: 'peach', - }, - ], - bpPerPx: 19914.295609223023, - offsetPx: 3973, - tracks: [], - }, - { - type: 'LinearGenomeView', - displayedRegions: [ - { - refName: 'chr1', - start: 0, - end: 23037639, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr10', - start: 0, - end: 18140952, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr10_random', - start: 0, - end: 789605, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr11', - start: 0, - end: 19818926, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr11_random', - start: 0, - end: 282498, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr12', - start: 0, - end: 22702307, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr12_random', - start: 0, - end: 1566225, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr13', - start: 0, - end: 24396255, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr13_random', - start: 0, - end: 3268264, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr14', - start: 0, - end: 30274277, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr15', - start: 0, - end: 20304914, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr16', - start: 0, - end: 22053297, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr16_random', - start: 0, - end: 740079, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr17', - start: 0, - end: 17126926, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr17_random', - start: 0, - end: 829735, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr18', - start: 0, - end: 29360087, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr18_random', - start: 0, - end: 5170003, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr19', - start: 0, - end: 24021853, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr1_random', - start: 0, - end: 568933, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr2', - start: 0, - end: 18779844, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr3', - start: 0, - end: 19341862, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr3_random', - start: 0, - end: 1220746, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr4', - start: 0, - end: 23867706, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr4_random', - start: 0, - end: 76237, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr5', - start: 0, - end: 25021643, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr5_random', - start: 0, - end: 421237, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr6', - start: 0, - end: 21508407, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr7', - start: 0, - end: 21026613, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr7_random', - start: 0, - end: 1447032, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr8', - start: 0, - end: 22385789, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr9', - start: 0, - end: 23006712, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chr9_random', - start: 0, - end: 487831, - reversed: false, - assemblyName: 'grape', - }, - { - refName: 'chrUn', - start: 0, - end: 43154196, - reversed: false, - assemblyName: 'grape', - }, - ], - bpPerPx: 67300.98485738254, - offsetPx: 5893, - tracks: [], - }, - ], - displayName: 'A vs B', - }) -}) diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/model.ts b/plugins/linear-comparative-view/src/LinearSyntenyView/model.ts index 3213589974..32546586c2 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/model.ts +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/model.ts @@ -75,9 +75,9 @@ export default function stateModelFactory(pluginManager: PluginManager) { */ showAllRegions() { transaction(() => { - self.views.forEach(view => { + for (const view of self.views) { view.showAllRegionsInAssembly() - }) + } }) }, })) diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.tsx new file mode 100644 index 0000000000..9023db2a8e --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.tsx @@ -0,0 +1,55 @@ +import React from 'react' +import { useTheme } from '@mui/material' +import { getFillProps } from '@jbrowse/core/util' +import { + SVGTracks, + SVGRuler, + LinearGenomeViewModel, +} from '@jbrowse/plugin-linear-genome-view' + +export default function SVGLinearGenomeView({ + trackLabelOffset, + fontSize, + textHeight, + trackLabels, + view, + displayResults, + rulerHeight, + shift, +}: { + textHeight: number + trackLabels: string + trackLabelOffset: number + fontSize: number + view: LinearGenomeViewModel + + displayResults: any + rulerHeight: number + shift: number +}) { + const theme = useTheme() + return ( + + + + {view.assemblyNames.join(', ')} + + + + + + + + ) +} diff --git a/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx b/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx index 32f6a68444..c73b6ed4fb 100644 --- a/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx +++ b/plugins/linear-comparative-view/src/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.tsx @@ -11,29 +11,25 @@ import { renderToAbstractCanvas, renderToStaticMarkup, sum, - getFillProps, } from '@jbrowse/core/util' import { getTrackName } from '@jbrowse/core/util/tracks' import { createJBrowseTheme } from '@jbrowse/core/ui' -import { - SVGTracks, - SVGRuler, - totalHeight, -} from '@jbrowse/plugin-linear-genome-view' +import { totalHeight } from '@jbrowse/plugin-linear-genome-view' // locals import SVGBackground from './SVGBackground' +import SVGLinearGenomeView from './SVGLinearGenomeView' import { ExportSvgOptions, LinearSyntenyViewModel } from '../model' import { drawRef } from '../../LinearSyntenyDisplay/drawSynteny' -type LSV = LinearSyntenyViewModel - // render LGV to SVG -export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { +export async function renderToSvg( + model: LinearSyntenyViewModel, + opts: ExportSvgOptions, +) { await when(() => model.initialized) const { textHeight = 18, - headerHeight = 30, rulerHeight = 30, fontSize = 13, trackLabels = 'offset', @@ -42,15 +38,16 @@ export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { } = opts const session = getSession(model) const themeVar = session.allThemes?.()[themeName] - const { width, views, middleComparativeHeight: synH, tracks } = model + const { width, views, levels } = model const shift = 50 - const offset = headerHeight + rulerHeight + const offset = rulerHeight const { createRootFn } = getRoot(model) const heights = views.map( v => totalHeight(v.tracks, textHeight, trackLabels) + offset, ) - const totalHeightSvg = sum(heights) + synH + 100 + const totalHeightSvg = sum(heights) + sum(levels.map(l => l.height)) + 100 + const displayResults = await Promise.all( views.map( async view => @@ -71,40 +68,45 @@ export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { ) const renderings = await Promise.all( - tracks.map(async track => { - const d = track.displays[0] - await when(() => (d.ready !== undefined ? d.ready : true)) - const r = await renderToAbstractCanvas( - width, - synH, - { exportSVG: opts }, - ctx => { - drawRef(d, ctx) - return undefined - }, - ) + levels.map( + async level => + await Promise.all( + level.tracks.map(async track => { + const d = track.displays[0] + await when(() => (d.ready !== undefined ? d.ready : true)) + const r = await renderToAbstractCanvas( + width, + level.height, + { exportSVG: opts }, + ctx => { + drawRef(d, ctx) + return undefined + }, + ) - if ('imageData' in r) { - throw new Error('found a canvas in svg export, probably a bug') - } - if ('canvasRecordedData' in r) { - return { - html: await getSerializedSvg({ - ...r, - width, - height: synH, + if ('imageData' in r) { + throw new Error('found a canvas in svg export, probably a bug') + } else if ('canvasRecordedData' in r) { + return { + html: await getSerializedSvg({ + ...r, + width, + height: level.height, + }), + } + } else { + return r + } }), - } - } - return r - }), + ), + ), ) const trackLabelMaxLen = max( views.flatMap(view => - view.tracks.map(t => - measureText(getTrackName(t.configuration, session), fontSize), + view.tracks.map(track => + measureText(getTrackName(track.configuration, session), fontSize), ), ), 0, @@ -112,6 +114,61 @@ export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { const trackLabelOffset = trackLabels === 'left' ? trackLabelMaxLen : 0 const w = width + trackLabelOffset const theme = createJBrowseTheme(themeVar) + const RenderList = [ + , + ] as React.ReactNode[] + let currOffset = heights[0]! + fontSize + rulerHeight + for (let i = 1; i < views.length; i++) { + const view = views[i]! + const level = levels[i - 1]! + const rendering = renderings[i - 1] + const height = heights[i]! + const levelHeight = level.height || 0 + RenderList.push( + + {levelHeight ? ( + + + + + + ) : null} + + {rendering?.map((r, i) => ( + /* biome-ignore lint/suspicious/noArrayIndexKey: */ + + ))} + + + + + , + ) + currOffset += height + fontSize + rulerHeight + levelHeight + } // the xlink namespace is used for rendering tag return renderToStaticMarkup( @@ -125,66 +182,7 @@ export async function renderToSvg(model: LSV, opts: ExportSvgOptions) { viewBox={[0, 0, w + shift * 2, totalHeightSvg].toString()} > - - - - {views[0]!.assemblyNames.join(', ')} - - - - - - - - - - - - - - {renderings.map((r, i) => ( - /* biome-ignore lint/suspicious/noArrayIndexKey: */ - - ))} - - - - - {views[1]!.assemblyNames.join(', ')} - - - - - + {RenderList} , diff --git a/plugins/linear-comparative-view/src/LinearSyntenyViewHelper/index.tsx b/plugins/linear-comparative-view/src/LinearSyntenyViewHelper/index.tsx new file mode 100644 index 0000000000..7796c71d11 --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyViewHelper/index.tsx @@ -0,0 +1,22 @@ +import React from 'react' +import PluginManager from '@jbrowse/core/PluginManager' +import ViewType from '@jbrowse/core/pluggableElementTypes/ViewType' +import { linearSyntenyViewHelperModelFactory } from './stateModelFactory' + +function UnusedComponent() { + return
+} + +export default function LinearSyntenyViewF(pluginManager: PluginManager) { + pluginManager.addViewType(() => { + return new ViewType({ + name: 'LinearSyntenyViewHelper', + displayName: 'Linear synteny view (helper)', + viewMetadata: { + hiddenFromGUI: true, + }, + stateModel: linearSyntenyViewHelperModelFactory(pluginManager), + ReactComponent: UnusedComponent, + }) + }) +} diff --git a/plugins/linear-comparative-view/src/LinearSyntenyViewHelper/stateModelFactory.ts b/plugins/linear-comparative-view/src/LinearSyntenyViewHelper/stateModelFactory.ts new file mode 100644 index 0000000000..1480fa52fd --- /dev/null +++ b/plugins/linear-comparative-view/src/LinearSyntenyViewHelper/stateModelFactory.ts @@ -0,0 +1,133 @@ +import { + getRoot, + resolveIdentifier, + types, + Instance, + getParent, +} from 'mobx-state-tree' +import PluginManager from '@jbrowse/core/PluginManager' +import { transaction } from 'mobx' +import { AnyConfigurationModel } from '@jbrowse/core/configuration' +import { ElementId } from '@jbrowse/core/util/types/mst' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +export function linearSyntenyViewHelperModelFactory( + pluginManager: PluginManager, +) { + return types + .model('LinearSyntenyViewHelper', { + /** + * #property + */ + id: ElementId, + /** + * #property + */ + type: 'LinearSyntenyViewHelper', + /** + * #property + */ + tracks: types.array( + pluginManager.pluggableMstType('track', 'stateModel'), + ), + /** + * #property + */ + height: 100, + /** + * #property + */ + level: types.number, + }) + .actions(self => ({ + /** + * #action + */ + setHeight(n: number) { + self.height = n + return self.height + }, + + /** + * #action + */ + showTrack(trackId: string, initialSnapshot = {}) { + const schema = pluginManager.pluggableConfigSchemaType('track') + const configuration = resolveIdentifier(schema, getRoot(self), trackId) + if (!configuration) { + throw new Error(`track not found ${trackId}`) + } + const trackType = pluginManager.getTrackType(configuration.type) + if (!trackType) { + throw new Error(`unknown track type ${configuration.type}`) + } + const viewType = pluginManager.getViewType(self.type)! + const supportedDisplays = new Set( + viewType.displayTypes.map(d => d.name), + ) + const displayConf = configuration.displays.find( + (d: AnyConfigurationModel) => supportedDisplays.has(d.type), + ) + if (!displayConf) { + throw new Error( + `could not find a compatible display for view type ${self.type}`, + ) + } + + self.tracks.push( + trackType.stateModel.create({ + ...initialSnapshot, + type: configuration.type, + configuration, + displays: [ + { + type: displayConf.type, + configuration: displayConf, + }, + ], + }), + ) + }, + + /** + * #action + */ + hideTrack(trackId: string) { + const schema = pluginManager.pluggableConfigSchemaType('track') + const config = resolveIdentifier(schema, getRoot(self), trackId) + const shownTracks = self.tracks.filter(t => t.configuration === config) + transaction(() => { + shownTracks.forEach(t => { + self.tracks.remove(t) + }) + }) + return shownTracks.length + }, + /** + * #action + */ + toggleTrack(trackId: string) { + const hiddenCount = this.hideTrack(trackId) + if (!hiddenCount) { + this.showTrack(trackId) + return true + } + return false + }, + })) + .views(self => ({ + get assemblyNames() { + const p = getParent<{ views: LinearGenomeViewModel[] }>(self, 2) + return [ + p.views[self.level]!.assemblyNames[0], + p.views[self.level + 1]!.assemblyNames[0], + ] + }, + })) +} + +export type LinearSyntenyViewHelperStateModel = ReturnType< + typeof linearSyntenyViewHelperModelFactory +> +export type LinearSyntenyViewHelperModel = + Instance diff --git a/plugins/linear-comparative-view/src/index.tsx b/plugins/linear-comparative-view/src/index.tsx index 14cc735036..b1502789cd 100644 --- a/plugins/linear-comparative-view/src/index.tsx +++ b/plugins/linear-comparative-view/src/index.tsx @@ -8,6 +8,7 @@ import LinearComparativeViewF from './LinearComparativeView' import LinearSyntenyDisplayF from './LinearSyntenyDisplay' import LGVSyntenyDisplayF from './LGVSyntenyDisplay' import LinearSyntenyViewF from './LinearSyntenyView' +import LinearSyntenyViewHelperF from './LinearSyntenyViewHelper' import LaunchLinearSyntenyViewF from './LaunchLinearSyntenyView' import SyntenyTrackF from './SyntenyTrack' import LinearReadVsRefMenuItemF from './LinearReadVsRef' @@ -16,6 +17,7 @@ export default class LinearComparativeViewPlugin extends Plugin { name = 'LinearComparativeViewPlugin' install(pluginManager: PluginManager) { + LinearSyntenyViewHelperF(pluginManager) LinearComparativeViewF(pluginManager) LinearSyntenyViewF(pluginManager) LinearComparativeDisplayF(pluginManager) diff --git a/plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/AutocompleteTextField.tsx b/plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/AutocompleteTextField.tsx index 6406b1e7c1..86a91b8587 100644 --- a/plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/AutocompleteTextField.tsx +++ b/plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/AutocompleteTextField.tsx @@ -27,8 +27,8 @@ export default function AutocompleteTextField({ return ( { - // this is used to restore a refName or the non-user-typed input - // to the box on blurring + // this is used to restore a refName or the non-user-typed input to the + // box on blurring setInputValue(inputBoxVal) }} {...params} diff --git a/plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarRefNameLabels.tsx b/plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarRefNameLabels.tsx index b6aae13d14..d1920460e3 100644 --- a/plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarRefNameLabels.tsx +++ b/plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarRefNameLabels.tsx @@ -53,7 +53,7 @@ const ScalebarRefNameLabels = observer(function ({ model }: { model: LGV }) { type, refName, } = block - const last = (index = lastLeftBlock) + const last = index === lastLeftBlock return type === 'ContentBlock' && (isLeftEndOfDisplayedRegion || last) ? ( - + + + diff --git a/plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGTracks.tsx b/plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGTracks.tsx index 877eea01a6..4a058eca08 100644 --- a/plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGTracks.tsx +++ b/plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGTracks.tsx @@ -21,7 +21,6 @@ interface DisplayResult { export default function SVGTracks({ displayResults, model, - offset, textHeight, fontSize, trackLabels = 'offset', @@ -29,7 +28,6 @@ export default function SVGTracks({ }: { displayResults: DisplayResult[] model: LGV - offset: number textHeight: number fontSize: number trackLabels?: string @@ -37,6 +35,7 @@ export default function SVGTracks({ }) { const session = getSession(model) const textOffset = trackLabels === 'offset' ? textHeight : 0 + let offset = 0 return ( <> {displayResults.map(({ track, result }) => { diff --git a/products/jbrowse-web/package.json b/products/jbrowse-web/package.json index 0d0d9b8e8b..6222f5bc30 100644 --- a/products/jbrowse-web/package.json +++ b/products/jbrowse-web/package.json @@ -9,9 +9,7 @@ "start": "node scripts/start.js", "build": "node scripts/build.js", "postbuild": "node -e \"fs.writeFileSync('build/version.txt',JSON.parse(require('fs').readFileSync('package.json', 'utf8')).version)\"", - "prepack": "yarn build", - "start-oauth-server": "ts-node --project tsconfig.oauth.json src/tests/OAuthServer/app.ts", - "start-basicauth-server": "ts-node --project tsconfig.oauth.json src/tests/HTTPBasicAuthServer/app.ts" + "prepack": "yarn build" }, "dependencies": { "@fontsource/roboto": "^5.0.2", diff --git a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap index 571ef18387..86143ca9b8 100644 --- a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap +++ b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap @@ -3620,24 +3620,24 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` ], "displays": [ { - "displayId": "volvox_del.paf-1658813720770-DotplotDisplay", + "displayId": "volvox_del.paf-DotplotDisplay", "type": "DotplotDisplay", }, { - "displayId": "volvox_del.paf-1658813720770-LinearComparativeDisplay", + "displayId": "volvox_del.paf-LinearComparativeDisplay", "type": "LinearComparativeDisplay", }, { - "displayId": "volvox_del.paf-1658813720770-LinearSyntenyDisplay", + "displayId": "volvox_del.paf-LinearSyntenyDisplay", "type": "LinearSyntenyDisplay", }, { - "displayId": "volvox_del.paf-1658813720770-LGVSyntenyDisplay", + "displayId": "volvox_del.paf-LGVSyntenyDisplay", "type": "LGVSyntenyDisplay", }, ], "name": "volvox_del.paf", - "trackId": "volvox_del.paf-1658813720770", + "trackId": "volvox_del.paf", "type": "SyntenyTrack", }, { @@ -3661,24 +3661,24 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` ], "displays": [ { - "displayId": "volvox_ins.paf-1658813720770-DotplotDisplay", + "displayId": "volvox_ins.paf-DotplotDisplay", "type": "DotplotDisplay", }, { - "displayId": "volvox_ins.paf-1658813720770-LinearComparativeDisplay", + "displayId": "volvox_ins.paf-LinearComparativeDisplay", "type": "LinearComparativeDisplay", }, { - "displayId": "volvox_ins.paf-1658813720770-LinearSyntenyDisplay", + "displayId": "volvox_ins.paf-LinearSyntenyDisplay", "type": "LinearSyntenyDisplay", }, { - "displayId": "volvox_ins.paf-1658813720770-LGVSyntenyDisplay", + "displayId": "volvox_ins.paf-LGVSyntenyDisplay", "type": "LGVSyntenyDisplay", }, ], "name": "volvox_ins.paf", - "trackId": "volvox_ins.paf-1658813720770", + "trackId": "volvox_ins.paf", "type": "SyntenyTrack", }, { diff --git a/products/jbrowse-web/src/tests/HTTPBasicAuthServer/app.ts b/products/jbrowse-web/src/tests/HTTPBasicAuthServer/app.ts deleted file mode 100644 index efe1ae6701..0000000000 --- a/products/jbrowse-web/src/tests/HTTPBasicAuthServer/app.ts +++ /dev/null @@ -1,5 +0,0 @@ -import app, { port } from '.' - -// eslint-disable-next-line no-console -console.log('HTTP BasicAuth Server listening on port', port) -app.listen(port) diff --git a/products/jbrowse-web/src/tests/HTTPBasicAuthServer/index.ts b/products/jbrowse-web/src/tests/HTTPBasicAuthServer/index.ts deleted file mode 100644 index fe682c3edc..0000000000 --- a/products/jbrowse-web/src/tests/HTTPBasicAuthServer/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import express from 'express' -import path from 'path' -import expressBasicAuth from 'express-basic-auth' -import cors from 'cors' - -const app = express() -export const port = 3040 - -app.use(cors()) - -app.use( - '/data', - expressBasicAuth({ - users: { admin: 'password' }, - }), - express.static( - path.join(__dirname, '..', '..', '..', '..', '..', 'test_data', 'volvox'), - ), -) - -export default app diff --git a/products/jbrowse-web/src/tests/OAuthServer/app.ts b/products/jbrowse-web/src/tests/OAuthServer/app.ts deleted file mode 100644 index 1317962f6a..0000000000 --- a/products/jbrowse-web/src/tests/OAuthServer/app.ts +++ /dev/null @@ -1,5 +0,0 @@ -import app, { port } from '.' - -// eslint-disable-next-line no-console -console.log('OAuth Server listening on port', port) -app.listen(port) diff --git a/products/jbrowse-web/src/tests/OAuthServer/index.ts b/products/jbrowse-web/src/tests/OAuthServer/index.ts deleted file mode 100644 index a7b9b3594a..0000000000 --- a/products/jbrowse-web/src/tests/OAuthServer/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import express from 'express' -import path from 'path' -import cors from 'cors' -import bodyParser from 'body-parser' - -import oauthServer from './oauth/server' - -import authRoute from './routes/auth' - -const app = express() - -export const port = 3000 - -app.use(cors()) - -// Here we are configuring express to use body-parser as middle-ware. -app.use(bodyParser.urlencoded({ extended: false })) -app.use(bodyParser.json()) - -app.use('/oauth', authRoute) // routes to access the auth stuff -app.use( - '/data', - oauthServer.authenticate(), - express.static( - path.join(__dirname, '..', '..', '..', '..', '..', 'test_data', 'volvox'), - ), -) - -// eslint-disable-next-line no-console -console.log( - 'The redirect-uri is http://localhost:3000, must be running jbrowse-web on this port e.g. the default dev server port', -) - -export default app diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot.svg b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot.svg index 0c88556758..900fa2dc9f 100644 --- a/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot.svg +++ b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot.svg @@ -1 +1 @@ -hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds \ No newline at end of file +hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds \ No newline at end of file diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_BACKUP_448199.svg b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_BACKUP_448199.svg new file mode 100644 index 0000000000..bf39be2fd4 --- /dev/null +++ b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_BACKUP_448199.svg @@ -0,0 +1,5 @@ +<<<<<<< HEAD +hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds +======= +hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds +>>>>>>> fe47b878a (Multi-level synteny) diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_BASE_448199.svg b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_BASE_448199.svg new file mode 100644 index 0000000000..4c62a82fcd --- /dev/null +++ b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_BASE_448199.svg @@ -0,0 +1 @@ +hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds \ No newline at end of file diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_LOCAL_448199.svg b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_LOCAL_448199.svg new file mode 100644 index 0000000000..0c88556758 --- /dev/null +++ b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_LOCAL_448199.svg @@ -0,0 +1 @@ +hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds \ No newline at end of file diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_REMOTE_448199.svg b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_REMOTE_448199.svg new file mode 100644 index 0000000000..65d47b62b8 --- /dev/null +++ b/products/jbrowse-web/src/tests/__image_snapshots__/breakpoint_split_view_snapshot_REMOTE_448199.svg @@ -0,0 +1 @@ +hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds \ No newline at end of file diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/lgv_snapshot.svg b/products/jbrowse-web/src/tests/__image_snapshots__/lgv_snapshot.svg index 772d0c130a..6563442670 100644 --- a/products/jbrowse-web/src/tests/__image_snapshots__/lgv_snapshot.svg +++ b/products/jbrowse-web/src/tests/__image_snapshots__/lgv_snapshot.svg @@ -1 +1 @@ -volvox80bpctgA020406080001111GTACAGAGTGACGCTCAAAGCvolvox-sorted.bam (ctgA, canvas) \ No newline at end of file +volvox80bpctgA020406080001111GTACAGAGTGACGCTCAAAGCvolvox-sorted.bam (ctgA, canvas) \ No newline at end of file diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/synteny_snapshot.svg b/products/jbrowse-web/src/tests/__image_snapshots__/synteny_snapshot.svg index 8b6b61590c..d6a4525239 100644 --- a/products/jbrowse-web/src/tests/__image_snapshots__/synteny_snapshot.svg +++ b/products/jbrowse-web/src/tests/__image_snapshots__/synteny_snapshot.svg @@ -1 +1 @@ -volvoxctgA1,8001,9002,0002,100333619537636283334354210515volvox_inv_indelsvolvox_random_invctgA1,8001,9002,0002,1003345844231067567193728415volvox_inv_indels \ No newline at end of file +volvoxctgA1,8001,9002,0002,100333619537636283334354210515volvox_inv_indelsvolvox_random_invctgA1,8001,9002,0002,1003345844231067567193728415volvox_inv_indels \ No newline at end of file diff --git a/products/jbrowse-web/src/tests/__snapshots__/ExportSvg.test.tsx.snap b/products/jbrowse-web/src/tests/__snapshots__/ExportSvg.test.tsx.snap index 63ebcce731..ac2d475b62 100644 --- a/products/jbrowse-web/src/tests/__snapshots__/ExportSvg.test.tsx.snap +++ b/products/jbrowse-web/src/tests/__snapshots__/ExportSvg.test.tsx.snap @@ -4,6 +4,6 @@ exports[`export svg of circular 1`] = `"ctgA16,00018,00020,00022,00024,000volvoxctgA13,00014,00015,00016,00017,00018,00019,00020,000volvox_random_inv"`; -exports[`export svg of lgv 1`] = `"volvox80bpctgA020406080001111GTACAGAGTGACGCTCAAAGCvolvox-sorted.bam (ctgA, canvas)"`; +exports[`export svg of lgv 1`] = `"volvox80bpctgA020406080001111GTACAGAGTGACGCTCAAAGCvolvox-sorted.bam (ctgA, canvas)"`; -exports[`export svg of synteny 1`] = `"volvoxctgA1,8001,9002,0002,100333619537636283334354210515volvox_inv_indelsvolvox_random_invctgA1,8001,9002,0002,1003345844231067567193728415volvox_inv_indels"`; +exports[`export svg of synteny 1`] = `"volvoxctgA1,8001,9002,0002,100333619537636283334354210515volvox_inv_indelsvolvox_random_invctgA1,8001,9002,0002,1003345844231067567193728415volvox_inv_indels"`; diff --git a/products/jbrowse-web/src/tests/__snapshots__/ExportSvgBreakpointSplitView.test.tsx.snap b/products/jbrowse-web/src/tests/__snapshots__/ExportSvgBreakpointSplitView.test.tsx.snap index 6a371fffaf..2682c1d37c 100644 --- a/products/jbrowse-web/src/tests/__snapshots__/ExportSvgBreakpointSplitView.test.tsx.snap +++ b/products/jbrowse-web/src/tests/__snapshots__/ExportSvgBreakpointSplitView.test.tsx.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`export svg of breakpoint split view 1`] = `"hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds"`; +exports[`export svg of breakpoint split view 1`] = `"hg19chr3186,698,000186,700,000chr3186,702,000186,704,0000077HG002.hs37d5.11kbpbsv.BND.3:186700648-6:56758392T[6:56758392[pbsv.BND.3:186700648-6:56758392T[6:56758392[HG002.hs37d5.bndshg19chr656,754,00056,756,00056,758,000chr656,758,00056,760,00056,762,0000088HG002.hs37d5.11kbpbsv.BND.6:56758392-3:186700648]3:186700648]Tpbsv.BND.6:56758392-3:186700648]3:186700648]THG002.hs37d5.bnds"`; diff --git a/test_data/config_demo.json b/test_data/config_demo.json index b723b05a04..ac59c1bbc2 100644 --- a/test_data/config_demo.json +++ b/test_data/config_demo.json @@ -4326,6 +4326,26 @@ }, "assemblyNames": ["chm13v2.0"] }, + { + "type": "FeatureTrack", + "trackId": "hprc-v1.0-minigraph-grch38.bb.bed", + "name": "hprc-v1.0-minigraph-grch38.bb.bed", + "adapter": { + "type": "BedTabixAdapter", + "bedGzLocation": { + "uri": "hprc-v1.0-minigraph-grch38.bb.bed.gz", + "locationType": "UriLocation" + }, + "index": { + "location": { + "uri": "hprc-v1.0-minigraph-grch38.bb.bed.gz.tbi", + "locationType": "UriLocation" + }, + "indexType": "TBI" + } + }, + "assemblyNames": ["hg38"] + }, { "type": "VariantTrack", "trackId": "NA12878_LINE1", diff --git a/test_data/volvox/config.json b/test_data/volvox/config.json index 950f6b6c49..4a20d63eaf 100644 --- a/test_data/volvox/config.json +++ b/test_data/volvox/config.json @@ -1890,7 +1890,7 @@ { "type": "SyntenyTrack", "category": ["Synteny"], - "trackId": "volvox_del.paf-1658813720770", + "trackId": "volvox_del.paf", "name": "volvox_del.paf", "assemblyNames": ["volvox", "volvox_del"], "adapter": { @@ -1905,7 +1905,7 @@ { "type": "SyntenyTrack", "category": ["Synteny"], - "trackId": "volvox_ins.paf-1658813720770", + "trackId": "volvox_ins.paf", "name": "volvox_ins.paf", "assemblyNames": ["volvox", "volvox_ins"], "adapter": { diff --git a/website/docs/models/AssemblyManager.md b/website/docs/models/AssemblyManager.md index 0ac0849609..6e121b92f8 100644 --- a/website/docs/models/AssemblyManager.md +++ b/website/docs/models/AssemblyManager.md @@ -112,14 +112,3 @@ reference. snapshots cannot be used // type signature addAssembly: (configuration: any) => void ``` - -#### action: replaceAssembly - -private: you would generally want to add to manipulate jbrowse.assemblies, -session.sessionAssemblies, or session.temporaryAssemblies instead of using this -directly - -```js -// type signature -replaceAssembly: (idx: number, configuration: any) => void -``` diff --git a/website/docs/models/DotplotView.md b/website/docs/models/DotplotView.md index 507d9ab6fb..e17bcd8c43 100644 --- a/website/docs/models/DotplotView.md +++ b/website/docs/models/DotplotView.md @@ -327,18 +327,18 @@ setHeight: (newHeight: number) => number setError: (e: unknown) => void ``` -#### action: zoomOutButton +#### action: zoomOut ```js // type signature -zoomOutButton: () => void +zoomOut: () => void ``` -#### action: zoomInButton +#### action: zoomIn ```js // type signature -zoomInButton: () => void +zoomIn: () => void ``` #### action: activateTrackSelector @@ -390,13 +390,13 @@ setViews: (arr: ModelCreationType { coord: number; index: number; refName: string; oob: boolean; assemblyName: string; offset: number; start: number; end: number; reversed?: boolean; }[] ``` -#### action: zoomIn +#### action: zoomInToMouseCoords zooms into clicked and dragged region ```js // type signature -zoomIn: (mousedown: Coord, mouseup: Coord) => void +zoomInToMouseCoords: (mousedown: Coord, mouseup: Coord) => void ``` #### action: showAllRegions diff --git a/website/docs/models/LinearComparativeDisplay.md b/website/docs/models/LinearComparativeDisplay.md index 20dbce36f2..94fee65bfe 100644 --- a/website/docs/models/LinearComparativeDisplay.md +++ b/website/docs/models/LinearComparativeDisplay.md @@ -36,22 +36,13 @@ AnyConfigurationSchemaType configuration: ConfigurationReference(configSchema) ``` -#### property: height - -```js -// type signature -number -// code -height: 100 -``` - ### LinearComparativeDisplay - Getters #### getter: renderProps ```js // type -() => { rpcDriverName: string; displayModel: { id: string; type: "LinearComparativeDisplay"; rpcDriverName: string; configuration: { [x: string]: any; } & NonEmptyObject & { ...; } & IStateTreeNode<...>; height: number; } & ... 5 more ... & IStateTreeNode<...>; highResolutionScaling: number; } +() => { rpcDriverName: string; displayModel: { id: string; type: "LinearComparativeDisplay"; rpcDriverName: string; configuration: { [x: string]: any; } & NonEmptyObject & { ...; } & IStateTreeNode<...>; } & ... 5 more ... & IStateTreeNode<...>; highResolutionScaling: number; } ``` ### LinearComparativeDisplay - Actions diff --git a/website/docs/models/LinearComparativeView.md b/website/docs/models/LinearComparativeView.md index 2f39860a74..172a649cb6 100644 --- a/website/docs/models/LinearComparativeView.md +++ b/website/docs/models/LinearComparativeView.md @@ -63,24 +63,13 @@ false interactToggled: false ``` -#### property: middleComparativeHeight +#### property: levels ```js // type signature -number +IArrayType, [undefined]>; type: IType; tracks: IArrayType; height: IType<...>; level: ISimpleType<...>; }, { ...; } & { ...; }, _NotCustomized, _NotCustomized>> // code -middleComparativeHeight: 100 -``` - -#### property: tracks - -```js -// type signature -IArrayType -// code -tracks: types.array( - pluginManager.pluggableMstType('track', 'stateModel'), - ) +levels: types.array(LinearSyntenyViewHelper) ``` #### property: views @@ -113,13 +102,6 @@ viewTrackConfigs: types.array( ### LinearComparativeView - Getters -#### getter: highResolutionScaling - -```js -// type -number -``` - #### getter: initialized ```js @@ -190,39 +172,39 @@ setViews: (views: ModelCreationType, [...]>>; ... 11 more ...; showTrackOutlines: boolean; } & ... 18 more ... & IStateTreeNode<...>) => void ``` -#### action: setMiddleComparativeHeight +#### action: setLevelHeight ```js // type signature -setMiddleComparativeHeight: (n: number) => number +setLevelHeight: (newHeight: number, level?: number) => number ``` #### action: activateTrackSelector ```js // type signature -activateTrackSelector: () => Widget +activateTrackSelector: (level: number) => Widget ``` #### action: toggleTrack ```js // type signature -toggleTrack: (trackId: string) => boolean +toggleTrack: (trackId: string, level?: number) => void ``` #### action: showTrack ```js // type signature -showTrack: (trackId: string, initialSnapshot?: {}) => void +showTrack: (trackId: string, level?: number, initialSnapshot?: {}) => void ``` #### action: hideTrack ```js // type signature -hideTrack: (trackId: string) => number +hideTrack: (trackId: string, level?: number) => void ``` #### action: squareView diff --git a/website/docs/models/LinearSyntenyDisplay.md b/website/docs/models/LinearSyntenyDisplay.md index 31de815f9f..d55846d834 100644 --- a/website/docs/models/LinearSyntenyDisplay.md +++ b/website/docs/models/LinearSyntenyDisplay.md @@ -52,6 +52,13 @@ any string[] ``` +#### getter: height + +```js +// type +number +``` + #### getter: numFeats ```js diff --git a/website/docs/urlparams.md b/website/docs/urlparams.md index 39e66a1966..7409b1fa2b 100644 --- a/website/docs/urlparams.md +++ b/website/docs/urlparams.md @@ -219,7 +219,8 @@ Expanded ### Dotplot view -Here is an example of a JSON session spec for a Dotplot View +Here is an example of a JSON session spec for a dotplot view (self-vs-self +alignment) ``` https://jbrowse.org/code/jb2/main/?config=test_data/volvox/config_main_thread.json&session=spec-%7B"views":%5B%7B"type":"DotplotView","views":%5B%7B"assembly":"volvox"%7D,%7B"assembly":"volvox"%7D%5D,"tracks":%5B"volvox_fake_synteny"%5D%7D%5D%7D @@ -234,7 +235,7 @@ Expanded "views": [ { "type": "DotplotView", - "views": [{ "assembly": "volvox" }, { "assembly": "volvox" }], + "views": [{ "assembly": "volvox" }, { "assembly": "volvox" }], // (self vs self alignment) "tracks": ["volvox_fake_synteny"] } ] @@ -295,7 +296,7 @@ Expanded ### Linear synteny view -Here is an example of a JSON session spec for a Linear Synteny View +Here is an example of a JSON session spec for a linear synteny view ``` https://jbrowse.org/code/jb2/main/?config=test_data%2Fvolvox%2Fconfig.json&session=spec-{"views":[{"type":"LinearSyntenyView","tracks":["volvox_fake_synteny"],"views":[{"loc":"ctgA:1-30000","assembly":"volvox"},{"loc":"ctgA:1000-31000","assembly":"volvox"}]}]} @@ -310,7 +311,7 @@ Expanded "views": [ { "type": "LinearSyntenyView", - "tracks": ["volvox_fake_synteny"], + "tracks": ["volvox_fake_synteny"], // (self vs self alignment) "views": [ { "loc": "ctgA:1-30000", "assembly": "volvox" }, { "loc": "ctgA:1000-31000", "assembly": "volvox" } @@ -320,6 +321,35 @@ Expanded } ``` +### Linear synteny view (multi-way) + +Here is an example of a JSON session spec for a linear synteny view, but with +more than two views + +``` +https://jbrowse.org/code/jb2/main/?config=test_data%2Fvolvox%2Fconfig.json&session=spec-{"views":[{"type":"LinearSyntenyView","tracks":[["volvox_ins.paf"],["volvox_del.paf"]],"views":[{"loc":"ctgA:1-50000","assembly":"volvox_ins"},{"loc":"ctgA:1000-50000","assembly":"volvox"},{"loc":"ctgA:1000-44000","assembly":"volvox_del"}]}]} +``` + +[Live link](https://jbrowse.org/code/jb2/main/?config=test_data%2Fvolvox%2Fconfig.json&session=spec-{"views":[{"type":"LinearSyntenyView","tracks":[["volvox_ins.paf"],["volvox_del.paf"]],"views":[{"loc":"ctgA:1-50000","assembly":"volvox_ins"},{"loc":"ctgA:1000-50000","assembly":"volvox"},{"loc":"ctgA:1000-44000","assembly":"volvox_del"}]}]}) + +Expanded + +```json +{ + "views": [ + { + "type": "LinearSyntenyView", + "tracks": [["volvox_ins.paf"],["volvox_del.paf"]], // this multidimensional array refers to the synteny tracks at each level of the multi-level synteny view + "views": [ + { "loc": "ctgA:1-50000", "assembly": "volvox-ins" }, + { "loc": "ctgA:1000-50000", "assembly": "volvox" } + { "loc": "ctgA:1000-44000", "assembly": "volvox-del" } + ] + } + ] +} +``` + ## Other session options Another useful session URL is called a "session spec" or "session diff --git a/website/yarn.lock b/website/yarn.lock index d30b66308d..b8d2ede5af 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1731,9 +1731,9 @@ integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== "@emotion/is-prop-valid@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz#bd84ba972195e8a2d42462387581560ef780e4e2" - integrity sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240" + integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw== dependencies: "@emotion/memoize" "^0.9.0" @@ -1757,14 +1757,14 @@ hoist-non-react-statics "^3.3.1" "@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.0", "@emotion/serialize@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.1.tgz#490b660178f43d2de8e92b278b51079d726c05c3" - integrity sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a" + integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA== dependencies: "@emotion/hash" "^0.9.2" "@emotion/memoize" "^0.9.0" "@emotion/unitless" "^0.10.0" - "@emotion/utils" "^1.4.0" + "@emotion/utils" "^1.4.1" csstype "^3.0.2" "@emotion/sheet@^1.4.0": @@ -1794,10 +1794,10 @@ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf" integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== -"@emotion/utils@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.0.tgz#262f1d02aaedb2ec91c83a0955dd47822ad5fbdd" - integrity sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ== +"@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad" + integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA== "@emotion/weak-memoize@^0.4.0": version "0.4.0" @@ -1916,28 +1916,28 @@ dependencies: "@types/mdx" "^2.0.0" -"@mui/core-downloads-tracker@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.0.tgz#35e37713a4240c09db92c082502fa0c90f6e37be" - integrity sha512-covEnIn/2er5YdtuukDRA52kmARhKrHjOvPsyTFMQApZdrTBI4h8jbEy2mxZqwMwcAFS9coonQXnEZKL1rUNdQ== +"@mui/core-downloads-tracker@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.1.tgz#2300ea530b31663bdf4eb716b5c7faa762524dee" + integrity sha512-VdQC1tPIIcZAnf62L2M1eQif0x2vlKg3YK4kGYbtijSH4niEgI21GnstykW1vQIs+Bc6L+Hua2GATYVjilJ22A== "@mui/icons-material@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.1.0.tgz#6a9f7ffc1a191331f8907419cc2b2082f253a9b6" - integrity sha512-HxfB0jxwiMTYMN8gAnYn3avbF1aDrqBEuGIj6JDQ3YkLl650E1Wy8AIhwwyP47wdrv0at9aAR0iOO6VLb74A9w== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.1.1.tgz#9582c676018f27fd5c433f7abeb77b1ee5955b31" + integrity sha512-sy/YKwcLPW8VcacNP2uWMYR9xyWuwO9NN9FXuGEU90bRshBXj8pdKk+joe3TCW7oviVS3zXLHlc94wQ0jNsQRQ== dependencies: "@babel/runtime" "^7.25.6" "@mui/material@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.1.0.tgz#42c900df9667f58d10082eafdae0cb99ea43339b" - integrity sha512-4MJ46vmy1xbm8x+ZdRcWm8jEMMowdS8pYlhKQzg/qoKhOcLhImZvf2Jn6z9Dj6gl+lY+C/0MxaHF/avAAGys3Q== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.1.1.tgz#8e0c3988dd37cdb9798a286843520cf8dedea1e7" + integrity sha512-b+eULldTqtqTCbN++2BtBWCir/1LwEYw+2mIlOt2GiEUh1EBBw4/wIukGKKNt3xrCZqRA80yLLkV6tF61Lq3cA== dependencies: "@babel/runtime" "^7.25.6" - "@mui/core-downloads-tracker" "^6.1.0" - "@mui/system" "^6.1.0" - "@mui/types" "^7.2.16" - "@mui/utils" "^6.1.0" + "@mui/core-downloads-tracker" "^6.1.1" + "@mui/system" "^6.1.1" + "@mui/types" "^7.2.17" + "@mui/utils" "^6.1.1" "@popperjs/core" "^2.11.8" "@types/react-transition-group" "^4.4.11" clsx "^2.1.1" @@ -1946,19 +1946,19 @@ react-is "^18.3.1" react-transition-group "^4.4.5" -"@mui/private-theming@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.1.0.tgz#f55d2dd472028e6deda3a519f6c285ce7171c908" - integrity sha512-+L5qccs4gwsR0r1dgjqhN24QEQRkqIbfOdxILyMbMkuI50x6wNyt9XrV+J3WtjtZTMGJCrUa5VmZBE6OEPGPWA== +"@mui/private-theming@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.1.1.tgz#6e56aa4bd35d701efccaa5125920fc9250754725" + integrity sha512-JlrjIdhyZUtewtdAuUsvi3ZnO0YS49IW4Mfz19ZWTlQ0sDGga6LNPVwHClWr2/zJK2we2BQx9/i8M32rgKuzrg== dependencies: "@babel/runtime" "^7.25.6" - "@mui/utils" "^6.1.0" + "@mui/utils" "^6.1.1" prop-types "^15.8.1" -"@mui/styled-engine@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.1.0.tgz#4be3eaa13b616e63ffc060a41ab24a15af7f0f56" - integrity sha512-MZ+vtaCkjamrT41+b0Er9OMenjAtP/32+L6fARL9/+BZKuV2QbR3q3TmavT2x0NhDu35IM03s4yKqj32Ziqnyg== +"@mui/styled-engine@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.1.1.tgz#f75c39ed94eff3c8d5ef1d5deedd996b9f02273d" + integrity sha512-HJyIoMpFb11fnHuRtUILOXgq6vj4LhIlE8maG4SwP/W+E5sa7HFexhnB3vOMT7bKys4UKNxhobC8jwWxYilGsA== dependencies: "@babel/runtime" "^7.25.6" "@emotion/cache" "^11.13.1" @@ -1966,32 +1966,32 @@ csstype "^3.1.3" prop-types "^15.8.1" -"@mui/system@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.1.0.tgz#3262471afb1eec3270e67bd0f0f59e400223bc33" - integrity sha512-NumkGDqT6EdXfcoFLYQ+M4XlTW5hH3+aK48xAbRqKPXJfxl36CBt4DLduw/Voa5dcayGus9T6jm1AwU2hoJ5hQ== +"@mui/system@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.1.1.tgz#97d1fb3e17330a3141ddd28d7841eea8bfa070a8" + integrity sha512-PaYsCz2tUOcpu3T0okDEsSuP/yCDIj9JZ4Tox1JovRSKIjltHpXPsXZSGr3RiWdtM1MTQMFMCZzu0+CKbyy+Kw== dependencies: "@babel/runtime" "^7.25.6" - "@mui/private-theming" "^6.1.0" - "@mui/styled-engine" "^6.1.0" - "@mui/types" "^7.2.16" - "@mui/utils" "^6.1.0" + "@mui/private-theming" "^6.1.1" + "@mui/styled-engine" "^6.1.1" + "@mui/types" "^7.2.17" + "@mui/utils" "^6.1.1" clsx "^2.1.1" csstype "^3.1.3" prop-types "^15.8.1" -"@mui/types@^7.2.16": - version "7.2.16" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.16.tgz#66710c691b51cd4fca95322100cd74ec230cfe30" - integrity sha512-qI8TV3M7ShITEEc8Ih15A2vLzZGLhD+/UPNwck/hcls2gwg7dyRjNGXcQYHKLB5Q7PuTRfrTkAoPa2VV1s67Ag== +"@mui/types@^7.2.17": + version "7.2.17" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.17.tgz#329826062d4079de5ea2b97007575cebbba1fdbc" + integrity sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ== -"@mui/utils@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.0.tgz#aa825af35ef3fb3bebc78f081066644cd57cafce" - integrity sha512-oT8ZzMISRUhTVpdbYzY0CgrCBb3t/YEdcaM13tUnuTjZ15pdA6g5lx15ZJUdgYXV6PbJdw7tDQgMEr4uXK5TXQ== +"@mui/utils@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.1.tgz#4c8c487e26ed5fb4d3333287eea2a2698a309ea4" + integrity sha512-HlRrgdJSPbYDXPpoVMWZV8AE7WcFtAk13rWNWAEVWKSanzBBkymjz3km+Th/Srowsh4pf1fTSP1B0L116wQBYw== dependencies: "@babel/runtime" "^7.25.6" - "@mui/types" "^7.2.16" + "@mui/types" "^7.2.17" "@types/prop-types" "^15.7.12" clsx "^2.1.1" prop-types "^15.8.1" @@ -2040,9 +2040,9 @@ config-chain "^1.1.11" "@polka/url@^1.0.0-next.24": - version "1.0.0-next.25" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" - integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + version "1.0.0-next.28" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== "@popperjs/core@^2.11.8": version "2.11.8" @@ -2265,21 +2265,41 @@ "@types/estree" "*" "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" + integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.13": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -2382,9 +2402,9 @@ "@types/node" "*" "@types/node@*": - version "22.5.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" - integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== + version "22.7.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.2.tgz#80ed66c0a5025ffa037587fd69a816f29b54e4c7" + integrity sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA== dependencies: undici-types "~6.19.2" @@ -2404,14 +2424,14 @@ integrity sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg== "@types/prop-types@*", "@types/prop-types@^15.7.12": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/qs@*": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + version "6.9.16" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== "@types/range-parser@*": version "1.2.7" @@ -2452,9 +2472,9 @@ "@types/react" "*" "@types/react@*": - version "18.3.5" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.5.tgz#5f524c2ad2089c0ff372bbdabc77ca2c4dbadf8f" - integrity sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA== + version "18.3.9" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.9.tgz#2cdf5f425ec8a133d67e9e3673909738b783db20" + integrity sha512-+BpAVyTpJkNWWSSnaLBk6ePpHLOGJKnEQNbINNovPWzvEUyAe3e+/d494QdEh71RekM/qV7lw6jzf1HGrJyAtQ== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -2876,9 +2896,9 @@ autoprefixer@^10.4.14, autoprefixer@^10.4.19: postcss-value-parser "^4.2.0" babel-loader@^9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" - integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== dependencies: find-cache-dir "^4.0.0" schema-utils "^4.0.0" @@ -3023,12 +3043,12 @@ braces@^3.0.3, braces@~3.0.2: fill-range "^7.1.1" browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" node-releases "^2.0.18" update-browserslist-db "^1.1.0" @@ -3109,10 +3129,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646: - version "1.0.30001660" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" - integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== ccount@^2.0.0: version "2.0.1" @@ -3931,10 +3951,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.4: - version "1.5.22" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.22.tgz#5ae58990a35391bad7605742e52855a0f281ef82" - integrity sha512-tKYm5YHPU1djz0O+CGJ+oJIvimtsCcwR2Z9w7Skh08lUdyzXY5djods3q+z2JkWdb7tCcmM//eVavSRAiaPRNg== +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== emoji-regex@^8.0.0: version "8.0.0" @@ -5811,9 +5831,9 @@ micromark-core-commonmark@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-directive@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.1.tgz#67b3985bb991a69dbcae52664c57ee54b22f635a" - integrity sha512-VGV2uxUzhEZmaP7NSFo2vtq7M2nUD+WfmYQD+d8i/1nHbzE+rMy9uzTvUybBbNiVbrhOZibg3gbyoARGqgDWyg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz#2eb61985d1995a7c1ff7621676a4f32af29409e8" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== dependencies: devlop "^1.0.0" micromark-factory-space "^2.0.0" @@ -6677,7 +6697,7 @@ periscopic@^3.0.0: estree-walker "^3.0.0" is-reference "^3.0.0" -picocolors@^1.0.0, picocolors@^1.0.1: +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== @@ -6982,18 +7002,18 @@ postcss-zindex@^6.0.2: integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.33, postcss@^8.4.38: - version "8.4.45" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" - integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q== + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" + picocolors "^1.1.0" + source-map-js "^1.2.1" preact@^10.13.2: - version "10.23.2" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.23.2.tgz#52deec92796ae0f0cc6b034d9c66e0fbc1b837dc" - integrity sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA== + version "10.24.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.24.1.tgz#501e206d0a46667b6d0d8b780c7a65172239b2d0" + integrity sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw== pretty-error@^4.0.0: version "4.0.0" @@ -7480,9 +7500,9 @@ remark-parse@^11.0.0: unified "^11.0.0" remark-rehype@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.0.tgz#d5f264f42bcbd4d300f030975609d01a1697ccdc" - integrity sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -7889,7 +7909,7 @@ sort-css-media-queries@2.2.0: resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz#aa33cf4a08e0225059448b6c40eddbf9f1c8334c" integrity sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA== -source-map-js@^1.0.1, source-map-js@^1.2.0: +source-map-js@^1.0.1, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -8146,9 +8166,9 @@ terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: terser "^5.26.0" terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: - version "5.32.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.32.0.tgz#ee811c0d2d6b741c1cc34a2bc5bcbfc1b5b1f96c" - integrity sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ== + version "5.34.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.0.tgz#62f2496542290bc6d8bf886edaee7fac158e37e4" + integrity sha512-y5NUX+U9HhVsK/zihZwoq4r9dICLyV2jXGOriDAVOeKhq3LKVjgJbGO90FisozXLlJfvjHqgckGmJFBb9KYoWQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -8558,9 +8578,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.88.1: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== dependencies: "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" diff --git a/yarn.lock b/yarn.lock index 300fa20d00..9303b53df8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -89,16 +89,16 @@ tslib "^2.6.2" "@aws-sdk/client-cloudfront@^3.645.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.658.0.tgz#43a3e86aeb28e83cf151e91f188b0ba6e1117a62" - integrity sha512-vM7XUuWystqAHWLP0SxnXk2qzROfFTzr8ISMsG0duDToSoyo3bX5o5/5V37gijXctjR4uo3013LfUMBjGuf4LA== + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.658.1.tgz#8035eb43d897382800dbca699dc9908cdf7e0b35" + integrity sha512-v5bfHSHJ3LbTeWzxV1HReF0HuCwOZO4L5L1Esc5CSt8IX+pfTRR7i3iY7qTt5CfDsHQP4UEETrSEdKGwOl63YA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.658.0" - "@aws-sdk/client-sts" "3.658.0" - "@aws-sdk/core" "3.658.0" - "@aws-sdk/credential-provider-node" "3.658.0" + "@aws-sdk/client-sso-oidc" "3.658.1" + "@aws-sdk/client-sts" "3.658.1" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" "@aws-sdk/middleware-host-header" "3.654.0" "@aws-sdk/middleware-logger" "3.654.0" "@aws-sdk/middleware-recursion-detection" "3.654.0" @@ -110,69 +110,69 @@ "@aws-sdk/util-user-agent-node" "3.654.0" "@aws-sdk/xml-builder" "3.654.0" "@smithy/config-resolver" "^3.0.8" - "@smithy/core" "^2.4.3" - "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" "@smithy/hash-node" "^3.0.6" "@smithy/invalid-dependency" "^3.0.6" "@smithy/middleware-content-length" "^3.0.8" "@smithy/middleware-endpoint" "^3.1.3" - "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-retry" "^3.0.21" "@smithy/middleware-serde" "^3.0.6" "@smithy/middleware-stack" "^3.0.6" "@smithy/node-config-provider" "^3.1.7" - "@smithy/node-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.2.3" "@smithy/protocol-http" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.18" - "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" "@smithy/util-endpoints" "^2.1.2" "@smithy/util-middleware" "^3.0.6" "@smithy/util-retry" "^3.0.6" - "@smithy/util-stream" "^3.1.6" + "@smithy/util-stream" "^3.1.8" "@smithy/util-utf8" "^3.0.0" "@smithy/util-waiter" "^3.1.5" tslib "^2.6.2" "@aws-sdk/client-s3@^3.651.1": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.658.0.tgz#667ba8fe9b49763d87e7f9d4b6e6e14a95cf06e4" - integrity sha512-3lyew20RoLKg9S1RzVyYgLNxknoXkN/0o9PMiRq77yBIQHZj3x7/wmKseiGEFoF08YKFkh1MPq/p34qRlOmtBg== + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.658.1.tgz#d06797b8e8f32c48e3f2d8e5e34c63e92ddde7b5" + integrity sha512-rxYW7ONoh1y/SM292jt0TEH+LSiztoPCJxT3gst4S2o/85apFY3RxL8TrhOqzXoIeMu2LNzyN51Zygme6AbQAA== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.658.0" - "@aws-sdk/client-sts" "3.658.0" - "@aws-sdk/core" "3.658.0" - "@aws-sdk/credential-provider-node" "3.658.0" + "@aws-sdk/client-sso-oidc" "3.658.1" + "@aws-sdk/client-sts" "3.658.1" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" "@aws-sdk/middleware-bucket-endpoint" "3.654.0" "@aws-sdk/middleware-expect-continue" "3.654.0" - "@aws-sdk/middleware-flexible-checksums" "3.657.0" + "@aws-sdk/middleware-flexible-checksums" "3.658.1" "@aws-sdk/middleware-host-header" "3.654.0" "@aws-sdk/middleware-location-constraint" "3.654.0" "@aws-sdk/middleware-logger" "3.654.0" "@aws-sdk/middleware-recursion-detection" "3.654.0" - "@aws-sdk/middleware-sdk-s3" "3.658.0" + "@aws-sdk/middleware-sdk-s3" "3.658.1" "@aws-sdk/middleware-ssec" "3.654.0" "@aws-sdk/middleware-user-agent" "3.654.0" "@aws-sdk/region-config-resolver" "3.654.0" - "@aws-sdk/signature-v4-multi-region" "3.658.0" + "@aws-sdk/signature-v4-multi-region" "3.658.1" "@aws-sdk/types" "3.654.0" "@aws-sdk/util-endpoints" "3.654.0" "@aws-sdk/util-user-agent-browser" "3.654.0" "@aws-sdk/util-user-agent-node" "3.654.0" "@aws-sdk/xml-builder" "3.654.0" "@smithy/config-resolver" "^3.0.8" - "@smithy/core" "^2.4.3" + "@smithy/core" "^2.4.6" "@smithy/eventstream-serde-browser" "^3.0.9" "@smithy/eventstream-serde-config-resolver" "^3.0.6" "@smithy/eventstream-serde-node" "^3.0.8" - "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/fetch-http-handler" "^3.2.8" "@smithy/hash-blob-browser" "^3.1.5" "@smithy/hash-node" "^3.0.6" "@smithy/hash-stream-node" "^3.1.5" @@ -180,37 +180,37 @@ "@smithy/md5-js" "^3.0.6" "@smithy/middleware-content-length" "^3.0.8" "@smithy/middleware-endpoint" "^3.1.3" - "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-retry" "^3.0.21" "@smithy/middleware-serde" "^3.0.6" "@smithy/middleware-stack" "^3.0.6" "@smithy/node-config-provider" "^3.1.7" - "@smithy/node-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.2.3" "@smithy/protocol-http" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.18" - "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" "@smithy/util-endpoints" "^2.1.2" "@smithy/util-middleware" "^3.0.6" "@smithy/util-retry" "^3.0.6" - "@smithy/util-stream" "^3.1.6" + "@smithy/util-stream" "^3.1.8" "@smithy/util-utf8" "^3.0.0" "@smithy/util-waiter" "^3.1.5" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.0.tgz#13ceea667a40349dfc27737f12da1152d4cc03b6" - integrity sha512-+oZcf9Wm7BlAhakSnxftmpeMwJLXQPesOcIX+ViF6HWSfMid4LY8Cq0jJ9si3HSe216GVMiAlBbNksayzHNdlA== +"@aws-sdk/client-sso-oidc@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.1.tgz#67286348374146e80a0345064d101175730012ed" + integrity sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.658.0" - "@aws-sdk/credential-provider-node" "3.658.0" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" "@aws-sdk/middleware-host-header" "3.654.0" "@aws-sdk/middleware-logger" "3.654.0" "@aws-sdk/middleware-recursion-detection" "3.654.0" @@ -221,40 +221,40 @@ "@aws-sdk/util-user-agent-browser" "3.654.0" "@aws-sdk/util-user-agent-node" "3.654.0" "@smithy/config-resolver" "^3.0.8" - "@smithy/core" "^2.4.3" - "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" "@smithy/hash-node" "^3.0.6" "@smithy/invalid-dependency" "^3.0.6" "@smithy/middleware-content-length" "^3.0.8" "@smithy/middleware-endpoint" "^3.1.3" - "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-retry" "^3.0.21" "@smithy/middleware-serde" "^3.0.6" "@smithy/middleware-stack" "^3.0.6" "@smithy/node-config-provider" "^3.1.7" - "@smithy/node-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.2.3" "@smithy/protocol-http" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.18" - "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" "@smithy/util-endpoints" "^2.1.2" "@smithy/util-middleware" "^3.0.6" "@smithy/util-retry" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.658.0.tgz#52401b8630885cf263602d4fbf449034b1981f8c" - integrity sha512-OtT6bXthyP/z7x2QDTWYz0mteXhQvV+mH4JgT7dW1Y5Kc/Xr85kIQ0ouypSLH14DeiT1Gd21kXKy4YuLEoWaYQ== +"@aws-sdk/client-sso@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.658.1.tgz#f0e660148ab2786f1028a738285742fb97f888bf" + integrity sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.658.0" + "@aws-sdk/core" "3.658.1" "@aws-sdk/middleware-host-header" "3.654.0" "@aws-sdk/middleware-logger" "3.654.0" "@aws-sdk/middleware-recursion-detection" "3.654.0" @@ -265,42 +265,42 @@ "@aws-sdk/util-user-agent-browser" "3.654.0" "@aws-sdk/util-user-agent-node" "3.654.0" "@smithy/config-resolver" "^3.0.8" - "@smithy/core" "^2.4.3" - "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" "@smithy/hash-node" "^3.0.6" "@smithy/invalid-dependency" "^3.0.6" "@smithy/middleware-content-length" "^3.0.8" "@smithy/middleware-endpoint" "^3.1.3" - "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-retry" "^3.0.21" "@smithy/middleware-serde" "^3.0.6" "@smithy/middleware-stack" "^3.0.6" "@smithy/node-config-provider" "^3.1.7" - "@smithy/node-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.2.3" "@smithy/protocol-http" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.18" - "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" "@smithy/util-endpoints" "^2.1.2" "@smithy/util-middleware" "^3.0.6" "@smithy/util-retry" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.658.0.tgz#7c83318ecc01fca194c36a88505508b4c8e095a3" - integrity sha512-SffIgt/Mzwq3ijkg3lZjndkrqS1d6OeDcUi7IAO2w4KC4nM6yH1zZNSjNWvdjEvUp0Gz2kk54HvyP/r9DqTg6Q== +"@aws-sdk/client-sts@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.658.1.tgz#5e6af00f5b87f3d79a2b848241b832af20ce42ab" + integrity sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.658.0" - "@aws-sdk/core" "3.658.0" - "@aws-sdk/credential-provider-node" "3.658.0" + "@aws-sdk/client-sso-oidc" "3.658.1" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" "@aws-sdk/middleware-host-header" "3.654.0" "@aws-sdk/middleware-logger" "3.654.0" "@aws-sdk/middleware-recursion-detection" "3.654.0" @@ -311,43 +311,43 @@ "@aws-sdk/util-user-agent-browser" "3.654.0" "@aws-sdk/util-user-agent-node" "3.654.0" "@smithy/config-resolver" "^3.0.8" - "@smithy/core" "^2.4.3" - "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" "@smithy/hash-node" "^3.0.6" "@smithy/invalid-dependency" "^3.0.6" "@smithy/middleware-content-length" "^3.0.8" "@smithy/middleware-endpoint" "^3.1.3" - "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-retry" "^3.0.21" "@smithy/middleware-serde" "^3.0.6" "@smithy/middleware-stack" "^3.0.6" "@smithy/node-config-provider" "^3.1.7" - "@smithy/node-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.2.3" "@smithy/protocol-http" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.18" - "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" "@smithy/util-endpoints" "^2.1.2" "@smithy/util-middleware" "^3.0.6" "@smithy/util-retry" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/core@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.658.0.tgz#7d2fcaebd640d9d9709b76797744b7db098ed9e4" - integrity sha512-vtOUqYD2/SfWGxmfYneiqv4R64qtSRPqznHUcMCusq71ZG9iz90ZxRYxS8ABrvhWD+oUqnxHesO08VYtaL4oAg== +"@aws-sdk/core@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.658.1.tgz#7b211f75a6048eba88ff33169047b4dc57fdc520" + integrity sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA== dependencies: - "@smithy/core" "^2.4.3" + "@smithy/core" "^2.4.6" "@smithy/node-config-provider" "^3.1.7" "@smithy/property-provider" "^3.1.6" "@smithy/protocol-http" "^4.1.3" - "@smithy/signature-v4" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/signature-v4" "^4.1.4" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/util-middleware" "^3.0.6" fast-xml-parser "4.4.1" @@ -363,30 +363,30 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.654.0": - version "3.654.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.654.0.tgz#72ce2ff0136eb87ef0c90d435bf1dd61558fe96d" - integrity sha512-tgmAH4MBi/aDR882lfw48+tDV95ZH3GWc1Eoe6DpNLiM3GN2VfU/cZwuHmi6aq+vAbdIlswBHJ/+va0fOvlyjw== +"@aws-sdk/credential-provider-http@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.658.1.tgz#35fa80fa8440e9fd5baf061bfd18862cbcabd3bd" + integrity sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ== dependencies: "@aws-sdk/types" "3.654.0" - "@smithy/fetch-http-handler" "^3.2.7" - "@smithy/node-http-handler" "^3.2.2" + "@smithy/fetch-http-handler" "^3.2.8" + "@smithy/node-http-handler" "^3.2.3" "@smithy/property-provider" "^3.1.6" "@smithy/protocol-http" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" - "@smithy/util-stream" "^3.1.6" + "@smithy/util-stream" "^3.1.8" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.0.tgz#d56423bcb39edb54029a71909e5590cca89a65f5" - integrity sha512-fL4hAeF2jjSZ3Dm/kmU9AEDO8UARhUagUJ/UfXMxvkvmQ/jLydKA3ip5jMSf1fhu1TWoi/JBE/4cjKDbjwMzXA== +"@aws-sdk/credential-provider-ini@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.1.tgz#a451b8fc5d057b9c8473d452f4b8bcd221cdd201" + integrity sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q== dependencies: "@aws-sdk/credential-provider-env" "3.654.0" - "@aws-sdk/credential-provider-http" "3.654.0" + "@aws-sdk/credential-provider-http" "3.658.1" "@aws-sdk/credential-provider-process" "3.654.0" - "@aws-sdk/credential-provider-sso" "3.658.0" + "@aws-sdk/credential-provider-sso" "3.658.1" "@aws-sdk/credential-provider-web-identity" "3.654.0" "@aws-sdk/types" "3.654.0" "@smithy/credential-provider-imds" "^3.2.3" @@ -395,16 +395,16 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.0.tgz#f1e9b4c8adbdb14c60b363868d009128b9fd618b" - integrity sha512-rdWBylUdT6/dK+zBj7jajJpUQ3rP/YvKo0peYhpTgpUSHjqkjrx/BRXE+iccbFimR8QSxwOJ4tsb15Gvuv0E4Q== +"@aws-sdk/credential-provider-node@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.1.tgz#ad7209177f8c1c43d767e5c342960a2d19ee124e" + integrity sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA== dependencies: "@aws-sdk/credential-provider-env" "3.654.0" - "@aws-sdk/credential-provider-http" "3.654.0" - "@aws-sdk/credential-provider-ini" "3.658.0" + "@aws-sdk/credential-provider-http" "3.658.1" + "@aws-sdk/credential-provider-ini" "3.658.1" "@aws-sdk/credential-provider-process" "3.654.0" - "@aws-sdk/credential-provider-sso" "3.658.0" + "@aws-sdk/credential-provider-sso" "3.658.1" "@aws-sdk/credential-provider-web-identity" "3.654.0" "@aws-sdk/types" "3.654.0" "@smithy/credential-provider-imds" "^3.2.3" @@ -424,12 +424,12 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.0.tgz#ba79472129b796d94cdc3989c34bd84dd1cff53c" - integrity sha512-zK5FwCZJ9OovBPpoVfhlNyUhdFCgkkVbQolR47UKXCREH/P6sOsVay4/CnwtVQeMGlv9c8F41ELJXWaTRmdwHA== +"@aws-sdk/credential-provider-sso@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.1.tgz#62db3f09f08a33b5fb4827a8a8f1a640373b39b7" + integrity sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA== dependencies: - "@aws-sdk/client-sso" "3.658.0" + "@aws-sdk/client-sso" "3.658.1" "@aws-sdk/token-providers" "3.654.0" "@aws-sdk/types" "3.654.0" "@smithy/property-provider" "^3.1.6" @@ -470,10 +470,10 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.657.0": - version "3.657.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.657.0.tgz#7679218f783c602e9787a85044015742801eaa4f" - integrity sha512-aOfK0YmuL8baCqJ5nArHKyyFko/tSWMjGcegOA4Jo+XAu1PEk0wDi78vOHlv4dfSlF8sXJsAo4kaCEDF3UkGAQ== +"@aws-sdk/middleware-flexible-checksums@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.658.1.tgz#245b8c614b677c7f59d4f29348ae7257ec916828" + integrity sha512-aBhnDIy8PwhgZRJh5U4l1JfLIPLkBeHBCTwn3XjdvhvisXNCfeINWKYuDDHamM+XKgBNUlLoTxpXI2AvLk5cGw== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" @@ -524,23 +524,23 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.658.0.tgz#7be274b10082ae488b0f8d1127b906170ef2b6fd" - integrity sha512-LLJjO+74tXiJvMEsZ7v4M+1aJKZsNWbf/TvZCuNpNkvUakVWCkmPQl2Qmaft/y0LABADSz5yCSFAe2CZz5nIHw== +"@aws-sdk/middleware-sdk-s3@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.658.1.tgz#150cffc4f00eb2a82a991b3aadb8e1fdef320dbc" + integrity sha512-UdiwCY4Eg7e1ZbseKvBr83SARukcqS5R9R3bnx4sb3cEK0wFDXWrlhRMgK94jr8IJeskV1ySyxozdb1XOzOU3w== dependencies: - "@aws-sdk/core" "3.658.0" + "@aws-sdk/core" "3.658.1" "@aws-sdk/types" "3.654.0" "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/core" "^2.4.3" + "@smithy/core" "^2.4.6" "@smithy/node-config-provider" "^3.1.7" "@smithy/protocol-http" "^4.1.3" - "@smithy/signature-v4" "^4.1.3" - "@smithy/smithy-client" "^3.3.2" + "@smithy/signature-v4" "^4.1.4" + "@smithy/smithy-client" "^3.3.5" "@smithy/types" "^3.4.2" "@smithy/util-config-provider" "^3.0.0" "@smithy/util-middleware" "^3.0.6" - "@smithy/util-stream" "^3.1.6" + "@smithy/util-stream" "^3.1.8" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" @@ -576,15 +576,15 @@ "@smithy/util-middleware" "^3.0.6" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.658.0": - version "3.658.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.658.0.tgz#0d5fff03386c443cd2a02847c5e46f18fc1edb7f" - integrity sha512-eK00rYVQVG2fqqR8QxrjxZxgJKasyz3honFfKFNB5nKyOvKXkVI5QJ3HvbrWgRaMt21n2qcYQZxTO6dTkfeWVA== +"@aws-sdk/signature-v4-multi-region@3.658.1": + version "3.658.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.658.1.tgz#aa3dd13911ffa4eccd906a8792eb44cfa1e2c3aa" + integrity sha512-gad2cOtmwLuiR096PB1vJsv2+KYwI+eN5D+eLaRLCTD9MMGvVWB5xkIXXGmn99ks4gAgtSpzZp8RD6viBj0gIw== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.658.0" + "@aws-sdk/middleware-sdk-s3" "3.658.1" "@aws-sdk/types" "3.654.0" "@smithy/protocol-http" "^4.1.3" - "@smithy/signature-v4" "^4.1.3" + "@smithy/signature-v4" "^4.1.4" "@smithy/types" "^3.4.2" tslib "^2.6.2" @@ -2923,9 +2923,9 @@ "@tybys/wasm-util" "^0.9.0" "@node-oauth/express-oauth-server@^4.0.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@node-oauth/express-oauth-server/-/express-oauth-server-4.1.0.tgz#0ef3a4135f6e8fa28025df0421268cecdff6c045" - integrity sha512-uJKvH32S1nwlxjvwInlcsIBJiHMcivS1u1UKG7d76V1wp5r08hw8wOY7YkG5UbHBfRXXgpNJmHCIvNpJ8vL1gw== + version "4.1.1" + resolved "https://registry.yarnpkg.com/@node-oauth/express-oauth-server/-/express-oauth-server-4.1.1.tgz#99a2cda2328c081af604cb9de961d03703fec433" + integrity sha512-Ps6UFV7XAfggYvRpveoT3t3h4dluy9wViEgkSU1kBcTOhllpBNIKrlsHTC+hBd1PT/+SC7vzpIXd2uFrmwF8Vg== dependencies: "@node-oauth/oauth2-server" "^5.2.0" @@ -3166,27 +3166,27 @@ proc-log "^4.0.0" which "^4.0.0" -"@nrwl/devkit@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-19.8.0.tgz#bddba5b91ea06ce9a431eb99a4a8e1669ee3e248" - integrity sha512-LehpQ2D1687+JWaUpW84NPuXsQuPosmts66LShPT4+6KozB4gd0hJGAXNXpjNs9CUfLyNf8rRdEeqNjWnPYEmA== +"@nrwl/devkit@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-19.8.2.tgz#c63c16bf3fa6b285235b3df7ac8b96a39ad7b184" + integrity sha512-2l3Jb7loE8BnTKn6bl4MK0fKIQLAkl+OMBwo/+GedaqfDfQev+UEgBio38eOEdDHYDHH0lwhGdVQI/DpV4qicA== dependencies: - "@nx/devkit" "19.8.0" + "@nx/devkit" "19.8.2" -"@nrwl/tao@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.8.0.tgz#4742884ec73f521d5eb61b629db18b1093cb8307" - integrity sha512-tybyYdhHNfyBRb8SOc/SasT1iwjYkp/QibS8L3ayTvpvvzJpNr8BpuTznQWIkaIjilflmcdHl+rMiQDqwABqpg== +"@nrwl/tao@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.8.2.tgz#db0f51af3e9666357796e731bd2ce6fe0ff703a5" + integrity sha512-WvGvFjCy/dSpviLJE8YKcSqpTVpX78UFUhYGgd0OxNlnz0I52HDsZekVWJnyCuU0NDGH6BNmS77R79zj+WzxvQ== dependencies: - nx "19.8.0" + nx "19.8.2" tslib "^2.3.0" -"@nx/devkit@19.8.0", "@nx/devkit@>=17.1.2 < 20": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-19.8.0.tgz#b12c3a32e2dc5bc5e3cf5e9af9c02ab85b50ffd2" - integrity sha512-nPaKHF0m2KONlt8GXjN9EhFo+NOvJnFcK6ujKFFLAyZ4TACY4F1FCjSHFTjYI82j+WukzuyjSmY9wzxYughWIQ== +"@nx/devkit@19.8.2", "@nx/devkit@>=17.1.2 < 20": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-19.8.2.tgz#fc34483dcd876cda7f336a194c973271a77ca166" + integrity sha512-SoCPy24hkzyrANbZhc3/40uWXnOIISC0jk49BcapC9Zykv9/8lCxiaNtB68b00QKEFISkxOeA703D7GCC4sA0Q== dependencies: - "@nrwl/devkit" "19.8.0" + "@nrwl/devkit" "19.8.2" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -3196,55 +3196,55 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/nx-darwin-arm64@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.0.tgz#10b05965c4eb6d93667187d4d2a2fcbfa9f0f938" - integrity sha512-JWtBb6ndCdGE+RBIwKN85BZnX41lFGsFxnsmot71GeAj/g7Cb0PM2qcmxawoy8yLPTBGZhb+eHER3z3nDIqRog== - -"@nx/nx-darwin-x64@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.0.tgz#975f0650064245e9ee0b6f1a94bd43844f3c4b46" - integrity sha512-NcNaqbbStBkyahLaoKFtW6nEdjCjYT5ZOmGjc6UpAx1Y3pkk/FcIOYJRCBxwuOsRRsEAyeVcHPdYrouZmV+6Yw== - -"@nx/nx-freebsd-x64@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.0.tgz#ab60ca80fe31da3e7a4ee5ba6ca6d90d5f7a2245" - integrity sha512-QXHRnMW5LrpYvtmdFRL2CRgX9CWDccrs2xhQNNzcgsLgL87Wte5kjDoJJN4GQjtrmjD3Q93w67CE9lhqnpXBvQ== - -"@nx/nx-linux-arm-gnueabihf@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.0.tgz#09e94785bdd08e809af1ffe4ffffab9c02c471ad" - integrity sha512-VjZOLMxz0gT+0AdDygxQS0Vvi3AcEzO3y9o9WdGKKaDVUDycrFn72X+ZbvFoio1dF7S1s2TbmOlR09Bu1yTgGg== - -"@nx/nx-linux-arm64-gnu@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.0.tgz#a2ca6e6e8cf1dd46015156ed5bfb45be7a1a3a59" - integrity sha512-sCSrXkSmEfDUDGLESXB3eHXECAIYz9nosFZpCggyUP1vgF/QcV40fHnV38nrFbKaVHuoaxy43RgnD+I3o6sDSw== - -"@nx/nx-linux-arm64-musl@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.0.tgz#e02f09e52972ba48a34564cbee61fc037df5cfe2" - integrity sha512-F3xEe7NGjsVKZTVlvUiUOTmCzxteRsQH2SSsYXyAfgJ42P3eZPc9HgeLx6RByjC/NBCwc7XEECMP1FjQgQXHVw== - -"@nx/nx-linux-x64-gnu@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.0.tgz#3e7ab6d672bacadb37451064cc052a7ff18b5eb6" - integrity sha512-4uYuE+LvxOFXvi9z9ueJSVrME5D383SHNCjs6jYwc9KovCsmL5oPVXRieoE4/hYI4lrjly+CrAnPZU1P7ocBiw== - -"@nx/nx-linux-x64-musl@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.0.tgz#6c16abb64e3cdd6ac0af597d327d977fbe8f5d02" - integrity sha512-9UDEGjOvNt+m+kMBCAB7CGisSwv05Xvaq8K3NJ+xM5GPG74EkQel24mSoIJfm/6zmDkdZCiRzNN9VRjOjzOz6Q== - -"@nx/nx-win32-arm64-msvc@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.0.tgz#efaed5792ce129590d412ac030770bcab1017c75" - integrity sha512-JVzm0KjyLZY5ponBukZ/b35wttW0b3LB0nqaiiHY7WKwSzo+m0UGEYHD/Yk6rKA0RRZN2wQVeIzLeWfYcZYrhA== - -"@nx/nx-win32-x64-msvc@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.0.tgz#7121a9c93bd11a306f46770f132307b7ca64cbf7" - integrity sha512-IRLhMZIInvp9okLsjnj76zaz8iaMovtLr6MHIFOOPIMsZYRhqQTArF5Os/NqEezeYYxvX6YZ5hKYe0xQO7A5LA== +"@nx/nx-darwin-arm64@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.2.tgz#c9640a7b46f265b4e58a8330fdb9402f8773e78b" + integrity sha512-O06sOObpaF3UQrx6R5s0kFOrhrk/N20rKhOMaD5Qxw6lmVr6TGGH1epGpD8ES7ZPS+p7FUtU9/FPHwY02BZfBg== + +"@nx/nx-darwin-x64@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.2.tgz#fa43524636e0f7d851048af081b03c2c437bce2a" + integrity sha512-hRFA7xpnIeMUF5FiDh681fxSx/EzkFYZ+UE/XBfzbc+T1neRy7NB2vMEa/WMsN0+Y5+NXtibx1akEDD6VOqeJA== + +"@nx/nx-freebsd-x64@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.2.tgz#762cfa29cdde48642870281d3d17388685ddc74f" + integrity sha512-GwZUtUQJt2LrZFB9r29ZYQ9I2r76pg+Lwj7vgrFAq+UHcLejHYyLvhDPoRfKWdASdegI3M5jbh8Cvamd+sgbNA== + +"@nx/nx-linux-arm-gnueabihf@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.2.tgz#9dbc3e8a6dd3637e17c29307e78014223fe96645" + integrity sha512-+OtoU5tXOLRv0ufy8ifD6EHn+VOjnC8mFIaaBO/cb/YEW1MTZq1RqKd4e1O9sjAloTe4X3mydw/Ue333+FqIww== + +"@nx/nx-linux-arm64-gnu@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.2.tgz#7d6d8657f5e8ecb556d50509dfa177f8b10e4d0c" + integrity sha512-rH7WSvoh1nvYmQs3cd4nBDPilEYIGTUOZF2eXPBqSu1K6938tu1Uf1zXzqRK7o016GoVepiD0VRVYWD3R82nRQ== + +"@nx/nx-linux-arm64-musl@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.2.tgz#a7804302d60fa0bebf0f10f84df62cb5e170e27f" + integrity sha512-a7vuWDOcqHL0S0gQYYz8DDRmNFs4NOd7A+BTgBRPX54r0pS82tKF2ZsP48TAr9WHyjsTPis5LlFw8VhLrjzdLA== + +"@nx/nx-linux-x64-gnu@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.2.tgz#952e817e2caa53d5ca05e494de538f0caad6e5ea" + integrity sha512-3h4dmIi5Muym18dsiiXQBygPlSAHZNe3PaYo8mLsUsvuAt2ye0XUDcAlHWXOt/FeuVDG1NEGI05vZJvbIIGikQ== + +"@nx/nx-linux-x64-musl@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.2.tgz#51222b1d2543db091356a96a971b62dd1712b1ec" + integrity sha512-LbOC3rbnREh7DbFYdZDuAEDmJsdQDLEjUzacwXDHMb/XlTL3YpWoXohd+zSVHM4nvd8o7QFuZNC4a4zYXwA+wg== + +"@nx/nx-win32-arm64-msvc@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.2.tgz#770bdc6a004b4b1bac9a7a990db7adf9581d6780" + integrity sha512-ZkSZBxGrGXDqwRxC4WyHR3sAUIH6akk1rTDvqTr1nKPribs53cqEms20i7qF1at3o99xL3YairOcnt7JxNWDWA== + +"@nx/nx-win32-x64-msvc@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.2.tgz#805f3042b8756a6c25ec1c3afcc2cf228e51852c" + integrity sha512-rRt+XIZk+ctxhFORWvugqmS07xi52eRS4QpTq8b24ZJKk1Zw0L5opsXAdzughhBzfIpSx4rxnknFlI78DcRPxA== "@oclif/core@4.0.19": version "4.0.19" @@ -3611,7 +3611,7 @@ "@smithy/util-middleware" "^3.0.6" tslib "^2.6.2" -"@smithy/core@^2.4.3": +"@smithy/core@^2.4.6": version "2.4.6" resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.4.6.tgz#d367a047a88aceee22eda5a598db00a7e5c50e72" integrity sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg== @@ -3683,7 +3683,7 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.2.7", "@smithy/fetch-http-handler@^3.2.8": +"@smithy/fetch-http-handler@^3.2.8": version "3.2.8" resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.8.tgz#985623d2824138b770c81db7c872474160b3c5b1" integrity sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow== @@ -3776,7 +3776,7 @@ "@smithy/util-middleware" "^3.0.6" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.18", "@smithy/middleware-retry@^3.0.21": +"@smithy/middleware-retry@^3.0.21": version "3.0.21" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.21.tgz#c26168f761d5b72c750fb4ed66c18a2b195b7f4d" integrity sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA== @@ -3817,7 +3817,7 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/node-http-handler@^3.2.2", "@smithy/node-http-handler@^3.2.3": +"@smithy/node-http-handler@^3.2.3": version "3.2.3" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.2.3.tgz#6d10ece149b441f5417d34db45ddb76407d5c186" integrity sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w== @@ -3876,7 +3876,7 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/signature-v4@^4.1.3": +"@smithy/signature-v4@^4.1.4": version "4.1.4" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.1.4.tgz#6baa7fe14e86516d2c2568d081c67553449cbb5e" integrity sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q== @@ -3890,7 +3890,7 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.3.2", "@smithy/smithy-client@^3.3.5": +"@smithy/smithy-client@^3.3.5": version "3.3.5" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.3.5.tgz#ded1f89b9d8b17689a87351f6d7708ce4f3b9ea6" integrity sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA== @@ -3964,7 +3964,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.18": +"@smithy/util-defaults-mode-browser@^3.0.21": version "3.0.21" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.21.tgz#cdcb9a29433d2659b7c83902e8f5fca396b8a805" integrity sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA== @@ -3975,7 +3975,7 @@ bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.18": +"@smithy/util-defaults-mode-node@^3.0.21": version "3.0.21" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.21.tgz#f767702cb1416610b6818c9edb966967ea75f524" integrity sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw== @@ -4021,7 +4021,7 @@ "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/util-stream@^3.1.6", "@smithy/util-stream@^3.1.8": +"@smithy/util-stream@^3.1.8": version "3.1.8" resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.8.tgz#31bcf460c54aae816e0789682426da522f894058" integrity sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ== @@ -4692,25 +4692,45 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/express-oauth-server@^2.0.4": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/express-oauth-server/-/express-oauth-server-2.0.7.tgz#14575045d20a30491ac78829f2314f8a27a7b54f" - integrity sha512-u5O3lFdD5d9Ih25XVknqPoIp+BfFFBxsFwCXRBH5gnHjJBy3LseOjviW80PjCqWhI53BBIy77+2hYc6wUPrCJQ== +"@types/express-oauth-server@^2.0.7": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/express-oauth-server/-/express-oauth-server-2.0.8.tgz#d9a300a54fca8027fe3fc5104ef53924ddf53141" + integrity sha512-wBhLebuFSrzJF7n0QbaJPTc5GcISVlxTzrb4KpNeAOJbwIydkXWVVBg+x9vOiwxvYGfiXUQ8AwfgOJatsgD3VQ== dependencies: "@types/express" "*" "@types/oauth2-server" "*" -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" + integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.21", "@types/express@^4.17.8": +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.21", "@types/express@^4.17.8": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -4918,16 +4938,16 @@ "@types/node" "*" "@types/node@*", "@types/node@^22.0.0", "@types/node@^22.5.5": - version "22.7.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.0.tgz#670aa1874bc836863e5c116f9f2c32416ff27e1f" - integrity sha512-MOdOibwBs6KW1vfqz2uKMlxq5xAfAZ98SZjO8e3XnAbFnTJtAspqhWk7hrdSAs9/Y14ZWMiy7/MxMUzAOadYEw== + version "22.7.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.3.tgz#7ddf1ddf13078692b4cfadb835852b2a718ee1ef" + integrity sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA== dependencies: undici-types "~6.19.2" "@types/node@^20.0.0", "@types/node@^20.9.0": - version "20.16.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.7.tgz#0a245bf5805add998a22b8b5adac612ee70190bc" - integrity sha512-QkDQjAY3gkvJNcZOWwzy3BN34RweT0OQ9zJyvLCU0kSK22dO2QYh/NHGfbEAYylPYzRB1/iXcojS79wOg5gFSw== + version "20.16.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.9.tgz#1217c6cc77c4f3aaf4a6c76fb56b790e81e48120" + integrity sha512-rkvIVJxsOfBejxK7I0FO5sa2WxFmJCzoDwcd88+fq/CUfynNywTo/1/T6hyFz22CyztsnLS9nVlHOnTI36RH5w== dependencies: undici-types "~6.19.2" @@ -5653,15 +5673,15 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-builder-bin@5.0.0-alpha.9: - version "5.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.9.tgz#e2669314d0a667bf4332328da1602d7aebfcaad0" - integrity sha512-c/wOXdITW80MGUV2PECWuxB49MIm44latbuoWGjq0i89lmA9ZB8jcvuF1pStu3wrxStYVjYpPD3/NgQDWSHohA== +app-builder-bin@5.0.0-alpha.10: + version "5.0.0-alpha.10" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz#cf12e593b6b847fb9d04027fa755c6c6610d778b" + integrity sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw== -app-builder-lib@25.1.5: - version "25.1.5" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.5.tgz#dca627d97b761743714c7e64238907c762ae8a51" - integrity sha512-0m44K6wTPlcstFp+U+znCCDmrJoCUN03AzqpuHFbo02OIGctCg8DggJ91GZ58eBajAU50JNOQ7G6QRkhA7wB/w== +app-builder-lib@25.1.6: + version "25.1.6" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.6.tgz#a9618e186a5fa7b38cfa2d51ebba36d176ac31b6" + integrity sha512-iui5q65skaawkTBcsaf2wCaegCWO+JoK5VaPnaNdIWXm2bq8a/g53W88FHjR535L9viLeGbuBp/iU1XZSe2DQQ== dependencies: "@develar/schema-utils" "~2.6.5" "@electron/notarize" "2.5.0" @@ -5672,7 +5692,7 @@ app-builder-lib@25.1.5: "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "25.1.5" + builder-util "25.1.6" builder-util-runtime "9.2.9" chromium-pickle-js "^0.2.0" config-file-ts "0.2.8-rc1" @@ -5680,7 +5700,7 @@ app-builder-lib@25.1.5: dotenv "^16.4.5" dotenv-expand "^11.0.6" ejs "^3.1.8" - electron-publish "25.1.5" + electron-publish "25.1.6" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -6264,14 +6284,14 @@ builder-util-runtime@9.2.9: debug "^4.3.4" sax "^1.2.4" -builder-util@25.1.5: - version "25.1.5" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.1.5.tgz#9c20c35e636535025ab986a3e1fbeccb879eff8c" - integrity sha512-NR/RroiugrM+HN+DHIuTfaIby+xKB2ukSZpTIIRfPbDpSnn4ByPQd0DZdyrupsbcndadMYf7R21i3GZy8DENaQ== +builder-util@25.1.6: + version "25.1.6" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.1.6.tgz#8fb5cadd67afd10e8bb6a5d29583e52cebce4fbd" + integrity sha512-BOMVCO/CLYaIwK2uh7BKJUmRy9fYhn674c4Cauxc/lSZ7CyLLNkUMZJUFCPd3OqD1FIQO06MZ/u7akKtVyXlJw== dependencies: "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" - app-builder-bin "5.0.0-alpha.9" + app-builder-bin "5.0.0-alpha.10" bluebird-lst "^1.0.9" builder-util-runtime "9.2.9" chalk "^4.1.2" @@ -6474,9 +6494,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001663: - version "1.0.30001663" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz#1529a723505e429fdfd49532e9fc42273ba7fed7" - integrity sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA== + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== canvas-sequencer@^3.1.0: version "3.1.0" @@ -7803,13 +7823,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@25.1.5: - version "25.1.5" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.5.tgz#826f0c5563b0cbd47137dd0d9e6ceccf4e47f0c9" - integrity sha512-kPvdGQVVztIu9xiosBCQaXLhTwal2gX7qf79CgZwPyAlY3XsClaG+6Bt2fMGQ63Q/ZTojUEi8yrf0QMsZMabvA== +dmg-builder@25.1.6: + version "25.1.6" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.6.tgz#ac9c9c35e09727610f342f400256f329cc7ba064" + integrity sha512-TeKjLNKBu6ODewl36Q1FH0+Bv/Rnb76x1vzPJ0Xw1T/YlAByYl1G+1PaKoEpVEDisrLRSrM9a0k3vDj53xQi9w== dependencies: - app-builder-lib "25.1.5" - builder-util "25.1.5" + app-builder-lib "25.1.6" + builder-util "25.1.6" builder-util-runtime "9.2.9" fs-extra "^10.1.0" iconv-lite "^0.6.2" @@ -7922,9 +7942,9 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" dompurify@^3.0.0: - version "3.1.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2" - integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ== + version "3.1.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.7.tgz#711a8c96479fb6ced93453732c160c3c72418a6a" + integrity sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ== domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" @@ -7993,16 +8013,16 @@ ejs@^3.1.10, ejs@^3.1.7, ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@next: - version "25.1.5" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.5.tgz#1cb66173d39b6d07bfba33ae23db587a3f6a3549" - integrity sha512-XZJ/AIiFwes2XGJkewnHtOk0M19bjT8GSgeI3tyWVvI+8hdkST5JlPRYbI+5/OcYRV5EfdUowRqBxojdxwosEQ== +electron-builder@^25.1.6: + version "25.1.6" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.6.tgz#e2a8a4b4a7b6db615405a9b9b18fb3dcf7c84d8c" + integrity sha512-a+w0leNGcr57u9fiQBsVvVuXtTsg/6VpMOps1Q1TPAceHtK4kWtX2wc7X2cnJQrIME8bWbdm/YR9Swr/xF1/ng== dependencies: - app-builder-lib "25.1.5" - builder-util "25.1.5" + app-builder-lib "25.1.6" + builder-util "25.1.6" builder-util-runtime "9.2.9" chalk "^4.1.2" - dmg-builder "25.1.5" + dmg-builder "25.1.6" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -8042,13 +8062,13 @@ electron-mock-ipc@^0.3.8: resolved "https://registry.yarnpkg.com/electron-mock-ipc/-/electron-mock-ipc-0.3.12.tgz#f9a7dca9a23a95dbe5a62f27cca12768d4cb88c0" integrity sha512-/uwZRpbX+k4E+GesmREg6XcQiTLNhi35M/cw8Czr+ij9k+EYTYY3UPkILnsTr5KTEeAx5/uypf/KwjZDQFDyjA== -electron-publish@25.1.5: - version "25.1.5" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.1.5.tgz#b7c03f6e87568bccd17a85bfad43bd4f75ddb00d" - integrity sha512-P3hrxzY5ETTCn/YtepOdulAbkLdb/PD/uMMpjU9No3q8Yic5YZ3fd/fpbNGC7SV7TsQNqufNwFWGn2kLaoycJQ== +electron-publish@25.1.6: + version "25.1.6" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.1.6.tgz#09cd851b3af6b5ca334ee4dd35581251efe0323e" + integrity sha512-Hiy/tVyu57cbkyxS0GrzEnxm7+B/9IeFcBTia2QQBCTg10zvHURdAj7Sk7XHKys8kKLr1tVNThuG165uTnNJdQ== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "25.1.5" + builder-util "25.1.6" builder-util-runtime "9.2.9" chalk "^4.1.2" fs-extra "^10.1.0" @@ -8056,9 +8076,9 @@ electron-publish@25.1.5: mime "^2.5.2" electron-to-chromium@^1.5.28: - version "1.5.28" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz#aee074e202c6ee8a0030a9c2ef0b3fe9f967d576" - integrity sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw== + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== electron-updater@^6.1.1: version "6.3.4" @@ -8376,7 +8396,7 @@ esbuild-register@^3.5.0: "@esbuild/win32-ia32" "0.23.1" "@esbuild/win32-x64" "0.23.1" -escalade@^3.1.1, escalade@^3.1.2: +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -8423,9 +8443,9 @@ eslint-plugin-react-refresh@^0.4.3: integrity sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg== eslint-plugin-react@^7.33.2: - version "7.36.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz#f1dabbb11f3d4ebe8b0cf4e54aff4aee81144ee5" - integrity sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA== + version "7.37.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz#c21f64a32fc34df1eaeca571ec8f70bdc40dd20a" + integrity sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -8661,7 +8681,7 @@ express-basic-auth@^1.2.1: dependencies: basic-auth "^2.0.1" -express@^4.17.1, express@^4.18.2, express@^4.19.2: +express@^4.0.0, express@^4.17.1, express@^4.19.2: version "4.21.0" resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== @@ -8774,9 +8794,9 @@ fast-sort@^2.0.1: integrity sha512-W7zqnn2zsYoQA87FKmYtgOsbJohOrh7XrtZrCVHN5XZKqTBTv5UG+rSS3+iWbg/nepRQUOu+wnas8BwtK8kiCg== fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" + integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== fast-xml-parser@4.4.1: version "4.4.1" @@ -9660,9 +9680,9 @@ hast-util-is-element@^3.0.0: "@types/hast" "^3.0.0" hast-util-to-string@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz#2a131948b4b1b26461a2c8ac876e2c88d02946bd" - integrity sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== dependencies: "@types/hast" "^3.0.0" @@ -12141,9 +12161,9 @@ mobx-state-tree@^5.0.0, mobx-state-tree@^5.1.7: integrity sha512-SGXAh2KCBQbWVcxeQbZEr5pchTgcfNZmGVRL2a2Me+pSMH98bZWXD6EOuuijbTGbc0hOoOsbab3JdwJyr+fW7Q== mobx@^6.0.0, mobx@^6.6.0: - version "6.13.2" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.13.2.tgz#e4514c983c41611d7008ac4cd21c7f3d1be3180d" - integrity sha512-GIubI2qf+P6lG6rSEG0T2pg3jV9/0+O0ncF09+0umRe75+Cbnh1KNLM1GvbTY9RSc7QuU+LcPNZfxDY8B+3XRg== + version "6.13.3" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.13.3.tgz#27f6171125fd4f737daec940c1d199c479f1b8c5" + integrity sha512-YtAS+ZMbdpbHYUU4ESht3na8KiX11KuMT1yOiKtbKlQ0GZkHDYPKyEw/Tdp7h7aHyLrTWj2TBaSNJ6bCr638iQ== modify-values@^1.0.1: version "1.0.1" @@ -12530,13 +12550,13 @@ nwsapi@^2.2.12, nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== -nx@19.8.0, "nx@>=17.1.2 < 20": - version "19.8.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-19.8.0.tgz#99308c71c5e41f9c7cba9c84bf61935b4d7fd326" - integrity sha512-zD1ZvkfxECrd9QnvUyAUVLESmjl0bpIhB1gLcYN2BqsCkB1vkngbxIvXDorI98keOVEfHzeuwNSkufQNls1hug== +nx@19.8.2, "nx@>=17.1.2 < 20": + version "19.8.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-19.8.2.tgz#a2ac77877050c43105a9d94034838eb5ecf3cf44" + integrity sha512-NE88CbEZj8hCrUKiYzL1sB6O1tmgu/OjvTp3pJOoROMvo0kE7N4XT3TiKAge+E6wVRXf/zU55cH1G2u0djpZhA== dependencies: "@napi-rs/wasm-runtime" "0.2.4" - "@nrwl/tao" "19.8.0" + "@nrwl/tao" "19.8.2" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.7" @@ -12551,7 +12571,6 @@ nx@19.8.0, "nx@>=17.1.2 < 20": figures "3.2.0" flat "^5.0.2" front-matter "^4.0.2" - fs-extra "^11.1.0" ignore "^5.0.4" jest-diff "^29.4.1" jsonc-parser "3.2.0" @@ -12571,16 +12590,16 @@ nx@19.8.0, "nx@>=17.1.2 < 20": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "19.8.0" - "@nx/nx-darwin-x64" "19.8.0" - "@nx/nx-freebsd-x64" "19.8.0" - "@nx/nx-linux-arm-gnueabihf" "19.8.0" - "@nx/nx-linux-arm64-gnu" "19.8.0" - "@nx/nx-linux-arm64-musl" "19.8.0" - "@nx/nx-linux-x64-gnu" "19.8.0" - "@nx/nx-linux-x64-musl" "19.8.0" - "@nx/nx-win32-arm64-msvc" "19.8.0" - "@nx/nx-win32-x64-msvc" "19.8.0" + "@nx/nx-darwin-arm64" "19.8.2" + "@nx/nx-darwin-x64" "19.8.2" + "@nx/nx-freebsd-x64" "19.8.2" + "@nx/nx-linux-arm-gnueabihf" "19.8.2" + "@nx/nx-linux-arm64-gnu" "19.8.2" + "@nx/nx-linux-arm64-musl" "19.8.2" + "@nx/nx-linux-x64-gnu" "19.8.2" + "@nx/nx-linux-x64-musl" "19.8.2" + "@nx/nx-win32-arm64-msvc" "19.8.2" + "@nx/nx-win32-x64-msvc" "19.8.2" object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" @@ -12915,9 +12934,9 @@ p-waterfall@2.1.1: p-reduce "^2.0.0" package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== pacote@^18.0.0, pacote@^18.0.6: version "18.0.6" @@ -13128,7 +13147,7 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== @@ -15343,9 +15362,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.33.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.33.0.tgz#8f9149538c7468ffcb1246cfec603c16720d2db1" - integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== + version "5.34.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.0.tgz#62f2496542290bc6d8bf886edaee7fac158e37e4" + integrity sha512-y5NUX+U9HhVsK/zihZwoq4r9dICLyV2jXGOriDAVOeKhq3LKVjgJbGO90FisozXLlJfvjHqgckGmJFBb9KYoWQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -15882,12 +15901,12 @@ upath@2.0.1: integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" upper-case-first@^2.0.2: version "2.0.2"