jbrowse-plugin-msaview 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/utils/msa.js CHANGED
@@ -45,6 +45,21 @@ async function runKalign({ sequence, onProgress, }) {
45
45
  tree: await textfetch(`${base}/kalign/result/${jobId}/phylotree`),
46
46
  };
47
47
  }
48
+ async function runMafft({ sequence, onProgress, }) {
49
+ const jobId = await textfetch(`${base}/mafft/run`, {
50
+ method: 'POST',
51
+ body: new URLSearchParams({
52
+ email: 'colin.diesh@gmail.com',
53
+ stype: 'protein',
54
+ sequence,
55
+ }),
56
+ });
57
+ await wait({ jobId, algorithm: 'mafft', onProgress });
58
+ return {
59
+ msa: await textfetch(`${base}/mafft/result/${jobId}/fa`),
60
+ tree: await textfetch(`${base}/mafft/result/${jobId}/phylotree`),
61
+ };
62
+ }
48
63
  async function wait({ onProgress, jobId, algorithm, }) {
49
64
  while (true) {
50
65
  for (let i = 0; i < 10; i++) {
@@ -59,17 +74,22 @@ async function wait({ onProgress, jobId, algorithm, }) {
59
74
  }
60
75
  export async function launchMSA({ algorithm, sequence, onProgress, }) {
61
76
  onProgress(`Launching ${algorithm} MSA...`);
62
- if (algorithm === 'clustalo') {
63
- return runClustalOmega({ sequence, onProgress });
64
- }
65
- else if (algorithm === 'muscle') {
66
- return runMuscle({ sequence, onProgress });
67
- }
68
- else if (algorithm === 'kalign') {
69
- return runKalign({ sequence, onProgress });
70
- }
71
- else {
72
- throw new Error('unknown algorithm');
77
+ switch (algorithm) {
78
+ case 'clustalo': {
79
+ return runClustalOmega({ sequence, onProgress });
80
+ }
81
+ case 'muscle': {
82
+ return runMuscle({ sequence, onProgress });
83
+ }
84
+ case 'kalign': {
85
+ return runKalign({ sequence, onProgress });
86
+ }
87
+ case 'mafft': {
88
+ return runMafft({ sequence, onProgress });
89
+ }
90
+ default: {
91
+ throw new Error('unknown algorithm');
92
+ }
73
93
  }
74
94
  }
75
95
  //# sourceMappingURL=msa.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"msa.js","sourceRoot":"","sources":["../../src/utils/msa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"msa.js","sourceRoot":"","sources":["../../src/utils/msa.ts"],"names":[],"mappings":"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"}
@@ -32,8 +32,8 @@ async function initialQuery({ query, blastProgram, blastDatabase, }) {
32
32
  // the initial submission/query to the BLAST "REST API" does not return JSON
33
33
  // as a response (e.g. FORMAT_TYPE=JSON does not work), so the RID is
34
34
  // literally parsed from the text of the HTML that is returned
35
- const rid = res.match(/^ RID = (.*$)/m)?.[1];
36
- const rtoe = res.match(/^ RTOE = (.*$)/m)?.[1];
35
+ const rid = /^ RID = (.*$)/m.exec(res)?.[1];
36
+ const rtoe = /^ RTOE = (.*$)/m.exec(res)?.[1];
37
37
  if (!rid) {
38
38
  throw new Error('Failed to get RID from BLAST request');
39
39
  }
@@ -47,14 +47,14 @@ async function waitForRid({ rid, onProgress, }) {
47
47
  onProgress(`Re-checking BLAST status in... ${iter - i}`);
48
48
  }
49
49
  const res = await textfetch(`${BLAST_URL}?CMD=Get&FORMAT_OBJECT=SearchInfo&RID=${rid}`);
50
- if (res.match(/\s+Status=WAITING/m)) {
50
+ if (/\s+Status=WAITING/m.test(res)) {
51
51
  continue;
52
52
  }
53
- else if (res.match(/\s+Status=FAILED/m)) {
53
+ else if (/\s+Status=FAILED/m.test(res)) {
54
54
  throw new Error(`BLAST ${rid} failed; please report to blast-help@ncbi.nlm.nih.gov`);
55
55
  }
56
- else if (res.match(/\s+Status=READY/m)) {
57
- if (res.match(/\s+ThereAreHits=yes/m)) {
56
+ else if (/\s+Status=READY/m.test(res)) {
57
+ if (/\s+ThereAreHits=yes/m.test(res)) {
58
58
  return true;
59
59
  }
60
60
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"ncbiBlast.js","sourceRoot":"","sources":["../../src/utils/ncbiBlast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ncbiBlast.js","sourceRoot":"","sources":["../../src/utils/ncbiBlast.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.1",
2
+ "version": "2.0.3",
3
3
  "license": "MIT",
4
4
  "name": "jbrowse-plugin-msaview",
5
5
  "keywords": [
@@ -52,14 +52,15 @@
52
52
  "@types/node": "^20.8.6",
53
53
  "@types/pako": "^2.0.1",
54
54
  "@types/react": "^18.2.28",
55
- "@typescript-eslint/eslint-plugin": "^7.0.1",
56
- "@typescript-eslint/parser": "^7.0.1",
55
+ "@typescript-eslint/eslint-plugin": "^8.0.1",
56
+ "@typescript-eslint/parser": "^8.0.1",
57
57
  "esbuild": "^0.23.0",
58
58
  "eslint": "^9.0.0",
59
59
  "eslint-config-prettier": "^9.1.0",
60
60
  "eslint-plugin-prettier": "^5.1.0",
61
61
  "eslint-plugin-react": "^7.20.3",
62
62
  "eslint-plugin-react-hooks": "^4.6.0",
63
+ "eslint-plugin-unicorn": "^55.0.0",
63
64
  "mobx": "^6.10.2",
64
65
  "mobx-react": "^9.0.1",
65
66
  "mobx-state-tree": "^5.3.0",
@@ -67,7 +68,7 @@
67
68
  "pretty-bytes": "^6.1.1",
68
69
  "react": "^18.2.0",
69
70
  "react-dom": "^18.2.0",
70
- "rimraf": "^5.0.5",
71
+ "rimraf": "^6.0.0",
71
72
  "rxjs": "^7.8.1",
72
73
  "tss-react": "^4.9.2",
73
74
  "typescript": "^5.2.2"
@@ -110,9 +110,9 @@ const NcbiBlastPanel = observer(function NcbiBlastPanel2({
110
110
  maxRows={10}
111
111
  fullWidth
112
112
  value={
113
- !proteinSequence
114
- ? 'Loading...'
115
- : `>${getTranscriptDisplayName(selectedTranscript)}\n${proteinSequence}`
113
+ proteinSequence
114
+ ? `>${getTranscriptDisplayName(selectedTranscript)}\n${proteinSequence}`
115
+ : 'Loading...'
116
116
  }
117
117
  InputProps={{
118
118
  readOnly: true,
@@ -1,2 +1 @@
1
- import NcbiBlastPanel from './NcbiBlastPanel'
2
- export default NcbiBlastPanel
1
+ export { default } from './NcbiBlastPanel'
@@ -23,6 +23,7 @@ import {
23
23
  getTranscriptDisplayName,
24
24
  getId,
25
25
  getTranscriptFeatures,
26
+ getGeneDisplayName,
26
27
  } from '../../util'
27
28
  import { fetchGeneList } from './fetchGeneList'
28
29
  import { preCalculatedLaunchView } from './preCalculatedLaunchView'
@@ -120,7 +121,7 @@ const PreLoadedMSA = observer(function PreLoadedMSA2({
120
121
  await preCalculatedLaunchView({
121
122
  userSelection,
122
123
  session,
123
- newViewTitle: '',
124
+ newViewTitle: getGeneDisplayName(ret),
124
125
  view,
125
126
  feature: ret,
126
127
  })
@@ -1,7 +1,7 @@
1
1
  import { Instance, addDisposer, cast, types } from 'mobx-state-tree'
2
2
  import { autorun } from 'mobx'
3
3
  import { MSAModelF } from 'react-msaview'
4
- import { Feature, getSession, notEmpty } from '@jbrowse/core/util'
4
+ import { Feature, getSession } from '@jbrowse/core/util'
5
5
  import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
6
6
  import { BaseViewModel } from '@jbrowse/core/pluggableElementTypes'
7
7
 
@@ -101,7 +101,6 @@ export default function stateModelFactory() {
101
101
  * #getter
102
102
  */
103
103
  get transcriptToMsaMap() {
104
- console.log(self.connectedFeature)
105
104
  return self.connectedFeature
106
105
  ? genomeToTranscriptSeqMapping(self.connectedFeature)
107
106
  : undefined
@@ -226,13 +225,20 @@ export default function stateModelFactory() {
226
225
  self,
227
226
  autorun(async () => {
228
227
  if (self.blastParams) {
229
- self.setProgress('Submitting query')
230
- const data = await doLaunchBlast({
231
- self: self as JBrowsePluginMsaViewModel,
232
- })
233
- self.setData(data)
234
- self.setBlastParams(undefined)
235
- self.setProgress('')
228
+ try {
229
+ self.setProgress('Submitting query')
230
+ const data = await doLaunchBlast({
231
+ self: self as JBrowsePluginMsaViewModel,
232
+ })
233
+ self.setData(data)
234
+ self.setBlastParams(undefined)
235
+ self.setProgress('')
236
+ } catch (e) {
237
+ self.setError(e)
238
+ console.error(e)
239
+ } finally {
240
+ self.setProgress('')
241
+ }
236
242
  }
237
243
  }),
238
244
  )
@@ -243,14 +249,14 @@ export default function stateModelFactory() {
243
249
  autorun(() => {
244
250
  const { mouseCol, mouseClickCol } = self
245
251
  const r1 =
246
- mouseCol !== undefined
247
- ? msaCoordToGenomeCoord({ model: self, coord: mouseCol })
248
- : undefined
252
+ mouseCol === undefined
253
+ ? undefined
254
+ : msaCoordToGenomeCoord({ model: self, coord: mouseCol })
249
255
  const r2 =
250
- mouseClickCol !== undefined
251
- ? msaCoordToGenomeCoord({ model: self, coord: mouseClickCol })
252
- : undefined
253
- self.setConnectedHighlights([r1, r2].filter(notEmpty))
256
+ mouseClickCol === undefined
257
+ ? undefined
258
+ : msaCoordToGenomeCoord({ model: self, coord: mouseClickCol })
259
+ self.setConnectedHighlights([r1, r2].filter(f => !!f))
254
260
  }),
255
261
  )
256
262
 
@@ -261,9 +267,9 @@ export default function stateModelFactory() {
261
267
  const { connectedView, zoomToBaseLevel, mouseClickCol } = self
262
268
  const { assemblyManager } = getSession(self)
263
269
  const r2 =
264
- mouseClickCol !== undefined
265
- ? msaCoordToGenomeCoord({ model: self, coord: mouseClickCol })
266
- : undefined
270
+ mouseClickCol === undefined
271
+ ? undefined
272
+ : msaCoordToGenomeCoord({ model: self, coord: mouseClickCol })
267
273
 
268
274
  if (!r2 || !connectedView) {
269
275
  return
package/src/utils/msa.ts CHANGED
@@ -67,6 +67,28 @@ async function runKalign({
67
67
  tree: await textfetch(`${base}/kalign/result/${jobId}/phylotree`),
68
68
  }
69
69
  }
70
+
71
+ async function runMafft({
72
+ sequence,
73
+ onProgress,
74
+ }: {
75
+ sequence: string
76
+ onProgress: (arg: string) => void
77
+ }) {
78
+ const jobId = await textfetch(`${base}/mafft/run`, {
79
+ method: 'POST',
80
+ body: new URLSearchParams({
81
+ email: 'colin.diesh@gmail.com',
82
+ stype: 'protein',
83
+ sequence,
84
+ }),
85
+ })
86
+ await wait({ jobId, algorithm: 'mafft', onProgress })
87
+ return {
88
+ msa: await textfetch(`${base}/mafft/result/${jobId}/fa`),
89
+ tree: await textfetch(`${base}/mafft/result/${jobId}/phylotree`),
90
+ }
91
+ }
70
92
  async function wait({
71
93
  onProgress,
72
94
  jobId,
@@ -99,13 +121,21 @@ export async function launchMSA({
99
121
  onProgress: (arg: string) => void
100
122
  }) {
101
123
  onProgress(`Launching ${algorithm} MSA...`)
102
- if (algorithm === 'clustalo') {
103
- return runClustalOmega({ sequence, onProgress })
104
- } else if (algorithm === 'muscle') {
105
- return runMuscle({ sequence, onProgress })
106
- } else if (algorithm === 'kalign') {
107
- return runKalign({ sequence, onProgress })
108
- } else {
109
- throw new Error('unknown algorithm')
124
+ switch (algorithm) {
125
+ case 'clustalo': {
126
+ return runClustalOmega({ sequence, onProgress })
127
+ }
128
+ case 'muscle': {
129
+ return runMuscle({ sequence, onProgress })
130
+ }
131
+ case 'kalign': {
132
+ return runKalign({ sequence, onProgress })
133
+ }
134
+ case 'mafft': {
135
+ return runMafft({ sequence, onProgress })
136
+ }
137
+ default: {
138
+ throw new Error('unknown algorithm')
139
+ }
110
140
  }
111
141
  }
@@ -62,8 +62,8 @@ async function initialQuery({
62
62
  // the initial submission/query to the BLAST "REST API" does not return JSON
63
63
  // as a response (e.g. FORMAT_TYPE=JSON does not work), so the RID is
64
64
  // literally parsed from the text of the HTML that is returned
65
- const rid = res.match(/^ RID = (.*$)/m)?.[1]
66
- const rtoe = res.match(/^ RTOE = (.*$)/m)?.[1]
65
+ const rid = /^ RID = (.*$)/m.exec(res)?.[1]
66
+ const rtoe = /^ RTOE = (.*$)/m.exec(res)?.[1]
67
67
 
68
68
  if (!rid) {
69
69
  throw new Error('Failed to get RID from BLAST request')
@@ -88,14 +88,14 @@ async function waitForRid({
88
88
  const res = await textfetch(
89
89
  `${BLAST_URL}?CMD=Get&FORMAT_OBJECT=SearchInfo&RID=${rid}`,
90
90
  )
91
- if (res.match(/\s+Status=WAITING/m)) {
91
+ if (/\s+Status=WAITING/m.test(res)) {
92
92
  continue
93
- } else if (res.match(/\s+Status=FAILED/m)) {
93
+ } else if (/\s+Status=FAILED/m.test(res)) {
94
94
  throw new Error(
95
95
  `BLAST ${rid} failed; please report to blast-help@ncbi.nlm.nih.gov`,
96
96
  )
97
- } else if (res.match(/\s+Status=READY/m)) {
98
- if (res.match(/\s+ThereAreHits=yes/m)) {
97
+ } else if (/\s+Status=READY/m.test(res)) {
98
+ if (/\s+ThereAreHits=yes/m.test(res)) {
99
99
  return true
100
100
  } else {
101
101
  throw new Error('No hits found')