@sjcrh/proteinpaint-client 2.167.0 → 2.167.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{2dmaf-VLW5XJ4O.js → 2dmaf-6M6QWXAQ.js} +3 -3
- package/dist/{AIProjectAdmin-X3TBCRPR.js → AIProjectAdmin-2NHMC3IV.js} +5 -5
- package/dist/{AppHeader-YA7FCKVM.js → AppHeader-CTHEWSZD.js} +11 -11
- package/dist/{BoxPlot-PAZYARCX.js → BoxPlot-3U6ZAKKO.js} +9 -9
- package/dist/{CorrelationVolcano-S35GWKV5.js → CorrelationVolcano-2ASIR6KY.js} +6 -6
- package/dist/{DifferentialAnalysis-DTDFAUXT.js → DifferentialAnalysis-C3NYGF7U.js} +9 -9
- package/dist/{Disco-OE6YY3MH.js → Disco-2QLBZ3X5.js} +6 -6
- package/dist/{Disco.UI-2CCWETSM.js → Disco.UI-GPIIPM2P.js} +8 -8
- package/dist/{GB-LIHKHJ32.js → GB-FH6YQGHI.js} +6 -6
- package/dist/{HicApp-6AYCPCW6.js → HicApp-TI2II3SZ.js} +5 -5
- package/dist/{NumBinaryEditor-ONJB4DKM.js → NumBinaryEditor-O42T63EX.js} +3 -3
- package/dist/{NumBinaryEditor.unit.spec-Y6DGBAIB.js → NumBinaryEditor.unit.spec-UMB2PHT5.js} +4 -4
- package/dist/{NumContEditor-6WGAI3PH.js → NumContEditor-7NOUKPCV.js} +3 -3
- package/dist/{NumContEditor.unit.spec-6LT5MALH.js → NumContEditor.unit.spec-JGXJ2HLE.js} +4 -4
- package/dist/{NumCustomBinEditor-K4OD7SWD.js → NumCustomBinEditor-6CHN3KX3.js} +4 -4
- package/dist/{NumCustomBinEditor.unit.spec-O6QYV6Q4.js → NumCustomBinEditor.unit.spec-RJPQLE3E.js} +4 -4
- package/dist/{NumDiscreteEditor-AFLINO62.js → NumDiscreteEditor-AFTUKU4K.js} +5 -5
- package/dist/{NumDiscreteEditor.unit.spec-3VWWSS24.js → NumDiscreteEditor.unit.spec-GKR6ZNBQ.js} +4 -4
- package/dist/{NumRegularBinEditor-IRKC5SVF.js → NumRegularBinEditor-UJ5WQPHR.js} +4 -4
- package/dist/{NumRegularBinEditor.unit.spec-2ZTI7HR2.js → NumRegularBinEditor.unit.spec-5HGJQEX7.js} +4 -4
- package/dist/{NumSplineEditor-DBW6XE4N.js → NumSplineEditor-JANA2DUE.js} +3 -3
- package/dist/{NumSplineEditor.unit.spec-645ZQXXL.js → NumSplineEditor.unit.spec-UYAMAKZD.js} +4 -4
- package/dist/{NumericDensity-27SM2P45.js → NumericDensity-YE5R4CNP.js} +3 -3
- package/dist/{NumericDensity.unit.spec-DM7PPSMV.js → NumericDensity.unit.spec-SVEB5U2S.js} +3 -3
- package/dist/{NumericHandler-KFQ2OSUR.js → NumericHandler-WW4M7YW2.js} +4 -4
- package/dist/{NumericHandler.unit.spec-RNXGCYH7.js → NumericHandler.unit.spec-2BWDFO53.js} +4 -4
- package/dist/{SC-SUUATZYR.js → SC-UGJGMBL7.js} +5 -5
- package/dist/{Volcano-DEKTKEEZ.js → Volcano-IU76MEIL.js} +7 -7
- package/dist/{WSIViewer-SWX4OXHY.js → WSIViewer-3S7N4UDO.js} +4 -4
- package/dist/{WsiSamplesPlot-OCVLBBBD.js → WsiSamplesPlot-4CAOHWCL.js} +4 -4
- package/dist/{adSandbox-VGHHJWLL.js → adSandbox-AEBS3RTL.js} +4 -4
- package/dist/{alphaGenome-YOJWFJCS.js → alphaGenome-F2PB4SGI.js} +6 -6
- package/dist/{app-3TXV35H5.js → app-6SKETLMT.js} +3 -3
- package/dist/{app-NUTP544R.js → app-GBEF2HBR.js} +20 -20
- package/dist/app.js +9 -9
- package/dist/{bam-LXDFDUBH.js → bam-5SE6XQJV.js} +5 -5
- package/dist/{barchart-P4BTYT5K.js → barchart-AUSOT2XB.js} +9 -9
- package/dist/{barchart.data-6WIS5D4I.js → barchart.data-GYCNBRPY.js} +3 -3
- package/dist/{barchart.events-V4ANDWUH.js → barchart.events-QTSWNYXO.js} +9 -9
- package/dist/{barchart.integration.spec-QU3Y3YHM.js → barchart.integration.spec-LORJLJVX.js} +17 -17
- package/dist/{block-OGJAZG3E.js → block-QLSIELXK.js} +24 -24
- package/dist/{block.init-SNZKGO2G.js → block.init-OOLEA6ZK.js} +4 -4
- package/dist/{block.mds.expressionrank-WYV55X5Y.js → block.mds.expressionrank-D2KUISXZ.js} +5 -5
- package/dist/{block.mds.geneboxplot-2LVYSSSU.js → block.mds.geneboxplot-AMYBWXPS.js} +4 -4
- package/dist/{block.mds.junction-YY3P64U5.js → block.mds.junction-OG335MBK.js} +10 -10
- package/dist/{block.mds.svcnv-JFNOLZX3.js → block.mds.svcnv-WYDBQ6FV.js} +17 -17
- package/dist/{block.svg-JBR6OYAD.js → block.svg-OH73245R.js} +3 -3
- package/dist/{block.tk.aicheck-2XDMLOND.js → block.tk.aicheck-CG5THFW2.js} +3 -3
- package/dist/{block.tk.ase-TC3NY65S.js → block.tk.ase-G2L3G5MQ.js} +5 -5
- package/dist/{block.tk.bam-YA32442V.js → block.tk.bam-DXWCA6EU.js} +3 -3
- package/dist/{block.tk.bedgraphdot-TRNM4O4F.js → block.tk.bedgraphdot-LF3TFPNL.js} +3 -3
- package/dist/{block.tk.bigwig.ui-6JJG42M3.js → block.tk.bigwig.ui-JKXZ3VDF.js} +3 -3
- package/dist/{block.tk.hicstraw-HEQXBJZN.js → block.tk.hicstraw-ZK4RKFB6.js} +4 -4
- package/dist/{block.tk.junction-7LWL3N6V.js → block.tk.junction-ZB7Q2NLB.js} +7 -7
- package/dist/{block.tk.junction.textmatrixui-6CTLQ2M7.js → block.tk.junction.textmatrixui-ZYNQWKIW.js} +4 -4
- package/dist/{block.tk.ld-SG4ZJ5VB.js → block.tk.ld-7H64HGER.js} +6 -6
- package/dist/{block.tk.menu-FNKM5H5D.js → block.tk.menu-WFVKAH74.js} +3 -3
- package/dist/{block.tk.pgv-KNLGEASZ.js → block.tk.pgv-632LLSBI.js} +6 -6
- package/dist/{brainImaging-RO5P7ZR6.js → brainImaging-AEPTHIQF.js} +5 -5
- package/dist/{chat-JS4NIRVH.js → chat-3XZCAFDD.js} +7 -7
- package/dist/{chunk-XQGO3DQ2.js → chunk-22O6F463.js} +5 -5
- package/dist/{chunk-YUL2RO7I.js → chunk-2OVIUIIL.js} +5 -5
- package/dist/{chunk-353ULT52.js → chunk-37CK5IGW.js} +5 -5
- package/dist/{chunk-SO4QKH47.js → chunk-3MGBC64I.js} +4 -4
- package/dist/{chunk-GCQYBMGL.js → chunk-3NWLWH4G.js} +11 -11
- package/dist/{chunk-YEYC4PLD.js → chunk-46T54RUY.js} +5 -5
- package/dist/{chunk-IZ77ZFBY.js → chunk-4GKQ5PWY.js} +2 -2
- package/dist/{chunk-SWDSU33C.js → chunk-5AMBV2JE.js} +11 -11
- package/dist/{chunk-DRFGAPYN.js → chunk-5DMFTXUZ.js} +3 -3
- package/dist/{chunk-H2QGRBCK.js → chunk-5QJDZHRU.js} +3 -3
- package/dist/{chunk-FMZEW7AB.js → chunk-5WAVKWL6.js} +5 -5
- package/dist/{chunk-PZRXLO7V.js → chunk-74WMSW3E.js} +3 -3
- package/dist/{chunk-WVZV43PF.js → chunk-AFU66YOW.js} +3 -3
- package/dist/{chunk-NCL2K6UD.js → chunk-AUJ2YUXV.js} +2 -2
- package/dist/{chunk-MRDHGWNV.js → chunk-B6I64LSV.js} +6 -6
- package/dist/{chunk-NNDNKEFI.js → chunk-BAJ74DKS.js} +9 -9
- package/dist/{chunk-ETBTUFRA.js → chunk-CCB5KYFQ.js} +4 -4
- package/dist/{chunk-W4IQ4XYS.js → chunk-CKLYFA7H.js} +2 -2
- package/dist/{chunk-CDVICC3E.js → chunk-CLYRJ466.js} +2 -2
- package/dist/{chunk-ECFK2NV5.js → chunk-CPHCZZWT.js} +2 -2
- package/dist/{chunk-KHOR7BCS.js → chunk-CUADOD2T.js} +2 -2
- package/dist/{chunk-XAIW4R76.js → chunk-CV6ID6T7.js} +6 -6
- package/dist/{chunk-B5YJ4S2E.js → chunk-CWHBWY3B.js} +2 -2
- package/dist/{chunk-OA7TPCTX.js → chunk-GLSDMBHR.js} +2 -2
- package/dist/{chunk-TRS2KOXE.js → chunk-H3BSKMND.js} +10 -10
- package/dist/{chunk-MJM2U67B.js → chunk-H6HP4H3U.js} +8 -8
- package/dist/{chunk-PZY4L6NK.js → chunk-HUDESZGX.js} +4 -4
- package/dist/{chunk-PN6GLQWD.js → chunk-J7IU77CA.js} +99 -99
- package/dist/{chunk-DRDIOSDW.js → chunk-JTPN3BRG.js} +2 -2
- package/dist/{chunk-QCTJ6JA2.js → chunk-KCAMFDJH.js} +6 -6
- package/dist/{chunk-ZLBDDGSP.js → chunk-LMELY5Z2.js} +6 -6
- package/dist/{chunk-DACGCI3Q.js → chunk-LVQK62CV.js} +3 -3
- package/dist/{chunk-C4NAQESE.js → chunk-MCVLRF66.js} +2 -2
- package/dist/{chunk-6ADTREVX.js → chunk-MK7RRJTX.js} +1 -1
- package/dist/{chunk-6ADTREVX.js.map → chunk-MK7RRJTX.js.map} +2 -2
- package/dist/{chunk-X62MQS7A.js → chunk-MLD7DW5I.js} +2 -2
- package/dist/{chunk-RYT4A7AQ.js → chunk-NEF7LGNE.js} +38 -38
- package/dist/{chunk-5GQEXGQC.js → chunk-O7BAQPP3.js} +5 -5
- package/dist/{chunk-XF36ROHS.js → chunk-OGCF6E6I.js} +12 -12
- package/dist/{chunk-MXSMHJIP.js → chunk-OGWY4MOB.js} +9 -9
- package/dist/{chunk-DOLIDO2R.js → chunk-PQD6K5W5.js} +3 -3
- package/dist/{chunk-OLUMAQOQ.js → chunk-Q4FYGFTQ.js} +3 -3
- package/dist/{chunk-TWWRXWWS.js → chunk-QX5QVWUP.js} +4 -4
- package/dist/{chunk-O552UNW2.js → chunk-RA2KI64U.js} +4 -4
- package/dist/{chunk-7M6V7OGP.js → chunk-RHHLAKYS.js} +6 -6
- package/dist/{chunk-YBDLY45S.js → chunk-RL7RU2V7.js} +2 -2
- package/dist/{chunk-Q6FKQ63P.js → chunk-RQ7CE7SK.js} +2 -2
- package/dist/{chunk-V4F264MW.js → chunk-RX552WU6.js} +5 -5
- package/dist/{chunk-5HXU7P5T.js → chunk-S7V4SFKB.js} +2 -2
- package/dist/{chunk-D7HC37OF.js → chunk-SRBO57AD.js} +3 -3
- package/dist/{chunk-ZOD2EZOP.js → chunk-SYGLOTOV.js} +31 -31
- package/dist/{chunk-OSNUFZAX.js → chunk-UZ466XO3.js} +2 -2
- package/dist/{chunk-UAKYIZJI.js → chunk-VDF5W47R.js} +6 -6
- package/dist/{chunk-FRLEROW5.js → chunk-W4SEWZF2.js} +3 -3
- package/dist/{chunk-PX7A6LBY.js → chunk-W5EG334J.js} +67 -62
- package/dist/chunk-W5EG334J.js.map +7 -0
- package/dist/{chunk-HXT3XNAX.js → chunk-XRIM2YJZ.js} +3 -3
- package/dist/{chunk-YFZH3WDM.js → chunk-YSWMQO23.js} +2 -2
- package/dist/{chunk-N4D5G5IT.js → chunk-ZBZXIWSK.js} +2 -2
- package/dist/{chunk-BW2MEKH4.js → chunk-ZG63ZUDE.js} +3 -3
- package/dist/{chunk-TMEYYK4R.js → chunk-ZGQ3BMLW.js} +9 -9
- package/dist/{chunk-5KUQSXQC.js → chunk-ZNINQ3FN.js} +5 -5
- package/dist/{chunk-SBEA552U.js → chunk-ZQZWM544.js} +8 -8
- package/dist/{condition-KDKI25VM.js → condition-4FVKPSQ2.js} +3 -3
- package/dist/{controls-26FVLZRQ.js → controls-ZWBN566I.js} +5 -5
- package/dist/{controls.config-O6YC7P4M.js → controls.config-YU4W3CDL.js} +4 -4
- package/dist/{correlation-DVDT43OT.js → correlation-VADB4SQO.js} +20 -20
- package/dist/{cuminc-T6EYUBUX.js → cuminc-4BXE2YS6.js} +6 -6
- package/dist/{cuminc.integration.spec-P4YPZXDY.js → cuminc.integration.spec-XQREKHVA.js} +11 -11
- package/dist/{customdata.inputui-XPXZ7KB5.js → customdata.inputui-VBQWT3M7.js} +3 -3
- package/dist/{dataDownload-46POC5GF.js → dataDownload-QIZKBKH7.js} +3 -3
- package/dist/{dataDownload.integration.spec-L7P5YMF7.js → dataDownload.integration.spec-MLJEHLYD.js} +11 -11
- package/dist/{databrowser.ui-DQEQXZCP.js → databrowser.ui-6UIR4ULJ.js} +20 -20
- package/dist/{dictionary-MBERWWV4.js → dictionary-FLWIWAC6.js} +3 -3
- package/dist/{e2pca-5HU65GVJ.js → e2pca-NKWSJRXM.js} +3 -3
- package/dist/{ep-ECP7H37A.js → ep-EPN3AR6D.js} +3 -3
- package/dist/{expclust.gdc.spec-553FSEDH.js → expclust.gdc.spec-ZRUH5E6E.js} +11 -11
- package/dist/{facet-ND335XOF.js → facet-BM7SLACF.js} +8 -8
- package/dist/{frequencyChart-2OHEOWEU.js → frequencyChart-HBXRIBAW.js} +13 -13
- package/dist/{frequencyChart.integration.spec-NW4DDLRX.js → frequencyChart.integration.spec-YJUYZWM6.js} +11 -11
- package/dist/{geneExpClustering-GHGBONBF.js → geneExpClustering-4VD5PAWN.js} +7 -7
- package/dist/{geneExpression-UGYGT6DM.js → geneExpression-6OT2Y4P6.js} +3 -3
- package/dist/{geneExpression-X6HAUFPK.js → geneExpression-EAMEZXJQ.js} +2 -2
- package/dist/{geneORA-YKXRPEYY.js → geneORA-RI2AG7JT.js} +5 -5
- package/dist/{geneVariant-J4O45233.js → geneVariant-FYYEOTWA.js} +3 -3
- package/dist/{geneVariant-363FWTVR.js → geneVariant-PAKVDVC4.js} +4 -4
- package/dist/{genefusion.ui-DWAZJDO4.js → genefusion.ui-QWC42XWQ.js} +3 -3
- package/dist/{geneset-64VRPPTK.js → geneset-XA6IWP3Q.js} +3 -3
- package/dist/{genomeBrowser.spec-AN3YXXBS.js → genomeBrowser.spec-LRKXWXNT.js} +11 -11
- package/dist/{grin2-Y57FKOV6.js → grin2-O6TETVZ3.js} +4 -4
- package/dist/{grin2-E2WNBPLR.js → grin2-WLB7BY3S.js} +3 -3
- package/dist/{gsea-PNORGHHB.js → gsea-ZM4WOPSQ.js} +8 -8
- package/dist/{hierCluster-VAQBNVKU.js → hierCluster-LD43LLRC.js} +17 -17
- package/dist/{hierCluster-B7YMJ3UK.js → hierCluster-ZGYRS2WV.js} +16 -16
- package/dist/{hierCluster.config-D7MDBQ35.js → hierCluster.config-O5HUOFNH.js} +6 -6
- package/dist/{hierCluster.integration.spec-UHRGPV6T.js → hierCluster.integration.spec-37UNKHTH.js} +15 -15
- package/dist/{hierCluster.interactivity-NJFEZILS.js → hierCluster.interactivity-B27ETKRP.js} +4 -4
- package/dist/{imagePlot-LWJPXMNK.js → imagePlot-LJZVGNDJ.js} +6 -6
- package/dist/importPlot-RMVENQRD.js +8 -0
- package/dist/{launch.adhoc-6GLLB7TX.js → launch.adhoc-S3XHRSLN.js} +8 -8
- package/dist/{leftlabel.sample-3SO3AJ2U.js → leftlabel.sample-J6PCA3UB.js} +7 -7
- package/dist/{lollipop-LJEVK7YO.js → lollipop-OZTV4C7A.js} +5 -5
- package/dist/{maf-3EW7QN3S.js → maf-3SRLCKGO.js} +3 -3
- package/dist/{maftimeline-YMX542CP.js → maftimeline-6F2LQJU6.js} +3 -3
- package/dist/{matrix-CR2EK5EU.js → matrix-FIXOFAB4.js} +14 -14
- package/dist/{matrix-YI4D3YQI.js → matrix-O5KPDLM2.js} +14 -14
- package/dist/{matrix.config-TOC4QWE7.js → matrix.config-WG7HFJL4.js} +5 -5
- package/dist/{matrix.controls-27D3Q4GD.js → matrix.controls-QQLBUUYP.js} +5 -5
- package/dist/{matrix.data-ETVML2F7.js → matrix.data-6JLF5HVI.js} +4 -4
- package/dist/{matrix.integration.spec-DDXKS5GP.js → matrix.integration.spec-ZJYWNQ57.js} +11 -11
- package/dist/{matrix.interactivity-XTNDVF55.js → matrix.interactivity-ZZY5ET4E.js} +6 -6
- package/dist/{matrix.layout-NGPK4EEU.js → matrix.layout-XKFB4PKY.js} +4 -4
- package/dist/{matrix.renderers-ILFHUPHQ.js → matrix.renderers-4LST6PBA.js} +4 -4
- package/dist/{matrix.sort.unit.spec-DAMINC6B.js → matrix.sort.unit.spec-CTSUNUWB.js} +5 -5
- package/dist/{matrix.sorterUi.unit.spec-M3RXU6B2.js → matrix.sorterUi.unit.spec-VQFMHIYI.js} +6 -6
- package/dist/{mavb-EC5VS3RS.js → mavb-ECQ2CQ7F.js} +4 -4
- package/dist/{mds.fimo-7SXXTBUH.js → mds.fimo-JDYDT5NK.js} +3 -3
- package/dist/{mds.samplescatterplot-CALFSFR6.js → mds.samplescatterplot-PEJBVSTO.js} +5 -5
- package/dist/{mds.survivalplot-NRA67V4T.js → mds.survivalplot-GYK6VRQT.js} +3 -3
- package/dist/{oncomatrix-FOCP66RC.js → oncomatrix-ZXDJMLN3.js} +7 -7
- package/dist/{oncomatrix.spec-XB232WT7.js → oncomatrix.spec-HOPRIG3I.js} +11 -11
- package/dist/{plot.2dvaf-GSQS5J6Y.js → plot.2dvaf-Y4SZUHLD.js} +3 -3
- package/dist/{plot.app-RHPEFX47.js → plot.app-W5Z3C7P5.js} +7 -7
- package/dist/{plot.barplot-2Q5YF3MU.js → plot.barplot-B2PRZDKV.js} +3 -3
- package/dist/{plot.boxplot-LTYLWTF4.js → plot.boxplot-J7ET34FY.js} +3 -3
- package/dist/{plot.brainImaging-EFRI4QV7.js → plot.brainImaging-ISY4P6RT.js} +2 -2
- package/dist/{plot.disco-HHYCMRCZ.js → plot.disco-D7AL42PW.js} +3 -3
- package/dist/{plot.dzi-BCTPDUDK.js → plot.dzi-O32LH65U.js} +2 -2
- package/dist/{plot.ssgq-ES2ZP7MO.js → plot.ssgq-WF7262IZ.js} +4 -4
- package/dist/{plot.vaf2cov-W72Y2IHA.js → plot.vaf2cov-OB6UKSFQ.js} +3 -3
- package/dist/{plot.wsi-TPZXI45Q.js → plot.wsi-J5S4YYXN.js} +2 -2
- package/dist/{polar-MT3K2WDL.js → polar-LIJORXR6.js} +8 -8
- package/dist/{profile.spec-DOQYKG6P.js → profile.spec-3KE4CREI.js} +11 -11
- package/dist/{profileBarchart-A4UWV2YA.js → profileBarchart-UQHOJB5V.js} +8 -8
- package/dist/{profileForms-VONTWVOF.js → profileForms-WTYVTIUN.js} +8 -8
- package/dist/{profilePlot-OK5VKWO4.js → profilePlot-SOXXEUAT.js} +8 -8
- package/dist/{profileRadar-VLEZJCD7.js → profileRadar-2OHJ2RIU.js} +8 -8
- package/dist/{profileRadarFacility-QPSSUTB6.js → profileRadarFacility-GHLG3QNG.js} +8 -8
- package/dist/{qualitative-RJKAWHQR.js → qualitative-B3OY7A7P.js} +3 -3
- package/dist/{regression-GV73BYCQ.js → regression-HO2TO4XT.js} +17 -17
- package/dist/{regression.inputs-PVIJHCRE.js → regression.inputs-JN3ZMIOP.js} +17 -17
- package/dist/{regression.inputs.term-V5I3EP6M.js → regression.inputs.term-67HVMXFZ.js} +17 -17
- package/dist/{regression.inputs.values.table-Y37EJUQB.js → regression.inputs.values.table-JXJK2YZT.js} +15 -15
- package/dist/{regression.integration.spec-JD32ODD2.js → regression.integration.spec-L54ZS5VY.js} +11 -11
- package/dist/{regression.results-AHAYXYGI.js → regression.results-3ZSFKUNN.js} +4 -4
- package/dist/{regression.spec-FGYEES5G.js → regression.spec-SVWCQX2U.js} +11 -11
- package/dist/{report-JYIEDDW5.js → report-IHX7XSOI.js} +7 -7
- package/dist/{runChart-CVAWIBA3.js → runChart-QLQMK3OE.js} +13 -13
- package/dist/{runchart.integration.spec-5Z4IHQU5.js → runchart.integration.spec-5NVY5GHR.js} +11 -11
- package/dist/{sampleScatter.spec-QNFWS2Y7.js → sampleScatter.spec-4Q5CQQWH.js} +11 -11
- package/dist/{sampleView-GKYHS3WO.js → sampleView-7WHDFHB5.js} +6 -6
- package/dist/{samplelst-CHBS5BGY.js → samplelst-34GJVLVD.js} +3 -3
- package/dist/{samplematrix-IK4YDAID.js → samplematrix-L2HOSLUT.js} +5 -5
- package/dist/{scatter-NDA5YSCP.js → scatter-X6AAM2LJ.js} +12 -12
- package/dist/{scatter.integration.spec-GV3EIFGT.js → scatter.integration.spec-QSH3PLBK.js} +13 -13
- package/dist/{selectGenomeWithTklst-X7RAGKRC.js → selectGenomeWithTklst-AJS2IPPW.js} +4 -4
- package/dist/{singleCellPlot-7F735HTR.js → singleCellPlot-7JEWDVSR.js} +9 -9
- package/dist/{singlecell-EO3WYGS7.js → singlecell-IC5KU72L.js} +6 -6
- package/dist/{singlecell-YMYLKTSC.js → singlecell-NWANPXWM.js} +7 -7
- package/dist/{snp-6KN4AWBB.js → snp-PSRNMTL6.js} +3 -3
- package/dist/{snplocus-CLM4WHVH.js → snplocus-QCAVDYLR.js} +3 -3
- package/dist/{spliceevent.a53ss.diagram-PKFVC2N4.js → spliceevent.a53ss.diagram-SGDJKUEC.js} +3 -3
- package/dist/{spliceevent.exonskip.diagram-XV2Z7AYB.js → spliceevent.exonskip.diagram-BUYTHCK5.js} +4 -4
- package/dist/{spliceevent.noeventdiagram-L5L2BJL5.js → spliceevent.noeventdiagram-OJZJUHXP.js} +3 -3
- package/dist/{ssGSEA-W6N4CXMD.js → ssGSEA-UUZG57MF.js} +3 -3
- package/dist/{summarizeCnvGeneexp-57LZ5B2Q.js → summarizeCnvGeneexp-ZVZYWP43.js} +5 -5
- package/dist/{summarizeGeneexpSurvival-UQX3VZUK.js → summarizeGeneexpSurvival-7XJRMT6M.js} +5 -5
- package/dist/{summarizeMutationDiagnosis-5SWO42E4.js → summarizeMutationDiagnosis-ZKLXOVY2.js} +5 -5
- package/dist/{summarizeMutationSurvival-EOU5QOB6.js → summarizeMutationSurvival-S4YPGLWA.js} +5 -5
- package/dist/{summary-FRIKVPYZ.js → summary-RVG7JL6Y.js} +18 -18
- package/dist/{summary.integration.spec-WSI3JNTO.js → summary.integration.spec-SCD35GO4.js} +11 -11
- package/dist/{summaryInput-3L7CM52X.js → summaryInput-DMN6DTSW.js} +7 -7
- package/dist/{sunburst-HA7UGSXX.js → sunburst-QZXYILRC.js} +3 -3
- package/dist/{survival-2HZ446Y3.js → survival-6CWEBRSF.js} +7 -7
- package/dist/{survival-LJI5JEZZ.js → survival-J657VYLI.js} +3 -3
- package/dist/{survival.integration.spec-7XVO2WNF.js → survival.integration.spec-S5WE4V6M.js} +11 -11
- package/dist/{svgraph-TRPAXTNP.js → svgraph-NEKJL24M.js} +3 -3
- package/dist/{svmr-TJOCKTE2.js → svmr-5RQ5JQF2.js} +6 -6
- package/dist/{table-35RHJK4M.js → table-CG6Z6NCJ.js} +5 -5
- package/dist/{termCollection-JS6N5TAP.js → termCollection-FOQNVXB7.js} +3 -3
- package/dist/{tk-4ARNGTEQ.js → tk-2O7XOVGJ.js} +7 -7
- package/dist/{tp.ui-QZEMGVEH.js → tp.ui-S4YUVCZH.js} +12 -12
- package/dist/{tvs.dtcnv.continuous-4K7B7FXF.js → tvs.dtcnv.continuous-7BPIXZ6C.js} +3 -3
- package/dist/{tvs.samplelst-IUSDLB6P.js → tvs.samplelst-PKGFTULN.js} +3 -3
- package/dist/{violin-I5JO56GZ.js → violin-C7IBRTYP.js} +12 -12
- package/dist/{violin.integration.spec-5WVLT3DW.js → violin.integration.spec-WXRD3Z4E.js} +11 -11
- package/dist/{violin.interactivity-EFFBMTN2.js → violin.interactivity-BMG4TG5L.js} +10 -10
- package/dist/{violin.renderer-Z3AIV5RH.js → violin.renderer-WUNW6ULV.js} +4 -4
- package/dist/{vocabulary-4PHACFSG.js → vocabulary-UUNEEBM3.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-PX7A6LBY.js.map +0 -7
- package/dist/importPlot-JBVMBUCU.js +0 -8
- /package/dist/{2dmaf-VLW5XJ4O.js.map → 2dmaf-6M6QWXAQ.js.map} +0 -0
- /package/dist/{AIProjectAdmin-X3TBCRPR.js.map → AIProjectAdmin-2NHMC3IV.js.map} +0 -0
- /package/dist/{AppHeader-YA7FCKVM.js.map → AppHeader-CTHEWSZD.js.map} +0 -0
- /package/dist/{BoxPlot-PAZYARCX.js.map → BoxPlot-3U6ZAKKO.js.map} +0 -0
- /package/dist/{CorrelationVolcano-S35GWKV5.js.map → CorrelationVolcano-2ASIR6KY.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-DTDFAUXT.js.map → DifferentialAnalysis-C3NYGF7U.js.map} +0 -0
- /package/dist/{Disco-OE6YY3MH.js.map → Disco-2QLBZ3X5.js.map} +0 -0
- /package/dist/{Disco.UI-2CCWETSM.js.map → Disco.UI-GPIIPM2P.js.map} +0 -0
- /package/dist/{GB-LIHKHJ32.js.map → GB-FH6YQGHI.js.map} +0 -0
- /package/dist/{HicApp-6AYCPCW6.js.map → HicApp-TI2II3SZ.js.map} +0 -0
- /package/dist/{NumBinaryEditor-ONJB4DKM.js.map → NumBinaryEditor-O42T63EX.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-Y6DGBAIB.js.map → NumBinaryEditor.unit.spec-UMB2PHT5.js.map} +0 -0
- /package/dist/{NumContEditor-6WGAI3PH.js.map → NumContEditor-7NOUKPCV.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-6LT5MALH.js.map → NumContEditor.unit.spec-JGXJ2HLE.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-K4OD7SWD.js.map → NumCustomBinEditor-6CHN3KX3.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-O6QYV6Q4.js.map → NumCustomBinEditor.unit.spec-RJPQLE3E.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-AFLINO62.js.map → NumDiscreteEditor-AFTUKU4K.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-3VWWSS24.js.map → NumDiscreteEditor.unit.spec-GKR6ZNBQ.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-IRKC5SVF.js.map → NumRegularBinEditor-UJ5WQPHR.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-2ZTI7HR2.js.map → NumRegularBinEditor.unit.spec-5HGJQEX7.js.map} +0 -0
- /package/dist/{NumSplineEditor-DBW6XE4N.js.map → NumSplineEditor-JANA2DUE.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-645ZQXXL.js.map → NumSplineEditor.unit.spec-UYAMAKZD.js.map} +0 -0
- /package/dist/{NumericDensity-27SM2P45.js.map → NumericDensity-YE5R4CNP.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-DM7PPSMV.js.map → NumericDensity.unit.spec-SVEB5U2S.js.map} +0 -0
- /package/dist/{NumericHandler-KFQ2OSUR.js.map → NumericHandler-WW4M7YW2.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-RNXGCYH7.js.map → NumericHandler.unit.spec-2BWDFO53.js.map} +0 -0
- /package/dist/{SC-SUUATZYR.js.map → SC-UGJGMBL7.js.map} +0 -0
- /package/dist/{Volcano-DEKTKEEZ.js.map → Volcano-IU76MEIL.js.map} +0 -0
- /package/dist/{WSIViewer-SWX4OXHY.js.map → WSIViewer-3S7N4UDO.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-OCVLBBBD.js.map → WsiSamplesPlot-4CAOHWCL.js.map} +0 -0
- /package/dist/{adSandbox-VGHHJWLL.js.map → adSandbox-AEBS3RTL.js.map} +0 -0
- /package/dist/{alphaGenome-YOJWFJCS.js.map → alphaGenome-F2PB4SGI.js.map} +0 -0
- /package/dist/{app-3TXV35H5.js.map → app-6SKETLMT.js.map} +0 -0
- /package/dist/{app-NUTP544R.js.map → app-GBEF2HBR.js.map} +0 -0
- /package/dist/{bam-LXDFDUBH.js.map → bam-5SE6XQJV.js.map} +0 -0
- /package/dist/{barchart-P4BTYT5K.js.map → barchart-AUSOT2XB.js.map} +0 -0
- /package/dist/{barchart.data-6WIS5D4I.js.map → barchart.data-GYCNBRPY.js.map} +0 -0
- /package/dist/{barchart.events-V4ANDWUH.js.map → barchart.events-QTSWNYXO.js.map} +0 -0
- /package/dist/{barchart.integration.spec-QU3Y3YHM.js.map → barchart.integration.spec-LORJLJVX.js.map} +0 -0
- /package/dist/{block-OGJAZG3E.js.map → block-QLSIELXK.js.map} +0 -0
- /package/dist/{block.init-SNZKGO2G.js.map → block.init-OOLEA6ZK.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-WYV55X5Y.js.map → block.mds.expressionrank-D2KUISXZ.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-2LVYSSSU.js.map → block.mds.geneboxplot-AMYBWXPS.js.map} +0 -0
- /package/dist/{block.mds.junction-YY3P64U5.js.map → block.mds.junction-OG335MBK.js.map} +0 -0
- /package/dist/{block.mds.svcnv-JFNOLZX3.js.map → block.mds.svcnv-WYDBQ6FV.js.map} +0 -0
- /package/dist/{block.svg-JBR6OYAD.js.map → block.svg-OH73245R.js.map} +0 -0
- /package/dist/{block.tk.aicheck-2XDMLOND.js.map → block.tk.aicheck-CG5THFW2.js.map} +0 -0
- /package/dist/{block.tk.ase-TC3NY65S.js.map → block.tk.ase-G2L3G5MQ.js.map} +0 -0
- /package/dist/{block.tk.bam-YA32442V.js.map → block.tk.bam-DXWCA6EU.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-TRNM4O4F.js.map → block.tk.bedgraphdot-LF3TFPNL.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-6JJG42M3.js.map → block.tk.bigwig.ui-JKXZ3VDF.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-HEQXBJZN.js.map → block.tk.hicstraw-ZK4RKFB6.js.map} +0 -0
- /package/dist/{block.tk.junction-7LWL3N6V.js.map → block.tk.junction-ZB7Q2NLB.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-6CTLQ2M7.js.map → block.tk.junction.textmatrixui-ZYNQWKIW.js.map} +0 -0
- /package/dist/{block.tk.ld-SG4ZJ5VB.js.map → block.tk.ld-7H64HGER.js.map} +0 -0
- /package/dist/{block.tk.menu-FNKM5H5D.js.map → block.tk.menu-WFVKAH74.js.map} +0 -0
- /package/dist/{block.tk.pgv-KNLGEASZ.js.map → block.tk.pgv-632LLSBI.js.map} +0 -0
- /package/dist/{brainImaging-RO5P7ZR6.js.map → brainImaging-AEPTHIQF.js.map} +0 -0
- /package/dist/{chat-JS4NIRVH.js.map → chat-3XZCAFDD.js.map} +0 -0
- /package/dist/{chunk-XQGO3DQ2.js.map → chunk-22O6F463.js.map} +0 -0
- /package/dist/{chunk-YUL2RO7I.js.map → chunk-2OVIUIIL.js.map} +0 -0
- /package/dist/{chunk-353ULT52.js.map → chunk-37CK5IGW.js.map} +0 -0
- /package/dist/{chunk-SO4QKH47.js.map → chunk-3MGBC64I.js.map} +0 -0
- /package/dist/{chunk-GCQYBMGL.js.map → chunk-3NWLWH4G.js.map} +0 -0
- /package/dist/{chunk-YEYC4PLD.js.map → chunk-46T54RUY.js.map} +0 -0
- /package/dist/{chunk-IZ77ZFBY.js.map → chunk-4GKQ5PWY.js.map} +0 -0
- /package/dist/{chunk-SWDSU33C.js.map → chunk-5AMBV2JE.js.map} +0 -0
- /package/dist/{chunk-DRFGAPYN.js.map → chunk-5DMFTXUZ.js.map} +0 -0
- /package/dist/{chunk-H2QGRBCK.js.map → chunk-5QJDZHRU.js.map} +0 -0
- /package/dist/{chunk-FMZEW7AB.js.map → chunk-5WAVKWL6.js.map} +0 -0
- /package/dist/{chunk-PZRXLO7V.js.map → chunk-74WMSW3E.js.map} +0 -0
- /package/dist/{chunk-WVZV43PF.js.map → chunk-AFU66YOW.js.map} +0 -0
- /package/dist/{chunk-NCL2K6UD.js.map → chunk-AUJ2YUXV.js.map} +0 -0
- /package/dist/{chunk-MRDHGWNV.js.map → chunk-B6I64LSV.js.map} +0 -0
- /package/dist/{chunk-NNDNKEFI.js.map → chunk-BAJ74DKS.js.map} +0 -0
- /package/dist/{chunk-ETBTUFRA.js.map → chunk-CCB5KYFQ.js.map} +0 -0
- /package/dist/{chunk-W4IQ4XYS.js.map → chunk-CKLYFA7H.js.map} +0 -0
- /package/dist/{chunk-CDVICC3E.js.map → chunk-CLYRJ466.js.map} +0 -0
- /package/dist/{chunk-ECFK2NV5.js.map → chunk-CPHCZZWT.js.map} +0 -0
- /package/dist/{chunk-KHOR7BCS.js.map → chunk-CUADOD2T.js.map} +0 -0
- /package/dist/{chunk-XAIW4R76.js.map → chunk-CV6ID6T7.js.map} +0 -0
- /package/dist/{chunk-B5YJ4S2E.js.map → chunk-CWHBWY3B.js.map} +0 -0
- /package/dist/{chunk-OA7TPCTX.js.map → chunk-GLSDMBHR.js.map} +0 -0
- /package/dist/{chunk-TRS2KOXE.js.map → chunk-H3BSKMND.js.map} +0 -0
- /package/dist/{chunk-MJM2U67B.js.map → chunk-H6HP4H3U.js.map} +0 -0
- /package/dist/{chunk-PZY4L6NK.js.map → chunk-HUDESZGX.js.map} +0 -0
- /package/dist/{chunk-PN6GLQWD.js.map → chunk-J7IU77CA.js.map} +0 -0
- /package/dist/{chunk-DRDIOSDW.js.map → chunk-JTPN3BRG.js.map} +0 -0
- /package/dist/{chunk-QCTJ6JA2.js.map → chunk-KCAMFDJH.js.map} +0 -0
- /package/dist/{chunk-ZLBDDGSP.js.map → chunk-LMELY5Z2.js.map} +0 -0
- /package/dist/{chunk-DACGCI3Q.js.map → chunk-LVQK62CV.js.map} +0 -0
- /package/dist/{chunk-C4NAQESE.js.map → chunk-MCVLRF66.js.map} +0 -0
- /package/dist/{chunk-X62MQS7A.js.map → chunk-MLD7DW5I.js.map} +0 -0
- /package/dist/{chunk-RYT4A7AQ.js.map → chunk-NEF7LGNE.js.map} +0 -0
- /package/dist/{chunk-5GQEXGQC.js.map → chunk-O7BAQPP3.js.map} +0 -0
- /package/dist/{chunk-XF36ROHS.js.map → chunk-OGCF6E6I.js.map} +0 -0
- /package/dist/{chunk-MXSMHJIP.js.map → chunk-OGWY4MOB.js.map} +0 -0
- /package/dist/{chunk-DOLIDO2R.js.map → chunk-PQD6K5W5.js.map} +0 -0
- /package/dist/{chunk-OLUMAQOQ.js.map → chunk-Q4FYGFTQ.js.map} +0 -0
- /package/dist/{chunk-TWWRXWWS.js.map → chunk-QX5QVWUP.js.map} +0 -0
- /package/dist/{chunk-O552UNW2.js.map → chunk-RA2KI64U.js.map} +0 -0
- /package/dist/{chunk-7M6V7OGP.js.map → chunk-RHHLAKYS.js.map} +0 -0
- /package/dist/{chunk-YBDLY45S.js.map → chunk-RL7RU2V7.js.map} +0 -0
- /package/dist/{chunk-Q6FKQ63P.js.map → chunk-RQ7CE7SK.js.map} +0 -0
- /package/dist/{chunk-V4F264MW.js.map → chunk-RX552WU6.js.map} +0 -0
- /package/dist/{chunk-5HXU7P5T.js.map → chunk-S7V4SFKB.js.map} +0 -0
- /package/dist/{chunk-D7HC37OF.js.map → chunk-SRBO57AD.js.map} +0 -0
- /package/dist/{chunk-ZOD2EZOP.js.map → chunk-SYGLOTOV.js.map} +0 -0
- /package/dist/{chunk-OSNUFZAX.js.map → chunk-UZ466XO3.js.map} +0 -0
- /package/dist/{chunk-UAKYIZJI.js.map → chunk-VDF5W47R.js.map} +0 -0
- /package/dist/{chunk-FRLEROW5.js.map → chunk-W4SEWZF2.js.map} +0 -0
- /package/dist/{chunk-HXT3XNAX.js.map → chunk-XRIM2YJZ.js.map} +0 -0
- /package/dist/{chunk-YFZH3WDM.js.map → chunk-YSWMQO23.js.map} +0 -0
- /package/dist/{chunk-N4D5G5IT.js.map → chunk-ZBZXIWSK.js.map} +0 -0
- /package/dist/{chunk-BW2MEKH4.js.map → chunk-ZG63ZUDE.js.map} +0 -0
- /package/dist/{chunk-TMEYYK4R.js.map → chunk-ZGQ3BMLW.js.map} +0 -0
- /package/dist/{chunk-5KUQSXQC.js.map → chunk-ZNINQ3FN.js.map} +0 -0
- /package/dist/{chunk-SBEA552U.js.map → chunk-ZQZWM544.js.map} +0 -0
- /package/dist/{condition-KDKI25VM.js.map → condition-4FVKPSQ2.js.map} +0 -0
- /package/dist/{controls-26FVLZRQ.js.map → controls-ZWBN566I.js.map} +0 -0
- /package/dist/{controls.config-O6YC7P4M.js.map → controls.config-YU4W3CDL.js.map} +0 -0
- /package/dist/{correlation-DVDT43OT.js.map → correlation-VADB4SQO.js.map} +0 -0
- /package/dist/{cuminc-T6EYUBUX.js.map → cuminc-4BXE2YS6.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-P4YPZXDY.js.map → cuminc.integration.spec-XQREKHVA.js.map} +0 -0
- /package/dist/{customdata.inputui-XPXZ7KB5.js.map → customdata.inputui-VBQWT3M7.js.map} +0 -0
- /package/dist/{dataDownload-46POC5GF.js.map → dataDownload-QIZKBKH7.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-L7P5YMF7.js.map → dataDownload.integration.spec-MLJEHLYD.js.map} +0 -0
- /package/dist/{databrowser.ui-DQEQXZCP.js.map → databrowser.ui-6UIR4ULJ.js.map} +0 -0
- /package/dist/{dictionary-MBERWWV4.js.map → dictionary-FLWIWAC6.js.map} +0 -0
- /package/dist/{e2pca-5HU65GVJ.js.map → e2pca-NKWSJRXM.js.map} +0 -0
- /package/dist/{ep-ECP7H37A.js.map → ep-EPN3AR6D.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-553FSEDH.js.map → expclust.gdc.spec-ZRUH5E6E.js.map} +0 -0
- /package/dist/{facet-ND335XOF.js.map → facet-BM7SLACF.js.map} +0 -0
- /package/dist/{frequencyChart-2OHEOWEU.js.map → frequencyChart-HBXRIBAW.js.map} +0 -0
- /package/dist/{frequencyChart.integration.spec-NW4DDLRX.js.map → frequencyChart.integration.spec-YJUYZWM6.js.map} +0 -0
- /package/dist/{geneExpClustering-GHGBONBF.js.map → geneExpClustering-4VD5PAWN.js.map} +0 -0
- /package/dist/{geneExpression-UGYGT6DM.js.map → geneExpression-6OT2Y4P6.js.map} +0 -0
- /package/dist/{geneExpression-X6HAUFPK.js.map → geneExpression-EAMEZXJQ.js.map} +0 -0
- /package/dist/{geneORA-YKXRPEYY.js.map → geneORA-RI2AG7JT.js.map} +0 -0
- /package/dist/{geneVariant-363FWTVR.js.map → geneVariant-FYYEOTWA.js.map} +0 -0
- /package/dist/{geneVariant-J4O45233.js.map → geneVariant-PAKVDVC4.js.map} +0 -0
- /package/dist/{genefusion.ui-DWAZJDO4.js.map → genefusion.ui-QWC42XWQ.js.map} +0 -0
- /package/dist/{geneset-64VRPPTK.js.map → geneset-XA6IWP3Q.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-AN3YXXBS.js.map → genomeBrowser.spec-LRKXWXNT.js.map} +0 -0
- /package/dist/{grin2-Y57FKOV6.js.map → grin2-O6TETVZ3.js.map} +0 -0
- /package/dist/{grin2-E2WNBPLR.js.map → grin2-WLB7BY3S.js.map} +0 -0
- /package/dist/{gsea-PNORGHHB.js.map → gsea-ZM4WOPSQ.js.map} +0 -0
- /package/dist/{hierCluster-B7YMJ3UK.js.map → hierCluster-LD43LLRC.js.map} +0 -0
- /package/dist/{hierCluster-VAQBNVKU.js.map → hierCluster-ZGYRS2WV.js.map} +0 -0
- /package/dist/{hierCluster.config-D7MDBQ35.js.map → hierCluster.config-O5HUOFNH.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-UHRGPV6T.js.map → hierCluster.integration.spec-37UNKHTH.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-NJFEZILS.js.map → hierCluster.interactivity-B27ETKRP.js.map} +0 -0
- /package/dist/{imagePlot-LWJPXMNK.js.map → imagePlot-LJZVGNDJ.js.map} +0 -0
- /package/dist/{importPlot-JBVMBUCU.js.map → importPlot-RMVENQRD.js.map} +0 -0
- /package/dist/{launch.adhoc-6GLLB7TX.js.map → launch.adhoc-S3XHRSLN.js.map} +0 -0
- /package/dist/{leftlabel.sample-3SO3AJ2U.js.map → leftlabel.sample-J6PCA3UB.js.map} +0 -0
- /package/dist/{lollipop-LJEVK7YO.js.map → lollipop-OZTV4C7A.js.map} +0 -0
- /package/dist/{maf-3EW7QN3S.js.map → maf-3SRLCKGO.js.map} +0 -0
- /package/dist/{maftimeline-YMX542CP.js.map → maftimeline-6F2LQJU6.js.map} +0 -0
- /package/dist/{matrix-CR2EK5EU.js.map → matrix-FIXOFAB4.js.map} +0 -0
- /package/dist/{matrix-YI4D3YQI.js.map → matrix-O5KPDLM2.js.map} +0 -0
- /package/dist/{matrix.config-TOC4QWE7.js.map → matrix.config-WG7HFJL4.js.map} +0 -0
- /package/dist/{matrix.controls-27D3Q4GD.js.map → matrix.controls-QQLBUUYP.js.map} +0 -0
- /package/dist/{matrix.data-ETVML2F7.js.map → matrix.data-6JLF5HVI.js.map} +0 -0
- /package/dist/{matrix.integration.spec-DDXKS5GP.js.map → matrix.integration.spec-ZJYWNQ57.js.map} +0 -0
- /package/dist/{matrix.interactivity-XTNDVF55.js.map → matrix.interactivity-ZZY5ET4E.js.map} +0 -0
- /package/dist/{matrix.layout-NGPK4EEU.js.map → matrix.layout-XKFB4PKY.js.map} +0 -0
- /package/dist/{matrix.renderers-ILFHUPHQ.js.map → matrix.renderers-4LST6PBA.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-DAMINC6B.js.map → matrix.sort.unit.spec-CTSUNUWB.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-M3RXU6B2.js.map → matrix.sorterUi.unit.spec-VQFMHIYI.js.map} +0 -0
- /package/dist/{mavb-EC5VS3RS.js.map → mavb-ECQ2CQ7F.js.map} +0 -0
- /package/dist/{mds.fimo-7SXXTBUH.js.map → mds.fimo-JDYDT5NK.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-CALFSFR6.js.map → mds.samplescatterplot-PEJBVSTO.js.map} +0 -0
- /package/dist/{mds.survivalplot-NRA67V4T.js.map → mds.survivalplot-GYK6VRQT.js.map} +0 -0
- /package/dist/{oncomatrix-FOCP66RC.js.map → oncomatrix-ZXDJMLN3.js.map} +0 -0
- /package/dist/{oncomatrix.spec-XB232WT7.js.map → oncomatrix.spec-HOPRIG3I.js.map} +0 -0
- /package/dist/{plot.2dvaf-GSQS5J6Y.js.map → plot.2dvaf-Y4SZUHLD.js.map} +0 -0
- /package/dist/{plot.app-RHPEFX47.js.map → plot.app-W5Z3C7P5.js.map} +0 -0
- /package/dist/{plot.barplot-2Q5YF3MU.js.map → plot.barplot-B2PRZDKV.js.map} +0 -0
- /package/dist/{plot.boxplot-LTYLWTF4.js.map → plot.boxplot-J7ET34FY.js.map} +0 -0
- /package/dist/{plot.brainImaging-EFRI4QV7.js.map → plot.brainImaging-ISY4P6RT.js.map} +0 -0
- /package/dist/{plot.disco-HHYCMRCZ.js.map → plot.disco-D7AL42PW.js.map} +0 -0
- /package/dist/{plot.dzi-BCTPDUDK.js.map → plot.dzi-O32LH65U.js.map} +0 -0
- /package/dist/{plot.ssgq-ES2ZP7MO.js.map → plot.ssgq-WF7262IZ.js.map} +0 -0
- /package/dist/{plot.vaf2cov-W72Y2IHA.js.map → plot.vaf2cov-OB6UKSFQ.js.map} +0 -0
- /package/dist/{plot.wsi-TPZXI45Q.js.map → plot.wsi-J5S4YYXN.js.map} +0 -0
- /package/dist/{polar-MT3K2WDL.js.map → polar-LIJORXR6.js.map} +0 -0
- /package/dist/{profile.spec-DOQYKG6P.js.map → profile.spec-3KE4CREI.js.map} +0 -0
- /package/dist/{profileBarchart-A4UWV2YA.js.map → profileBarchart-UQHOJB5V.js.map} +0 -0
- /package/dist/{profileForms-VONTWVOF.js.map → profileForms-WTYVTIUN.js.map} +0 -0
- /package/dist/{profilePlot-OK5VKWO4.js.map → profilePlot-SOXXEUAT.js.map} +0 -0
- /package/dist/{profileRadar-VLEZJCD7.js.map → profileRadar-2OHJ2RIU.js.map} +0 -0
- /package/dist/{profileRadarFacility-QPSSUTB6.js.map → profileRadarFacility-GHLG3QNG.js.map} +0 -0
- /package/dist/{qualitative-RJKAWHQR.js.map → qualitative-B3OY7A7P.js.map} +0 -0
- /package/dist/{regression-GV73BYCQ.js.map → regression-HO2TO4XT.js.map} +0 -0
- /package/dist/{regression.inputs-PVIJHCRE.js.map → regression.inputs-JN3ZMIOP.js.map} +0 -0
- /package/dist/{regression.inputs.term-V5I3EP6M.js.map → regression.inputs.term-67HVMXFZ.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-Y37EJUQB.js.map → regression.inputs.values.table-JXJK2YZT.js.map} +0 -0
- /package/dist/{regression.integration.spec-JD32ODD2.js.map → regression.integration.spec-L54ZS5VY.js.map} +0 -0
- /package/dist/{regression.results-AHAYXYGI.js.map → regression.results-3ZSFKUNN.js.map} +0 -0
- /package/dist/{regression.spec-FGYEES5G.js.map → regression.spec-SVWCQX2U.js.map} +0 -0
- /package/dist/{report-JYIEDDW5.js.map → report-IHX7XSOI.js.map} +0 -0
- /package/dist/{runChart-CVAWIBA3.js.map → runChart-QLQMK3OE.js.map} +0 -0
- /package/dist/{runchart.integration.spec-5Z4IHQU5.js.map → runchart.integration.spec-5NVY5GHR.js.map} +0 -0
- /package/dist/{sampleScatter.spec-QNFWS2Y7.js.map → sampleScatter.spec-4Q5CQQWH.js.map} +0 -0
- /package/dist/{sampleView-GKYHS3WO.js.map → sampleView-7WHDFHB5.js.map} +0 -0
- /package/dist/{samplelst-CHBS5BGY.js.map → samplelst-34GJVLVD.js.map} +0 -0
- /package/dist/{samplematrix-IK4YDAID.js.map → samplematrix-L2HOSLUT.js.map} +0 -0
- /package/dist/{scatter-NDA5YSCP.js.map → scatter-X6AAM2LJ.js.map} +0 -0
- /package/dist/{scatter.integration.spec-GV3EIFGT.js.map → scatter.integration.spec-QSH3PLBK.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-X7RAGKRC.js.map → selectGenomeWithTklst-AJS2IPPW.js.map} +0 -0
- /package/dist/{singleCellPlot-7F735HTR.js.map → singleCellPlot-7JEWDVSR.js.map} +0 -0
- /package/dist/{singlecell-EO3WYGS7.js.map → singlecell-IC5KU72L.js.map} +0 -0
- /package/dist/{singlecell-YMYLKTSC.js.map → singlecell-NWANPXWM.js.map} +0 -0
- /package/dist/{snp-6KN4AWBB.js.map → snp-PSRNMTL6.js.map} +0 -0
- /package/dist/{snplocus-CLM4WHVH.js.map → snplocus-QCAVDYLR.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-PKFVC2N4.js.map → spliceevent.a53ss.diagram-SGDJKUEC.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-XV2Z7AYB.js.map → spliceevent.exonskip.diagram-BUYTHCK5.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-L5L2BJL5.js.map → spliceevent.noeventdiagram-OJZJUHXP.js.map} +0 -0
- /package/dist/{ssGSEA-W6N4CXMD.js.map → ssGSEA-UUZG57MF.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-57LZ5B2Q.js.map → summarizeCnvGeneexp-ZVZYWP43.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-UQX3VZUK.js.map → summarizeGeneexpSurvival-7XJRMT6M.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-5SWO42E4.js.map → summarizeMutationDiagnosis-ZKLXOVY2.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-EOU5QOB6.js.map → summarizeMutationSurvival-S4YPGLWA.js.map} +0 -0
- /package/dist/{summary-FRIKVPYZ.js.map → summary-RVG7JL6Y.js.map} +0 -0
- /package/dist/{summary.integration.spec-WSI3JNTO.js.map → summary.integration.spec-SCD35GO4.js.map} +0 -0
- /package/dist/{summaryInput-3L7CM52X.js.map → summaryInput-DMN6DTSW.js.map} +0 -0
- /package/dist/{sunburst-HA7UGSXX.js.map → sunburst-QZXYILRC.js.map} +0 -0
- /package/dist/{survival-2HZ446Y3.js.map → survival-6CWEBRSF.js.map} +0 -0
- /package/dist/{survival-LJI5JEZZ.js.map → survival-J657VYLI.js.map} +0 -0
- /package/dist/{survival.integration.spec-7XVO2WNF.js.map → survival.integration.spec-S5WE4V6M.js.map} +0 -0
- /package/dist/{svgraph-TRPAXTNP.js.map → svgraph-NEKJL24M.js.map} +0 -0
- /package/dist/{svmr-TJOCKTE2.js.map → svmr-5RQ5JQF2.js.map} +0 -0
- /package/dist/{table-35RHJK4M.js.map → table-CG6Z6NCJ.js.map} +0 -0
- /package/dist/{termCollection-JS6N5TAP.js.map → termCollection-FOQNVXB7.js.map} +0 -0
- /package/dist/{tk-4ARNGTEQ.js.map → tk-2O7XOVGJ.js.map} +0 -0
- /package/dist/{tp.ui-QZEMGVEH.js.map → tp.ui-S4YUVCZH.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-4K7B7FXF.js.map → tvs.dtcnv.continuous-7BPIXZ6C.js.map} +0 -0
- /package/dist/{tvs.samplelst-IUSDLB6P.js.map → tvs.samplelst-PKGFTULN.js.map} +0 -0
- /package/dist/{violin-I5JO56GZ.js.map → violin-C7IBRTYP.js.map} +0 -0
- /package/dist/{violin.integration.spec-5WVLT3DW.js.map → violin.integration.spec-WXRD3Z4E.js.map} +0 -0
- /package/dist/{violin.interactivity-EFFBMTN2.js.map → violin.interactivity-BMG4TG5L.js.map} +0 -0
- /package/dist/{violin.renderer-Z3AIV5RH.js.map → violin.renderer-WUNW6ULV.js.map} +0 -0
- /package/dist/{vocabulary-4PHACFSG.js.map → vocabulary-UUNEEBM3.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../shared/utils/src/bulk.js", "../../shared/utils/src/clustering.js", "../../shared/utils/src/fileSize.js", "../../shared/utils/src/mds3tk.js", "../../shared/utils/src/termdb.bins.js", "../../shared/utils/src/termdb.initbinconfig.js", "../../shared/utils/src/vcf.info.js", "../../shared/utils/src/vcf.csq.js", "../../shared/utils/src/vcf.ann.js", "../../shared/utils/src/vcf.type.js", "../../shared/utils/src/vcf.js", "../../shared/utils/src/compute.percentile.js", "../../shared/utils/src/hash.js", "../../shared/utils/src/urljson.js", "../../shared/utils/src/fetch-helpers.js", "../../shared/utils/src/termdb.usecase.js", "../common/auth.js", "../common/dofetch.js"],
|
|
4
|
-
"sourcesContent": ["////////////////////////////////////\n//\n// shared between client and server\n//\n////////////////////////////////////\n\nimport * as common from './common.js'\n\nexport default {}\n\nexport function init_bulk_flag(genome) {\n\tif (!genome) {\n\t\treturn null\n\t}\n\tconst mclasslabel2key = {}\n\tfor (const n in common.mclass) {\n\t\tmclasslabel2key[common.mclass[n].label.toUpperCase()] = n\n\t}\n\treturn {\n\t\tgenome: genome,\n\t\tmclasslabel2key: mclasslabel2key,\n\t\tdata: {},\n\t\tsample2disease: {}, // (proof) k: sample, v: disease\n\t\t// will only record this when origin is used\n\t\tpatient2st: {},\n\t\t// k: patient, v: { k: sampletype, v: sample }\n\t\t// new sample names always override old\n\t\tgood: 0,\n\t\tgeneToUpper: true, // option to not force uppercase on gene names\n\t\tsnv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\t// jinghui: based on missense/silent ratio of entire dataset to decide whether to include silent when importing...\n\t\t\t// hard-coded class codes\n\t\t\tmissense: 0,\n\t\t\tsilent: 0\n\t\t},\n\t\tsvjson: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\tfusion: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\toriginal: []\n\t\t},\n\t\tsv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\toriginal: []\n\t\t},\n\t\tcnv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\titd: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\tdel: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\ttruncation: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t}\n\t}\n}\n\nexport function parsesample(m, flag, i, lst, badline) {\n\tlet variantorigin = common.moriginsomatic\n\tif (m.sampletype) {\n\t\tconst s = m.sampletype.toLowerCase()\n\t\tswitch (s) {\n\t\t\tcase 'relapse':\n\t\t\t\tvariantorigin = common.moriginrelapse\n\t\t\t\tbreak\n\t\t\tcase 'germline':\n\t\t\t\tvariantorigin = common.morigingermline\n\t\t\t\tbreak\n\t\t\tcase 'somatic':\n\t\t\tcase 'diagnosis':\n\t\t\t\tbreak\n\t\t}\n\t\tif (m.sample) {\n\t\t\tif (m.patient) {\n\t\t\t\t// good\n\t\t\t} else {\n\t\t\t\tm.patient = m.sample + ' ' + m.sampletype\n\t\t\t}\n\t\t} else {\n\t\t\tif (m.patient) {\n\t\t\t\tm.sample = m.patient + ' ' + m.sampletype\n\t\t\t} else {\n\t\t\t\t// neither sample or patient, will quit later\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (m.patient) {\n\t\t\tif (m.sample) {\n\t\t\t\tm.sampletype = m.sample\n\t\t\t} else {\n\t\t\t\tm.sample = m.sampletype = m.patient\n\t\t\t}\n\t\t} else {\n\t\t\tif (m.sample) {\n\t\t\t\tm.sampletype = m.sample\n\t\t\t} else {\n\t\t\t\t// no patient/sample, will quit later\n\t\t\t}\n\t\t}\n\t}\n\tif (m.origin) {\n\t\t// override existing variantorigin\n\t\tconst s = m.origin.toLowerCase()\n\t\tswitch (s) {\n\t\t\tcase 'r':\n\t\t\tcase 'relapse':\n\t\t\t\tvariantorigin = common.moriginrelapse\n\t\t\t\tm.isrim2 = true\n\t\t\t\tbreak\n\t\t\tcase 'g':\n\t\t\tcase 'germline':\n\t\t\t\tvariantorigin = common.morigingermline\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 'gp':\n\t\t\tcase 'germline pathogenic':\n\t\t\t\tvariantorigin = common.morigingermlinepathogenic\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 'gnp':\n\t\t\tcase 'germline nonpathogenic':\n\t\t\tcase 'germline non-pathogenic':\n\t\t\t\tvariantorigin = common.morigingermlinenonpathogenic\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 's':\n\t\t\tcase 'somatic':\n\t\t\tcase 'diagnosis':\n\t\t\t\tvariantorigin = common.moriginsomatic\n\t\t\t\tbreak\n\t\t}\n\t}\n\tm.origin = variantorigin\n\n\tif (!m.sample && !m.patient) {\n\t\t// will not go into sample table\n\t\treturn\n\t}\n\n\tconst nopatientname = 'no patient/individual name'\n\tlet p\n\tif (m.patient) {\n\t\tif (!flag.patient2st[m.patient]) {\n\t\t\tflag.patient2st[m.patient] = {}\n\t\t}\n\t\tflag.patient2st[m.patient][m.sampletype] = m.sample\n\t} else {\n\t\tif (!flag.patient2st[nopatientname]) {\n\t\t\tflag.patient2st[nopatientname] = {}\n\t\t}\n\t\tflag.patient2st[nopatientname][m.sampletype] = m.sample\n\t}\n\n\tif (m.sample) {\n\t\tif (m.disease) {\n\t\t\tif (m.sample in flag.sample2disease) {\n\t\t\t\tif (m.disease != flag.sample2disease[m.sample]) {\n\t\t\t\t\tflag.snv.badlines.push([\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t'conflict of disease types for sample \"' +\n\t\t\t\t\t\t\tm.sample +\n\t\t\t\t\t\t\t'\": ' +\n\t\t\t\t\t\t\tm.disease +\n\t\t\t\t\t\t\t', ' +\n\t\t\t\t\t\t\tflag.sample2disease[m.sample],\n\t\t\t\t\t\tlst\n\t\t\t\t\t])\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tflag.sample2disease[m.sample] = m.disease\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n", "export const clusterMethodLst = [\n\t{\n\t\tlabel: 'Average',\n\t\tvalue: 'average',\n\t\ttitle: `Cluster by average value`\n\t},\n\t{\n\t\tlabel: `Complete`,\n\t\tvalue: 'complete',\n\t\ttitle: `Use the complete clustering method`\n\t},\n\t{\n\t\tlabel: `Single`,\n\t\tvalue: 'single',\n\t\ttitle: `Use the single clustering method`\n\t},\n\t{\n\t\tlabel: `Ward.D`,\n\t\tvalue: 'ward.D',\n\t\ttitle: `Use the ward.D clustering method`\n\t},\n\t{\n\t\tlabel: `Ward.D2`,\n\t\tvalue: 'ward.D2',\n\t\ttitle: `Use the ward.D2 clustering method`\n\t},\n\t{\n\t\tlabel: `Mcquitty`,\n\t\tvalue: 'mcquitty',\n\t\ttitle: `Use the Mcquity clustering method`\n\t}\n\t/* These methods are currently disabled because the dendrogram lines tend to cross one another.\n\t{\n\t\tlabel: `Centroid`,\n\t\tvalue: 'centroid',\n\t\ttitle: `Use the centroid clustering method`\n\t},\n \t{\n\t\tlabel: `Median`,\n\t\tvalue: 'median',\n\t\ttitle: `Use the median clustering method`\n\t}\n */\n]\nexport const distanceMethodLst = [\n\t{\n\t\tlabel: 'Euclidean',\n\t\tvalue: 'euclidean',\n\t\ttitle: `Calculate distance using euclidean method`\n\t},\n\t{\n\t\tlabel: 'Maximum',\n\t\tvalue: 'maximum',\n\t\ttitle: `Maximum distance between two components of x and y`\n\t},\n\t{\n\t\tlabel: 'Manhattan',\n\t\tvalue: 'manhattan',\n\t\ttitle: `Calculate distance using the absolute distance between the two vectors`\n\t},\n\t{\n\t\tlabel: 'Canberra',\n\t\tvalue: 'canberra',\n\t\ttitle: `Calculate distance using Canberra method`\n\t}\n]\n", "export function fileSize(v) {\n\tif (v > 1e9) return (v / 1e9).toFixed(2) + ' GB'\n\tif (v > 1e6) return (v / 1e6).toFixed(2) + ' MB'\n\tif (v > 1e3) return (v / 1e3).toFixed(2) + ' KB'\n\treturn v + ' Bytes'\n}\n", "import { dtcnv, dtsnvindel, dtsv, dtfusionrna } from './common.js'\n\n// this script should contain mds3 track-related stuff shared between client and backend\n\n/*\nthe separator is used to join essential bits of a variant obj into a string as the \"ssm_id\", aims to uniquely identify a variant irrespective of sample\nthis is to mimic the GDC \"ssm_id\" which is a random id, with below benefits:\n- consistent way to pass request body for both gdc and non-gdc\n- uniform identification of ssm/cnv/sv in non-gdc backend code\n- uniform identification of all variants in client\n\nssm: chr + pos + ref + alt\ncnv: chr + start + stop + class\nsvfusion: dt + chr + pos + strand + pairlstidx + mname\n\nthe separator must avoid conflicting with characters from gene names, and can be changed based on needs\n*/\nexport const ssmIdFieldsSeparator = '__'\n\n/*\ninput: array of mixture of ssm, svfusion and cnv\n\noutput: sorted array. each element: [ class/dt, count of m ]\n*/\nexport function summarize_mclass(mlst) {\n\tconst m2c = new Map() // k: mclass, v: {}\n\tconst cnvs = []\n\tfor (const m of mlst) {\n\t\tif (m.dt == dtcnv) {\n\t\t\tcnvs.push(m)\n\t\t\tcontinue // process cnv later\n\t\t}\n\t\t// snvindel has m.class=str, svfusion has only dt=int\n\t\tconst key = m.class || m.dt\n\t\tm2c.set(key, 1 + (m2c.get(key) || 0))\n\t}\n\n\tif (cnvs.length) {\n\t\tif (Number.isFinite(cnvs[0].value)) {\n\t\t\t// first cnv uses numeric value (assumes all the same). record by dt\n\t\t\tm2c.set(dtcnv, cnvs.length)\n\t\t} else {\n\t\t\t// cnv not numeric and uses class; record by each class\n\t\t\tfor (const c of cnvs) {\n\t\t\t\tif (!c.class) continue // should not happen\n\t\t\t\tm2c.set(c.class, 1 + (m2c.get(c.class) || 0))\n\t\t\t}\n\t\t}\n\t}\n\treturn [...m2c].sort((i, j) => j[1] - i[1])\n}\n\n/*\nssmid is not specific for ssm, it covers all alterations\ngdc ssm are identified by a specific uuid, thus the design\n*/\nexport function guessSsmid(ssmid) {\n\tconst l = ssmid.split(ssmIdFieldsSeparator)\n\tif (l.length == 4) {\n\t\tconst [chr, tmp, ref, alt] = l\n\t\tconst pos = Number(tmp)\n\t\tif (Number.isNaN(pos)) throw 'ssmid snvindel pos not integer'\n\t\treturn { dt: dtsnvindel, l: [chr, pos, ref, alt] }\n\t}\n\tif (l.length == 5) {\n\t\t// cnv. if type=cat, _value is blank string\n\t\tconst [chr, _start, _stop, _class, _value] = l\n\t\tconst start = Number(_start),\n\t\t\tstop = Number(_stop),\n\t\t\tvalue = _value == '' ? null : Number(_value)\n\t\tif (Number.isNaN(start) || Number.isNaN(stop)) throw 'ssmid cnv start/stop not integer'\n\t\treturn { dt: dtcnv, l: [chr, start, stop, _class, value] }\n\t}\n\tif (l.length == 6) {\n\t\tif (l[3] == '+' || l[3] == '-') {\n\t\t\t// sv/fusion\n\t\t\tconst [_dt, chr, _pos, strand, _pi, _mname] = l\n\n\t\t\t// mname is encoded in case it contains comma (and is same as ssmIdFieldsSeparator)\n\t\t\tconst mname = decodeURIComponent(_mname)\n\t\t\tconst dt = Number(_dt)\n\t\t\tif (dt != dtsv && dt != dtfusionrna) throw 'ssmid dt not sv/fusion'\n\t\t\tconst pos = Number(_pos)\n\t\t\tif (Number.isNaN(pos)) throw 'ssmid svfusion position not integer'\n\t\t\tconst pairlstIdx = Number(_pi)\n\t\t\tif (Number.isNaN(pairlstIdx)) throw 'ssmid pairlstIdx not integer'\n\t\t\treturn { dt, l: [dt, chr, pos, strand, pairlstIdx, mname] }\n\t\t}\n\t\t// cnv with sample\n\t\tconst [chr, _start, _stop, _class, _value, sample] = l\n\t\tconst start = Number(_start),\n\t\t\tstop = Number(_stop),\n\t\t\tvalue = _value == '' ? null : Number(_value) // if cnv not using value, must avoid `Number('')=0`\n\t\tif (Number.isNaN(start) || Number.isNaN(stop)) throw 'ssmid cnv start/stop not integer'\n\t\treturn { dt: dtcnv, l: [chr, start, stop, _class, value, sample] }\n\t}\n\tthrow 'unknown ssmid'\n}\n", "import { format } from 'd3-format'\nimport { getColors } from './common.js'\nimport { isStrictNumeric, convertUnits } from './helpers.js'\n\nexport default function validate_bins(binconfig) {\n\t// Number.isFinite('1') returns false, which is desired\n\n\tconst bc = binconfig\n\tif (!bc || typeof bc !== 'object') throw 'bin schema must be an object'\n\t// assign default type\n\tif (!('type' in bc)) bc.type = 'regular-bin'\n\n\tif (bc.type == 'custom-bin') {\n\t\tif (!Array.isArray(bc.lst)) throw 'binconfig.lst must be an array'\n\t\tif (!bc.lst.length) throw 'binconfig.lst must have entries'\n\t\tconst first_bin = bc.lst[0]\n\t\tconst last_bin = bc.lst[bc.lst.length - 1]\n\n\t\tfor (const bin of bc.lst) {\n\t\t\tif (!('startinclusive' in bin) && !('stopinclusive' in bin)) {\n\t\t\t\tthrow 'custom bin.startinclusive and/or bin.stopinclusive must be defined'\n\t\t\t}\n\n\t\t\tif (bin == first_bin) {\n\t\t\t\tif ('startunbounded' in bin && !bin.startunbounded) {\n\t\t\t\t\tthrow `a custom first bin must not set bin.startunbounded to false`\n\t\t\t\t}\n\t\t\t\tbin.startunbounded = true\n\t\t\t\tif ('start' in bin) {\n\t\t\t\t\tthrow 'a custom first bin must not set a bin.start value'\n\t\t\t\t}\n\t\t\t\tif ('start_percentile' in bin) {\n\t\t\t\t\tthrow 'the first bin must not set a bin.start_percentile value'\n\t\t\t\t}\n\t\t\t\tif (!('stop' in bin)) {\n\t\t\t\t\tthrow `a custom first bin must define a bin.stop value`\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.stop)) {\n\t\t\t\t\tthrow `a custom first bin.stop value should be numeric`\n\t\t\t\t}\n\t\t\t} else if (bin == last_bin) {\n\t\t\t\tif (!('start' in bin)) {\n\t\t\t\t\tthrow `a custom last bin must define a bin.start value`\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.start)) {\n\t\t\t\t\tthrow `a custom last bin.start must be numeric`\n\t\t\t\t}\n\t\t\t\tif ('stopunbounded' in bin && !bin.stopunbounded) {\n\t\t\t\t\tthrow 'a custom last bin must not set bin.stopunbounded to false'\n\t\t\t\t}\n\t\t\t\tbin.stopunbounded = true\n\t\t\t\tif ('stop' in bin) {\n\t\t\t\t\tthrow 'a custom last bin must not set a bin.stop value'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (bin.startunbounded || bin.stopunbounded) {\n\t\t\t\t\tthrow 'bin.startunbounded and bin.stopunbounded must not be set for non-first/non-last bins'\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.start)) throw 'bin.start must be numeric for a non-first bin'\n\t\t\t\tif (!isStrictNumeric(bin.stop)) throw 'bin.stop must be numeric for a non-last bin'\n\t\t\t}\n\t\t}\n\t} else if (bc.type == 'regular-bin') {\n\t\t// required custom_bin parameter\n\t\tif (!Number.isFinite(bc.bin_size)) throw 'non-numeric bin_size'\n\t\tif (bc.bin_size <= 0) throw 'bin_size must be greater than 0'\n\n\t\tif (!bc.startinclusive && !bc.stopinclusive) {\n\t\t\tbc.startinclusive = 1\n\t\t\tbc.stopinclusive = 0\n\t\t}\n\n\t\tif (!bc.first_bin) throw 'first_bin{} missing'\n\t\tif (typeof bc.first_bin != 'object') throw 'first_bin{} is not an object'\n\t\tif (!Object.keys(bc.first_bin).length) throw 'first_bin is an empty object'\n\n\t\t{\n\t\t\tconst b = bc.first_bin\n\t\t\tb.startunbounded = true\n\t\t\t// requires stop_percentile, or stop\n\t\t\tif (b.stop_percentile) {\n\t\t\t\tif (!Number.isInteger(b.stop_percentile)) throw 'first_bin.stop_percentile should be integer'\n\t\t\t\tif (b.stop_percentile <= 0 || b.stop_percentile >= 100) throw 'first_bin.stop_percentile out of bound (0-100)'\n\t\t\t} else if (!Number.isFinite(b.stop)) {\n\t\t\t\tthrow 'first_bin.stop not a number when stop_percentile is not set'\n\t\t\t}\n\t\t}\n\n\t\tif (bc.last_bin) {\n\t\t\tconst b = bc.last_bin\n\t\t\t// requires start_percentile or start\n\t\t\tif (b.start_percentile) {\n\t\t\t\tif (!Number.isInteger(b.start_percentile)) throw 'last_bin.start_percentile should be integer'\n\t\t\t\tif (b.start_percentile <= 0 || b.start_percentile >= 100) throw 'last_bin.start_percentile out of bound (0-100)'\n\t\t\t} else if (!Number.isFinite(b.start)) {\n\t\t\t\tthrow 'last_bin.start not a number when start_percentile is not set'\n\t\t\t}\n\n\t\t\tb.stopunbounded = true\n\t\t\tif ('stop' in b) {\n\t\t\t\tthrow 'a regular last bin must not set a bin.stop value'\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthrow `invalid binconfig.type=\"${bc.type}\"`\n\t}\n}\n\nexport function compute_bins(binconfig, summaryfxn, valueConversion) {\n\t/*\n Bins generator\n \nbinconfig \n configuration of bins per the Numerical Binning Scheme\n\nsummaryfxn (percentiles)=> return {min, max, pX, pY, ...}\n - required function\n\n - must accept an array of desired percentile values\n and returns an object of computed properties\n {\n min: minimum value\n max: maximum value\n pX: percentile at X value, so p10 will be 10th percentile value\n pY: .. corresponding to the desired percentile values \n }\n*/\n\tconst bc = binconfig\n\tvalidate_bins(bc)\n\tif (bc.lst) {\n\t\tconst k2c = getColors(bc.lst.length) //to color bins\n\t\tfor (const bin of bc.lst) bin.color = k2c(bin.label)\n\t}\n\tif (bc.type == 'custom-bin') return JSON.parse(JSON.stringify(bc.lst))\n\tif (typeof summaryfxn != 'function') throw 'summaryfxn required for modules/termdb.bins.js compute_bins()'\n\tconst percentiles = target_percentiles(bc)\n\tconst summary = summaryfxn(percentiles)\n\tif (!summary || typeof summary !== 'object') throw 'invalid returned value by summaryfxn'\n\tbc.results = { summary }\n\tif (!bc.binLabelFormatter) bc.binLabelFormatter = getNumDecimalsFormatter(bc)\n\n\tconst orderedLabels = []\n\t// round the min and max values for use as bin start and stop\n\t// in the first and last bins, respectively\n\tconst minFloor = Math.floor(summary.min * 100) / 100\n\tconst maxCeil = Math.ceil(summary.max * 100) / 100\n\tconst min = bc.first_bin.startunbounded\n\t\t? minFloor\n\t\t: bc.first_bin.start_percentile\n\t\t? summary['p' + bc.first_bin.start_percentile]\n\t\t: bc.first_bin.start\n\tlet max = maxCeil, // in order to include the max value in the last bin\n\t\tlast_start,\n\t\tlast_stop\n\n\tif (bc.last_bin) {\n\t\tmax = bc.last_bin.stopunbounded\n\t\t\t? maxCeil // in order to include the max value in the last bin\n\t\t\t: bc.last_bin.stop_percentile\n\t\t\t? summary['p' + bc.last_bin.stop_percentile]\n\t\t\t: isNumeric(bc.last_bin.stop) && bc.last_bin.stop <= summary.max // '0.0088' < 0.0088\n\t\t\t? bc.last_bin.stop\n\t\t\t: maxCeil // in order to include the max value in the last bin\n\t\tlast_start = isStrictNumeric(bc.last_bin.start_percentile)\n\t\t\t? summary['p' + bc.last_bin.start_percentile]\n\t\t\t: isStrictNumeric(bc.last_bin.start)\n\t\t\t? bc.last_bin.start\n\t\t\t: undefined\n\t\tlast_stop = bc.last_bin.stopunbounded\n\t\t\t? null\n\t\t\t: bc.last_bin.stop_percentile\n\t\t\t? summary['p' + bc.last_bin.stop_percentile]\n\t\t\t: isStrictNumeric(bc.last_bin.stop)\n\t\t\t? bc.last_bin.stop\n\t\t\t: null\n\t} else if (bc.lst) {\n\t\tconst last_bin = bc.lst[bc.lst.length - 1]\n\t\tlast_start = last_bin.start\n\t\tlast_stop = 'stop' in last_bin && !last_bin.stopunbounded ? last_bin.stop : maxCeil\n\t\tmax = last_stop\n\t} else {\n\t\tlast_start = maxCeil\n\t\tlast_stop = maxCeil\n\t}\n\n\tconst numericMax = isStrictNumeric(max)\n\tconst numericLastStart = isStrictNumeric(last_start)\n\tconst numericLastStop = isStrictNumeric(last_stop)\n\n\tif (!numericMax && !numericLastStart) return [] //throw 'unable to compute the last bin start or stop'\n\n\tconst bins = []\n\tlet currBin = {\n\t\tstartunbounded: bc.first_bin.startunbounded,\n\t\tstart: bc.first_bin.startunbounded ? undefined : min,\n\t\tstop: isStrictNumeric(bc.first_bin.stop_percentile)\n\t\t\t? +summary['p' + bc.first_bin.stop_percentile]\n\t\t\t: isStrictNumeric(bc.first_bin.stop)\n\t\t\t? +bc.first_bin.stop\n\t\t\t: min + bc.bin_size,\n\t\tstartinclusive: bc.startinclusive,\n\t\tstopinclusive: bc.stopinclusive\n\t}\n\n\tif (!isStrictNumeric(currBin.stop)) throw 'the computed first_bin.stop is non-numeric' + currBin.stop\n\tconst maxNumBins = 100 // harcoded limit for now to not stress sqlite\n\n\twhile ((numericMax && currBin.stop <= max) || (currBin.startunbounded && !bins.length) || currBin.stopunbounded) {\n\t\tbins.push(currBin)\n\t\t// force a computed last bin to have stopunbounded true\n\t\tif (currBin.stop >= max) {\n\t\t\tcurrBin.stopunbounded = true\n\t\t\tif (bins.length > 1) {\n\t\t\t\tdelete currBin.stop\n\t\t\t}\n\t\t}\n\t\tcurrBin.label = get_bin_label(currBin, bc, valueConversion)\n\t\tif (currBin.stopunbounded) break\n\n\t\tconst upper = currBin.stop + bc.bin_size\n\t\tconst previousStop = currBin.stop\n\t\tcurrBin = {\n\t\t\tstartinclusive: bc.startinclusive,\n\t\t\tstopinclusive: bc.stopinclusive,\n\t\t\tstart: previousStop,\n\t\t\tstop:\n\t\t\t\tnumericLastStop && (previousStop == last_start || upper > last_stop)\n\t\t\t\t\t? last_stop\n\t\t\t\t\t: numericLastStart && upper > last_start && previousStop != last_start\n\t\t\t\t\t? last_start\n\t\t\t\t\t: upper\n\t\t}\n\n\t\tif (currBin.stop >= max) {\n\t\t\tcurrBin.stop = max\n\t\t\tif (bc.last_bin && bc.last_bin.stopunbounded) currBin.stopunbounded = 1\n\t\t\tif (bc.last_bin && bc.last_bin.stopinclusive) currBin.stopinclusive = 1\n\t\t}\n\t\tif (numericLastStart && currBin.start == last_start) {\n\t\t\tif (bc.last_bin && bc.last_bin.stopunbounded) currBin.stopunbounded = 1\n\t\t}\n\t\tif (currBin.start > currBin.stop) {\n\t\t\tif (numericLastStart && currBin.stop == last_start && bc.last_bin && bc.last_bin.stopunbounded)\n\t\t\t\tcurrBin.stopunbounded = true\n\t\t\telse break\n\t\t}\n\t\tif (bins.length + 1 >= maxNumBins) {\n\t\t\tbc.error = 'max_num_bins_reached'\n\t\t\tbreak\n\t\t}\n\t}\n\tdelete bc.binLabelFormatter\n\tif (bins.length > 1) {\n\t\tdelete bins[bins.length - 1].stop\n\t}\n\tconst k2c = getColors(bins.length) //to color bins\n\tfor (const bin of bins) bin.color = k2c(bin.label)\n\treturn bins\n}\n\nfunction getNumDecimalsFormatter(bc) {\n\t//return format('rounding' in bc ? bc.rounding : '')\n\treturn 'rounding' in bc ? format(bc.rounding) : d => d // default to labeling using the start/stop value as-is\n}\n\nexport function get_bin_label(bin, binconfig, valueConversion) {\n\t/*\n Generate a numeric bin label given a bin configuration and an optional term valueConversion object\n*/\n\tif (bin.label) return bin.label\n\n\tconst bc = binconfig\n\tif (!bc.binLabelFormatter) bc.binLabelFormatter = getNumDecimalsFormatter(bc)\n\tif (!bin.startunbounded && !bin.stopunbounded && !('startinclusive' in bin) && !('stopinclusive' in bin)) {\n\t\tif (bc.startinclusive) bin.startinclusive = true\n\t\telse if (bc.stopinclusive) bin.stopinclusive = true\n\t}\n\n\tconst start = bc.use_as == 'bins' || bin.start\n\tconst stop = bc.use_as == 'bins' || bin.stop\n\n\tlet label_offset = 0\n\tif ('label_offset' in bc) {\n\t\tbc.label_offset_ignored = 'bin_size' in bc && bc.bin_size < bc.label_offset\n\t\tif (!bc.label_offset_ignored) label_offset = bc.label_offset\n\t} else if (bc.bin_size === 1 && bc.termtype == 'integer') {\n\t\tlabel_offset = 1\n\t}\n\n\t// one side-unbounded bins\n\t// label will be \">v\" or \"<v\"\n\tif (bin.startunbounded) {\n\t\tconst oper = bin.stopinclusive ? '\u2264' : '<' // \\u2264\n\t\tconst v1 = valueConversion\n\t\t\t? convertUnits(stop, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: bc.binLabelFormatter(stop) //bin.startinclusive && label_offset ? stop - label_offset : stop)\n\t\treturn oper + v1\n\t}\n\t// a data value may coincide with the last bin's start\n\tif (bin.stopunbounded || start === stop) {\n\t\tconst oper = bin.startinclusive /*|| label_offset*/ ? '\u2265' : '>' // \\u2265\n\t\tconst v0 = valueConversion\n\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: bc.binLabelFormatter(start) //bin.startinclusive || start == min ? start : start + label_offset)\n\t\treturn oper + v0\n\t}\n\n\t// two-sided bins\n\tif (label_offset && bin.startinclusive && !bin.stopinclusive) {\n\t\tif (Number.isInteger(bc.bin_size) && Math.abs(start - stop) === label_offset) {\n\t\t\t// make a simpler label when the range simply spans the bin_size\n\t\t\treturn (\n\t\t\t\t'' +\n\t\t\t\t(valueConversion\n\t\t\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t\t\t: bc.binLabelFormatter(start))\n\t\t\t)\n\t\t} else {\n\t\t\tconst v0 = valueConversion\n\t\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t\t: bc.binLabelFormatter(start)\n\t\t\tconst v1 = valueConversion\n\t\t\t\t? convertUnits(\n\t\t\t\t\t\tstop - label_offset,\n\t\t\t\t\t\tvalueConversion.fromUnit,\n\t\t\t\t\t\tvalueConversion.toUnit,\n\t\t\t\t\t\tvalueConversion.scaleFactor,\n\t\t\t\t\t\ttrue\n\t\t\t\t )\n\t\t\t\t: bc.binLabelFormatter(stop - label_offset)\n\t\t\t// ensure that last two bin labels make sense (the last is stopunbounded)\n\t\t\treturn +v0 >= +v1 ? v0.toString() : v0 + ' to ' + v1\n\t\t}\n\t} else {\n\t\t// stop_inclusive || label_offset == 0\n\t\tconst oper0 = bin.startinclusive ? '' : '>'\n\t\tconst oper1 = bin.stopinclusive ? '' : '<'\n\t\tconst v0 = valueConversion\n\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: Number.isInteger(start)\n\t\t\t? start\n\t\t\t: bc.binLabelFormatter(start)\n\t\tconst v1 = valueConversion\n\t\t\t? convertUnits(stop, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: Number.isInteger(stop)\n\t\t\t? stop\n\t\t\t: bc.binLabelFormatter(stop)\n\t\t// after rounding the bin labels, the bin start may equal the last bin stop as derived from actual data\n\t\tif (+v0 >= +v1) {\n\t\t\tconst oper = bin.startinclusive ? '\u2265' : '>' // \\u2265\n\t\t\treturn oper + v0\n\t\t} else {\n\t\t\treturn oper0 + v0 + ' to ' + oper1 + v1\n\t\t}\n\t}\n}\n\n// get bin range equation from bin label and bin properties\nexport function get_bin_range_equation(bin, binconfig) {\n\tconst x = '<span style=\"font-family:Times;font-style:italic;\">x</span>'\n\tlet range_eq\n\t// should always use computed (not user-customized) bin label to determine bin range text\n\tconst copy = structuredClone(bin)\n\tcopy.label = '' // mutate only the copy, and not the original bin argument\n\tconst bin_label = get_bin_label(copy, binconfig)\n\tif (bin.startunbounded || bin.stopunbounded) {\n\t\t// first or last bins, e.g. x \u2264 14 and x > 16\n\t\trange_eq = x + ' ' + bin_label\n\t} else if (bin.startinclusive) {\n\t\t// bins with startinclusive, e.g. 14 \u2264 x < 16\n\t\trange_eq = bin_label.replace('to <', '\u2264 ' + x + ' <')\n\t} else if (bin.stopinclusive) {\n\t\t// bins with stopinclusive, e.g. 14 < x \u2264 16\n\t\trange_eq = bin_label.replace('>', '').replace('to', '< ' + x + ' \u2264')\n\t}\n\treturn range_eq\n}\n\nexport function target_percentiles(binconfig) {\n\tconst percentiles = []\n\tconst f = binconfig.first_bin\n\tif (f && isStrictNumeric(f.start_percentile)) percentiles.push(f.start_percentile)\n\tif (f && isStrictNumeric(f.stop_percentile)) percentiles.push(f.stop_percentile)\n\tconst l = binconfig.last_bin\n\tif (l && isStrictNumeric(l.start_percentile)) percentiles.push(l.start_percentile)\n\tif (l && isStrictNumeric(l.stop_percentile)) percentiles.push(l.stop_percentile)\n\treturn percentiles\n}\n", "/*\nInitialize a bin configuration for a numeric dataset\n<data>: array of numeric data values\n<opts> (optional): object of options\n {}: output bin config as JavaScript object (default)\n {format: 'string'}: output bin config as JSON string\n*/\nexport default function initBinConfig(data, opts = {}) {\n\tif (data.find(d => !Number.isFinite(d))) throw new Error('non-numeric values found')\n\n\tlet binConfig\n\tconst s = new Set(data)\n\tif (s.size === 1) {\n\t\t// single unique value in data array\n\t\t// prepare custom bin config for 3 bins: first bin\n\t\t// for values less than the value, second bin for values\n\t\t// equal to the value, and third bin one for values\n\t\t// greater than the value\n\t\t// all data values will fall into the second bin\n\t\tconst value = [...s][0]\n\t\tbinConfig = {\n\t\t\ttype: 'custom-bin',\n\t\t\tlst: [\n\t\t\t\t{ stop: value, stopinclusive: false, startunbounded: true, label: '<' + value },\n\t\t\t\t{ start: value, stop: value, startinclusive: true, stopinclusive: true, label: '=' + value },\n\t\t\t\t{ start: value, startinclusive: false, stopunbounded: true, label: '>' + value }\n\t\t\t]\n\t\t}\n\t} else {\n\t\t// multiple unique values in data array\n\t\t// prepare regular bin config\n\n\t\t// compute the bin size for a maximum bin number of 8\n\t\tdata.sort((a, b) => a - b)\n\t\tconst l = data.length\n\t\tconst min = data[0]\n\t\tconst max = data[l - 1]\n\t\tconst p5idx = Math.ceil(l * 0.05) - 1\n\t\tconst p98idx = Math.ceil(l * 0.98) - 1\n\t\tconst p5 = data[p5idx]\n\t\tconst p98 = data[p98idx]\n\t\t// use 98th and 5th percentiles to compute bin size to reduce outlier influence\n\t\t// if 98th = 5th, use max and min instead\n\t\tconst binSize = p98 != p5 ? (p98 - p5) / 8 : (max - min) / 8\n\t\t// first bin stop will equal either (minimum + bin size) or (5th percentile), whichever is larger.\n\t\tconst firstBinStop = Math.max(min + binSize, p5)\n\t\t// round the bin values\n\t\tlet [binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding] = roundBinVals(binSize, firstBinStop, max, min)\n\t\t// generate the bin configuration\n\t\tbinConfig = {\n\t\t\ttype: 'regular-bin',\n\t\t\tstartinclusive: true,\n\t\t\tbin_size: binSize_rnd,\n\t\t\tfirst_bin: { stop: firstBinStop_rnd }\n\t\t}\n\t\tif (lastBinStart_rnd) binConfig.last_bin = { start: lastBinStart_rnd }\n\t\tif (rounding) binConfig.rounding = rounding\n\t}\n\tif ('format' in opts) {\n\t\tif (opts.format === 'string') {\n\t\t\treturn JSON.stringify(binConfig)\n\t\t} else {\n\t\t\tthrow 'options are not in the correct format'\n\t\t}\n\t} else {\n\t\treturn binConfig\n\t}\n}\n\nfunction roundBinVals(binSize, firstBinStop, max, min) {\n\tlet binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding\n\tconst log = Math.floor(Math.log10(binSize))\n\tif (binSize >= 0.1 && binSize <= 2) {\n\t\t// Round to the nearest one for small bin sizes\n\t\tbinSize_rnd = Math.round(binSize / (1 * 10 ** log)) * (1 * 10 ** log)\n\t\tfirstBinStop_rnd = Math.round(firstBinStop / (1 * 10 ** log)) * (1 * 10 ** log)\n\t} else {\n\t\t// Round to the nearest five for large bin sizes\n\t\tbinSize_rnd = Math.round(binSize / (5 * 10 ** log)) * (5 * 10 ** log)\n\t\tfirstBinStop_rnd = Math.round(firstBinStop / (5 * 10 ** log)) * (5 * 10 ** log)\n\t\tif (binSize_rnd === 0) binSize_rnd = 1 * 10 ** log\n\t\tif (firstBinStop_rnd === 0) firstBinStop_rnd = 1 * 10 ** log\n\t\tif (binSize_rnd === 5 * 10 ** log && firstBinStop_rnd === 1 * 10 ** log) firstBinStop_rnd = 5 * 10 ** log\n\t}\n\tif (firstBinStop_rnd < min) firstBinStop_rnd = firstBinStop_rnd * 2\n\t// if the number of bins is above 8 after rounding, then set the last bin start to restrict the number of bins to 8\n\tconst eighthBinStop_rnd = firstBinStop_rnd + binSize_rnd * 7\n\tif (max > eighthBinStop_rnd) {\n\t\tlastBinStart_rnd = firstBinStop_rnd + binSize_rnd * 6\n\t}\n\tif (binSize < 1) {\n\t\tconst digits = Math.abs(log)\n\t\tbinSize_rnd = Number(binSize_rnd.toFixed(digits))\n\t\tfirstBinStop_rnd = Number(firstBinStop_rnd.toFixed(digits))\n\t\tif (lastBinStart_rnd) lastBinStart_rnd = Number(lastBinStart_rnd.toFixed(digits))\n\t\trounding = '.' + digits + 'f'\n\t}\n\tif (Object.is(firstBinStop_rnd, -0)) firstBinStop_rnd = 0\n\treturn [binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding]\n}\n", "/*\nto parse a variant line, not header\n\ncannot simply slice by /[;=]/, but read char by char\ncase CLNVI=Breast_Cancer_Information_Core__(BRCA2):745-4&base_change=C_to_G;\ncase k1=v1;DB;k2=v2;\n*/\nexport function dissect_INFO(str) {\n\t//let findequal=true\n\tlet findsemicolon = false\n\tlet findequalorsemicolon = true\n\n\tlet i = 0\n\tlet idx = 0\n\n\tconst k2v = {}\n\tlet lastkey\n\n\twhile (i < str.length) {\n\t\tconst c = str[i]\n\t\tif (findequalorsemicolon) {\n\t\t\tif (c == '=') {\n\t\t\t\tfindsemicolon = true\n\t\t\t\tfindequalorsemicolon = false\n\t\t\t\tlastkey = str.substring(idx, i)\n\t\t\t\tidx = i + 1\n\t\t\t} else if (c == ';') {\n\t\t\t\t// should be a flag\n\t\t\t\tk2v[str.substring(idx, i)] = 1\n\t\t\t\tidx = i + 1\n\t\t\t}\n\t\t} else if (findsemicolon && c == ';') {\n\t\t\tfindequalorsemicolon = true\n\t\t\tfindsemicolon = false\n\t\t\tk2v[lastkey] = str.substring(idx, i)\n\t\t\tlastkey = null\n\t\t\tidx = i + 1\n\t\t}\n\t\ti++\n\t}\n\n\tconst remainstr = str.substr(idx, i)\n\tif (lastkey) {\n\t\tk2v[lastkey] = remainstr\n\t} else {\n\t\tk2v[remainstr] = 1\n\t}\n\n\treturn k2v\n}\n", "import { vepinfo } from './common.js'\n/*\nparse csq field from a variant line, not header\nCSQ header must have already been parsed\n\nstr: the csq value for a vcf line\nheader: [ // something like this\n { name: 'Allele' },\n { name: 'Consequence' },\n { name: 'IMPACT' },\n { name: 'SYMBOL' },\n { name: 'Gene' },\n { name: 'Feature_type' },\n { name: 'Feature' },\n { name: 'BIOTYPE' },\n { name: 'EXON' },\n { name: 'INTRON' },\n { name: 'HGVSc' },\n { name: 'HGVSp' },\n { name: 'cDNA_position' },\n { name: 'CDS_position' },\n { name: 'Protein_position' },\n { name: 'Amino_acids' },\n { name: 'Codons' },\n { name: 'Existing_variation' },\n { name: 'DISTANCE' },\n { name: 'STRAND' },\n { name: 'FLAGS' },\n { name: 'SYMBOL_SOURCE' },\n { name: 'HGNC_ID' },\n { name: 'CANONICAL' },\n { name: 'REFSEQ_MATCH' },\n { name: 'GIVEN_REF' },\n { name: 'USED_REF' },\n { name: 'BAM_EDIT' },\n { name: 'HGVS_OFFSET' },\n { name: 'CLIN_SIG' },\n { name: 'SOMATIC' },\n { name: 'PHENO' }\n]\n\nm: {\n\tmlst[ {} ]\n\t\t.allele_original\n\t\t.csq[ {} ] // parse_CSQ will add this array to this allele\n\t\t\t._class\n\t\t\t._csqrank\n\t\t\t._dt\n\t\t\t._gene\n\t\t\t._isoform\n\t\t\t._mname\n}\n\n*/\n\nexport function parse_CSQ(str, header, m) {\n\tif (!header) {\n\t\treturn null\n\t}\n\tfor (const thisannotation of str.split(',')) {\n\t\tconst lst = thisannotation.replace(/&/g, ',').split('|')\n\n\t\tconst o = {}\n\n\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\tif (lst[i]) {\n\t\t\t\to[header[i].name] = lst[i]\n\t\t\t}\n\t\t}\n\t\tif (!o.Allele) {\n\t\t\tcontinue\n\t\t}\n\t\tlet allele = null\n\n\t\t//////////////////////////////////////\n\t\t// NOTE\n\t\t// mds2delete\n\t\t// m.alleles[] is based on old vcf parsing and may delete?\n\t\t// latest spec is m.mlst[]\n\t\t//////////////////////////////////////\n\n\t\tfor (const a of m.mlst || m.alleles) {\n\t\t\tif (a.allele_original == o.Allele) {\n\t\t\t\tallele = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!allele) {\n\t\t\tif (o.Allele == '-') {\n\t\t\t\t// deletion\n\t\t\t\tif (m.mlst) {\n\t\t\t\t\tif (m.mlst.length == 1) {\n\t\t\t\t\t\tallele = m.mlst[0]\n\t\t\t\t\t}\n\t\t\t\t} else if (m.alleles) {\n\t\t\t\t\tif (m.alleles.length == 1) {\n\t\t\t\t\t\tallele = m.alleles[0]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const a of m.mlst || m.alleles) {\n\t\t\t\t\tif (a.allele_original.substr(1) == o.Allele) {\n\t\t\t\t\t\t// insertion, without first padding base\n\t\t\t\t\t\tallele = a\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!allele) {\n\t\t\t\t// cannot match to allele!!!\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif (!allele.csq) {\n\t\t\tallele.csq = []\n\t\t}\n\t\tallele.csq.push(o)\n\n\t\t// gene\n\t\to._gene = o.SYMBOL || o.Gene\n\n\t\t// isoform\n\t\tif (o.Feature_type && o.Feature_type == 'Transcript') {\n\t\t\to._isoform = o.Feature.split('.')[0] // remove version\n\t\t} else {\n\t\t\to._isoform = o._gene\n\t\t}\n\n\t\t// class\n\t\tif (o.Consequence) {\n\t\t\tconst [dt, cls, rank] = vepinfo(o.Consequence)\n\t\t\to._dt = dt\n\t\t\to._class = cls\n\t\t\to._csqrank = rank\n\t\t} else {\n\t\t\t// FIXME\n\t\t\to._dt = dtsnvindel\n\t\t\to._class = mclassnonstandard\n\t\t}\n\t\t// mname\n\t\tif (o.HGVSp) {\n\t\t\to._mname = decodeURIComponent(o.HGVSp.substr(o.HGVSp.indexOf(':') + 1))\n\t\t} else if (o.Protein_position && o.Amino_acids) {\n\t\t\to._mname = decodeURIComponent(o.Protein_position + o.Amino_acids)\n\t\t} else if (o.HGVSc) {\n\t\t\to._mname = o.HGVSc.substr(o.HGVSc.indexOf(':') + 1)\n\t\t} else if (o.Existing_variation) {\n\t\t\to._name = o.Existing_variation\n\t\t} else {\n\t\t}\n\t}\n\treturn true\n}\n", "import { vepinfo } from './common.js'\n\nexport function parse_ANN(str, header, m) {\n\t// snpEff\n\tif (!header) {\n\t\treturn null\n\t}\n\tfor (const thisannotation of str.split(',')) {\n\t\tconst lst = thisannotation.replace(/&/g, ',').split('|')\n\n\t\tconst o = {}\n\n\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\tif (lst[i]) {\n\t\t\t\to[header[i].name] = lst[i]\n\t\t\t}\n\t\t}\n\t\tif (!o.Allele) {\n\t\t\tcontinue\n\t\t}\n\t\tlet allele = null\n\t\tfor (const a of m.alleles) {\n\t\t\tif (a.allele == o.Allele) {\n\t\t\t\tallele = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!allele) {\n\t\t\t// cannot match to allele!!!\n\t\t\tcontinue\n\t\t}\n\t\tif (!allele.ann) {\n\t\t\tallele.ann = []\n\t\t}\n\t\tallele.ann.push(o)\n\t\to._gene = o.Gene_Name\n\t\t// isoform\n\t\tif (o.Feature_Type && o.Feature_Type == 'transcript' && o.Feature_ID) {\n\t\t\to._isoform = o.Feature_ID.split('.')[0]\n\t\t}\n\t\t// class\n\t\tif (o.Annotation) {\n\t\t\tconst [dt, cls, rank] = vepinfo(o.Annotation)\n\t\t\to._dt = dt\n\t\t\to._class = cls\n\t\t\to._csqrank = rank\n\t\t} else {\n\t\t\t// FIXME\n\t\t\to._dt = dtsnvindel\n\t\t\to._class = mclassnonstandard\n\t\t}\n\t\t// mname\n\t\tif (o['HGVS.p']) {\n\t\t\t//o._mname=decodeURIComponent(o.HGVSp.substr(o.HGVSp.indexOf(':')+1))\n\t\t\to._mname = o['HGVS.p']\n\t\t} else if (o['HGVS.c']) {\n\t\t\to._mname = o['HGVS.c']\n\t\t} else {\n\t\t}\n\t}\n\treturn true\n}\n", "import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from './common.js'\n\nexport function getVariantType(ref, alt) {\n\tif (ref.length == 1 && alt.length == 1) {\n\t\t// both alleles length of 1\n\t\tif (alt == '.') {\n\t\t\t// alt is missing\n\t\t\treturn mclassdeletion\n\t\t}\n\t\t// snv\n\t\treturn mclasssnv\n\t}\n\tif (ref.length == alt.length) return mclassmnv\n\t// FIXME only when empty length of one allele\n\tif (ref.length < alt.length) return mclassinsertion\n\tif (ref.length > alt.length) return mclassdeletion\n\treturn mclassnonstandard\n}\n", "import { mclass } from './common.js'\nimport { dissect_INFO } from './vcf.info.js'\nimport { parse_CSQ } from './vcf.csq.js'\nimport { parse_ANN } from './vcf.ann.js'\nimport { getVariantType } from './vcf.type.js'\n\n/*\nOnly for parsing vcf files\nis not involved in creating vcf tracks\n\nshared between client-server\n*/\n\n// for telling symbolic alleles e.g. <*:DEL>\nconst getallelename = new RegExp(/<(.+)>/)\n\nconst mclasslabel2key = {}\nfor (const k in mclass) {\n\tmclasslabel2key[mclass[k].label.toUpperCase()] = k\n}\n\nexport function vcfparsemeta(lines) {\n\t/*\n\tinput: array of string, as lines separated by linebreak\n\n\t##INFO for meta lines\n\t#CHROM for header, to get samples\n\n\t*/\n\n\tlet sample = [],\n\t\terrlst = [],\n\t\tinfo = {},\n\t\thasinfo = false,\n\t\tformat = {},\n\t\thasformat = false\n\n\tfor (const line of lines) {\n\t\tif (!line.startsWith('#')) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('#C')) {\n\t\t\t// header, get samples\n\t\t\tsample = line.split('\\t').slice(9)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##INFO')) {\n\t\t\tconst e = tohash(line.substring(8, line.length - 1), info)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('INFO error: ' + e)\n\t\t\t} else {\n\t\t\t\thasinfo = true\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##FORMAT')) {\n\t\t\tconst e = tohash(line.substring(10, line.length - 1), format)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('FORMAT error: ' + e)\n\t\t\t} else {\n\t\t\t\thasformat = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst sampleobjlst = []\n\tfor (const samplename of sample) {\n\t\tconst a = { name: samplename }\n\n\t\t// this enables adding key4annotation to match with .ds.cohort.annotation\n\n\t\tsampleobjlst.push(a)\n\t}\n\n\t// reserved INFO fields\n\tif (info.CSQ) {\n\t\tconst lst = info.CSQ.Description.split(' Format: ')\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split('|')\n\t\t\tif (lst2.length > 1) {\n\t\t\t\t// fix csq headers so to allow configuring show/hide of csq fields\n\t\t\t\tinfo.CSQ.csqheader = []\n\t\t\t\tfor (const str of lst2) {\n\t\t\t\t\tconst attr = { name: str }\n\t\t\t\t\tinfo.CSQ.csqheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t}\n\t}\n\n\tif (info.ANN) {\n\t\tconst lst = info.ANN.Description.split(\"'\")\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split(' | ')\n\t\t\tif (lst2.length) {\n\t\t\t\tinfo.ANN.annheader = []\n\t\t\t\tfor (const s of lst2) {\n\t\t\t\t\tconst attr = { name: s }\n\t\t\t\t\tinfo.ANN.annheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('no \" | \" joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('no single-quote enclosed annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t}\n\t}\n\n\treturn [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null]\n}\n\nexport function vcfparseline(line, vcf) {\n\t/*\n\tvcf, samples/info is generated by vcfparsemeta()\n\t\t.nochr BOOL\n\t\t.samples [ {} ]\n\t\t\t.name\n\t\t.info {}\n\t\t.format {}\n\n\treturn:\n\t\terror message STR\n\t\taltinvalid []\n\t\tmlst [ m ] one m per alt allele\n\t\t\tchr\n\t\t\tpos\n\t\t\tname\n\t\t\ttype\n\t\t\tref\n\t\t\talt\n\t\t\taltstr\n\t\t\tsampledata []\n\t\t\taltinfo\n\t*/\n\n\tconst lst = line.split('\\t')\n\tif (lst.length < 8) {\n\t\t// no good\n\t\treturn ['line has less than 8 fields', null, null]\n\t}\n\n\tconst rawpos = Number.parseInt(lst[2 - 1])\n\tif (!Number.isInteger(rawpos)) {\n\t\treturn ['invalid value for genomic position', null, null]\n\t}\n\n\tconst refallele = lst[4 - 1]\n\n\tconst m = {\n\t\tvcf_ID: lst[3 - 1],\n\t\tchr: (vcf.nochr ? 'chr' : '') + lst[1 - 1],\n\t\tpos: rawpos - 1,\n\t\tref: refallele,\n\t\t//refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, \"refstr\" is required for matching in FORMAT\n\t\taltstr: lst[5 - 1],\n\t\talleles: [\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tref allele only a placeholder, to be removed, this array only contains alt alleles\n\t\t\t\tthis is a must\n\t\t\t\talso allows GT allele index to work\n\t\t\t\t*/\n\t\t\t\tallele: refallele,\n\t\t\t\tsampledata: []\n\t\t\t}\n\t\t],\n\n\t\tinfo: {}, // locus info, do not contain allele info\n\n\t\tname: lst[3 - 1] == '.' ? null : lst[3 - 1]\n\t}\n\n\t// parse alt\n\tconst altinvalid = []\n\tfor (const alt of lst[5 - 1].split(',')) {\n\t\tconst a = {\n\t\t\tref: m.ref, // may be corrected just below!\n\t\t\tallele: alt,\n\t\t\t// 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele\n\t\t\tallele_original: alt,\n\t\t\tsampledata: [],\n\t\t\t_m: m,\n\t\t\tinfo: {} // allele info, do not contain locus info\n\t\t}\n\t\tm.alleles.push(a)\n\t\tif (alt[0] == '<') {\n\t\t\t/*\n\t\t\tsymbolic allele, show text within <> as name\n\t\t\tFIXME match INFO\n\t\t\t*/\n\t\t\tconst tmp = alt.match(getallelename)\n\t\t\tif (!tmp) {\n\t\t\t\taltinvalid.push(alt)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.type = tmp[1]\n\n\t\t\ta.allele = tmp[1]\n\t\t\ta.issymbolicallele = true\n\t\t} else {\n\t\t\t// normal nucleotide\n\n\t\t\tconst [p, ref, alt] = correctRefAlt(m.pos, m.ref, a.allele)\n\t\t\ta.pos = p\n\t\t\ta.ref = ref\n\t\t\ta.allele = alt\n\t\t}\n\t}\n\n\tif (lst[9 - 1] && lst[10 - 1]) {\n\t\tparse_FORMAT2(lst, m, vcf)\n\t}\n\n\t/*\n\tremove ref allele so it only contain alternative alleles\n\tso that parse_INFO can safely apply Number=A fields to m.alleles\n\t*/\n\tm.alleles.shift()\n\n\t// info\n\tconst tmp = lst[8 - 1] == '.' ? [] : dissect_INFO(lst[8 - 1])\n\tlet badinfokeys = []\n\n\tif (vcf.info) {\n\t\tbadinfokeys = parse_INFO(tmp, m, vcf)\n\t} else {\n\t\t// vcf meta lines told nothing about INFO, do not parse\n\t\tm.info = tmp\n\t}\n\n\tconst mlst = []\n\tfor (const a of m.alleles) {\n\t\tconst m2 = {}\n\t\tfor (const k in m) {\n\t\t\tif (k != 'alleles') {\n\t\t\t\tm2[k] = m[k]\n\t\t\t}\n\t\t}\n\t\tfor (const k in a) {\n\t\t\tif (k == 'allele') {\n\t\t\t\tm2.alt = a[k]\n\t\t\t} else if (k == 'info') {\n\t\t\t\tm2.altinfo = a[k]\n\t\t\t} else {\n\t\t\t\tm2[k] = a[k]\n\t\t\t}\n\t\t}\n\t\tif (!m2.issymbolicallele && m2.alt != 'NON_REF') {\n\t\t\tm2.type = getVariantType(m2.ref, m2.alt)\n\t\t\t/*\n\t\t\t// valid alt allele, apply Dr. J's cool method\n\t\t\tconst [p,ref,alt]=correctRefAlt(m2.pos, m2.ref, m2.alt)\n\t\t\tm2.pos=p\n\t\t\tm2.ref=ref\n\t\t\tm2.alt=alt\n\t\t\t*/\n\t\t}\n\t\tmlst.push(m2)\n\t}\n\treturn [\n\t\tbadinfokeys.length ? 'unknown info keys: ' + badinfokeys.join(',') : null,\n\t\tmlst,\n\t\taltinvalid.length > 0 ? altinvalid : null\n\t]\n}\n\nfunction correctRefAlt(p, ref, alt) {\n\t// for oligos, always trim the last identical base\n\twhile (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {\n\t\tref = ref.substr(0, ref.length - 1)\n\t\talt = alt.substr(0, alt.length - 1)\n\t}\n\t// move position up as long as first positions are equal\n\twhile (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {\n\t\tref = ref.substr(1)\n\t\talt = alt.substr(1)\n\t\tp++\n\t}\n\treturn [p, ref, alt]\n}\n\nfunction parse_FORMAT2(lst, m, vcf) {\n\t/*\n\tm.alleles[0] is ref allele\n\n\teach allele:\n\t\t.ref\n\t\t.allele\n\t\t.allele_original\n\t\t.sampledata[] blank array\n\t*/\n\tconst formatfields = lst[9 - 1].split(':')\n\n\tfor (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {\n\t\t// for each sample\n\n\t\tconst valuelst = lst[_sampleidx].split(':')\n\t\t{\n\t\t\t// tell if this sample have any data in this line (variant), if .:., then skip\n\t\t\tlet none = true\n\t\t\tfor (const v of valuelst) {\n\t\t\t\tif (v != '.') {\n\t\t\t\t\tnone = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (none) {\n\t\t\t\t// this sample has no format value\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t/* should create an object of {format:value} of this sample\n\t\twith this object, for each alt allele this sample has,\n\t\tput a copy in m.allele[x].sampledata[]\n\t\t*/\n\n\t\tconst sampleidx = _sampleidx - 9\n\n\t\t/*\n\t\tfor each alt allele, initialize obj of this sample and store in this allele\n\t\tlater, to iterate over format fields and put in appropriate values\n\t\tnote that this sample may not actually have this allele\n\t\t*/\n\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\tconst sobj = {}\n\t\t\tif (vcf.samples && vcf.samples[sampleidx]) {\n\t\t\t\tfor (const k in vcf.samples[sampleidx]) {\n\t\t\t\t\tsobj[k] = vcf.samples[sampleidx][k]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsobj.name = 'missing_samplename_from_vcf_header'\n\t\t\t}\n\t\t\tm.alleles[i].sampledata.push({\n\t\t\t\tsampleobj: sobj\n\t\t\t})\n\t\t}\n\n\t\tfor (let fi = 0; fi < formatfields.length; fi++) {\n\t\t\t// for each field of this sample\n\n\t\t\tconst field = formatfields[fi]\n\t\t\tconst value = valuelst[fi]\n\t\t\tif (value == '.') {\n\t\t\t\t// no value for this field\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field == 'GT') {\n\t\t\t\tconst splitter = value.indexOf('/') != -1 ? '/' : '|'\n\t\t\t\tlet gtsum = 0 // for calculating gtallref=true, old\n\t\t\t\tlet unknowngt = false // if any is '.', then won't calculate gtallref\n\t\t\t\tconst gtalleles = []\n\t\t\t\tfor (const i of value.split(splitter)) {\n\t\t\t\t\tif (i == '.') {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst j = Number.parseInt(i)\n\t\t\t\t\tif (Number.isNaN(j)) {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tgtsum += j\n\t\t\t\t\tconst ale = m.alleles[j]\n\t\t\t\t\tif (ale) {\n\t\t\t\t\t\tgtalleles.push(ale.allele)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet gtallref = false\n\t\t\t\tif (!unknowngt) {\n\t\t\t\t\tgtallref = gtsum == 0\n\t\t\t\t}\n\n\t\t\t\tconst genotype = gtalleles.join(splitter)\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tconst ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1]\n\t\t\t\t\tms.GT = value\n\t\t\t\t\tms.genotype = genotype\n\t\t\t\t\tif (gtallref) {\n\t\t\t\t\t\tms.gtallref = true\n\t\t\t\t\t}\n\n\t\t\t\t\t// for mds vcf to drop out samples that do not have this alt allele\n\t\t\t\t\tms.__gtalleles = gtalleles\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// other data fields\n\t\t\tconst formatdesc = vcf.format ? vcf.format[field] : null\n\t\t\tif (!formatdesc) {\n\t\t\t\t// unspecified field, put to all alt alleles\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst isinteger = formatdesc.Type == 'Integer'\n\t\t\tconst isfloat = formatdesc.Type == 'Float'\n\n\t\t\tif ((formatdesc.Number && formatdesc.Number == 'R') || field == 'AD') {\n\t\t\t\t/*\n\t\t\t\tper-allele value, including ref\n\t\t\t\tv4.1 has AD not with \"R\", must process as R\n\t\t\t\t*/\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.ref] = fvlst[0]\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (formatdesc.Number && formatdesc.Number == 'A') {\n\t\t\t\t// per alt-allele value\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i - 1] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i - 1]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// otherwise, append this field to all alt\n\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t}\n\t\t}\n\t}\n\n\t// compatible with old ds: make allele2readcount from AD\n\tfor (const a of m.alleles) {\n\t\tfor (const s of a.sampledata) {\n\t\t\tif (s.AD) {\n\t\t\t\ts.allele2readcount = {}\n\t\t\t\tfor (const k in s.AD) {\n\t\t\t\t\ts.allele2readcount[k] = s.AD[k]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction tohash(s, hash) {\n\t/*\n\tparse INFO\n\t*/\n\tconst h = {},\n\t\terr = []\n\tlet prev = 0,\n\t\tprevdoublequote = false,\n\t\tk = null\n\tfor (let i = 0; i < s.length; i++) {\n\t\tif (s[i] == '\"') {\n\t\t\ti++\n\t\t\tconst thisstart = i\n\t\t\twhile (s[i] != '\"') {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif (k) {\n\t\t\t\th[k] = s.substring(thisstart, i)\n\t\t\t\tk = null\n\t\t\t} else {\n\t\t\t\terr.push('k undefined before double quotes')\n\t\t\t}\n\t\t\tprevdoublequote = true\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == '=') {\n\t\t\tk = s.substring(prev, i)\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == ',') {\n\t\t\tif (prevdoublequote) {\n\t\t\t\tprevdoublequote = false\n\t\t\t} else {\n\t\t\t\tif (k) {\n\t\t\t\t\th[k] = s.substring(prev, i)\n\t\t\t\t\tk = null\n\t\t\t\t} else {\n\t\t\t\t\terr.push('k undefined')\n\t\t\t\t}\n\t\t\t}\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t}\n\tif (k) {\n\t\th[k] = s.substring(prev, i)\n\t}\n\tif (h.ID) {\n\t\thash[h.ID] = h\n\t} else {\n\t\treturn 'no ID'\n\t}\n\tif (err.length) return err.join('\\n')\n}\n\nfunction parse_INFO(tmp, m, vcf) {\n\t/*\n\tthis function fills in both m.info{} and m.alleles[].info{}\n\n\tthe m.alleles[] will later be converted to [m], each carrying one alt allele\n\teach m will have .info{} for locus info, and .altinfo{} for alt allele info\n\n\t*/\n\n\tconst badinfokeys = []\n\n\tfor (const key in tmp) {\n\t\tif (vcf.info[key] == undefined) {\n\t\t\tbadinfokeys.push(key)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst value = tmp[key]\n\n\t\t////////////////// hard-coded fields\n\n\t\tif (key == 'CSQ') {\n\t\t\tconst okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (key == 'ANN') {\n\t\t\tconst okay = parse_ANN(value, vcf.info.ANN.annheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t////////////////// end of hardcoded fields\n\n\t\tif (vcf.info[key].Type == 'Flag') {\n\t\t\t// flag has no value\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tconst __number = vcf.info[key].Number\n\t\tconst isinteger = vcf.info[key].Type == 'Integer'\n\t\tconst isfloat = vcf.info[key].Type == 'Float'\n\n\t\tif (__number == '0') {\n\t\t\t/*\n\t\t\tno value, should be a Flag\n\t\t\t*/\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'A') {\n\t\t\t/*\n\t\t\tper alt allele\n\t\t\t*/\n\t\t\tconst tt = value.split(',')\n\t\t\tfor (let j = 0; j < tt.length; j++) {\n\t\t\t\tif (m.alleles[j]) {\n\t\t\t\t\tm.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'R') {\n\t\t\t/*\n\t\t\tFIXME \"R\" is not considered, m.alleles only contain alt, which .info{} for each\n\t\t\tthe current datastructure does not support info for ref allele!\n\t\t\t*/\n\t\t}\n\n\t\tif (__number == '1') {\n\t\t\t/*\n\t\t\tsingle value\n\t\t\t*/\n\t\t\tm.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!value.split) {\n\t\t\t// unknown error\n\t\t\tcontinue\n\t\t}\n\n\t\t// number of values unknown, \"commas are permitted only as delimiters for lists of values\"\n\n\t\tconst lst = value.split(',') // value is always array!!\n\t\tif (isinteger) {\n\t\t\tm.info[key] = lst.map(Number.parseInt)\n\t\t} else if (isfloat) {\n\t\t\tm.info[key] = lst.map(Number.parseFloat)\n\t\t} else {\n\t\t\tm.info[key] = lst\n\t\t}\n\t}\n\treturn badinfokeys\n}\n", "// compute the percentile value from an array of values\n// sorted parameter allows to skip sorting if array is pre-sorted\n// source: https://www.dummies.com/article/academics-the-arts/math/statistics/how-to-calculate-percentiles-in-statistics-169783/\nexport default function computePercentile(values, percentile, sorted = false) {\n\tif (!sorted) values.sort((a, b) => a - b)\n\tconst index = Math.abs((percentile / 100) * values.length - 1)\n\tconst value = Number.isInteger(index) ? (values[index] + values[index + 1]) / 2 : values[Math.ceil(index)]\n\treturn value\n}\n", "const encoder = new TextEncoder()\n\nexport async function hash(message) {\n\tconst msgUint8 = encoder.encode(message) // encode as (utf-8) Uint8Array\n\tconst hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8) // hash the message\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer)) // convert buffer to byte array\n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('') // convert bytes to hex string\n\treturn hexToBase64(hashHex).replace('=', '-') // shorten from 40 to 28 chars\n}\n\nfunction hexToBase64(hexStr) {\n\treturn btoa(\n\t\t[...hexStr].reduce(\n\t\t\t(acc, _, i) => (acc += !((i - 1) & 1) ? String.fromCharCode(parseInt(hexStr.substring(i - 1, i + 1), 16)) : ''),\n\t\t\t''\n\t\t)\n\t)\n}\n", "import { isNumeric } from \"./helpers.js\"\nconst reserved = [\"false\", \"true\", \"null\", \"undefined\"]\nconst delimiters = ['\"', \"{\", \"[\"]\nfunction encode(rawObject) {\n\tconst params = []\n\tfor (const [key, value] of Object.entries(rawObject)) {\n\t\tif (\n\t\t\ttypeof value == \"string\" &&\n\t\t\t!isNumeric(value) &&\n\t\t\t!reserved.includes(value) &&\n\t\t\t!delimiters.includes(value[0])\n\t\t) {\n\t\t\tparams.push(`${key}=${encodeURIComponent(value)}`)\n\t\t} else if (value !== void 0) {\n\t\t\tparams.push(`${key}=${encodeURIComponent(JSON.stringify(value))}`)\n\t\t}\n\t}\n\treturn params.join(\"&\")\n}\nfunction decode(query) {\n\tconst encoding = query.encoding\n\tfor (const [key, value] of Object.entries(query)) {\n\t\tif (\n\t\t\tencoding == \"json\" ||\n\t\t\tvalue == \"null\" || // not new, always been\n\t\t\tvalue == \"true\" || // NEED TO FIND-REPLACE CODE THAT USES value == 'true'\n\t\t\tvalue == \"false\" || // NEED TO FIND-REPLACE CODE THAT USES value == 'false'\n\t\t\tisNumeric(value) || // NEED TO check\n\t\t\t(typeof value == \"string\" &&\n\t\t\t\tvalue.startsWith('\"') &&\n\t\t\t\tvalue.endsWith('\"')) ||\n\t\t\t(typeof value == \"string\" &&\n\t\t\t\tvalue.startsWith(\"{\") &&\n\t\t\t\tvalue.endsWith(\"}\")) ||\n\t\t\t(value.startsWith(\"[\") && value.endsWith(\"]\"))\n\t\t)\n\t\t\tquery[key] = JSON.parse(value)\n\t}\n\treturn query\n}\nexport { decode, encode }\n", "import { hash } from './hash.js'\nimport { encode } from './urljson.js'\n\n/*\n\tezFetch()\n\tfetch wrapper with automatic response content-type detection and handling\n\n\t- this addresses issues with ky.json() or got.json(), where a HTTP 404 NOT FOUND\n\t\tresponse with text/html can break error handling/logging, making it harder to debug\n\n\t- this also automatically handles multipart responses \n\n\targuments:\n\turl\n\tinit{headers?, body?}\n\t- first two arguments are same as native fetch\n*/\nexport async function ezFetch(_url, init = {}) {\n\tconst url = mayAdjustRequest(_url, init)\n\n\treturn fetch(url, init).then(async r => {\n\t\tconst response = await processResponse(r)\n\t\tif (!r.ok) {\n\t\t\tconsole.log('ezFetch error ' + r.status)\n\t\t\tconsole.log(response)\n\t\t\tthrow response\n\t\t}\n\t\treturn response\n\t})\n}\n\nfunction mayAdjustRequest(url, init) {\n\tconst method = init.method?.toUpperCase() || 'GET'\n\tif (method == 'POST') {\n\t\tif (!init.headers) init.headers = {}\n\t\tif (init.body) {\n\t\t\tif (!init.headers['content-type']) init.headers['content-type'] = 'application/json'\n\t\t\tif (init.headers['content-type'].toLowerCase() == 'application/json') {\n\t\t\t\t// if consumer code has pre-encoded the body, parse to verify correctness\n\t\t\t\tif (typeof init.body == 'string') init.body = JSON.parse(init.body)\n\t\t\t\tinit.body = JSON.stringify(init.body)\n\t\t\t}\n\t\t}\n\t\treturn url\n\t}\n\t// default to GET method per native fetch\n\tif (init.body) {\n\t\tif (typeof init.body != 'object') throw `init.body should be an object`\n\t\t// init.body should be an object, to be converted to GET URL search parameter strings\n\t\tif (!url.includes('?')) url += '?'\n\t\treturn `${url}${encode(init.body)}`\n\t}\n}\n\n/* \nr: a native fetch response argument\n\npotentially allow \"application/octet-stream\" as response type\nin such case it will not try to parse it as json\nalso the caller should just call dofetch2() without a serverData{}\nrather than dofetch3\n*/\nexport async function processResponse(r) {\n\tconst ct = r.headers.get('content-type') // content type is always present\n\tif (!ct) throw `missing response.header['content-type']`\n\tif (ct.includes('/json')) {\n\t\treturn r.json()\n\t}\n\tif (ct.includes('/text') || ct.includes('text/')) {\n\t\treturn r.text()\n\t}\n\tif (ct.includes('multipart')) {\n\t\tif (ct.startsWith('multipart/form-data')) return processFormData(r)\n\t\telse throw `cannot handle response content-type: '${ct}'`\n\t}\n\t// call blob() as catch-all\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Response\n\treturn r.blob()\n}\n\n/*\n\texpected response format\n\t--boundary-text-from-HTTP-headers-content-type\n\theader-key1: header-value1\n\theader-key2: header-value2\n\n\t...json, text, blob, value, etc...\n\t--boundary-text-from-HTTP-headers-content-type\n\t... same format as previous chunk ...\n\n\t--boundary-text-from-HTTP-headers-content-type--\n*/\n\nexport async function processFormData(res) {\n\tconst decoder = new TextDecoder()\n\tconst data = {}\n\ttry {\n\t\tconst form = await res.formData()\n\t\t// The key of each form entry is a string, and the value is either a string or a Blob.\n\t\t// see https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries\n\t\tfor (const [key, value] of form.entries()) {\n\t\t\tif (value.type) {\n\t\t\t\t// value is a Blob\n\t\t\t\tdata[key] = { headers: { 'content-type': value.type }, body: value }\n\t\t\t} else {\n\t\t\t\t// value is a string, assume to be application/x-jsonlines (one json encoded value per line)\n\t\t\t\t// and convert into an array of json-decoded values\n\t\t\t\tconst body = !value ? [] : value.trim().split('\\n').map(JSON.parse)\n\t\t\t\tdata[key] = { headers: { 'content-type': 'application/json' }, body }\n\t\t\t}\n\t\t}\n\t\treturn data\n\t} catch (e) {\n\t\tthrow e\n\t}\n}\n\n// key: request object reference or conputed string dataName\n// value: fetch promise or response\nconst dataCache = new Map()\n// NOTE: when caching by request object reference,\n// consumer code must call deleteCache(q) at the end of the request handling\n\n// when caching by string dataName, track entries to manage the cache size\nconst cachedDataNames = []\n// maximum number of cached dataNames, oldest will be deleted if 1000 is exceeded\nconst maxNumOfDataKeys = 360\n\n/*\n\tmemFetch()\n\t- fetch wrapper that saves cached responses into memory and recovers them for matching subsequent requests\n\t- recommended for caching responses in the backend, with the opts.q argument to cache per expressjs request object\n\t- should call deleteCache(request) at the end of request handling, to free unneeded cache\n\t\n\tSee the usage note for getDataName() to avoid non-unique request/response.\n\t\n\tArguments:\n\turl\n\tinit{headers?, body?}\n\t- first two arguments are same as native fetch\n\n\topts{q}\n\tq?: request object (passed by reference, not copy)\n\t\t- if provided, will be used as cache data key \n\t - if not provided, then a string cache data key will be computed from the request url, body, headers\n*/\nexport async function memFetch(url, init, opts = {}) {\n\tconst dataKey = opts.q || (await getDataName(url, init))\n\tlet result = dataCache.get(dataKey)\n\n\tif (!result || (typeof result != 'object' && !(result instanceof Promise))) {\n\t\tdataCache.delete(dataKey)\n\t\tresult = undefined\n\t}\n\n\tif (!result) {\n\t\ttry {\n\t\t\t// do not await so that this same promise may be reused by all subsequent requests with the same dataKey\n\t\t\tdataCache.set(\n\t\t\t\tdataKey,\n\t\t\t\tfetch(url, init).then(async r => {\n\t\t\t\t\tconst response = await processResponse(r)\n\t\t\t\t\tif (!r.ok) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t\tthrow 'memFetch error ' + r.status\n\t\t\t\t\t}\n\t\t\t\t\t// to-do: support opt.freeze to enforce deep freeze of data.json()\n\t\t\t\t\tdataCache.set(dataKey, response)\n\t\t\t\t\treturn dataCache.get(dataKey)\n\t\t\t\t})\n\t\t\t)\n\t\t\tresult = dataCache.get(dataKey)\n\t\t} catch (e) {\n\t\t\tdelete dataCache.delete(dataKey)\n\t\t\tthrow e\n\t\t}\n\t}\n\tif (typeof dataKey === 'string') manageCacheSize(dataKey)\n\treturn result\n}\n\nexport function deleteCache(key) {\n\tdelete dataCache.delete(key)\n}\n\nexport function manageCacheSize(dataKey) {\n\t// manage the number of stored keys in dataCache\n\tconst i = cachedDataNames.indexOf(dataKey)\n\tif (i !== -1) cachedDataNames.splice(i, 1) // if the dataKey already exists, delete from current place in tracking array to move to front\n\tcachedDataNames.unshift(dataKey) // add the dataKey to the front of the tracking array\n\twhile (cachedDataNames.length > maxNumOfDataKeys) {\n\t\tconst oldestDataname = cachedDataNames.pop() // delete the dataKey from the tracking array\n\t\tdataCache.delete(oldestDataname)\n\t}\n}\n\n/*\n\tNOTE: When used in client-side code, an HttpOnly cookie for a logged in user will not be\n\ttracked in init.headers below. \n*/\nexport async function getDataName(url, init) {\n\t// IMPORTANT: must ensure dataName is unique to either public or logged-in user\n\tconst dataName = url + ' | ' + init.method + ' | ' + init.body + ' | ' + JSON.stringify(init.headers)\n\treturn await hash(dataName)\n}\n\n//\nexport function clearCache(opts = {}) {\n\tif (!opts.serverData) {\n\t\tdataCache.clear()\n\t\treturn\n\t}\n\tif (typeof opts.serverData != 'object') throw `opts.serverData is not an object`\n\tfor (const k of Object.keys(opts.serverData)) {\n\t\tdelete opts.serverData[k]\n\t}\n\tif (optsServerDataNames.has(opts.serverData)) optsServerDataNames.delete(opts.serverData)\n}\n", "import { TermTypes, isNumericTerm } from './terms.js'\n\nexport const graphableTypes = new Set([\n\t'categorical',\n\t'integer',\n\t'float',\n\t'condition',\n\t'survival',\n\t'snplst',\n\t'snplocus',\n\t'geneVariant',\n\t'samplelst',\n\t'geneExpression',\n\t'dtcnv',\n\t'dtsnvindel',\n\t'dtfusion',\n\t'dtsv',\n\t'date',\n\tTermTypes.SSGSEA,\n\tTermTypes.METABOLITE_INTENSITY,\n\tTermTypes.SINGLECELL_GENE_EXPRESSION,\n\tTermTypes.SINGLECELL_CELLTYPE,\n\tTermTypes.SNP\n])\n\n/*\nisUsableTerm() will\n\n\t- centralize the \"allowed term\" logic\n\twhich can be intricate or dataset-specific \n\tfor certain terms or contexts\n\t- make it easy to handle new term types\n\nArguments:\n\n\tterm {}\n\t\t.type: 'categorical', etc.\n\t\t.child_types: []\n\t\n\t_usecase {}\n\t\t.target (REQUIRED): 'barchart', 'regression', etc\n\t\t\t- used as a switch-case \"router\" for additional use-specific logic\n\t\t\t- other parameters, if applicable, are described in the route \"handler\" \n\t\t.detail \n\t\t - a more specific detailed use case\n\t\n\n\ttermdbConfig\n\t\toptional. provides ds overrides on default rules via excludedTermtypeByTarget. for use on client\n\n\tds\n\t\toptional. provides ds overrides when the function runs on backend\n\t\tserver-side dataset object that can supply overrides (in the form of functions) to the use case logic,\n\t\tfor example, to apply role-based allowed term uses or performance-related restrictions\n\t\tto ancestor terms when a use case aggregates too many data points for a given chart type\n\nReturns\n\n\ta Set{} with zero or more of the following strings:\n\t- 'plot' if the term can be used in a plot chartType\n\t- 'branch' if the term can be used only as an expandable tree branch, but not in a plot\n\t- an empty Set means that the term has no valid uses, i.e, it cannot be used either for plotting or as a tree branch\n*/\nexport function isUsableTerm(term, _usecase, termdbConfig, ds) {\n\tconst usecase = _usecase || {}\n\n\t// may apply dataset specific override filter for a use case\n\tif (typeof ds?.usecase?.[use.target] == 'function') {\n\t\treturn ds.usecase[use.target](term, use)\n\t}\n\n\t// if (term.isprivate && !user.roleCanUse(term)) return false\n\n\tconst uses = new Set()\n\t// note: expects term.child_types to be null if term.isleaf == true\n\tconst child_types = term.child_types || []\n\n\t// default handling\n\tswitch (usecase.target) {\n\t\tcase 'barchart':\n\t\tcase 'summary':\n\t\t\tif (term.type && term.type !== 'survival') uses.add('plot')\n\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'summaryInput':\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\tif (term.type && term.type !== 'survival') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'matrix':\n\t\t\tif (term.type) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'table':\n\t\t\tif (usecase.detail == 'term') uses.add('plot')\n\t\t\tif (child_types.length > 1) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'sampleScatter':\n\t\t\tif (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'runChart':\n\t\t\tif (usecase.detail == 'date') {\n\t\t\t\tif (term.type == 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (child_types.includes('date')) uses.add('branch')\n\t\t\t} else if (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term) && term.type != 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'frequencyChart':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (child_types.includes('date')) uses.add('branch')\n\t\t\t} else if (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term) && term.type != 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'numericDictTermCluster':\n\t\t\tif (!usecase.detail?.exclude?.includes(term.id)) {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) {\n\t\t\t\t\tuses.add('branch')\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'numericTermCollections':\n\t\t\tif (usecase.detail?.termIds?.includes(term.id)) uses.add('plot')\n\t\t\tif (usecase.detail?.branchIds?.includes(term.id)) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'profileForms':\n\t\t\tif (!term.isleaf) {\n\t\t\t\tconst ancestors = term.id.split('__').length //depends on using the __ naming convension!\n\t\t\t\tif (ancestors == 3) {\n\t\t\t\t\t// 3rd level term is a domain, we show the templates associated to this domain\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t} else if (ancestors < 3) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\t// case 'boxplot':\n\t\t// \tif (term.type == 'float' || term.type == 'integer') uses.add('plot')\n\t\t// \tif (usecase.detail === 'term2' && hasNumericChild(child_types)) uses.add('branch')\n\t\t// \treturn uses\n\n\t\tcase 'cuminc':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'condition') uses.add('plot')\n\t\t\t\tif (child_types.includes('condition')) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\tif (term.type && term.type != 'condition' && term.type != 'survival') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['condition', 'survival'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'survival':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'survival') uses.add('plot')\n\t\t\t\tif (child_types.includes('survival')) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\tif (term.type && term.type != 'survival') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'regression':\n\t\t\tif (usecase.detail == 'outcome') {\n\t\t\t\tif (usecase.regressionType == 'linear') {\n\t\t\t\t\tif (term.type == 'float' || term.type == 'integer') uses.add('plot')\n\t\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t\tif (usecase.regressionType == 'logistic') {\n\t\t\t\t\tif (term.type && term.type != 'survival') uses.add('plot')\n\t\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t} else if (usecase.regressionType == 'cox') {\n\t\t\t\t\tif (term.type == 'condition' || term.type == 'survival') uses.add('plot')\n\t\t\t\t\tif (child_types.includes('condition') || child_types.includes('survival')) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (usecase.detail == 'independent') {\n\t\t\t\tif (term.type == 'float' || term.type == 'integer' || term.type == 'categorical' || term.type == 'samplelst')\n\t\t\t\t\tuses.add('plot')\n\t\t\t\tif (hasChildTypes(child_types, ['categorical', 'float', 'integer'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'filter':\n\t\t\t// apply \"exlst\" to other targets as needed\n\t\t\tconst exlst = termdbConfig?.excludedTermtypeByTarget?.filter\n\t\t\tif (exlst) {\n\t\t\t\tif (graphableTypes.has(term.type) && !exlst.includes(term.type)) uses.add('plot')\n\t\t\t\tif (child_types.find(t => !exlst.includes(t))) uses.add('branch') // there's a non-excluded child type, allow branch to show\n\t\t\t\treturn uses\n\t\t\t}\n\t\t// no specific rule for filter. pass and use default rules\n\n\t\tcase 'correlationVolcano':\n\t\t\tif (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\tdefault:\n\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\t}\n}\n\n// determine if the term has at least one child type that\n// is not excluded\nfunction hasAllowedChildTypes(child_types, excluded_types) {\n\tif (!child_types.length) {\n\t\t// term does not have children\n\t\treturn false\n\t}\n\tif (!excluded_types?.length) {\n\t\t// no excluded types\n\t\treturn true\n\t}\n\tif (child_types.some(type => !excluded_types.includes(type))) {\n\t\t// at least one child type is not excluded\n\t\treturn true\n\t}\n}\n\nfunction hasNumericChild(child_types) {\n\treturn child_types.includes('float') || child_types.includes('integer')\n}\n\nfunction hasChildTypes(child_types, expected_types) {\n\tfor (const a of expected_types) {\n\t\tif (child_types.includes(a)) return true\n\t}\n}\n", "import { select } from 'd3-selection'\n\nconst jwtByDsRouteStr = localStorage.getItem('jwtByDsRoute') || `{}`\nconst jwtByDsRoute = JSON.parse(jwtByDsRouteStr)\n\n/*\n\tsetTokenByDsRoute() sets this storage item:\n\n\tjwtByDsRoute = {\n\t\t[dslabel]: { // the dataset that is being protected, should match one of the serverconfig.dsCredentials key\n\t\t\t[route]: // the route that is being protected, should match one of the serverconfig.dsCredentials[dslabel] key\n\t\t\t\t\"...jwt...string...\" // ProteinPaint-issued jwt from a `/jwt-status` or `/dslogin` response, \n\t\t\t\t // which also includes dslabel and route to use as nested keys for this jwtByDsRoute\n\t\t}\n\t}\n\t\n\tNote that jwtByDsRoute does not have a nesting level of embedder, unlike serverconfig.dsCredentials, since\n\tthe embedder is detected directly from the winddow.location.hostname.\n\n\tThe stored token will be submitted as part of Vocab.mayGetAuthHeaders() or getSavedToken().\n*/\nexport function setTokenByDsRoute(dslabel, route, jwt) {\n\tif (!jwtByDsRoute[dslabel]) jwtByDsRoute[dslabel] = {}\n\tif (jwt) jwtByDsRoute[dslabel][route] = jwt\n\telse delete jwtByDsRoute[dslabel][route]\n\tlocalStorage.setItem('jwtByDsRoute', JSON.stringify(jwtByDsRoute))\n}\n\n// get jwt string directly from localStorage/jwtByDsRoute tracking object\nexport function getSavedToken(dslabel, route) {\n\treturn jwtByDsRoute[dslabel]?.[route] || jwtByDsRoute[dslabel]?.['/**']\n}\n\nexport function mayAddJwtToRequest(init, body, url) {\n\tif (init.headers.authorization) return\n\tlet dslabel = body?.dslabel // || body.mass?.vocab.dslabel || body.tracks?.find(t => t.dslabel)?.dslabel\n\tif (!dslabel) {\n\t\tconst param = url\n\t\t\t.split('?')[1]\n\t\t\t?.split('&')\n\t\t\t.find(kv => kv.includes('dslabel'))\n\t\tif (!param) return\n\t\tlet value = decodeURIComponent(param.split('=')[1])\n\t\tif (value.startsWith('{') && value.endsWith('}')) {\n\t\t\tvalue = JSON.parse(value)\n\t\t\tdslabel = value.dslabel || value.mass?.vocab.dslabel || value.tracks?.find(t => t.dslabel)?.dslabel\n\t\t} else {\n\t\t\tdslabel = value\n\t\t}\n\t}\n\tif (!dslabel || !jwtByDsRoute[dslabel]) return\n\tconst h = url.split('//')\n\tconst postProtocolStr = h[1] || h[0] // handle a url such as '://something.abc'\n\tconst preQuestionMarkStr = postProtocolStr.split('?')[0]\n\tconst pathSegments = preQuestionMarkStr.split('/')\n\tlet route = pathSegments.find(p => p != '' && !p.includes(':') && !p.includes('.'))\n\t// TODO: should not have to do this hardcoded mapping, ideally routes that are\n\t// protected together will share the same initial path segment\n\n\tconst jwt = jwtByDsRoute[dslabel][route] || jwtByDsRoute[dslabel]['/**']\n\tif (jwt) init.headers.authorization = 'Bearer ' + btoa(jwt)\n}\n\nconst dsAuthOk = new Set()\nlet dsAuth, authUi, authUiHolder\n\nexport let includeEmbedder = false\n\n/*\n\topts{}\n\t.dsAuth: required, array of dataset names that require login\n\t.authUi: optional, a custom login UI function to launch as needed\n\t.holder: optional, a d3-wrapped selection to hold the auth UI\n*/\nexport async function setDsAuthOk(opts, dofetch3) {\n\tdsAuth = opts.dsAuth\n\tauthUi = opts.ui || defaultAuthUi\n\tauthUiHolder = opts.holder || select('body')\n\tfor (const auth of dsAuth) {\n\t\t// fillin all the dslabels that has an active session\n\t\t// so that an unnecessary login form will not be shown\n\t\tif (auth.insession) dsAuthOk.add(auth)\n\t\telse {\n\t\t\t// check if there is a PP-server generated session token that has been saved from a previous login\n\t\t\tconst { dslabel, route } = auth\n\t\t\tconst jwt = getSavedToken(dslabel, route)\n\t\t\tif (jwt) {\n\t\t\t\tconst payload = JSON.parse(atob(jwt.split('.')[1]))\n\t\t\t\tif (payload.exp && Math.ceil(Date.now() / 1000) > payload.exp) continue\n\t\t\t\tconst data = await dofetch3('/jwt-status', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t//authorization: `Bearer ${btoa(jwt)}`\n\t\t\t\t\t\t[auth.headerKey]: jwt\n\t\t\t\t\t},\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tdslabel,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\tembedder: location.hostname\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (data.ok || data.status == 'ok') {\n\t\t\t\t\tdsAuthOk.add(auth)\n\t\t\t\t\tauth.insession = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tincludeEmbedder = opts.dsAuth?.length > 0 || false\n}\n\nexport function getRequiredAuth(dslabel, route) {\n\tif (!dsAuth || !Array.isArray(dsAuth)) return\n\tfor (const a of dsAuth) {\n\t\t// wildcard route '*' is transformed by server auth.js into '/**' to support glob-pattern matching,\n\t\t// since a single character '*' is interpreted by glob as a file, so need to also detect '/**' route\n\t\tif (a.dslabel == dslabel && (a.route == route || a.route == '*' || a.route == '/**')) return a\n\t}\n}\n\n// check if a user is logged in, usually checked together with requiredAuth in termdb/config,\n// so access to unprotected ds/routes should not be affected by this check\nexport function isInSession(dslabel, route) {\n\tif (!dslabel) return false\n\tfor (const a of dsAuthOk) {\n\t\tif (a.dslabel == dslabel && (a.route == route || a.route == '/**')) return true\n\t}\n\t// no matching sessions found for this dslabel and route\n\treturn false\n}\n\n/* \n\tmayShowAuthUi() is the client-side \"gatekeeper\"\n\tmethod to check if a dataset requires credentials\n*/\n\nexport async function mayShowAuthUi(init, path, opts = {}) {\n\tconst ok = { status: 'ok' }\n\tif (!dsAuth || path.endsWith('jwt-status')) return ok\n\n\tconst body = JSON.parse(init.body || `{}`)\n\tconst params = (path.split('?')[1] || '').split('&').reduce((obj, kv) => {\n\t\tconst [key, value] = kv.split('=')\n\t\tobj[key] = value\n\t\treturn obj\n\t}, {})\n\tconst q = Object.assign({}, body, params)\n\tconst route = ((path.split('?')[0] || '').split('//')[1] || '').split('/').slice(1).join('/')\n\n\tfor (const a of dsAuth) {\n\t\tif (q.dslabel == a.dslabel && (a.route == '/**' || route == a.route)) {\n\t\t\tif (dsAuthOk.has(a)) return ok\n\t\t\t// dofetch should show the authUi only when all routes ('/**') are protected\n\t\t\t// otherwise, the authUi should be opened only when requesting data from a protected route,\n\t\t\t// that will be determined within feature code such as for 'termdb', 'burden', etc\n\t\t\telse if (a.route != '/**') return ok\n\t\t\telse if (a.type == 'basic') return await authUi(a.dslabel, a, opts)\n\t\t\telse if (a.type == 'jwt') {\n\t\t\t\t// assume the embedder/portal provides the login UI\n\t\t\t\t// so no need to do anything here\n\t\t\t} else if (a.type == 'forbidden') {\n\t\t\t\talert('Forbidden access')\n\t\t\t\t// don't do anything\n\t\t\t} else throw `unsupported dsAuth type='${a.type}'`\n\t\t}\n\t}\n\treturn ok\n}\n\n/*\n\tthis is the default login UI, may be overriden\n\tby an optional different form, for example if PP \n\tis embedded in another portal\n*/\nasync function defaultAuthUi(dslabel, auth, opts = {}) {\n\tconst mask = authUiHolder\n\t\t.append('div')\n\t\t.style('position', 'fixed')\n\t\t.style('top', 0)\n\t\t.style('left', 0)\n\t\t.style('height', '100%')\n\t\t.style('width', '100%')\n\t\t.style('margin', 0)\n\t\t.style('padding', '20px')\n\t\t.style('background-color', 'rgb(150,150,150)')\n\n\tconst form = mask.append('div').style('opacity', 1)\n\tform.append('div').html(`Restricted dataset '${dslabel}'`)\n\tform.append('span').html('Please enter password ')\n\n\tconst pwd = form.append('input').attr('type', 'password')\n\tpwd.node().focus()\n\n\tconst btn = form.append('button').html('Submit')\n\n\treturn new Promise((resolve, reject) => {\n\t\tfunction login() {\n\t\t\tfetch('/dslogin', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Basic ${btoa(pwd.property('value'))}`\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ dslabel, route: auth.route, embedder: window.location.hostname })\n\t\t\t})\n\t\t\t\t.then(res => res.json())\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (res.error) throw res.error\n\n\t\t\t\t\tmask.remove()\n\t\t\t\t\tdsAuthOk.add(auth)\n\t\t\t\t\tif (res.jwt) {\n\t\t\t\t\t\tsetTokenByDsRoute(dslabel, res.route, res.jwt)\n\t\t\t\t\t}\n\t\t\t\t\tif (!opts.setDomRefs) window.location.reload()\n\t\t\t\t\telse resolve(dslabel)\n\t\t\t\t})\n\t\t\t\t.catch(e => {\n\t\t\t\t\talert('login error: ' + e)\n\t\t\t\t\t// allow to reuse the login UI, do not hide or reject\n\t\t\t\t\t// mask.remove()\n\t\t\t\t\t// reject(e)\n\t\t\t\t})\n\t\t}\n\t\tbtn.on('click', login)\n\t\tpwd.on('change', login)\n\n\t\tif (opts.setDomRefs)\n\t\t\topts.setDomRefs({\n\t\t\t\tpwd,\n\t\t\t\tbtn,\n\t\t\t\tmask,\n\t\t\t\tauthUiHolder\n\t\t\t})\n\t})\n}\n", "import { deepFreeze, sleep } from '#rx'\nimport { encode, getDataName, processResponse } from '#shared/index.js'\nimport { mayShowAuthUi, mayAddJwtToRequest, includeEmbedder, setDsAuthOk } from './auth.js'\nexport * from './auth.js'\nexport { processFormData } from '#shared/index.js'\n\n/*\n\tpath: URL\n\targ: HTTP request body\n\topts: see dofetch2() opts argument\n*/\nexport function dofetch(path, arg, opts = null) {\n\tif (opts && typeof opts == 'object') {\n\t\tif (opts.serverData && typeof opts.serverData == 'object') {\n\t\t\tif (!dofetch.serverData) {\n\t\t\t\tdofetch.serverData = opts.serverData\n\t\t\t} else if (!opts.serverData) {\n\t\t\t\topts.serverData = dofetch.serverData\n\t\t\t}\n\t\t}\n\t\treturn dofetch2(\n\t\t\tpath,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(arg)\n\t\t\t},\n\t\t\topts\n\t\t)\n\t} else {\n\t\t// path should be \"path\" but not \"/path\"\n\t\tif (path[0] == '/') {\n\t\t\tpath = path.slice(1)\n\t\t}\n\n\t\tconst jwt = sessionStorage.getItem('jwt')\n\t\tif (jwt) {\n\t\t\targ.jwt = jwt\n\t\t}\n\n\t\tlet url = path\n\t\tconst host = sessionStorage.getItem('hostURL') || window.testHost || ''\n\t\tif (host) {\n\t\t\t// hostURL can end with / or not, must use 'host/path'\n\t\t\tif (host.endsWith('/')) {\n\t\t\t\turl = host + path\n\t\t\t} else {\n\t\t\t\turl = host + '/' + path\n\t\t\t}\n\t\t}\n\n\t\treturn fetch(\n\t\t\tnew Request(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(arg)\n\t\t\t})\n\t\t).then(r => r.json())\n\t}\n}\n\nexport function dofetch2(path, init = {}, opts = {}) {\n\t/*\n\tpath\"\" string URL path\n\n\tinit{}\n\t\twill be supplied as the second argument to\n\t\tthe native fetch api, so the method, headers, body\n\t\tmay be optionally supplied in the \"init\" argument\n\t\tsee https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n\n\topts{}: all other optional arguments that are not related to the native fetch init argument\n\t\t.serverData{} an object for caching fetch Promise \n\t*/\n\t// path should be \"path\" but not \"/path\"\n\tif (path[0] == '/') {\n\t\tpath = path.slice(1)\n\t}\n\n\tlet url = path\n\tconst host = sessionStorage.getItem('hostURL') || window.testHost || ''\n\tif (host) {\n\t\t// hostURL can end with / or not, must use 'host/path'\n\t\tif (host.endsWith('/')) {\n\t\t\turl = host + path\n\t\t} else {\n\t\t\turl = host + '/' + path\n\t\t}\n\t}\n\n\t// create a reference to be able to detect body params, easier than\n\t// getting params once converted to a URL\n\tconst body = init.body || {}\n\t// this may convert a GET into a POST method, and\n\t// encode the payload either in the URL or request body\n\turl = mayAdjustRequest(url, init)\n\n\tif (!init.headers) {\n\t\tinit.headers = {}\n\t}\n\n\tif (!init.headers['content-type'] && init.body) {\n\t\tinit.headers['content-type'] = 'application/json'\n\t}\n\n\t// this jwt is site-wide for a particular PP host, not dslabel-specific\n\tconst jwt = sessionStorage.getItem('jwt')\n\tif (jwt) {\n\t\tinit.headers.authorization = 'Bearer ' + jwt\n\t}\n\n\t/*\n\t\tthis is client-side \"gatekeeper\", will not proceed\n\t\tto the usual request handling unless no credentials\n\t\tare required or a valid session has already been established\n\t*/\n\treturn mayShowAuthUi(init, url).then(async () => {\n\t\tif (!jwt) mayAddJwtToRequest(init, body, url)\n\t\tif (opts.serverData) {\n\t\t\treturn namedFetch(url, init, opts)\n\t\t} else {\n\t\t\treturn fetch(url, init).then(processResponse)\n\t\t}\n\t})\n}\n\n// key: opts.serverData object\n// value: array of cached dataNames\nconst optsServerDataNames = new WeakMap() // do not prevent garbage collection of unneeded opts.serverData in consumer code\n/*\n\tnamedFetch()\n\t- same arguments and behavior as ezFetch() above, except opts.serverData is expected to cache response by computed data name\n\t- preserves the caching expectations from \n\t\n\topts{}\n\tserverData: optional plain object to store response by dataName (string) keys\n\t\t- if a computed dataName is found as a key in this object, the cached response will be reused to fulfill the fetch\n\t\t- note that the plain object as storage is to support legacy dofetch code\n*/\nexport async function namedFetch(url, init, opts = {}) {\n\tif (!opts.serverData) throw `use ezFetch() if a fetched response is not meant to be cached`\n\tif (typeof opts.serverData != 'object') throw `opts.serverData is not an object`\n\n\tlet result\n\tconst dataName = await getDataName(url, init)\n\tif (opts.serverData[dataName]) {\n\t\t// if (init.signal?.aborted) throw `stale sequenceId`\n\t\tif (init.signal) {\n\t\t\t// should not reuse a response if the abortController.signal option has been aborted,\n\t\t\t// sleep() below allows sufficient time for the abort() to be called in rx AppApi.dispatch() or elsewhere,\n\t\t\t// otherwise the cached response copy will be returned too soon and cause race-condition issues;\n\t\t\t// this fix is tested in hierCluster.integration.spec.js 'avoid race condition - reused fetch response cache'\n\t\t\tawait sleep(0)\n\t\t\tif (init.signal.aborted) throw `stale sequenceId`\n\t\t}\n\n\t\tresult = opts.serverData[dataName].clone\n\t\t\t? await processResponse(opts.serverData[dataName].clone())\n\t\t\t: structuredClone(opts.serverData[dataName])\n\t}\n\n\tif (!result || (typeof result != 'object' && !(result instanceof Promise))) {\n\t\tdelete opts.serverData[dataName]\n\t\tresult = undefined\n\t}\n\n\tif (!result) {\n\t\ttry {\n\t\t\tconst res = await fetch(url, init)\n\t\t\tresult = await processResponse(res.clone())\n\t\t\t// in case this fetch was cancelled with AbortController.signal,\n\t\t\t// then the result may be another Promise instead of a data object,\n\t\t\t// as observed when rapidly changing the gdc cohort filter\n\t\t\tif (typeof result == 'object' && !(result instanceof Promise)) {\n\t\t\t\t// TODO: make decoded caching as default, since storing as a\n\t\t\t\t// fetch Response interface can be problematic when the fetch is aborted\n\t\t\t\tif (opts.cacheAs == 'decoded') {\n\t\t\t\t\t// should prefer to store results as a deeply frozen object instead of a Response interface,\n\t\t\t\t\t// but must not return the same object to be reused by different requests\n\t\t\t\t\tdeepFreeze(result)\n\t\t\t\t\topts.serverData[dataName] = result\n\t\t\t\t\tresult = structuredClone(result)\n\t\t\t\t} else {\n\t\t\t\t\t// per https://developer.mozilla.org/en-US/docs/Web/API/Response/clone,\n\t\t\t\t\t// **should not use (.clone) to read very large bodies in parallel** at different speeds,\n\t\t\t\t\t// may also mean(?) to not persist/store the Response for a long time as is being done here\n\t\t\t\t\topts.serverData[dataName] = res\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tdelete opts.serverData[dataName]\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t// manage opts.serverData cache size\n\tif (!optsServerDataNames.has(opts.serverData)) optsServerDataNames.set(opts.serverData, [])\n\tconst keys = optsServerDataNames.get(opts.serverData)\n\tconst i = keys.indexOf(dataName)\n\tif (i > 0) {\n\t\t// move this cached response as the most recent entry, by object key\n\t\tkeys.splice(i, 1)\n\t}\n\tkeys.unshift(dataName)\n\tconst maxKeys = 360\n\twhile (keys.length > maxKeys) {\n\t\tconst oldestDataKey = keys.pop() // delete the dataName from the tracking array\n\t\tdelete opts.serverData[oldestDataKey]\n\t}\n\treturn result\n}\n\nconst defaultServerDataCache = {}\nexport function dofetch3(path, init = {}, opts = {}) {\n\t/*\n\t\tThis is a convenience function that sets a default serverData object\n\t*/\n\topts.serverData = defaultServerDataCache\n\treturn dofetch2(path, init, opts)\n}\n\nexport function clearServerDataCache(opts = {}) {\n\tconst cache = opts?.serverData || defaultServerDataCache\n\tif (!cache) return\n\tfor (const k of Object.keys(cache)) {\n\t\tdelete cache[k]\n\t}\n}\n\nconst urlMaxLength = 2000 // if a GET url is longer than this, will be converted to POST of the same route\n\n/*\t\n\turl: full request url with host/path\n\n\tinit {}\n\t\tsame as the init argument for dofetch2\n\t\twill be supplied as the second argument to\n\t\tthe native fetch api, so the method, headers, body\n\t\tmay be optionally supplied in the \"init\" argument\n\t\tsee https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n*/\nfunction mayAdjustRequest(url, init) {\n\tconst hostname = window.location.hostname\n\tconst method = (init.method && init.method.toUpperCase()) || 'GET'\n\tif (method == 'POST') {\n\t\t// assume a minimal URL path + parameters for a POST request\n\t\t// since the payload will be in the request body\n\t\tif (typeof init.body == 'string') init.body = JSON.parse(init.body)\n\t\tif (!init.body.embedder && includeEmbedder) init.body.embedder = hostname\n\t\tinit.body = JSON.stringify(init.body)\n\t\treturn url\n\t}\n\n\tif (method != 'GET' && method != 'DELETE' && method != 'PUT') {\n\t\tthrow `unsupported init.method='${method}': must be undefined or GET or POST or DELETE or PUT`\n\t}\n\n\tif (init.body) {\n\t\t// init.body should be an object, to be converted to either\n\t\t// (a) GET URL search parameter strings, OR\n\t\t// (b) POST body, JSON-encoded\n\t\tif (!init.body.embedder && includeEmbedder) init.body.embedder = hostname\n\n\t\tconst params = encode(init.body)\n\t\tif (!url.includes('?')) url += '?'\n\t\turl += params\n\t}\n\n\tif (!url.includes('embedder=') && includeEmbedder) {\n\t\tconst sep = url.includes('?') ? '&' : '?'\n\t\turl += `${sep}embedder=${hostname}`\n\t}\n\n\tif (url.length < urlMaxLength) {\n\t\t// the request body has been encoded as URL parameters, so can delete it\n\t\tif (init.body) delete init.body\n\t\treturn url\n\t}\n\n\t// convert to a POST request because the URL is too long\n\t// !!! NOTE: the requested server route must support both GET and POST, for example, app.all('/route', handler)\n\tinit.method = 'POST'\n\tconst [hostpath, query] = url.split('?') // must use url but not path\n\n\tif (init.body) {\n\t\t// assumes that all or most of the url string length were from parameters in the init.body argument to dofetch2\n\t\tinit.body = JSON.stringify(init.body)\n\t} else {\n\t\t// the url parameters were provided directly in the path argument to dofetch2()\n\t\tconst params = {}\n\t\t// decode URL search parameters, if available\n\t\tif (query)\n\t\t\t// TODO: !!! use urljson.decode here !!!\n\t\t\tquery.split('&').forEach(p => {\n\t\t\t\tconst [k, v] = p.split('=')\n\t\t\t\tconst decodedVal = decodeURIComponent(v)\n\t\t\t\ttry {\n\t\t\t\t\tparams[k] = JSON.parse(decodedVal)\n\t\t\t\t} catch {\n\t\t\t\t\tparams[k] = decodedVal\n\t\t\t\t}\n\t\t\t})\n\t\tif (!params.embedder && includeEmbedder) params.embedder = hostname\n\t\tinit.body = JSON.stringify(params)\n\t}\n\n\treturn hostpath\n}\n\n// see opts argument to setDsAuthOk\nexport function setAuth(opts) {\n\tsetDsAuthOk(opts, dofetch3)\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["////////////////////////////////////\n//\n// shared between client and server\n//\n////////////////////////////////////\n\nimport * as common from './common.js'\n\nexport default {}\n\nexport function init_bulk_flag(genome) {\n\tif (!genome) {\n\t\treturn null\n\t}\n\tconst mclasslabel2key = {}\n\tfor (const n in common.mclass) {\n\t\tmclasslabel2key[common.mclass[n].label.toUpperCase()] = n\n\t}\n\treturn {\n\t\tgenome: genome,\n\t\tmclasslabel2key: mclasslabel2key,\n\t\tdata: {},\n\t\tsample2disease: {}, // (proof) k: sample, v: disease\n\t\t// will only record this when origin is used\n\t\tpatient2st: {},\n\t\t// k: patient, v: { k: sampletype, v: sample }\n\t\t// new sample names always override old\n\t\tgood: 0,\n\t\tgeneToUpper: true, // option to not force uppercase on gene names\n\t\tsnv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\t// jinghui: based on missense/silent ratio of entire dataset to decide whether to include silent when importing...\n\t\t\t// hard-coded class codes\n\t\t\tmissense: 0,\n\t\t\tsilent: 0\n\t\t},\n\t\tsvjson: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\tfusion: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\toriginal: []\n\t\t},\n\t\tsv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\toriginal: []\n\t\t},\n\t\tcnv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\titd: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\tdel: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\ttruncation: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t}\n\t}\n}\n\nexport function parsesample(m, flag, i, lst, badline) {\n\tlet variantorigin = common.moriginsomatic\n\tif (m.sampletype) {\n\t\tconst s = m.sampletype.toLowerCase()\n\t\tswitch (s) {\n\t\t\tcase 'relapse':\n\t\t\t\tvariantorigin = common.moriginrelapse\n\t\t\t\tbreak\n\t\t\tcase 'germline':\n\t\t\t\tvariantorigin = common.morigingermline\n\t\t\t\tbreak\n\t\t\tcase 'somatic':\n\t\t\tcase 'diagnosis':\n\t\t\t\tbreak\n\t\t}\n\t\tif (m.sample) {\n\t\t\tif (m.patient) {\n\t\t\t\t// good\n\t\t\t} else {\n\t\t\t\tm.patient = m.sample + ' ' + m.sampletype\n\t\t\t}\n\t\t} else {\n\t\t\tif (m.patient) {\n\t\t\t\tm.sample = m.patient + ' ' + m.sampletype\n\t\t\t} else {\n\t\t\t\t// neither sample or patient, will quit later\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (m.patient) {\n\t\t\tif (m.sample) {\n\t\t\t\tm.sampletype = m.sample\n\t\t\t} else {\n\t\t\t\tm.sample = m.sampletype = m.patient\n\t\t\t}\n\t\t} else {\n\t\t\tif (m.sample) {\n\t\t\t\tm.sampletype = m.sample\n\t\t\t} else {\n\t\t\t\t// no patient/sample, will quit later\n\t\t\t}\n\t\t}\n\t}\n\tif (m.origin) {\n\t\t// override existing variantorigin\n\t\tconst s = m.origin.toLowerCase()\n\t\tswitch (s) {\n\t\t\tcase 'r':\n\t\t\tcase 'relapse':\n\t\t\t\tvariantorigin = common.moriginrelapse\n\t\t\t\tm.isrim2 = true\n\t\t\t\tbreak\n\t\t\tcase 'g':\n\t\t\tcase 'germline':\n\t\t\t\tvariantorigin = common.morigingermline\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 'gp':\n\t\t\tcase 'germline pathogenic':\n\t\t\t\tvariantorigin = common.morigingermlinepathogenic\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 'gnp':\n\t\t\tcase 'germline nonpathogenic':\n\t\t\tcase 'germline non-pathogenic':\n\t\t\t\tvariantorigin = common.morigingermlinenonpathogenic\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 's':\n\t\t\tcase 'somatic':\n\t\t\tcase 'diagnosis':\n\t\t\t\tvariantorigin = common.moriginsomatic\n\t\t\t\tbreak\n\t\t}\n\t}\n\tm.origin = variantorigin\n\n\tif (!m.sample && !m.patient) {\n\t\t// will not go into sample table\n\t\treturn\n\t}\n\n\tconst nopatientname = 'no patient/individual name'\n\tlet p\n\tif (m.patient) {\n\t\tif (!flag.patient2st[m.patient]) {\n\t\t\tflag.patient2st[m.patient] = {}\n\t\t}\n\t\tflag.patient2st[m.patient][m.sampletype] = m.sample\n\t} else {\n\t\tif (!flag.patient2st[nopatientname]) {\n\t\t\tflag.patient2st[nopatientname] = {}\n\t\t}\n\t\tflag.patient2st[nopatientname][m.sampletype] = m.sample\n\t}\n\n\tif (m.sample) {\n\t\tif (m.disease) {\n\t\t\tif (m.sample in flag.sample2disease) {\n\t\t\t\tif (m.disease != flag.sample2disease[m.sample]) {\n\t\t\t\t\tflag.snv.badlines.push([\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t'conflict of disease types for sample \"' +\n\t\t\t\t\t\t\tm.sample +\n\t\t\t\t\t\t\t'\": ' +\n\t\t\t\t\t\t\tm.disease +\n\t\t\t\t\t\t\t', ' +\n\t\t\t\t\t\t\tflag.sample2disease[m.sample],\n\t\t\t\t\t\tlst\n\t\t\t\t\t])\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tflag.sample2disease[m.sample] = m.disease\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n", "export const clusterMethodLst = [\n\t{\n\t\tlabel: 'Average',\n\t\tvalue: 'average',\n\t\ttitle: `Cluster by average value`\n\t},\n\t{\n\t\tlabel: `Complete`,\n\t\tvalue: 'complete',\n\t\ttitle: `Use the complete clustering method`\n\t},\n\t{\n\t\tlabel: `Single`,\n\t\tvalue: 'single',\n\t\ttitle: `Use the single clustering method`\n\t},\n\t{\n\t\tlabel: `Ward.D`,\n\t\tvalue: 'ward.D',\n\t\ttitle: `Use the ward.D clustering method`\n\t},\n\t{\n\t\tlabel: `Ward.D2`,\n\t\tvalue: 'ward.D2',\n\t\ttitle: `Use the ward.D2 clustering method`\n\t},\n\t{\n\t\tlabel: `Mcquitty`,\n\t\tvalue: 'mcquitty',\n\t\ttitle: `Use the Mcquity clustering method`\n\t}\n\t/* These methods are currently disabled because the dendrogram lines tend to cross one another.\n\t{\n\t\tlabel: `Centroid`,\n\t\tvalue: 'centroid',\n\t\ttitle: `Use the centroid clustering method`\n\t},\n \t{\n\t\tlabel: `Median`,\n\t\tvalue: 'median',\n\t\ttitle: `Use the median clustering method`\n\t}\n */\n]\nexport const distanceMethodLst = [\n\t{\n\t\tlabel: 'Euclidean',\n\t\tvalue: 'euclidean',\n\t\ttitle: `Calculate distance using euclidean method`\n\t},\n\t{\n\t\tlabel: 'Maximum',\n\t\tvalue: 'maximum',\n\t\ttitle: `Maximum distance between two components of x and y`\n\t},\n\t{\n\t\tlabel: 'Manhattan',\n\t\tvalue: 'manhattan',\n\t\ttitle: `Calculate distance using the absolute distance between the two vectors`\n\t},\n\t{\n\t\tlabel: 'Canberra',\n\t\tvalue: 'canberra',\n\t\ttitle: `Calculate distance using Canberra method`\n\t}\n]\n", "export function fileSize(v) {\n\tif (v > 1e9) return (v / 1e9).toFixed(2) + ' GB'\n\tif (v > 1e6) return (v / 1e6).toFixed(2) + ' MB'\n\tif (v > 1e3) return (v / 1e3).toFixed(2) + ' KB'\n\treturn v + ' Bytes'\n}\n", "import { dtcnv, dtsnvindel, dtsv, dtfusionrna } from './common.js'\n\n// this script should contain mds3 track-related stuff shared between client and backend\n\n/*\nthe separator is used to join essential bits of a variant obj into a string as the \"ssm_id\", aims to uniquely identify a variant irrespective of sample\nthis is to mimic the GDC \"ssm_id\" which is a random id, with below benefits:\n- consistent way to pass request body for both gdc and non-gdc\n- uniform identification of ssm/cnv/sv in non-gdc backend code\n- uniform identification of all variants in client\n\nssm: chr + pos + ref + alt\ncnv: chr + start + stop + class\nsvfusion: dt + chr + pos + strand + pairlstidx + mname\n\nthe separator must avoid conflicting with characters from gene names, and can be changed based on needs\n*/\nexport const ssmIdFieldsSeparator = '__'\n\n/*\ninput: array of mixture of ssm, svfusion and cnv\n\noutput: sorted array. each element: [ class/dt, count of m ]\n*/\nexport function summarize_mclass(mlst) {\n\tconst m2c = new Map() // k: mclass, v: {}\n\tconst cnvs = []\n\tfor (const m of mlst) {\n\t\tif (m.dt == dtcnv) {\n\t\t\tcnvs.push(m)\n\t\t\tcontinue // process cnv later\n\t\t}\n\t\t// snvindel has m.class=str, svfusion has only dt=int\n\t\tconst key = m.class || m.dt\n\t\tm2c.set(key, 1 + (m2c.get(key) || 0))\n\t}\n\n\tif (cnvs.length) {\n\t\tif (Number.isFinite(cnvs[0].value)) {\n\t\t\t// first cnv uses numeric value (assumes all the same). record by dt\n\t\t\tm2c.set(dtcnv, cnvs.length)\n\t\t} else {\n\t\t\t// cnv not numeric and uses class; record by each class\n\t\t\tfor (const c of cnvs) {\n\t\t\t\tif (!c.class) continue // should not happen\n\t\t\t\tm2c.set(c.class, 1 + (m2c.get(c.class) || 0))\n\t\t\t}\n\t\t}\n\t}\n\treturn [...m2c].sort((i, j) => j[1] - i[1])\n}\n\n/*\nssmid is not specific for ssm, it covers all alterations\ngdc ssm are identified by a specific uuid, thus the design\n*/\nexport function guessSsmid(ssmid) {\n\tconst l = ssmid.split(ssmIdFieldsSeparator)\n\tif (l.length == 4) {\n\t\tconst [chr, tmp, ref, alt] = l\n\t\tconst pos = Number(tmp)\n\t\tif (Number.isNaN(pos)) throw 'ssmid snvindel pos not integer'\n\t\treturn { dt: dtsnvindel, l: [chr, pos, ref, alt] }\n\t}\n\tif (l.length == 5) {\n\t\t// cnv. if type=cat, _value is blank string\n\t\tconst [chr, _start, _stop, _class, _value] = l\n\t\tconst start = Number(_start),\n\t\t\tstop = Number(_stop),\n\t\t\tvalue = _value == '' ? null : Number(_value)\n\t\tif (Number.isNaN(start) || Number.isNaN(stop)) throw 'ssmid cnv start/stop not integer'\n\t\treturn { dt: dtcnv, l: [chr, start, stop, _class, value] }\n\t}\n\tif (l.length == 6) {\n\t\tif (l[3] == '+' || l[3] == '-') {\n\t\t\t// sv/fusion\n\t\t\tconst [_dt, chr, _pos, strand, _pi, _mname] = l\n\n\t\t\t// mname is encoded in case it contains comma (and is same as ssmIdFieldsSeparator)\n\t\t\tconst mname = decodeURIComponent(_mname)\n\t\t\tconst dt = Number(_dt)\n\t\t\tif (dt != dtsv && dt != dtfusionrna) throw 'ssmid dt not sv/fusion'\n\t\t\tconst pos = Number(_pos)\n\t\t\tif (Number.isNaN(pos)) throw 'ssmid svfusion position not integer'\n\t\t\tconst pairlstIdx = Number(_pi)\n\t\t\tif (Number.isNaN(pairlstIdx)) throw 'ssmid pairlstIdx not integer'\n\t\t\treturn { dt, l: [dt, chr, pos, strand, pairlstIdx, mname] }\n\t\t}\n\t\t// cnv with sample\n\t\tconst [chr, _start, _stop, _class, _value, sample] = l\n\t\tconst start = Number(_start),\n\t\t\tstop = Number(_stop),\n\t\t\tvalue = _value == '' ? null : Number(_value) // if cnv not using value, must avoid `Number('')=0`\n\t\tif (Number.isNaN(start) || Number.isNaN(stop)) throw 'ssmid cnv start/stop not integer'\n\t\treturn { dt: dtcnv, l: [chr, start, stop, _class, value, sample] }\n\t}\n\tthrow 'unknown ssmid'\n}\n", "import { format } from 'd3-format'\nimport { getColors } from './common.js'\nimport { isStrictNumeric, convertUnits } from './helpers.js'\n\nexport default function validate_bins(binconfig) {\n\t// Number.isFinite('1') returns false, which is desired\n\n\tconst bc = binconfig\n\tif (!bc || typeof bc !== 'object') throw 'bin schema must be an object'\n\t// assign default type\n\tif (!('type' in bc)) bc.type = 'regular-bin'\n\n\tif (bc.type == 'custom-bin') {\n\t\tif (!Array.isArray(bc.lst)) throw 'binconfig.lst must be an array'\n\t\tif (!bc.lst.length) throw 'binconfig.lst must have entries'\n\t\tconst first_bin = bc.lst[0]\n\t\tconst last_bin = bc.lst[bc.lst.length - 1]\n\n\t\tfor (const bin of bc.lst) {\n\t\t\tif (!('startinclusive' in bin) && !('stopinclusive' in bin)) {\n\t\t\t\tthrow 'custom bin.startinclusive and/or bin.stopinclusive must be defined'\n\t\t\t}\n\n\t\t\tif (bin == first_bin) {\n\t\t\t\tif ('startunbounded' in bin && !bin.startunbounded) {\n\t\t\t\t\tthrow `a custom first bin must not set bin.startunbounded to false`\n\t\t\t\t}\n\t\t\t\tbin.startunbounded = true\n\t\t\t\tif ('start' in bin) {\n\t\t\t\t\tthrow 'a custom first bin must not set a bin.start value'\n\t\t\t\t}\n\t\t\t\tif ('start_percentile' in bin) {\n\t\t\t\t\tthrow 'the first bin must not set a bin.start_percentile value'\n\t\t\t\t}\n\t\t\t\tif (!('stop' in bin)) {\n\t\t\t\t\tthrow `a custom first bin must define a bin.stop value`\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.stop)) {\n\t\t\t\t\tthrow `a custom first bin.stop value should be numeric`\n\t\t\t\t}\n\t\t\t} else if (bin == last_bin) {\n\t\t\t\tif (!('start' in bin)) {\n\t\t\t\t\tthrow `a custom last bin must define a bin.start value`\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.start)) {\n\t\t\t\t\tthrow `a custom last bin.start must be numeric`\n\t\t\t\t}\n\t\t\t\tif ('stopunbounded' in bin && !bin.stopunbounded) {\n\t\t\t\t\tthrow 'a custom last bin must not set bin.stopunbounded to false'\n\t\t\t\t}\n\t\t\t\tbin.stopunbounded = true\n\t\t\t\tif ('stop' in bin) {\n\t\t\t\t\tthrow 'a custom last bin must not set a bin.stop value'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (bin.startunbounded || bin.stopunbounded) {\n\t\t\t\t\tthrow 'bin.startunbounded and bin.stopunbounded must not be set for non-first/non-last bins'\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.start)) throw 'bin.start must be numeric for a non-first bin'\n\t\t\t\tif (!isStrictNumeric(bin.stop)) throw 'bin.stop must be numeric for a non-last bin'\n\t\t\t}\n\t\t}\n\t} else if (bc.type == 'regular-bin') {\n\t\t// required custom_bin parameter\n\t\tif (!Number.isFinite(bc.bin_size)) throw 'non-numeric bin_size'\n\t\tif (bc.bin_size <= 0) throw 'bin_size must be greater than 0'\n\n\t\tif (!bc.startinclusive && !bc.stopinclusive) {\n\t\t\tbc.startinclusive = 1\n\t\t\tbc.stopinclusive = 0\n\t\t}\n\n\t\tif (!bc.first_bin) throw 'first_bin{} missing'\n\t\tif (typeof bc.first_bin != 'object') throw 'first_bin{} is not an object'\n\t\tif (!Object.keys(bc.first_bin).length) throw 'first_bin is an empty object'\n\n\t\t{\n\t\t\tconst b = bc.first_bin\n\t\t\tb.startunbounded = true\n\t\t\t// requires stop_percentile, or stop\n\t\t\tif (b.stop_percentile) {\n\t\t\t\tif (!Number.isInteger(b.stop_percentile)) throw 'first_bin.stop_percentile should be integer'\n\t\t\t\tif (b.stop_percentile <= 0 || b.stop_percentile >= 100) throw 'first_bin.stop_percentile out of bound (0-100)'\n\t\t\t} else if (!Number.isFinite(b.stop)) {\n\t\t\t\tthrow 'first_bin.stop not a number when stop_percentile is not set'\n\t\t\t}\n\t\t}\n\n\t\tif (bc.last_bin) {\n\t\t\tconst b = bc.last_bin\n\t\t\t// requires start_percentile or start\n\t\t\tif (b.start_percentile) {\n\t\t\t\tif (!Number.isInteger(b.start_percentile)) throw 'last_bin.start_percentile should be integer'\n\t\t\t\tif (b.start_percentile <= 0 || b.start_percentile >= 100) throw 'last_bin.start_percentile out of bound (0-100)'\n\t\t\t} else if (!Number.isFinite(b.start)) {\n\t\t\t\tthrow 'last_bin.start not a number when start_percentile is not set'\n\t\t\t}\n\n\t\t\tb.stopunbounded = true\n\t\t\tif ('stop' in b) {\n\t\t\t\tthrow 'a regular last bin must not set a bin.stop value'\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthrow `invalid binconfig.type=\"${bc.type}\"`\n\t}\n}\n\nexport function compute_bins(binconfig, summaryfxn, valueConversion) {\n\t/*\n Bins generator\n \nbinconfig \n configuration of bins per the Numerical Binning Scheme\n\nsummaryfxn (percentiles)=> return {min, max, pX, pY, ...}\n - required function\n\n - must accept an array of desired percentile values\n and returns an object of computed properties\n {\n min: minimum value\n max: maximum value\n pX: percentile at X value, so p10 will be 10th percentile value\n pY: .. corresponding to the desired percentile values \n }\n*/\n\tconst bc = binconfig\n\tvalidate_bins(bc)\n\tif (bc.lst) {\n\t\tconst k2c = getColors(bc.lst.length) //to color bins\n\t\tfor (const bin of bc.lst) bin.color = k2c(bin.label)\n\t}\n\tif (bc.type == 'custom-bin') return JSON.parse(JSON.stringify(bc.lst))\n\tif (typeof summaryfxn != 'function') throw 'summaryfxn required for modules/termdb.bins.js compute_bins()'\n\tconst percentiles = target_percentiles(bc)\n\tconst summary = summaryfxn(percentiles)\n\tif (!summary || typeof summary !== 'object') throw 'invalid returned value by summaryfxn'\n\tbc.results = { summary }\n\tif (!bc.binLabelFormatter) bc.binLabelFormatter = getNumDecimalsFormatter(bc)\n\n\tconst orderedLabels = []\n\t// round the min and max values for use as bin start and stop\n\t// in the first and last bins, respectively\n\tconst minFloor = Math.floor(summary.min * 100) / 100\n\tconst maxCeil = Math.ceil(summary.max * 100) / 100\n\tconst min = bc.first_bin.startunbounded\n\t\t? minFloor\n\t\t: bc.first_bin.start_percentile\n\t\t? summary['p' + bc.first_bin.start_percentile]\n\t\t: bc.first_bin.start\n\tlet max = maxCeil, // in order to include the max value in the last bin\n\t\tlast_start,\n\t\tlast_stop\n\n\tif (bc.last_bin) {\n\t\tmax = bc.last_bin.stopunbounded\n\t\t\t? maxCeil // in order to include the max value in the last bin\n\t\t\t: bc.last_bin.stop_percentile\n\t\t\t? summary['p' + bc.last_bin.stop_percentile]\n\t\t\t: isNumeric(bc.last_bin.stop) && bc.last_bin.stop <= summary.max // '0.0088' < 0.0088\n\t\t\t? bc.last_bin.stop\n\t\t\t: maxCeil // in order to include the max value in the last bin\n\t\tlast_start = isStrictNumeric(bc.last_bin.start_percentile)\n\t\t\t? summary['p' + bc.last_bin.start_percentile]\n\t\t\t: isStrictNumeric(bc.last_bin.start)\n\t\t\t? bc.last_bin.start\n\t\t\t: undefined\n\t\tlast_stop = bc.last_bin.stopunbounded\n\t\t\t? null\n\t\t\t: bc.last_bin.stop_percentile\n\t\t\t? summary['p' + bc.last_bin.stop_percentile]\n\t\t\t: isStrictNumeric(bc.last_bin.stop)\n\t\t\t? bc.last_bin.stop\n\t\t\t: null\n\t} else if (bc.lst) {\n\t\tconst last_bin = bc.lst[bc.lst.length - 1]\n\t\tlast_start = last_bin.start\n\t\tlast_stop = 'stop' in last_bin && !last_bin.stopunbounded ? last_bin.stop : maxCeil\n\t\tmax = last_stop\n\t} else {\n\t\tlast_start = maxCeil\n\t\tlast_stop = maxCeil\n\t}\n\n\tconst numericMax = isStrictNumeric(max)\n\tconst numericLastStart = isStrictNumeric(last_start)\n\tconst numericLastStop = isStrictNumeric(last_stop)\n\n\tif (!numericMax && !numericLastStart) return [] //throw 'unable to compute the last bin start or stop'\n\n\tconst bins = []\n\tlet currBin = {\n\t\tstartunbounded: bc.first_bin.startunbounded,\n\t\tstart: bc.first_bin.startunbounded ? undefined : min,\n\t\tstop: isStrictNumeric(bc.first_bin.stop_percentile)\n\t\t\t? +summary['p' + bc.first_bin.stop_percentile]\n\t\t\t: isStrictNumeric(bc.first_bin.stop)\n\t\t\t? +bc.first_bin.stop\n\t\t\t: min + bc.bin_size,\n\t\tstartinclusive: bc.startinclusive,\n\t\tstopinclusive: bc.stopinclusive\n\t}\n\n\tif (!isStrictNumeric(currBin.stop)) throw 'the computed first_bin.stop is non-numeric' + currBin.stop\n\tconst maxNumBins = 100 // harcoded limit for now to not stress sqlite\n\n\twhile ((numericMax && currBin.stop <= max) || (currBin.startunbounded && !bins.length) || currBin.stopunbounded) {\n\t\tbins.push(currBin)\n\t\t// force a computed last bin to have stopunbounded true\n\t\tif (currBin.stop >= max) {\n\t\t\tcurrBin.stopunbounded = true\n\t\t\tif (bins.length > 1) {\n\t\t\t\tdelete currBin.stop\n\t\t\t}\n\t\t}\n\t\tcurrBin.label = get_bin_label(currBin, bc, valueConversion)\n\t\tif (currBin.stopunbounded) break\n\n\t\tconst upper = currBin.stop + bc.bin_size\n\t\tconst previousStop = currBin.stop\n\t\tcurrBin = {\n\t\t\tstartinclusive: bc.startinclusive,\n\t\t\tstopinclusive: bc.stopinclusive,\n\t\t\tstart: previousStop,\n\t\t\tstop:\n\t\t\t\tnumericLastStop && (previousStop == last_start || upper > last_stop)\n\t\t\t\t\t? last_stop\n\t\t\t\t\t: numericLastStart && upper > last_start && previousStop != last_start\n\t\t\t\t\t? last_start\n\t\t\t\t\t: upper\n\t\t}\n\n\t\tif (currBin.stop >= max) {\n\t\t\tcurrBin.stop = max\n\t\t\tif (bc.last_bin && bc.last_bin.stopunbounded) currBin.stopunbounded = 1\n\t\t\tif (bc.last_bin && bc.last_bin.stopinclusive) currBin.stopinclusive = 1\n\t\t}\n\t\tif (numericLastStart && currBin.start == last_start) {\n\t\t\tif (bc.last_bin && bc.last_bin.stopunbounded) currBin.stopunbounded = 1\n\t\t}\n\t\tif (currBin.start > currBin.stop) {\n\t\t\tif (numericLastStart && currBin.stop == last_start && bc.last_bin && bc.last_bin.stopunbounded)\n\t\t\t\tcurrBin.stopunbounded = true\n\t\t\telse break\n\t\t}\n\t\tif (bins.length + 1 >= maxNumBins) {\n\t\t\tbc.error = 'max_num_bins_reached'\n\t\t\tbreak\n\t\t}\n\t}\n\tdelete bc.binLabelFormatter\n\tif (bins.length > 1) {\n\t\tdelete bins[bins.length - 1].stop\n\t}\n\tconst k2c = getColors(bins.length) //to color bins\n\tfor (const bin of bins) bin.color = k2c(bin.label)\n\treturn bins\n}\n\nfunction getNumDecimalsFormatter(bc) {\n\t//return format('rounding' in bc ? bc.rounding : '')\n\treturn 'rounding' in bc ? format(bc.rounding) : d => d // default to labeling using the start/stop value as-is\n}\n\nexport function get_bin_label(bin, binconfig, valueConversion) {\n\t/*\n Generate a numeric bin label given a bin configuration and an optional term valueConversion object\n*/\n\tif (bin.label) return bin.label\n\n\tconst bc = binconfig\n\tif (!bc.binLabelFormatter) bc.binLabelFormatter = getNumDecimalsFormatter(bc)\n\tif (!bin.startunbounded && !bin.stopunbounded && !('startinclusive' in bin) && !('stopinclusive' in bin)) {\n\t\tif (bc.startinclusive) bin.startinclusive = true\n\t\telse if (bc.stopinclusive) bin.stopinclusive = true\n\t}\n\n\tconst start = bc.use_as == 'bins' || bin.start\n\tconst stop = bc.use_as == 'bins' || bin.stop\n\n\tlet label_offset = 0\n\tif ('label_offset' in bc) {\n\t\tbc.label_offset_ignored = 'bin_size' in bc && bc.bin_size < bc.label_offset\n\t\tif (!bc.label_offset_ignored) label_offset = bc.label_offset\n\t} else if (bc.bin_size === 1 && bc.termtype == 'integer') {\n\t\tlabel_offset = 1\n\t}\n\n\t// one side-unbounded bins\n\t// label will be \">v\" or \"<v\"\n\tif (bin.startunbounded) {\n\t\tconst oper = bin.stopinclusive ? '\u2264' : '<' // \\u2264\n\t\tconst v1 = valueConversion\n\t\t\t? convertUnits(stop, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: bc.binLabelFormatter(stop) //bin.startinclusive && label_offset ? stop - label_offset : stop)\n\t\treturn oper + v1\n\t}\n\t// a data value may coincide with the last bin's start\n\tif (bin.stopunbounded || start === stop) {\n\t\tconst oper = bin.startinclusive /*|| label_offset*/ ? '\u2265' : '>' // \\u2265\n\t\tconst v0 = valueConversion\n\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: bc.binLabelFormatter(start) //bin.startinclusive || start == min ? start : start + label_offset)\n\t\treturn oper + v0\n\t}\n\n\t// two-sided bins\n\tif (label_offset && bin.startinclusive && !bin.stopinclusive) {\n\t\tif (Number.isInteger(bc.bin_size) && Math.abs(start - stop) === label_offset) {\n\t\t\t// make a simpler label when the range simply spans the bin_size\n\t\t\treturn (\n\t\t\t\t'' +\n\t\t\t\t(valueConversion\n\t\t\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t\t\t: bc.binLabelFormatter(start))\n\t\t\t)\n\t\t} else {\n\t\t\tconst v0 = valueConversion\n\t\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t\t: bc.binLabelFormatter(start)\n\t\t\tconst v1 = valueConversion\n\t\t\t\t? convertUnits(\n\t\t\t\t\t\tstop - label_offset,\n\t\t\t\t\t\tvalueConversion.fromUnit,\n\t\t\t\t\t\tvalueConversion.toUnit,\n\t\t\t\t\t\tvalueConversion.scaleFactor,\n\t\t\t\t\t\ttrue\n\t\t\t\t )\n\t\t\t\t: bc.binLabelFormatter(stop - label_offset)\n\t\t\t// ensure that last two bin labels make sense (the last is stopunbounded)\n\t\t\treturn +v0 >= +v1 ? v0.toString() : v0 + ' to ' + v1\n\t\t}\n\t} else {\n\t\t// stop_inclusive || label_offset == 0\n\t\tconst oper0 = bin.startinclusive ? '' : '>'\n\t\tconst oper1 = bin.stopinclusive ? '' : '<'\n\t\tconst v0 = valueConversion\n\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: Number.isInteger(start)\n\t\t\t? start\n\t\t\t: bc.binLabelFormatter(start)\n\t\tconst v1 = valueConversion\n\t\t\t? convertUnits(stop, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: Number.isInteger(stop)\n\t\t\t? stop\n\t\t\t: bc.binLabelFormatter(stop)\n\t\t// after rounding the bin labels, the bin start may equal the last bin stop as derived from actual data\n\t\tif (+v0 >= +v1) {\n\t\t\tconst oper = bin.startinclusive ? '\u2265' : '>' // \\u2265\n\t\t\treturn oper + v0\n\t\t} else {\n\t\t\treturn oper0 + v0 + ' to ' + oper1 + v1\n\t\t}\n\t}\n}\n\n// get bin range equation from bin label and bin properties\nexport function get_bin_range_equation(bin, binconfig) {\n\tconst x = '<span style=\"font-family:Times;font-style:italic;\">x</span>'\n\tlet range_eq\n\t// should always use computed (not user-customized) bin label to determine bin range text\n\tconst copy = structuredClone(bin)\n\tcopy.label = '' // mutate only the copy, and not the original bin argument\n\tconst bin_label = get_bin_label(copy, binconfig)\n\tif (bin.startunbounded || bin.stopunbounded) {\n\t\t// first or last bins, e.g. x \u2264 14 and x > 16\n\t\trange_eq = x + ' ' + bin_label\n\t} else if (bin.startinclusive) {\n\t\t// bins with startinclusive, e.g. 14 \u2264 x < 16\n\t\trange_eq = bin_label.replace('to <', '\u2264 ' + x + ' <')\n\t} else if (bin.stopinclusive) {\n\t\t// bins with stopinclusive, e.g. 14 < x \u2264 16\n\t\trange_eq = bin_label.replace('>', '').replace('to', '< ' + x + ' \u2264')\n\t}\n\treturn range_eq\n}\n\nexport function target_percentiles(binconfig) {\n\tconst percentiles = []\n\tconst f = binconfig.first_bin\n\tif (f && isStrictNumeric(f.start_percentile)) percentiles.push(f.start_percentile)\n\tif (f && isStrictNumeric(f.stop_percentile)) percentiles.push(f.stop_percentile)\n\tconst l = binconfig.last_bin\n\tif (l && isStrictNumeric(l.start_percentile)) percentiles.push(l.start_percentile)\n\tif (l && isStrictNumeric(l.stop_percentile)) percentiles.push(l.stop_percentile)\n\treturn percentiles\n}\n", "/*\nInitialize a bin configuration for a numeric dataset\n<data>: array of numeric data values\n<opts> (optional): object of options\n {}: output bin config as JavaScript object (default)\n {format: 'string'}: output bin config as JSON string\n*/\nexport default function initBinConfig(data, opts = {}) {\n\tif (data.find(d => !Number.isFinite(d))) throw new Error('non-numeric values found')\n\n\tlet binConfig\n\tconst s = new Set(data)\n\tif (s.size === 1) {\n\t\t// single unique value in data array\n\t\t// prepare custom bin config for 3 bins: first bin\n\t\t// for values less than the value, second bin for values\n\t\t// equal to the value, and third bin one for values\n\t\t// greater than the value\n\t\t// all data values will fall into the second bin\n\t\tconst value = [...s][0]\n\t\tbinConfig = {\n\t\t\ttype: 'custom-bin',\n\t\t\tlst: [\n\t\t\t\t{ stop: value, stopinclusive: false, startunbounded: true, label: '<' + value },\n\t\t\t\t{ start: value, stop: value, startinclusive: true, stopinclusive: true, label: '=' + value },\n\t\t\t\t{ start: value, startinclusive: false, stopunbounded: true, label: '>' + value }\n\t\t\t]\n\t\t}\n\t} else {\n\t\t// multiple unique values in data array\n\t\t// prepare regular bin config\n\n\t\t// compute the bin size for a maximum bin number of 8\n\t\tdata.sort((a, b) => a - b)\n\t\tconst l = data.length\n\t\tconst min = data[0]\n\t\tconst max = data[l - 1]\n\t\tconst p5idx = Math.ceil(l * 0.05) - 1\n\t\tconst p98idx = Math.ceil(l * 0.98) - 1\n\t\tconst p5 = data[p5idx]\n\t\tconst p98 = data[p98idx]\n\t\t// use 98th and 5th percentiles to compute bin size to reduce outlier influence\n\t\t// if 98th = 5th, use max and min instead\n\t\tconst binSize = p98 != p5 ? (p98 - p5) / 8 : (max - min) / 8\n\t\t// first bin stop will equal either (minimum + bin size) or (5th percentile), whichever is larger.\n\t\tconst firstBinStop = Math.max(min + binSize, p5)\n\t\t// round the bin values\n\t\tlet [binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding] = roundBinVals(binSize, firstBinStop, max, min)\n\t\t// generate the bin configuration\n\t\tbinConfig = {\n\t\t\ttype: 'regular-bin',\n\t\t\tstartinclusive: true,\n\t\t\tbin_size: binSize_rnd,\n\t\t\tfirst_bin: { stop: firstBinStop_rnd }\n\t\t}\n\t\tif (lastBinStart_rnd) binConfig.last_bin = { start: lastBinStart_rnd }\n\t\tif (rounding) binConfig.rounding = rounding\n\t}\n\tif ('format' in opts) {\n\t\tif (opts.format === 'string') {\n\t\t\treturn JSON.stringify(binConfig)\n\t\t} else {\n\t\t\tthrow 'options are not in the correct format'\n\t\t}\n\t} else {\n\t\treturn binConfig\n\t}\n}\n\nfunction roundBinVals(binSize, firstBinStop, max, min) {\n\tlet binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding\n\tconst log = Math.floor(Math.log10(binSize))\n\tif (binSize >= 0.1 && binSize <= 2) {\n\t\t// Round to the nearest one for small bin sizes\n\t\tbinSize_rnd = Math.round(binSize / (1 * 10 ** log)) * (1 * 10 ** log)\n\t\tfirstBinStop_rnd = Math.round(firstBinStop / (1 * 10 ** log)) * (1 * 10 ** log)\n\t} else {\n\t\t// Round to the nearest five for large bin sizes\n\t\tbinSize_rnd = Math.round(binSize / (5 * 10 ** log)) * (5 * 10 ** log)\n\t\tfirstBinStop_rnd = Math.round(firstBinStop / (5 * 10 ** log)) * (5 * 10 ** log)\n\t\tif (binSize_rnd === 0) binSize_rnd = 1 * 10 ** log\n\t\tif (firstBinStop_rnd === 0) firstBinStop_rnd = 1 * 10 ** log\n\t\tif (binSize_rnd === 5 * 10 ** log && firstBinStop_rnd === 1 * 10 ** log) firstBinStop_rnd = 5 * 10 ** log\n\t}\n\tif (firstBinStop_rnd < min) firstBinStop_rnd = firstBinStop_rnd * 2\n\t// if the number of bins is above 8 after rounding, then set the last bin start to restrict the number of bins to 8\n\tconst eighthBinStop_rnd = firstBinStop_rnd + binSize_rnd * 7\n\tif (max > eighthBinStop_rnd) {\n\t\tlastBinStart_rnd = firstBinStop_rnd + binSize_rnd * 6\n\t}\n\tif (binSize < 1) {\n\t\tconst digits = Math.abs(log)\n\t\tbinSize_rnd = Number(binSize_rnd.toFixed(digits))\n\t\tfirstBinStop_rnd = Number(firstBinStop_rnd.toFixed(digits))\n\t\tif (lastBinStart_rnd) lastBinStart_rnd = Number(lastBinStart_rnd.toFixed(digits))\n\t\trounding = '.' + digits + 'f'\n\t}\n\tif (Object.is(firstBinStop_rnd, -0)) firstBinStop_rnd = 0\n\treturn [binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding]\n}\n", "/*\nto parse a variant line, not header\n\ncannot simply slice by /[;=]/, but read char by char\ncase CLNVI=Breast_Cancer_Information_Core__(BRCA2):745-4&base_change=C_to_G;\ncase k1=v1;DB;k2=v2;\n*/\nexport function dissect_INFO(str) {\n\t//let findequal=true\n\tlet findsemicolon = false\n\tlet findequalorsemicolon = true\n\n\tlet i = 0\n\tlet idx = 0\n\n\tconst k2v = {}\n\tlet lastkey\n\n\twhile (i < str.length) {\n\t\tconst c = str[i]\n\t\tif (findequalorsemicolon) {\n\t\t\tif (c == '=') {\n\t\t\t\tfindsemicolon = true\n\t\t\t\tfindequalorsemicolon = false\n\t\t\t\tlastkey = str.substring(idx, i)\n\t\t\t\tidx = i + 1\n\t\t\t} else if (c == ';') {\n\t\t\t\t// should be a flag\n\t\t\t\tk2v[str.substring(idx, i)] = 1\n\t\t\t\tidx = i + 1\n\t\t\t}\n\t\t} else if (findsemicolon && c == ';') {\n\t\t\tfindequalorsemicolon = true\n\t\t\tfindsemicolon = false\n\t\t\tk2v[lastkey] = str.substring(idx, i)\n\t\t\tlastkey = null\n\t\t\tidx = i + 1\n\t\t}\n\t\ti++\n\t}\n\n\tconst remainstr = str.substr(idx, i)\n\tif (lastkey) {\n\t\tk2v[lastkey] = remainstr\n\t} else {\n\t\tk2v[remainstr] = 1\n\t}\n\n\treturn k2v\n}\n", "import { vepinfo } from './common.js'\n/*\nparse csq field from a variant line, not header\nCSQ header must have already been parsed\n\nstr: the csq value for a vcf line\nheader: [ // something like this\n { name: 'Allele' },\n { name: 'Consequence' },\n { name: 'IMPACT' },\n { name: 'SYMBOL' },\n { name: 'Gene' },\n { name: 'Feature_type' },\n { name: 'Feature' },\n { name: 'BIOTYPE' },\n { name: 'EXON' },\n { name: 'INTRON' },\n { name: 'HGVSc' },\n { name: 'HGVSp' },\n { name: 'cDNA_position' },\n { name: 'CDS_position' },\n { name: 'Protein_position' },\n { name: 'Amino_acids' },\n { name: 'Codons' },\n { name: 'Existing_variation' },\n { name: 'DISTANCE' },\n { name: 'STRAND' },\n { name: 'FLAGS' },\n { name: 'SYMBOL_SOURCE' },\n { name: 'HGNC_ID' },\n { name: 'CANONICAL' },\n { name: 'REFSEQ_MATCH' },\n { name: 'GIVEN_REF' },\n { name: 'USED_REF' },\n { name: 'BAM_EDIT' },\n { name: 'HGVS_OFFSET' },\n { name: 'CLIN_SIG' },\n { name: 'SOMATIC' },\n { name: 'PHENO' }\n]\n\nm: {\n\tmlst[ {} ]\n\t\t.allele_original\n\t\t.csq[ {} ] // parse_CSQ will add this array to this allele\n\t\t\t._class\n\t\t\t._csqrank\n\t\t\t._dt\n\t\t\t._gene\n\t\t\t._isoform\n\t\t\t._mname\n}\n\n*/\n\nexport function parse_CSQ(str, header, m) {\n\tif (!header) {\n\t\treturn null\n\t}\n\tfor (const thisannotation of str.split(',')) {\n\t\tconst lst = thisannotation.replace(/&/g, ',').split('|')\n\n\t\tconst o = {}\n\n\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\tif (lst[i]) {\n\t\t\t\to[header[i].name] = lst[i]\n\t\t\t}\n\t\t}\n\t\tif (!o.Allele) {\n\t\t\tcontinue\n\t\t}\n\t\tlet allele = null\n\n\t\t//////////////////////////////////////\n\t\t// NOTE\n\t\t// mds2delete\n\t\t// m.alleles[] is based on old vcf parsing and may delete?\n\t\t// latest spec is m.mlst[]\n\t\t//////////////////////////////////////\n\n\t\tfor (const a of m.mlst || m.alleles) {\n\t\t\tif (a.allele_original == o.Allele) {\n\t\t\t\tallele = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!allele) {\n\t\t\tif (o.Allele == '-') {\n\t\t\t\t// deletion\n\t\t\t\tif (m.mlst) {\n\t\t\t\t\tif (m.mlst.length == 1) {\n\t\t\t\t\t\tallele = m.mlst[0]\n\t\t\t\t\t}\n\t\t\t\t} else if (m.alleles) {\n\t\t\t\t\tif (m.alleles.length == 1) {\n\t\t\t\t\t\tallele = m.alleles[0]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const a of m.mlst || m.alleles) {\n\t\t\t\t\tif (a.allele_original.substr(1) == o.Allele) {\n\t\t\t\t\t\t// insertion, without first padding base\n\t\t\t\t\t\tallele = a\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!allele) {\n\t\t\t\t// cannot match to allele!!!\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif (!allele.csq) {\n\t\t\tallele.csq = []\n\t\t}\n\t\tallele.csq.push(o)\n\n\t\t// gene\n\t\to._gene = o.SYMBOL || o.Gene\n\n\t\t// isoform\n\t\tif (o.Feature_type && o.Feature_type == 'Transcript') {\n\t\t\to._isoform = o.Feature.split('.')[0] // remove version\n\t\t} else {\n\t\t\to._isoform = o._gene\n\t\t}\n\n\t\t// class\n\t\tif (o.Consequence) {\n\t\t\tconst [dt, cls, rank] = vepinfo(o.Consequence)\n\t\t\to._dt = dt\n\t\t\to._class = cls\n\t\t\to._csqrank = rank\n\t\t} else {\n\t\t\t// FIXME\n\t\t\to._dt = dtsnvindel\n\t\t\to._class = mclassnonstandard\n\t\t}\n\t\t// mname\n\t\tif (o.HGVSp) {\n\t\t\to._mname = decodeURIComponent(o.HGVSp.substr(o.HGVSp.indexOf(':') + 1))\n\t\t} else if (o.Protein_position && o.Amino_acids) {\n\t\t\to._mname = decodeURIComponent(o.Protein_position + o.Amino_acids)\n\t\t} else if (o.HGVSc) {\n\t\t\to._mname = o.HGVSc.substr(o.HGVSc.indexOf(':') + 1)\n\t\t} else if (o.Existing_variation) {\n\t\t\to._name = o.Existing_variation\n\t\t} else {\n\t\t}\n\t}\n\treturn true\n}\n", "import { vepinfo } from './common.js'\n\nexport function parse_ANN(str, header, m) {\n\t// snpEff\n\tif (!header) {\n\t\treturn null\n\t}\n\tfor (const thisannotation of str.split(',')) {\n\t\tconst lst = thisannotation.replace(/&/g, ',').split('|')\n\n\t\tconst o = {}\n\n\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\tif (lst[i]) {\n\t\t\t\to[header[i].name] = lst[i]\n\t\t\t}\n\t\t}\n\t\tif (!o.Allele) {\n\t\t\tcontinue\n\t\t}\n\t\tlet allele = null\n\t\tfor (const a of m.alleles) {\n\t\t\tif (a.allele == o.Allele) {\n\t\t\t\tallele = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!allele) {\n\t\t\t// cannot match to allele!!!\n\t\t\tcontinue\n\t\t}\n\t\tif (!allele.ann) {\n\t\t\tallele.ann = []\n\t\t}\n\t\tallele.ann.push(o)\n\t\to._gene = o.Gene_Name\n\t\t// isoform\n\t\tif (o.Feature_Type && o.Feature_Type == 'transcript' && o.Feature_ID) {\n\t\t\to._isoform = o.Feature_ID.split('.')[0]\n\t\t}\n\t\t// class\n\t\tif (o.Annotation) {\n\t\t\tconst [dt, cls, rank] = vepinfo(o.Annotation)\n\t\t\to._dt = dt\n\t\t\to._class = cls\n\t\t\to._csqrank = rank\n\t\t} else {\n\t\t\t// FIXME\n\t\t\to._dt = dtsnvindel\n\t\t\to._class = mclassnonstandard\n\t\t}\n\t\t// mname\n\t\tif (o['HGVS.p']) {\n\t\t\t//o._mname=decodeURIComponent(o.HGVSp.substr(o.HGVSp.indexOf(':')+1))\n\t\t\to._mname = o['HGVS.p']\n\t\t} else if (o['HGVS.c']) {\n\t\t\to._mname = o['HGVS.c']\n\t\t} else {\n\t\t}\n\t}\n\treturn true\n}\n", "import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from './common.js'\n\nexport function getVariantType(ref, alt) {\n\tif (ref.length == 1 && alt.length == 1) {\n\t\t// both alleles length of 1\n\t\tif (alt == '.') {\n\t\t\t// alt is missing\n\t\t\treturn mclassdeletion\n\t\t}\n\t\t// snv\n\t\treturn mclasssnv\n\t}\n\tif (ref.length == alt.length) return mclassmnv\n\t// FIXME only when empty length of one allele\n\tif (ref.length < alt.length) return mclassinsertion\n\tif (ref.length > alt.length) return mclassdeletion\n\treturn mclassnonstandard\n}\n", "import { mclass } from './common.js'\nimport { dissect_INFO } from './vcf.info.js'\nimport { parse_CSQ } from './vcf.csq.js'\nimport { parse_ANN } from './vcf.ann.js'\nimport { getVariantType } from './vcf.type.js'\n\n/*\nOnly for parsing vcf files\nis not involved in creating vcf tracks\n\nshared between client-server\n*/\n\n// for telling symbolic alleles e.g. <*:DEL>\nconst getallelename = new RegExp(/<(.+)>/)\n\nconst mclasslabel2key = {}\nfor (const k in mclass) {\n\tmclasslabel2key[mclass[k].label.toUpperCase()] = k\n}\n\nexport function vcfparsemeta(lines) {\n\t/*\n\tinput: array of string, as lines separated by linebreak\n\n\t##INFO for meta lines\n\t#CHROM for header, to get samples\n\n\t*/\n\n\tlet sample = [],\n\t\terrlst = [],\n\t\tinfo = {},\n\t\thasinfo = false,\n\t\tformat = {},\n\t\thasformat = false\n\n\tfor (const line of lines) {\n\t\tif (!line.startsWith('#')) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('#C')) {\n\t\t\t// header, get samples\n\t\t\tsample = line.split('\\t').slice(9)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##INFO')) {\n\t\t\tconst e = tohash(line.substring(8, line.length - 1), info)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('INFO error: ' + e)\n\t\t\t} else {\n\t\t\t\thasinfo = true\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##FORMAT')) {\n\t\t\tconst e = tohash(line.substring(10, line.length - 1), format)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('FORMAT error: ' + e)\n\t\t\t} else {\n\t\t\t\thasformat = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst sampleobjlst = []\n\tfor (const samplename of sample) {\n\t\tconst a = { name: samplename }\n\n\t\t// this enables adding key4annotation to match with .ds.cohort.annotation\n\n\t\tsampleobjlst.push(a)\n\t}\n\n\t// reserved INFO fields\n\tif (info.CSQ) {\n\t\tconst lst = info.CSQ.Description.split(' Format: ')\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split('|')\n\t\t\tif (lst2.length > 1) {\n\t\t\t\t// fix csq headers so to allow configuring show/hide of csq fields\n\t\t\t\tinfo.CSQ.csqheader = []\n\t\t\t\tfor (const str of lst2) {\n\t\t\t\t\tconst attr = { name: str }\n\t\t\t\t\tinfo.CSQ.csqheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t}\n\t}\n\n\tif (info.ANN) {\n\t\tconst lst = info.ANN.Description.split(\"'\")\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split(' | ')\n\t\t\tif (lst2.length) {\n\t\t\t\tinfo.ANN.annheader = []\n\t\t\t\tfor (const s of lst2) {\n\t\t\t\t\tconst attr = { name: s }\n\t\t\t\t\tinfo.ANN.annheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('no \" | \" joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('no single-quote enclosed annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t}\n\t}\n\n\treturn [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null]\n}\n\nexport function vcfparseline(line, vcf) {\n\t/*\n\tvcf, samples/info is generated by vcfparsemeta()\n\t\t.nochr BOOL\n\t\t.samples [ {} ]\n\t\t\t.name\n\t\t.info {}\n\t\t.format {}\n\n\treturn:\n\t\terror message STR\n\t\taltinvalid []\n\t\tmlst [ m ] one m per alt allele\n\t\t\tchr\n\t\t\tpos\n\t\t\tname\n\t\t\ttype\n\t\t\tref\n\t\t\talt\n\t\t\taltstr\n\t\t\tsampledata []\n\t\t\taltinfo\n\t*/\n\n\tconst lst = line.split('\\t')\n\tif (lst.length < 8) {\n\t\t// no good\n\t\treturn ['line has less than 8 fields', null, null]\n\t}\n\n\tconst rawpos = Number.parseInt(lst[2 - 1])\n\tif (!Number.isInteger(rawpos)) {\n\t\treturn ['invalid value for genomic position', null, null]\n\t}\n\n\tconst refallele = lst[4 - 1]\n\n\tconst m = {\n\t\tvcf_ID: lst[3 - 1],\n\t\tchr: (vcf.nochr ? 'chr' : '') + lst[1 - 1],\n\t\tpos: rawpos - 1,\n\t\tref: refallele,\n\t\t//refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, \"refstr\" is required for matching in FORMAT\n\t\taltstr: lst[5 - 1],\n\t\talleles: [\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tref allele only a placeholder, to be removed, this array only contains alt alleles\n\t\t\t\tthis is a must\n\t\t\t\talso allows GT allele index to work\n\t\t\t\t*/\n\t\t\t\tallele: refallele,\n\t\t\t\tsampledata: []\n\t\t\t}\n\t\t],\n\n\t\tinfo: {}, // locus info, do not contain allele info\n\n\t\tname: lst[3 - 1] == '.' ? null : lst[3 - 1]\n\t}\n\n\t// parse alt\n\tconst altinvalid = []\n\tfor (const alt of lst[5 - 1].split(',')) {\n\t\tconst a = {\n\t\t\tref: m.ref, // may be corrected just below!\n\t\t\tallele: alt,\n\t\t\t// 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele\n\t\t\tallele_original: alt,\n\t\t\tsampledata: [],\n\t\t\t_m: m,\n\t\t\tinfo: {} // allele info, do not contain locus info\n\t\t}\n\t\tm.alleles.push(a)\n\t\tif (alt[0] == '<') {\n\t\t\t/*\n\t\t\tsymbolic allele, show text within <> as name\n\t\t\tFIXME match INFO\n\t\t\t*/\n\t\t\tconst tmp = alt.match(getallelename)\n\t\t\tif (!tmp) {\n\t\t\t\taltinvalid.push(alt)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.type = tmp[1]\n\n\t\t\ta.allele = tmp[1]\n\t\t\ta.issymbolicallele = true\n\t\t} else {\n\t\t\t// normal nucleotide\n\n\t\t\tconst [p, ref, alt] = correctRefAlt(m.pos, m.ref, a.allele)\n\t\t\ta.pos = p\n\t\t\ta.ref = ref\n\t\t\ta.allele = alt\n\t\t}\n\t}\n\n\tif (lst[9 - 1] && lst[10 - 1]) {\n\t\tparse_FORMAT2(lst, m, vcf)\n\t}\n\n\t/*\n\tremove ref allele so it only contain alternative alleles\n\tso that parse_INFO can safely apply Number=A fields to m.alleles\n\t*/\n\tm.alleles.shift()\n\n\t// info\n\tconst tmp = lst[8 - 1] == '.' ? [] : dissect_INFO(lst[8 - 1])\n\tlet badinfokeys = []\n\n\tif (vcf.info) {\n\t\tbadinfokeys = parse_INFO(tmp, m, vcf)\n\t} else {\n\t\t// vcf meta lines told nothing about INFO, do not parse\n\t\tm.info = tmp\n\t}\n\n\tconst mlst = []\n\tfor (const a of m.alleles) {\n\t\tconst m2 = {}\n\t\tfor (const k in m) {\n\t\t\tif (k != 'alleles') {\n\t\t\t\tm2[k] = m[k]\n\t\t\t}\n\t\t}\n\t\tfor (const k in a) {\n\t\t\tif (k == 'allele') {\n\t\t\t\tm2.alt = a[k]\n\t\t\t} else if (k == 'info') {\n\t\t\t\tm2.altinfo = a[k]\n\t\t\t} else {\n\t\t\t\tm2[k] = a[k]\n\t\t\t}\n\t\t}\n\t\tif (!m2.issymbolicallele && m2.alt != 'NON_REF') {\n\t\t\tm2.type = getVariantType(m2.ref, m2.alt)\n\t\t\t/*\n\t\t\t// valid alt allele, apply Dr. J's cool method\n\t\t\tconst [p,ref,alt]=correctRefAlt(m2.pos, m2.ref, m2.alt)\n\t\t\tm2.pos=p\n\t\t\tm2.ref=ref\n\t\t\tm2.alt=alt\n\t\t\t*/\n\t\t}\n\t\tmlst.push(m2)\n\t}\n\treturn [\n\t\tbadinfokeys.length ? 'unknown info keys: ' + badinfokeys.join(',') : null,\n\t\tmlst,\n\t\taltinvalid.length > 0 ? altinvalid : null\n\t]\n}\n\nfunction correctRefAlt(p, ref, alt) {\n\t// for oligos, always trim the last identical base\n\twhile (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {\n\t\tref = ref.substr(0, ref.length - 1)\n\t\talt = alt.substr(0, alt.length - 1)\n\t}\n\t// move position up as long as first positions are equal\n\twhile (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {\n\t\tref = ref.substr(1)\n\t\talt = alt.substr(1)\n\t\tp++\n\t}\n\treturn [p, ref, alt]\n}\n\nfunction parse_FORMAT2(lst, m, vcf) {\n\t/*\n\tm.alleles[0] is ref allele\n\n\teach allele:\n\t\t.ref\n\t\t.allele\n\t\t.allele_original\n\t\t.sampledata[] blank array\n\t*/\n\tconst formatfields = lst[9 - 1].split(':')\n\n\tfor (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {\n\t\t// for each sample\n\n\t\tconst valuelst = lst[_sampleidx].split(':')\n\t\t{\n\t\t\t// tell if this sample have any data in this line (variant), if .:., then skip\n\t\t\tlet none = true\n\t\t\tfor (const v of valuelst) {\n\t\t\t\tif (v != '.') {\n\t\t\t\t\tnone = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (none) {\n\t\t\t\t// this sample has no format value\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t/* should create an object of {format:value} of this sample\n\t\twith this object, for each alt allele this sample has,\n\t\tput a copy in m.allele[x].sampledata[]\n\t\t*/\n\n\t\tconst sampleidx = _sampleidx - 9\n\n\t\t/*\n\t\tfor each alt allele, initialize obj of this sample and store in this allele\n\t\tlater, to iterate over format fields and put in appropriate values\n\t\tnote that this sample may not actually have this allele\n\t\t*/\n\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\tconst sobj = {}\n\t\t\tif (vcf.samples && vcf.samples[sampleidx]) {\n\t\t\t\tfor (const k in vcf.samples[sampleidx]) {\n\t\t\t\t\tsobj[k] = vcf.samples[sampleidx][k]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsobj.name = 'missing_samplename_from_vcf_header'\n\t\t\t}\n\t\t\tm.alleles[i].sampledata.push({\n\t\t\t\tsampleobj: sobj\n\t\t\t})\n\t\t}\n\n\t\tfor (let fi = 0; fi < formatfields.length; fi++) {\n\t\t\t// for each field of this sample\n\n\t\t\tconst field = formatfields[fi]\n\t\t\tconst value = valuelst[fi]\n\t\t\tif (value == '.') {\n\t\t\t\t// no value for this field\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field == 'GT') {\n\t\t\t\tconst splitter = value.indexOf('/') != -1 ? '/' : '|'\n\t\t\t\tlet gtsum = 0 // for calculating gtallref=true, old\n\t\t\t\tlet unknowngt = false // if any is '.', then won't calculate gtallref\n\t\t\t\tconst gtalleles = []\n\t\t\t\tfor (const i of value.split(splitter)) {\n\t\t\t\t\tif (i == '.') {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst j = Number.parseInt(i)\n\t\t\t\t\tif (Number.isNaN(j)) {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tgtsum += j\n\t\t\t\t\tconst ale = m.alleles[j]\n\t\t\t\t\tif (ale) {\n\t\t\t\t\t\tgtalleles.push(ale.allele)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet gtallref = false\n\t\t\t\tif (!unknowngt) {\n\t\t\t\t\tgtallref = gtsum == 0\n\t\t\t\t}\n\n\t\t\t\tconst genotype = gtalleles.join(splitter)\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tconst ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1]\n\t\t\t\t\tms.GT = value\n\t\t\t\t\tms.genotype = genotype\n\t\t\t\t\tif (gtallref) {\n\t\t\t\t\t\tms.gtallref = true\n\t\t\t\t\t}\n\n\t\t\t\t\t// for mds vcf to drop out samples that do not have this alt allele\n\t\t\t\t\tms.__gtalleles = gtalleles\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// other data fields\n\t\t\tconst formatdesc = vcf.format ? vcf.format[field] : null\n\t\t\tif (!formatdesc) {\n\t\t\t\t// unspecified field, put to all alt alleles\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst isinteger = formatdesc.Type == 'Integer'\n\t\t\tconst isfloat = formatdesc.Type == 'Float'\n\n\t\t\tif ((formatdesc.Number && formatdesc.Number == 'R') || field == 'AD') {\n\t\t\t\t/*\n\t\t\t\tper-allele value, including ref\n\t\t\t\tv4.1 has AD not with \"R\", must process as R\n\t\t\t\t*/\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.ref] = fvlst[0]\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (formatdesc.Number && formatdesc.Number == 'A') {\n\t\t\t\t// per alt-allele value\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i - 1] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i - 1]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// otherwise, append this field to all alt\n\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t}\n\t\t}\n\t}\n\n\t// compatible with old ds: make allele2readcount from AD\n\tfor (const a of m.alleles) {\n\t\tfor (const s of a.sampledata) {\n\t\t\tif (s.AD) {\n\t\t\t\ts.allele2readcount = {}\n\t\t\t\tfor (const k in s.AD) {\n\t\t\t\t\ts.allele2readcount[k] = s.AD[k]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction tohash(s, hash) {\n\t/*\n\tparse INFO\n\t*/\n\tconst h = {},\n\t\terr = []\n\tlet prev = 0,\n\t\tprevdoublequote = false,\n\t\tk = null\n\tfor (let i = 0; i < s.length; i++) {\n\t\tif (s[i] == '\"') {\n\t\t\ti++\n\t\t\tconst thisstart = i\n\t\t\twhile (s[i] != '\"') {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif (k) {\n\t\t\t\th[k] = s.substring(thisstart, i)\n\t\t\t\tk = null\n\t\t\t} else {\n\t\t\t\terr.push('k undefined before double quotes')\n\t\t\t}\n\t\t\tprevdoublequote = true\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == '=') {\n\t\t\tk = s.substring(prev, i)\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == ',') {\n\t\t\tif (prevdoublequote) {\n\t\t\t\tprevdoublequote = false\n\t\t\t} else {\n\t\t\t\tif (k) {\n\t\t\t\t\th[k] = s.substring(prev, i)\n\t\t\t\t\tk = null\n\t\t\t\t} else {\n\t\t\t\t\terr.push('k undefined')\n\t\t\t\t}\n\t\t\t}\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t}\n\tif (k) {\n\t\th[k] = s.substring(prev, i)\n\t}\n\tif (h.ID) {\n\t\thash[h.ID] = h\n\t} else {\n\t\treturn 'no ID'\n\t}\n\tif (err.length) return err.join('\\n')\n}\n\nfunction parse_INFO(tmp, m, vcf) {\n\t/*\n\tthis function fills in both m.info{} and m.alleles[].info{}\n\n\tthe m.alleles[] will later be converted to [m], each carrying one alt allele\n\teach m will have .info{} for locus info, and .altinfo{} for alt allele info\n\n\t*/\n\n\tconst badinfokeys = []\n\n\tfor (const key in tmp) {\n\t\tif (vcf.info[key] == undefined) {\n\t\t\tbadinfokeys.push(key)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst value = tmp[key]\n\n\t\t////////////////// hard-coded fields\n\n\t\tif (key == 'CSQ') {\n\t\t\tconst okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (key == 'ANN') {\n\t\t\tconst okay = parse_ANN(value, vcf.info.ANN.annheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t////////////////// end of hardcoded fields\n\n\t\tif (vcf.info[key].Type == 'Flag') {\n\t\t\t// flag has no value\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tconst __number = vcf.info[key].Number\n\t\tconst isinteger = vcf.info[key].Type == 'Integer'\n\t\tconst isfloat = vcf.info[key].Type == 'Float'\n\n\t\tif (__number == '0') {\n\t\t\t/*\n\t\t\tno value, should be a Flag\n\t\t\t*/\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'A') {\n\t\t\t/*\n\t\t\tper alt allele\n\t\t\t*/\n\t\t\tconst tt = value.split(',')\n\t\t\tfor (let j = 0; j < tt.length; j++) {\n\t\t\t\tif (m.alleles[j]) {\n\t\t\t\t\tm.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'R') {\n\t\t\t/*\n\t\t\tFIXME \"R\" is not considered, m.alleles only contain alt, which .info{} for each\n\t\t\tthe current datastructure does not support info for ref allele!\n\t\t\t*/\n\t\t}\n\n\t\tif (__number == '1') {\n\t\t\t/*\n\t\t\tsingle value\n\t\t\t*/\n\t\t\tm.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!value.split) {\n\t\t\t// unknown error\n\t\t\tcontinue\n\t\t}\n\n\t\t// number of values unknown, \"commas are permitted only as delimiters for lists of values\"\n\n\t\tconst lst = value.split(',') // value is always array!!\n\t\tif (isinteger) {\n\t\t\tm.info[key] = lst.map(Number.parseInt)\n\t\t} else if (isfloat) {\n\t\t\tm.info[key] = lst.map(Number.parseFloat)\n\t\t} else {\n\t\t\tm.info[key] = lst\n\t\t}\n\t}\n\treturn badinfokeys\n}\n", "// compute the percentile value from an array of values\n// sorted parameter allows to skip sorting if array is pre-sorted\n// source: https://www.dummies.com/article/academics-the-arts/math/statistics/how-to-calculate-percentiles-in-statistics-169783/\nexport default function computePercentile(values, percentile, sorted = false) {\n\tif (!sorted) values.sort((a, b) => a - b)\n\tconst index = Math.abs((percentile / 100) * values.length - 1)\n\tconst value = Number.isInteger(index) ? (values[index] + values[index + 1]) / 2 : values[Math.ceil(index)]\n\treturn value\n}\n", "const encoder = new TextEncoder()\n\nexport async function hash(message) {\n\tconst msgUint8 = encoder.encode(message) // encode as (utf-8) Uint8Array\n\tconst hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8) // hash the message\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer)) // convert buffer to byte array\n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('') // convert bytes to hex string\n\treturn hexToBase64(hashHex).replace('=', '-') // shorten from 40 to 28 chars\n}\n\nfunction hexToBase64(hexStr) {\n\treturn btoa(\n\t\t[...hexStr].reduce(\n\t\t\t(acc, _, i) => (acc += !((i - 1) & 1) ? String.fromCharCode(parseInt(hexStr.substring(i - 1, i + 1), 16)) : ''),\n\t\t\t''\n\t\t)\n\t)\n}\n", "import { isNumeric } from './helpers.js'\nconst reserved = ['false', 'true', 'null', 'undefined']\nconst delimiters = ['\"', '{', '[']\nfunction encode(rawObject) {\n\tconst params = []\n\tfor (const [key, value] of Object.entries(rawObject)) {\n\t\tif (typeof value == 'string' && !isNumeric(value) && !reserved.includes(value) && !delimiters.includes(value[0])) {\n\t\t\tparams.push(`${key}=${encodeURIComponent(value)}`)\n\t\t} else if (value !== void 0) {\n\t\t\tparams.push(`${key}=${encodeURIComponent(JSON.stringify(value))}`)\n\t\t}\n\t}\n\treturn params.join('&')\n}\nfunction decode(query) {\n\tconst encoding = query.encoding\n\tfor (const [key, value] of Object.entries(query)) {\n\t\tif (\n\t\t\tencoding == 'json' ||\n\t\t\tvalue == 'null' || // not new, always been\n\t\t\tvalue == 'true' || // NEED TO FIND-REPLACE CODE THAT USES value == 'true'\n\t\t\tvalue == 'false' || // NEED TO FIND-REPLACE CODE THAT USES value == 'false'\n\t\t\tisNumeric(value) || // NEED TO check\n\t\t\t(typeof value == 'string' && value.startsWith('\"') && value.endsWith('\"')) ||\n\t\t\t(typeof value == 'string' && value.startsWith('{') && value.endsWith('}')) ||\n\t\t\t(value.startsWith('[') && value.endsWith(']'))\n\t\t)\n\t\t\tquery[key] = JSON.parse(value)\n\t}\n\treturn query\n}\nexport { decode, encode }\n", "import { hash } from './hash.js'\nimport { encode } from './urljson.js'\n\n/*\n\tezFetch()\n\tfetch wrapper with automatic response content-type detection and handling\n\n\t- this addresses issues with ky.json() or got.json(), where a HTTP 404 NOT FOUND\n\t\tresponse with text/html can break error handling/logging, making it harder to debug\n\n\t- this also automatically handles multipart responses \n\n\targuments:\n\turl\n\tinit{headers?, body?}\n\t- first two arguments are same as native fetch\n*/\nexport async function ezFetch(_url, init = {}) {\n\tconst url = mayAdjustRequest(_url, init)\n\n\treturn fetch(url, init).then(async r => {\n\t\tconst response = await processResponse(r)\n\t\tif (!r.ok) {\n\t\t\tconsole.log('ezFetch error ' + r.status)\n\t\t\tconsole.log(response)\n\t\t\tthrow response\n\t\t}\n\t\treturn response\n\t})\n}\n\nfunction mayAdjustRequest(url, init) {\n\tconst method = init.method?.toUpperCase() || 'GET'\n\tif (method == 'POST') {\n\t\tif (!init.headers) init.headers = {}\n\t\tif (init.body) {\n\t\t\tif (!init.headers['content-type']) init.headers['content-type'] = 'application/json'\n\t\t\tif (init.headers['content-type'].toLowerCase() == 'application/json') {\n\t\t\t\t// if consumer code has pre-encoded the body, parse to verify correctness\n\t\t\t\tif (typeof init.body == 'string') init.body = JSON.parse(init.body)\n\t\t\t\tinit.body = JSON.stringify(init.body)\n\t\t\t}\n\t\t}\n\t\treturn url\n\t}\n\t// default to GET method per native fetch\n\tif (init.body) {\n\t\tif (typeof init.body != 'object') throw `init.body should be an object`\n\t\t// init.body should be an object, to be converted to GET URL search parameter strings\n\t\tif (!url.includes('?')) url += '?'\n\t\treturn `${url}${encode(init.body)}`\n\t}\n}\n\n/* \nr: a native fetch response argument\n\npotentially allow \"application/octet-stream\" as response type\nin such case it will not try to parse it as json\nalso the caller should just call dofetch2() without a serverData{}\nrather than dofetch3\n*/\nexport async function processResponse(r) {\n\tconst ct = r.headers.get('content-type') // content type is always present\n\tif (!ct) throw `missing response.header['content-type']`\n\tif (ct.includes('/json')) {\n\t\treturn r.json()\n\t}\n\tif (ct.includes('/text') || ct.includes('text/')) {\n\t\treturn r.text()\n\t}\n\tif (ct.includes('multipart')) {\n\t\tif (ct.startsWith('multipart/form-data')) return processFormData(r)\n\t\telse throw `cannot handle response content-type: '${ct}'`\n\t}\n\t// call blob() as catch-all\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Response\n\treturn r.blob()\n}\n\n/*\n\texpected response format\n\t--boundary-text-from-HTTP-headers-content-type\n\theader-key1: header-value1\n\theader-key2: header-value2\n\n\t...json, text, blob, value, etc...\n\t--boundary-text-from-HTTP-headers-content-type\n\t... same format as previous chunk ...\n\n\t--boundary-text-from-HTTP-headers-content-type--\n*/\n\nexport async function processFormData(res) {\n\tconst decoder = new TextDecoder()\n\tconst data = {}\n\ttry {\n\t\tconst form = await res.formData()\n\t\t// The key of each form entry is a string, and the value is either a string or a Blob.\n\t\t// see https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries\n\t\tfor (const [key, value] of form.entries()) {\n\t\t\tif (value.type) {\n\t\t\t\t// value is a Blob\n\t\t\t\tdata[key] = { headers: { 'content-type': value.type }, body: value }\n\t\t\t} else {\n\t\t\t\t// value is a string, assume to be application/x-jsonlines (one json encoded value per line)\n\t\t\t\t// and convert into an array of json-decoded values\n\t\t\t\tconst body = !value ? [] : value.trim().split('\\n').map(JSON.parse)\n\t\t\t\tdata[key] = { headers: { 'content-type': 'application/json' }, body }\n\t\t\t}\n\t\t}\n\t\treturn data\n\t} catch (e) {\n\t\tthrow e\n\t}\n}\n\n// key: request object reference or conputed string dataName\n// value: fetch promise or response\nconst dataCache = new Map()\n// NOTE: when caching by request object reference,\n// consumer code must call deleteCache(q) at the end of the request handling\n\n// when caching by string dataName, track entries to manage the cache size\nconst cachedDataNames = []\n// maximum number of cached dataNames, oldest will be deleted if 1000 is exceeded\nconst maxNumOfDataKeys = 360\n\n/*\n\tmemFetch()\n\t- fetch wrapper that saves cached responses into memory and recovers them for matching subsequent requests\n\t- recommended for caching responses in the backend, with the opts.q argument to cache per expressjs request object\n\t- should call deleteCache(request) at the end of request handling, to free unneeded cache\n\t\n\tSee the usage note for getDataName() to avoid non-unique request/response.\n\t\n\tArguments:\n\turl\n\tinit{headers?, body?}\n\t- first two arguments are same as native fetch\n\n\topts{q}\n\tq?: request object (passed by reference, not copy)\n\t\t- if provided, will be used as cache data key \n\t - if not provided, then a string cache data key will be computed from the request url, body, headers\n*/\nexport async function memFetch(url, init, opts = {}) {\n\tconst dataKey = opts.q || (await getDataName(url, init))\n\tlet result = dataCache.get(dataKey)\n\n\tif (!result || (typeof result != 'object' && !(result instanceof Promise))) {\n\t\tdataCache.delete(dataKey)\n\t\tresult = undefined\n\t}\n\n\tif (!result) {\n\t\ttry {\n\t\t\t// do not await so that this same promise may be reused by all subsequent requests with the same dataKey\n\t\t\tdataCache.set(\n\t\t\t\tdataKey,\n\t\t\t\tfetch(url, init).then(async r => {\n\t\t\t\t\tconst response = await processResponse(r)\n\t\t\t\t\tif (!r.ok) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t\tthrow 'memFetch error ' + r.status\n\t\t\t\t\t}\n\t\t\t\t\t// to-do: support opt.freeze to enforce deep freeze of data.json()\n\t\t\t\t\tdataCache.set(dataKey, response)\n\t\t\t\t\treturn dataCache.get(dataKey)\n\t\t\t\t})\n\t\t\t)\n\t\t\tresult = dataCache.get(dataKey)\n\t\t} catch (e) {\n\t\t\tdelete dataCache.delete(dataKey)\n\t\t\tthrow e\n\t\t}\n\t}\n\tif (typeof dataKey === 'string') manageCacheSize(dataKey)\n\treturn result\n}\n\nexport function deleteCache(key) {\n\tdelete dataCache.delete(key)\n}\n\nexport function manageCacheSize(dataKey) {\n\t// manage the number of stored keys in dataCache\n\tconst i = cachedDataNames.indexOf(dataKey)\n\tif (i !== -1) cachedDataNames.splice(i, 1) // if the dataKey already exists, delete from current place in tracking array to move to front\n\tcachedDataNames.unshift(dataKey) // add the dataKey to the front of the tracking array\n\twhile (cachedDataNames.length > maxNumOfDataKeys) {\n\t\tconst oldestDataname = cachedDataNames.pop() // delete the dataKey from the tracking array\n\t\tdataCache.delete(oldestDataname)\n\t}\n}\n\n/*\n\tNOTE: When used in client-side code, an HttpOnly cookie for a logged in user will not be\n\ttracked in init.headers below. \n*/\nexport async function getDataName(url, init) {\n\t// IMPORTANT: must ensure dataName is unique to either public or logged-in user\n\tconst dataName = url + ' | ' + init.method + ' | ' + init.body + ' | ' + JSON.stringify(init.headers)\n\treturn await hash(dataName)\n}\n\n//\nexport function clearCache(opts = {}) {\n\tif (!opts.serverData) {\n\t\tdataCache.clear()\n\t\treturn\n\t}\n\tif (typeof opts.serverData != 'object') throw `opts.serverData is not an object`\n\tfor (const k of Object.keys(opts.serverData)) {\n\t\tdelete opts.serverData[k]\n\t}\n\tif (optsServerDataNames.has(opts.serverData)) optsServerDataNames.delete(opts.serverData)\n}\n", "import { TermTypes, isNumericTerm } from './terms.js'\n\nexport const graphableTypes = new Set([\n\t'categorical',\n\t'integer',\n\t'float',\n\t'condition',\n\t'survival',\n\t'snplst',\n\t'snplocus',\n\t'geneVariant',\n\t'samplelst',\n\t'geneExpression',\n\t'dtcnv',\n\t'dtsnvindel',\n\t'dtfusion',\n\t'dtsv',\n\t'date',\n\tTermTypes.SSGSEA,\n\tTermTypes.METABOLITE_INTENSITY,\n\tTermTypes.SINGLECELL_GENE_EXPRESSION,\n\tTermTypes.SINGLECELL_CELLTYPE,\n\tTermTypes.SNP\n])\n\n/*\nisUsableTerm() will\n\n\t- centralize the \"allowed term\" logic\n\twhich can be intricate or dataset-specific \n\tfor certain terms or contexts\n\t- make it easy to handle new term types\n\nArguments:\n\n\tterm {}\n\t\t.type: 'categorical', etc.\n\t\t.child_types: []\n\t\n\t_usecase {}\n\t\t.target (REQUIRED): 'barchart', 'regression', etc\n\t\t\t- used as a switch-case \"router\" for additional use-specific logic\n\t\t\t- other parameters, if applicable, are described in the route \"handler\" \n\t\t.detail \n\t\t - a more specific detailed use case\n\t\n\n\ttermdbConfig\n\t\toptional. provides ds overrides on default rules via excludedTermtypeByTarget. for use on client\n\n\tds\n\t\toptional. provides ds overrides when the function runs on backend\n\t\tserver-side dataset object that can supply overrides (in the form of functions) to the use case logic,\n\t\tfor example, to apply role-based allowed term uses or performance-related restrictions\n\t\tto ancestor terms when a use case aggregates too many data points for a given chart type\n\nReturns\n\n\ta Set{} with zero or more of the following strings:\n\t- 'plot' if the term can be used in a plot chartType\n\t- 'branch' if the term can be used only as an expandable tree branch, but not in a plot\n\t- an empty Set means that the term has no valid uses, i.e, it cannot be used either for plotting or as a tree branch\n*/\nexport function isUsableTerm(term, _usecase, termdbConfig, ds) {\n\tconst usecase = _usecase || {}\n\n\t// may apply dataset specific override filter for a use case\n\tif (typeof ds?.usecase?.[use.target] == 'function') {\n\t\treturn ds.usecase[use.target](term, use)\n\t}\n\n\t// if (term.isprivate && !user.roleCanUse(term)) return false\n\n\tconst uses = new Set()\n\t// note: expects term.child_types to be null if term.isleaf == true\n\tconst child_types = term.child_types || []\n\n\t// default handling\n\tswitch (usecase.target) {\n\t\tcase 'barchart':\n\t\tcase 'summary':\n\t\t\tif (term.type && term.type !== 'survival') uses.add('plot')\n\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'summaryInput':\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\tif (term.type && term.type !== 'survival') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'matrix':\n\t\t\tif (term.type) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'table':\n\t\t\tif (usecase.detail == 'term') uses.add('plot')\n\t\t\tif (child_types.length > 1) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'sampleScatter':\n\t\t\tif (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'runChart':\n\t\t\tif (usecase.detail == 'date') {\n\t\t\t\tif (term.type == 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (child_types.includes('date')) uses.add('branch')\n\t\t\t} else if (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term) && term.type != 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'frequencyChart':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (child_types.includes('date')) uses.add('branch')\n\t\t\t} else if (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term) && term.type != 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'numericDictTermCluster':\n\t\t\tif (!usecase.detail?.exclude?.includes(term.id)) {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) {\n\t\t\t\t\tuses.add('branch')\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'numericTermCollections':\n\t\t\tif (usecase.detail?.termIds?.includes(term.id)) uses.add('plot')\n\t\t\tif (usecase.detail?.branchIds?.includes(term.id)) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'profileForms':\n\t\t\tif (!term.isleaf) {\n\t\t\t\tconst ancestors = term.id.split('__').length //depends on using the __ naming convension!\n\t\t\t\tif (ancestors == 3) {\n\t\t\t\t\t// 3rd level term is a domain, we show the templates associated to this domain\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t} else if (ancestors < 3) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\t// case 'boxplot':\n\t\t// \tif (term.type == 'float' || term.type == 'integer') uses.add('plot')\n\t\t// \tif (usecase.detail === 'term2' && hasNumericChild(child_types)) uses.add('branch')\n\t\t// \treturn uses\n\n\t\tcase 'cuminc':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'condition') uses.add('plot')\n\t\t\t\tif (child_types.includes('condition')) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\tif (term.type && term.type != 'condition' && term.type != 'survival') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['condition', 'survival'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'survival':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'survival') uses.add('plot')\n\t\t\t\tif (child_types.includes('survival')) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\tif (term.type && term.type != 'survival') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'regression':\n\t\t\tif (usecase.detail == 'outcome') {\n\t\t\t\tif (usecase.regressionType == 'linear') {\n\t\t\t\t\tif (term.type == 'float' || term.type == 'integer') uses.add('plot')\n\t\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t\tif (usecase.regressionType == 'logistic') {\n\t\t\t\t\tif (term.type && term.type != 'survival') uses.add('plot')\n\t\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival'])) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t} else if (usecase.regressionType == 'cox') {\n\t\t\t\t\tif (term.type == 'condition' || term.type == 'survival') uses.add('plot')\n\t\t\t\t\tif (child_types.includes('condition') || child_types.includes('survival')) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (usecase.detail == 'independent') {\n\t\t\t\tif (term.type == 'float' || term.type == 'integer' || term.type == 'categorical' || term.type == 'samplelst')\n\t\t\t\t\tuses.add('plot')\n\t\t\t\tif (hasChildTypes(child_types, ['categorical', 'float', 'integer'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'filter':\n\t\t\t// apply \"exlst\" to other targets as needed\n\t\t\tconst exlst = termdbConfig?.excludedTermtypeByTarget?.filter\n\t\t\tif (exlst) {\n\t\t\t\tif (graphableTypes.has(term.type) && !exlst.includes(term.type)) uses.add('plot')\n\t\t\t\tif (child_types.find(t => !exlst.includes(t))) uses.add('branch') // there's a non-excluded child type, allow branch to show\n\t\t\t\treturn uses\n\t\t\t}\n\t\t// no specific rule for filter. pass and use default rules\n\n\t\tcase 'correlationVolcano':\n\t\t\tif (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\tdefault:\n\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\t}\n}\n\n// determine if the term has at least one child type that\n// is not excluded\nfunction hasAllowedChildTypes(child_types, excluded_types) {\n\tif (!child_types.length) {\n\t\t// term does not have children\n\t\treturn false\n\t}\n\tif (!excluded_types?.length) {\n\t\t// no excluded types\n\t\treturn true\n\t}\n\tif (child_types.some(type => !excluded_types.includes(type))) {\n\t\t// at least one child type is not excluded\n\t\treturn true\n\t}\n}\n\nfunction hasNumericChild(child_types) {\n\treturn child_types.includes('float') || child_types.includes('integer')\n}\n\nfunction hasChildTypes(child_types, expected_types) {\n\tfor (const a of expected_types) {\n\t\tif (child_types.includes(a)) return true\n\t}\n}\n", "import { select } from 'd3-selection'\n\nconst jwtByDsRouteStr = localStorage.getItem('jwtByDsRoute') || `{}`\nconst jwtByDsRoute = JSON.parse(jwtByDsRouteStr)\n\n/*\n\tsetTokenByDsRoute() sets this storage item:\n\n\tjwtByDsRoute = {\n\t\t[dslabel]: { // the dataset that is being protected, should match one of the serverconfig.dsCredentials key\n\t\t\t[route]: // the route that is being protected, should match one of the serverconfig.dsCredentials[dslabel] key\n\t\t\t\t\"...jwt...string...\" // ProteinPaint-issued jwt from a `/jwt-status` or `/dslogin` response, \n\t\t\t\t // which also includes dslabel and route to use as nested keys for this jwtByDsRoute\n\t\t}\n\t}\n\t\n\tNote that jwtByDsRoute does not have a nesting level of embedder, unlike serverconfig.dsCredentials, since\n\tthe embedder is detected directly from the winddow.location.hostname.\n\n\tThe stored token will be submitted as part of Vocab.mayGetAuthHeaders() or getSavedToken().\n*/\nexport function setTokenByDsRoute(dslabel, route, jwt) {\n\tif (!jwtByDsRoute[dslabel]) jwtByDsRoute[dslabel] = {}\n\tif (jwt) jwtByDsRoute[dslabel][route] = jwt\n\telse delete jwtByDsRoute[dslabel][route]\n\tlocalStorage.setItem('jwtByDsRoute', JSON.stringify(jwtByDsRoute))\n}\n\n// get jwt string directly from localStorage/jwtByDsRoute tracking object\nexport function getSavedToken(dslabel, route) {\n\treturn jwtByDsRoute[dslabel]?.[route] || jwtByDsRoute[dslabel]?.['/**']\n}\n\nexport function mayAddJwtToRequest(init, body, url) {\n\tif (init.headers.authorization) return\n\tlet dslabel = body?.dslabel // || body.mass?.vocab.dslabel || body.tracks?.find(t => t.dslabel)?.dslabel\n\tif (!dslabel) {\n\t\tconst param = url\n\t\t\t.split('?')[1]\n\t\t\t?.split('&')\n\t\t\t.find(kv => kv.includes('dslabel'))\n\t\tif (!param) return\n\t\tlet value = decodeURIComponent(param.split('=')[1])\n\t\tif (value.startsWith('{') && value.endsWith('}')) {\n\t\t\tvalue = JSON.parse(value)\n\t\t\tdslabel = value.dslabel || value.mass?.vocab.dslabel || value.tracks?.find(t => t.dslabel)?.dslabel\n\t\t} else {\n\t\t\tdslabel = value\n\t\t}\n\t}\n\tif (!dslabel || !jwtByDsRoute[dslabel]) return\n\tconst h = url.split('//')\n\tconst postProtocolStr = h[1] || h[0] // handle a url such as '://something.abc'\n\tconst preQuestionMarkStr = postProtocolStr.split('?')[0]\n\tconst pathSegments = preQuestionMarkStr.split('/')\n\tlet route = pathSegments.find(p => p != '' && !p.includes(':') && !p.includes('.'))\n\t// TODO: should not have to do this hardcoded mapping, ideally routes that are\n\t// protected together will share the same initial path segment\n\n\tconst jwt = jwtByDsRoute[dslabel][route] || jwtByDsRoute[dslabel]['/**']\n\tif (jwt) init.headers.authorization = 'Bearer ' + btoa(jwt)\n}\n\nconst dsAuthOk = new Set()\nlet dsAuth, authUi, authUiHolder\n\nexport let includeEmbedder = false\n\n/*\n\topts{}\n\t.dsAuth: required, array of dataset names that require login\n\t.authUi: optional, a custom login UI function to launch as needed\n\t.holder: optional, a d3-wrapped selection to hold the auth UI\n*/\nexport async function setDsAuthOk(opts, dofetch3) {\n\tdsAuth = opts.dsAuth\n\tauthUi = opts.ui || defaultAuthUi\n\tauthUiHolder = opts.holder || select('body')\n\tfor (const auth of dsAuth) {\n\t\t// fillin all the dslabels that has an active session\n\t\t// so that an unnecessary login form will not be shown\n\t\tif (auth.insession) dsAuthOk.add(auth)\n\t\telse {\n\t\t\t// check if there is a PP-server generated session token that has been saved from a previous login\n\t\t\tconst { dslabel, route } = auth\n\t\t\tconst jwt = getSavedToken(dslabel, route)\n\t\t\tif (jwt) {\n\t\t\t\tconst payload = JSON.parse(atob(jwt.split('.')[1]))\n\t\t\t\tif (payload.exp && Math.ceil(Date.now() / 1000) > payload.exp) continue\n\t\t\t\tconst data = await dofetch3('/jwt-status', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t//authorization: `Bearer ${btoa(jwt)}`\n\t\t\t\t\t\t[auth.headerKey]: jwt\n\t\t\t\t\t},\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tdslabel,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\tembedder: location.hostname\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (data.ok || data.status == 'ok') {\n\t\t\t\t\tdsAuthOk.add(auth)\n\t\t\t\t\tauth.insession = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tincludeEmbedder = opts.dsAuth?.length > 0 || false\n}\n\nexport function getRequiredAuth(dslabel, route) {\n\tif (!dsAuth || !Array.isArray(dsAuth)) return\n\tfor (const a of dsAuth) {\n\t\t// wildcard route '*' is transformed by server auth.js into '/**' to support glob-pattern matching,\n\t\t// since a single character '*' is interpreted by glob as a file, so need to also detect '/**' route\n\t\tif (a.dslabel == dslabel && (a.route == route || a.route == '*' || a.route == '/**')) return a\n\t}\n}\n\n// check if a user is logged in, usually checked together with requiredAuth in termdb/config,\n// so access to unprotected ds/routes should not be affected by this check\nexport function isInSession(dslabel, route) {\n\tif (!dslabel) return false\n\tfor (const a of dsAuthOk) {\n\t\tif (a.dslabel == dslabel && (a.route == route || a.route == '/**')) return true\n\t}\n\t// no matching sessions found for this dslabel and route\n\treturn false\n}\n\n/* \n\tmayShowAuthUi() is the client-side \"gatekeeper\"\n\tmethod to check if a dataset requires credentials\n*/\n\nexport async function mayShowAuthUi(init, path, opts = {}) {\n\tconst ok = { status: 'ok' }\n\tif (!dsAuth || path.endsWith('jwt-status')) return ok\n\n\tconst body = JSON.parse(init.body || `{}`)\n\tconst params = (path.split('?')[1] || '').split('&').reduce((obj, kv) => {\n\t\tconst [key, value] = kv.split('=')\n\t\tobj[key] = value\n\t\treturn obj\n\t}, {})\n\tconst q = Object.assign({}, body, params)\n\tconst route = ((path.split('?')[0] || '').split('//')[1] || '').split('/').slice(1).join('/')\n\n\tfor (const a of dsAuth) {\n\t\tif (q.dslabel == a.dslabel && (a.route == '/**' || route == a.route)) {\n\t\t\tif (dsAuthOk.has(a)) return ok\n\t\t\t// dofetch should show the authUi only when all routes ('/**') are protected\n\t\t\t// otherwise, the authUi should be opened only when requesting data from a protected route,\n\t\t\t// that will be determined within feature code such as for 'termdb', 'burden', etc\n\t\t\telse if (a.route != '/**') return ok\n\t\t\telse if (a.type == 'basic') return await authUi(a.dslabel, a, opts)\n\t\t\telse if (a.type == 'jwt') {\n\t\t\t\t// assume the embedder/portal provides the login UI\n\t\t\t\t// so no need to do anything here\n\t\t\t} else if (a.type == 'forbidden') {\n\t\t\t\talert('Forbidden access')\n\t\t\t\t// don't do anything\n\t\t\t} else throw `unsupported dsAuth type='${a.type}'`\n\t\t}\n\t}\n\treturn ok\n}\n\n/*\n\tthis is the default login UI, may be overriden\n\tby an optional different form, for example if PP \n\tis embedded in another portal\n*/\nasync function defaultAuthUi(dslabel, auth, opts = {}) {\n\tconst mask = authUiHolder\n\t\t.append('div')\n\t\t.style('position', 'fixed')\n\t\t.style('top', 0)\n\t\t.style('left', 0)\n\t\t.style('height', '100%')\n\t\t.style('width', '100%')\n\t\t.style('margin', 0)\n\t\t.style('padding', '20px')\n\t\t.style('background-color', 'rgb(150,150,150)')\n\n\tconst form = mask.append('div').style('opacity', 1)\n\tform.append('div').html(`Restricted dataset '${dslabel}'`)\n\tform.append('span').html('Please enter password ')\n\n\tconst pwd = form.append('input').attr('type', 'password')\n\tpwd.node().focus()\n\n\tconst btn = form.append('button').html('Submit')\n\n\treturn new Promise((resolve, reject) => {\n\t\tfunction login() {\n\t\t\tfetch('/dslogin', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Basic ${btoa(pwd.property('value'))}`\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ dslabel, route: auth.route, embedder: window.location.hostname })\n\t\t\t})\n\t\t\t\t.then(res => res.json())\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (res.error) throw res.error\n\n\t\t\t\t\tmask.remove()\n\t\t\t\t\tdsAuthOk.add(auth)\n\t\t\t\t\tif (res.jwt) {\n\t\t\t\t\t\tsetTokenByDsRoute(dslabel, res.route, res.jwt)\n\t\t\t\t\t}\n\t\t\t\t\tif (!opts.setDomRefs) window.location.reload()\n\t\t\t\t\telse resolve(dslabel)\n\t\t\t\t})\n\t\t\t\t.catch(e => {\n\t\t\t\t\talert('login error: ' + e)\n\t\t\t\t\t// allow to reuse the login UI, do not hide or reject\n\t\t\t\t\t// mask.remove()\n\t\t\t\t\t// reject(e)\n\t\t\t\t})\n\t\t}\n\t\tbtn.on('click', login)\n\t\tpwd.on('change', login)\n\n\t\tif (opts.setDomRefs)\n\t\t\topts.setDomRefs({\n\t\t\t\tpwd,\n\t\t\t\tbtn,\n\t\t\t\tmask,\n\t\t\t\tauthUiHolder\n\t\t\t})\n\t})\n}\n", "import { deepFreeze, sleep } from '#rx'\nimport { encode, getDataName, processResponse } from '#shared/index.js'\nimport { mayShowAuthUi, mayAddJwtToRequest, includeEmbedder, setDsAuthOk } from './auth.js'\nexport * from './auth.js'\nexport { processFormData } from '#shared/index.js'\n\n/*\n\tpath: URL\n\targ: HTTP request body\n\topts: see dofetch2() opts argument\n*/\nexport function dofetch(path, arg, opts = null) {\n\tif (opts && typeof opts == 'object') {\n\t\tif (opts.serverData && typeof opts.serverData == 'object') {\n\t\t\tif (!dofetch.serverData) {\n\t\t\t\tdofetch.serverData = opts.serverData\n\t\t\t} else if (!opts.serverData) {\n\t\t\t\topts.serverData = dofetch.serverData\n\t\t\t}\n\t\t}\n\t\treturn dofetch2(\n\t\t\tpath,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(arg)\n\t\t\t},\n\t\t\topts\n\t\t)\n\t} else {\n\t\t// path should be \"path\" but not \"/path\"\n\t\tif (path[0] == '/') {\n\t\t\tpath = path.slice(1)\n\t\t}\n\n\t\tconst jwt = sessionStorage.getItem('jwt')\n\t\tif (jwt) {\n\t\t\targ.jwt = jwt\n\t\t}\n\n\t\tlet url = path\n\t\tconst host = sessionStorage.getItem('hostURL') || window.testHost || ''\n\t\tif (host) {\n\t\t\t// hostURL can end with / or not, must use 'host/path'\n\t\t\tif (host.endsWith('/')) {\n\t\t\t\turl = host + path\n\t\t\t} else {\n\t\t\t\turl = host + '/' + path\n\t\t\t}\n\t\t}\n\n\t\treturn fetch(\n\t\t\tnew Request(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(arg)\n\t\t\t})\n\t\t).then(r => r.json())\n\t}\n}\n\nexport function dofetch2(path, init = {}, opts = {}) {\n\t/*\n\tpath\"\" string URL path\n\n\tinit{}\n\t\twill be supplied as the second argument to\n\t\tthe native fetch api, so the method, headers, body\n\t\tmay be optionally supplied in the \"init\" argument\n\t\tsee https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n\n\topts{}: all other optional arguments that are not related to the native fetch init argument\n\t\t.serverData{} an object for caching fetch Promise \n\t*/\n\t// path should be \"path\" but not \"/path\"\n\tif (path[0] == '/') {\n\t\tpath = path.slice(1)\n\t}\n\n\tlet url = path\n\tconst host = sessionStorage.getItem('hostURL') || window.testHost || ''\n\tif (host) {\n\t\t// hostURL can end with / or not, must use 'host/path'\n\t\tif (host.endsWith('/')) {\n\t\t\turl = host + path\n\t\t} else {\n\t\t\turl = host + '/' + path\n\t\t}\n\t}\n\n\t// create a reference to be able to detect body params, easier than\n\t// getting params once converted to a URL\n\tconst body = init.body || {}\n\t// this may convert a GET into a POST method, and\n\t// encode the payload either in the URL or request body\n\turl = mayAdjustRequest(url, init)\n\n\tif (!init.headers) {\n\t\tinit.headers = {}\n\t}\n\n\tif (!init.headers['content-type'] && init.body) {\n\t\tinit.headers['content-type'] = 'application/json'\n\t}\n\n\t// this jwt is site-wide for a particular PP host, not dslabel-specific\n\tconst jwt = sessionStorage.getItem('jwt')\n\tif (jwt) {\n\t\tinit.headers.authorization = 'Bearer ' + jwt\n\t}\n\n\t/*\n\t\tthis is client-side \"gatekeeper\", will not proceed\n\t\tto the usual request handling unless no credentials\n\t\tare required or a valid session has already been established\n\t*/\n\treturn mayShowAuthUi(init, url).then(async () => {\n\t\tif (!jwt) mayAddJwtToRequest(init, body, url)\n\t\tif (opts.serverData) {\n\t\t\treturn namedFetch(url, init, opts)\n\t\t} else {\n\t\t\treturn fetch(url, init).then(processResponse)\n\t\t}\n\t})\n}\n\n// key: opts.serverData object\n// value: array of cached dataNames\nconst optsServerDataNames = new WeakMap() // do not prevent garbage collection of unneeded opts.serverData in consumer code\n/*\n\tnamedFetch()\n\t- same arguments and behavior as ezFetch() above, except opts.serverData is expected to cache response by computed data name\n\t- preserves the caching expectations from \n\t\n\topts{}\n\tserverData: optional plain object to store response by dataName (string) keys\n\t\t- if a computed dataName is found as a key in this object, the cached response will be reused to fulfill the fetch\n\t\t- note that the plain object as storage is to support legacy dofetch code\n*/\nexport async function namedFetch(url, init, opts = {}) {\n\tif (!opts.serverData) throw `use ezFetch() if a fetched response is not meant to be cached`\n\tif (typeof opts.serverData != 'object') throw `opts.serverData is not an object`\n\n\tlet result\n\tconst dataName = await getDataName(url, init)\n\tif (opts.serverData[dataName]) {\n\t\t// if (init.signal?.aborted) throw `stale sequenceId`\n\t\tif (init.signal) {\n\t\t\t// should not reuse a response if the abortController.signal option has been aborted,\n\t\t\t// sleep() below allows sufficient time for the abort() to be called in rx AppApi.dispatch() or elsewhere,\n\t\t\t// otherwise the cached response copy will be returned too soon and cause race-condition issues;\n\t\t\t// this fix is tested in hierCluster.integration.spec.js 'avoid race condition - reused fetch response cache'\n\t\t\tawait sleep(0)\n\t\t\tif (init.signal.aborted) throw `stale sequenceId`\n\t\t}\n\n\t\tresult = opts.serverData[dataName].clone\n\t\t\t? await processResponse(opts.serverData[dataName].clone())\n\t\t\t: structuredClone(opts.serverData[dataName])\n\t}\n\n\tif (!result || (typeof result != 'object' && !(result instanceof Promise))) {\n\t\tdelete opts.serverData[dataName]\n\t\tresult = undefined\n\t}\n\n\tif (!result) {\n\t\ttry {\n\t\t\tconst res = await fetch(url, init)\n\t\t\tresult = await processResponse(res.clone())\n\t\t\t// in case this fetch was cancelled with AbortController.signal,\n\t\t\t// then the result may be another Promise instead of a data object,\n\t\t\t// as observed when rapidly changing the gdc cohort filter\n\t\t\tif (typeof result == 'object' && !(result instanceof Promise)) {\n\t\t\t\t// TODO: make decoded caching as default, since storing as a\n\t\t\t\t// fetch Response interface can be problematic when the fetch is aborted\n\t\t\t\tif (opts.cacheAs == 'decoded') {\n\t\t\t\t\t// should prefer to store results as a deeply frozen object instead of a Response interface,\n\t\t\t\t\t// but must not return the same object to be reused by different requests\n\t\t\t\t\tdeepFreeze(result)\n\t\t\t\t\topts.serverData[dataName] = result\n\t\t\t\t\tresult = structuredClone(result)\n\t\t\t\t} else {\n\t\t\t\t\t// per https://developer.mozilla.org/en-US/docs/Web/API/Response/clone,\n\t\t\t\t\t// **should not use (.clone) to read very large bodies in parallel** at different speeds,\n\t\t\t\t\t// may also mean(?) to not persist/store the Response for a long time as is being done here\n\t\t\t\t\topts.serverData[dataName] = res\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tdelete opts.serverData[dataName]\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t// manage opts.serverData cache size\n\tif (!optsServerDataNames.has(opts.serverData)) optsServerDataNames.set(opts.serverData, [])\n\tconst keys = optsServerDataNames.get(opts.serverData)\n\tconst i = keys.indexOf(dataName)\n\tif (i > 0) {\n\t\t// move this cached response as the most recent entry, by object key\n\t\tkeys.splice(i, 1)\n\t}\n\tkeys.unshift(dataName)\n\tconst maxKeys = 360\n\twhile (keys.length > maxKeys) {\n\t\tconst oldestDataKey = keys.pop() // delete the dataName from the tracking array\n\t\tdelete opts.serverData[oldestDataKey]\n\t}\n\treturn result\n}\n\nconst defaultServerDataCache = {}\nexport function dofetch3(path, init = {}, opts = {}) {\n\t/*\n\t\tThis is a convenience function that sets a default serverData object\n\t*/\n\topts.serverData = defaultServerDataCache\n\treturn dofetch2(path, init, opts)\n}\n\nexport function clearServerDataCache(opts = {}) {\n\tconst cache = opts?.serverData || defaultServerDataCache\n\tif (!cache) return\n\tfor (const k of Object.keys(cache)) {\n\t\tdelete cache[k]\n\t}\n}\n\nconst urlMaxLength = 2000 // if a GET url is longer than this, will be converted to POST of the same route\n\n/*\t\n\turl: full request url with host/path\n\n\tinit {}\n\t\tsame as the init argument for dofetch2\n\t\twill be supplied as the second argument to\n\t\tthe native fetch api, so the method, headers, body\n\t\tmay be optionally supplied in the \"init\" argument\n\t\tsee https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n*/\nfunction mayAdjustRequest(url, init) {\n\tconst hostname = window.location.hostname\n\tconst method = (init.method && init.method.toUpperCase()) || 'GET'\n\tif (method == 'POST') {\n\t\t// assume a minimal URL path + parameters for a POST request\n\t\t// since the payload will be in the request body\n\t\tif (typeof init.body == 'string') init.body = JSON.parse(init.body)\n\t\tif (!init.body.embedder && includeEmbedder) init.body.embedder = hostname\n\t\tinit.body = JSON.stringify(init.body)\n\t\treturn url\n\t}\n\n\tif (method != 'GET' && method != 'DELETE' && method != 'PUT') {\n\t\tthrow `unsupported init.method='${method}': must be undefined or GET or POST or DELETE or PUT`\n\t}\n\n\tif (init.body) {\n\t\t// init.body should be an object, to be converted to either\n\t\t// (a) GET URL search parameter strings, OR\n\t\t// (b) POST body, JSON-encoded\n\t\tif (!init.body.embedder && includeEmbedder) init.body.embedder = hostname\n\n\t\tconst params = encode(init.body)\n\t\tif (!url.includes('?')) url += '?'\n\t\turl += params\n\t}\n\n\tif (!url.includes('embedder=') && includeEmbedder) {\n\t\tconst sep = url.includes('?') ? '&' : '?'\n\t\turl += `${sep}embedder=${hostname}`\n\t}\n\n\tif (url.length < urlMaxLength) {\n\t\t// the request body has been encoded as URL parameters, so can delete it\n\t\tif (init.body) delete init.body\n\t\treturn url\n\t}\n\n\t// convert to a POST request because the URL is too long\n\t// !!! NOTE: the requested server route must support both GET and POST, for example, app.all('/route', handler)\n\tinit.method = 'POST'\n\tconst [hostpath, query] = url.split('?') // must use url but not path\n\n\tif (init.body) {\n\t\t// assumes that all or most of the url string length were from parameters in the init.body argument to dofetch2\n\t\tinit.body = JSON.stringify(init.body)\n\t} else {\n\t\t// the url parameters were provided directly in the path argument to dofetch2()\n\t\tconst params = {}\n\t\t// decode URL search parameters, if available\n\t\tif (query)\n\t\t\t// TODO: !!! use urljson.decode here !!!\n\t\t\tquery.split('&').forEach(p => {\n\t\t\t\tconst [k, v] = p.split('=')\n\t\t\t\tconst decodedVal = decodeURIComponent(v)\n\t\t\t\ttry {\n\t\t\t\t\tparams[k] = JSON.parse(decodedVal)\n\t\t\t\t} catch {\n\t\t\t\t\tparams[k] = decodedVal\n\t\t\t\t}\n\t\t\t})\n\t\tif (!params.embedder && includeEmbedder) params.embedder = hostname\n\t\tinit.body = JSON.stringify(params)\n\t}\n\n\treturn hostpath\n}\n\n// see opts argument to setDsAuthOk\nexport function setAuth(opts) {\n\tsetDsAuthOk(opts, dofetch3)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["mclasslabel2key", "i", "i", "dtsnvindel", "chr", "k2c", "i", "i", "i", "mclassnonstandard", "format", "tmp", "alt", "i", "hash", "i", "isNumeric", "dofetch3", "optsServerDataNames", "i"]
|
|
7
7
|
}
|