@gmod/cram 1.6.3 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/craiIndex.d.ts +19 -12
  3. package/dist/craiIndex.js +63 -123
  4. package/dist/craiIndex.js.map +1 -1
  5. package/dist/cram-bundle.js +2 -17
  6. package/dist/cram-bundle.js.LICENSE.txt +17 -0
  7. package/dist/cramFile/codecs/_base.d.ts +26 -5
  8. package/dist/cramFile/codecs/_base.js +3 -39
  9. package/dist/cramFile/codecs/_base.js.map +1 -1
  10. package/dist/cramFile/codecs/beta.d.ts +7 -3
  11. package/dist/cramFile/codecs/beta.js +13 -31
  12. package/dist/cramFile/codecs/beta.js.map +1 -1
  13. package/dist/cramFile/codecs/byteArrayLength.d.ts +13 -7
  14. package/dist/cramFile/codecs/byteArrayLength.js +22 -41
  15. package/dist/cramFile/codecs/byteArrayLength.js.map +1 -1
  16. package/dist/cramFile/codecs/byteArrayStop.d.ts +9 -5
  17. package/dist/cramFile/codecs/byteArrayStop.js +25 -46
  18. package/dist/cramFile/codecs/byteArrayStop.js.map +1 -1
  19. package/dist/cramFile/codecs/dataSeriesTypes.d.ts +4 -0
  20. package/dist/cramFile/codecs/dataSeriesTypes.js +3 -0
  21. package/dist/cramFile/codecs/dataSeriesTypes.js.map +1 -0
  22. package/dist/cramFile/codecs/external.d.ts +10 -6
  23. package/dist/cramFile/codecs/external.js +26 -44
  24. package/dist/cramFile/codecs/external.js.map +1 -1
  25. package/dist/cramFile/codecs/gamma.d.ts +7 -3
  26. package/dist/cramFile/codecs/gamma.js +16 -34
  27. package/dist/cramFile/codecs/gamma.js.map +1 -1
  28. package/dist/cramFile/codecs/getBits.d.ts +7 -0
  29. package/dist/cramFile/codecs/getBits.js +26 -0
  30. package/dist/cramFile/codecs/getBits.js.map +1 -0
  31. package/dist/cramFile/codecs/huffman.d.ts +17 -13
  32. package/dist/cramFile/codecs/huffman.js +76 -85
  33. package/dist/cramFile/codecs/huffman.js.map +1 -1
  34. package/dist/cramFile/codecs/index.d.ts +4 -2
  35. package/dist/cramFile/codecs/index.js +12 -13
  36. package/dist/cramFile/codecs/index.js.map +1 -1
  37. package/dist/cramFile/codecs/subexp.d.ts +7 -3
  38. package/dist/cramFile/codecs/subexp.js +19 -36
  39. package/dist/cramFile/codecs/subexp.js.map +1 -1
  40. package/dist/cramFile/constants.d.ts +35 -35
  41. package/dist/cramFile/constants.js +1 -1
  42. package/dist/cramFile/constants.js.map +1 -1
  43. package/dist/cramFile/container/compressionScheme.d.ts +57 -11
  44. package/dist/cramFile/container/compressionScheme.js +37 -32
  45. package/dist/cramFile/container/compressionScheme.js.map +1 -1
  46. package/dist/cramFile/container/index.d.ts +23 -9
  47. package/dist/cramFile/container/index.js +74 -144
  48. package/dist/cramFile/container/index.js.map +1 -1
  49. package/dist/cramFile/encoding.d.ts +78 -0
  50. package/dist/cramFile/encoding.js +3 -0
  51. package/dist/cramFile/encoding.js.map +1 -0
  52. package/dist/cramFile/file.d.ts +91 -41
  53. package/dist/cramFile/file.js +234 -368
  54. package/dist/cramFile/file.js.map +1 -1
  55. package/dist/cramFile/filehandle.d.ts +2 -0
  56. package/dist/cramFile/filehandle.js +3 -0
  57. package/dist/cramFile/filehandle.js.map +1 -0
  58. package/dist/cramFile/index.d.ts +1 -1
  59. package/dist/cramFile/index.js +1 -1
  60. package/dist/cramFile/index.js.map +1 -1
  61. package/dist/cramFile/record.d.ts +61 -17
  62. package/dist/cramFile/record.js +153 -77
  63. package/dist/cramFile/record.js.map +1 -1
  64. package/dist/cramFile/sectionParsers.d.ts +99 -8
  65. package/dist/cramFile/sectionParsers.js +70 -80
  66. package/dist/cramFile/sectionParsers.js.map +1 -1
  67. package/dist/cramFile/slice/decodeRecord.d.ts +30 -2
  68. package/dist/cramFile/slice/decodeRecord.js +148 -118
  69. package/dist/cramFile/slice/decodeRecord.js.map +1 -1
  70. package/dist/cramFile/slice/index.d.ts +21 -14
  71. package/dist/cramFile/slice/index.js +286 -381
  72. package/dist/cramFile/slice/index.js.map +1 -1
  73. package/dist/cramFile/util.d.ts +11 -5
  74. package/dist/cramFile/util.js +19 -97
  75. package/dist/cramFile/util.js.map +1 -1
  76. package/dist/errors.d.ts +5 -10
  77. package/dist/errors.js +11 -62
  78. package/dist/errors.js.map +1 -1
  79. package/dist/index.d.ts +3 -3
  80. package/dist/index.js +3 -3
  81. package/dist/index.js.map +1 -1
  82. package/dist/indexedCramFile.d.ts +37 -12
  83. package/dist/indexedCramFile.js +114 -154
  84. package/dist/indexedCramFile.js.map +1 -1
  85. package/dist/io/index.d.ts +5 -5
  86. package/dist/io/index.js +9 -9
  87. package/dist/io/index.js.map +1 -1
  88. package/dist/rans/constants.js +3 -3
  89. package/dist/rans/constants.js.map +1 -1
  90. package/dist/rans/d04.js +15 -15
  91. package/dist/rans/d04.js.map +1 -1
  92. package/dist/rans/d14.js +21 -21
  93. package/dist/rans/d14.js.map +1 -1
  94. package/dist/rans/decoding.js +27 -30
  95. package/dist/rans/decoding.js.map +1 -1
  96. package/dist/rans/frequencies.js +11 -11
  97. package/dist/rans/frequencies.js.map +1 -1
  98. package/dist/rans/index.js +46 -49
  99. package/dist/rans/index.js.map +1 -1
  100. package/dist/sam.d.ts +8 -1
  101. package/dist/sam.js +7 -7
  102. package/dist/sam.js.map +1 -1
  103. package/dist/typescript.d.ts +3 -0
  104. package/dist/typescript.js +11 -0
  105. package/dist/typescript.js.map +1 -0
  106. package/dist/unzip-pako.js +1 -1
  107. package/dist/unzip-pako.js.map +1 -1
  108. package/dist/unzip.js +1 -1
  109. package/dist/unzip.js.map +1 -1
  110. package/errors.js +11 -62
  111. package/esm/craiIndex.d.ts +19 -12
  112. package/esm/craiIndex.js +8 -24
  113. package/esm/craiIndex.js.map +1 -1
  114. package/esm/cramFile/codecs/_base.d.ts +26 -5
  115. package/esm/cramFile/codecs/_base.js +1 -35
  116. package/esm/cramFile/codecs/_base.js.map +1 -1
  117. package/esm/cramFile/codecs/beta.d.ts +7 -3
  118. package/esm/cramFile/codecs/beta.js +4 -3
  119. package/esm/cramFile/codecs/beta.js.map +1 -1
  120. package/esm/cramFile/codecs/byteArrayLength.d.ts +13 -7
  121. package/esm/cramFile/codecs/byteArrayLength.js +1 -1
  122. package/esm/cramFile/codecs/byteArrayLength.js.map +1 -1
  123. package/esm/cramFile/codecs/byteArrayStop.d.ts +9 -5
  124. package/esm/cramFile/codecs/byteArrayStop.js +7 -9
  125. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -1
  126. package/esm/cramFile/codecs/dataSeriesTypes.d.ts +4 -0
  127. package/esm/cramFile/codecs/dataSeriesTypes.js +2 -0
  128. package/esm/cramFile/codecs/dataSeriesTypes.js.map +1 -0
  129. package/esm/cramFile/codecs/external.d.ts +10 -6
  130. package/esm/cramFile/codecs/external.js +4 -3
  131. package/esm/cramFile/codecs/external.js.map +1 -1
  132. package/esm/cramFile/codecs/gamma.d.ts +7 -3
  133. package/esm/cramFile/codecs/gamma.js +5 -4
  134. package/esm/cramFile/codecs/gamma.js.map +1 -1
  135. package/esm/cramFile/codecs/getBits.d.ts +7 -0
  136. package/esm/cramFile/codecs/getBits.js +21 -0
  137. package/esm/cramFile/codecs/getBits.js.map +1 -0
  138. package/esm/cramFile/codecs/huffman.d.ts +17 -13
  139. package/esm/cramFile/codecs/huffman.js +22 -9
  140. package/esm/cramFile/codecs/huffman.js.map +1 -1
  141. package/esm/cramFile/codecs/index.d.ts +4 -2
  142. package/esm/cramFile/codecs/index.js +1 -1
  143. package/esm/cramFile/codecs/index.js.map +1 -1
  144. package/esm/cramFile/codecs/subexp.d.ts +7 -3
  145. package/esm/cramFile/codecs/subexp.js +7 -5
  146. package/esm/cramFile/codecs/subexp.js.map +1 -1
  147. package/esm/cramFile/constants.d.ts +35 -35
  148. package/esm/cramFile/constants.js.map +1 -1
  149. package/esm/cramFile/container/compressionScheme.d.ts +57 -11
  150. package/esm/cramFile/container/compressionScheme.js +15 -8
  151. package/esm/cramFile/container/compressionScheme.js.map +1 -1
  152. package/esm/cramFile/container/index.d.ts +23 -9
  153. package/esm/cramFile/container/index.js +11 -9
  154. package/esm/cramFile/container/index.js.map +1 -1
  155. package/esm/cramFile/encoding.d.ts +78 -0
  156. package/esm/cramFile/encoding.js +2 -0
  157. package/esm/cramFile/encoding.js.map +1 -0
  158. package/esm/cramFile/file.d.ts +91 -41
  159. package/esm/cramFile/file.js +59 -47
  160. package/esm/cramFile/file.js.map +1 -1
  161. package/esm/cramFile/filehandle.d.ts +2 -0
  162. package/esm/cramFile/filehandle.js +2 -0
  163. package/esm/cramFile/filehandle.js.map +1 -0
  164. package/esm/cramFile/index.d.ts +1 -1
  165. package/esm/cramFile/index.js.map +1 -1
  166. package/esm/cramFile/record.d.ts +61 -17
  167. package/esm/cramFile/record.js +83 -5
  168. package/esm/cramFile/record.js.map +1 -1
  169. package/esm/cramFile/sectionParsers.d.ts +99 -8
  170. package/esm/cramFile/sectionParsers.js +7 -17
  171. package/esm/cramFile/sectionParsers.js.map +1 -1
  172. package/esm/cramFile/slice/decodeRecord.d.ts +30 -2
  173. package/esm/cramFile/slice/decodeRecord.js +102 -70
  174. package/esm/cramFile/slice/decodeRecord.js.map +1 -1
  175. package/esm/cramFile/slice/index.d.ts +21 -14
  176. package/esm/cramFile/slice/index.js +77 -38
  177. package/esm/cramFile/slice/index.js.map +1 -1
  178. package/esm/cramFile/util.d.ts +11 -5
  179. package/esm/cramFile/util.js +11 -82
  180. package/esm/cramFile/util.js.map +1 -1
  181. package/esm/errors.d.ts +5 -10
  182. package/esm/errors.js +0 -5
  183. package/esm/errors.js.map +1 -1
  184. package/esm/index.d.ts +3 -3
  185. package/esm/index.js.map +1 -1
  186. package/esm/indexedCramFile.d.ts +37 -12
  187. package/esm/indexedCramFile.js +19 -8
  188. package/esm/indexedCramFile.js.map +1 -1
  189. package/esm/io/index.d.ts +5 -5
  190. package/esm/io/index.js +3 -3
  191. package/esm/io/index.js.map +1 -1
  192. package/esm/sam.d.ts +8 -1
  193. package/esm/sam.js.map +1 -1
  194. package/esm/typescript.d.ts +3 -0
  195. package/esm/typescript.js +7 -0
  196. package/esm/typescript.js.map +1 -0
  197. package/package.json +18 -11
  198. package/src/{craiIndex.js → craiIndex.ts} +37 -31
  199. package/src/cramFile/codecs/_base.ts +45 -0
  200. package/src/cramFile/codecs/beta.ts +34 -0
  201. package/src/cramFile/codecs/{byteArrayLength.js → byteArrayLength.ts} +27 -5
  202. package/src/cramFile/codecs/{byteArrayStop.js → byteArrayStop.ts} +25 -12
  203. package/src/cramFile/codecs/dataSeriesTypes.ts +39 -0
  204. package/src/cramFile/codecs/{external.js → external.ts} +28 -12
  205. package/src/cramFile/codecs/gamma.ts +42 -0
  206. package/src/cramFile/codecs/getBits.ts +28 -0
  207. package/src/cramFile/codecs/{huffman.js → huffman.ts} +48 -15
  208. package/src/cramFile/codecs/{index.js → index.ts} +9 -3
  209. package/src/cramFile/codecs/subexp.ts +45 -0
  210. package/src/cramFile/{constants.js → constants.ts} +0 -0
  211. package/src/cramFile/container/{compressionScheme.js → compressionScheme.ts} +50 -18
  212. package/src/cramFile/container/{index.js → index.ts} +13 -13
  213. package/src/cramFile/encoding.ts +98 -0
  214. package/src/cramFile/{file.js → file.ts} +136 -62
  215. package/src/cramFile/filehandle.ts +3 -0
  216. package/src/cramFile/{index.js → index.ts} +0 -0
  217. package/src/cramFile/{record.js → record.ts} +185 -14
  218. package/src/cramFile/{sectionParsers.js → sectionParsers.ts} +148 -20
  219. package/src/cramFile/slice/{decodeRecord.js → decodeRecord.ts} +158 -105
  220. package/src/cramFile/slice/{index.js → index.ts} +138 -63
  221. package/src/cramFile/{util.js → util.ts} +28 -17
  222. package/src/{errors.js → errors.ts} +0 -5
  223. package/src/{index.js → index.ts} +0 -0
  224. package/src/{indexedCramFile.js → indexedCramFile.ts} +79 -19
  225. package/src/io/{index.js → index.ts} +10 -5
  226. package/src/{sam.js → sam.ts} +7 -2
  227. package/src/typescript.ts +17 -0
  228. package/src/typings/binary-parser.d.ts +44 -0
  229. package/src/typings/bzip2.d.ts +7 -0
  230. package/src/typings/htscodecs.d.ts +6 -0
  231. package/dist/io/bufferCache.d.ts +0 -12
  232. package/dist/io/bufferCache.js +0 -112
  233. package/dist/io/bufferCache.js.map +0 -1
  234. package/dist/io/localFile.d.ts +0 -10
  235. package/dist/io/localFile.js +0 -108
  236. package/dist/io/localFile.js.map +0 -1
  237. package/dist/io/remoteFile.d.ts +0 -16
  238. package/dist/io/remoteFile.js +0 -143
  239. package/dist/io/remoteFile.js.map +0 -1
  240. package/esm/io/bufferCache.d.ts +0 -12
  241. package/esm/io/bufferCache.js +0 -54
  242. package/esm/io/bufferCache.js.map +0 -1
  243. package/esm/io/localFile.d.ts +0 -10
  244. package/esm/io/localFile.js +0 -31
  245. package/esm/io/localFile.js.map +0 -1
  246. package/esm/io/remoteFile.d.ts +0 -16
  247. package/esm/io/remoteFile.js +0 -64
  248. package/esm/io/remoteFile.js.map +0 -1
  249. package/src/cramFile/codecs/_base.js +0 -49
  250. package/src/cramFile/codecs/beta.js +0 -23
  251. package/src/cramFile/codecs/gamma.js +0 -30
  252. package/src/cramFile/codecs/subexp.js +0 -32
  253. package/src/io/bufferCache.js +0 -66
  254. package/src/io/localFile.js +0 -35
  255. package/src/io/remoteFile.js +0 -71
@@ -1,4 +1,8 @@
1
1
  import { Parser } from '@gmod/binary-parser'
2
+ import { TupleOf } from '../typescript'
3
+ import { ParsedItem } from './util'
4
+ import { DataSeriesEncodingMap } from './codecs/dataSeriesTypes'
5
+ import { CramEncoding } from './encoding'
2
6
 
3
7
  const singleItf8 = new Parser().itf8()
4
8
 
@@ -72,10 +76,12 @@ const cramBlockCrc32 = {
72
76
  // 'GAMMA', // 9
73
77
  // ]
74
78
 
79
+ export type CramTagDictionary = string[][]
80
+
75
81
  const cramTagDictionary = new Parser().itf8('size').buffer('ents', {
76
82
  length: 'size',
77
83
  formatter: /* istanbul ignore next */ buffer => {
78
- function makeTagSet(stringStart, stringEnd) {
84
+ function makeTagSet(stringStart: number, stringEnd: number) {
79
85
  const str = buffer.toString('utf8', stringStart, stringEnd)
80
86
  const tags = []
81
87
  for (let i = 0; i < str.length; i += 3) {
@@ -83,6 +89,7 @@ const cramTagDictionary = new Parser().itf8('size').buffer('ents', {
83
89
  }
84
90
  return tags
85
91
  }
92
+
86
93
  /* eslint-disable */
87
94
  var tagSets = []
88
95
  var stringStart = 0
@@ -106,6 +113,17 @@ const parseByteAsBool = new Parser().uint8(null, {
106
113
  formatter: /* istanbul ignore next */ val => !!val,
107
114
  })
108
115
 
116
+ export type CramPreservationMap = {
117
+ MI: boolean
118
+ UI: boolean
119
+ PI: boolean
120
+ RN: boolean
121
+ AP: boolean
122
+ RR: boolean
123
+ SM: [number, number, number, number, number]
124
+ TD: CramTagDictionary
125
+ }
126
+
109
127
  const cramPreservationMap = new Parser()
110
128
  .itf8('mapSize')
111
129
  .itf8('mapCount')
@@ -136,8 +154,8 @@ const cramPreservationMap = new Parser()
136
154
  })
137
155
 
138
156
  /* istanbul ignore next */
139
- function formatMap(data) {
140
- const map = {}
157
+ function formatMap<T>(data: { ents: { key: string; value: T }[] }) {
158
+ const map: { [x: string]: T } = {}
141
159
  for (let i = 0; i < data.ents.length; i += 1) {
142
160
  const { key, value } = data.ents[i]
143
161
  if (map[key]) {
@@ -154,11 +172,39 @@ const unversionedParsers = {
154
172
  cramBlockCrc32,
155
173
  }
156
174
 
175
+ export type MappedSliceHeader = {
176
+ refSeqId: number
177
+ refSeqStart: number
178
+ refSeqSpan: number
179
+ numRecords: number
180
+ recordCounter: number
181
+ numBlocks: number
182
+ numContentIds: number
183
+ contentIds: number[]
184
+ refBaseBlockId: number
185
+ md5: TupleOf<number, 16>
186
+ }
187
+
188
+ export type UnmappedSliceHeader = {
189
+ numRecords: number
190
+ recordCounter: number
191
+ numBlocks: number
192
+ numContentIds: number
193
+ contentIds: number[]
194
+ md5: TupleOf<number, 16>
195
+ }
196
+
197
+ export function isMappedSliceHeader(
198
+ header: MappedSliceHeader | UnmappedSliceHeader,
199
+ ): header is MappedSliceHeader {
200
+ return typeof (header as any).refSeqId === 'number'
201
+ }
202
+
157
203
  // each of these is a function of the major and minor version
158
204
  const versionedParsers = {
159
205
  // assemble a section parser for the unmapped slice header, with slight
160
206
  // variations depending on the major version of the cram file
161
- cramUnmappedSliceHeader(majorVersion) {
207
+ cramUnmappedSliceHeader(majorVersion: number) {
162
208
  let maxLength = 0
163
209
  let parser = new Parser().itf8('numRecords')
164
210
  maxLength += 5
@@ -187,14 +233,15 @@ const versionedParsers = {
187
233
  maxLength += 16
188
234
  }
189
235
 
190
- const maxLengthFunc = numContentIds => maxLength + numContentIds * 5
236
+ const maxLengthFunc = (numContentIds: number) =>
237
+ maxLength + numContentIds * 5
191
238
 
192
239
  return { parser, maxLength: maxLengthFunc } // : p, maxLength: numContentIds => 5 + 9 + 5 * 2 + 5 * numContentIds + 16 }
193
240
  },
194
241
 
195
242
  // assembles a section parser for the unmapped slice header, with slight
196
243
  // variations depending on the major version of the cram file
197
- cramMappedSliceHeader(majorVersion) {
244
+ cramMappedSliceHeader(majorVersion: number) {
198
245
  let parser = new Parser()
199
246
  .itf8('refSeqId')
200
247
  .itf8('refSeqStart')
@@ -226,12 +273,13 @@ const versionedParsers = {
226
273
  maxLength += 16
227
274
  }
228
275
 
229
- const maxLengthFunc = numContentIds => maxLength + numContentIds * 5
276
+ const maxLengthFunc = (numContentIds: number) =>
277
+ maxLength + numContentIds * 5
230
278
 
231
279
  return { parser, maxLength: maxLengthFunc }
232
280
  },
233
281
 
234
- cramEncoding(majorVersion) {
282
+ cramEncoding(majorVersion: number) {
235
283
  const parser = new Parser()
236
284
  .namely('cramEncoding')
237
285
  .itf8('codecId')
@@ -252,9 +300,7 @@ const versionedParsers = {
252
300
  .nest('lengthsEncoding', { type: 'cramEncoding' })
253
301
  .nest('valuesEncoding', { type: 'cramEncoding' }),
254
302
  // BYTE_ARRAY_STOP is a little different for CRAM v1
255
- 5: new Parser()
256
- .uint8('stopByte')
257
- [majorVersion > 1 ? 'itf8' : 'int']('blockContentId'),
303
+ 5: new Parser().uint8('stopByte').itf8('blockContentId'),
258
304
  6: new Parser().itf8('offset').itf8('length'), // BETA
259
305
  7: new Parser().itf8('offset').itf8('K'), // SUBEXP
260
306
  8: new Parser().itf8('offset').itf8('log2m'), // GOLOMB_RICE
@@ -265,7 +311,7 @@ const versionedParsers = {
265
311
  return { parser }
266
312
  },
267
313
 
268
- cramDataSeriesEncodingMap(majorVersion) {
314
+ cramDataSeriesEncodingMap(majorVersion: number) {
269
315
  return new Parser()
270
316
  .itf8('mapSize')
271
317
  .itf8('mapCount')
@@ -277,7 +323,7 @@ const versionedParsers = {
277
323
  })
278
324
  },
279
325
 
280
- cramTagEncodingMap(majorVersion) {
326
+ cramTagEncodingMap(majorVersion: number) {
281
327
  return new Parser()
282
328
  .itf8('mapSize')
283
329
  .itf8('mapCount')
@@ -295,7 +341,7 @@ const versionedParsers = {
295
341
  })
296
342
  },
297
343
 
298
- cramCompressionHeader(majorVersion) {
344
+ cramCompressionHeader(majorVersion: number) {
299
345
  let parser = new Parser()
300
346
  // TODO: if we want to support CRAM v1, we will need to refactor
301
347
  // compression header into 2 parts to parse the landmarks,
@@ -316,7 +362,7 @@ const versionedParsers = {
316
362
  return { parser }
317
363
  },
318
364
 
319
- cramContainerHeader1(majorVersion) {
365
+ cramContainerHeader1(majorVersion: number) {
320
366
  let parser = new Parser()
321
367
  .int32('length') // byte size of the container data (blocks)
322
368
  .itf8('refSeqId') // reference sequence identifier, -1 for unmapped reads, -2 for multiple reference sequences
@@ -345,7 +391,7 @@ const versionedParsers = {
345
391
  return { parser, maxLength }
346
392
  },
347
393
 
348
- cramContainerHeader2(majorVersion) {
394
+ cramContainerHeader2(majorVersion: number) {
349
395
  let parser = new Parser()
350
396
  .itf8('numLandmarks') // the number of blocks
351
397
  // Each integer value of this array is a byte offset
@@ -363,15 +409,97 @@ const versionedParsers = {
363
409
  }
364
410
  return {
365
411
  parser,
366
- maxLength: numLandmarks => 5 + numLandmarks * 5 + crcLength,
412
+ maxLength: (numLandmarks: number) => 5 + numLandmarks * 5 + crcLength,
367
413
  }
368
414
  },
369
415
  }
370
416
 
371
- function getSectionParsers(majorVersion) {
372
- const parsers = Object.assign({}, unversionedParsers)
417
+ export type CompressionMethod =
418
+ | 'raw'
419
+ | 'gzip'
420
+ | 'bzip2'
421
+ | 'lzma'
422
+ | 'rans'
423
+ | 'rans4x16'
424
+ | 'arith'
425
+ | 'fqzcomp'
426
+ | 'tok3'
427
+
428
+ export type BlockHeader = {
429
+ compressionMethod: CompressionMethod
430
+ contentType:
431
+ | 'FILE_HEADER'
432
+ | 'COMPRESSION_HEADER'
433
+ | 'MAPPED_SLICE_HEADER'
434
+ | 'UNMAPPED_SLICE_HEADER' // < only used in cram v1
435
+ | 'EXTERNAL_DATA'
436
+ | 'CORE_DATA'
437
+ contentId: number
438
+ compressedSize: number
439
+ uncompressedSize: number
440
+ }
441
+
442
+ export type CramCompressionHeader = ParsedItem<{
443
+ preservation: CramPreservationMap
444
+ dataSeriesEncoding: DataSeriesEncodingMap
445
+ tagEncoding: Record<string, CramEncoding>
446
+ }>
447
+
448
+ function getSectionParsers(majorVersion: number): {
449
+ cramFileDefinition: {
450
+ parser: Parser<{
451
+ magic: string
452
+ majorVersion: number
453
+ minorVersion: number
454
+ fileId: string
455
+ }>
456
+ maxLength: number
457
+ }
458
+ cramContainerHeader1: {
459
+ parser: Parser<{
460
+ length: number
461
+ refSeqId: number
462
+ refSeqStart: number
463
+ alignmentSpan: number
464
+ numRecords: number
465
+ recordCounter: number
466
+ numBases: number
467
+ numBlocks: number
468
+ numLandmarks: number
469
+ }>
470
+ maxLength: number
471
+ }
472
+ cramContainerHeader2: {
473
+ parser: Parser<{
474
+ numLandmarks: number
475
+ landmarks: number[]
476
+ crc32: number
477
+ }>
478
+ maxLength: (x: number) => number
479
+ }
480
+ cramBlockHeader: {
481
+ parser: Parser<BlockHeader>
482
+ maxLength: number
483
+ }
484
+ cramBlockCrc32: {
485
+ parser: Parser<{ crc32: number }>
486
+ maxLength: number
487
+ }
488
+ cramCompressionHeader: {
489
+ parser: Parser<CramCompressionHeader>
490
+ }
491
+ cramMappedSliceHeader: {
492
+ parser: Parser<MappedSliceHeader>
493
+ maxLength: (numContentIds: number) => number
494
+ }
495
+ cramUnmappedSliceHeader: {
496
+ parser: Parser<UnmappedSliceHeader>
497
+ maxLength: (numContentIds: number) => number
498
+ }
499
+ } {
500
+ const parsers: any = Object.assign({}, unversionedParsers)
373
501
  Object.keys(versionedParsers).forEach(parserName => {
374
- parsers[parserName] = versionedParsers[parserName](majorVersion)
502
+ parsers[parserName] = (versionedParsers as any)[parserName](majorVersion)
375
503
  })
376
504
  return parsers
377
505
  }