jbrowse-plugin-msaview 5.3.0 → 5.4.0
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/MsaViewPanel/model.d.ts +24 -22
- package/dist/MsaViewPanel/model.js +7 -0
- package/dist/MsaViewPanel/model.test.js +3 -0
- package/dist/chunks/{AboutDialog-447TIFAW.js → AboutDialog-HCCCEJ6V.js} +2 -2
- package/dist/chunks/{AboutDialog-447TIFAW.js.map → AboutDialog-HCCCEJ6V.js.map} +1 -1
- package/dist/chunks/AnnotationFileDialog-CPJ4X7XW.js +2 -0
- package/dist/chunks/{AnnotationFileDialog-S3N5EHHE.js.map → AnnotationFileDialog-CPJ4X7XW.js.map} +2 -2
- package/dist/chunks/{ExportSVGDialog-7ZHKKQ7W.js → ExportSVGDialog-YUFLYBYW.js} +2 -2
- package/dist/chunks/{ExportSVGDialog-7ZHKKQ7W.js.map → ExportSVGDialog-YUFLYBYW.js.map} +1 -1
- package/dist/chunks/{FeatureDialog-EEOGSLOG.js → FeatureDialog-NBDB5SWU.js} +1 -1
- package/dist/chunks/{FeatureDialog-EEOGSLOG.js.map → FeatureDialog-NBDB5SWU.js.map} +1 -1
- package/dist/chunks/{HelpDialog-TCWNBZOV.js → HelpDialog-UCUYPCOI.js} +2 -2
- package/dist/chunks/{HelpDialog-TCWNBZOV.js.map → HelpDialog-UCUYPCOI.js.map} +1 -1
- package/dist/chunks/{LaunchMsaViewDialog-R6CNRASN.js → LaunchMsaViewDialog-HGL6P4E4.js} +2 -2
- package/dist/chunks/{LaunchMsaViewDialog-R6CNRASN.js.map → LaunchMsaViewDialog-HGL6P4E4.js.map} +2 -2
- package/dist/chunks/MetadataDialog-DSA3545E.js +2 -0
- package/dist/chunks/{MetadataDialog-MNSI6NEW.js.map → MetadataDialog-DSA3545E.js.map} +2 -2
- package/dist/chunks/MsaViewPanel-XSXFJWWY.js +2 -0
- package/dist/chunks/{MsaViewPanel-R2WAER5O.js.map → MsaViewPanel-XSXFJWWY.js.map} +1 -1
- package/dist/chunks/{TrackInfoDialog-W2F77IPG.js → TrackInfoDialog-YXCIGFYM.js} +2 -2
- package/dist/chunks/{TrackInfoDialog-W2F77IPG.js.map → TrackInfoDialog-YXCIGFYM.js.map} +1 -1
- package/dist/chunks/TreeNodeInfoDialog-QCWDJTM4.js +2 -0
- package/dist/chunks/{TreeNodeInfoDialog-T5XMPG3R.js.map → TreeNodeInfoDialog-QCWDJTM4.js.map} +2 -2
- package/dist/chunks/{chunk-BAM67QHH.js → chunk-2XCUSA22.js} +2 -2
- package/dist/chunks/{chunk-JF6CW6MO.js → chunk-35FWLG3N.js} +1 -1
- package/dist/chunks/{chunk-JF6CW6MO.js.map → chunk-35FWLG3N.js.map} +1 -1
- package/dist/chunks/{chunk-NWHZOZMG.js → chunk-5OSSOQH4.js} +1 -1
- package/dist/chunks/{chunk-NWHZOZMG.js.map → chunk-5OSSOQH4.js.map} +1 -1
- package/dist/chunks/{chunk-FEUZKN5V.js → chunk-666BV764.js} +2 -2
- package/dist/chunks/{chunk-FEUZKN5V.js.map → chunk-666BV764.js.map} +1 -1
- package/dist/chunks/{chunk-YUKJI2AH.js → chunk-AQ2THRTR.js} +2 -2
- package/dist/chunks/{chunk-YUKJI2AH.js.map → chunk-AQ2THRTR.js.map} +1 -1
- package/dist/chunks/{chunk-L6CBIH6H.js → chunk-ASUKJX5J.js} +2 -2
- package/dist/chunks/{chunk-L6CBIH6H.js.map → chunk-ASUKJX5J.js.map} +1 -1
- package/dist/chunks/chunk-F726IWCW.js +2 -0
- package/dist/chunks/chunk-F726IWCW.js.map +7 -0
- package/dist/chunks/{chunk-CSCUNTGJ.js → chunk-FFHB7WP7.js} +4 -4
- package/dist/chunks/chunk-FFHB7WP7.js.map +7 -0
- package/dist/chunks/{chunk-ERCMNTEQ.js → chunk-GAY2PLS6.js} +1 -1
- package/dist/chunks/{chunk-ERCMNTEQ.js.map → chunk-GAY2PLS6.js.map} +1 -1
- package/dist/chunks/{chunk-TSHN6J7U.js → chunk-JDQUBCHM.js} +1 -1
- package/dist/chunks/{chunk-TSHN6J7U.js.map → chunk-JDQUBCHM.js.map} +1 -1
- package/dist/chunks/{chunk-IBBQUV2I.js → chunk-KSCGTF4R.js} +1 -1
- package/dist/chunks/{chunk-IBBQUV2I.js.map → chunk-KSCGTF4R.js.map} +1 -1
- package/dist/chunks/{chunk-6YFCSBEE.js → chunk-NLAW2OYS.js} +2 -2
- package/dist/chunks/{chunk-6YFCSBEE.js.map → chunk-NLAW2OYS.js.map} +1 -1
- package/dist/chunks/chunk-QQKPT6EL.js +2 -0
- package/dist/chunks/{chunk-XVNCZQMR.js.map → chunk-QQKPT6EL.js.map} +1 -1
- package/dist/chunks/{chunk-WAPIOD25.js → chunk-WMDOEOAH.js} +5 -5
- package/dist/chunks/{chunk-WAPIOD25.js.map → chunk-WMDOEOAH.js.map} +1 -1
- package/dist/chunks/chunk-XTQQNBQ5.js +2 -0
- package/dist/chunks/{chunk-6EOYBBT4.js.map → chunk-XTQQNBQ5.js.map} +1 -1
- package/dist/chunks/chunk-XXCNVFGP.js +11 -0
- package/dist/chunks/chunk-XXCNVFGP.js.map +7 -0
- package/dist/chunks/{chunk-OVAXNTPN.js → chunk-ZQSWX57C.js} +1 -1
- package/dist/chunks/{chunk-OVAXNTPN.js.map → chunk-ZQSWX57C.js.map} +1 -1
- package/dist/chunks/dist-GZKCGB2N.js +2 -0
- package/dist/chunks/{model-TCPB6WNJ.js → model-36HCIOZJ.js} +3 -3
- package/dist/chunks/model-36HCIOZJ.js.map +7 -0
- package/dist/chunks/{renderToSvg-53FEV6IJ.js → renderToSvg-5DMIQ72S.js} +2 -2
- package/dist/jbrowse-plugin-msaview.esm.js +2 -2
- package/dist/jbrowse-plugin-msaview.esm.js.map +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +17 -17
- package/src/MsaViewPanel/model.test.ts +4 -0
- package/src/MsaViewPanel/model.ts +8 -0
- package/src/version.ts +1 -1
- package/dist/chunks/AnnotationFileDialog-S3N5EHHE.js +0 -2
- package/dist/chunks/MetadataDialog-MNSI6NEW.js +0 -2
- package/dist/chunks/MsaViewPanel-R2WAER5O.js +0 -2
- package/dist/chunks/TreeNodeInfoDialog-T5XMPG3R.js +0 -2
- package/dist/chunks/chunk-6EOYBBT4.js +0 -2
- package/dist/chunks/chunk-A63PUWQZ.js +0 -6
- package/dist/chunks/chunk-A63PUWQZ.js.map +0 -7
- package/dist/chunks/chunk-CSCUNTGJ.js.map +0 -7
- package/dist/chunks/chunk-DEFUNIWW.js +0 -8
- package/dist/chunks/chunk-DEFUNIWW.js.map +0 -7
- package/dist/chunks/chunk-K55ZVN73.js +0 -5
- package/dist/chunks/chunk-K55ZVN73.js.map +0 -7
- package/dist/chunks/chunk-XVNCZQMR.js +0 -2
- package/dist/chunks/dist-N4ZJK63Q.js +0 -2
- package/dist/chunks/model-TCPB6WNJ.js.map +0 -7
- /package/dist/chunks/{chunk-BAM67QHH.js.map → chunk-2XCUSA22.js.map} +0 -0
- /package/dist/chunks/{dist-N4ZJK63Q.js.map → dist-GZKCGB2N.js.map} +0 -0
- /package/dist/chunks/{renderToSvg-53FEV6IJ.js.map → renderToSvg-5DMIQ72S.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as S}from"./chunk-J6KYLXRD.js";import{b as x}from"./chunk-FY3BTKY4.js";function A(t){try{return new URL(t).host}catch{return t}}var p=class extends Error{constructor(r,o){super(r);this.status=o}};async function b(t,e){let r;try{r=await fetch(t,e)}catch(o){throw o instanceof TypeError?new Error(`Could not reach ${A(t)} \u2014 the request failed at the network level. This is usually a CORS restriction (the server refused to let this site read the response), an offline connection, or a blocked request.`,{cause:o}):o}if(!r.ok)throw new p(`HTTP ${r.status} fetching ${t} ${(await r.text()).slice(0,500)}`,r.status);return r}async function c(t,e){return(await b(t,e)).text()}async function v(t,e){return(await b(t,e)).json()}function l(t,e){return new Promise((r,o)=>{if(e?.aborted){o(new DOMException("Aborted","AbortError"));return}let s=()=>{clearTimeout(n),o(new DOMException("Aborted","AbortError"))},n=setTimeout(()=>{e?.removeEventListener("abort",s),r()},t);e?.addEventListener("abort",s,{once:!0})})}function h(t){return t instanceof Error&&t.name==="AbortError"}var f=x(S());function u(t,e){try{let r=globalThis.localStorage.getItem(t);return r===null?e:JSON.parse(r)}catch(r){return console.error(r),e}}function O(t,e){let[r,o]=(0,f.useState)(()=>u(t,e));return[r,n=>{o(n);try{globalThis.localStorage.setItem(t,JSON.stringify(n))}catch(a){console.error(a)}}]}async function d({check:t,intervalSeconds:e,onCountdown:r,signal:o}){for(;;){if(o?.throwIfAborted(),await t())return;for(let s=e;s>0;s--)r(s),await l(1e3,o)}}var m="https://www.ebi.ac.uk/Tools/services/rest",y="msa-ebiContactEmail",g="jbrowse2@berkeley.edu";function T(){return u(y,g).trim()||g}var B=new Set(["ERROR","FAILURE","NOT_FOUND"]);async function I({tool:t,params:e,signal:r}){return(await c(`${m}/${t}/run`,{method:"POST",body:new URLSearchParams({email:T(),...e}),signal:r})).trim()}var w=900*1e3;async function P({tool:t,jobId:e,intervalSeconds:r=10,onCountdown:o,signal:s}){let n;await d({intervalSeconds:r,onCountdown:o,signal:s,check:async()=>{let a;try{a=(await c(`${m}/${t}/status/${e}`,{signal:s})).trim()}catch(i){if(h(i))throw i;if(n??=Date.now(),Date.now()-n>=w)throw new Error(`Could not reach EBI to check ${t} job ${e} for ${Math.round(w/6e4)} minutes`,{cause:i});return console.warn("[msaview] EBI status check failed, retrying:",i),!1}if(n=void 0,a==="FINISHED")return!0;if(B.has(a))throw new Error(`EBI ${t} job ${e} returned status ${a}`);return!1}})}async function H({tool:t,label:e,params:r,onProgress:o,onRid:s,signal:n}){o(`Submitting ${e} to EBI...`);let a=await I({tool:t,params:r,signal:n});return s?.(a),await P({tool:t,jobId:a,signal:n,onCountdown:i=>{o(`Re-checking ${e} status in... ${i}`)}}),{jobId:a,result:i=>c(`${m}/${t}/result/${a}/${i}`,{signal:n})}}var N="https://blast.ncbi.nlm.nih.gov/Blast.cgi",R=["clustalo","muscle","kalign","mafft"],V=[...R,"browser"],G={clustalo:"Clustal Omega (EBI)",muscle:"MUSCLE (EBI)",kalign:"Kalign (EBI)",mafft:"MAFFT (EBI)",browser:"in browser, query-anchored"},D=["uniprotkb_swissprot","uniprotkb","pan_proteomes","uniprotkb_trembl"],L="uniprotkb_swissprot",Y=["blastp","phmmer"],z={blastp:"blastp (sequence search)",phmmer:"phmmer (profile HMM search)"},$=["swissprot","uniprotkb","uniprotrefprot","rp75","rp55","rp35","rp15"],_="swissprot",E=[5,10,20,50,100,150,200,250,500,750,1e3],Q=100;function W(t){return E.find(e=>e>=t)??E.at(-1)}function X(t){return t==="phmmer"?{program:t,database:_}:{program:t,database:L}}function Z(t){return t==="phmmer"?$:D}var k={uniprotkb_swissprot:"UniProtKB/Swiss-Prot (curated)",swissprot:"UniProtKB/Swiss-Prot (curated)",uniprotkb:"UniProtKB (all entries)",uniprotkb_trembl:"UniProtKB/TrEMBL (unreviewed)",pan_proteomes:"Pan-proteomes",uniprotrefprot:"UniProt reference proteomes",rp75:"Representative proteomes, 75%",rp55:"Representative proteomes, 55%",rp35:"Representative proteomes, 35%",rp15:"Representative proteomes, 15% (widest spread)"};function tt(t){return k[t]}export{p as a,b,c,v as d,l as e,h as f,O as g,y as h,g as i,H as j,N as k,V as l,G as m,Y as n,z as o,Q as p,W as q,X as r,Z as s,tt as t};
|
|
2
|
+
//# sourceMappingURL=chunk-F726IWCW.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/fetch.ts", "../../src/utils/useLocalStorage.ts", "../../src/utils/poll.ts", "../../src/utils/ebiJobDispatcher.ts", "../../src/LaunchMsaView/components/BlastQuery/consts.ts"],
|
|
4
|
+
"sourcesContent": ["function hostOf(url: string) {\n try {\n return new URL(url).host\n } catch {\n // a relative url, e.g. a same-origin proxy path\n return url\n }\n}\n\nexport class HttpError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message)\n }\n}\n\nexport async function handleFetch(url: string, args?: RequestInit) {\n let response: Response\n try {\n response = await fetch(url, args)\n } catch (e) {\n // fetch rejects with a bare \"TypeError: Failed to fetch\" for every network\n // level failure, including a cross-origin response the browser refused to\n // hand over. That is not a hypothetical: NCBI's Blast.cgi stopped sending\n // Access-Control-Allow-Origin to third-party origins, and the raw TypeError\n // told users nothing at all about why. See docs/blast.md.\n if (e instanceof TypeError) {\n throw new Error(\n `Could not reach ${hostOf(url)} \u2014 the request failed at the network level. This is usually a CORS restriction (the server refused to let this site read the response), an offline connection, or a blocked request.`,\n { cause: e },\n )\n }\n throw e\n }\n\n if (!response.ok) {\n throw new HttpError(\n `HTTP ${response.status} fetching ${url} ${(await response.text()).slice(0, 500)}`,\n response.status,\n )\n }\n\n return response\n}\n\nexport async function textfetch(url: string, args?: RequestInit) {\n const response = await handleFetch(url, args)\n return response.text()\n}\n\nexport async function jsonfetch<T>(url: string, args?: RequestInit) {\n const response = await handleFetch(url, args)\n return response.json() as Promise<T>\n}\n\nexport function timeout(time: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'))\n return\n }\n // the listener is removed on the natural path too: one signal serves every\n // tick of a poll, and a 10-minute job is ~600 sleeps -- leaving each\n // listener behind accumulates them all on that one signal\n const onAbort = () => {\n clearTimeout(id)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n const id = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort)\n resolve()\n }, time)\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\n/**\n * A cancelled launch has to be told apart from a failed one: it must not render\n * the \"failed\" panel, and it must not touch a model that may already be gone.\n * `fetch` and the sleep above both reject with a DOMException named AbortError,\n * which subclasses Error.\n */\nexport function isAbortError(e: unknown) {\n return e instanceof Error && e.name === 'AbortError'\n}\n", "import { useState } from 'react'\n\n// Vendored rather than imported from `@jbrowse/core/util`: that barrel is\n// host-provided, and a barrel split dropped this export, making the BLAST panel\n// throw \"(0, PR.useLocalStorage) is not a function\" on hosts built during that\n// window. Same failure mode as `defaultCodonTable`; keeping our own copy takes\n// this plugin out of the whack-a-mole.\nexport function readLocalStorage<T>(key: string, initialValue: T): T {\n try {\n const item = globalThis.localStorage.getItem(key)\n return item === null ? initialValue : (JSON.parse(item) as T)\n } catch (error) {\n console.error(error)\n return initialValue\n }\n}\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n const [storedValue, setStoredValue] = useState<T>(() =>\n readLocalStorage(key, initialValue),\n )\n const setValue = (value: T) => {\n setStoredValue(value)\n try {\n globalThis.localStorage.setItem(key, JSON.stringify(value))\n } catch (error) {\n console.error(error)\n }\n }\n return [storedValue, setValue] as const\n}\n", "import { timeout } from './fetch'\n\n/**\n * Poll a remote job until it reports done. `check` returns true when finished,\n * false when still pending, and throws on failure. Between checks it counts down\n * `intervalSeconds`, calling `onCountdown` each second so the UI can show\n * progress.\n *\n * `signal` ends the loop with an AbortError: the countdown rejects on the tick\n * it is aborted rather than at the end of the interval, so a cancelled launch\n * stops within a second instead of running for the job's lifetime.\n */\nexport async function pollLoop({\n check,\n intervalSeconds,\n onCountdown,\n signal,\n}: {\n check: () => Promise<boolean>\n intervalSeconds: number\n onCountdown: (secondsRemaining: number) => void\n signal?: AbortSignal\n}) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n signal?.throwIfAborted()\n if (await check()) {\n return\n }\n for (let i = intervalSeconds; i > 0; i--) {\n onCountdown(i)\n await timeout(1000, signal)\n }\n }\n}\n", "import { isAbortError, textfetch } from './fetch'\nimport { pollLoop } from './poll'\nimport { readLocalStorage } from './useLocalStorage'\n\n/**\n * EBI's Job Dispatcher REST services (clustalo, muscle, ncbiblast, ...) all\n * speak the same run/status/result protocol, so the transport lives here and\n * each tool only supplies its own parameters and result types.\n *\n * Unlike NCBI's Blast.cgi these endpoints send `Access-Control-Allow-Origin: *`,\n * which is why the BLAST backend moved here \u2014 see docs/blast.md.\n */\nexport const EBI_BASE = 'https://www.ebi.ac.uk/Tools/services/rest'\n\n/**\n * EBI asks for a contact address on every submission so they can reach whoever\n * is generating the load. The default is the project's mailbox; a deployment\n * that sends real volume should name its own maintainer in the BLAST settings\n * dialog.\n */\nexport const EBI_EMAIL_STORAGE_KEY = 'msa-ebiContactEmail'\nexport const DEFAULT_EBI_EMAIL = 'jbrowse2@berkeley.edu'\n\nexport function getEbiEmail() {\n const configured = readLocalStorage(\n EBI_EMAIL_STORAGE_KEY,\n DEFAULT_EBI_EMAIL,\n ).trim()\n return configured || DEFAULT_EBI_EMAIL\n}\n\n/** Statuses that mean the job is over and produced no result. */\nconst FAILED_STATUSES = new Set(['ERROR', 'FAILURE', 'NOT_FOUND'])\n\nasync function submitEbiJob({\n tool,\n params,\n signal,\n}: {\n tool: string\n params: Record<string, string>\n signal?: AbortSignal\n}) {\n const jobId = await textfetch(`${EBI_BASE}/${tool}/run`, {\n method: 'POST',\n body: new URLSearchParams({ email: getEbiEmail(), ...params }),\n signal,\n })\n return jobId.trim()\n}\n\n/**\n * A status check that could not reach EBI at all says nothing about the job, so\n * it is not a reason to abandon one. A job the server has accepted keeps running\n * whatever happens to the poller's connection, and EBI's cluster has answered\n * status checks with a 502 for ten minutes on jobs that then finished (see\n * docs/blast.md).\n *\n * So the poll gives up only once checks have failed without a break for this\n * long: an endpoint that has genuinely gone away must not be polled forever.\n */\nexport const STATUS_FAILURE_BUDGET_MS = 15 * 60 * 1000\n\nexport async function waitForEbiJob({\n tool,\n jobId,\n intervalSeconds = 10,\n onCountdown,\n signal,\n}: {\n tool: string\n jobId: string\n intervalSeconds?: number\n onCountdown: (secondsRemaining: number) => void\n signal?: AbortSignal\n}) {\n let failingSince: number | undefined\n await pollLoop({\n intervalSeconds,\n onCountdown,\n signal,\n check: async () => {\n let status: string\n try {\n status = (\n await textfetch(`${EBI_BASE}/${tool}/status/${jobId}`, { signal })\n ).trim()\n } catch (e) {\n // a cancelled request is the caller giving up, not EBI being\n // unreachable, so it must end the poll rather than be retried\n if (isAbortError(e)) {\n throw e\n }\n failingSince ??= Date.now()\n if (Date.now() - failingSince >= STATUS_FAILURE_BUDGET_MS) {\n throw new Error(\n `Could not reach EBI to check ${tool} job ${jobId} for ${Math.round(STATUS_FAILURE_BUDGET_MS / 60_000)} minutes`,\n { cause: e },\n )\n }\n console.warn('[msaview] EBI status check failed, retrying:', e)\n return false\n }\n failingSince = undefined\n // exact match, not includes(): a job whose status is ERROR must not be\n // able to poll forever waiting for a FINISHED that will never arrive\n if (status === 'FINISHED') {\n return true\n }\n if (FAILED_STATUSES.has(status)) {\n throw new Error(`EBI ${tool} job ${jobId} returned status ${status}`)\n }\n // RUNNING, QUEUED, PENDING and anything else EBI adds later\n return false\n },\n })\n}\n\nexport async function runEbiJob({\n tool,\n label,\n params,\n onProgress,\n onRid,\n signal,\n}: {\n tool: string\n label: string\n params: Record<string, string>\n onProgress: (arg: string) => void\n onRid?: (jobId: string) => void\n signal?: AbortSignal\n}) {\n onProgress(`Submitting ${label} to EBI...`)\n const jobId = await submitEbiJob({ tool, params, signal })\n onRid?.(jobId)\n await waitForEbiJob({\n tool,\n jobId,\n signal,\n onCountdown: s => {\n onProgress(`Re-checking ${label} status in... ${s}`)\n },\n })\n return {\n jobId,\n result: (type: string) =>\n textfetch(`${EBI_BASE}/${tool}/result/${jobId}/${type}`, { signal }),\n }\n}\n", "/**\n * Only used to build the link-out on the manual panel, which sends the user to\n * NCBI's own site to run BLAST there. Nothing fetches this url: NCBI stopped\n * sending Access-Control-Allow-Origin to third-party origins, so a browser\n * cannot read a response from it at all. See docs/blast.md.\n */\nexport const BASE_BLAST_URL = 'https://blast.ncbi.nlm.nih.gov/Blast.cgi'\n\n/** The aligners EBI's Job Dispatcher runs, each a tool name at their REST api. */\nexport const ebiMsaAlgorithms = [\n 'clustalo',\n 'muscle',\n 'kalign',\n 'mafft',\n] as const\nexport type EbiMsaAlgorithm = (typeof ebiMsaAlgorithms)[number]\n\n/**\n * `browser` is no job at all: each sequence is aligned to the query in the\n * page and the rows merged on the query (utils/browserAlign.ts), with the tree\n * built by react-msaview's neighbour joining. It is the aligner for a launch\n * that must not depend on EBI, and for one that wants to be quick -- a\n * hundred 400-residue rows take under a second, and a hundred 1400-residue\n * rows eight, against a Job Dispatcher queue that has been measured at\n * anything from ten seconds to fifteen minutes. Past the per-sequence limit in\n * browserAlign.ts it refuses and names an EBI aligner instead.\n */\nexport const msaAlgorithms = [...ebiMsaAlgorithms, 'browser'] as const\nexport type MsaAlgorithm = (typeof msaAlgorithms)[number]\n\nexport const msaAlgorithmLabels: Record<MsaAlgorithm, string> = {\n clustalo: 'Clustal Omega (EBI)',\n muscle: 'MUSCLE (EBI)',\n kalign: 'Kalign (EBI)',\n mafft: 'MAFFT (EBI)',\n browser: 'in browser, query-anchored',\n}\n\n/**\n * EBI rejects a submission naming a database outside its own list with a 400,\n * so every value here has to appear in\n * https://www.ebi.ac.uk/Tools/services/rest/ncbiblast/parameterdetails/database\n * -- `uniprotkb_reference_proteomes` did not, and 3.0.0 shipped it as a dead\n * menu entry.\n */\nexport const blastDatabaseOptions = [\n 'uniprotkb_swissprot',\n 'uniprotkb',\n 'pan_proteomes',\n 'uniprotkb_trembl',\n] as const\nexport type BlastDatabase = (typeof blastDatabaseOptions)[number]\n\n// curated, so it returns roughly one good sequence per species rather than the\n// many near-identical TrEMBL entries an alignment reads poorly\nconst defaultBlastDatabase: BlastDatabase = 'uniprotkb_swissprot'\n\nexport const searchPrograms = ['blastp', 'phmmer'] as const\nexport type SearchProgram = (typeof searchPrograms)[number]\n\nexport const searchProgramLabels: Record<SearchProgram, string> = {\n blastp: 'blastp (sequence search)',\n phmmer: 'phmmer (profile HMM search)',\n}\n\n/**\n * phmmer offers PDB, AlphaFold, Ensembl Genomes, MEROPS and ChEMBL too, but\n * targets outside UniProt carry no species in their description, so those rows\n * would lose their species and common name. Only the databases that label their\n * hits are offered.\n *\n * rp15..rp75 are the Representative Proteomes: UniProt's reference proteomes\n * thinned so that no two are more than 15% (35%, 55%, 75%) similar, which is\n * the widest taxonomic spread per hit that any of these databases gives. rp15\n * is the one to reach for when the question is \"what is this like across all\n * of life\"; swissprot when it is \"what is this like in the curated set\".\n */\nexport const phmmerDatabaseOptions = [\n 'swissprot',\n 'uniprotkb',\n 'uniprotrefprot',\n 'rp75',\n 'rp55',\n 'rp35',\n 'rp15',\n] as const\nexport type PhmmerDatabase = (typeof phmmerDatabaseOptions)[number]\n\nconst defaultPhmmerDatabase: PhmmerDatabase = 'swissprot'\n\n/**\n * The hit counts EBI's ncbiblast accepts for `alignments` and `scores`. A value\n * off this list is a 400 at submit time, so a request is rounded up to the next\n * one on it.\n */\nconst blastHitCounts = [5, 10, 20, 50, 100, 150, 200, 250, 500, 750, 1000]\n\nexport const defaultMaxHits = 100\n\nexport function snapBlastHitCount(maxHits: number) {\n return blastHitCounts.find(n => n >= maxHits) ?? blastHitCounts.at(-1)!\n}\n\n/**\n * A program together with a database that program actually has.\n *\n * The pair travels as one value because neither service knows the other's\n * database names \u2014 `swissprot` is a phmmer database and `uniprotkb_swissprot` a\n * blastp one \u2014 so a program held apart from its database can drift into a\n * combination EBI answers with a 400, minutes after the user pressed Submit.\n */\nexport type SearchChoice =\n | { program: 'blastp'; database: BlastDatabase }\n | { program: 'phmmer'; database: PhmmerDatabase }\n\nexport function defaultSearchFor(program: SearchProgram): SearchChoice {\n return program === 'phmmer'\n ? { program, database: defaultPhmmerDatabase }\n : { program, database: defaultBlastDatabase }\n}\n\nexport function databaseOptionsFor(program: SearchProgram) {\n return program === 'phmmer' ? phmmerDatabaseOptions : blastDatabaseOptions\n}\n\n/**\n * What each database is called in the menu. The keys are what EBI is sent and\n * are not negotiable; `uniprotkb_swissprot` and `swissprot` are the same\n * collection under each service's own name, so they read the same here.\n */\nconst databaseLabels: Record<BlastDatabase | PhmmerDatabase, string> = {\n uniprotkb_swissprot: 'UniProtKB/Swiss-Prot (curated)',\n swissprot: 'UniProtKB/Swiss-Prot (curated)',\n uniprotkb: 'UniProtKB (all entries)',\n uniprotkb_trembl: 'UniProtKB/TrEMBL (unreviewed)',\n pan_proteomes: 'Pan-proteomes',\n uniprotrefprot: 'UniProt reference proteomes',\n rp75: 'Representative proteomes, 75%',\n rp55: 'Representative proteomes, 55%',\n rp35: 'Representative proteomes, 35%',\n rp15: 'Representative proteomes, 15% (widest spread)',\n}\n\nexport function databaseLabel(database: BlastDatabase | PhmmerDatabase) {\n return databaseLabels[database]\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["hostOf", "url", "HttpError", "message", "status", "handleFetch", "args", "response", "e", "textfetch", "jsonfetch", "timeout", "time", "signal", "resolve", "reject", "onAbort", "id", "isAbortError", "import_react", "readLocalStorage", "key", "initialValue", "item", "error", "useLocalStorage", "storedValue", "setStoredValue", "value", "pollLoop", "check", "intervalSeconds", "onCountdown", "signal", "i", "timeout", "EBI_BASE", "EBI_EMAIL_STORAGE_KEY", "DEFAULT_EBI_EMAIL", "getEbiEmail", "readLocalStorage", "FAILED_STATUSES", "submitEbiJob", "tool", "params", "signal", "textfetch", "STATUS_FAILURE_BUDGET_MS", "waitForEbiJob", "jobId", "intervalSeconds", "onCountdown", "failingSince", "pollLoop", "status", "e", "isAbortError", "runEbiJob", "label", "onProgress", "onRid", "s", "type", "BASE_BLAST_URL", "ebiMsaAlgorithms", "msaAlgorithms", "msaAlgorithmLabels", "blastDatabaseOptions", "defaultBlastDatabase", "searchPrograms", "searchProgramLabels", "phmmerDatabaseOptions", "defaultPhmmerDatabase", "blastHitCounts", "defaultMaxHits", "snapBlastHitCount", "maxHits", "n", "defaultSearchFor", "program", "databaseOptionsFor", "databaseLabels", "databaseLabel", "database"]
|
|
7
|
+
}
|