read sequencer orientation. fr is normal "reads pointing at each other ---> <--- while some other sequencers can use other options
@@ -1485,8 +1487,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
displayMode
@@ -1494,13 +1496,13 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
>
@@ -1510,6 +1512,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
aria-hidden="true"
aria-invalid="false"
class="MuiSelect-nativeInput css-yf8vq0-MuiSelect-nativeInput"
+ name=":rp:"
tabindex="-1"
value="normal"
/>
@@ -1539,7 +1542,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
Alternative display modes
@@ -1563,8 +1566,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
minSubfeatureWidth
@@ -1572,10 +1575,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
>
@@ -1594,7 +1597,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the minimum width in px for a pileup mismatch feature. use for increasing/decreasing mismatch marker widths when zoomed out, e.g. 0 or 1
@@ -1618,8 +1621,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
maxHeight
@@ -1627,10 +1630,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
>
@@ -1649,7 +1652,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the maximum height to be used in a pileup rendering
@@ -1673,8 +1676,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
maxClippingSize
@@ -1682,10 +1685,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
>
@@ -1704,7 +1707,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the max clip size to be used in a pileup rendering
@@ -1728,8 +1731,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
height
@@ -1737,10 +1740,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
>
@@ -1759,7 +1762,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the height of each feature in a pileup alignment
@@ -1857,8 +1860,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
largeInsertionIndicatorScale
@@ -1866,10 +1869,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
>
@@ -1888,7 +1891,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
scale at which to draw the large insertion indicators (bp/pixel)
diff --git a/plugins/data-management/package.json b/plugins/data-management/package.json
index 6c0f3c442f..0b1fdb01ab 100644
--- a/plugins/data-management/package.json
+++ b/plugins/data-management/package.json
@@ -36,7 +36,7 @@
"clean": "rimraf dist esm *.tsbuildinfo"
},
"dependencies": {
- "@gmod/ucsc-hub": "^0.1.6",
+ "@gmod/ucsc-hub": "^0.3.0",
"@mui/icons-material": "^5.0.1",
"@mui/x-data-grid": "^6.0.1",
"clsx": "^2.0.0",
diff --git a/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap b/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap
index f4adf06dc4..ed0ef61785 100644
--- a/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap
+++ b/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap
@@ -96,6 +96,7 @@ exports[`renders 1`] = `
aria-hidden="true"
aria-invalid="false"
class="MuiSelect-nativeInput css-yf8vq0-MuiSelect-nativeInput"
+ name=":r2:"
tabindex="-1"
value="UCSCTrackHubConnection"
/>
diff --git a/plugins/data-management/src/AddTrackWidget/model.ts b/plugins/data-management/src/AddTrackWidget/model.ts
index a8b0f9a5b9..5866a28d61 100644
--- a/plugins/data-management/src/AddTrackWidget/model.ts
+++ b/plugins/data-management/src/AddTrackWidget/model.ts
@@ -21,11 +21,24 @@ interface IndexingAttr {
attributes: string[]
exclude: string[]
}
+
+/**
+ * #stateModel AddTrackModel
+ */
export default function f(pluginManager: PluginManager) {
return types
.model('AddTrackModel', {
+ /**
+ * #property
+ */
id: ElementId,
+ /**
+ * #property
+ */
type: types.literal('AddTrackWidget'),
+ /**
+ * #property
+ */
view: types.safeReference(
pluginManager.pluggableMstType('view', 'stateModel'),
),
@@ -45,34 +58,63 @@ export default function f(pluginManager: PluginManager) {
textIndexingConf: undefined as IndexingAttr | undefined,
}))
.actions(self => ({
+ /**
+ * #action
+ */
setAdapterHint(obj: string) {
self.adapterHint = obj
},
+ /**
+ * #action
+ */
setTrackSource(str: string) {
self.trackSource = str
},
+ /**
+ * #action
+ */
setTextIndexingConf(conf: IndexingAttr) {
self.textIndexingConf = conf
},
+ /**
+ * #action
+ */
setTextIndexTrack(flag: boolean) {
self.textIndexTrack = flag
},
+ /**
+ * #action
+ */
setTrackData(obj: FileLocation) {
self.trackData = obj
},
+ /**
+ * #action
+ */
setIndexTrackData(obj: FileLocation) {
self.indexTrackData = obj
},
+ /**
+ * #action
+ */
setAssembly(str: string) {
self.altAssemblyName = str
},
+ /**
+ * #action
+ */
setTrackName(str: string) {
self.altTrackName = str
},
+ /**
+ * #action
+ */
setTrackType(str: string) {
self.altTrackType = str
},
-
+ /**
+ * #action
+ */
clearData() {
self.trackSource = ''
self.altTrackName = ''
@@ -86,6 +128,9 @@ export default function f(pluginManager: PluginManager) {
},
}))
.views(self => ({
+ /**
+ * #getter
+ */
get trackAdapter() {
const { trackData, indexTrackData, adapterHint } = self
@@ -94,6 +139,9 @@ export default function f(pluginManager: PluginManager) {
: undefined
},
+ /**
+ * #getter
+ */
get trackName() {
return (
self.altTrackName ||
@@ -101,6 +149,9 @@ export default function f(pluginManager: PluginManager) {
)
},
+ /**
+ * #getter
+ */
get isFtp() {
const { trackData: track, indexTrackData: index } = self
return !!(
@@ -109,29 +160,47 @@ export default function f(pluginManager: PluginManager) {
)
},
+ /**
+ * #getter
+ */
get isRelativeTrackUrl() {
// @ts-expect-error
const uri = self.trackData?.uri
return uri ? !isAbsoluteUrl(uri) : false
},
+ /**
+ * #getter
+ */
get isRelativeIndexUrl() {
// @ts-expect-error
const uri = self.indexTrackData?.uri
return uri ? !isAbsoluteUrl(uri) : false
},
+ /**
+ * #getter
+ */
get isRelativeUrl() {
return this.isRelativeIndexUrl || this.isRelativeTrackUrl
},
+ /**
+ * #getter
+ */
get trackHttp() {
// @ts-expect-error
return self.trackData?.uri?.startsWith('http://')
},
+ /**
+ * #getter
+ */
get indexHttp() {
// @ts-expect-error
return self.indexTrackData?.uri?.startsWith('http://')
},
+ /**
+ * #getter
+ */
get wrongProtocol() {
return (
window.location.protocol === 'https:' &&
@@ -139,14 +208,23 @@ export default function f(pluginManager: PluginManager) {
)
},
+ /**
+ * #getter
+ */
get unsupported() {
return this.trackAdapter?.type === UNSUPPORTED
},
+ /**
+ * #getter
+ */
get assembly() {
return self.altAssemblyName || self.view.assemblyNames?.[0]
},
+ /**
+ * #getter
+ */
get trackType() {
return (
self.altTrackType ||
@@ -157,6 +235,9 @@ export default function f(pluginManager: PluginManager) {
},
}))
.views(self => ({
+ /**
+ * #getter
+ */
get warningMessage() {
if (self.isFtp) {
return `Warning: JBrowse cannot access files using the ftp protocol`
diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap
index 418a0e1d74..628bee023f 100644
--- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap
+++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap
@@ -32,7 +32,7 @@ exports[`renders nothing with no assembly 1`] = `
class="MuiFormControl-root MuiFormControl-marginDense MuiFormControl-fullWidth MuiTextField-root css-rlnh8o-MuiFormControl-root-MuiTextField-root-searchBox"
>
) {
- return Object.entries(obj)
- .map(([key, val]) => (typeof val === 'string' ? key : ''))
- .filter(f => !!f)
-}
diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts
index 9e8d8cb2f7..68b3cf4463 100644
--- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts
+++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts
@@ -11,18 +11,10 @@ import {
measureGridWidth,
} from '@jbrowse/core/util'
import { autorun, observable } from 'mobx'
-import { getRootKeys } from './components/faceted/util'
+import { getRootKeys, findNonSparseKeys } from './facetedUtil'
const nonMetadataKeys = ['category', 'adapter', 'description'] as const
-function filt(
- keys: readonly string[],
- rows: Record[],
- cb: (row: Record, f: string) => unknown,
-) {
- return keys.filter(f => rows.map(r => cb(r, f)).filter(f => !!f).length > 5)
-}
-
/**
* #stateModel FacetedModel
*/
@@ -114,9 +106,10 @@ export function facetedStateTreeF() {
/**
* #getter
*/
- get trackConfigurations() {
- return getParent<{ trackConfigurations: AnyConfigurationModel[] }>(self)
- .trackConfigurations
+ get allTrackConfigurations() {
+ return getParent<{ allTrackConfigurations: AnyConfigurationModel[] }>(
+ self,
+ ).allTrackConfigurations
},
}))
.views(self => ({
@@ -125,10 +118,10 @@ export function facetedStateTreeF() {
*/
get rows() {
const session = getSession(self)
- const { trackConfigurations, filterText } = self
+ const { allTrackConfigurations, filterText } = self
// metadata is spread onto the object for easier access and sorting
// by the mui data grid (it's unable to sort by nested objects)
- return trackConfigurations
+ return allTrackConfigurations
.filter(conf => matches(filterText, conf, session))
.map(track => {
const metadata = readConfObject(track, 'metadata')
@@ -146,22 +139,33 @@ export function facetedStateTreeF() {
}))
.views(self => ({
+ /**
+ * #getter
+ */
get filteredNonMetadataKeys() {
return self.showSparse
? nonMetadataKeys
- : filt(nonMetadataKeys, self.rows, (r, f) => r[f])
+ : findNonSparseKeys(nonMetadataKeys, self.rows, (r, f) => r[f])
},
-
+ /**
+ * #getter
+ */
get metadataKeys() {
return [...new Set(self.rows.flatMap(row => getRootKeys(row.metadata)))]
},
get filteredMetadataKeys() {
return self.showSparse
? this.metadataKeys
- : // @ts-expect-error
- filt(this.metadataKeys, self.rows, (r, f) => r.metadata[f])
+ : findNonSparseKeys(
+ this.metadataKeys,
+ self.rows,
+ // @ts-expect-error
+ (r, f) => r.metadata[f],
+ )
},
-
+ /**
+ * #getter
+ */
get fields() {
return [
'name',
@@ -169,6 +173,9 @@ export function facetedStateTreeF() {
...this.filteredMetadataKeys.map(m => `metadata.${m}`),
]
},
+ /**
+ * #getter
+ */
get filteredRows() {
const arrFilters = [...self.filters.entries()]
.filter(f => f[1].length > 0)
@@ -180,9 +187,15 @@ export function facetedStateTreeF() {
},
}))
.actions(self => ({
+ /**
+ * #action
+ */
setVisible(args: Record) {
self.visible = args
},
+ /**
+ * #action
+ */
setWidths(args: Record) {
self.widths = args
},
diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts
new file mode 100644
index 0000000000..cdc7e1a587
--- /dev/null
+++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts
@@ -0,0 +1,13 @@
+export function findNonSparseKeys(
+ keys: readonly string[],
+ rows: Record[],
+ cb: (row: Record, f: string) => unknown,
+) {
+ return keys.filter(f => rows.map(r => cb(r, f)).filter(f => !!f).length > 5)
+}
+
+export function getRootKeys(obj: Record) {
+ return Object.entries(obj)
+ .map(([key, val]) => (typeof val === 'string' ? key : ''))
+ .filter(f => !!f)
+}
diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts
index c0f10a1abc..2b47732b30 100644
--- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts
+++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts
@@ -320,24 +320,25 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
getConf(getSession(self), ['hierarchical', 'sort', 'categories'])
)
},
- /**
- * #method
- * filter out tracks that don't match the current display types
- */
- connectionTrackConfigurations(conn: { tracks: AnyConfigurationModel[] }) {
- return filterTracks(conn.tracks, self)
- },
/**
* #getter
* filter out tracks that don't match the current assembly/display types
*/
- get trackConfigurations() {
+ get configAndSessionTrackConfigurations() {
return [
...self.assemblyNames.map(a => self.getRefSeqTrackConf(a)),
...filterTracks(getSession(self).tracks, self),
].filter(notEmpty)
},
+
+ get allTrackConfigurations() {
+ const { connectionInstances = [] } = getSession(self)
+ return [
+ ...this.configAndSessionTrackConfigurations,
+ ...connectionInstances?.flatMap(c => c.tracks),
+ ]
+ },
}))
.views(self => ({
/**
@@ -345,7 +346,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
* filters out tracks that are not in the favorites group
*/
get favoriteTracks() {
- return self.trackConfigurations.filter(t =>
+ return self.allTrackConfigurations.filter(t =>
self.favoritesSet.has(t.trackId),
)
},
@@ -355,7 +356,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
* filters out tracks that are not in the recently used group
*/
get recentlyUsedTracks() {
- return self.trackConfigurations.filter(t =>
+ return self.allTrackConfigurations.filter(t =>
self.recentlyUsedSet.has(t.trackId),
)
},
@@ -369,7 +370,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
return [
{
group: 'Tracks',
- tracks: self.trackConfigurations,
+ tracks: self.configAndSessionTrackConfigurations,
noCategories: false,
menuItems: [],
},
diff --git a/plugins/data-management/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.tsx.snap b/plugins/data-management/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.tsx.snap
index 52e618baf3..879f5379fa 100644
--- a/plugins/data-management/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.tsx.snap
+++ b/plugins/data-management/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.tsx.snap
@@ -7,7 +7,7 @@ exports[`renders with the available plugins 1`] = `
class="MuiFormControl-root MuiFormControl-marginDense MuiFormControl-fullWidth MuiTextField-root css-1z10yd4-MuiFormControl-root-MuiTextField-root"
>
+ for (const [genomeName, genome] of Object.entries(genomesFile.data)) {
+ const assemblyNames = getConf(self, 'assemblyNames')
+ if (assemblyNames.length > 0 && !assemblyNames.includes(genomeName)) {
+ continue
+ }
+
+ const asm = assemblyManager.get(genomeName)
+ if (!asm) {
+ notLoadedAssemblies.push(genomeName)
+ continue
+ }
+
+ // @ts-expect-error
+ const db = genome.data.trackDb
+ if (!db) {
+ throw new Error('genomesFile not found on hub')
+ }
+ const base = new URL(genomeFile, hubUri)
+ const loc = hubUri
+ ? {
+ uri: new URL(db, base).href,
+ locationType: 'UriLocation' as const,
+ }
+ : {
+ localPath: db,
+ locationType: 'LocalPathLocation' as const,
+ }
+ const trackDb = await fetchTrackDbFile(loc)
+ const sequenceAdapter = getConf(asm, ['sequence', 'adapter'])
+ const tracks = generateTracks({
+ trackDb,
+ trackDbLoc: loc,
+ assemblyName: genomeName,
+ sequenceAdapter,
+ })
+ self.addTrackConfs(tracks)
+ map[genomeName] = tracks.length
+ }
+
+ const loadedAssemblies = Object.entries(map)
+ const str1 = loadedAssemblies.length
+ ? `Loaded data from these assemblies: ${loadedAssemblies
+ .map(([key, val]) => `${key} (${val} tracks)`)
+ .join(', ')}`
+ : ''
+ const str2 = notLoadedAssemblies.length
+ ? `Skipped data from these assemblies: ${notLoadedAssemblies.join(
+ ', ',
+ )}`
+ : ''
+ session.notify([str1, str2].filter(f => !!f).join('. '), 'success')
+ }
+ } catch (e) {
+ console.error(e)
+ session.notify(`${getConf(self, 'name')}: "${e}"`, 'error')
+ session.breakConnection?.(self.configuration)
+ }
+}
diff --git a/plugins/data-management/src/ucsc-trackhub/model.ts b/plugins/data-management/src/ucsc-trackhub/model.ts
index d84b2b17e0..a06764d17e 100644
--- a/plugins/data-management/src/ucsc-trackhub/model.ts
+++ b/plugins/data-management/src/ucsc-trackhub/model.ts
@@ -1,111 +1,40 @@
import PluginManager from '@jbrowse/core/PluginManager'
import { BaseConnectionModelFactory } from '@jbrowse/core/pluggableElementTypes/models'
-import {
- ConfigurationReference,
- readConfObject,
- getConf,
-} from '@jbrowse/core/configuration'
-import { getSession } from '@jbrowse/core/util'
+import { ConfigurationReference } from '@jbrowse/core/configuration'
import { types } from 'mobx-state-tree'
// locals
import configSchema from './configSchema'
+/**
+ * #stateModel UCSCTrackHubConnection
+ * extends BaseConnectionModel
+ */
export default function UCSCTrackHubConnection(pluginManager: PluginManager) {
return types
.compose(
'UCSCTrackHubConnection',
BaseConnectionModelFactory(pluginManager),
types.model({
+ /**
+ * #property
+ */
configuration: ConfigurationReference(configSchema),
+ /**
+ * #property
+ */
type: types.literal('UCSCTrackHubConnection'),
}),
)
.actions(self => ({
+ /**
+ * #action
+ */
async connect() {
- const session = getSession(self)
- const notLoadedAssemblies = [] as string[]
- try {
- const hubFileLocation = getConf(self, 'hubTxtLocation')
- const {
- generateTracks,
- fetchGenomesFile,
- fetchTrackDbFile,
- fetchHubFile,
- } = await import('./ucscTrackHub')
- const hubFile = await fetchHubFile(hubFileLocation)
- const genomeFile = hubFile.get('genomesFile')
- if (!genomeFile) {
- throw new Error('genomesFile not found on hub')
- }
+ const { doConnect } = await import('./doConnect')
- const hubUri = new URL(hubFileLocation.uri, hubFileLocation.baseUri)
- const genomesFileLocation = hubUri
- ? {
- uri: new URL(genomeFile, hubUri).href,
- locationType: 'UriLocation' as const,
- }
- : {
- localPath: genomeFile,
- locationType: 'LocalPathLocation' as const,
- }
- const genomesFile = await fetchGenomesFile(genomesFileLocation)
- const map = {} as Record
- for (const [genomeName, genome] of genomesFile) {
- const assemblyNames = getConf(self, 'assemblyNames')
- if (
- assemblyNames.length > 0 &&
- !assemblyNames.includes(genomeName)
- ) {
- continue
- }
-
- const conf = session.assemblyManager.get(genomeName)?.configuration
- if (!conf) {
- notLoadedAssemblies.push(genomeName)
- continue
- }
- const db = genome.get('trackDb')
- if (!db) {
- throw new Error('genomesFile not found on hub')
- }
- const base = new URL(genomeFile, hubUri)
- const loc = hubUri
- ? {
- uri: new URL(db, base).href,
- locationType: 'UriLocation' as const,
- }
- : {
- localPath: db,
- locationType: 'LocalPathLocation' as const,
- }
- const trackDb = await fetchTrackDbFile(loc)
- const seqAdapter = readConfObject(conf, ['sequence', 'adapter'])
- const tracks = generateTracks(trackDb, loc, genomeName, seqAdapter)
- self.addTrackConfs(tracks)
- map[genomeName] = tracks.length
- }
-
- const loadedAssemblies = Object.entries(map)
- const str1 = loadedAssemblies.length
- ? `Loaded data from these assemblies: ${loadedAssemblies
- .map(([key, val]) => `${key} (${val} tracks)`)
- .join(', ')}`
- : ''
- const str2 = notLoadedAssemblies.length
- ? `Skipped data from these assemblies: ${notLoadedAssemblies.join(
- ', ',
- )}`
- : ''
- session.notify([str1, str2].filter(f => !!f).join('. '), 'success')
- } catch (e) {
- console.error(e)
- session.notify(
- `There was a problem connecting to the UCSC Track Hub "${self.configuration.name}". Please make sure you have entered a valid hub.txt file. The error that was thrown is: "${e}"`,
- 'error',
- )
- session.breakConnection?.(self.configuration)
- }
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
+ doConnect(self)
},
}))
}
diff --git a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts
index f7f7a517a8..3182ce5340 100644
--- a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts
+++ b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts
@@ -1,37 +1,30 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
-import { RaStanza, TrackDbFile } from '@gmod/ucsc-hub'
-import { FileLocation, isUriLocation, objectHash } from '@jbrowse/core/util'
-import { openLocation } from '@jbrowse/core/util/io'
import {
- generateUnsupportedTrackConf,
- generateUnknownTrackConf,
-} from '@jbrowse/core/util/tracks'
-
-export async function fetchHubFile(hubLocation: FileLocation) {
- try {
- const hubFileText = await openLocation(hubLocation).readFile('utf8')
- const { HubFile } = await import('@gmod/ucsc-hub')
- return new HubFile(hubFileText)
- } catch (error) {
- throw new Error(`Not a valid hub.txt file, got error: '${error}'`)
- }
-}
+ FileLocation,
+ isUriLocation,
+ notEmpty,
+ objectHash,
+} from '@jbrowse/core/util'
+import { openLocation } from '@jbrowse/core/util/io'
+import { generateUnknownTrackConf } from '@jbrowse/core/util/tracks'
+import { RaStanza, GenomesFile, TrackDbFile } from '@gmod/ucsc-hub'
export async function fetchGenomesFile(genomesLoc: FileLocation) {
const genomesFileText = await openLocation(genomesLoc).readFile('utf8')
- const { GenomesFile } = await import('@gmod/ucsc-hub')
return new GenomesFile(genomesFileText)
}
export async function fetchTrackDbFile(trackDbLoc: FileLocation) {
const text = await openLocation(trackDbLoc).readFile('utf8')
- const { TrackDbFile } = await import('@gmod/ucsc-hub')
return new TrackDbFile(text)
}
-export function makeLoc(first: string, base: { uri: string }) {
+export function makeLoc(
+ first: string,
+ base: { uri: string; baseUri?: string },
+) {
return {
- uri: new URL(first, base.uri).href,
+ uri: new URL(first, new URL(base.uri, base.baseUri)).href,
locationType: 'UriLocation',
}
}
@@ -52,70 +45,77 @@ export function makeLoc2(first: string, alt?: string) {
}
}
-export function generateTracks(
- trackDb: TrackDbFile,
- trackDbLoc: FileLocation,
- assemblyName: string,
- sequenceAdapter: any,
-) {
- const tracks: any = []
-
- for (const [trackName, track] of trackDb.entries()) {
- const trackKeys = [...track.keys()]
- const parentTrackKeys = new Set([
- 'superTrack',
- 'compositeTrack',
- 'container',
- 'view',
- ])
- if (trackKeys.some(key => parentTrackKeys.has(key))) {
- continue
- }
- const parentTracks = []
- let currentTrackName = trackName
- do {
- currentTrackName = trackDb.get(currentTrackName)?.get('parent') || ''
- if (currentTrackName) {
- ;[currentTrackName] = currentTrackName.split(' ')
- parentTracks.push(trackDb.get(currentTrackName))
+export function generateTracks({
+ trackDb,
+ trackDbLoc,
+ assemblyName,
+ sequenceAdapter,
+}: {
+ trackDb: TrackDbFile
+ trackDbLoc: FileLocation
+ assemblyName: string
+ sequenceAdapter: any
+}) {
+ return Object.entries(trackDb.data)
+ .map(([trackName, track]) => {
+ const trackKeys = Object.keys(track!)
+ const parentTrackKeys = new Set([
+ 'superTrack',
+ 'compositeTrack',
+ 'container',
+ 'view',
+ ])
+ if (trackKeys.some(key => parentTrackKeys.has(key))) {
+ return undefined
+ }
+ const parentTracks = []
+ let currentTrackName = trackName
+ do {
+ currentTrackName = trackDb.data[currentTrackName]?.data.parent || ''
+ if (currentTrackName) {
+ ;[currentTrackName] = currentTrackName.split(' ')
+ parentTracks.push(trackDb.data[currentTrackName])
+ }
+ } while (currentTrackName)
+ parentTracks.reverse()
+ const categories = parentTracks
+ .map(p => p?.data.shortLabel)
+ .filter((f): f is string => !!f)
+ const res = makeTrackConfig({
+ track: track!,
+ categories,
+ trackDbLoc,
+ trackDb,
+ sequenceAdapter,
+ })
+ return {
+ ...res,
+ trackId: `ucsc-trackhub-${objectHash(res)}`,
+ assemblyNames: [assemblyName],
}
- } while (currentTrackName)
- parentTracks.reverse()
- const categories = parentTracks
- .map(p => p?.get('shortLabel'))
- .filter((f): f is string => !!f)
- const res = makeTrackConfig(
- track,
- categories,
- trackDbLoc,
- trackDb,
- sequenceAdapter,
- )
- tracks.push({
- ...res,
- trackId: `ucsc-trackhub-${objectHash(res)}`,
- assemblyNames: [assemblyName],
})
- }
-
- return tracks
+ .filter(notEmpty)
}
-function makeTrackConfig(
- track: RaStanza,
- categories: string[],
- trackDbLoc: FileLocation,
- trackDb: TrackDbFile,
- sequenceAdapter: any,
-) {
- let trackType = track.get('type')
- const name = track.get('shortLabel') || ''
- const bigDataUrl = track.get('bigDataUrl') || ''
- const bigDataIdx = track.get('bigDataIndex') || ''
+function makeTrackConfig({
+ track,
+ categories,
+ trackDbLoc,
+ trackDb,
+ sequenceAdapter,
+}: {
+ track: RaStanza
+ categories: string[]
+ trackDbLoc: FileLocation
+ trackDb: TrackDbFile
+ sequenceAdapter: any
+}) {
+ const trackType =
+ track.data.type || trackDb.data[track.data.parent || '']?.data.type || ''
+ const name = track.data.shortLabel || ''
+ const bigDataUrl = track.data.bigDataUrl || ''
+ const bigDataIdx = track.data.bigDataIndex || ''
const isUri = isUriLocation(trackDbLoc)
- if (!trackType) {
- trackType = trackDb.get(track.get('parent') || '')?.get('type')
- }
let baseTrackType = trackType?.split(' ')[0] || ''
if (baseTrackType === 'bam' && bigDataUrl.toLowerCase().endsWith('cram')) {
baseTrackType = 'cram'
@@ -128,8 +128,8 @@ function makeTrackConfig(
case 'bam':
return {
type: 'AlignmentsTrack',
- name: track.get('shortLabel'),
- description: track.get('longLabel'),
+ name: track.data.longLabel,
+ description: track.data.longLabel,
category: categories,
adapter: {
type: 'BamAdapter',
@@ -142,103 +142,44 @@ function makeTrackConfig(
},
}
- case 'bigBarChart':
+ case 'cram':
return {
- type: 'FeatureTrack',
+ type: 'AlignmentsTrack',
name,
- description: track.get('longLabel'),
+ description: track.data.longLabel,
category: categories,
adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- renderer: {
- type: 'SvgFeatureRenderer',
+ type: 'CramAdapter',
+ cramLocation: bigDataLocation,
+ craiLocation: isUri
+ ? makeLocAlt(bigDataIdx, bigDataUrl + '.crai', trackDbLoc)
+ : makeLoc2(bigDataIdx, bigDataUrl + '.crai'),
+ sequenceAdapter,
},
}
+ case 'bigBarChart':
case 'bigBed':
- return {
- type: 'FeatureTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- }
case 'bigGenePred':
- return {
- type: 'FeatureTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- }
case 'bigChain':
- return {
- type: 'FeatureTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- renderer: {
- type: 'SvgFeatureRenderer',
- },
- }
case 'bigInteract':
- return {
- type: 'FeatureTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- renderer: {
- type: 'SvgFeatureRenderer',
- },
- }
case 'bigMaf':
- return {
- type: 'FeatureTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- renderer: {
- type: 'SvgFeatureRenderer',
- },
- }
+ case 'bigNarrowPeak':
case 'bigPsl':
return {
type: 'FeatureTrack',
name,
- description: track.get('longLabel'),
+ description: track.data.longLabel,
category: categories,
adapter: {
type: 'BigBedAdapter',
bigBedLocation: bigDataLocation,
},
- renderer: {
- type: 'SvgFeatureRenderer',
- },
}
case 'bigWig':
return {
type: 'QuantitativeTrack',
name,
- description: track.get('longLabel'),
+ description: track.data.longLabel,
category: categories,
adapter: {
type: 'BigWigAdapter',
@@ -246,40 +187,11 @@ function makeTrackConfig(
},
}
- case 'cram':
- return {
- type: 'AlignmentsTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'CramAdapter',
- cramLocation: bigDataLocation,
- craiLocation: isUri
- ? makeLocAlt(bigDataIdx, bigDataUrl + '.crai', trackDbLoc)
- : makeLoc2(bigDataIdx, bigDataUrl + '.crai'),
- sequenceAdapter,
- },
- }
-
- case 'bigNarrowPeak':
- return {
- type: 'FeatureTrack',
- name,
- description: track.get('longLabel'),
- category: categories,
- adapter: {
- type: 'BigBedAdapter',
- bigBedLocation: bigDataLocation,
- },
- }
- case 'peptideMapping':
- return generateUnsupportedTrackConf(name, baseTrackType, categories)
case 'vcfTabix':
return {
type: 'VariantTrack',
name,
- description: track.get('longLabel'),
+ description: track.data.longLabel,
category: categories,
adapter: {
type: 'VcfTabixAdapter',
@@ -296,7 +208,7 @@ function makeTrackConfig(
return {
type: 'HicTrack',
name,
- description: track.get('longLabel'),
+ description: track.data.longLabel,
category: categories,
adapter: {
type: 'HicAdapter',
@@ -305,6 +217,7 @@ function makeTrackConfig(
}
// unsupported types
+ // case 'peptideMapping':
// case 'gvf':
// case 'ld2':
// case 'narrowPeak':
diff --git a/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap b/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap
index a5adc826ff..d802081bf0 100644
--- a/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap
+++ b/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap
@@ -176,7 +176,7 @@ exports[`renders one track, one region 1`] = `
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-19qh8xo-MuiInputBase-input-MuiOutlinedInput-input"
- id=":r6:"
+ id=":r7:"
placeholder="Search for location"
role="combobox"
spellcheck="false"
@@ -749,7 +749,7 @@ exports[`renders two tracks, two regions 1`] = `
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-19qh8xo-MuiInputBase-input-MuiOutlinedInput-input"
- id=":r8:"
+ id=":r9:"
placeholder="Search for location"
role="combobox"
spellcheck="false"
diff --git a/test_data/volvoxhub/bbi/volvox-sorted.bam.coverage.bw b/test_data/volvoxhub/bbi/volvox-sorted.bam.coverage.bw
new file mode 100644
index 0000000000..c6ca75740f
Binary files /dev/null and b/test_data/volvoxhub/bbi/volvox-sorted.bam.coverage.bw differ
diff --git a/test_data/volvoxhub/bbi/volvox.bb b/test_data/volvoxhub/bbi/volvox.bb
new file mode 100644
index 0000000000..08839236f4
Binary files /dev/null and b/test_data/volvoxhub/bbi/volvox.bb differ
diff --git a/test_data/volvoxhub/config.json b/test_data/volvoxhub/config.json
index 04583515a4..02e6baa927 100644
--- a/test_data/volvoxhub/config.json
+++ b/test_data/volvoxhub/config.json
@@ -66,6 +66,7 @@
"locationType": "UriLocation"
}
},
+
{
"type": "UCSCTrackHubConnection",
"connectionId": "UCSCTrackHubConnection-volvox-hub2",
@@ -75,6 +76,15 @@
"locationType": "UriLocation"
}
},
+ {
+ "type": "UCSCTrackHubConnection",
+ "connectionId": "UCSCTrackHubConnection-volvox-singlefilehub",
+ "name": "UCSCTrackHubConnection-volvox-singlefilehub",
+ "hubTxtLocation": {
+ "uri": "singlefile.volvox.hub.txt",
+ "locationType": "UriLocation"
+ }
+ },
{
"type": "UCSCTrackHubConnection",
"connectionId": "UCSCTrackHubConnection-volvox-remote",
diff --git a/test_data/volvoxhub/html/volvox.description.html b/test_data/volvoxhub/html/volvox.description.html
new file mode 100644
index 0000000000..1c7892fd93
--- /dev/null
+++ b/test_data/volvoxhub/html/volvox.description.html
@@ -0,0 +1,7 @@
+
+
+
+ Hello world!
+ Volvox single file trackhub
+
+
diff --git a/test_data/volvoxhub/singlefile.volvox.hub.txt b/test_data/volvoxhub/singlefile.volvox.hub.txt
new file mode 100644
index 0000000000..e453dc091c
--- /dev/null
+++ b/test_data/volvoxhub/singlefile.volvox.hub.txt
@@ -0,0 +1,34 @@
+hub volvox genome assembly
+shortLabel volvox
+longLabel Volvox mythicus genome assembly
+useOneFile on
+email colin.diesh@gmail.com
+descriptionUrl html/volvox.description.html
+
+genome volvox
+taxId 1234
+groups groups.txt
+description roundworm
+twoBitPath volvox.2bit
+twoBitBptUrl volvox.2bit.bpt
+chromSizes volvox.chrom.sizes
+chromAliasBb volvox.chromAlias.bb
+chromAuthority ucsc
+organism Volvox mythicus Feb. 2013
+defaultPos ctgA:5000-10000
+scientificName Volvox mythicus
+htmlPath html/volvox.description.html
+
+track genes
+longLabel Genes
+shortLabel Genes
+bigDataUrl bbi/volvox.bb
+type bigBed 6
+html html/volvox.genes.html
+
+track coverage
+shortLabel Coverage
+longLabel Coverage for volvox-sorted.bam
+bigDataUrl bbi/volvox-sorted.bam.coverage.bw
+type bigWig 0 100
+html html/volvox.coverage.html
diff --git a/yarn.lock b/yarn.lock
index f0ba958ddd..879a7d97e6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1052,7 +1052,7 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db"
integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==
@@ -1615,10 +1615,10 @@
generic-filehandle "^3.0.0"
long "^4.0.0"
-"@gmod/ucsc-hub@^0.1.6":
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/@gmod/ucsc-hub/-/ucsc-hub-0.1.7.tgz#ea8d0c1978fc8bbd1ab63061e8105beb3d1509f1"
- integrity sha512-FHCgRLOYn5wjCGVDkGnW0wda7UAIFqVrKE5+0lh1EpUOu/UM1kfaidsJnha4Jc9V0+KCevSl4haVv0ZaMWqw2w==
+"@gmod/ucsc-hub@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@gmod/ucsc-hub/-/ucsc-hub-0.3.0.tgz#375eeab1c515605510c706f6e2d76d6b42454f8c"
+ integrity sha512-M8r1rpmNOVH6UHwUTSOR5Z86upWEhvI3BKbyYVq8imTS+nZAq8Gr9RJTBsGlL0sgX7fmLSXms8/pTyp7e3YAQA==
"@gmod/vcf@^5.0.9":
version "5.0.10"
@@ -2067,94 +2067,94 @@
resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb"
integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==
-"@mui/base@5.0.0-beta.24":
- version "5.0.0-beta.24"
- resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.24.tgz#1a0638388291828dacf9547b466bc21fbaad3a2a"
- integrity sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==
+"@mui/base@5.0.0-beta.25":
+ version "5.0.0-beta.25"
+ resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.25.tgz#e1bc39f7a2daa9851fa8d0774ae6d89f0453bdc3"
+ integrity sha512-Iiv+IcappRRv6IBlknIVmLkXxfp51NEX1+l9f+dIbBuPU4PaRULegr1lCeHKsC45KU5ruxM5xMg4R/de03aJQg==
dependencies:
- "@babel/runtime" "^7.23.2"
+ "@babel/runtime" "^7.23.4"
"@floating-ui/react-dom" "^2.0.4"
- "@mui/types" "^7.2.9"
- "@mui/utils" "^5.14.18"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.19"
"@popperjs/core" "^2.11.8"
clsx "^2.0.0"
prop-types "^15.8.1"
-"@mui/core-downloads-tracker@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz#f8b187dc89756fa5c0b7d15aea537a6f73f0c2d8"
- integrity sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==
+"@mui/core-downloads-tracker@^5.14.19":
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.19.tgz#9c04ad047c378d857d529ef9c535b60a10b9a47c"
+ integrity sha512-y4JseIen5pmZs1n9hHy95HKKioKco8f6N2lford2AmjJigVJOv0KsU0qryiCpyuEUZmi/xCduVilHsK9DSkPcA==
"@mui/icons-material@^5.0.0", "@mui/icons-material@^5.0.1", "@mui/icons-material@^5.0.2":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.18.tgz#9e92964cde8c7ba32cf50438a83403dc283f2328"
- integrity sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.19.tgz#6e0f4e9d89f99517d3c0ee65dee7ac97753755af"
+ integrity sha512-yjP8nluXxZGe3Y7pS+yxBV+hWZSsSBampCxkZwaw+1l+feL+rfP74vbEFbMrX/Kil9I/Y1tWfy5bs/eNvwNpWw==
dependencies:
- "@babel/runtime" "^7.23.2"
+ "@babel/runtime" "^7.23.4"
"@mui/material@^5.0.0", "@mui/material@^5.10.17":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.18.tgz#d0a89be3e27afe90135d542ddbf160b3f34e869c"
- integrity sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==
- dependencies:
- "@babel/runtime" "^7.23.2"
- "@mui/base" "5.0.0-beta.24"
- "@mui/core-downloads-tracker" "^5.14.18"
- "@mui/system" "^5.14.18"
- "@mui/types" "^7.2.9"
- "@mui/utils" "^5.14.18"
- "@types/react-transition-group" "^4.4.8"
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.19.tgz#6b81f6248da04ee73f935a79d81e7819c7115089"
+ integrity sha512-jSPLXst/YPgDGolhiu4rbethKjLVrI1IkoK8YrFUv8ygxDuhQdsE6+ZqjSSRXk3ytTMf6ghPnQ88OFRk4XjpNw==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@mui/base" "5.0.0-beta.25"
+ "@mui/core-downloads-tracker" "^5.14.19"
+ "@mui/system" "^5.14.19"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.19"
+ "@types/react-transition-group" "^4.4.9"
clsx "^2.0.0"
csstype "^3.1.2"
prop-types "^15.8.1"
react-is "^18.2.0"
react-transition-group "^4.4.5"
-"@mui/private-theming@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.18.tgz#98f97139ea21570493391ab377c1deb47fc6d1a2"
- integrity sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==
+"@mui/private-theming@^5.14.19":
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.19.tgz#f3bae7377f987dc5f40d0c43163ae1ed1f892961"
+ integrity sha512-U9w39VpXLGVM8wZlUU/47YGTsBSk60ZQRRxQZtdqPfN1N7OVllQeN4cEKZKR8PjqqR3aYRcSciQ4dc6CttRoXQ==
dependencies:
- "@babel/runtime" "^7.23.2"
- "@mui/utils" "^5.14.18"
+ "@babel/runtime" "^7.23.4"
+ "@mui/utils" "^5.14.19"
prop-types "^15.8.1"
-"@mui/styled-engine@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.18.tgz#82d427bc975b85cecdbab2fd9353ed6c2df7eae1"
- integrity sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==
+"@mui/styled-engine@^5.14.19":
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.19.tgz#dee1d16044a5ef3a783b742381ea4348c159b013"
+ integrity sha512-jtj/Pyn/bS8PM7NXdFNTHWZfE3p+vItO4/HoQbUeAv3u+cnWXcTBGHHY/xdIn446lYGFDczTh1YyX8G4Ts0Rtg==
dependencies:
- "@babel/runtime" "^7.23.2"
+ "@babel/runtime" "^7.23.4"
"@emotion/cache" "^11.11.0"
csstype "^3.1.2"
prop-types "^15.8.1"
-"@mui/system@^5.14.18", "@mui/system@^5.14.4":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.18.tgz#0f671e8f0a5e8e965b79235d77c50098f54195b5"
- integrity sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==
+"@mui/system@^5.14.19", "@mui/system@^5.14.4":
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.19.tgz#f13387c60af129e4d61dfbf168fcee348ebe952a"
+ integrity sha512-4e3Q+2nx+vgEsd0h5ftxlZGB7XtkkPos/zWqCqnxUs1l/T70s0lF2YNrWHHdSQ7LgtBu0eQ0qweZG2pR7KwkAw==
dependencies:
- "@babel/runtime" "^7.23.2"
- "@mui/private-theming" "^5.14.18"
- "@mui/styled-engine" "^5.14.18"
- "@mui/types" "^7.2.9"
- "@mui/utils" "^5.14.18"
+ "@babel/runtime" "^7.23.4"
+ "@mui/private-theming" "^5.14.19"
+ "@mui/styled-engine" "^5.14.19"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.19"
clsx "^2.0.0"
csstype "^3.1.2"
prop-types "^15.8.1"
-"@mui/types@^7.2.9":
- version "7.2.9"
- resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.9.tgz#730ee83a37af292a5973962f78ce5c95f31213a7"
- integrity sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==
+"@mui/types@^7.2.10":
+ version "7.2.10"
+ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.10.tgz#13e3e9aa07ee6d593cfacd538e02e8e896d7a12f"
+ integrity sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==
-"@mui/utils@^5.14.16", "@mui/utils@^5.14.18":
- version "5.14.18"
- resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.18.tgz#d2a46df9b06230423ba6b6317748b27185a56ac3"
- integrity sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==
+"@mui/utils@^5.14.16", "@mui/utils@^5.14.19":
+ version "5.14.19"
+ resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.19.tgz#39a5846a74ba199f1a2b067ea197dc6b9c8f442f"
+ integrity sha512-qAHvTXzk7basbyqPvhgWqN6JbmI2wLB/mf97GkSlz5c76MiKYV6Ffjvw9BjKZQ1YRb8rDX9kgdjRezOcoB91oQ==
dependencies:
- "@babel/runtime" "^7.23.2"
- "@types/prop-types" "^15.7.10"
+ "@babel/runtime" "^7.23.4"
+ "@types/prop-types" "^15.7.11"
prop-types "^15.8.1"
react-is "^18.2.0"
@@ -4353,9 +4353,9 @@
"@types/estree" "*"
"@types/eslint@*":
- version "8.44.7"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5"
- integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==
+ version "8.44.8"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.8.tgz#f4fe1dab9b3d3dd98082d4b9f80e59ab40f1261c"
+ integrity sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
@@ -4479,9 +4479,9 @@
"@types/istanbul-lib-report" "*"
"@types/jest-image-snapshot@^6.1.0":
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/@types/jest-image-snapshot/-/jest-image-snapshot-6.2.3.tgz#feb86722e7d58a82a377ca634b9e0f37e4a7fc89"
- integrity sha512-Lf6JNr3R+KzxfoGlxrxrbRBMBAsVADa1khItphouPOHqz6tyXoX6CeYeWMVETzV8lupc9r2Hho6hchhZH7ZdJA==
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/@types/jest-image-snapshot/-/jest-image-snapshot-6.3.0.tgz#719dea56556db18bac8b7234595e315dcf6cc3e0"
+ integrity sha512-YZuZ1asbK3pK6+wzlhvs3vQ/FkvaWJfX7tTiha6TB5EOqPUSzYxheoodiCvOgIcX89NSlbJ4mMCKoVx6XMRVUA==
dependencies:
"@types/jest" "*"
"@types/pixelmatch" "*"
@@ -4594,9 +4594,9 @@
"@types/node" "*"
"@types/node@*":
- version "20.10.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617"
- integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==
+ version "20.10.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.1.tgz#d2c96f356c3125fedc983d74c424910c3767141c"
+ integrity sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==
dependencies:
undici-types "~5.26.4"
@@ -4611,9 +4611,9 @@
integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==
"@types/node@^18.0.0", "@types/node@^18.11.18":
- version "18.18.13"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.13.tgz#ae0f76c0bfe79d8fad0f910b78ae3e59b333c6e8"
- integrity sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g==
+ version "18.18.14"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.14.tgz#26771c647f2842af57eb96191cd615d845164295"
+ integrity sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ==
dependencies:
undici-types "~5.26.4"
@@ -4674,7 +4674,7 @@
resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#ee1bd8c9f7a01b3445786aad0ef23aba5f511a44"
integrity sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==
-"@types/prop-types@*", "@types/prop-types@^15.7.10":
+"@types/prop-types@*", "@types/prop-types@^15.7.11":
version "15.7.11"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563"
integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==
@@ -4701,7 +4701,7 @@
dependencies:
"@types/react" "*"
-"@types/react-transition-group@^4.4.8":
+"@types/react-transition-group@^4.4.9":
version "4.4.9"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.9.tgz#12a1a1b5b8791067198149867b0823fbace31579"
integrity sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==
@@ -5710,9 +5710,9 @@ available-typed-arrays@^1.0.5:
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
aws-sdk@^2.1231.0:
- version "2.1506.0"
- resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1506.0.tgz#24824619c322c3ef8c46a0c53b191598a37c0f93"
- integrity sha512-jSBbofvPa7HJykyM7Xph9psMcWPl6UgdiKjG2E7fHJb6psW+BZN9ZvSGOBvRIlT8Y6+JGzI0qkouS1OLK9slhg==
+ version "2.1508.0"
+ resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1508.0.tgz#ef88fd45e3cd4ac179aef073acb0a03e1218b0da"
+ integrity sha512-YiUzYqtPLIRwVkbWaA2dFSFaBLrtCUr3dE6gDJmadiH5NL2mNNZBOW+1JyFT33VOVdU8Pp8OWeNBEGCay9Psxg==
dependencies:
buffer "4.9.2"
events "1.1.1"
@@ -8307,9 +8307,9 @@ electron-publish@24.8.1:
mime "^2.5.2"
electron-to-chromium@^1.4.535:
- version "1.4.596"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.596.tgz#6752d1aa795d942d49dfc5d3764d6ea283fab1d7"
- integrity sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg==
+ version "1.4.597"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.597.tgz#9848b9aa52749bf35be88013bab52be232889d94"
+ integrity sha512-0XOQNqHhg2YgRVRUrS4M4vWjFCFIP2ETXcXe/0KIQBjXE9Cpy+tgzzYfuq6HGai3hWq0YywtG+5XK8fyG08EjA==
electron-updater@^6.1.1:
version "6.1.7"
@@ -9353,9 +9353,9 @@ flatted@^3.2.9:
integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
flow-parser@0.*:
- version "0.222.0"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.222.0.tgz#88decc0e35bc11c011af66dbc2f669589d69a6b2"
- integrity sha512-Fq5OkFlFRSMV2EOZW+4qUYMTE0uj8pcLsYJMxXYriSBDpHAF7Ofx3PibCTy3cs5P6vbsry7eYj7Z7xFD49GIOQ==
+ version "0.223.0"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.223.0.tgz#11cf53ff95e40aa5679e1da84831ec65812c50ef"
+ integrity sha512-POG49J/UuvwI43iP7XzW1EBQzJtkAVT1/HUwbMVtEhNK+AvymSQwBRX6khUhgzbFgfyrWgVYHhheqe1xTruBLg==
follow-redirects@^1.0.0, follow-redirects@^1.15.0:
version "1.15.3"
@@ -10394,9 +10394,9 @@ ignore-walk@^5.0.1:
minimatch "^5.0.1"
ignore-walk@^6.0.0:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb"
- integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9"
+ integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==
dependencies:
minimatch "^9.0.0"