@genome-spy/core 0.64.0 → 0.66.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.
Files changed (285) hide show
  1. package/dist/bundle/{index-CCJIjehY.js → AbortablePromiseCache-CcuMrnn7.js} +22 -91
  2. package/dist/bundle/browser-BRemItdO.js +138 -0
  3. package/dist/bundle/index-BatuyGAI.js +271 -0
  4. package/dist/bundle/index-ByuE8dvu.js +332 -0
  5. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  6. package/dist/bundle/{index-C08YCM2T.js → index-D-w7Mmt9.js} +246 -126
  7. package/dist/bundle/index-D28m8tSW.js +1607 -0
  8. package/dist/bundle/index-D74H8TTz.js +508 -0
  9. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  10. package/dist/bundle/index.es.js +15034 -13842
  11. package/dist/bundle/index.js +223 -237
  12. package/dist/bundle/inflate-GtwLkvSP.js +1048 -0
  13. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  14. package/dist/schema.json +22 -4
  15. package/dist/src/config/scaleDefaults.d.ts +8 -0
  16. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  17. package/dist/src/config/scaleDefaults.js +45 -0
  18. package/dist/src/data/collector.d.ts +7 -2
  19. package/dist/src/data/collector.d.ts.map +1 -1
  20. package/dist/src/data/collector.js +13 -2
  21. package/dist/src/data/dataFlow.d.ts +20 -42
  22. package/dist/src/data/dataFlow.d.ts.map +1 -1
  23. package/dist/src/data/dataFlow.js +57 -80
  24. package/dist/src/data/flowHandle.d.ts +15 -0
  25. package/dist/src/data/flowHandle.d.ts.map +1 -0
  26. package/dist/src/data/flowHandle.js +13 -0
  27. package/dist/src/data/flowInit.d.ts +85 -0
  28. package/dist/src/data/flowInit.d.ts.map +1 -0
  29. package/dist/src/data/flowInit.js +238 -0
  30. package/dist/src/data/flowInit.test.d.ts +2 -0
  31. package/dist/src/data/flowInit.test.d.ts.map +1 -0
  32. package/dist/src/data/flowOptimizer.d.ts +6 -4
  33. package/dist/src/data/flowOptimizer.d.ts.map +1 -1
  34. package/dist/src/data/flowOptimizer.js +29 -14
  35. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  36. package/dist/src/data/sources/lazy/bamSource.js +1 -1
  37. package/dist/src/data/sources/lazy/bigBedSource.js +1 -1
  38. package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
  39. package/dist/src/data/sources/lazy/gff3Source.d.ts +2 -6
  40. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  41. package/dist/src/data/sources/lazy/gff3Source.js +4 -8
  42. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  43. package/dist/src/data/sources/lazy/indexedFastaSource.js +17 -17
  44. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  45. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  46. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  47. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  48. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  49. package/dist/src/data/sources/lazy/tabixSource.js +1 -1
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  52. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  53. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  54. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  55. package/dist/src/encoder/encoder.d.ts +1 -1
  56. package/dist/src/encoder/encoder.d.ts.map +1 -1
  57. package/dist/src/encoder/encoder.js +1 -1
  58. package/dist/src/genome/scaleLocus.d.ts +39 -0
  59. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  60. package/dist/src/genome/scaleLocus.js +76 -0
  61. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  62. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  63. package/dist/src/genomeSpy/canvasExport.js +66 -0
  64. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  65. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  66. package/dist/src/genomeSpy/containerUi.js +78 -0
  67. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  68. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  69. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  70. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  71. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  73. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  74. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/interactionController.js +371 -0
  76. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  77. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  78. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  79. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  80. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  81. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  82. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  83. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  84. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  85. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  86. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  87. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  88. package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
  89. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  90. package/dist/src/genomeSpy/viewDataInit.js +41 -0
  91. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  92. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  93. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  94. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  95. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  96. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  97. package/dist/src/genomeSpy.d.ts +17 -72
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +180 -789
  100. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  101. package/dist/src/gl/webGLHelper.d.ts +2 -2
  102. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  103. package/dist/src/gl/webGLHelper.js +4 -4
  104. package/dist/src/index.d.ts.map +1 -1
  105. package/dist/src/index.js +2 -12
  106. package/dist/src/marks/mark.d.ts +1 -0
  107. package/dist/src/marks/mark.d.ts.map +1 -1
  108. package/dist/src/marks/mark.js +26 -3
  109. package/dist/src/{view → scales}/axisResolution.d.ts +12 -14
  110. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  111. package/dist/src/{view → scales}/axisResolution.js +38 -12
  112. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  113. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  114. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  115. package/dist/src/scales/scaleDomainAggregator.js +162 -0
  116. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  117. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  118. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  119. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  120. package/dist/src/scales/scaleInstanceManager.js +313 -0
  121. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  122. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  123. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  124. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  125. package/dist/src/scales/scaleInteractionController.js +336 -0
  126. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  127. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  128. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  129. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  130. package/dist/src/scales/scalePropsResolver.js +74 -0
  131. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -31
  132. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  133. package/dist/src/scales/scaleResolution.js +658 -0
  134. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  135. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  136. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  137. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  138. package/dist/src/scales/scaleRules.d.ts +16 -0
  139. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  140. package/dist/src/scales/scaleRules.js +103 -0
  141. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  142. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  143. package/dist/src/spec/channel.d.ts +13 -18
  144. package/dist/src/spec/sampleView.d.ts +3 -2
  145. package/dist/src/spec/scale.d.ts +6 -0
  146. package/dist/src/types/embedApi.d.ts +5 -0
  147. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  148. package/dist/src/types/viewContext.d.ts +1 -1
  149. package/dist/src/view/concatView.d.ts +18 -0
  150. package/dist/src/view/concatView.d.ts.map +1 -1
  151. package/dist/src/view/concatView.js +73 -0
  152. package/dist/src/view/concatView.test.d.ts +2 -0
  153. package/dist/src/view/concatView.test.d.ts.map +1 -0
  154. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  155. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  156. package/dist/src/view/containerMutationHelper.js +114 -0
  157. package/dist/src/view/containerView.d.ts +0 -7
  158. package/dist/src/view/containerView.d.ts.map +1 -1
  159. package/dist/src/view/containerView.js +0 -10
  160. package/dist/src/view/facetView.d.ts.map +1 -1
  161. package/dist/src/view/facetView.js +0 -14
  162. package/dist/src/view/flowBuilder.d.ts +2 -2
  163. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  164. package/dist/src/view/flowBuilder.js +21 -4
  165. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  166. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  167. package/dist/src/view/gridView/gridChild.js +32 -6
  168. package/dist/src/view/gridView/gridView.d.ts +39 -1
  169. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  170. package/dist/src/view/gridView/gridView.js +113 -42
  171. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  172. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  173. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  174. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  175. package/dist/src/view/gridView/scrollbar.js +184 -69
  176. package/dist/src/view/gridView/selectionRect.d.ts +8 -4
  177. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  178. package/dist/src/view/gridView/selectionRect.js +28 -3
  179. package/dist/src/view/gridView/selectionRect.test.d.ts +2 -0
  180. package/dist/src/view/gridView/selectionRect.test.d.ts.map +1 -0
  181. package/dist/src/view/layerView.d.ts +14 -0
  182. package/dist/src/view/layerView.d.ts.map +1 -1
  183. package/dist/src/view/layerView.js +66 -0
  184. package/dist/src/view/layerView.test.d.ts +2 -0
  185. package/dist/src/view/layerView.test.d.ts.map +1 -0
  186. package/dist/src/view/paramMediator.d.ts +2 -1
  187. package/dist/src/view/paramMediator.d.ts.map +1 -1
  188. package/dist/src/view/paramMediator.js +13 -1
  189. package/dist/src/view/testUtils.d.ts.map +1 -1
  190. package/dist/src/view/testUtils.js +18 -5
  191. package/dist/src/view/unitView.d.ts.map +1 -1
  192. package/dist/src/view/unitView.js +52 -12
  193. package/dist/src/view/view.d.ts +23 -7
  194. package/dist/src/view/view.d.ts.map +1 -1
  195. package/dist/src/view/view.js +61 -5
  196. package/dist/src/view/viewDispose.test.d.ts +2 -0
  197. package/dist/src/view/viewDispose.test.d.ts.map +1 -0
  198. package/dist/src/view/viewUtils.d.ts +4 -4
  199. package/dist/src/view/viewUtils.d.ts.map +1 -1
  200. package/dist/src/view/viewUtils.js +19 -15
  201. package/dist/src/view/viewUtils.test.d.ts +2 -0
  202. package/dist/src/view/viewUtils.test.d.ts.map +1 -0
  203. package/package.json +10 -10
  204. package/dist/bundle/__vite-browser-external-C--ziKoh.js +0 -8
  205. package/dist/bundle/_commonjsHelpers-DjF3Plf2.js +0 -26
  206. package/dist/bundle/index-5ajWdKly.js +0 -1319
  207. package/dist/bundle/index-B03-Om4z.js +0 -274
  208. package/dist/bundle/index-BftNdA0O.js +0 -27
  209. package/dist/bundle/index-Bg7C4Xat.js +0 -2750
  210. package/dist/bundle/index-C3QR8Lv6.js +0 -2131
  211. package/dist/bundle/index-DTcHjAHp.js +0 -505
  212. package/dist/bundle/index-DnIkxb0L.js +0 -1025
  213. package/dist/bundle/index-Ww3TAo6_.js +0 -71
  214. package/dist/bundle/index-g8iXgW0W.js +0 -651
  215. package/dist/bundle/long-B-FASCSo.js +0 -2387
  216. package/dist/bundle/remoteFile-BuaqFGWk.js +0 -94
  217. package/dist/src/data/collector.test.js +0 -138
  218. package/dist/src/data/dataFlow.test.js +0 -5
  219. package/dist/src/data/flow.test.js +0 -81
  220. package/dist/src/data/flowNode.test.js +0 -50
  221. package/dist/src/data/flowOptimizer.test.js +0 -204
  222. package/dist/src/data/formats/fasta.test.js +0 -27
  223. package/dist/src/data/sources/inlineSource.test.js +0 -63
  224. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  225. package/dist/src/data/transforms/aggregate.test.js +0 -134
  226. package/dist/src/data/transforms/clone.test.js +0 -11
  227. package/dist/src/data/transforms/coverage.test.js +0 -238
  228. package/dist/src/data/transforms/filter.test.js +0 -20
  229. package/dist/src/data/transforms/flatten.test.js +0 -96
  230. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  231. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  232. package/dist/src/data/transforms/formula.test.js +0 -25
  233. package/dist/src/data/transforms/identifier.test.js +0 -92
  234. package/dist/src/data/transforms/pileup.test.js +0 -70
  235. package/dist/src/data/transforms/project.test.js +0 -32
  236. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  237. package/dist/src/data/transforms/regexFold.test.js +0 -201
  238. package/dist/src/data/transforms/sample.test.js +0 -38
  239. package/dist/src/data/transforms/stack.test.js +0 -91
  240. package/dist/src/encoder/accessor.test.js +0 -162
  241. package/dist/src/encoder/encoder.test.js +0 -105
  242. package/dist/src/genome/genome.test.js +0 -268
  243. package/dist/src/genome/genomes.test.js +0 -8
  244. package/dist/src/genome/scaleIndex.test.js +0 -78
  245. package/dist/src/genome/scaleLocus.test.js +0 -4
  246. package/dist/src/scale/scale.test.js +0 -326
  247. package/dist/src/scale/ticks.test.js +0 -46
  248. package/dist/src/selection/selection.test.js +0 -14
  249. package/dist/src/utils/addBaseUrl.test.js +0 -30
  250. package/dist/src/utils/binnedIndex.test.js +0 -201
  251. package/dist/src/utils/cloner.test.js +0 -35
  252. package/dist/src/utils/coalesce.test.js +0 -16
  253. package/dist/src/utils/concatIterables.test.js +0 -8
  254. package/dist/src/utils/domainArray.test.js +0 -130
  255. package/dist/src/utils/indexer.test.js +0 -49
  256. package/dist/src/utils/interactionEvent.test.js +0 -35
  257. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  258. package/dist/src/utils/kWayMerge.test.js +0 -30
  259. package/dist/src/utils/mergeObjects.test.js +0 -42
  260. package/dist/src/utils/numberExtractor.test.js +0 -6
  261. package/dist/src/utils/propertyCacher.test.js +0 -89
  262. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  263. package/dist/src/utils/radixSort.test.js +0 -51
  264. package/dist/src/utils/reservationMap.test.js +0 -20
  265. package/dist/src/utils/ringBuffer.test.js +0 -39
  266. package/dist/src/utils/topK.test.js +0 -54
  267. package/dist/src/utils/trees.test.js +0 -135
  268. package/dist/src/utils/url.test.js +0 -28
  269. package/dist/src/utils/variableTools.test.js +0 -13
  270. package/dist/src/view/axisResolution.d.ts.map +0 -1
  271. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  272. package/dist/src/view/axisResolution.test.js +0 -206
  273. package/dist/src/view/flowBuilder.test.js +0 -125
  274. package/dist/src/view/layout/flexLayout.test.js +0 -323
  275. package/dist/src/view/layout/grid.test.js +0 -71
  276. package/dist/src/view/layout/rectangle.test.js +0 -192
  277. package/dist/src/view/paramMediator.test.js +0 -260
  278. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  279. package/dist/src/view/scaleResolution.js +0 -1049
  280. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  281. package/dist/src/view/scaleResolution.test.js +0 -645
  282. package/dist/src/view/view.test.js +0 -245
  283. package/dist/src/view/viewFactory.test.js +0 -25
  284. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  285. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -1,4 +1,78 @@
1
- const h = {
1
+ function R(d, t, e) {
2
+ const r = /* @__PURE__ */ Object.create(null), i = e.length, a = t.length, l = 9, s = 58;
3
+ let n = 0;
4
+ if (d === "GT") {
5
+ for (let o = 0; o < i; o++) {
6
+ const p = n;
7
+ for (; n < a && t.charCodeAt(n) !== l; )
8
+ n++;
9
+ r[e[o]] = t.slice(p, n), n++;
10
+ }
11
+ return r;
12
+ }
13
+ const c = d.indexOf("GT");
14
+ if (c === -1)
15
+ return r;
16
+ if (c === 0) {
17
+ for (let o = 0; o < i; o++) {
18
+ const p = n;
19
+ for (; n < a && t.charCodeAt(n) !== s && t.charCodeAt(n) !== l; )
20
+ n++;
21
+ for (r[e[o]] = t.slice(p, n); n < a && t.charCodeAt(n) !== l; )
22
+ n++;
23
+ n++;
24
+ }
25
+ return r;
26
+ }
27
+ let b = 0;
28
+ for (let o = 0; o < c; o++)
29
+ d.charCodeAt(o) === s && b++;
30
+ for (let o = 0; o < i; o++) {
31
+ const p = n;
32
+ let u = n;
33
+ for (; u < a && t.charCodeAt(u) !== l; )
34
+ u++;
35
+ let g = 0, N = p;
36
+ for (let h = p; h <= u; h++)
37
+ if (h === u || t.charCodeAt(h) === s) {
38
+ if (g === b) {
39
+ r[e[o]] = t.slice(N, h);
40
+ break;
41
+ }
42
+ g++, N = h + 1;
43
+ }
44
+ n = u + 1;
45
+ }
46
+ return r;
47
+ }
48
+ function E(d) {
49
+ const t = [], e = [];
50
+ let r = !1, i = !1;
51
+ const a = d.length;
52
+ for (let l = 0; l < a; l++) {
53
+ const s = d[l];
54
+ s === '"' ? (r = !r, e.push(s)) : s === "[" ? (i = !0, e.push(s)) : s === "]" ? (i = !1, e.push(s)) : s === "," && !r && !i ? (t.push(e.join("").trim()), e.length = 0) : e.push(s);
55
+ }
56
+ return e.length > 0 && t.push(e.join("").trim()), t;
57
+ }
58
+ function F(d, t) {
59
+ const e = d.indexOf(t);
60
+ return [d.slice(0, e), d.slice(e + 1)];
61
+ }
62
+ function C(d) {
63
+ const t = d.slice(1, -1), e = E(t), r = [];
64
+ for (let i = 0; i < e.length; i++) {
65
+ const a = e[i], [l, s] = F(a, "=");
66
+ if (s && s.startsWith("[") && s.endsWith("]")) {
67
+ const n = s.slice(1, -1).split(",");
68
+ for (let c = 0; c < n.length; c++)
69
+ n[c] = n[c].trim();
70
+ r.push([l, n]);
71
+ } else s && s.startsWith('"') && s.endsWith('"') ? r.push([l, s.slice(1, -1)]) : r.push([l, s]);
72
+ }
73
+ return Object.fromEntries(r);
74
+ }
75
+ const S = {
2
76
  // INFO fields
3
77
  InfoFields: {
4
78
  // from the VCF4.3 spec, https://samtools.github.io/hts-specs/VCFv4.3.pdf
@@ -343,35 +417,37 @@ const h = {
343
417
  }
344
418
  }
345
419
  };
346
- function v(b) {
420
+ function L(d) {
347
421
  try {
348
- return decodeURIComponent(b);
422
+ return decodeURIComponent(d);
349
423
  } catch {
350
- return b;
424
+ return d;
351
425
  }
352
426
  }
353
427
  class M {
354
- constructor({ header: a = "", strict: r = !0 }) {
355
- if (!a.length)
428
+ constructor({ header: t = "", strict: e = !0 }) {
429
+ if (!t.length)
356
430
  throw new Error("empty header received");
357
- const n = a.split(/[\r\n]+/).filter((o) => o);
358
- if (!n.length)
431
+ const r = t.split(/[\r\n]+/).filter(Boolean);
432
+ if (!r.length)
359
433
  throw new Error("no non-empty header lines specified");
360
- this.strict = r, this.metadata = JSON.parse(JSON.stringify({
361
- INFO: h.InfoFields,
362
- FORMAT: h.GenotypeFields,
363
- ALT: h.AltTypes,
364
- FILTER: h.FilterTypes
365
- }));
366
- let e;
367
- if (n.forEach((o) => {
368
- if (o.startsWith("#"))
369
- o.startsWith("##") ? this.parseMetadata(o) : e = o;
434
+ this.strict = e, this.metadata = {
435
+ INFO: { ...S.InfoFields },
436
+ FORMAT: { ...S.GenotypeFields },
437
+ ALT: { ...S.AltTypes },
438
+ FILTER: { ...S.FilterTypes }
439
+ };
440
+ let i;
441
+ for (let n = 0; n < r.length; n++) {
442
+ const c = r[n];
443
+ if (c.startsWith("#"))
444
+ c.startsWith("##") ? this.parseMetadata(c) : i = c;
370
445
  else throw new Error(`Bad line in header:
371
- ${o}`);
372
- }), !e)
446
+ ${c}`);
447
+ }
448
+ if (!i)
373
449
  throw new Error("No format line found in header");
374
- const t = e.trim().split(" "), s = t.slice(0, 8), i = [
450
+ const a = i.trim().split(" "), l = a.slice(0, 8), s = [
375
451
  "#CHROM",
376
452
  "POS",
377
453
  "ID",
@@ -381,54 +457,88 @@ ${o}`);
381
457
  "FILTER",
382
458
  "INFO"
383
459
  ];
384
- if (t.length < 8)
460
+ if (a.length < 8)
385
461
  throw new Error(`VCF header missing columns:
386
- ${e}`);
387
- if (s.length !== i.length || !s.every((o, p) => o === i[p]))
462
+ ${i}`);
463
+ if (l.length !== s.length || !l.every((n, c) => n === s[c]))
388
464
  throw new Error(`VCF column headers not correct:
389
- ${e}`);
390
- this.samples = t.slice(9);
465
+ ${i}`);
466
+ this.samples = a.slice(9);
391
467
  }
392
- parseSamples(a, r) {
393
- const n = {};
394
- if (a) {
395
- const e = r.split(" "), t = a.split(":"), s = t.map((i) => {
396
- const o = this.getMetadata("FORMAT", i, "Type");
397
- return o === "Integer" || o === "Float";
398
- });
399
- for (let i = 0; i < this.samples.length; i++) {
400
- const o = this.samples[i];
401
- n[o] = {};
402
- const p = e[i].split(":");
403
- for (let c = 0; c < p.length; c++) {
404
- const m = p[c];
405
- n[o][t[c]] = m === "" || m === "." ? void 0 : m.split(",").map((u) => u === "." ? void 0 : s[c] ? +u : u);
468
+ parseInfo(t) {
469
+ var s;
470
+ const e = {}, r = t.includes("%"), i = t.split(";"), a = this.metadata.INFO, l = i.length;
471
+ for (let n = 0; n < l; n++) {
472
+ const c = i[n], b = c.indexOf("="), o = b === -1 ? c : c.slice(0, b), p = b === -1 ? void 0 : c.slice(b + 1), u = (s = a[o]) == null ? void 0 : s.Type;
473
+ if (u === "Flag")
474
+ e[o] = !0;
475
+ else if (!p)
476
+ e[o] = !0;
477
+ else {
478
+ const g = u === "Integer" || u === "Float", N = p.split(","), h = N.length;
479
+ if (r) {
480
+ const f = [];
481
+ for (let m = 0; m < h; m++) {
482
+ const y = N[m];
483
+ if (y === ".")
484
+ f.push(void 0);
485
+ else {
486
+ const D = L(y);
487
+ f.push(g ? Number(D) : D);
488
+ }
489
+ }
490
+ e[o] = f;
491
+ } else {
492
+ const f = [];
493
+ for (let m = 0; m < h; m++) {
494
+ const y = N[m];
495
+ y === "." ? f.push(void 0) : f.push(g ? Number(y) : y);
496
+ }
497
+ e[o] = f;
406
498
  }
407
499
  }
408
500
  }
409
- return n;
501
+ return e;
410
502
  }
411
- parseGenotypesOnly(a, r) {
412
- const n = r.split(" "), e = {};
413
- let t = 0;
414
- const s = a.split(":");
415
- if (s.length === 1)
416
- for (const i of this.samples)
417
- e[i] = n[t++];
418
- else {
419
- const i = s.findIndex((o) => o === "GT");
420
- if (i === 0)
421
- for (const o of this.samples) {
422
- const p = n[t++], c = p.indexOf(":");
423
- c !== -1 ? e[o] = p.slice(0, c) : console.warn("unknown");
424
- }
425
- else
426
- for (const o of this.samples) {
427
- const p = n[t++].split(":");
428
- e[o] = p[i];
429
- }
503
+ parseSamples(t, e) {
504
+ var i;
505
+ const r = {};
506
+ if (t) {
507
+ const a = e.split(" "), l = t.split(":"), s = this.metadata.FORMAT, n = [];
508
+ for (let o = 0; o < l.length; o++) {
509
+ const p = (i = s[l[o]]) == null ? void 0 : i.Type;
510
+ n.push(p === "Integer" || p === "Float");
511
+ }
512
+ const c = l.length, b = this.samples.length;
513
+ for (let o = 0; o < b; o++) {
514
+ const p = this.samples[o], u = {}, g = a[o], N = g.length;
515
+ let h = 0, f = 0;
516
+ for (let m = 0; m <= N; m++)
517
+ if (m === N || g[m] === ":") {
518
+ const y = g.slice(h, m);
519
+ if (y === "" || y === ".")
520
+ u[l[f]] = void 0;
521
+ else {
522
+ const D = y.split(","), I = [];
523
+ if (n[f])
524
+ for (let T = 0; T < D.length; T++) {
525
+ const A = D[T];
526
+ I.push(A === "." ? void 0 : +A);
527
+ }
528
+ else
529
+ for (let T = 0; T < D.length; T++) {
530
+ const A = D[T];
531
+ I.push(A === "." ? void 0 : A);
532
+ }
533
+ u[l[f]] = I;
534
+ }
535
+ if (h = m + 1, f += 1, f >= c)
536
+ break;
537
+ }
538
+ r[p] = u;
539
+ }
430
540
  }
431
- return e;
541
+ return r;
432
542
  }
433
543
  /**
434
544
  * Parse a VCF metadata line (i.e. a line that starts with "##") and add its
@@ -437,17 +547,17 @@ ${e}`);
437
547
  * @param {string} line - A line from the VCF. Supports both LF and CRLF
438
548
  * newlines.
439
549
  */
440
- parseMetadata(a) {
441
- const r = /^##(.+?)=(.*)/.exec(a.trim());
442
- if (!r)
443
- throw new Error(`Line is not a valid metadata line: ${a}`);
444
- const [n, e] = r.slice(1, 3), t = n;
445
- if (e != null && e.startsWith("<")) {
446
- t in this.metadata || (this.metadata[t] = {});
447
- const [s, i] = this.parseStructuredMetaVal(e);
448
- this.metadata[t][s] = i;
550
+ parseMetadata(t) {
551
+ const e = /^##(.+?)=(.*)/.exec(t.trim());
552
+ if (!e)
553
+ throw new Error(`Line is not a valid metadata line: ${t}`);
554
+ const [r, i] = e.slice(1, 3), a = r;
555
+ if (i != null && i.startsWith("<")) {
556
+ a in this.metadata || (this.metadata[a] = {});
557
+ const [l, s] = this.parseStructuredMetaVal(i);
558
+ l ? this.metadata[a][l] = s : this.metadata[a] = s;
449
559
  } else
450
- this.metadata[t] = e;
560
+ this.metadata[a] = i;
451
561
  }
452
562
  /**
453
563
  * Parse a VCF header structured meta string (i.e. a meta value that starts
@@ -458,9 +568,9 @@ ${e}`);
458
568
  * @returns {Array} - Array with two entries, 1) a string of the metadata ID
459
569
  * and 2) an object with the other key-value pairs in the metadata
460
570
  */
461
- parseStructuredMetaVal(a) {
462
- const r = this.parseKeyValue(a.replace(/^<|>$/g, ""), ","), n = r.ID;
463
- return delete r.ID, "Number" in r && (Number.isNaN(Number(r.Number)) || (r.Number = Number(r.Number))), [n, r];
571
+ parseStructuredMetaVal(t) {
572
+ const e = C(t), r = e.ID;
573
+ return delete e.ID, "Number" in e && (Number.isNaN(Number(e.Number)) || (e.Number = Number(e.Number))), [r, e];
464
574
  }
465
575
  /**
466
576
  * Get metadata filtered by the elements in args. For example, can pass
@@ -471,66 +581,76 @@ ${e}`);
471
581
  *
472
582
  * @returns {any} An object, string, or number, depending on the filtering
473
583
  */
474
- getMetadata(...a) {
475
- let r = this.metadata;
476
- for (const n of a)
477
- if (r = r[n], !r)
478
- return r;
479
- return r;
584
+ getMetadata(...t) {
585
+ let e = this.metadata;
586
+ const r = t.length;
587
+ for (let i = 0; i < r; i++)
588
+ if (e = e[t[i]], !e)
589
+ return e;
590
+ return e;
480
591
  }
481
592
  /**
482
- * Sometimes VCFs have key-value strings that allow the separator within the
483
- * value if it's in quotes, like:
484
- * 'ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129"'
593
+ * Parse a VCF line into an object like
485
594
  *
486
- * Parse this at a low level since we can't just split at "," (or whatever
487
- * separator). Above line would be parsed to: {ID: 'DB', Number: '0', Type:
488
- * 'Flag', Description: 'dbSNP membership, build 129'}
489
- */
490
- parseKeyValue(a, r = ";") {
491
- const n = {};
492
- let e = "", t = "", s = 1;
493
- for (const i of a)
494
- s === 1 ? i === "=" ? s = 2 : i !== r ? e += i : t === "" && (n[e] = void 0, e = "") : s === 2 ? i === r ? (n[e] = t, e = "", t = "", s = 1) : i === '"' ? s = 3 : t += i : s === 3 && (i !== '"' ? t += i : s = 2);
495
- return s === 2 || s === 3 ? n[e] = t : s === 1 && (n[e] = void 0), n;
496
- }
497
- /**
498
- * Parse a VCF line into an object like { CHROM POS ID REF ALT QUAL FILTER
499
- * INFO } with SAMPLES optionally included if present in the VCF
595
+ * ```typescript
596
+ * {
597
+ * CHROM: 'contigA',
598
+ * POS: 3000,
599
+ * ID: ['rs17883296'],
600
+ * REF: 'G',
601
+ * ALT: ['T', 'A'],
602
+ * QUAL: 100,
603
+ * FILTER: 'PASS',
604
+ * INFO: {
605
+ * NS: [3],
606
+ * DP: [14],
607
+ * AF: [0.5],
608
+ * DB: true,
609
+ * XYZ: ['5'],
610
+ * },
611
+ * SAMPLES: () => ({
612
+ * HG00096: {
613
+ * GT: ['0|0'],
614
+ * AP: ['0.000', '0.000'],
615
+ * }
616
+ * }),
617
+ * GENOTYPES: () => ({
618
+ * HG00096: '0|0'
619
+ * })
620
+ * }
621
+ * ```
622
+ *
623
+ * SAMPLES and GENOTYPES methods are functions instead of static data fields
624
+ * because it avoids parsing the potentially long list of samples from e.g.
625
+ * 1000 genotypes data unless requested.
500
626
  *
501
- * @param {string} line - A string of a line from a VCF. Supports both LF and
502
- * CRLF newlines.
627
+ * The SAMPLES function gives all info about the samples
628
+ *
629
+ * The GENOTYPES function only extracts the raw GT string if it exists, for
630
+ * potentially optimized parsing by programs that need it
631
+ *
632
+ * @param {string} line - A string of a line from a VCF
503
633
  */
504
- parseLine(a) {
505
- var r, n;
506
- let e = 0;
507
- for (let l = 0; e < a.length && (a[e] === " " && (l += 1), l !== 9); e += 1)
508
- ;
509
- const t = a.slice(0, e).split(" "), s = a.slice(e + 1), [i, o, p, c, m, u, T] = t, g = i, I = +o, A = p === "." ? void 0 : p.split(";"), S = c, R = m === "." ? void 0 : m.split(","), E = u === "." ? void 0 : +u, y = T === "." ? void 0 : T.split(";");
510
- if (this.strict && !t[7])
634
+ parseLine(t) {
635
+ let e = 0, r = 0;
636
+ for (; e < t.length && r < 9; )
637
+ t[e] === " " && (r += 1), e += 1;
638
+ const i = r === 9 ? e - 1 : e, a = t.slice(0, i).split(" "), l = t.slice(i + 1), [s, n, c, b, o, p, u] = a, g = s, N = +n, h = c === "." ? void 0 : c.split(";"), f = b, m = o === "." ? void 0 : o.split(","), y = p === "." ? void 0 : +p, D = u === "." ? void 0 : u.split(";"), I = a[8];
639
+ if (this.strict && !a[7])
511
640
  throw new Error("no INFO field specified, must contain at least a '.' (turn off strict mode to allow)");
512
- const F = (r = t[7]) === null || r === void 0 ? void 0 : r.includes("%"), f = t[7] === void 0 || t[7] === "." ? {} : this.parseKeyValue(t[7]);
513
- for (const l of Object.keys(f)) {
514
- const D = (n = f[l]) === null || n === void 0 ? void 0 : n.split(",").map((d) => d === "." ? void 0 : d).map((d) => d && F ? v(d) : d), N = this.getMetadata("INFO", l, "Type");
515
- N === "Integer" || N === "Float" ? f[l] = D == null ? void 0 : D.map((d) => d === void 0 ? void 0 : Number(d)) : N === "Flag" ? f[l] = !0 : f[l] = D;
516
- }
641
+ const T = a[7] === void 0 || a[7] === "." ? {} : this.parseInfo(a[7]);
517
642
  return {
518
643
  CHROM: g,
519
- POS: I,
520
- ALT: R,
521
- INFO: f,
522
- REF: S,
523
- FILTER: y && y.length === 1 && y[0] === "PASS" ? "PASS" : y,
524
- ID: A,
525
- QUAL: E,
526
- SAMPLES: () => {
527
- var l;
528
- return this.parseSamples((l = t[8]) !== null && l !== void 0 ? l : "", s);
529
- },
530
- GENOTYPES: () => {
531
- var l;
532
- return this.parseGenotypesOnly((l = t[8]) !== null && l !== void 0 ? l : "", s);
533
- }
644
+ POS: N,
645
+ ALT: m,
646
+ INFO: T,
647
+ REF: f,
648
+ FILTER: (D == null ? void 0 : D.length) === 1 && D[0] === "PASS" ? "PASS" : D,
649
+ ID: h,
650
+ QUAL: y,
651
+ FORMAT: I,
652
+ SAMPLES: () => this.parseSamples(a[8] ?? "", l),
653
+ GENOTYPES: () => R(a[8] ?? "", l, this.samples)
534
654
  };
535
655
  }
536
656
  }