jbrowse-plugin-msaview 5.2.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.
Files changed (86) hide show
  1. package/dist/MsaViewPanel/model.d.ts +9 -11
  2. package/dist/MsaViewPanel/model.js +7 -0
  3. package/dist/MsaViewPanel/model.test.js +3 -0
  4. package/dist/chunks/AboutDialog-HCCCEJ6V.js +2 -0
  5. package/dist/chunks/{AboutDialog-IRBPUPJK.js.map → AboutDialog-HCCCEJ6V.js.map} +4 -4
  6. package/dist/chunks/AnnotationFileDialog-CPJ4X7XW.js +2 -0
  7. package/dist/chunks/AnnotationFileDialog-CPJ4X7XW.js.map +7 -0
  8. package/dist/chunks/ExportSVGDialog-YUFLYBYW.js +2 -0
  9. package/dist/chunks/ExportSVGDialog-YUFLYBYW.js.map +7 -0
  10. package/dist/chunks/{FeatureDialog-ZBX3XQZ5.js → FeatureDialog-NBDB5SWU.js} +1 -1
  11. package/dist/chunks/{FeatureDialog-ZBX3XQZ5.js.map → FeatureDialog-NBDB5SWU.js.map} +1 -1
  12. package/dist/chunks/HelpDialog-UCUYPCOI.js +2 -0
  13. package/dist/chunks/HelpDialog-UCUYPCOI.js.map +7 -0
  14. package/dist/chunks/{LaunchMsaViewDialog-GJAUPGFC.js → LaunchMsaViewDialog-HGL6P4E4.js} +2 -2
  15. package/dist/chunks/{LaunchMsaViewDialog-GJAUPGFC.js.map → LaunchMsaViewDialog-HGL6P4E4.js.map} +1 -1
  16. package/dist/chunks/{MetadataDialog-KZWQFRF7.js → MetadataDialog-DSA3545E.js} +2 -2
  17. package/dist/chunks/{MetadataDialog-KZWQFRF7.js.map → MetadataDialog-DSA3545E.js.map} +1 -1
  18. package/dist/chunks/MsaViewPanel-XSXFJWWY.js +2 -0
  19. package/dist/chunks/{MsaViewPanel-RUZAKFCB.js.map → MsaViewPanel-XSXFJWWY.js.map} +1 -1
  20. package/dist/chunks/{TrackInfoDialog-IFIG77WO.js → TrackInfoDialog-YXCIGFYM.js} +2 -2
  21. package/dist/chunks/{TrackInfoDialog-IFIG77WO.js.map → TrackInfoDialog-YXCIGFYM.js.map} +1 -1
  22. package/dist/chunks/{TreeNodeInfoDialog-VRCVIF26.js → TreeNodeInfoDialog-QCWDJTM4.js} +2 -2
  23. package/dist/chunks/{TreeNodeInfoDialog-VRCVIF26.js.map → TreeNodeInfoDialog-QCWDJTM4.js.map} +1 -1
  24. package/dist/chunks/{chunk-NI3VGKQP.js → chunk-2XCUSA22.js} +2 -2
  25. package/dist/chunks/{chunk-GIHMPOCO.js → chunk-35FWLG3N.js} +1 -1
  26. package/dist/chunks/{chunk-GIHMPOCO.js.map → chunk-35FWLG3N.js.map} +1 -1
  27. package/dist/chunks/{chunk-F3EC6OCO.js → chunk-5OSSOQH4.js} +1 -1
  28. package/dist/chunks/{chunk-F3EC6OCO.js.map → chunk-5OSSOQH4.js.map} +1 -1
  29. package/dist/chunks/{chunk-GDFVLZYX.js → chunk-666BV764.js} +2 -2
  30. package/dist/chunks/{chunk-GDFVLZYX.js.map → chunk-666BV764.js.map} +1 -1
  31. package/dist/chunks/{chunk-YUKJI2AH.js → chunk-AQ2THRTR.js} +2 -2
  32. package/dist/chunks/{chunk-YUKJI2AH.js.map → chunk-AQ2THRTR.js.map} +1 -1
  33. package/dist/chunks/chunk-ASUKJX5J.js +2 -0
  34. package/dist/chunks/chunk-ASUKJX5J.js.map +7 -0
  35. package/dist/chunks/chunk-FFHB7WP7.js +18 -0
  36. package/dist/chunks/chunk-FFHB7WP7.js.map +7 -0
  37. package/dist/chunks/{chunk-YOTSFJMU.js → chunk-GAY2PLS6.js} +1 -1
  38. package/dist/chunks/{chunk-YOTSFJMU.js.map → chunk-GAY2PLS6.js.map} +1 -1
  39. package/dist/chunks/chunk-JDQUBCHM.js +2 -0
  40. package/dist/chunks/chunk-JDQUBCHM.js.map +7 -0
  41. package/dist/chunks/{chunk-IBBQUV2I.js → chunk-KSCGTF4R.js} +1 -1
  42. package/dist/chunks/{chunk-IBBQUV2I.js.map → chunk-KSCGTF4R.js.map} +1 -1
  43. package/dist/chunks/{chunk-6YFCSBEE.js → chunk-NLAW2OYS.js} +2 -2
  44. package/dist/chunks/{chunk-6YFCSBEE.js.map → chunk-NLAW2OYS.js.map} +1 -1
  45. package/dist/chunks/{chunk-ZCT7RD24.js → chunk-QQKPT6EL.js} +2 -2
  46. package/dist/chunks/{chunk-H6IQBAW7.js → chunk-WMDOEOAH.js} +2 -2
  47. package/dist/chunks/{chunk-H6IQBAW7.js.map → chunk-WMDOEOAH.js.map} +1 -1
  48. package/dist/chunks/chunk-XTQQNBQ5.js +2 -0
  49. package/dist/chunks/chunk-XTQQNBQ5.js.map +7 -0
  50. package/dist/chunks/chunk-XXCNVFGP.js +11 -0
  51. package/dist/chunks/chunk-XXCNVFGP.js.map +7 -0
  52. package/dist/chunks/chunk-ZQSWX57C.js +2 -0
  53. package/dist/chunks/chunk-ZQSWX57C.js.map +7 -0
  54. package/dist/chunks/{dist-CMWKVHC7.js → dist-GXYZN4ZR.js} +2 -2
  55. package/dist/chunks/{dist-CMWKVHC7.js.map → dist-GXYZN4ZR.js.map} +3 -3
  56. package/dist/chunks/dist-GZKCGB2N.js +2 -0
  57. package/dist/chunks/{model-VE7IYWNU.js → model-36HCIOZJ.js} +3 -3
  58. package/dist/chunks/model-36HCIOZJ.js.map +7 -0
  59. package/dist/chunks/renderToSvg-5DMIQ72S.js +2 -0
  60. package/dist/jbrowse-plugin-msaview.esm.js +2 -2
  61. package/dist/jbrowse-plugin-msaview.esm.js.map +2 -2
  62. package/dist/version.d.ts +1 -1
  63. package/dist/version.js +1 -1
  64. package/package.json +18 -18
  65. package/src/MsaViewPanel/model.test.ts +4 -0
  66. package/src/MsaViewPanel/model.ts +8 -0
  67. package/src/version.ts +1 -1
  68. package/dist/chunks/AboutDialog-IRBPUPJK.js +0 -2
  69. package/dist/chunks/AnnotationFileDialog-FCYYZ4JN.js +0 -2
  70. package/dist/chunks/AnnotationFileDialog-FCYYZ4JN.js.map +0 -7
  71. package/dist/chunks/ExportSVGDialog-TYYPI6VB.js +0 -2
  72. package/dist/chunks/ExportSVGDialog-TYYPI6VB.js.map +0 -7
  73. package/dist/chunks/MsaViewPanel-RUZAKFCB.js +0 -2
  74. package/dist/chunks/chunk-NMYD2GWF.js +0 -18
  75. package/dist/chunks/chunk-NMYD2GWF.js.map +0 -7
  76. package/dist/chunks/chunk-QQ5LZUIO.js +0 -11
  77. package/dist/chunks/chunk-QQ5LZUIO.js.map +0 -7
  78. package/dist/chunks/chunk-QUWPHTZQ.js +0 -2
  79. package/dist/chunks/chunk-QUWPHTZQ.js.map +0 -7
  80. package/dist/chunks/dist-R73J3CC3.js +0 -2
  81. package/dist/chunks/model-VE7IYWNU.js.map +0 -7
  82. package/dist/chunks/renderToSvg-VDXAB7TT.js +0 -2
  83. /package/dist/chunks/{chunk-NI3VGKQP.js.map → chunk-2XCUSA22.js.map} +0 -0
  84. /package/dist/chunks/{chunk-ZCT7RD24.js.map → chunk-QQKPT6EL.js.map} +0 -0
  85. /package/dist/chunks/{dist-R73J3CC3.js.map → dist-GZKCGB2N.js.map} +0 -0
  86. /package/dist/chunks/{renderToSvg-VDXAB7TT.js.map → renderToSvg-5DMIQ72S.js.map} +0 -0
@@ -1,2 +1,2 @@
1
1
  import{a as m}from"./chunk-BX4Z274Q.js";import{a}from"./chunk-J6KYLXRD.js";import{b as o}from"./chunk-FY3BTKY4.js";var e=o(a(),1),t=o(m(),1);function b({checked:r,label:l,disabled:n,onChange:c}){return e.default.createElement("div",null,e.default.createElement(t.FormControlLabel,{control:e.default.createElement(t.Checkbox,{disabled:n,checked:r,onChange:()=>{c()}}),label:l}))}export{b as a};
2
- //# sourceMappingURL=chunk-YOTSFJMU.js.map
2
+ //# sourceMappingURL=chunk-GAY2PLS6.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../node_modules/.pnpm/react-msaview@9.0.0_3e54acfe76b6ad0d26e91cd532b7f775/node_modules/react-msaview/src/components/Checkbox2.tsx"],
3
+ "sources": ["../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/components/Checkbox2.tsx"],
4
4
  "sourcesContent": ["import React from 'react'\n\nimport { Checkbox, FormControlLabel } from '@mui/material'\n\nexport default function Checkbox2({\n checked,\n label,\n disabled,\n onChange,\n}: {\n checked: boolean\n label: string\n disabled?: boolean\n onChange: () => void\n}) {\n return (\n <div>\n <FormControlLabel\n control={\n <Checkbox\n disabled={disabled}\n checked={checked}\n onChange={() => {\n onChange()\n }}\n />\n }\n label={label}\n />\n </div>\n )\n}\n"],
5
5
  "mappings": "mHAAA,IAAAA,EAAkB,SAElBC,EAA2C,SAE7B,SAAPC,EAA2B,CAChC,QAAAC,EACA,MAAAC,EACA,SAAAC,EACA,SAAAC,CAAQ,EAMT,CACC,OACE,EAAAC,QAAA,cAAA,MAAA,KACE,EAAAA,QAAA,cAAC,mBAAgB,CACf,QACE,EAAAA,QAAA,cAAC,WAAQ,CACP,SAAUF,EACV,QAASF,EACT,SAAU,IAAK,CACbG,EAAQ,CACV,CAAC,CAAA,EAGL,MAAOF,CAAK,CAAA,CACZ,CAGR",
6
6
  "names": ["import_react", "import_material", "Checkbox2", "checked", "label", "disabled", "onChange", "React"]
@@ -0,0 +1,2 @@
1
+ var o=["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"],l=[{label:"Arrow keys",action:"Scroll one cell",keys:o},{label:"Shift + arrow keys",action:"Scroll one page",keys:o,shiftKey:!0},{label:"+ and -",action:"Zoom in and out",keys:["+","=","-"]},{label:"Home and End",action:"Jump to the first and last column",keys:["Home","End"]},{label:"Escape",action:"Clear the selection",keys:["Escape"]}],a={label:"Shift + drag",action:"Select a block of cells"},t=[{label:"Drag",action:"Pan the alignment"},{label:"Wheel",action:"Scroll, or zoom as set in Alignment settings \u2192 Mouse wheel"},{label:"Ctrl + wheel",action:"Zoom at the cursor"},a,{label:"Drag along a track",action:"Select a range of columns across every row"},{label:"Click a tree node",action:"Collapse, rotate, reroot or show only that clade"},{label:"Click the tree overview",action:"Show only the clade under the pointer"},{label:"Drag a divider",action:"Resize the tree area or a track"}],r=["Alignment",...[...l,a].map(e=>`${e.label}: ${e.action}`)].join(". ");export{l as a,t as b,r as c};
2
+ //# sourceMappingURL=chunk-JDQUBCHM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/components/controls.ts"],
4
+ "sourcesContent": ["export interface Control {\n label: string\n action: string\n}\n\nexport interface KeyControl extends Control {\n keys: string[]\n shiftKey?: boolean\n}\n\nconst arrows = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']\n\nexport const keyboardControls: KeyControl[] = [\n { label: 'Arrow keys', action: 'Scroll one cell', keys: arrows },\n {\n label: 'Shift + arrow keys',\n action: 'Scroll one page',\n keys: arrows,\n shiftKey: true,\n },\n { label: '+ and -', action: 'Zoom in and out', keys: ['+', '=', '-'] },\n {\n label: 'Home and End',\n action: 'Jump to the first and last column',\n keys: ['Home', 'End'],\n },\n { label: 'Escape', action: 'Clear the selection', keys: ['Escape'] },\n]\n\nconst selectCells: Control = {\n label: 'Shift + drag',\n action: 'Select a block of cells',\n}\n\nexport const mouseControls: Control[] = [\n { label: 'Drag', action: 'Pan the alignment' },\n {\n label: 'Wheel',\n action: 'Scroll, or zoom as set in Alignment settings \u2192 Mouse wheel',\n },\n { label: 'Ctrl + wheel', action: 'Zoom at the cursor' },\n selectCells,\n {\n label: 'Drag along a track',\n action: 'Select a range of columns across every row',\n },\n {\n label: 'Click a tree node',\n action: 'Collapse, rotate, reroot or show only that clade',\n },\n {\n label: 'Click the tree overview',\n action: 'Show only the clade under the pointer',\n },\n { label: 'Drag a divider', action: 'Resize the tree area or a track' },\n]\n\nexport const alignmentAriaLabel = [\n 'Alignment',\n ...[...keyboardControls, selectCells].map(c => `${c.label}: ${c.action}`),\n].join('. ')\n"],
5
+ "mappings": "AAUA,IAAMA,EAAS,CAAC,YAAa,aAAc,UAAW,WAAW,EAEpDC,EAAiC,CAC5C,CAAE,MAAO,aAAc,OAAQ,kBAAmB,KAAMD,CAAM,EAC9D,CACE,MAAO,qBACP,OAAQ,kBACR,KAAMA,EACN,SAAU,IAEZ,CAAE,MAAO,UAAW,OAAQ,kBAAmB,KAAM,CAAC,IAAK,IAAK,GAAG,CAAC,EACpE,CACE,MAAO,eACP,OAAQ,oCACR,KAAM,CAAC,OAAQ,KAAK,GAEtB,CAAE,MAAO,SAAU,OAAQ,sBAAuB,KAAM,CAAC,QAAQ,CAAC,GAG9DE,EAAuB,CAC3B,MAAO,eACP,OAAQ,2BAGGC,EAA2B,CACtC,CAAE,MAAO,OAAQ,OAAQ,mBAAmB,EAC5C,CACE,MAAO,QACP,OAAQ,mEAEV,CAAE,MAAO,eAAgB,OAAQ,oBAAoB,EACrDD,EACA,CACE,MAAO,qBACP,OAAQ,8CAEV,CACE,MAAO,oBACP,OAAQ,oDAEV,CACE,MAAO,0BACP,OAAQ,yCAEV,CAAE,MAAO,iBAAkB,OAAQ,iCAAiC,GAGzDE,EAAqB,CAChC,YACA,GAAG,CAAC,GAAGH,EAAkBC,CAAW,EAAE,IAAIG,GAAK,GAAGA,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,GACxE,KAAK,IAAI",
6
+ "names": ["arrows", "keyboardControls", "selectCells", "mouseControls", "alignmentAriaLabel", "c"]
7
+ }
@@ -1,2 +1,2 @@
1
1
  import{a as e,b as x}from"./chunk-FY3BTKY4.js";var p=e((i,r)=>{r.exports=JBrowseExports["@jbrowse/core/util"]});var t=e((u,o)=>{o.exports=JBrowseExports["@mui/material/SvgIcon"]});var c=e((m,s)=>{s.exports=JBrowseExports["react/jsx-runtime"]});var a=x(t(),1);export{p as a,t as b,a as c,c as d};
2
- //# sourceMappingURL=chunk-IBBQUV2I.js.map
2
+ //# sourceMappingURL=chunk-KSCGTF4R.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["global-externals:@jbrowse/core/util", "global-externals:@mui/material/SvgIcon", "global-externals:react/jsx-runtime", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/utils/createSvgIcon.mjs"],
3
+ "sources": ["global-externals:@jbrowse/core/util", "global-externals:@mui/material/SvgIcon", "global-externals:react/jsx-runtime", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._abf953b0c56c79ebdc461ec953894a27/node_modules/@mui/icons-material/utils/createSvgIcon.mjs"],
4
4
  "sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/core/util\"];", "module.exports = JBrowseExports[\"@mui/material/SvgIcon\"];", "module.exports = JBrowseExports[\"react/jsx-runtime\"];", "'use client';\n\nexport { createSvgIcon as default } from '@mui/material/SvgIcon';"],
5
5
  "mappings": "+CAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,oBAAoB,ICApD,IAAAC,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,uBAAuB,ICAvD,IAAAC,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,mBAAmB,ICEnD,IAAAC,EAAyC",
6
6
  "names": ["require_util", "__commonJSMin", "exports", "module", "require_SvgIcon", "__commonJSMin", "exports", "module", "require_jsx_runtime", "__commonJSMin", "exports", "module", "import_SvgIcon"]
@@ -1,2 +1,2 @@
1
- import{c as o,d as l}from"./chunk-IBBQUV2I.js";import{a as c}from"./chunk-BX4Z274Q.js";import{a}from"./chunk-J6KYLXRD.js";import{b as r}from"./chunk-FY3BTKY4.js";var e=r(a());var t=r(l(),1),n=(0,o.createSvgIcon)((0,t.jsx)("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z"}),"OpenInNew");var i=r(c());function s(m){let{children:p,...f}=m;return e.default.createElement(i.Link,{...f,target:"_blank",rel:"noreferrer"},p," ",e.default.createElement(n,{fontSize:"small"}))}export{s as a};
2
- //# sourceMappingURL=chunk-6YFCSBEE.js.map
1
+ import{c as o,d as l}from"./chunk-KSCGTF4R.js";import{a as c}from"./chunk-BX4Z274Q.js";import{a}from"./chunk-J6KYLXRD.js";import{b as r}from"./chunk-FY3BTKY4.js";var e=r(a());var t=r(l(),1),n=(0,o.createSvgIcon)((0,t.jsx)("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z"}),"OpenInNew");var i=r(c());function s(m){let{children:p,...f}=m;return e.default.createElement(i.Link,{...f,target:"_blank",rel:"noreferrer"},p," ",e.default.createElement(n,{fontSize:"small"}))}export{s as a};
2
+ //# sourceMappingURL=chunk-NLAW2OYS.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/components/ExternalLink.tsx", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/OpenInNew.mjs"],
3
+ "sources": ["../../src/components/ExternalLink.tsx", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._abf953b0c56c79ebdc461ec953894a27/node_modules/@mui/icons-material/OpenInNew.mjs"],
4
4
  "sourcesContent": ["import React from 'react'\n\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\nimport { Link } from '@mui/material'\n\nimport type { LinkProps } from '@mui/material'\n\nexport default function ExternalLink(props: LinkProps) {\n const { children, ...rest } = props\n return (\n <Link {...rest} target=\"_blank\" rel=\"noreferrer\">\n {children} <OpenInNewIcon fontSize=\"small\" />\n </Link>\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z\"\n}), 'OpenInNew');"],
5
5
  "mappings": "kKAAA,IAAAA,EAAkB,OCGlB,IAAAC,EAA4B,SACrBC,KAAQ,oBAA2B,EAAAC,KAAK,OAAQ,CACrD,EAAG,+HACL,CAAC,EAAG,WAAW,EDHf,IAAAC,EAAqB,OAIN,SAARC,EAA8BC,EAAkB,CACrD,GAAM,CAAE,SAAAC,EAAU,GAAGC,CAAK,EAAIF,EAC9B,OACE,EAAAG,QAAA,cAAC,QAAM,GAAGD,EAAM,OAAO,SAAS,IAAI,cACjCD,EAAS,IAAC,EAAAE,QAAA,cAACC,EAAA,CAAc,SAAS,QAAQ,CAC7C,CAEJ",
6
6
  "names": ["import_react", "import_jsx_runtime", "OpenInNew_default", "_jsx", "import_material", "ExternalLink", "props", "children", "rest", "React", "OpenInNew_default"]
@@ -1,2 +1,2 @@
1
- import{j as m,p as l,q as h}from"./chunk-F726IWCW.js";import{d as p}from"./chunk-QQ5LZUIO.js";var g="ncbiblast";function f(e){return(e.hits??[]).map(t=>{let n=Number.parseInt(t.hit_uni_ox??"",10);return{accession:t.hit_acc??"unknown",id:t.hit_id??t.hit_acc??"unknown",sciname:t.hit_uni_os??t.hit_os??"unknown",taxid:Number.isNaN(n)?void 0:n,title:t.hit_uni_de??t.hit_desc,sequence:(t.hit_hsps?.[0]?.hsp_hseq??"").replaceAll("-","")}})}function E(e){return`https://www.ebi.ac.uk/jdispatcher/sss/${g}/summary?jobId=${e}`}async function w({query:e,blastDatabase:t,maxHits:n,onProgress:r,onRid:s,signal:i}){let a=String(h(n??l)),o=await m({tool:g,label:"BLAST",params:{program:"blastp",stype:"protein",database:t,sequence:e,alignments:a,scores:a},onProgress:r,onRid:s,signal:i});return{rid:o.jobId,hits:f(JSON.parse(await o.result("json")))}}var R=({database:e,...t})=>w({blastDatabase:e,...t});var u="hmmer3_phmmer";function O(e){return`https://www.ebi.ac.uk/jdispatcher/sss/${u}/summary?jobId=${e}`}function H(e){return e.startsWith(`${u}-`)}function x({rf:e,query:t}){let n=0,r=Array.from(e,s=>s==="x"?t[n++]??"-":"-").join("");if(n!==t.length)throw new Error(`phmmer alignment has ${n} match columns for a query of ${t.length} residues, so the query row cannot be placed`);return r}function _(e){let t=(e??"").replace("[subseq from] ","");if(t.includes("^|^")){let s=t.split("^|^"),i=s[6];return{id:s[0]||void 0,sciname:s[5]||"unknown",taxid:i&&/^\d+$/.test(i)?Number.parseInt(i,10):void 0,title:s[2]||void 0}}let n=/OS=(.*?)\s+(?:OX|GN|PE|SV)=/.exec(t)?.[1],r=/OX=(\d+)/.exec(t)?.[1];return{id:void 0,sciname:n??"unknown",taxid:r?Number.parseInt(r,10):void 0,title:t.split(" OS=")[0]||void 0}}function S(e){let t=e.lastIndexOf("/"),n=t===-1?void 0:/^\d+-\d+$/.exec(e.slice(t+1))?.[0],r=n===void 0?e:e.slice(0,t),s=r.split("|");return s.length===3?{accession:s[1],id:s[2],range:n}:{accession:r,id:r,range:n}}function y({stockholm:e,query:t}){let{gc:n,gs:r,seqdata:s,seqname:i}=new p(e,0).getMSA(),a=n.RF;if(!a)throw new Error("phmmer alignment has no #=GC RF line");return{queryRow:x({rf:a,query:t}),rows:i.map(o=>{let{id:d,...b}=_(r.DE?.[o]?.[0]),c=S(o);return{...c,id:c.id===c.accession&&d?d:c.id,...b,aligned:(s[o]??"").replaceAll(".","-").toUpperCase()}})}}async function B({query:e,database:t,maxHits:n,onProgress:r,onRid:s,signal:i}){let a=await m({tool:u,label:"phmmer",params:{database:t,sequence:e,alignView:"true",...n?{nhits:String(n)}:{}},onProgress:r,onRid:s,signal:i});return{rid:a.jobId,...y({stockholm:await a.result("sto"),query:e})}}function q(e){return e.map(({aligned:t,...n})=>({...n,sequence:t}))}var I=async({database:e,...t})=>{let{rows:n,queryRow:r,rid:s}=await B({database:e,...t});return{rid:s,queryRow:r,hits:q(n)}};export{E as a,R as b,O as c,H as d,I as e};
2
- //# sourceMappingURL=chunk-ZCT7RD24.js.map
1
+ import{j as m,p as l,q as h}from"./chunk-F726IWCW.js";import{d as p}from"./chunk-XXCNVFGP.js";var g="ncbiblast";function f(e){return(e.hits??[]).map(t=>{let n=Number.parseInt(t.hit_uni_ox??"",10);return{accession:t.hit_acc??"unknown",id:t.hit_id??t.hit_acc??"unknown",sciname:t.hit_uni_os??t.hit_os??"unknown",taxid:Number.isNaN(n)?void 0:n,title:t.hit_uni_de??t.hit_desc,sequence:(t.hit_hsps?.[0]?.hsp_hseq??"").replaceAll("-","")}})}function E(e){return`https://www.ebi.ac.uk/jdispatcher/sss/${g}/summary?jobId=${e}`}async function w({query:e,blastDatabase:t,maxHits:n,onProgress:r,onRid:s,signal:i}){let a=String(h(n??l)),o=await m({tool:g,label:"BLAST",params:{program:"blastp",stype:"protein",database:t,sequence:e,alignments:a,scores:a},onProgress:r,onRid:s,signal:i});return{rid:o.jobId,hits:f(JSON.parse(await o.result("json")))}}var R=({database:e,...t})=>w({blastDatabase:e,...t});var u="hmmer3_phmmer";function O(e){return`https://www.ebi.ac.uk/jdispatcher/sss/${u}/summary?jobId=${e}`}function H(e){return e.startsWith(`${u}-`)}function x({rf:e,query:t}){let n=0,r=Array.from(e,s=>s==="x"?t[n++]??"-":"-").join("");if(n!==t.length)throw new Error(`phmmer alignment has ${n} match columns for a query of ${t.length} residues, so the query row cannot be placed`);return r}function _(e){let t=(e??"").replace("[subseq from] ","");if(t.includes("^|^")){let s=t.split("^|^"),i=s[6];return{id:s[0]||void 0,sciname:s[5]||"unknown",taxid:i&&/^\d+$/.test(i)?Number.parseInt(i,10):void 0,title:s[2]||void 0}}let n=/OS=(.*?)\s+(?:OX|GN|PE|SV)=/.exec(t)?.[1],r=/OX=(\d+)/.exec(t)?.[1];return{id:void 0,sciname:n??"unknown",taxid:r?Number.parseInt(r,10):void 0,title:t.split(" OS=")[0]||void 0}}function S(e){let t=e.lastIndexOf("/"),n=t===-1?void 0:/^\d+-\d+$/.exec(e.slice(t+1))?.[0],r=n===void 0?e:e.slice(0,t),s=r.split("|");return s.length===3?{accession:s[1],id:s[2],range:n}:{accession:r,id:r,range:n}}function y({stockholm:e,query:t}){let{gc:n,gs:r,seqdata:s,seqname:i}=new p(e,0).getMSA(),a=n.RF;if(!a)throw new Error("phmmer alignment has no #=GC RF line");return{queryRow:x({rf:a,query:t}),rows:i.map(o=>{let{id:d,...b}=_(r.DE?.[o]?.[0]),c=S(o);return{...c,id:c.id===c.accession&&d?d:c.id,...b,aligned:(s[o]??"").replaceAll(".","-").toUpperCase()}})}}async function B({query:e,database:t,maxHits:n,onProgress:r,onRid:s,signal:i}){let a=await m({tool:u,label:"phmmer",params:{database:t,sequence:e,alignView:"true",...n?{nhits:String(n)}:{}},onProgress:r,onRid:s,signal:i});return{rid:a.jobId,...y({stockholm:await a.result("sto"),query:e})}}function q(e){return e.map(({aligned:t,...n})=>({...n,sequence:t}))}var I=async({database:e,...t})=>{let{rows:n,queryRow:r,rid:s}=await B({database:e,...t});return{rid:s,queryRow:r,hits:q(n)}};export{E as a,R as b,O as c,H as d,I as e};
2
+ //# sourceMappingURL=chunk-QQKPT6EL.js.map
@@ -1,6 +1,6 @@
1
- import{a as d}from"./chunk-YOTSFJMU.js";import{a as b}from"./chunk-F3EC6OCO.js";import{f as y}from"./chunk-QQ5LZUIO.js";import{a as S}from"./chunk-GDFVLZYX.js";import{a as x}from"./chunk-GIHMPOCO.js";import{a as g}from"./chunk-BX4Z274Q.js";import{a as w}from"./chunk-J6KYLXRD.js";import{b as s}from"./chunk-FY3BTKY4.js";var l=s(w(),1),E=s(x(),1),a=s(g(),1),j=(0,E.makeStyles)()({key:{fontWeight:"bold",verticalAlign:"top"},value:{whiteSpace:"pre-wrap",wordBreak:"break-word"}});function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function B(e){return k(e)&&Object.keys(e).length===0}function A({record:e}){let{classes:o}=j();return l.default.createElement(a.Table,{size:"small"},l.default.createElement(a.TableBody,null,Object.entries(e).filter(([,t])=>t!=null&&!B(t)).map(([t,r])=>l.default.createElement(a.TableRow,{key:t},l.default.createElement(a.TableCell,{component:"th",className:o.key},t),l.default.createElement(a.TableCell,{className:o.value},k(r)?l.default.createElement(A,{record:r}):Array.isArray(r)?r.join(`
1
+ import{a as d}from"./chunk-GAY2PLS6.js";import{a as b}from"./chunk-5OSSOQH4.js";import{f as y}from"./chunk-XXCNVFGP.js";import{a as S}from"./chunk-666BV764.js";import{a as x}from"./chunk-35FWLG3N.js";import{a as g}from"./chunk-BX4Z274Q.js";import{a as w}from"./chunk-J6KYLXRD.js";import{b as s}from"./chunk-FY3BTKY4.js";var l=s(w(),1),E=s(x(),1),a=s(g(),1),j=(0,E.makeStyles)()({key:{fontWeight:"bold",verticalAlign:"top"},value:{whiteSpace:"pre-wrap",wordBreak:"break-word"}});function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function B(e){return k(e)&&Object.keys(e).length===0}function A({record:e}){let{classes:o}=j();return l.default.createElement(a.Table,{size:"small"},l.default.createElement(a.TableBody,null,Object.entries(e).filter(([,t])=>t!=null&&!B(t)).map(([t,r])=>l.default.createElement(a.TableRow,{key:t},l.default.createElement(a.TableCell,{component:"th",className:o.key},t),l.default.createElement(a.TableCell,{className:o.value},k(r)?l.default.createElement(A,{record:r}):Array.isArray(r)?r.join(`
2
2
  `):String(r))))))}var n=s(w(),1),C=s(x(),1),f=s(g(),1);var F=(0,C.makeStyles)()(e=>({textAreaFont:{fontFamily:"Courier New",wordWrap:"break-word"},dialogContent:{background:e.palette.action.selected,margin:4}})),N=100,$=2e5;function T([e,o],t){return`>${e}
3
3
  ${t?o:y(o)}`}function G(e){return!/[^.-]/.test(e)}function O(e,o){let t=[],r=0;for(let c of e){if(t.length>=N||r>=$)break;let i=T(c,o);t.push(i),r+=i.length+1}return{text:t.join(`
4
4
  `),hidden:e.length-t.length}}function W({str:e}){let{classes:o}=F(),[t,r]=(0,n.useState)(!1),[c,i]=(0,n.useState)(!1),m=c?e:e.filter(([,p])=>t?!!p:!G(p)),{text:R,hidden:u}=O(m,t),h=()=>m.map(p=>T(p,t)).join(`
5
5
  `);return n.default.createElement(n.default.Fragment,null,n.default.createElement(S,{text:h}),n.default.createElement(f.Button,{onClick:()=>{b(new Blob([h()],{type:"text/plain"}),"sequences.fasta")}},"Download"),n.default.createElement(d,{label:"Show gaps",checked:t,onChange:()=>{r(!t)}}),n.default.createElement(d,{label:"Show empty",checked:c,onChange:()=>{i(!c)}}),n.default.createElement(f.TextField,{variant:"outlined",multiline:!0,className:o.dialogContent,minRows:5,maxRows:10,fullWidth:!0,value:R,helperText:u>0?`Showing ${m.length-u} of ${m.length.toLocaleString()} sequences. ${u.toLocaleString()} more are in the copy and the download.`:void 0,slotProps:{input:{readOnly:!0,className:o.textAreaFont}}}))}export{B as a,A as b,W as c};
6
- //# sourceMappingURL=chunk-H6IQBAW7.js.map
6
+ //# sourceMappingURL=chunk-WMDOEOAH.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../node_modules/.pnpm/react-msaview@9.0.0_3e54acfe76b6ad0d26e91cd532b7f775/node_modules/react-msaview/src/components/MetadataTable.tsx", "../../node_modules/.pnpm/react-msaview@9.0.0_3e54acfe76b6ad0d26e91cd532b7f775/node_modules/react-msaview/src/components/SequenceTextArea.tsx"],
3
+ "sources": ["../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/components/MetadataTable.tsx", "../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/components/SequenceTextArea.tsx"],
4
4
  "sourcesContent": ["import React from 'react'\n\nimport { makeStyles } from '@jbrowse/core/util/tss-react'\nimport { Table, TableBody, TableCell, TableRow } from '@mui/material'\n\nconst useStyles = makeStyles()({\n key: {\n fontWeight: 'bold',\n verticalAlign: 'top',\n },\n value: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n },\n})\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function isEmpty(value: unknown) {\n return isRecord(value) && Object.keys(value).length === 0\n}\n\nexport default function MetadataTable({\n record,\n}: {\n record: Record<string, unknown>\n}) {\n const { classes } = useStyles()\n return (\n <Table size=\"small\">\n <TableBody>\n {Object.entries(record)\n .filter(([, value]) => value != null && !isEmpty(value))\n .map(([key, value]) => (\n <TableRow key={key}>\n <TableCell component=\"th\" className={classes.key}>\n {key}\n </TableCell>\n <TableCell className={classes.value}>\n {isRecord(value) ? (\n <MetadataTable record={value} />\n ) : Array.isArray(value) ? (\n value.join('\\n')\n ) : (\n String(value)\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { makeStyles } from '@jbrowse/core/util/tss-react'\nimport { Button, TextField } from '@mui/material'\nimport { getUngappedSequence } from 'msa-parsers'\n\nimport { saveAs } from '../vendor/fileSaver.ts'\nimport Checkbox2 from './Checkbox2.tsx'\nimport CopyButton from './CopyButton.tsx'\n\nconst useStyles = makeStyles()(theme => ({\n textAreaFont: {\n fontFamily: 'Courier New',\n wordWrap: 'break-word',\n },\n dialogContent: {\n background: theme.palette.action.selected,\n margin: 4,\n },\n}))\n\nexport const maxShownRecords = 100\nexport const maxShownChars = 200_000\n\nfunction fastaRecord([name, seq]: [string, string], showGaps: boolean) {\n return `>${name}\\n${showGaps ? seq : getUngappedSequence(seq)}`\n}\n\nfunction isAllGaps(seq: string) {\n return !/[^.-]/.test(seq)\n}\n\n/**\n * The first records of `rows` as FASTA, up to `maxShownRecords` records or\n * `maxShownChars` characters, whichever comes first. A textarea holding every\n * row of a large alignment freezes the page.\n */\nexport function fastaPreview(rows: [string, string][], showGaps: boolean) {\n const shown: string[] = []\n let chars = 0\n for (const row of rows) {\n if (shown.length >= maxShownRecords || chars >= maxShownChars) {\n break\n }\n const record = fastaRecord(row, showGaps)\n shown.push(record)\n chars += record.length + 1\n }\n return { text: shown.join('\\n'), hidden: rows.length - shown.length }\n}\n\nexport default function SequenceTextArea({ str }: { str: [string, string][] }) {\n const { classes } = useStyles()\n const [showGaps, setShowGaps] = useState(false)\n const [showEmpty, setShowEmpty] = useState(false)\n\n const rows = showEmpty\n ? str\n : str.filter(([, seq]) => (showGaps ? !!seq : !isAllGaps(seq)))\n const { text, hidden } = fastaPreview(rows, showGaps)\n const fullText = () => rows.map(row => fastaRecord(row, showGaps)).join('\\n')\n return (\n <>\n <CopyButton text={fullText} />\n <Button\n onClick={() => {\n saveAs(\n new Blob([fullText()], { type: 'text/plain' }),\n 'sequences.fasta',\n )\n }}\n >\n Download\n </Button>\n <Checkbox2\n label=\"Show gaps\"\n checked={showGaps}\n onChange={() => {\n setShowGaps(!showGaps)\n }}\n />\n <Checkbox2\n label=\"Show empty\"\n checked={showEmpty}\n onChange={() => {\n setShowEmpty(!showEmpty)\n }}\n />\n <TextField\n variant=\"outlined\"\n multiline\n className={classes.dialogContent}\n minRows={5}\n maxRows={10}\n fullWidth\n value={text}\n helperText={\n hidden > 0\n ? `Showing ${rows.length - hidden} of ${rows.length.toLocaleString()} sequences. ${hidden.toLocaleString()} more are in the copy and the download.`\n : undefined\n }\n slotProps={{\n input: {\n readOnly: true,\n className: classes.textAreaFont,\n },\n }}\n />\n </>\n )\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["import_react", "import_tss_react", "import_material", "useStyles", "isRecord", "value", "isEmpty", "MetadataTable", "record", "classes", "React", "key", "import_react", "import_tss_react", "import_material", "useStyles", "theme", "maxShownRecords", "maxShownChars", "fastaRecord", "name", "seq", "showGaps", "getUngappedSequence", "isAllGaps", "fastaPreview", "rows", "shown", "chars", "row", "record", "SequenceTextArea", "str", "classes", "setShowGaps", "showEmpty", "setShowEmpty", "text", "hidden", "fullText", "React", "CopyButton", "saveAs", "Checkbox2"]
@@ -0,0 +1,2 @@
1
+ var o="9.1.0";export{o as a};
2
+ //# sourceMappingURL=chunk-XTQQNBQ5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/version.ts"],
4
+ "sourcesContent": ["export const version = '9.1.0'\n"],
5
+ "mappings": "AAAO,IAAMA,EAAU",
6
+ "names": ["version"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import{a as $}from"./chunk-73KAPCJ2.js";function b(s){return Object.fromEntries(s.map(e=>[e.xref[0]?.id,e]).filter(e=>e[0]!==void 0))}function N(s){return Object.entries(s).flatMap(([e,{matches:n}])=>n.flatMap(({signature:t,locations:r})=>{let{entry:o}=t,c=o?.accession??t.accession;if(!c)return[];let i=o?.name??t.name??c;return r.map(({start:a,end:f,strand:l})=>({id:e,accession:c,name:i,description:o?.description??t.description??i,start:a,end:f,strand:l}))}))}function F(s){return N(b(s.results))}function A(s,e=[]){return["##gff-version 3",...e.map(n=>`# ${n}`),...s.map(n=>{let{accession:t,name:r,description:o,featureType:c}=n,{id:i,start:a,end:f,strand:l}=n;return[i.replaceAll(/[%\t\n\r]/g,encodeURIComponent),"InterProScan",c??"protein_match",a,f,".",l===void 0?".":l>0?"+":"-",".",[`Name=${encodeURIComponent(t)}`,`signature_desc=${encodeURIComponent(r)}`,`description=${encodeURIComponent(o)}`].join(";")].join(" ")})].join(`
2
+ `)}function X(s){let e=s.trimStart();if(!e.startsWith("{"))return s;let n=JSON.parse(e);return A(F(n))}function T(s,e="node",n=0){let t=(c,i)=>({...c,id:i,name:c.name||i,children:[]}),r=t(s,`${e}-${n}`),o=[{src:s,out:r,depth:n}];for(;o.length>0;){let{src:c,out:i,depth:a}=o.pop();if(c.children){i.children=c.children.map((f,l)=>t(f,`${i.id}-${l}-${a+1}`));for(let[f,l]of c.children.entries())o.push({src:l,out:i.children[f],depth:a+1})}}return r}var u=class{rows=new Map;names;width;constructor(e){for(let[n,t]of e)this.rows.has(n)||this.rows.set(n,t);this.names=[...this.rows.keys()]}getRow(e){return this.rows.get(e)??""}getNames(){return this.names}getWidth(){return this.width??=this.getNames().reduce((e,n)=>Math.max(e,this.getRow(n).length),0),this.width}getTree(){return{id:"root",name:"root",noTree:!0,children:this.getNames().map(e=>({id:e,children:[],name:e}))}}getRowData(e){}getStructures(){return{}}getHeader(){return{}}get alignmentNames(){return[]}get seqConsensus(){}get secondaryStructureConsensus(){}get tracks(){return[]}};function C(s){return/^(#.*\n)*>/.test(s)}function O(s){let e=[],n=new Set,t,r=()=>{t&&!n.has(t.id)&&(n.add(t.id),e.push({id:t.id,seq:t.lines.join("").replaceAll(/\s/g,"")}))},o=0;for(let c of s.split(`
3
+ `))c.startsWith(">")?(r(),o++,t={id:/^>\s*(\S*)/.exec(c)[1]||`unnamed_${o}`,lines:[]}):t?.lines.push(c);return r(),e}function w(s){return typeof s=="string"?O(s):s}var V=65,Y=90,J=97,Z=122,ee=45;function y(s){return s>=J&&s<=Z}function _(s){return s>=V&&s<=Y||s===ee}function te(s){let e=[],n=[""];for(let t of s){let r=t.charCodeAt(0);_(r)?(e.push(t),n.push("")):y(r)&&(n[n.length-1]+=t.toUpperCase())}return{matches:e,inserts:n}}var m=class extends u{constructor(e){let n=w(e),t=ne(n.map(r=>r.seq));super(n.map((r,o)=>[r.id,t[o]]))}static sniff(e){if(typeof e=="string"&&!C(e))return!1;let n=w(e).map(o=>o.seq).filter(o=>!!o);if(n.length<2||new Set(n.map(o=>o.length)).size===1)return!1;let t=!1,r;for(let o of n){let c=0;for(let i=0;i<o.length;i++){let a=o.charCodeAt(i);_(a)?c++:y(a)&&(t=!0)}if(r!==void 0&&c!==r)return!1;r=c}return t}};function ne(s){let e=s.map(te),n=0;for(let{matches:r}of e)n=Math.max(n,r.length);let t=new Array(n+1).fill(0);for(let{inserts:r}of e)for(let[o,c]of r.entries())t[o]=Math.max(t[o],c.length);return e.map(({matches:r,inserts:o})=>{let c=[];for(let i=0;i<=n;i++){let a=o[i]??"";c.push(a,".".repeat(t[i]-a.length)),i<n&&c.push(r[i]??"-")}return c.join("")})}function se(s){let e=/\(?(\d+(\.\d+)+)\)?/.exec(s);return e&&e.length>1?e[1]:""}function P(s){let e=["CLUSTAL","PROBCONS","MUSCLE","MSAPROBS","Kalign"];e.some(t=>s.startsWith(t))||console.warn(`${s} is not a known CLUSTAL header: ${e.join(",")}, proceeding but could indicate an issue`);let n=se(s);return{info:s,version:n}}function k(s){let e=s.next();for(;!e.done&&e.value.trim()==="";)e=s.next();return e.value}function re(s){let e=s.split(/\s+/),n=s.slice(e[0].length),t=e[0].length+n.indexOf(e[1]),r=t+e[1].length;return[t,r]}function j(s){let e=k(s),n=[],t="";if(!e)return;for(;e;)e.startsWith(" ")?t=e:n.push(e),e=s.next().value;let[r,o]=re(n[0]),i=n.map(p=>p.split(/\s+/)).map(p=>p[0]),a=n.map(p=>p.slice(r,o)),f=t.slice(r,o),l=a[0].length-f.length;return l&&(f+=" ".repeat(l)),{ids:i,seqs:a,consensus:f}}function G(s){let e,n=j(s);if(n!==void 0)for(;e=j(s);){for(let t=0;t<e.seqs.length;t++)n.seqs[t]+=e.seqs[t];n.consensus+=e.consensus}return n}function oe(s){let e=k(s);if(!e)throw new Error("Empty file received");let n=P(e),t=G(s);if(t===void 0)throw new Error("No blocks parsed");let r=t.seqs.map((c,i)=>({id:t.ids[i],seq:c})),{consensus:o}=t;if(o.length!==r[0].seq.length)throw new Error(`Consensus length != sequence length. Con ${o.length} seq ${r[0].seq.length}`);return{consensus:o,alns:r,header:n}}function L(s){let e=s.split(`
4
+ `)[Symbol.iterator]();return oe(e)}var d=class extends u{MSA;constructor(e){let n=L(e);super(n.alns.map(t=>[t.id,t.seq])),this.MSA=n}getHeader(){return this.MSA.header}get seqConsensus(){return this.MSA.consensus}};function D(s){let e=s.split(`
5
+ `).map(o=>o.trim()).filter(o=>!!o),n=[],t=[];for(let o of e)if(o.startsWith("SEQ"))n.push(o);else{if(o.startsWith("DATA"))continue;if(o.startsWith("//"))break;t.push(o)}let r=n.map(o=>{let[,c,i,a,f,l,p,x,R]=o.split(" ");return{species:c,protein:i,chr:a,start:+f,end:+l,strand:+p,geneId:x,unknown:R,seq:""}});for(let o of t)for(let c=0;c<n.length;c++)r[c].seq+=o[c];return r}function B(s){let e=s.split(`
6
+ `).map(o=>o.trim()).filter(o=>!!o),n=[],t="";for(let o of e)if(o.startsWith("SEQ"))n.push(o);else{if(o.startsWith("DATA"))continue;if(o.startsWith("//"))break;t=o}let r=n.map(o=>{let[,c,i,a,f,l,p,x,R]=o.split(" ");return{species:c,protein:i,chr:a,start:+f,end:+l,strand:+p,geneId:x,unknown:R}});return{tree:t,seqs:r}}var h=class extends u{constructor(e){super(D(e).map(n=>[n.protein,n.seq]))}};var g=class extends u{colonNormalized=new Map;constructor(e){let n=w(e);super(n.map(t=>[t.id,t.seq]));for(let{id:t}of n)t.includes(":")&&this.colonNormalized.set(t.replaceAll(":","_"),t)}getRow(e){return this.rows.get(e)??this.rows.get(this.colonNormalized.get(e)??"")??""}};function q(s){return $(s,{postParenNumeric:"name"})}function U(){return{gf:Object.create(null),gc:Object.create(null),gs:Object.create(null),gr:Object.create(null),seqname:[],seqdata:Object.create(null)}}function E(s,e){if(s)return s;if(e)throw new Error("No format header: # STOCKHOLM 1.0");return U()}var W=/^# STOCKHOLM 1.0/,ie=/^\/\/\s*$/,ce=/^#=GF\s+(\S+)\s+(.*?)\s*$/,ae=/^#=GC\s+(\S+)\s+(.*?)\s*$/,fe=/^#=GS\s+(\S+)\s+(\S+)\s+(.*?)\s*$/,le=/^#=GR\s+(\S+)\s+(\S+)\s+(.*?)\s*$/,ue=/^\s*([^#\s]\S*)\s+(\S+)\s*$/,pe=/\S/;function M(s){return W.test(s)}function I(s,e){let n=e??{},t=[],r=null,o=!1,c=s.split(`
7
+ `);for(let i of c){let a;if(W.test(i))r&&t.push(r),r=U(),o=!1;else if(ie.test(i))r&&t.push(r),r=null;else if(a=ce.exec(i)){r=E(r,!!n.strict);let f=a[1],l=r.gf[f]??=[];f==="NH"&&o&&l.length>0?l[l.length-1]+=a[2]:l.push(a[2]),o=f==="NH"}else if(a=ae.exec(i))r=E(r,!!n.strict),r.gc[a[1]]=(r.gc[a[1]]??"")+a[2];else if(a=fe.exec(i)){r=E(r,!!n.strict);let f=r.gs[a[2]]??=Object.create(null);(f[a[1]]??=[]).push(a[3])}else if(a=le.exec(i)){r=E(r,!!n.strict);let f=r.gr[a[2]]??=Object.create(null);f[a[1]]=(f[a[1]]??"")+a[3]}else if(a=ue.exec(i)){r=E(r,!!n.strict);let f=a[1],l=a[2];r.seqdata[f]===void 0&&(r.seqdata[f]="",r.seqname.push(f)),r.seqdata[f]+=l}else if(pe.test(i)&&n.strict)throw new Error("Malformed line")}return r&&t.push(r),t}var S=class extends u{data;MSA;constructor(e,n){let t=I(e),r=t[n]??t[0];if(!r)throw new Error("No alignments found in Stockholm file");super(r.seqname.map(o=>[o,r.seqdata[o]??""])),this.data=t,this.MSA=r}getMSA(){return this.MSA}get alignmentNames(){return this.data.map((e,n)=>e.gf.DE?.[0]??`Alignment ${n+1}`)}getHeader(){let e=this.MSA.gs.AC??{},n=this.MSA.gs.DR??{};return{General:this.MSA.gf,Accessions:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r[0]])),Dbxref:Object.fromEntries(Object.entries(n).map(([t,r])=>[t,r.join("; ")]))}}getRowData(e){return{name:e,accession:this.MSA.gs.AC?.[e]?.[0],dbxref:this.MSA.gs.DR?.[e]?.join("; ")}}getStructures(){let e=/PDB; +(\S+) +([^;\s]+); *(-?[0-9]+)-(-?[0-9]+)/,n=this.MSA.gs.DR??{},t={};for(let[r,o]of Object.entries(n))for(let c of o){let i=e.exec(c);i&&(t[r]??=[]).push({pdb:i[1].toLowerCase(),chain:i[2],startPos:+i[3],endPos:+i[4]})}return t}getTree(){let e=this.MSA.gf.NH?.[0];return e?T(q(e)):super.getTree()}get seqConsensus(){return this.MSA.gc.seq_cons}get secondaryStructureConsensus(){return this.MSA.gc.SS_cons}get tracks(){let{seq_cons:e,SS_cons:n,...t}=this.MSA.gc;return[{id:"seqConsensus",name:"Sequence consensus",data:e,customColorScheme:{}},{id:"secondaryStruct",name:"Secondary-structure",data:n,customColorScheme:v},...Object.entries(t).map(([r,o])=>({id:`gc-${r}`,name:r,data:o,customColorScheme:H(r)})),...Object.entries(this.MSA.gr).flatMap(([r,o])=>Object.entries(o).map(([c,i])=>({id:`gr-${c}-${r}`,name:`${c} ${r}`,data:i,customColorScheme:H(r),defaultOff:!0})))]}},v={"<":"lightblue","(":"lightblue","[":"lightblue","{":"lightblue",">":"pink",")":"pink","]":"pink","}":"pink"};function H(s){return s==="SS"||s.endsWith("_SS")?v:{}}var me=/^<(!doctype\s+html|html[\s>])/i,de=/^(CLUSTAL|MUSCLE|PROBCONS|MSAPROBS|Kalign)/i;function he(s,e=0,n){let t=s.replace(/^\uFEFF/,"").replaceAll(/\r\n?/g,`
8
+ `).trimStart();if(me.test(t))throw new Error("Received an HTML page, not an alignment. Check that the URL points at the file itself");if(n==="stockholm")return new S(t,e);if(n==="a3m")return new m(t);if(n==="fasta")return new g(t);if(n==="emf")return new h(t);if(n==="clustal")return new d(t);if(M(t))return new S(t,e);if(C(t)){let o=O(t);return m.sniff(o)?new m(o):new g(o)}if(t.startsWith("SEQ"))return new h(t);if(de.test(t))return new d(t);let r=t.split(`
9
+ `,1)[0].slice(0,80);throw new Error(r?`Unrecognized alignment format: expected FASTA, A3M, Stockholm, Clustal or EMF, but the first line reads "${r}"`:"The alignment file is empty")}function ge(s){return s.replaceAll(/[.-]/g,"")}function z(s){try{return decodeURIComponent(s)}catch{return s}}function Se(s){return s.replace(/^"(.*)"$/,"$1")}function xe(s){if(!s)return{};let e={};for(let n of s.split(";")){let t=n.indexOf("="),r=n.slice(0,t).trim(),o=n.slice(t+1);t!==-1&&r&&o&&(e[r]=o.split(",").map(c=>Se(z(c).trim())).join(" "))}return e}function K(s){if(!s)return[];let e=[];for(let n of s.split(`
10
+ `)){let t=n.trim();if(t.startsWith("##FASTA"))break;t&&!t.startsWith("#")&&t.split(" ").length>=8&&e.push(t)}return e.map(n=>{let t=n.split(" "),[r,o,c,i,a,f,l,p]=t,x=t[8];return{...xe(x),seq_id:z(r??""),source:o??"",type:c??"",start:Number(i)||0,end:Number(a)||0,score:Number(f)||0,strand:l??".",phase:p??"."}})}var Ae=new Set(["gene","CDS","pseudogene","mRNA","transcript","primary_transcript","ncRNA","tRNA","rRNA","snRNA","snoRNA","miRNA","lnc_RNA"]);function we({type:s,strand:e}){let n=e==="+"?1:e==="-"?-1:void 0;return Ae.has(s)?n:void 0}var qe=new Set(["seq_id","source","type","start","end","score","strand","phase"]);function Ee(s){let e=Object.entries(s).filter(([n,t])=>!qe.has(n)&&typeof t=="string");return e.length>0?Object.fromEntries(e):void 0}var Me=/^(\d{1,3})[\s,]+(\d{1,3})[\s,]+(\d{1,3})$/;function Ce(s){let e=s.color??s.colour??s.Color??s.Colour;if(!e)return;let n=Me.exec(e.trim());return n?`rgb(${n[1]},${n[2]},${n[3]})`:e.trim()}var Re=new Set(["polypeptide","nucleic_acid"]);function Q(s){return s.filter(e=>!Re.has(e.type)).map(e=>{let n=e.Name||e.ID||`${e.source}_${e.start}_${e.end}`,t=e.signature_desc||e.Name||n;return{id:e.seq_id,accession:n,name:t,description:e.description||e.Note||e.signature_desc||t,featureType:e.type,start:e.start,end:e.end,strand:we(e),color:Ce(e),attributes:Ee(e)}})}export{T as a,B as b,q as c,S as d,he as e,ge as f,K as g,Q as h,X as i};
11
+ //# sourceMappingURL=chunk-XXCNVFGP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/interProScanToAnnotations.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/gff/annotationsToGFF.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/gff/annotationTextToGFF.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/util.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/BaseMSA.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/fastaRecords.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/A3mMSA.ts", "../../node_modules/.pnpm/clustal-js@2.0.19/node_modules/clustal-js/src/util.ts", "../../node_modules/.pnpm/clustal-js@2.0.19/node_modules/clustal-js/src/index.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/ClustalMSA.ts", "../../node_modules/.pnpm/emf-js@2.0.0/node_modules/emf-js/src/index.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/EmfMSA.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/FastaMSA.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/parseNewick.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/stockholmParser.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/StockholmMSA.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/msa/index.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/gff/parseGFF.ts", "../../node_modules/.pnpm/msa-parsers@9.1.0/node_modules/msa-parsers/src/gff/gffToAnnotations.ts"],
4
+ "sourcesContent": ["import type {\n Annotation,\n InterProScanResponse,\n InterProScanResults,\n} from './types.ts'\n\n/**\n * Key each result by its xref id, which is the row name its annotations attach\n * to. A result without one is dropped rather than keyed `undefined`, which\n * would draw a phantom row's worth of annotations (and rather than throwing,\n * which would lose every other result over one malformed one).\n */\nexport function indexResultsByXref(results: InterProScanResults[]) {\n return Object.fromEntries(\n results\n .map(r => [r.xref[0]?.id, r] as const)\n .filter((e): e is [string, InterProScanResults] => e[0] !== undefined),\n )\n}\n\n/**\n * Flatten InterProScan results, keyed by the row name they attach to, into one\n * annotation per signature location.\n *\n * An unintegrated signature has no InterPro `entry` -- MobiDBLite's disorder\n * calls, and many CDD, Pfam and PANTHER hits -- and falling back to the\n * signature's own accession and name is the difference between drawing those\n * and dropping them. Only a signature with no accession at all has nothing to\n * color, filter or label by, and is dropped.\n */\nexport function interProScanToAnnotations(\n results: Record<string, InterProScanResults>,\n): Annotation[] {\n return Object.entries(results).flatMap(([id, { matches }]) =>\n matches.flatMap(({ signature, locations }) => {\n const { entry } = signature\n const accession = entry?.accession ?? signature.accession\n if (!accession) {\n return []\n }\n const name = entry?.name ?? signature.name ?? accession\n return locations.map(({ start, end, strand }) => ({\n id,\n accession,\n name,\n description: entry?.description ?? signature.description ?? name,\n start,\n end,\n strand,\n }))\n }),\n )\n}\n\n/**\n * Flatten a whole InterProScan JSON response, resolving each result's row name\n * from its xref.\n */\nexport function interProScanResponseToAnnotations(\n response: InterProScanResponse,\n): Annotation[] {\n return interProScanToAnnotations(indexResultsByXref(response.results))\n}\n", "import type { Annotation } from '../types.ts'\n\n/**\n * Write annotations as GFF3, one line per annotation, in list order, with\n * optional `#` comment lines after the version directive saying where they came\n * from.\n *\n * The source column is always `InterProScan`: an Annotation records no source\n * of its own, and the viewer reads a precomputed-lookup GFF by the same rules\n * it reads a real InterProScan run's.\n */\nexport function annotationsToGFF(\n annotations: Annotation[],\n header: string[] = [],\n): string {\n return [\n '##gff-version 3',\n ...header.map(line => `# ${line}`),\n ...annotations.map(annotation => {\n const { accession, name, description, featureType } = annotation\n const { id, start, end, strand } = annotation\n return [\n id.replaceAll(/[%\\t\\n\\r]/g, encodeURIComponent),\n 'InterProScan',\n // GFF-sourced annotations carry their original type; writing every\n // feature back out as protein_match would turn an exon overlay into\n // generic domains on the next read, losing the numbered-segment\n // rendering and the gene arrowheads\n featureType ?? 'protein_match',\n start,\n end,\n '.',\n strand === undefined ? '.' : strand > 0 ? '+' : '-',\n '.',\n [\n `Name=${encodeURIComponent(accession)}`,\n `signature_desc=${encodeURIComponent(name)}`,\n `description=${encodeURIComponent(description)}`,\n ].join(';'),\n ].join('\\t')\n }),\n ].join('\\n')\n}\n", "import { interProScanResponseToAnnotations } from '../interProScanToAnnotations.ts'\nimport { annotationsToGFF } from './annotationsToGFF.ts'\n\nimport type { InterProScanResponse } from '../types.ts'\n\n/**\n * An annotation file's text as GFF3: GFF passes through, and the JSON an\n * InterProScan run returns converts, taking each result's row from its xref.\n */\nexport function annotationTextToGFF(text: string): string {\n const trimmed = text.trimStart()\n if (!trimmed.startsWith('{')) {\n return text\n }\n const response: InterProScanResponse = JSON.parse(trimmed)\n return annotationsToGFF(interProScanResponseToAnnotations(response))\n}\n", "import type { Node, NodeWithIds } from './types.ts'\n\n/**\n * Copy a parsed tree, giving every node a stable id derived from its path, and\n * falling back to that id for an unnamed node.\n *\n * Iterative, like the traversals in @gmod/newick and the Newick emitter in the\n * viewer's neighbor joining: a phylogeny can be a caterpillar whose depth equals\n * its leaf count, and the recursive form of this overflowed the stack somewhere\n * past 5000 deep -- which every tree reaches, since this is the last step of\n * parsing one.\n */\nexport function generateNodeIds(\n tree: Node,\n parent = 'node',\n depth = 0,\n): NodeWithIds {\n const withId = (node: Node, id: string): NodeWithIds => ({\n ...node,\n id,\n name: node.name || id,\n children: [],\n })\n\n const root = withId(tree, `${parent}-${depth}`)\n const stack = [{ src: tree, out: root, depth }]\n while (stack.length > 0) {\n const { src, out, depth: d } = stack.pop()!\n if (src.children) {\n out.children = src.children.map((child, i) =>\n withId(child, `${out.id}-${i}-${d + 1}`),\n )\n for (const [i, child] of src.children.entries()) {\n stack.push({ src: child, out: out.children[i]!, depth: d + 1 })\n }\n }\n }\n return root\n}\n", "import type { MSATrack, NodeWithIds } from '../types.ts'\n\nexport default abstract class BaseMSA {\n protected rows = new Map<string, string>()\n private names: string[]\n private width?: number\n\n /**\n * A repeated name keeps its first row: names index the rows, so listing the\n * name twice would render a phantom duplicate row.\n */\n constructor(rows: Iterable<readonly [string, string]>) {\n for (const [name, seq] of rows) {\n if (!this.rows.has(name)) {\n this.rows.set(name, seq)\n }\n }\n this.names = [...this.rows.keys()]\n }\n\n getRow(name: string): string {\n return this.rows.get(name) ?? ''\n }\n\n getNames(): string[] {\n return this.names\n }\n\n /**\n * Column count of the alignment: the length of its widest row, since a\n * hand-edited fasta or some aligners leave rows short. The viewer's gap\n * analysis counts columns the same way.\n */\n getWidth(): number {\n this.width ??= this.getNames().reduce(\n (max, name) => Math.max(max, this.getRow(name).length),\n 0,\n )\n return this.width\n }\n\n getTree(): NodeWithIds {\n return {\n id: 'root',\n name: 'root',\n noTree: true,\n children: this.getNames().map(name => ({\n id: name,\n children: [],\n name,\n })),\n }\n }\n\n getRowData(\n _name: string,\n ): { name?: string; accession?: string; dbxref?: string } | undefined {\n return undefined\n }\n\n getStructures(): Record<string, unknown> {\n return {}\n }\n\n getHeader(): Record<string, unknown> {\n return {}\n }\n\n get alignmentNames(): string[] {\n return []\n }\n\n get seqConsensus(): string | undefined {\n return undefined\n }\n\n get secondaryStructureConsensus(): string | undefined {\n return undefined\n }\n\n get tracks(): MSATrack[] {\n return []\n }\n}\n", "export interface FastaRecord {\n id: string\n seq: string\n}\n\n// a `>` record, optionally after `#` header lines such as ColabFold's `#8\\t1`\nexport function fastaSniff(text: string) {\n return /^(#.*\\n)*>/.test(text)\n}\n\n/**\n * Split FASTA-style text (shared by the FASTA and A3M parsers) into records.\n *\n * A record starts at a `>` that begins a line, so a `>` inside a defline\n * (`x->y`, HGVS `c.1799T>A`) stays part of it, and anything before the first\n * record (ColabFold's `#8\\t1` header) is skipped. The id is the first word of\n * the defline, so `> name` reads as `name`, and a defline with no word names\n * its record `unnamed_N` after its position in the file. A repeated id keeps\n * the first record: ids index the row data, so emitting the id twice would\n * render a phantom duplicate row showing the last record's residues.\n */\nexport function splitFastaRecords(text: string): FastaRecord[] {\n const records: FastaRecord[] = []\n const seen = new Set<string>()\n let current: { id: string; lines: string[] } | undefined\n\n const flush = () => {\n if (current && !seen.has(current.id)) {\n seen.add(current.id)\n records.push({\n id: current.id,\n seq: current.lines.join('').replaceAll(/\\s/g, ''),\n })\n }\n }\n\n let count = 0\n for (const line of text.split('\\n')) {\n if (line.startsWith('>')) {\n flush()\n count++\n const id = /^>\\s*(\\S*)/.exec(line)![1] || `unnamed_${count}`\n current = { id, lines: [] }\n } else {\n current?.lines.push(line)\n }\n }\n flush()\n\n return records\n}\n\nexport function toRecords(input: string | FastaRecord[]) {\n return typeof input === 'string' ? splitFastaRecords(input) : input\n}\n", "import BaseMSA from './BaseMSA.ts'\nimport { fastaSniff, toRecords } from './fastaRecords.ts'\n\nimport type { FastaRecord } from './fastaRecords.ts'\n\n/**\n * A3M Format Parser\n *\n * The A3M format consists of aligned FASTA, in which alignments are shown with:\n * - Inserts as lowercase characters\n * - Matches as uppercase characters\n * - Deletions as '-'\n * - Gaps aligned to inserts as '.'\n *\n * Note that gaps aligned to inserts can be omitted in the A3M format.\n *\n * Example:\n * >query\n * ETESMKTVRIREKIKKFLGDRPRNTAEILEHINSTMRHGTTSQQLGNVLSKDKDIVKVGYIKRSGILSGGYDICEWATRNWVAEHCPEWTE\n * >seq1\n * ----MRTTRLRQKIKKFLNERGeANTTEILEHVNSTMRHGTTPQQLGNVLSKDKDILKVATTKRGGALSGRYEICVWTLRP-----------\n *\n * In the above, 'e' after 'G' in seq1 is a lowercase insert.\n *\n * @see https://yanglab.qd.sdu.edu.cn/trRosetta/msa_format.html\n */\n\nconst CODE_A = 65 // 'A'\nconst CODE_Z = 90 // 'Z'\nconst CODE_a = 97 // 'a'\nconst CODE_z = 122 // 'z'\nconst CODE_DASH = 45 // '-'\n\nfunction isLower(code: number): boolean {\n return code >= CODE_a && code <= CODE_z\n}\n\nfunction isMatch(code: number): boolean {\n return (code >= CODE_A && code <= CODE_Z) || code === CODE_DASH\n}\n\ninterface ParsedRow {\n // one entry per match column, in order\n matches: string[]\n // inserts[k] is the run of insert residues sitting immediately BEFORE match\n // column k, already uppercased; inserts[matches.length] holds the trailing\n // run. An insert must never consume a match column, or a row that opens with\n // an insert falls a column out of register with every other row.\n inserts: string[]\n}\n\nfunction parseRow(seq: string): ParsedRow {\n const matches: string[] = []\n const inserts = ['']\n\n for (const ch of seq) {\n const code = ch.charCodeAt(0)\n if (isMatch(code)) {\n matches.push(ch)\n inserts.push('')\n } else if (isLower(code)) {\n inserts[inserts.length - 1] += ch.toUpperCase()\n }\n // '.' is padding aligned to some other row's insert, and anything else is\n // unrecognized -- neither carries alignment information\n }\n\n return { matches, inserts }\n}\n\nexport default class A3mMSA extends BaseMSA {\n constructor(input: string | FastaRecord[]) {\n const records = toRecords(input)\n const expanded = expandA3M(records.map(r => r.seq))\n super(records.map((r, i) => [r.id, expanded[i]!]))\n }\n\n static sniff(input: string | FastaRecord[]): boolean {\n if (typeof input === 'string' && !fastaSniff(input)) {\n return false\n }\n\n const seqs = toRecords(input)\n .map(r => r.seq)\n .filter(s => !!s)\n\n if (seqs.length < 2) {\n return false\n }\n\n // A true aligned FASTA (e.g. impg's fasta-aln output from soft-masked\n // references) has all rows the same total length. A3M's defining feature is\n // variable-length rows, since lowercase inserts live outside the fixed match\n // grid. So equal-length rows are an alignment, not A3M, even when lowercase\n // soft-masking is present.\n if (new Set(seqs.map(s => s.length)).size === 1) {\n return false\n }\n\n let hasLowercase = false\n let matchCount: number | undefined\n for (const seq of seqs) {\n let matches = 0\n for (let i = 0; i < seq.length; i++) {\n const code = seq.charCodeAt(i)\n if (isMatch(code)) {\n matches++\n } else if (isLower(code)) {\n hasLowercase = true\n }\n }\n if (matchCount !== undefined && matches !== matchCount) {\n return false\n }\n matchCount = matches\n }\n return hasLowercase\n }\n}\n\n/**\n * Expand A3M rows into a rectangular alignment: every insert slot is widened to\n * the longest insert any row places there, and rows without one are padded with\n * '.' so all rows stay in register.\n */\nfunction expandA3M(rawSeqs: string[]): string[] {\n const rows = rawSeqs.map(parseRow)\n // a loop, not Math.max(...): an a3m from an hhblits search routinely carries\n // six figures of hits, and spreading one argument per row throws\n // \"Maximum call stack size exceeded\" somewhere past ~125k of them\n let numPositions = 0\n for (const { matches } of rows) {\n numPositions = Math.max(numPositions, matches.length)\n }\n\n // one insert slot before each match column, plus one trailing slot\n const maxInserts = new Array<number>(numPositions + 1).fill(0)\n for (const { inserts } of rows) {\n for (const [pos, ins] of inserts.entries()) {\n maxInserts[pos] = Math.max(maxInserts[pos]!, ins.length)\n }\n }\n\n return rows.map(({ matches, inserts }) => {\n const result: string[] = []\n for (let pos = 0; pos <= numPositions; pos++) {\n const ins = inserts[pos] ?? ''\n result.push(ins, '.'.repeat(maxInserts[pos]! - ins.length))\n if (pos < numPositions) {\n // a row with fewer match columns than the widest is padded out\n result.push(matches[pos] ?? '-')\n }\n }\n return result.join('')\n })\n}\n", "export function parseVersion(line: string) {\n const res = /\\(?(\\d+(\\.\\d+)+)\\)?/.exec(line)\n return res && res.length > 1 ? res[1] : ''\n}\nexport function parseHeader(info: string) {\n const knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign']\n\n if (!knownHeaders.some(l => info.startsWith(l))) {\n console.warn(\n `${info} is not a known CLUSTAL header: ${knownHeaders.join(\n ',',\n )}, proceeding but could indicate an issue`,\n )\n }\n const version = parseVersion(info)\n return { info, version }\n}\n\nexport function getFirstNonEmptyLine(arr: Iterator<string>): string {\n // There should be two blank lines after the header line\n let line = arr.next()\n while (!line.done && line.value.trim() === '') {\n line = arr.next()\n }\n return line.value!\n}\n\nexport function getSeqBounds(line: string) {\n const fields = line.split(/\\s+/)\n const temp = line.slice(fields[0]!.length)\n const s = fields[0]!.length + temp.indexOf(fields[1]!)\n const e = s + fields[1]!.length\n return [s, e] as const\n}\n\n// Use the first block to get the sequence identifiers\nexport function parseBlock(arr: Iterator<string>) {\n let line = getFirstNonEmptyLine(arr)\n const block = []\n let consensusLine = ''\n if (!line) {\n return undefined\n }\n\n while (line) {\n if (line.startsWith(' ')) {\n consensusLine = line\n } else {\n block.push(line)\n }\n line = arr.next().value\n }\n const [start, end] = getSeqBounds(block[0]!)\n const fields = block.map(s => s.split(/\\s+/))\n const ids = fields.map(s => s[0]!)\n const seqs = block.map(s => s.slice(start, end))\n let consensus = consensusLine.slice(start, end)\n\n // handle if the consensus trailing whitespace got trimmed\n const remainder = seqs[0]!.length - consensus.length\n if (remainder) {\n consensus += ' '.repeat(remainder)\n }\n return {\n ids,\n seqs,\n consensus,\n }\n}\n\nexport function parseBlocks(arr: Iterator<string>) {\n let block\n const res = parseBlock(arr)\n if (res !== undefined) {\n while ((block = parseBlock(arr))) {\n for (let i = 0; i < block.seqs.length; i++) {\n res.seqs[i] += block.seqs[i]!\n }\n res.consensus += block.consensus\n }\n }\n return res\n}\n", "import { parsePairwiseBlocks } from './pairwise.ts'\nimport { parseBlocks, parseHeader, getFirstNonEmptyLine } from './util.ts'\n\nexport function parseClustalIter(arr: Iterator<string>) {\n const line = getFirstNonEmptyLine(arr)\n if (!line) {\n throw new Error('Empty file received')\n }\n const header = parseHeader(line)\n\n const res = parseBlocks(arr)\n if (res === undefined) {\n throw new Error('No blocks parsed')\n }\n\n const alns = res.seqs.map((n, index) => ({ id: res.ids[index]!, seq: n }))\n const { consensus } = res\n if (consensus.length !== alns[0]!.seq.length) {\n throw new Error(\n `Consensus length != sequence length. Con ${consensus.length} seq ${alns[0]!.seq.length}`,\n )\n }\n\n return { consensus, alns, header }\n}\n\nexport interface Row {\n id: string\n seq: string\n}\n\nexport function parse(contents: string) {\n const iter = contents.split('\\n')[Symbol.iterator]()\n return parseClustalIter(iter)\n}\n\nexport function parsePairwise(contents: string) {\n const filtered = contents\n .split('\\n')\n .filter(f => !f.startsWith('#'))\n .join('\\n')\n\n const res = parsePairwiseBlocks(filtered.split('\\n')[Symbol.iterator]())\n if (res === undefined) {\n throw new Error('No blocks parsed')\n }\n\n const alns = res.seqs.map((n, index) => ({ id: res.ids[index]!, seq: n }))\n const { consensus } = res\n const firstAln = alns[0]\n if (!firstAln) {\n throw new Error('No alignments found')\n }\n if (consensus.length !== firstAln.seq.length) {\n throw new Error(\n `Consensus length !== sequence length. Con ${consensus.length} seq ${firstAln.seq.length}`,\n )\n }\n if (alns.length !== 2) {\n throw new Error(\n `Expected exactly 2 sequences in pairwise alignment, got ${alns.length}`,\n )\n }\n return {\n consensus,\n alns: alns as [Row, Row],\n }\n}\n", "import { parse } from 'clustal-js'\n\nimport BaseMSA from './BaseMSA.ts'\n\nexport default class ClustalMSA extends BaseMSA {\n private MSA: ReturnType<typeof parse>\n\n constructor(text: string) {\n const msa = parse(text)\n super(msa.alns.map(aln => [aln.id, aln.seq]))\n this.MSA = msa\n }\n\n getHeader() {\n return this.MSA.header\n }\n\n get seqConsensus() {\n return this.MSA.consensus\n }\n}\n", "export interface Row {\n id: string\n seq: string\n}\n\nexport function parseEmfAln(contents: string) {\n const lines = contents\n .split('\\n')\n .map(f => f.trim())\n .filter(f => !!f)\n const seqs = []\n const alns = []\n for (const line of lines) {\n if (line.startsWith('SEQ')) {\n seqs.push(line)\n } else if (line.startsWith('DATA')) {\n continue\n } else if (line.startsWith('//')) {\n break\n } else {\n alns.push(line)\n }\n }\n const arr = seqs.map(s => {\n const [, species, protein, chr, start, end, strand, geneId, unknown] =\n s.split(' ')\n return {\n species,\n protein,\n chr,\n start: +start,\n end: +end,\n strand: +strand,\n geneId,\n unknown,\n seq: '',\n }\n })\n for (const aln of alns) {\n for (let j = 0; j < seqs.length; j++) {\n arr[j].seq += aln[j]\n }\n }\n return arr\n}\n\nexport function parseEmfTree(contents: string) {\n const lines = contents\n .split('\\n')\n .map(f => f.trim())\n .filter(f => !!f)\n const seqs = []\n let tree = ''\n for (const line of lines) {\n if (line.startsWith('SEQ')) {\n seqs.push(line)\n } else if (line.startsWith('DATA')) {\n continue\n } else if (line.startsWith('//')) {\n break\n } else {\n tree = line\n }\n }\n const arr = seqs.map(s => {\n const [, species, protein, chr, start, end, strand, geneId, unknown] =\n s.split(' ')\n return {\n species,\n protein,\n chr,\n start: +start,\n end: +end,\n strand: +strand,\n geneId,\n unknown,\n }\n })\n\n return { tree, seqs: arr }\n}\n", "import { parseEmfAln } from 'emf-js'\n\nimport BaseMSA from './BaseMSA.ts'\n\nexport default class EmfMSA extends BaseMSA {\n constructor(text: string) {\n super(parseEmfAln(text).map(aln => [aln.protein, aln.seq]))\n }\n}\n", "import BaseMSA from './BaseMSA.ts'\nimport { toRecords } from './fastaRecords.ts'\n\nimport type { FastaRecord } from './fastaRecords.ts'\n\nexport default class FastaMSA extends BaseMSA {\n // Newick tools write a colon in a name as an underscore\n private colonNormalized = new Map<string, string>()\n\n constructor(input: string | FastaRecord[]) {\n const records = toRecords(input)\n super(records.map(r => [r.id, r.seq]))\n for (const { id } of records) {\n if (id.includes(':')) {\n this.colonNormalized.set(id.replaceAll(':', '_'), id)\n }\n }\n }\n\n getRow(name: string) {\n return (\n this.rows.get(name) ??\n this.rows.get(this.colonNormalized.get(name) ?? '') ??\n ''\n )\n }\n}\n", "import { parseNewick } from '@gmod/newick'\n\nimport type { NewickNode } from '@gmod/newick'\n\n/**\n * Newick parsing for phylogenetic trees.\n *\n * `postParenNumeric: 'name'` is the whole reason this wrapper exists. A bare\n * number after a `)` is an internal node label in standard Newick -- typically a\n * bootstrap support value -- but `@gmod/hclust` reuses that slot for a cluster's\n * merge height, and the parser's default guesses between the two by whether the\n * tree carries any `:` branch length. Everything reaching this package is a\n * phylogeny (newick, the tree embedded in Stockholm `#=GF NH`, EMF, ASN.1), so\n * the guess is settled here instead: reading `((A,B)95,(C,D)80);` as lengths\n * would draw a phylogram scaled by support values.\n */\nexport default function parse(s: string): NewickNode {\n return parseNewick(s, { postParenNumeric: 'name' })\n}\n", "/**\n * Stockholm format parser\n * Based on stockholm-js by Ian Holmes\n * Rewritten in TypeScript\n */\n\nexport interface StockholmData {\n gf: Record<string, string[]>\n gc: Record<string, string>\n gs: Record<string, Record<string, string[]>>\n gr: Record<string, Record<string, string>>\n seqname: string[]\n seqdata: Record<string, string>\n}\n\nfunction createStockholm(): StockholmData {\n return {\n gf: Object.create(null),\n gc: Object.create(null),\n gs: Object.create(null),\n gr: Object.create(null),\n seqname: [],\n seqdata: Object.create(null),\n }\n}\n\n// records before a \"# STOCKHOLM 1.0\" header are an error in strict mode,\n// otherwise they implicitly start a new alignment\nfunction ensureStock(\n stock: StockholmData | null,\n strict: boolean,\n): StockholmData {\n if (stock) {\n return stock\n }\n if (strict) {\n throw new Error('No format header: # STOCKHOLM 1.0')\n }\n return createStockholm()\n}\n\nconst formatStartRegex = /^# STOCKHOLM 1.0/\nconst formatEndRegex = /^\\/\\/\\s*$/\nconst gfRegex = /^#=GF\\s+(\\S+)\\s+(.*?)\\s*$/\nconst gcRegex = /^#=GC\\s+(\\S+)\\s+(.*?)\\s*$/\nconst gsRegex = /^#=GS\\s+(\\S+)\\s+(\\S+)\\s+(.*?)\\s*$/\nconst grRegex = /^#=GR\\s+(\\S+)\\s+(\\S+)\\s+(.*?)\\s*$/\n// a sequence line is \"<name> <residues>\". The leading [^#\\s] guards against a\n// two-word comment (\"# note\") being taken as a sequence named '#'; every\n// meaningful '#' line is a #=GF/#=GC/#=GS/#=GR record already matched above.\nconst lineRegex = /^\\s*([^#\\s]\\S*)\\s+(\\S+)\\s*$/\nconst nonwhiteRegex = /\\S/\n\nexport function sniff(text: string): boolean {\n return formatStartRegex.test(text)\n}\n\nexport function parseAll(\n text: string,\n opts?: { strict?: boolean },\n): StockholmData[] {\n const options = opts ?? {}\n const db: StockholmData[] = []\n let stock: StockholmData | null = null\n // one tree spans consecutive `#=GF NH` lines, so a `#=GF TN` naming the\n // next tree, or any other #=GF line, ends it\n let treeContinues = false\n\n const lines = text.split('\\n')\n for (const line of lines) {\n let match: RegExpExecArray | null\n\n if (formatStartRegex.test(line)) {\n if (stock) {\n db.push(stock)\n }\n stock = createStockholm()\n treeContinues = false\n } else if (formatEndRegex.test(line)) {\n if (stock) {\n db.push(stock)\n }\n stock = null\n } else if ((match = gfRegex.exec(line))) {\n stock = ensureStock(stock, !!options.strict)\n const tag = match[1]!\n const values = (stock.gf[tag] ??= [])\n if (tag === 'NH' && treeContinues && values.length > 0) {\n values[values.length - 1] += match[2]!\n } else {\n values.push(match[2]!)\n }\n treeContinues = tag === 'NH'\n } else if ((match = gcRegex.exec(line))) {\n stock = ensureStock(stock, !!options.strict)\n stock.gc[match[1]!] = (stock.gc[match[1]!] ?? '') + match[2]!\n } else if ((match = gsRegex.exec(line))) {\n stock = ensureStock(stock, !!options.strict)\n const byName = (stock.gs[match[2]!] ??= Object.create(null))\n ;(byName[match[1]!] ??= []).push(match[3]!)\n } else if ((match = grRegex.exec(line))) {\n stock = ensureStock(stock, !!options.strict)\n const byName = (stock.gr[match[2]!] ??= Object.create(null))\n byName[match[1]!] = (byName[match[1]!] ?? '') + match[3]!\n } else if ((match = lineRegex.exec(line))) {\n stock = ensureStock(stock, !!options.strict)\n const seqname = match[1]!\n const seqdata = match[2]!\n if (stock.seqdata[seqname] === undefined) {\n stock.seqdata[seqname] = ''\n stock.seqname.push(seqname)\n }\n stock.seqdata[seqname] += seqdata\n } else if (nonwhiteRegex.test(line)) {\n if (options.strict) {\n throw new Error('Malformed line')\n }\n }\n }\n\n if (stock) {\n db.push(stock)\n }\n\n return db\n}\n\nexport function parse(\n text: string,\n opts?: { strict?: boolean },\n): StockholmData {\n const db = parseAll(text, opts)\n if (db.length === 0) {\n throw new Error('No alignments found')\n }\n if (db.length > 1) {\n throw new Error('More than one alignment found')\n }\n return db[0]!\n}\n", "import { generateNodeIds } from '../util.ts'\nimport BaseMSA from './BaseMSA.ts'\nimport parseNewick from './parseNewick.ts'\nimport { parseAll } from './stockholmParser.ts'\n\nimport type { MSATrack, NodeWithIds } from '../types.ts'\nimport type { StockholmData } from './stockholmParser.ts'\n\nexport default class StockholmMSA extends BaseMSA {\n private data: StockholmData[]\n private MSA: StockholmData\n\n constructor(text: string, currentAlignment: number) {\n const res = parseAll(text)\n const aln = res[currentAlignment] ?? res[0]\n if (!aln) {\n throw new Error('No alignments found in Stockholm file')\n }\n super(aln.seqname.map(name => [name, aln.seqdata[name] ?? '']))\n this.data = res\n this.MSA = aln\n }\n\n getMSA() {\n return this.MSA\n }\n\n get alignmentNames() {\n return this.data.map((aln, idx) => aln.gf.DE?.[0] ?? `Alignment ${idx + 1}`)\n }\n\n getHeader() {\n const acEntries = this.MSA.gs.AC ?? {}\n const drEntries = this.MSA.gs.DR ?? {}\n return {\n General: this.MSA.gf,\n Accessions: Object.fromEntries(\n Object.entries(acEntries).map(([k, v]) => [k, v[0]]),\n ),\n Dbxref: Object.fromEntries(\n Object.entries(drEntries).map(([k, v]) => [k, v.join('; ')]),\n ),\n }\n }\n\n getRowData(rowName: string) {\n return {\n name: rowName,\n accession: this.MSA.gs.AC?.[rowName]?.[0],\n dbxref: this.MSA.gs.DR?.[rowName]?.join('; '),\n }\n }\n\n getStructures() {\n const pdbRegex = /PDB; +(\\S+) +([^;\\s]+); *(-?[0-9]+)-(-?[0-9]+)/\n const drEntries = this.MSA.gs.DR ?? {}\n const result: Record<\n string,\n { pdb: string; chain: string; startPos: number; endPos: number }[]\n > = {}\n for (const [id, drList] of Object.entries(drEntries)) {\n for (const dr of drList) {\n const match = pdbRegex.exec(dr)\n if (match) {\n ;(result[id] ??= []).push({\n pdb: match[1]!.toLowerCase(),\n chain: match[2]!,\n startPos: +match[3]!,\n endPos: +match[4]!,\n })\n }\n }\n }\n return result\n }\n\n getTree(): NodeWithIds {\n const tree = this.MSA.gf.NH?.[0]\n return tree ? generateNodeIds(parseNewick(tree)) : super.getTree()\n }\n\n get seqConsensus() {\n return this.MSA.gc.seq_cons\n }\n\n get secondaryStructureConsensus() {\n return this.MSA.gc.SS_cons\n }\n\n /**\n * One text track per `#=GC` line, and one per `#=GR` line that stays hidden\n * until asked for: a Pfam seed carries a few per-row active-site lines, but\n * an Rfam family carries a structure line for every row with a PDB entry.\n */\n get tracks(): MSATrack[] {\n const { seq_cons, SS_cons, ...otherGc } = this.MSA.gc\n return [\n {\n id: 'seqConsensus',\n name: 'Sequence consensus',\n data: seq_cons,\n customColorScheme: {},\n },\n {\n id: 'secondaryStruct',\n name: 'Secondary-structure',\n data: SS_cons,\n customColorScheme: wussColors,\n },\n ...Object.entries(otherGc).map(([tag, data]) => ({\n id: `gc-${tag}`,\n name: tag,\n data,\n customColorScheme: structureColors(tag),\n })),\n ...Object.entries(this.MSA.gr).flatMap(([tag, byRow]) =>\n Object.entries(byRow).map(([row, data]) => ({\n id: `gr-${row}-${tag}`,\n name: `${row} ${tag}`,\n data,\n customColorScheme: structureColors(tag),\n defaultOff: true,\n })),\n ),\n ]\n }\n}\n\n// WUSS writes base-paired columns as open/close brackets of several nesting\n// types (<>, (), [], {}); coloring every open one way and every close the other\n// highlights each helix, including the tRNA acceptor stem written with parens\nconst wussColors: Record<string, string> = {\n '<': 'lightblue',\n '(': 'lightblue',\n '[': 'lightblue',\n '{': 'lightblue',\n '>': 'pink',\n ')': 'pink',\n ']': 'pink',\n '}': 'pink',\n}\n\n// `SS`, and Rfam's per-structure `2GIS_A_SS`\nfunction structureColors(tag: string) {\n return tag === 'SS' || tag.endsWith('_SS') ? wussColors : {}\n}\n\nexport { sniff as stockholmSniff } from './stockholmParser.ts'\n", "import A3mMSA from './A3mMSA.ts'\nimport ClustalMSA from './ClustalMSA.ts'\nimport EmfMSA from './EmfMSA.ts'\nimport FastaMSA from './FastaMSA.ts'\nimport StockholmMSA, { stockholmSniff } from './StockholmMSA.ts'\nimport { fastaSniff, splitFastaRecords } from './fastaRecords.ts'\n\nexport { parseEmfTree } from 'emf-js'\nexport { default as parseNewick } from './parseNewick.ts'\n\nexport type MSAParserType =\n | StockholmMSA\n | A3mMSA\n | FastaMSA\n | EmfMSA\n | ClustalMSA\n\nexport type MSAFormat = 'stockholm' | 'a3m' | 'fasta' | 'emf' | 'clustal'\n\nconst htmlPage = /^<(!doctype\\s+html|html[\\s>])/i\nconst clustalHeader = /^(CLUSTAL|MUSCLE|PROBCONS|MSAPROBS|Kalign)/i\n\n// A caller that knows the format, such as impg emitting fasta-aln, passes\n// `format` to skip sniffing, which cannot always tell FASTA from A3M\nexport function parseMSA(\n input: string,\n currentAlignment = 0,\n format?: MSAFormat,\n): MSAParserType {\n const text = input\n .replace(/^\\uFEFF/, '')\n .replaceAll(/\\r\\n?/g, '\\n')\n .trimStart()\n if (htmlPage.test(text)) {\n throw new Error(\n 'Received an HTML page, not an alignment. Check that the URL points at the file itself',\n )\n }\n if (format === 'stockholm') {\n return new StockholmMSA(text, currentAlignment)\n }\n if (format === 'a3m') {\n return new A3mMSA(text)\n }\n if (format === 'fasta') {\n return new FastaMSA(text)\n }\n if (format === 'emf') {\n return new EmfMSA(text)\n }\n if (format === 'clustal') {\n return new ClustalMSA(text)\n }\n if (stockholmSniff(text)) {\n return new StockholmMSA(text, currentAlignment)\n }\n if (fastaSniff(text)) {\n const records = splitFastaRecords(text)\n return A3mMSA.sniff(records) ? new A3mMSA(records) : new FastaMSA(records)\n }\n if (text.startsWith('SEQ')) {\n return new EmfMSA(text)\n }\n if (clustalHeader.test(text)) {\n return new ClustalMSA(text)\n }\n const firstLine = text.split('\\n', 1)[0]!.slice(0, 80)\n throw new Error(\n firstLine\n ? `Unrecognized alignment format: expected FASTA, A3M, Stockholm, Clustal or EMF, but the first line reads \"${firstLine}\"`\n : 'The alignment file is empty',\n )\n}\n\n/**\n * Get ungapped sequence from an aligned row\n */\nexport function getUngappedSequence(alignedSeq: string): string {\n return alignedSeq.replaceAll(/[.-]/g, '')\n}\n\nexport { default as A3mMSA } from './A3mMSA.ts'\nexport { default as ClustalMSA } from './ClustalMSA.ts'\nexport { default as EmfMSA } from './EmfMSA.ts'\nexport { default as FastaMSA } from './FastaMSA.ts'\nexport { default as StockholmMSA, stockholmSniff } from './StockholmMSA.ts'\n", "import type { GFFRecord } from '../types.ts'\n\n// decodeURIComponent throws on a stray '%' (common in unescaped GFF3 values);\n// fall back to the raw value rather than aborting the whole parse\nfunction safeDecode(val: string) {\n try {\n return decodeURIComponent(val)\n } catch {\n return val\n }\n}\n\n// InterProScan quotes some of its values (Ontology_term=\"GO:0008652\",\n// Dbxref=\"InterPro:IPR001048\"), and the quotes are not part of the term\nfunction unquote(val: string) {\n return val.replace(/^\"(.*)\"$/, '$1')\n}\n\nfunction parseAttributes(col9?: string): Record<string, string> {\n if (!col9) {\n return {}\n }\n const attributes: Record<string, string> = {}\n for (const field of col9.split(';')) {\n const eq = field.indexOf('=')\n const key = field.slice(0, eq).trim()\n const val = field.slice(eq + 1)\n // split on comma (the GFF3 multi-value separator) BEFORE decoding, so a\n // literal comma encoded as %2C survives the split and isn't mistaken\n // for a separator\n if (eq !== -1 && key && val) {\n attributes[key] = val\n .split(',')\n .map(v => unquote(safeDecode(v).trim()))\n .join(' ')\n }\n }\n return attributes\n}\n\nexport function parseGFF(str?: string): GFFRecord[] {\n if (!str) {\n return []\n }\n const lines: string[] = []\n for (const raw of str.split('\\n')) {\n const line = raw.trim()\n // InterProScan appends the sequences it scanned; every line past this is\n // FASTA, and reading it as features gave rows named \">P51587\"\n if (line.startsWith('##FASTA')) {\n break\n }\n // a feature is nine tab-separated columns, eight of them mandatory; a\n // FASTA line in a file that omitted the ##FASTA directive is one\n if (line && !line.startsWith('#') && line.split('\\t').length >= 8) {\n lines.push(line)\n }\n }\n return lines.map(f => {\n const parts = f.split('\\t')\n const [seq_id, source, type, start, end, score, strand, phase] = parts\n const col9 = parts[8]\n\n // attributes first, so a column-9 key colliding with a core column (e.g.\n // \"start=\") can't turn a number field into a string\n return {\n ...parseAttributes(col9),\n seq_id: safeDecode(seq_id ?? ''),\n source: source ?? '',\n type: type ?? '',\n start: Number(start) || 0,\n end: Number(end) || 0,\n score: Number(score) || 0,\n strand: strand ?? '.',\n phase: phase ?? '.',\n }\n })\n}\n", "import type { Annotation, GFFRecord } from '../types.ts'\n\n// Feature types drawn with an arrowhead for their strand. A prokaryotic GFF\n// writes each gene as a CDS row. Exon, UTR and domain features stay blocks,\n// since an exon is a segment of one transcript.\nconst GENE_LEVEL_TYPES = new Set([\n 'gene',\n 'CDS',\n 'pseudogene',\n 'mRNA',\n 'transcript',\n 'primary_transcript',\n 'ncRNA',\n 'tRNA',\n 'rRNA',\n 'snRNA',\n 'snoRNA',\n 'miRNA',\n 'lnc_RNA',\n])\n\n// +1/-1 for a stranded gene-level feature, undefined otherwise (which the\n// renderer draws as a plain block).\nfunction geneStrand({ type, strand }: GFFRecord): number | undefined {\n const directional = strand === '+' ? 1 : strand === '-' ? -1 : undefined\n return GENE_LEVEL_TYPES.has(type) ? directional : undefined\n}\n\n// The nine columns a feature line holds; every other key of a record came from\n// column 9\nconst GFF_COLUMNS = new Set([\n 'seq_id',\n 'source',\n 'type',\n 'start',\n 'end',\n 'score',\n 'strand',\n 'phase',\n])\n\nfunction attributesOf(record: GFFRecord) {\n const entries = Object.entries(record).filter(\n ([key, value]) => !GFF_COLUMNS.has(key) && typeof value === 'string',\n ) as [string, string][]\n return entries.length > 0 ? Object.fromEntries(entries) : undefined\n}\n\n// JBrowse and IGV read an RGB triple as well as a named or hex color, and the\n// attribute parser has already turned `255,0,0` into `255 0 0` by splitting on\n// the GFF3 multi-value comma\nconst RGB_TRIPLE = /^(\\d{1,3})[\\s,]+(\\d{1,3})[\\s,]+(\\d{1,3})$/\n\nfunction cssColor(record: GFFRecord) {\n const value = (record.color ??\n record.colour ??\n record.Color ??\n record.Colour) as string | undefined\n if (!value) {\n return undefined\n }\n const triple = RGB_TRIPLE.exec(value.trim())\n return triple ? `rgb(${triple[1]},${triple[2]},${triple[3]})` : value.trim()\n}\n\n// InterProScan describes the sequence it scanned before listing the matches\n// against it. Those lines span the whole row and carry no signature, so they\n// would draw a full-width block labelled by an md5.\nconst WHOLE_SEQUENCE_TYPES = new Set(['polypeptide', 'nucleic_acid'])\n\n/**\n * Convert GFF records to annotations, one per record, in file order.\n *\n * InterProScan's own GFF3 output falls out of the same mapping: it writes\n * `Name` as the signature accession and `signature_desc` as its human-readable\n * name, with domain positions 1-based.\n */\nexport function gffToAnnotations(gffRecords: GFFRecord[]): Annotation[] {\n return gffRecords\n .filter(record => !WHOLE_SEQUENCE_TYPES.has(record.type))\n .map(record => {\n const accession =\n (record.Name as string) ||\n (record.ID as string) ||\n `${record.source}_${record.start}_${record.end}`\n const name =\n (record.signature_desc as string) ||\n (record.Name as string) ||\n accession\n return {\n id: record.seq_id,\n accession,\n name,\n // not Ontology_term: a GO id list is what the domain is annotated\n // with, not what it is, and reading it first labelled every\n // InterProScan domain \"GO:0003677 GO:0006281\"\n description:\n (record.description as string) ||\n (record.Note as string) ||\n (record.signature_desc as string) ||\n name,\n featureType: record.type,\n start: record.start,\n end: record.end,\n strand: geneStrand(record),\n color: cssColor(record),\n attributes: attributesOf(record),\n }\n })\n}\n"],
5
+ "mappings": "wCAYM,SAAUA,EAAmBC,EAA8B,CAC/D,OAAO,OAAO,YACZA,EACG,IAAIC,GAAK,CAACA,EAAE,KAAK,CAAC,GAAG,GAAIA,CAAC,CAAU,EACpC,OAAQ,GAA0C,EAAE,CAAC,IAAM,MAAS,CAAC,CAE5E,CAYM,SAAUC,EACdF,EAA4C,CAE5C,OAAO,OAAO,QAAQA,CAAO,EAAE,QAAQ,CAAC,CAACG,EAAI,CAAE,QAAAC,CAAO,CAAE,IACtDA,EAAQ,QAAQ,CAAC,CAAE,UAAAC,EAAW,UAAAC,CAAS,IAAM,CAC3C,GAAM,CAAE,MAAAC,CAAK,EAAKF,EACZG,EAAYD,GAAO,WAAaF,EAAU,UAChD,GAAI,CAACG,EACH,MAAO,CAAA,EAET,IAAMC,EAAOF,GAAO,MAAQF,EAAU,MAAQG,EAC9C,OAAOF,EAAU,IAAI,CAAC,CAAE,MAAAI,EAAO,IAAAC,EAAK,OAAAC,CAAM,KAAQ,CAChD,GAAAT,EACA,UAAAK,EACA,KAAAC,EACA,YAAaF,GAAO,aAAeF,EAAU,aAAeI,EAC5D,MAAAC,EACA,IAAAC,EACA,OAAAC,GACA,CACJ,CAAC,CAAC,CAEN,CAMM,SAAUC,EACdC,EAA8B,CAE9B,OAAOZ,EAA0BH,EAAmBe,EAAS,OAAO,CAAC,CACvE,CCnDM,SAAUC,EACdC,EACAC,EAAmB,CAAA,EAAE,CAErB,MAAO,CACL,kBACA,GAAGA,EAAO,IAAIC,GAAQ,KAAKA,CAAI,EAAE,EACjC,GAAGF,EAAY,IAAIG,GAAa,CAC9B,GAAM,CAAE,UAAAC,EAAW,KAAAC,EAAM,YAAAC,EAAa,YAAAC,CAAW,EAAKJ,EAChD,CAAE,GAAAK,EAAI,MAAAC,EAAO,IAAAC,EAAK,OAAAC,CAAM,EAAKR,EACnC,MAAO,CACLK,EAAG,WAAW,aAAc,kBAAkB,EAC9C,eAKAD,GAAe,gBACfE,EACAC,EACA,IACAC,IAAW,OAAY,IAAMA,EAAS,EAAI,IAAM,IAChD,IACA,CACE,QAAQ,mBAAmBP,CAAS,CAAC,GACrC,kBAAkB,mBAAmBC,CAAI,CAAC,GAC1C,eAAe,mBAAmBC,CAAW,CAAC,IAC9C,KAAK,GAAG,GACV,KAAK,GAAI,CACb,CAAC,GACD,KAAK;CAAI,CACb,CCjCM,SAAUM,EAAoBC,EAAY,CAC9C,IAAMC,EAAUD,EAAK,UAAS,EAC9B,GAAI,CAACC,EAAQ,WAAW,GAAG,EACzB,OAAOD,EAET,IAAME,EAAiC,KAAK,MAAMD,CAAO,EACzD,OAAOE,EAAiBC,EAAkCF,CAAQ,CAAC,CACrE,CCJM,SAAUG,EACdC,EACAC,EAAS,OACTC,EAAQ,EAAC,CAET,IAAMC,EAAS,CAACC,EAAYC,KAA6B,CACvD,GAAGD,EACH,GAAAC,EACA,KAAMD,EAAK,MAAQC,EACnB,SAAU,CAAA,IAGNC,EAAOH,EAAOH,EAAM,GAAGC,CAAM,IAAIC,CAAK,EAAE,EACxCK,EAAQ,CAAC,CAAE,IAAKP,EAAM,IAAKM,EAAM,MAAAJ,CAAK,CAAE,EAC9C,KAAOK,EAAM,OAAS,GAAG,CACvB,GAAM,CAAE,IAAAC,EAAK,IAAAC,EAAK,MAAOC,CAAC,EAAKH,EAAM,IAAG,EACxC,GAAIC,EAAI,SAAU,CAChBC,EAAI,SAAWD,EAAI,SAAS,IAAI,CAACG,EAAOC,IACtCT,EAAOQ,EAAO,GAAGF,EAAI,EAAE,IAAIG,CAAC,IAAIF,EAAI,CAAC,EAAE,CAAC,EAE1C,OAAW,CAACE,EAAGD,CAAK,IAAKH,EAAI,SAAS,QAAO,EAC3CD,EAAM,KAAK,CAAE,IAAKI,EAAO,IAAKF,EAAI,SAASG,CAAC,EAAI,MAAOF,EAAI,CAAC,CAAE,CAElE,CACF,CACA,OAAOJ,CACT,CCpCA,IAA8BO,EAA9B,KAAqC,CACzB,KAAO,IAAI,IACb,MACA,MAMR,YAAYC,EAAyC,CACnD,OAAW,CAACC,EAAMC,CAAG,IAAKF,EACnB,KAAK,KAAK,IAAIC,CAAI,GACrB,KAAK,KAAK,IAAIA,EAAMC,CAAG,EAG3B,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,KAAI,CAAE,CACnC,CAEA,OAAOD,EAAY,CACjB,OAAO,KAAK,KAAK,IAAIA,CAAI,GAAK,EAChC,CAEA,UAAQ,CACN,OAAO,KAAK,KACd,CAOA,UAAQ,CACN,YAAK,QAAU,KAAK,SAAQ,EAAG,OAC7B,CAACE,EAAKF,IAAS,KAAK,IAAIE,EAAK,KAAK,OAAOF,CAAI,EAAE,MAAM,EACrD,CAAC,EAEI,KAAK,KACd,CAEA,SAAO,CACL,MAAO,CACL,GAAI,OACJ,KAAM,OACN,OAAQ,GACR,SAAU,KAAK,SAAQ,EAAG,IAAIA,IAAS,CACrC,GAAIA,EACJ,SAAU,CAAA,EACV,KAAAA,GACA,EAEN,CAEA,WACEG,EAAa,CAGf,CAEA,eAAa,CACX,MAAO,CAAA,CACT,CAEA,WAAS,CACP,MAAO,CAAA,CACT,CAEA,IAAI,gBAAc,CAChB,MAAO,CAAA,CACT,CAEA,IAAI,cAAY,CAEhB,CAEA,IAAI,6BAA2B,CAE/B,CAEA,IAAI,QAAM,CACR,MAAO,CAAA,CACT,GC5EI,SAAUC,EAAWC,EAAY,CACrC,MAAO,aAAa,KAAKA,CAAI,CAC/B,CAaM,SAAUC,EAAkBD,EAAY,CAC5C,IAAME,EAAyB,CAAA,EACzBC,EAAO,IAAI,IACbC,EAEEC,EAAQ,IAAK,CACbD,GAAW,CAACD,EAAK,IAAIC,EAAQ,EAAE,IACjCD,EAAK,IAAIC,EAAQ,EAAE,EACnBF,EAAQ,KAAK,CACX,GAAIE,EAAQ,GACZ,IAAKA,EAAQ,MAAM,KAAK,EAAE,EAAE,WAAW,MAAO,EAAE,EACjD,EAEL,EAEIE,EAAQ,EACZ,QAAWC,KAAQP,EAAK,MAAM;CAAI,EAC5BO,EAAK,WAAW,GAAG,GACrBF,EAAK,EACLC,IAEAF,EAAU,CAAE,GADD,aAAa,KAAKG,CAAI,EAAG,CAAC,GAAK,WAAWD,CAAK,GAC1C,MAAO,CAAA,CAAE,GAEzBF,GAAS,MAAM,KAAKG,CAAI,EAG5B,OAAAF,EAAK,EAEEH,CACT,CAEM,SAAUM,EAAUC,EAA6B,CACrD,OAAO,OAAOA,GAAU,SAAWR,EAAkBQ,CAAK,EAAIA,CAChE,CC3BA,IAAMC,EAAS,GACTC,EAAS,GACTC,EAAS,GACTC,EAAS,IACTC,GAAY,GAElB,SAASC,EAAQC,EAAY,CAC3B,OAAOA,GAAQJ,GAAUI,GAAQH,CACnC,CAEA,SAASI,EAAQD,EAAY,CAC3B,OAAQA,GAAQN,GAAUM,GAAQL,GAAWK,IAASF,EACxD,CAYA,SAASI,GAASC,EAAW,CAC3B,IAAMC,EAAoB,CAAA,EACpBC,EAAU,CAAC,EAAE,EAEnB,QAAWC,KAAMH,EAAK,CACpB,IAAMH,EAAOM,EAAG,WAAW,CAAC,EACxBL,EAAQD,CAAI,GACdI,EAAQ,KAAKE,CAAE,EACfD,EAAQ,KAAK,EAAE,GACNN,EAAQC,CAAI,IACrBK,EAAQA,EAAQ,OAAS,CAAC,GAAKC,EAAG,YAAW,EAIjD,CAEA,MAAO,CAAE,QAAAF,EAAS,QAAAC,CAAO,CAC3B,CAEA,IAAqBE,EAArB,cAAoCC,CAAO,CACzC,YAAYC,EAA6B,CACvC,IAAMC,EAAUC,EAAUF,CAAK,EACzBG,EAAWC,GAAUH,EAAQ,IAAI,GAAK,EAAE,GAAG,CAAC,EAClD,MAAMA,EAAQ,IAAI,CAAC,EAAGI,IAAM,CAAC,EAAE,GAAIF,EAASE,CAAC,CAAE,CAAC,CAAC,CACnD,CAEA,OAAO,MAAML,EAA6B,CACxC,GAAI,OAAOA,GAAU,UAAY,CAACM,EAAWN,CAAK,EAChD,MAAO,GAGT,IAAMO,EAAOL,EAAUF,CAAK,EACzB,IAAIQ,GAAKA,EAAE,GAAG,EACd,OAAOC,GAAK,CAAC,CAACA,CAAC,EAWlB,GATIF,EAAK,OAAS,GASd,IAAI,IAAIA,EAAK,IAAIE,GAAKA,EAAE,MAAM,CAAC,EAAE,OAAS,EAC5C,MAAO,GAGT,IAAIC,EAAe,GACfC,EACJ,QAAWjB,KAAOa,EAAM,CACtB,IAAIZ,EAAU,EACd,QAAS,EAAI,EAAG,EAAID,EAAI,OAAQ,IAAK,CACnC,IAAMH,EAAOG,EAAI,WAAW,CAAC,EACzBF,EAAQD,CAAI,EACdI,IACSL,EAAQC,CAAI,IACrBmB,EAAe,GAEnB,CACA,GAAIC,IAAe,QAAahB,IAAYgB,EAC1C,MAAO,GAETA,EAAahB,CACf,CACA,OAAOe,CACT,GAQF,SAASN,GAAUQ,EAAiB,CAClC,IAAMC,EAAOD,EAAQ,IAAInB,EAAQ,EAI7BqB,EAAe,EACnB,OAAW,CAAE,QAAAnB,CAAO,IAAMkB,EACxBC,EAAe,KAAK,IAAIA,EAAcnB,EAAQ,MAAM,EAItD,IAAMoB,EAAa,IAAI,MAAcD,EAAe,CAAC,EAAE,KAAK,CAAC,EAC7D,OAAW,CAAE,QAAAlB,CAAO,IAAMiB,EACxB,OAAW,CAACG,EAAKC,CAAG,IAAKrB,EAAQ,QAAO,EACtCmB,EAAWC,CAAG,EAAI,KAAK,IAAID,EAAWC,CAAG,EAAIC,EAAI,MAAM,EAI3D,OAAOJ,EAAK,IAAI,CAAC,CAAE,QAAAlB,EAAS,QAAAC,CAAO,IAAM,CACvC,IAAMsB,EAAmB,CAAA,EACzB,QAASF,EAAM,EAAGA,GAAOF,EAAcE,IAAO,CAC5C,IAAMC,EAAMrB,EAAQoB,CAAG,GAAK,GAC5BE,EAAO,KAAKD,EAAK,IAAI,OAAOF,EAAWC,CAAG,EAAKC,EAAI,MAAM,CAAC,EACtDD,EAAMF,GAERI,EAAO,KAAKvB,EAAQqB,CAAG,GAAK,GAAG,CAEnC,CACA,OAAOE,EAAO,KAAK,EAAE,CACvB,CAAC,CACH,CC3JM,SAAUC,GAAaC,EAAY,CACvC,IAAMC,EAAM,sBAAsB,KAAKD,CAAI,EAC3C,OAAOC,GAAOA,EAAI,OAAS,EAAIA,EAAI,CAAC,EAAI,EAC1C,CACM,SAAUC,EAAYC,EAAY,CACtC,IAAMC,EAAe,CAAC,UAAW,WAAY,SAAU,WAAY,QAAQ,EAEtEA,EAAa,KAAKC,GAAKF,EAAK,WAAWE,CAAC,CAAC,GAC5C,QAAQ,KACN,GAAGF,CAAI,mCAAmCC,EAAa,KACrD,GAAG,CACJ,0CAA0C,EAG/C,IAAME,EAAUP,GAAaI,CAAI,EACjC,MAAO,CAAE,KAAAA,EAAM,QAAAG,CAAO,CACxB,CAEM,SAAUC,EAAqBC,EAAqB,CAExD,IAAIR,EAAOQ,EAAI,KAAI,EACnB,KAAO,CAACR,EAAK,MAAQA,EAAK,MAAM,KAAI,IAAO,IACzCA,EAAOQ,EAAI,KAAI,EAEjB,OAAOR,EAAK,KACd,CAEM,SAAUS,GAAaT,EAAY,CACvC,IAAMU,EAASV,EAAK,MAAM,KAAK,EACzBW,EAAOX,EAAK,MAAMU,EAAO,CAAC,EAAG,MAAM,EACnCE,EAAIF,EAAO,CAAC,EAAG,OAASC,EAAK,QAAQD,EAAO,CAAC,CAAE,EAC/CG,EAAID,EAAIF,EAAO,CAAC,EAAG,OACzB,MAAO,CAACE,EAAGC,CAAC,CACd,CAGM,SAAUC,EAAWN,EAAqB,CAC9C,IAAIR,EAAOO,EAAqBC,CAAG,EAC7BO,EAAQ,CAAA,EACVC,EAAgB,GACpB,GAAI,CAAChB,EACH,OAGF,KAAOA,GACDA,EAAK,WAAW,GAAG,EACrBgB,EAAgBhB,EAEhBe,EAAM,KAAKf,CAAI,EAEjBA,EAAOQ,EAAI,KAAI,EAAG,MAEpB,GAAM,CAACS,EAAOC,CAAG,EAAIT,GAAaM,EAAM,CAAC,CAAE,EAErCI,EADSJ,EAAM,IAAIH,GAAKA,EAAE,MAAM,KAAK,CAAC,EACzB,IAAIA,GAAKA,EAAE,CAAC,CAAE,EAC3BQ,EAAOL,EAAM,IAAIH,GAAKA,EAAE,MAAMK,EAAOC,CAAG,CAAC,EAC3CG,EAAYL,EAAc,MAAMC,EAAOC,CAAG,EAGxCI,EAAYF,EAAK,CAAC,EAAG,OAASC,EAAU,OAC9C,OAAIC,IACFD,GAAa,IAAI,OAAOC,CAAS,GAE5B,CACL,IAAAH,EACA,KAAAC,EACA,UAAAC,EAEJ,CAEM,SAAUE,EAAYf,EAAqB,CAC/C,IAAIO,EACEd,EAAMa,EAAWN,CAAG,EAC1B,GAAIP,IAAQ,OACV,KAAQc,EAAQD,EAAWN,CAAG,GAAI,CAChC,QAASgB,EAAI,EAAGA,EAAIT,EAAM,KAAK,OAAQS,IACrCvB,EAAI,KAAKuB,CAAC,GAAKT,EAAM,KAAKS,CAAC,EAE7BvB,EAAI,WAAac,EAAM,SACzB,CAEF,OAAOd,CACT,CC/EM,SAAUwB,GAAiBC,EAAqB,CACpD,IAAMC,EAAOC,EAAqBF,CAAG,EACrC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,qBAAqB,EAEvC,IAAME,EAASC,EAAYH,CAAI,EAEzBI,EAAMC,EAAYN,CAAG,EAC3B,GAAIK,IAAQ,OACV,MAAM,IAAI,MAAM,kBAAkB,EAGpC,IAAME,EAAOF,EAAI,KAAK,IAAI,CAACG,EAAGC,KAAW,CAAE,GAAIJ,EAAI,IAAII,CAAK,EAAI,IAAKD,CAAC,EAAG,EACnE,CAAE,UAAAE,CAAS,EAAKL,EACtB,GAAIK,EAAU,SAAWH,EAAK,CAAC,EAAG,IAAI,OACpC,MAAM,IAAI,MACR,4CAA4CG,EAAU,MAAM,QAAQH,EAAK,CAAC,EAAG,IAAI,MAAM,EAAE,EAI7F,MAAO,CAAE,UAAAG,EAAW,KAAAH,EAAM,OAAAJ,CAAM,CAClC,CAOM,SAAUQ,EAAMC,EAAgB,CACpC,IAAMC,EAAOD,EAAS,MAAM;CAAI,EAAE,OAAO,QAAQ,EAAC,EAClD,OAAOb,GAAiBc,CAAI,CAC9B,CC9BA,IAAqBC,EAArB,cAAwCC,CAAO,CACrC,IAER,YAAYC,EAAY,CACtB,IAAMC,EAAMC,EAAMF,CAAI,EACtB,MAAMC,EAAI,KAAK,IAAIE,GAAO,CAACA,EAAI,GAAIA,EAAI,GAAG,CAAC,CAAC,EAC5C,KAAK,IAAMF,CACb,CAEA,WAAS,CACP,OAAO,KAAK,IAAI,MAClB,CAEA,IAAI,cAAY,CACd,OAAO,KAAK,IAAI,SAClB,GCdI,SAAUG,EAAYC,EAAgB,CAC1C,IAAMC,EAAQD,EACX,MAAM;CAAI,EACV,IAAIE,GAAKA,EAAE,KAAI,CAAE,EACjB,OAAOA,GAAK,CAAC,CAACA,CAAC,EACZC,EAAO,CAAA,EACPC,EAAO,CAAA,EACb,QAAWC,KAAQJ,EACjB,GAAII,EAAK,WAAW,KAAK,EACvBF,EAAK,KAAKE,CAAI,MACT,IAAIA,EAAK,WAAW,MAAM,EAC/B,SACK,GAAIA,EAAK,WAAW,IAAI,EAC7B,MAEAD,EAAK,KAAKC,CAAI,EAGlB,IAAMC,EAAMH,EAAK,IAAII,GAAI,CACvB,GAAM,CAAC,CAAEC,EAASC,EAASC,EAAKC,EAAOC,EAAKC,EAAQC,EAAQC,CAAO,EACjER,EAAE,MAAM,GAAG,EACb,MAAO,CACL,QAAAC,EACA,QAAAC,EACA,IAAAC,EACA,MAAO,CAACC,EACR,IAAK,CAACC,EACN,OAAQ,CAACC,EACT,OAAAC,EACA,QAAAC,EACA,IAAK,GAET,CAAC,EACD,QAAWC,KAAOZ,EAChB,QAASa,EAAI,EAAGA,EAAId,EAAK,OAAQc,IAC/BX,EAAIW,CAAC,EAAE,KAAOD,EAAIC,CAAC,EAGvB,OAAOX,CACT,CAEM,SAAUY,EAAalB,EAAgB,CAC3C,IAAMC,EAAQD,EACX,MAAM;CAAI,EACV,IAAIE,GAAKA,EAAE,KAAI,CAAE,EACjB,OAAOA,GAAK,CAAC,CAACA,CAAC,EACZC,EAAO,CAAA,EACTgB,EAAO,GACX,QAAWd,KAAQJ,EACjB,GAAII,EAAK,WAAW,KAAK,EACvBF,EAAK,KAAKE,CAAI,MACT,IAAIA,EAAK,WAAW,MAAM,EAC/B,SACK,GAAIA,EAAK,WAAW,IAAI,EAC7B,MAEAc,EAAOd,EAGX,IAAMC,EAAMH,EAAK,IAAII,GAAI,CACvB,GAAM,CAAC,CAAEC,EAASC,EAASC,EAAKC,EAAOC,EAAKC,EAAQC,EAAQC,CAAO,EACjER,EAAE,MAAM,GAAG,EACb,MAAO,CACL,QAAAC,EACA,QAAAC,EACA,IAAAC,EACA,MAAO,CAACC,EACR,IAAK,CAACC,EACN,OAAQ,CAACC,EACT,OAAAC,EACA,QAAAC,EAEJ,CAAC,EAED,MAAO,CAAE,KAAAI,EAAM,KAAMb,CAAG,CAC1B,CC5EA,IAAqBc,EAArB,cAAoCC,CAAO,CACzC,YAAYC,EAAY,CACtB,MAAMC,EAAYD,CAAI,EAAE,IAAIE,GAAO,CAACA,EAAI,QAASA,EAAI,GAAG,CAAC,CAAC,CAC5D,GCFF,IAAqBC,EAArB,cAAsCC,CAAO,CAEnC,gBAAkB,IAAI,IAE9B,YAAYC,EAA6B,CACvC,IAAMC,EAAUC,EAAUF,CAAK,EAC/B,MAAMC,EAAQ,IAAIE,GAAK,CAACA,EAAE,GAAIA,EAAE,GAAG,CAAC,CAAC,EACrC,OAAW,CAAE,GAAAC,CAAE,IAAMH,EACfG,EAAG,SAAS,GAAG,GACjB,KAAK,gBAAgB,IAAIA,EAAG,WAAW,IAAK,GAAG,EAAGA,CAAE,CAG1D,CAEA,OAAOC,EAAY,CACjB,OACE,KAAK,KAAK,IAAIA,CAAI,GAClB,KAAK,KAAK,IAAI,KAAK,gBAAgB,IAAIA,CAAI,GAAK,EAAE,GAClD,EAEJ,GCTY,SAAPC,EAAuB,EAAS,CACrC,OAAOC,EAAY,EAAG,CAAE,iBAAkB,MAAM,CAAE,CACpD,CCHA,SAASC,GAAe,CACtB,MAAO,CACL,GAAI,OAAO,OAAO,IAAI,EACtB,GAAI,OAAO,OAAO,IAAI,EACtB,GAAI,OAAO,OAAO,IAAI,EACtB,GAAI,OAAO,OAAO,IAAI,EACtB,QAAS,CAAA,EACT,QAAS,OAAO,OAAO,IAAI,EAE/B,CAIA,SAASC,EACPC,EACAC,EAAe,CAEf,GAAID,EACF,OAAOA,EAET,GAAIC,EACF,MAAM,IAAI,MAAM,mCAAmC,EAErD,OAAOH,EAAe,CACxB,CAEA,IAAMI,EAAmB,mBACnBC,GAAiB,YACjBC,GAAU,4BACVC,GAAU,4BACVC,GAAU,oCACVC,GAAU,oCAIVC,GAAY,8BACZC,GAAgB,KAEhB,SAAUC,EAAMC,EAAY,CAChC,OAAOT,EAAiB,KAAKS,CAAI,CACnC,CAEM,SAAUC,EACdD,EACAE,EAA2B,CAE3B,IAAMC,EAAUD,GAAQ,CAAA,EAClBE,EAAsB,CAAA,EACxBf,EAA8B,KAG9BgB,EAAgB,GAEdC,EAAQN,EAAK,MAAM;CAAI,EAC7B,QAAWO,KAAQD,EAAO,CACxB,IAAIE,EAEJ,GAAIjB,EAAiB,KAAKgB,CAAI,EACxBlB,GACFe,EAAG,KAAKf,CAAK,EAEfA,EAAQF,EAAe,EACvBkB,EAAgB,WACPb,GAAe,KAAKe,CAAI,EAC7BlB,GACFe,EAAG,KAAKf,CAAK,EAEfA,EAAQ,aACEmB,EAAQf,GAAQ,KAAKc,CAAI,EAAI,CACvClB,EAAQD,EAAYC,EAAO,CAAC,CAACc,EAAQ,MAAM,EAC3C,IAAMM,EAAMD,EAAM,CAAC,EACbE,EAAUrB,EAAM,GAAGoB,CAAG,IAAM,CAAA,EAC9BA,IAAQ,MAAQJ,GAAiBK,EAAO,OAAS,EACnDA,EAAOA,EAAO,OAAS,CAAC,GAAKF,EAAM,CAAC,EAEpCE,EAAO,KAAKF,EAAM,CAAC,CAAE,EAEvBH,EAAgBI,IAAQ,IAC1B,SAAYD,EAAQd,GAAQ,KAAKa,CAAI,EACnClB,EAAQD,EAAYC,EAAO,CAAC,CAACc,EAAQ,MAAM,EAC3Cd,EAAM,GAAGmB,EAAM,CAAC,CAAE,GAAKnB,EAAM,GAAGmB,EAAM,CAAC,CAAE,GAAK,IAAMA,EAAM,CAAC,UACjDA,EAAQb,GAAQ,KAAKY,CAAI,EAAI,CACvClB,EAAQD,EAAYC,EAAO,CAAC,CAACc,EAAQ,MAAM,EAC3C,IAAMQ,EAAUtB,EAAM,GAAGmB,EAAM,CAAC,CAAE,IAAM,OAAO,OAAO,IAAI,GACxDG,EAAOH,EAAM,CAAC,CAAE,IAAM,CAAA,GAAI,KAAKA,EAAM,CAAC,CAAE,CAC5C,SAAYA,EAAQZ,GAAQ,KAAKW,CAAI,EAAI,CACvClB,EAAQD,EAAYC,EAAO,CAAC,CAACc,EAAQ,MAAM,EAC3C,IAAMQ,EAAUtB,EAAM,GAAGmB,EAAM,CAAC,CAAE,IAAM,OAAO,OAAO,IAAI,EAC1DG,EAAOH,EAAM,CAAC,CAAE,GAAKG,EAAOH,EAAM,CAAC,CAAE,GAAK,IAAMA,EAAM,CAAC,CACzD,SAAYA,EAAQX,GAAU,KAAKU,CAAI,EAAI,CACzClB,EAAQD,EAAYC,EAAO,CAAC,CAACc,EAAQ,MAAM,EAC3C,IAAMS,EAAUJ,EAAM,CAAC,EACjBK,EAAUL,EAAM,CAAC,EACnBnB,EAAM,QAAQuB,CAAO,IAAM,SAC7BvB,EAAM,QAAQuB,CAAO,EAAI,GACzBvB,EAAM,QAAQ,KAAKuB,CAAO,GAE5BvB,EAAM,QAAQuB,CAAO,GAAKC,CAC5B,SAAWf,GAAc,KAAKS,CAAI,GAC5BJ,EAAQ,OACV,MAAM,IAAI,MAAM,gBAAgB,CAGtC,CAEA,OAAId,GACFe,EAAG,KAAKf,CAAK,EAGRe,CACT,CCrHA,IAAqBU,EAArB,cAA0CC,CAAO,CACvC,KACA,IAER,YAAYC,EAAcC,EAAwB,CAChD,IAAMC,EAAMC,EAASH,CAAI,EACnBI,EAAMF,EAAID,CAAgB,GAAKC,EAAI,CAAC,EAC1C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,MAAMA,EAAI,QAAQ,IAAIC,GAAQ,CAACA,EAAMD,EAAI,QAAQC,CAAI,GAAK,EAAE,CAAC,CAAC,EAC9D,KAAK,KAAOH,EACZ,KAAK,IAAME,CACb,CAEA,QAAM,CACJ,OAAO,KAAK,GACd,CAEA,IAAI,gBAAc,CAChB,OAAO,KAAK,KAAK,IAAI,CAACA,EAAKE,IAAQF,EAAI,GAAG,KAAK,CAAC,GAAK,aAAaE,EAAM,CAAC,EAAE,CAC7E,CAEA,WAAS,CACP,IAAMC,EAAY,KAAK,IAAI,GAAG,IAAM,CAAA,EAC9BC,EAAY,KAAK,IAAI,GAAG,IAAM,CAAA,EACpC,MAAO,CACL,QAAS,KAAK,IAAI,GAClB,WAAY,OAAO,YACjB,OAAO,QAAQD,CAAS,EAAE,IAAI,CAAC,CAACE,EAAGC,CAAC,IAAM,CAACD,EAAGC,EAAE,CAAC,CAAC,CAAC,CAAC,EAEtD,OAAQ,OAAO,YACb,OAAO,QAAQF,CAAS,EAAE,IAAI,CAAC,CAACC,EAAGC,CAAC,IAAM,CAACD,EAAGC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAGlE,CAEA,WAAWC,EAAe,CACxB,MAAO,CACL,KAAMA,EACN,UAAW,KAAK,IAAI,GAAG,KAAKA,CAAO,IAAI,CAAC,EACxC,OAAQ,KAAK,IAAI,GAAG,KAAKA,CAAO,GAAG,KAAK,IAAI,EAEhD,CAEA,eAAa,CACX,IAAMC,EAAW,iDACXJ,EAAY,KAAK,IAAI,GAAG,IAAM,CAAA,EAC9BK,EAGF,CAAA,EACJ,OAAW,CAACC,EAAIC,CAAM,IAAK,OAAO,QAAQP,CAAS,EACjD,QAAWQ,KAAMD,EAAQ,CACvB,IAAME,EAAQL,EAAS,KAAKI,CAAE,EAC1BC,IACAJ,EAAOC,CAAE,IAAM,CAAA,GAAI,KAAK,CACxB,IAAKG,EAAM,CAAC,EAAG,YAAW,EAC1B,MAAOA,EAAM,CAAC,EACd,SAAU,CAACA,EAAM,CAAC,EAClB,OAAQ,CAACA,EAAM,CAAC,EACjB,CAEL,CAEF,OAAOJ,CACT,CAEA,SAAO,CACL,IAAMK,EAAO,KAAK,IAAI,GAAG,KAAK,CAAC,EAC/B,OAAOA,EAAOC,EAAgBC,EAAYF,CAAI,CAAC,EAAI,MAAM,QAAO,CAClE,CAEA,IAAI,cAAY,CACd,OAAO,KAAK,IAAI,GAAG,QACrB,CAEA,IAAI,6BAA2B,CAC7B,OAAO,KAAK,IAAI,GAAG,OACrB,CAOA,IAAI,QAAM,CACR,GAAM,CAAE,SAAAG,EAAU,QAAAC,EAAS,GAAGC,CAAO,EAAK,KAAK,IAAI,GACnD,MAAO,CACL,CACE,GAAI,eACJ,KAAM,qBACN,KAAMF,EACN,kBAAmB,CAAA,GAErB,CACE,GAAI,kBACJ,KAAM,sBACN,KAAMC,EACN,kBAAmBE,GAErB,GAAG,OAAO,QAAQD,CAAO,EAAE,IAAI,CAAC,CAACE,EAAKC,CAAI,KAAO,CAC/C,GAAI,MAAMD,CAAG,GACb,KAAMA,EACN,KAAAC,EACA,kBAAmBC,EAAgBF,CAAG,GACtC,EACF,GAAG,OAAO,QAAQ,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAACA,EAAKG,CAAK,IACjD,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACC,EAAKH,CAAI,KAAO,CAC1C,GAAI,MAAMG,CAAG,IAAIJ,CAAG,GACpB,KAAM,GAAGI,CAAG,IAAIJ,CAAG,GACnB,KAAAC,EACA,kBAAmBC,EAAgBF,CAAG,EACtC,WAAY,IACZ,CAAC,EAGT,GAMID,EAAqC,CACzC,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,QAIP,SAASG,EAAgBF,EAAW,CAClC,OAAOA,IAAQ,MAAQA,EAAI,SAAS,KAAK,EAAID,EAAa,CAAA,CAC5D,CC9HA,IAAMM,GAAW,iCACXC,GAAgB,8CAIhB,SAAUC,GACdC,EACAC,EAAmB,EACnBC,EAAkB,CAElB,IAAMC,EAAOH,EACV,QAAQ,UAAW,EAAE,EACrB,WAAW,SAAU;CAAI,EACzB,UAAS,EACZ,GAAIH,GAAS,KAAKM,CAAI,EACpB,MAAM,IAAI,MACR,uFAAuF,EAG3F,GAAID,IAAW,YACb,OAAO,IAAIE,EAAaD,EAAMF,CAAgB,EAEhD,GAAIC,IAAW,MACb,OAAO,IAAIG,EAAOF,CAAI,EAExB,GAAID,IAAW,QACb,OAAO,IAAII,EAASH,CAAI,EAE1B,GAAID,IAAW,MACb,OAAO,IAAIK,EAAOJ,CAAI,EAExB,GAAID,IAAW,UACb,OAAO,IAAIM,EAAWL,CAAI,EAE5B,GAAIM,EAAeN,CAAI,EACrB,OAAO,IAAIC,EAAaD,EAAMF,CAAgB,EAEhD,GAAIS,EAAWP,CAAI,EAAG,CACpB,IAAMQ,EAAUC,EAAkBT,CAAI,EACtC,OAAOE,EAAO,MAAMM,CAAO,EAAI,IAAIN,EAAOM,CAAO,EAAI,IAAIL,EAASK,CAAO,CAC3E,CACA,GAAIR,EAAK,WAAW,KAAK,EACvB,OAAO,IAAII,EAAOJ,CAAI,EAExB,GAAIL,GAAc,KAAKK,CAAI,EACzB,OAAO,IAAIK,EAAWL,CAAI,EAE5B,IAAMU,EAAYV,EAAK,MAAM;EAAM,CAAC,EAAE,CAAC,EAAG,MAAM,EAAG,EAAE,EACrD,MAAM,IAAI,MACRU,EACI,4GAA4GA,CAAS,IACrH,6BAA6B,CAErC,CAKM,SAAUC,GAAoBC,EAAkB,CACpD,OAAOA,EAAW,WAAW,QAAS,EAAE,CAC1C,CC3EA,SAASC,EAAWC,EAAW,CAC7B,GAAI,CACF,OAAO,mBAAmBA,CAAG,CAC/B,MAAQ,CACN,OAAOA,CACT,CACF,CAIA,SAASC,GAAQD,EAAW,CAC1B,OAAOA,EAAI,QAAQ,WAAY,IAAI,CACrC,CAEA,SAASE,GAAgBC,EAAa,CACpC,GAAI,CAACA,EACH,MAAO,CAAA,EAET,IAAMC,EAAqC,CAAA,EAC3C,QAAWC,KAASF,EAAK,MAAM,GAAG,EAAG,CACnC,IAAMG,EAAKD,EAAM,QAAQ,GAAG,EACtBE,EAAMF,EAAM,MAAM,EAAGC,CAAE,EAAE,KAAI,EAC7BN,EAAMK,EAAM,MAAMC,EAAK,CAAC,EAI1BA,IAAO,IAAMC,GAAOP,IACtBI,EAAWG,CAAG,EAAIP,EACf,MAAM,GAAG,EACT,IAAIQ,GAAKP,GAAQF,EAAWS,CAAC,EAAE,KAAI,CAAE,CAAC,EACtC,KAAK,GAAG,EAEf,CACA,OAAOJ,CACT,CAEM,SAAUK,EAASC,EAAY,CACnC,GAAI,CAACA,EACH,MAAO,CAAA,EAET,IAAMC,EAAkB,CAAA,EACxB,QAAWC,KAAOF,EAAI,MAAM;CAAI,EAAG,CACjC,IAAMG,EAAOD,EAAI,KAAI,EAGrB,GAAIC,EAAK,WAAW,SAAS,EAC3B,MAIEA,GAAQ,CAACA,EAAK,WAAW,GAAG,GAAKA,EAAK,MAAM,GAAI,EAAE,QAAU,GAC9DF,EAAM,KAAKE,CAAI,CAEnB,CACA,OAAOF,EAAM,IAAIG,GAAI,CACnB,IAAMC,EAAQD,EAAE,MAAM,GAAI,EACpB,CAACE,EAAQC,EAAQC,EAAMC,EAAOC,EAAKC,EAAOC,EAAQC,CAAK,EAAIR,EAC3DZ,EAAOY,EAAM,CAAC,EAIpB,MAAO,CACL,GAAGb,GAAgBC,CAAI,EACvB,OAAQJ,EAAWiB,GAAU,EAAE,EAC/B,OAAQC,GAAU,GAClB,KAAMC,GAAQ,GACd,MAAO,OAAOC,CAAK,GAAK,EACxB,IAAK,OAAOC,CAAG,GAAK,EACpB,MAAO,OAAOC,CAAK,GAAK,EACxB,OAAQC,GAAU,IAClB,MAAOC,GAAS,IAEpB,CAAC,CACH,CCxEA,IAAMC,GAAmB,IAAI,IAAI,CAC/B,OACA,MACA,aACA,OACA,aACA,qBACA,QACA,OACA,OACA,QACA,SACA,QACA,UACD,EAID,SAASC,GAAW,CAAE,KAAAC,EAAM,OAAAC,CAAM,EAAa,CAC7C,IAAMC,EAAcD,IAAW,IAAM,EAAIA,IAAW,IAAM,GAAK,OAC/D,OAAOH,GAAiB,IAAIE,CAAI,EAAIE,EAAc,MACpD,CAIA,IAAMC,GAAc,IAAI,IAAI,CAC1B,SACA,SACA,OACA,QACA,MACA,QACA,SACA,QACD,EAED,SAASC,GAAaC,EAAiB,CACrC,IAAMC,EAAU,OAAO,QAAQD,CAAM,EAAE,OACrC,CAAC,CAACE,EAAKC,CAAK,IAAM,CAACL,GAAY,IAAII,CAAG,GAAK,OAAOC,GAAU,QAAQ,EAEtE,OAAOF,EAAQ,OAAS,EAAI,OAAO,YAAYA,CAAO,EAAI,MAC5D,CAKA,IAAMG,GAAa,4CAEnB,SAASC,GAASL,EAAiB,CACjC,IAAMG,EAASH,EAAO,OACpBA,EAAO,QACPA,EAAO,OACPA,EAAO,OACT,GAAI,CAACG,EACH,OAEF,IAAMG,EAASF,GAAW,KAAKD,EAAM,KAAI,CAAE,EAC3C,OAAOG,EAAS,OAAOA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAMH,EAAM,KAAI,CAC5E,CAKA,IAAMI,GAAuB,IAAI,IAAI,CAAC,cAAe,cAAc,CAAC,EAS9D,SAAUC,EAAiBC,EAAuB,CACtD,OAAOA,EACJ,OAAOT,GAAU,CAACO,GAAqB,IAAIP,EAAO,IAAI,CAAC,EACvD,IAAIA,GAAS,CACZ,IAAMU,EACHV,EAAO,MACPA,EAAO,IACR,GAAGA,EAAO,MAAM,IAAIA,EAAO,KAAK,IAAIA,EAAO,GAAG,GAC1CW,EACHX,EAAO,gBACPA,EAAO,MACRU,EACF,MAAO,CACL,GAAIV,EAAO,OACX,UAAAU,EACA,KAAAC,EAIA,YACGX,EAAO,aACPA,EAAO,MACPA,EAAO,gBACRW,EACF,YAAaX,EAAO,KACpB,MAAOA,EAAO,MACd,IAAKA,EAAO,IACZ,OAAQN,GAAWM,CAAM,EACzB,MAAOK,GAASL,CAAM,EACtB,WAAYD,GAAaC,CAAM,EAEnC,CAAC,CACL",
6
+ "names": ["indexResultsByXref", "results", "r", "interProScanToAnnotations", "id", "matches", "signature", "locations", "entry", "accession", "name", "start", "end", "strand", "interProScanResponseToAnnotations", "response", "annotationsToGFF", "annotations", "header", "line", "annotation", "accession", "name", "description", "featureType", "id", "start", "end", "strand", "annotationTextToGFF", "text", "trimmed", "response", "annotationsToGFF", "interProScanResponseToAnnotations", "generateNodeIds", "tree", "parent", "depth", "withId", "node", "id", "root", "stack", "src", "out", "d", "child", "i", "BaseMSA", "rows", "name", "seq", "max", "_name", "fastaSniff", "text", "splitFastaRecords", "records", "seen", "current", "flush", "count", "line", "toRecords", "input", "CODE_A", "CODE_Z", "CODE_a", "CODE_z", "CODE_DASH", "isLower", "code", "isMatch", "parseRow", "seq", "matches", "inserts", "ch", "A3mMSA", "BaseMSA", "input", "records", "toRecords", "expanded", "expandA3M", "i", "fastaSniff", "seqs", "r", "s", "hasLowercase", "matchCount", "rawSeqs", "rows", "numPositions", "maxInserts", "pos", "ins", "result", "parseVersion", "line", "res", "parseHeader", "info", "knownHeaders", "l", "version", "getFirstNonEmptyLine", "arr", "getSeqBounds", "fields", "temp", "s", "e", "parseBlock", "block", "consensusLine", "start", "end", "ids", "seqs", "consensus", "remainder", "parseBlocks", "i", "parseClustalIter", "arr", "line", "getFirstNonEmptyLine", "header", "parseHeader", "res", "parseBlocks", "alns", "n", "index", "consensus", "parse", "contents", "iter", "ClustalMSA", "BaseMSA", "text", "msa", "parse", "aln", "parseEmfAln", "contents", "lines", "f", "seqs", "alns", "line", "arr", "s", "species", "protein", "chr", "start", "end", "strand", "geneId", "unknown", "aln", "j", "parseEmfTree", "tree", "EmfMSA", "BaseMSA", "text", "parseEmfAln", "aln", "FastaMSA", "BaseMSA", "input", "records", "toRecords", "r", "id", "name", "parse", "parseNewick", "createStockholm", "ensureStock", "stock", "strict", "formatStartRegex", "formatEndRegex", "gfRegex", "gcRegex", "gsRegex", "grRegex", "lineRegex", "nonwhiteRegex", "sniff", "text", "parseAll", "opts", "options", "db", "treeContinues", "lines", "line", "match", "tag", "values", "byName", "seqname", "seqdata", "StockholmMSA", "BaseMSA", "text", "currentAlignment", "res", "parseAll", "aln", "name", "idx", "acEntries", "drEntries", "k", "v", "rowName", "pdbRegex", "result", "id", "drList", "dr", "match", "tree", "generateNodeIds", "parse", "seq_cons", "SS_cons", "otherGc", "wussColors", "tag", "data", "structureColors", "byRow", "row", "htmlPage", "clustalHeader", "parseMSA", "input", "currentAlignment", "format", "text", "StockholmMSA", "A3mMSA", "FastaMSA", "EmfMSA", "ClustalMSA", "sniff", "fastaSniff", "records", "splitFastaRecords", "firstLine", "getUngappedSequence", "alignedSeq", "safeDecode", "val", "unquote", "parseAttributes", "col9", "attributes", "field", "eq", "key", "v", "parseGFF", "str", "lines", "raw", "line", "f", "parts", "seq_id", "source", "type", "start", "end", "score", "strand", "phase", "GENE_LEVEL_TYPES", "geneStrand", "type", "strand", "directional", "GFF_COLUMNS", "attributesOf", "record", "entries", "key", "value", "RGB_TRIPLE", "cssColor", "triple", "WHOLE_SEQUENCE_TYPES", "gffToAnnotations", "gffRecords", "accession", "name"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function c(t){let o=t.length>1;return t.flatMap(r=>[...o?[{key:r.id,label:r.title}]:[],...r.entries.map(e=>({key:`${r.id}:${e.id}`,label:e.label,color:e.color,hint:e.id}))])}var G=new Set(["exon","CDS","five_prime_UTR","three_prime_UTR","UTR","intron"]),z=["#9fb6d4","#d4dcea"],O=!0,B=!1,P=["both","horizontal","vertical"],X="both",y=8,k=5,Z=9;function A(t){return Math.min(Math.max(6,t-3),18)}var U=A(16),Y=.2,I=1,$=80,J=!0,j="maeditor",q=!0,K=!0,Q=!1,V=70,tt=160,et=10,ot=.3,rt=!0,nt=["branchLength","input","ladderize","ladderizeReverse"],at="branchLength",it=!0,st=!0,lt=!1,ct=!1,ht=120,pt=500,xt=.25,dt="#fff3c4",ut=.6,ft=5e4,gt=56,g=22,mt=200,D=1e3,wt=D+1;var h=8,R=16,_=12,Tt=12,E=7,v=360,C=h+_+6;function M(t){let o=t.reduce((e,n)=>Math.max(e,n.label.length),0),r=C+h+o*E;return Math.min(v,Math.max(120,r))}function N(t){return h*2+t.length*R}function bt(t,o){let{scrollX:r,scrollY:e,totalWidth:n,totalHeight:a,effectiveTreeAreaWidth:m,rowPanelsWidth:w,rowPanelsHeaderHeight:H,totalTrackAreaHeight:S,minimapHeight:L,msaAreaHeight:p,msaCanvasWidth:x,showHorizontalScrollbar:T,treeOverviewHeight:b,treeScaleBar:W}=t,i=o.includeTracks?S:0,l=o.exportType==="viewport"&&!!o.includeMinimap&&T,d=c(t.legends),u=d.length>0?M(d):0,s=Math.max(l?L:0,H,b+(W?g:0)),f=m+w;return o.exportType==="entire"?{width:n+f,msaAreaWidth:n,height:a+i+s,contentHeight:a,trackHeight:i,topHeight:s,offsetX:0,offsetY:0,includeMinimap:l,legendWidth:u}:{width:x+f,msaAreaWidth:x,height:p+s+i,contentHeight:p,trackHeight:i,topHeight:s,offsetX:-r,offsetY:-e,includeMinimap:l,legendWidth:u}}function Wt(t,o){let{width:r,height:e,legendWidth:n,topHeight:a}=o;return{width:r+n,height:n>0?Math.max(e,a+N(c(t.legends))):e}}export{c as a,G as b,z as c,O as d,B as e,P as f,X as g,y as h,k as i,Z as j,A as k,U as l,Y as m,I as n,$ as o,J as p,j as q,q as r,K as s,Q as t,V as u,tt as v,et as w,ot as x,rt as y,nt as z,at as A,it as B,st as C,lt as D,ct as E,ht as F,pt as G,xt as H,dt as I,ut as J,ft as K,gt as L,g as M,mt as N,D as O,wt as P,h as Q,R,_ as S,Tt as T,E as U,C as V,N as W,bt as X,Wt as Y};
2
+ //# sourceMappingURL=chunk-ZQSWX57C.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/components/msa/legendRows.ts", "../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/constants.ts", "../../node_modules/.pnpm/react-msaview@9.1.0_a4121c98828e538e8b3708814bbfe622/node_modules/react-msaview/src/exportLayout.ts"],
4
+ "sourcesContent": ["import type { Legend } from '../../types.ts'\n\nexport interface LegendRow {\n key: string\n label: string\n color?: string\n hint?: string\n}\n\n// the legends flattened into the rows both the overlay and the export stack\n// top to bottom. A title row separates one legend from the next, and a lone\n// legend needs no title.\nexport function legendRows(legends: Legend[]): LegendRow[] {\n const titled = legends.length > 1\n return legends.flatMap(legend => [\n ...(titled ? [{ key: legend.id, label: legend.title }] : []),\n ...legend.entries.map(entry => ({\n key: `${legend.id}:${entry.id}`,\n label: entry.label,\n color: entry.color,\n hint: entry.id,\n })),\n ])\n}\n", "import type { TreeOrder } from './types.ts'\n\n// Main model defaults\nexport const defaultRowHeight = 16\nexport const defaultColWidth = 12\nexport const defaultHeight = 550\nexport const defaultScrollX = 0\nexport const defaultScrollY = 0\nexport const defaultCurrentAlignment = 0\n// Only a hidden overlay is stored, so a link that never mentions it opens\n// showing its annotations.\nexport const defaultShowDomains = true\nexport const defaultShowDomainLegend = true\nexport const defaultHideGaps = true\nexport const defaultAllowedGappyness = 100\nexport const defaultSubFeatureRows = false\n// height of one sub-row when subFeatureRows is on, unless the row has more\n// lanes than fit at this height (see renderBoxFeatureCanvasBlock)\nexport const subFeatureRowHeight = 4\n// height of the bar the overlay draws under a row in letter-color mode\nexport const domainUnderlineHeight = 3\n\n// Feature types that are ordinal segments of one transcript. The overlay\n// alternates two shades across them and labels them by number, where a domain\n// type gets its own hue and legend row.\nexport const segmentFeatureTypes = new Set([\n 'exon',\n 'CDS',\n 'five_prime_UTR',\n 'three_prime_UTR',\n 'UTR',\n 'intron',\n])\n\n// the two shades alternated across adjacent segments (exons)\nexport const segmentShades = ['#9fb6d4', '#d4dcea']\nexport const defaultDrawMsaLetters = true\nexport const defaultScrollZoom = false\n\n// Which cell dimensions a wheel zoom scales. 'horizontal' holds the row height,\n// which fixes the label and letter font size while the columns compress.\n// 'vertical' does the reverse.\nexport const scrollZoomAxes = ['both', 'horizontal', 'vertical'] as const\nexport type ScrollZoomAxis = (typeof scrollZoomAxes)[number]\nexport const defaultScrollZoomAxis: ScrollZoomAxis = 'both'\n\n// Cell size floors for drawing residue letters and tree labels. Below these a\n// 500px block holds thousands of glyphs, and fillText dominates every zoom\n// frame. A sprite atlas measured slower.\nexport const minLetterRowHeight = 8\nexport const minLetterColWidth = 5\n\n// A feature span draws its label at two pixels under its height, capped at 11,\n// so a span shorter than this holds no readable text: an underline bar, a\n// sub-row band or a features panel over small rows\nexport const minFeatureLabelHeight = 9\n\nexport function fontSizeFor(rowHeight: number) {\n return Math.min(Math.max(6, rowHeight - 3), 18)\n}\n\n// The fitted tree area measures the tip labels and the clade labels at the\n// font a default row draws, so a vertical zoom leaves the alignment in place.\n// A larger font ellipsizes the labels.\nexport const labelFitFontSize = fontSizeFor(defaultRowHeight)\n\n// Zoom limits, px per cell. maxCellSize caps both smooth zoom and the stepwise\n// zoom-in buttons (which otherwise grow unbounded). minColWidth/minRowHeight are\n// the smooth-zoom floors.\nexport const minColWidth = 0.2\nexport const minRowHeight = 1\nexport const maxCellSize = 80\n\n// MSA model defaults\nexport const defaultBgColor = true\nexport const defaultColorSchemeName = 'maeditor'\nexport const defaultShowColumnStats = true\n\n// Tree model defaults\nexport const defaultDrawLabels = true\nexport const defaultLabelsAlignRight = false\n// The fitted tree area gives the tree pxPerTreeDepth per level of its depth,\n// between minTreeWidth and maxFitTreeWidth, beside the widest label, and takes\n// at most maxTreeAreaShare of a view with an alignment. Where the share binds,\n// the tree keeps minTreeWidth and the labels ellipsize.\nexport const minTreeWidth = 70\nexport const maxFitTreeWidth = 160\nexport const pxPerTreeDepth = 10\nexport const maxTreeAreaShare = 0.3\nexport const defaultShowBranchLen = true\nexport const treeOrders = [\n 'branchLength',\n 'input',\n 'ladderize',\n 'ladderizeReverse',\n] as const satisfies readonly TreeOrder[]\nexport const defaultTreeOrder: TreeOrder = 'branchLength'\nexport const defaultDrawTree = true\nexport const defaultDrawNodeBubbles = true\nexport const defaultDrawNodeLabels = false\nexport const defaultShowTreeOverview = false\nexport const defaultOverviewHeight = 120\n\n// Neighbor joining does not run above this many rows. The distance matrix is\n// O(n^2*L) and the join loop O(n^3), both on the main thread with no progress\n// and no cancel: 400 rows measured 1.5s, 800 rows 10s, and 1600 would be about\n// seventy. See agent-docs/reference/neighbor-joining-scaling.md.\nexport const maxNeighborJoiningRows = 500\n\n// The opacity a `rowTint` encoding draws its scale's color at, so the residues\n// under the wash stay readable. A color the producer already gave an alpha\n// keeps it.\nexport const rowTintAlpha = 0.25\n\n// The fill a `clades` record with the `highlight` mark draws behind its rows,\n// and the opacity a producer's own color takes when it carries none.\nexport const cladeHighlightColor = '#fff3c4'\nexport const cladeHighlightAlpha = 0.6\n\n// The largest inline document a snapshot carries by default, which keeps a\n// jbrowse session small. A larger pasted or locally-opened file stays in the\n// live model and out of the snapshot, and `unshareableData` warns using the\n// same number. `MSAModelF({ maxInlineSnapshotBytes })` sets another; the demo\n// app's links hold far more.\nexport const maxInlineSnapshotBytes = 50_000\n\n// Height of the band the `rowPanels` headers draw in, above the strips in the\n// top area beside the tree ruler and the minimap. A panel wider than the band\n// is tall writes its header across, where it has more room.\nexport const rowPanelHeaderHeight = 56\n\n// Height of the branch-length scale bar above the tree.\nexport const treeScaleBarHeight = 22\n\n// Width of a `features` row panel that names none, wide enough for a gene\n// neighborhood of a few arrows to read.\nexport const defaultFeaturePanelWidth = 200\n\n// The alignment's overlay canvas draws the mouseover, the persisted highlights\n// and the row tints over the residues, and the legend key floats above that,\n// so a tint reaching the top right corner leaves the key readable.\nexport const msaOverlayZIndex = 1000\nexport const legendZIndex = msaOverlayZIndex + 1\n", "import { legendRows } from './components/msa/legendRows.ts'\nimport { treeScaleBarHeight } from './constants.ts'\n\nimport type { LegendRow } from './components/msa/legendRows.ts'\nimport type { MsaViewModel } from './model.ts'\nimport type { Theme } from '@mui/material'\n\nexport interface ExportSvgOptions {\n theme: Theme\n includeMinimap?: boolean\n includeTracks?: boolean\n exportType: 'entire' | 'viewport'\n}\n\n// legend geometry, shared by the width calculation and the renderer so the\n// reserved column on the right exactly fits the drawn legends\nexport const LEGEND_PAD = 8\nexport const LEGEND_ROW_H = 16\nexport const LEGEND_SWATCH = 12\nexport const LEGEND_FONT = 12\nexport const LEGEND_CHAR_W = 7\n\nexport const LEGEND_MAX_W = 360\nexport const LEGEND_TEXT_X = LEGEND_PAD + LEGEND_SWATCH + 6\n\nexport function getLegendWidth(rows: LegendRow[]) {\n const maxLen = rows.reduce((a, r) => Math.max(a, r.label.length), 0)\n const w = LEGEND_TEXT_X + LEGEND_PAD + maxLen * LEGEND_CHAR_W\n return Math.min(LEGEND_MAX_W, Math.max(120, w))\n}\n\nexport function legendHeight(rows: LegendRow[]) {\n return LEGEND_PAD * 2 + rows.length * LEGEND_ROW_H\n}\n\n// resolved sizes/offsets (in svg user units) for the chosen export, shared by\n// every layer; 'entire' renders the whole alignment unscrolled, 'viewport'\n// mirrors the live scroll position\nexport interface Layout {\n width: number\n msaAreaWidth: number\n height: number\n contentHeight: number\n trackHeight: number\n // the band the minimap, the row panel headers and the tree overview stacked\n // on the scale bar share across the top\n topHeight: number\n offsetX: number\n offsetY: number\n includeMinimap: boolean\n legendWidth: number\n}\n\nexport function getLayout(model: MsaViewModel, opts: ExportSvgOptions): Layout {\n const {\n scrollX,\n scrollY,\n totalWidth,\n totalHeight,\n effectiveTreeAreaWidth,\n rowPanelsWidth,\n rowPanelsHeaderHeight,\n totalTrackAreaHeight,\n minimapHeight,\n msaAreaHeight,\n msaCanvasWidth,\n showHorizontalScrollbar,\n treeOverviewHeight,\n treeScaleBar,\n } = model\n const trackHeight = opts.includeTracks ? totalTrackAreaHeight : 0\n // the minimap reflects the live viewport scroll position, so it's only\n // meaningful for a viewport export, never for the entire alignment -- and\n // only when the live view shows one at all, since a minimap over an alignment\n // that already fits marks a viewport wider than the bar\n const includeMinimap =\n opts.exportType === 'viewport' &&\n !!opts.includeMinimap &&\n showHorizontalScrollbar\n const rows = legendRows(model.legends)\n const legendWidth = rows.length > 0 ? getLegendWidth(rows) : 0\n const topHeight = Math.max(\n includeMinimap ? minimapHeight : 0,\n rowPanelsHeaderHeight,\n treeOverviewHeight + (treeScaleBar ? treeScaleBarHeight : 0),\n )\n const gutterWidth = effectiveTreeAreaWidth + rowPanelsWidth\n\n // width stays content-only; the legend occupies an extra column added at the\n // svg root in MsaSvg. The viewport export takes the alignment canvas's own\n // size rather than the widget's -- the widget box also covers the header, the\n // resize handle and the scrollbars, and rendering that box exports rows and\n // columns the scrollbars hide on screen\n return opts.exportType === 'entire'\n ? {\n width: totalWidth + gutterWidth,\n msaAreaWidth: totalWidth,\n height: totalHeight + trackHeight + topHeight,\n contentHeight: totalHeight,\n trackHeight,\n topHeight,\n offsetX: 0,\n offsetY: 0,\n includeMinimap,\n legendWidth,\n }\n : {\n width: msaCanvasWidth + gutterWidth,\n msaAreaWidth: msaCanvasWidth,\n height: msaAreaHeight + topHeight + trackHeight,\n contentHeight: msaAreaHeight,\n trackHeight,\n topHeight,\n offsetX: -scrollX,\n offsetY: -scrollY,\n includeMinimap,\n legendWidth,\n }\n}\n\n/**\n * the exported page's size: the layout plus the legend column, and as tall as\n * the legend where the key outgrows a short alignment\n */\nexport function exportPageSize(model: MsaViewModel, layout: Layout) {\n const { width, height, legendWidth, topHeight } = layout\n return {\n width: width + legendWidth,\n height:\n legendWidth > 0\n ? Math.max(height, topHeight + legendHeight(legendRows(model.legends)))\n : height,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["legendRows", "legends", "titled", "legend", "entry", "segmentFeatureTypes", "segmentShades", "defaultDrawMsaLetters", "defaultScrollZoom", "scrollZoomAxes", "defaultScrollZoomAxis", "minLetterRowHeight", "minLetterColWidth", "minFeatureLabelHeight", "fontSizeFor", "rowHeight", "labelFitFontSize", "minColWidth", "minRowHeight", "maxCellSize", "defaultBgColor", "defaultColorSchemeName", "defaultShowColumnStats", "defaultDrawLabels", "defaultLabelsAlignRight", "minTreeWidth", "maxFitTreeWidth", "pxPerTreeDepth", "maxTreeAreaShare", "defaultShowBranchLen", "treeOrders", "defaultTreeOrder", "defaultDrawTree", "defaultDrawNodeBubbles", "defaultDrawNodeLabels", "defaultShowTreeOverview", "defaultOverviewHeight", "maxNeighborJoiningRows", "rowTintAlpha", "cladeHighlightColor", "cladeHighlightAlpha", "maxInlineSnapshotBytes", "rowPanelHeaderHeight", "treeScaleBarHeight", "defaultFeaturePanelWidth", "msaOverlayZIndex", "legendZIndex", "LEGEND_PAD", "LEGEND_ROW_H", "LEGEND_SWATCH", "LEGEND_FONT", "LEGEND_CHAR_W", "LEGEND_MAX_W", "LEGEND_TEXT_X", "getLegendWidth", "rows", "maxLen", "a", "r", "w", "legendHeight", "getLayout", "model", "opts", "scrollX", "scrollY", "totalWidth", "totalHeight", "effectiveTreeAreaWidth", "rowPanelsWidth", "rowPanelsHeaderHeight", "totalTrackAreaHeight", "minimapHeight", "msaAreaHeight", "msaCanvasWidth", "showHorizontalScrollbar", "treeOverviewHeight", "treeScaleBar", "trackHeight", "includeMinimap", "legendRows", "legendWidth", "topHeight", "treeScaleBarHeight", "gutterWidth", "exportPageSize", "layout", "width", "height"]
7
+ }
@@ -1,2 +1,2 @@
1
- import"./chunk-FY3BTKY4.js";function x(o){let t={left:"start",right:"end",center:"middle",start:"start",end:"end"};return t[o]||t.start}function v(o){let t={alphabetic:"alphabetic",hanging:"hanging",top:"text-before-edge",bottom:"text-after-edge",middle:"central"};return t[o]||t.alphabetic}var b={"font-style":"normal","font-weight":"normal","dominant-baseline":"alphabetic"};function m(o,t){return t===b[o]?void 0:t}var h={strokeStyle:{svgAttr:"stroke",canvas:"#000000",svg:"none",apply:"stroke"},fillStyle:{svgAttr:"fill",canvas:"#000000",svg:null,apply:"fill"},lineWidth:{svgAttr:"stroke-width",canvas:1,svg:1,apply:"stroke"},font:{canvas:"10px sans-serif"},textAlign:{canvas:"start"},textBaseline:{canvas:"alphabetic"},lineDash:{svgAttr:"stroke-dasharray",canvas:null,svg:null,apply:"stroke"}},T=/rgba\(\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\s*,\s*(\d?\.?\d*)\s*\)/i,d=class{width;height;canvas;__document;__ctx;__canvas;__root;__currentElement;__styleStack;__groupStack;__currentDefaultPath;__currentPosition;__transformMatrix;__transformMatrixStack;__fontCache=new Map;strokeStyle;fillStyle;lineWidth;font;textAlign;textBaseline;lineDash;constructor(t,e,s={}){this.width=t,this.height=e,this.canvas=this,this.__document=s.document||document,s.ctx?this.__ctx=s.ctx:(this.__canvas=this.__document.createElement("canvas"),this.__ctx=this.__canvas.getContext("2d")),this.__setDefaultStyles(),this.__styleStack=[this.__getStyleState()],this.__groupStack=[],this.__root=this.__document.createElementNS("http://www.w3.org/2000/svg","svg"),this.__root.setAttribute("version","1.1"),this.__root.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.__root.setAttribute("width",String(t)),this.__root.setAttribute("height",String(e)),this.__currentElement=this.__document.createElementNS("http://www.w3.org/2000/svg","g"),this.__root.appendChild(this.__currentElement),this.__currentDefaultPath="",this.__currentPosition={},this.__transformMatrix=new DOMMatrix,this.resetTransform()}__createElement(t,e={},s){let r=this.__document.createElementNS("http://www.w3.org/2000/svg",t);s&&(r.setAttribute("fill","none"),r.setAttribute("stroke","none"));for(let i of Object.keys(e)){let n=e[i];n!=null&&r.setAttribute(i,n)}return r}__setDefaultStyles(){for(let t of Object.keys(h))this[t]=h[t].canvas}__applyStyleState(t){for(let e of Object.keys(t))this[e]=t[e]}__getStyleState(){let t={};for(let e of Object.keys(h))t[e]=this[e];return t}__applyTransformation(t,e){let{a:s,b:r,c:i,d:n,e:a,f:_}=e||this.getTransform();if(s===1&&r===0&&i===0&&n===1&&t.hasAttribute("x")&&t.hasAttribute("y")){a!==0&&t.setAttribute("x",String(Number(t.getAttribute("x"))+a)),_!==0&&t.setAttribute("y",String(Number(t.getAttribute("y"))+_));return}t.setAttribute("transform",`matrix(${s} ${r} ${i} ${n} ${a} ${_})`)}__applyStyleToCurrentElement(t){let e=this.__currentElement;for(let s of Object.keys(h)){let r=h[s],i=this[s];if(!r.apply?.includes(t)||r.svg===i)continue;let n=(r.svgAttr==="stroke"||r.svgAttr==="fill")&&typeof i=="string"&&i.includes("rgba")?T.exec(i):null;if(n)e.setAttribute(r.svgAttr,`rgb(${n[1]},${n[2]},${n[3]})`),e.setAttribute(`${r.svgAttr}-opacity`,n[4]);else if(s==="lineWidth"){let a=this.__getTransformScale();e.setAttribute(r.svgAttr,String(i*Math.max(a.x,a.y)))}else e.setAttribute(r.svgAttr,i)}t==="fill"&&e.getAttribute("stroke")==="none"&&e.removeAttribute("stroke")}__closestGroupOrSvg(t){return t=t||this.__currentElement,t.nodeName==="g"||t.nodeName==="svg"?t:this.__closestGroupOrSvg(t.parentNode)}getSvg(){return this.__root}save(){let t=this.__createElement("g"),e=this.__closestGroupOrSvg();this.__groupStack.push(e),e.appendChild(t),this.__currentElement=t,this.__styleStack.push(this.__getStyleState()),this.__transformMatrixStack||(this.__transformMatrixStack=[]),this.__transformMatrixStack.push(this.getTransform())}restore(){this.__currentElement=this.__groupStack.pop(),this.__currentElement||(this.__currentElement=this.__root.childNodes[0]),this.__applyStyleState(this.__styleStack.pop()),this.__transformMatrixStack&&this.__transformMatrixStack.length>0&&this.setTransform(this.__transformMatrixStack.pop())}beginPath(){this.__currentDefaultPath="",this.__currentPosition={};let t=this.__createElement("path",{},!0);this.__closestGroupOrSvg().appendChild(t),this.__currentElement=t}__applyCurrentDefaultPath(){this.__currentElement.nodeName==="path"&&this.__currentElement.setAttribute("d",this.__currentDefaultPath)}__addPathCommand(t){this.__currentDefaultPath+=" ",this.__currentDefaultPath+=t}moveTo(t,e){this.__currentElement.nodeName!=="path"&&this.beginPath(),this.__currentPosition={x:t,y:e};let s=this.__matrixTransform(t,e);this.__addPathCommand(`M ${s.x} ${s.y}`)}closePath(){this.__currentDefaultPath&&this.__addPathCommand("Z")}lineTo(t,e){this.__currentPosition={x:t,y:e};let s=this.__matrixTransform(t,e);this.__addPathCommand(this.__currentDefaultPath.includes("M")?`L ${s.x} ${s.y}`:`M ${s.x} ${s.y}`)}quadraticCurveTo(t,e,s,r){this.__currentPosition={x:s,y:r};let i=this.__matrixTransform(t,e),n=this.__matrixTransform(s,r);this.__addPathCommand(`Q ${i.x} ${i.y} ${n.x} ${n.y}`)}__applyPaintOrder(t,e){let s=this.__currentElement;s.nodeName==="path"&&s.hasAttribute(e)&&s.getAttribute(e)!=="none"&&s.setAttribute("paint-order",t)}stroke(){this.__applyPaintOrder("fill stroke markers","fill"),this.__applyCurrentDefaultPath(),this.__applyStyleToCurrentElement("stroke")}fill(){this.__applyPaintOrder("stroke fill markers","stroke"),this.__applyCurrentDefaultPath(),this.__applyStyleToCurrentElement("fill")}fillRect(t,e,s,r){let i=this.__createElement("rect",{x:t,y:e,width:s,height:r},!0);this.__closestGroupOrSvg().appendChild(i),this.__currentElement=i,this.__applyTransformation(i),this.__applyStyleToCurrentElement("fill")}strokeRect(t,e,s,r){let i=this.__createElement("rect",{x:t,y:e,width:s,height:r},!0);this.__closestGroupOrSvg().appendChild(i),this.__currentElement=i,this.__applyTransformation(i),this.__applyStyleToCurrentElement("stroke")}clearRect(t,e,s,r){let{a:i,b:n,c:a,d:_,e:f,f:u}=this.getTransform();if(i===1&&n===0&&a===0&&_===1&&f===0&&u===0&&t===0&&e===0&&s===this.width&&r===this.height){this.__clearCanvas();return}let l=this.__createElement("rect",{x:t,y:e,width:s,height:r,fill:"#FFFFFF"},!0);this.__applyTransformation(l),this.__closestGroupOrSvg().appendChild(l)}__clearCanvas(){this.__root.removeChild(this.__root.childNodes[0]),this.__currentElement=this.__document.createElementNS("http://www.w3.org/2000/svg","g"),this.__root.appendChild(this.__currentElement),this.__groupStack=[]}__parsedFont(){let t=this.__fontCache.get(this.font);if(t)return t;let e=document.createElement("span");return e.setAttribute("style",`font:${this.font}`),this.__fontCache.set(this.font,e.style),e.style}fillText(t,e,s){let r=this.__parsedFont(),i=this.__closestGroupOrSvg(),n=this.__createElement("text",{"font-family":r.fontFamily,"font-size":r.fontSize,"font-style":m("font-style",r.fontStyle),"font-weight":m("font-weight",r.fontWeight),x:e,y:s,"text-anchor":x(this.textAlign),"dominant-baseline":m("dominant-baseline",v(this.textBaseline))},!0);n.appendChild(this.__document.createTextNode(t)),this.__currentElement=n,this.__applyTransformation(n),this.__applyStyleToCurrentElement("fill"),i.appendChild(n)}measureText(t){return this.__ctx.font=this.font,this.__ctx.measureText(t)}arc(t,e,s,r,i,n){if(r===i)return;r=r%(2*Math.PI),i=i%(2*Math.PI),r===i&&(i=(i+2*Math.PI-.001*(n?-1:1))%(2*Math.PI));let a=t+s*Math.cos(i),_=e+s*Math.sin(i),f=t+s*Math.cos(r),u=e+s*Math.sin(r),l=n?0:1,c=i-r;c<0&&(c+=2*Math.PI);let g=n?c>Math.PI?0:1:c>Math.PI?1:0,{x:y,y:S}=this.__getTransformScale(),p=this.__matrixTransform(a,_);this.lineTo(f,u),this.__addPathCommand(`A ${s*y} ${s*S} 0 ${g} ${l} ${p.x} ${p.y}`),this.__currentPosition={x:a,y:_}}setLineDash(t){this.lineDash=t.length>0?t.join(","):null}setTransform(t,e,s,r,i,n){this.__transformMatrix=t instanceof DOMMatrix?new DOMMatrix([t.a,t.b,t.c,t.d,t.e,t.f]):new DOMMatrix([t,e,s,r,i,n])}getTransform(){let{a:t,b:e,c:s,d:r,e:i,f:n}=this.__transformMatrix;return new DOMMatrix([t,e,s,r,i,n])}resetTransform(){this.setTransform(1,0,0,1,0,0)}scale(t,e){e===void 0&&(e=t),!(isNaN(t)||isNaN(e)||!isFinite(t)||!isFinite(e))&&this.setTransform(this.getTransform().scale(t,e))}translate(t,e){this.setTransform(this.getTransform().translate(t,e))}__matrixTransform(t,e){return new DOMPoint(t,e).matrixTransform(this.__transformMatrix)}__getTransformScale(){return{x:Math.hypot(this.__transformMatrix.a,this.__transformMatrix.b),y:Math.hypot(this.__transformMatrix.c,this.__transformMatrix.d)}}};export{d as Context};
2
- //# sourceMappingURL=dist-CMWKVHC7.js.map
1
+ import"./chunk-FY3BTKY4.js";function S(_){let t={left:"start",right:"end",center:"middle",start:"start",end:"end"};return t[_]||t.start}function b(_){let t={alphabetic:"alphabetic",hanging:"hanging",top:"text-before-edge",bottom:"text-after-edge",middle:"central"};return t[_]||t.alphabetic}var v={"font-style":"normal","font-weight":"normal","dominant-baseline":"alphabetic"};function c(_,t){return t===v[_]?void 0:t}var h={strokeStyle:{svgAttr:"stroke",canvas:"#000000",svg:"none",apply:"stroke"},fillStyle:{svgAttr:"fill",canvas:"#000000",svg:null,apply:"fill"},lineWidth:{svgAttr:"stroke-width",canvas:1,svg:1,apply:"stroke"},font:{canvas:"10px sans-serif"},textAlign:{canvas:"start"},textBaseline:{canvas:"alphabetic"},lineDash:{svgAttr:"stroke-dasharray",canvas:null,svg:null,apply:"stroke"}},T=/rgba\(\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\s*,\s*(\d?\.?\d*)\s*\)/i,u=class{width;height;canvas;__document;__ctx;__canvas;__root;__currentElement;__styleStack;__groupStack;__currentDefaultPath;__currentPosition;__transformMatrix;__transformMatrixStack;__fontCache=new Map;strokeStyle;fillStyle;lineWidth;font;textAlign;textBaseline;lineDash;constructor(t,e,s={}){this.width=t,this.height=e,this.canvas=this,this.__document=s.document||document,s.ctx?this.__ctx=s.ctx:(this.__canvas=this.__document.createElement("canvas"),this.__ctx=this.__canvas.getContext("2d")),this.__setDefaultStyles(),this.__styleStack=[this.__getStyleState()],this.__groupStack=[],this.__root=this.__document.createElementNS("http://www.w3.org/2000/svg","svg"),this.__root.setAttribute("version","1.1"),this.__root.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.__root.setAttribute("width",String(t)),this.__root.setAttribute("height",String(e)),this.__currentElement=this.__document.createElementNS("http://www.w3.org/2000/svg","g"),this.__root.appendChild(this.__currentElement),this.__currentDefaultPath="",this.__currentPosition={},this.__transformMatrix=new DOMMatrix,this.resetTransform()}__createElement(t,e={},s){let r=this.__document.createElementNS("http://www.w3.org/2000/svg",t);s&&(r.setAttribute("fill","none"),r.setAttribute("stroke","none"));for(let i of Object.keys(e)){let n=e[i];n!=null&&r.setAttribute(i,n)}return r}__setDefaultStyles(){for(let t of Object.keys(h))this[t]=h[t].canvas}__applyStyleState(t){for(let e of Object.keys(t))this[e]=t[e]}__getStyleState(){let t={};for(let e of Object.keys(h))t[e]=this[e];return t}__applyTransformation(t,e){let{a:s,b:r,c:i,d:n,e:a,f:o}=e||this.getTransform();if(s===1&&r===0&&i===0&&n===1&&t.hasAttribute("x")&&t.hasAttribute("y")){a!==0&&t.setAttribute("x",String(Number(t.getAttribute("x"))+a)),o!==0&&t.setAttribute("y",String(Number(t.getAttribute("y"))+o));return}t.setAttribute("transform",`matrix(${s} ${r} ${i} ${n} ${a} ${o})`)}__applyStyleToCurrentElement(t){let e=this.__currentElement;for(let s of Object.keys(h)){let r=h[s],i=this[s];if(!r.apply?.includes(t)||r.svg===i)continue;let n=(r.svgAttr==="stroke"||r.svgAttr==="fill")&&typeof i=="string"&&i.includes("rgba")?T.exec(i):null;if(n)e.setAttribute(r.svgAttr,`rgb(${n[1]},${n[2]},${n[3]})`),e.setAttribute(`${r.svgAttr}-opacity`,n[4]);else if(s==="lineWidth"){let a=this.__getTransformScale();e.setAttribute(r.svgAttr,String(i*Math.max(a.x,a.y)))}else e.setAttribute(r.svgAttr,i)}t==="fill"&&e.getAttribute("stroke")==="none"&&e.removeAttribute("stroke")}__closestGroupOrSvg(t){return t=t||this.__currentElement,t.nodeName==="g"||t.nodeName==="svg"?t:this.__closestGroupOrSvg(t.parentNode)}getSvg(){return this.__root}save(){let t=this.__createElement("g"),e=this.__closestGroupOrSvg();this.__groupStack.push(e),e.appendChild(t),this.__currentElement=t,this.__styleStack.push(this.__getStyleState()),this.__transformMatrixStack||(this.__transformMatrixStack=[]),this.__transformMatrixStack.push(this.getTransform())}restore(){this.__currentElement=this.__groupStack.pop(),this.__currentElement||(this.__currentElement=this.__root.childNodes[0]),this.__applyStyleState(this.__styleStack.pop()),this.__transformMatrixStack&&this.__transformMatrixStack.length>0&&this.setTransform(this.__transformMatrixStack.pop())}beginPath(){this.__currentDefaultPath="",this.__currentPosition={};let t=this.__createElement("path",{},!0);this.__closestGroupOrSvg().appendChild(t),this.__currentElement=t}__applyCurrentDefaultPath(){this.__currentElement.nodeName==="path"&&this.__currentElement.setAttribute("d",this.__currentDefaultPath)}__addPathCommand(t){this.__currentDefaultPath+=" ",this.__currentDefaultPath+=t}moveTo(t,e){this.__currentElement.nodeName!=="path"&&this.beginPath(),this.__currentPosition={x:t,y:e};let s=this.__matrixTransform(t,e);this.__addPathCommand(`M ${s.x} ${s.y}`)}closePath(){this.__currentDefaultPath&&this.__addPathCommand("Z")}lineTo(t,e){this.__currentPosition={x:t,y:e};let s=this.__matrixTransform(t,e);this.__addPathCommand(this.__currentDefaultPath.includes("M")?`L ${s.x} ${s.y}`:`M ${s.x} ${s.y}`)}quadraticCurveTo(t,e,s,r){this.__currentPosition={x:s,y:r};let i=this.__matrixTransform(t,e),n=this.__matrixTransform(s,r);this.__addPathCommand(`Q ${i.x} ${i.y} ${n.x} ${n.y}`)}__applyPaintOrder(t,e){let s=this.__currentElement;s.nodeName==="path"&&s.hasAttribute(e)&&s.getAttribute(e)!=="none"&&s.setAttribute("paint-order",t)}stroke(){this.__applyPaintOrder("fill stroke markers","fill"),this.__applyCurrentDefaultPath(),this.__applyStyleToCurrentElement("stroke")}fill(){this.__applyPaintOrder("stroke fill markers","stroke"),this.__applyCurrentDefaultPath(),this.__applyStyleToCurrentElement("fill")}fillRect(t,e,s,r){let i=this.__createElement("rect",{x:t,y:e,width:s,height:r},!0);this.__closestGroupOrSvg().appendChild(i),this.__currentElement=i,this.__applyTransformation(i),this.__applyStyleToCurrentElement("fill")}strokeRect(t,e,s,r){let i=this.__createElement("rect",{x:t,y:e,width:s,height:r},!0);this.__closestGroupOrSvg().appendChild(i),this.__currentElement=i,this.__applyTransformation(i),this.__applyStyleToCurrentElement("stroke")}__parsedFont(){let t=this.__fontCache.get(this.font);if(t)return t;let e=document.createElement("span");return e.setAttribute("style",`font:${this.font}`),this.__fontCache.set(this.font,e.style),e.style}fillText(t,e,s){let r=this.__parsedFont(),i=this.__closestGroupOrSvg(),n=this.__createElement("text",{"font-family":r.fontFamily,"font-size":r.fontSize,"font-style":c("font-style",r.fontStyle),"font-weight":c("font-weight",r.fontWeight),x:e,y:s,"text-anchor":S(this.textAlign),"dominant-baseline":c("dominant-baseline",b(this.textBaseline))},!0);n.appendChild(this.__document.createTextNode(t)),this.__currentElement=n,this.__applyTransformation(n),this.__applyStyleToCurrentElement("fill"),i.appendChild(n)}measureText(t){return this.__ctx.font=this.font,this.__ctx.measureText(t)}arc(t,e,s,r,i,n){if(r===i)return;r=r%(2*Math.PI),i=i%(2*Math.PI),r===i&&(i=(i+2*Math.PI-.001*(n?-1:1))%(2*Math.PI));let a=t+s*Math.cos(i),o=e+s*Math.sin(i),m=t+s*Math.cos(r),p=e+s*Math.sin(r),d=n?0:1,l=i-r;l<0&&(l+=2*Math.PI);let g=n?l>Math.PI?0:1:l>Math.PI?1:0,{x:y,y:x}=this.__getTransformScale(),f=this.__matrixTransform(a,o);this.lineTo(m,p),this.__addPathCommand(`A ${s*y} ${s*x} 0 ${g} ${d} ${f.x} ${f.y}`),this.__currentPosition={x:a,y:o}}setLineDash(t){this.lineDash=t.length>0?t.join(","):null}setTransform(t,e,s,r,i,n){this.__transformMatrix=t instanceof DOMMatrix?new DOMMatrix([t.a,t.b,t.c,t.d,t.e,t.f]):new DOMMatrix([t,e,s,r,i,n])}getTransform(){let{a:t,b:e,c:s,d:r,e:i,f:n}=this.__transformMatrix;return new DOMMatrix([t,e,s,r,i,n])}resetTransform(){this.setTransform(1,0,0,1,0,0)}scale(t,e){e===void 0&&(e=t),!(isNaN(t)||isNaN(e)||!isFinite(t)||!isFinite(e))&&this.setTransform(this.getTransform().scale(t,e))}translate(t,e){this.setTransform(this.getTransform().translate(t,e))}__matrixTransform(t,e){return new DOMPoint(t,e).matrixTransform(this.__transformMatrix)}__getTransformScale(){return{x:Math.hypot(this.__transformMatrix.a,this.__transformMatrix.b),y:Math.hypot(this.__transformMatrix.c,this.__transformMatrix.d)}}};export{u as Context};
2
+ //# sourceMappingURL=dist-GXYZN4ZR.js.map