@jbrowse/plugin-spreadsheet-view 2.6.1 → 2.6.3

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 (204) hide show
  1. package/dist/LaunchSpreadsheetView/index.js +0 -1
  2. package/dist/SpreadsheetView/components/CellData.js +0 -1
  3. package/dist/SpreadsheetView/components/ColumnFilterControls.js +0 -1
  4. package/dist/SpreadsheetView/components/ColumnMenu.js +0 -1
  5. package/dist/SpreadsheetView/components/DataRow.js +0 -1
  6. package/dist/SpreadsheetView/components/DataTable.js +0 -1
  7. package/dist/SpreadsheetView/components/DataTableHeader.js +0 -1
  8. package/dist/SpreadsheetView/components/GlobalFilterControls.js +0 -1
  9. package/dist/SpreadsheetView/components/ImportWizard.js +0 -1
  10. package/dist/SpreadsheetView/components/NumberEditor.js +0 -1
  11. package/dist/SpreadsheetView/components/RowCountMessage.js +0 -1
  12. package/dist/SpreadsheetView/components/RowMenu.js +0 -1
  13. package/dist/SpreadsheetView/components/SortIndicator.js +0 -1
  14. package/dist/SpreadsheetView/components/Spreadsheet.js +0 -1
  15. package/dist/SpreadsheetView/components/SpreadsheetView.js +0 -1
  16. package/dist/SpreadsheetView/components/StatusBar.js +0 -1
  17. package/dist/SpreadsheetView/components/util.js +0 -1
  18. package/dist/SpreadsheetView/importAdapters/BedImport.js +0 -1
  19. package/dist/SpreadsheetView/importAdapters/ImportUtils.js +0 -1
  20. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +0 -1
  21. package/dist/SpreadsheetView/importAdapters/VcfImport.js +0 -1
  22. package/dist/SpreadsheetView/index.js +0 -1
  23. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -1
  24. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -1
  25. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -1
  26. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -1
  27. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -1
  28. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -1
  29. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -1
  30. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +0 -1
  31. package/dist/SpreadsheetView/models/FilterControls.js +0 -1
  32. package/dist/SpreadsheetView/models/ImportWizard.js +0 -1
  33. package/dist/SpreadsheetView/models/Row.js +0 -1
  34. package/dist/SpreadsheetView/models/Spreadsheet.js +0 -1
  35. package/dist/SpreadsheetView/models/SpreadsheetView.js +0 -1
  36. package/dist/SpreadsheetView/models/StaticRowSet.js +0 -1
  37. package/dist/index.js +0 -1
  38. package/esm/LaunchSpreadsheetView/index.js +0 -1
  39. package/esm/SpreadsheetView/components/CellData.js +0 -1
  40. package/esm/SpreadsheetView/components/ColumnFilterControls.js +0 -1
  41. package/esm/SpreadsheetView/components/ColumnMenu.js +0 -1
  42. package/esm/SpreadsheetView/components/DataRow.js +0 -1
  43. package/esm/SpreadsheetView/components/DataTable.js +0 -1
  44. package/esm/SpreadsheetView/components/DataTableHeader.js +0 -1
  45. package/esm/SpreadsheetView/components/GlobalFilterControls.js +0 -1
  46. package/esm/SpreadsheetView/components/ImportWizard.js +0 -1
  47. package/esm/SpreadsheetView/components/NumberEditor.js +0 -1
  48. package/esm/SpreadsheetView/components/RowCountMessage.js +0 -1
  49. package/esm/SpreadsheetView/components/RowMenu.js +0 -1
  50. package/esm/SpreadsheetView/components/SortIndicator.js +0 -1
  51. package/esm/SpreadsheetView/components/Spreadsheet.js +0 -1
  52. package/esm/SpreadsheetView/components/SpreadsheetView.js +0 -1
  53. package/esm/SpreadsheetView/components/StatusBar.js +0 -1
  54. package/esm/SpreadsheetView/components/util.js +0 -1
  55. package/esm/SpreadsheetView/importAdapters/BedImport.js +0 -1
  56. package/esm/SpreadsheetView/importAdapters/ImportUtils.js +0 -1
  57. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +0 -1
  58. package/esm/SpreadsheetView/importAdapters/VcfImport.js +0 -1
  59. package/esm/SpreadsheetView/index.js +0 -1
  60. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -1
  61. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -1
  62. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -1
  63. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -1
  64. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -1
  65. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -1
  66. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -1
  67. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +0 -1
  68. package/esm/SpreadsheetView/models/FilterControls.js +0 -1
  69. package/esm/SpreadsheetView/models/ImportWizard.js +0 -1
  70. package/esm/SpreadsheetView/models/Row.js +0 -1
  71. package/esm/SpreadsheetView/models/Spreadsheet.js +0 -1
  72. package/esm/SpreadsheetView/models/SpreadsheetView.js +0 -1
  73. package/esm/SpreadsheetView/models/StaticRowSet.js +0 -1
  74. package/esm/index.js +0 -1
  75. package/package.json +4 -5
  76. package/dist/LaunchSpreadsheetView/index.js.map +0 -1
  77. package/dist/SpreadsheetView/components/CellData.js.map +0 -1
  78. package/dist/SpreadsheetView/components/ColumnFilterControls.js.map +0 -1
  79. package/dist/SpreadsheetView/components/ColumnMenu.js.map +0 -1
  80. package/dist/SpreadsheetView/components/DataRow.js.map +0 -1
  81. package/dist/SpreadsheetView/components/DataTable.js.map +0 -1
  82. package/dist/SpreadsheetView/components/DataTableHeader.js.map +0 -1
  83. package/dist/SpreadsheetView/components/GlobalFilterControls.js.map +0 -1
  84. package/dist/SpreadsheetView/components/ImportWizard.js.map +0 -1
  85. package/dist/SpreadsheetView/components/NumberEditor.js.map +0 -1
  86. package/dist/SpreadsheetView/components/RowCountMessage.js.map +0 -1
  87. package/dist/SpreadsheetView/components/RowMenu.js.map +0 -1
  88. package/dist/SpreadsheetView/components/SortIndicator.js.map +0 -1
  89. package/dist/SpreadsheetView/components/Spreadsheet.js.map +0 -1
  90. package/dist/SpreadsheetView/components/SpreadsheetView.js.map +0 -1
  91. package/dist/SpreadsheetView/components/StatusBar.js.map +0 -1
  92. package/dist/SpreadsheetView/components/util.js.map +0 -1
  93. package/dist/SpreadsheetView/importAdapters/BedImport.js.map +0 -1
  94. package/dist/SpreadsheetView/importAdapters/ImportUtils.js.map +0 -1
  95. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js.map +0 -1
  96. package/dist/SpreadsheetView/importAdapters/VcfImport.js.map +0 -1
  97. package/dist/SpreadsheetView/index.js.map +0 -1
  98. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js.map +0 -1
  99. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js.map +0 -1
  100. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js.map +0 -1
  101. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js.map +0 -1
  102. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js.map +0 -1
  103. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js.map +0 -1
  104. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js.map +0 -1
  105. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js.map +0 -1
  106. package/dist/SpreadsheetView/models/FilterControls.js.map +0 -1
  107. package/dist/SpreadsheetView/models/ImportWizard.js.map +0 -1
  108. package/dist/SpreadsheetView/models/Row.js.map +0 -1
  109. package/dist/SpreadsheetView/models/Spreadsheet.js.map +0 -1
  110. package/dist/SpreadsheetView/models/SpreadsheetView.js.map +0 -1
  111. package/dist/SpreadsheetView/models/StaticRowSet.js.map +0 -1
  112. package/dist/index.js.map +0 -1
  113. package/esm/LaunchSpreadsheetView/index.js.map +0 -1
  114. package/esm/SpreadsheetView/components/CellData.js.map +0 -1
  115. package/esm/SpreadsheetView/components/ColumnFilterControls.js.map +0 -1
  116. package/esm/SpreadsheetView/components/ColumnMenu.js.map +0 -1
  117. package/esm/SpreadsheetView/components/DataRow.js.map +0 -1
  118. package/esm/SpreadsheetView/components/DataTable.js.map +0 -1
  119. package/esm/SpreadsheetView/components/DataTableHeader.js.map +0 -1
  120. package/esm/SpreadsheetView/components/GlobalFilterControls.js.map +0 -1
  121. package/esm/SpreadsheetView/components/ImportWizard.js.map +0 -1
  122. package/esm/SpreadsheetView/components/NumberEditor.js.map +0 -1
  123. package/esm/SpreadsheetView/components/RowCountMessage.js.map +0 -1
  124. package/esm/SpreadsheetView/components/RowMenu.js.map +0 -1
  125. package/esm/SpreadsheetView/components/SortIndicator.js.map +0 -1
  126. package/esm/SpreadsheetView/components/Spreadsheet.js.map +0 -1
  127. package/esm/SpreadsheetView/components/SpreadsheetView.js.map +0 -1
  128. package/esm/SpreadsheetView/components/StatusBar.js.map +0 -1
  129. package/esm/SpreadsheetView/components/util.js.map +0 -1
  130. package/esm/SpreadsheetView/importAdapters/BedImport.js.map +0 -1
  131. package/esm/SpreadsheetView/importAdapters/ImportUtils.js.map +0 -1
  132. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js.map +0 -1
  133. package/esm/SpreadsheetView/importAdapters/VcfImport.js.map +0 -1
  134. package/esm/SpreadsheetView/index.js.map +0 -1
  135. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js.map +0 -1
  136. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js.map +0 -1
  137. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js.map +0 -1
  138. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js.map +0 -1
  139. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js.map +0 -1
  140. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js.map +0 -1
  141. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js.map +0 -1
  142. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js.map +0 -1
  143. package/esm/SpreadsheetView/models/FilterControls.js.map +0 -1
  144. package/esm/SpreadsheetView/models/ImportWizard.js.map +0 -1
  145. package/esm/SpreadsheetView/models/Row.js.map +0 -1
  146. package/esm/SpreadsheetView/models/Spreadsheet.js.map +0 -1
  147. package/esm/SpreadsheetView/models/SpreadsheetView.js.map +0 -1
  148. package/esm/SpreadsheetView/models/StaticRowSet.js.map +0 -1
  149. package/esm/index.js.map +0 -1
  150. package/src/LaunchSpreadsheetView/index.ts +0 -40
  151. package/src/SpreadsheetView/components/CellData.tsx +0 -35
  152. package/src/SpreadsheetView/components/ColumnFilterControls.tsx +0 -84
  153. package/src/SpreadsheetView/components/ColumnMenu.tsx +0 -166
  154. package/src/SpreadsheetView/components/DataRow.tsx +0 -126
  155. package/src/SpreadsheetView/components/DataTable.tsx +0 -91
  156. package/src/SpreadsheetView/components/DataTableHeader.tsx +0 -122
  157. package/src/SpreadsheetView/components/GlobalFilterControls.tsx +0 -70
  158. package/src/SpreadsheetView/components/ImportWizard.tsx +0 -139
  159. package/src/SpreadsheetView/components/NumberEditor.tsx +0 -50
  160. package/src/SpreadsheetView/components/RowCountMessage.tsx +0 -44
  161. package/src/SpreadsheetView/components/RowMenu.tsx +0 -65
  162. package/src/SpreadsheetView/components/SortIndicator.tsx +0 -36
  163. package/src/SpreadsheetView/components/Spreadsheet.test.ts +0 -17
  164. package/src/SpreadsheetView/components/Spreadsheet.tsx +0 -46
  165. package/src/SpreadsheetView/components/SpreadsheetView.tsx +0 -119
  166. package/src/SpreadsheetView/components/StatusBar.tsx +0 -75
  167. package/src/SpreadsheetView/components/util.ts +0 -16
  168. package/src/SpreadsheetView/importAdapters/BedImport.test.ts +0 -14
  169. package/src/SpreadsheetView/importAdapters/BedImport.ts +0 -155
  170. package/src/SpreadsheetView/importAdapters/ImportUtils.test.ts +0 -25
  171. package/src/SpreadsheetView/importAdapters/ImportUtils.ts +0 -152
  172. package/src/SpreadsheetView/importAdapters/STARFusionImport.test.ts +0 -27
  173. package/src/SpreadsheetView/importAdapters/STARFusionImport.ts +0 -74
  174. package/src/SpreadsheetView/importAdapters/VcfImport.test.ts +0 -42
  175. package/src/SpreadsheetView/importAdapters/VcfImport.ts +0 -118
  176. package/src/SpreadsheetView/importAdapters/__snapshots__/ImportUtils.test.ts.snap +0 -6555
  177. package/src/SpreadsheetView/importAdapters/__snapshots__/STARFusionImport.test.ts.snap +0 -2354
  178. package/src/SpreadsheetView/importAdapters/__snapshots__/VcfImport.test.ts.snap +0 -16329
  179. package/src/SpreadsheetView/index.ts +0 -20
  180. package/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts +0 -21
  181. package/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts +0 -21
  182. package/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts +0 -21
  183. package/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx +0 -328
  184. package/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx +0 -38
  185. package/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx +0 -177
  186. package/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx +0 -173
  187. package/src/SpreadsheetView/models/ColumnDataTypes/index.ts +0 -34
  188. package/src/SpreadsheetView/models/FilterControls.ts +0 -95
  189. package/src/SpreadsheetView/models/ImportWizard.ts +0 -203
  190. package/src/SpreadsheetView/models/Row.ts +0 -46
  191. package/src/SpreadsheetView/models/Spreadsheet.ts +0 -209
  192. package/src/SpreadsheetView/models/SpreadsheetView.test.ts +0 -8
  193. package/src/SpreadsheetView/models/SpreadsheetView.ts +0 -243
  194. package/src/SpreadsheetView/models/StaticRowSet.ts +0 -65
  195. package/src/SpreadsheetView/test_data/1801160099-N32519_26611_S51_56704.hard-filtered.vcf +0 -174
  196. package/src/SpreadsheetView/test_data/breast_cancer.subset.csv +0 -50
  197. package/src/SpreadsheetView/test_data/diabetes_target.csv.gz +0 -0
  198. package/src/SpreadsheetView/test_data/foo.bed +0 -11
  199. package/src/SpreadsheetView/test_data/location_test.csv +0 -3
  200. package/src/SpreadsheetView/test_data/location_test_2.csv +0 -3
  201. package/src/SpreadsheetView/test_data/reads_lr_skbr3.fa_ngmlr-0.2.3_mapped.bam.sniffles1kb_auto_l8_s5_noalt.bedpe +0 -1405
  202. package/src/SpreadsheetView/test_data/starfusion_example.fusion_predictions.tsv +0 -25
  203. package/src/SpreadsheetView/test_data/volvox.sort.bed +0 -109
  204. package/src/index.ts +0 -38
@@ -1,155 +0,0 @@
1
- import { ParseOptions, parseTsvBuffer } from './ImportUtils'
2
-
3
- const browserBytes = 'browser '.split('').map(c => c.charCodeAt(0))
4
- const trackBytes = 'track '.split('').map(c => c.charCodeAt(0))
5
- const commentBytes = '#'.split('').map(c => c.charCodeAt(0))
6
-
7
- function bytesAreFoundAt(position: number, buffer: Buffer, bytes: number[]) {
8
- let i = 0
9
- for (; i < bytes.length; i += 1) {
10
- if (buffer[position + i] !== bytes[i]) {
11
- return false
12
- }
13
- }
14
- return true
15
- }
16
- export function removeBedHeaders(buffer: Buffer) {
17
- // slice off the first lines of the buffer if it starts with one or more
18
- // header lines
19
- let i = 0
20
- for (; i < buffer.length; i += 1) {
21
- if (
22
- bytesAreFoundAt(i, buffer, browserBytes) ||
23
- bytesAreFoundAt(i, buffer, trackBytes) ||
24
- bytesAreFoundAt(i, buffer, commentBytes)
25
- ) {
26
- // consume up to the next newline
27
- do {
28
- i += 1
29
- } while (buffer[i] !== 10)
30
- } else {
31
- // end of headers, return
32
- break
33
- }
34
- }
35
- if (i) {
36
- return buffer.slice(i)
37
- }
38
- return buffer
39
- }
40
-
41
- export async function parseBedBuffer(buffer: Buffer, options: ParseOptions) {
42
- const b = removeBedHeaders(buffer)
43
- const data = await parseTsvBuffer(b)
44
- const bedColumns = [
45
- { name: 'chrom', dataType: { type: 'LocRef' } },
46
- { name: 'chromStart', dataType: { type: 'LocStart' } },
47
- { name: 'chromEnd', dataType: { type: 'LocEnd' } },
48
- { name: 'name', dataType: { type: 'Text' } },
49
- { name: 'score', dataType: { type: 'Number' } },
50
- { name: 'strand', dataType: { type: 'Text' } },
51
- ]
52
- data.columns.forEach((col, colNumber) => {
53
- const bedColumn = bedColumns[colNumber]
54
- if (bedColumn) {
55
- col.name = bedColumn.name
56
- col.dataType = bedColumn.dataType
57
- }
58
- })
59
- data.hasColumnNames = true
60
- data.assemblyName = options.selectedAssemblyName
61
-
62
- data.columnDisplayOrder.push(data.columnDisplayOrder.length)
63
- data.columns.unshift({
64
- name: 'Location',
65
- dataType: { type: 'LocString' },
66
- isDerived: true,
67
- derivationFunctionText: `jexl:{text:row.cells[0].text+':'+row.cells[1].text+'..'+row.cells[2].text,\n
68
- extendedData: {refName: row.cells.ref.text, start: parseInt(row.cells.start.text,10), end: parseInt(row.cells.end.text,10)}}`,
69
- })
70
- return data
71
- }
72
-
73
- export async function parseBedPEBuffer(buffer: Buffer, options: ParseOptions) {
74
- const b = removeBedHeaders(buffer)
75
- const data = await parseTsvBuffer(b)
76
- interface BedColumn {
77
- name: string
78
- dataType: {
79
- type: string
80
- }
81
- featureField: string[]
82
- }
83
- const bedColumns: BedColumn[] = [
84
- { name: 'chrom1', dataType: { type: 'Text' }, featureField: ['refName'] },
85
- { name: 'start1', dataType: { type: 'Number' }, featureField: ['start'] },
86
- { name: 'end1', dataType: { type: 'Number' }, featureField: ['end'] },
87
- {
88
- name: 'chrom2',
89
- dataType: { type: 'Text' },
90
- featureField: ['mate', 'refName'],
91
- },
92
- {
93
- name: 'start2',
94
- dataType: { type: 'Number' },
95
- featureField: ['mate', 'start'],
96
- },
97
- {
98
- name: 'end2',
99
- dataType: { type: 'Number' },
100
- featureField: ['mate', 'end'],
101
- },
102
- { name: 'name', dataType: { type: 'Text' }, featureField: ['name'] },
103
- { name: 'score', dataType: { type: 'Number' }, featureField: ['score'] },
104
- { name: 'strand1', dataType: { type: 'Text' }, featureField: ['strand'] },
105
- {
106
- name: 'strand2',
107
- dataType: { type: 'Text' },
108
- featureField: ['mate', 'strand'],
109
- },
110
- ]
111
- data.columns.forEach((col, colNumber) => {
112
- const bedColumn = bedColumns[colNumber]
113
- if (bedColumn) {
114
- col.name = bedColumn.name
115
- col.dataType = bedColumn.dataType
116
- }
117
- })
118
- data.hasColumnNames = true
119
-
120
- // decorate each row with a feature object in its extendedData
121
- data.rowSet.rows.forEach((row, rowNumber) => {
122
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
- const featureData: Record<string, any> = {}
124
- row.cells.forEach(({ text }, columnNumber) => {
125
- const bedColumn = bedColumns[columnNumber]
126
- const val =
127
- bedColumn && bedColumn.dataType.type === 'Number' && text
128
- ? parseFloat(text)
129
- : text
130
- if (bedColumn) {
131
- // a predefined column
132
- if (bedColumn.featureField.length === 2) {
133
- if (!featureData[bedColumn.featureField[0]]) {
134
- featureData[bedColumn.featureField[0]] = {}
135
- }
136
- featureData[bedColumn.featureField[0]][bedColumn.featureField[1]] =
137
- val
138
- } else {
139
- featureData[bedColumn.featureField[0]] = val
140
- }
141
- } else {
142
- // some other column
143
- featureData[`column${columnNumber + 1}`] = val
144
- }
145
- })
146
- featureData.uniqueId = `bedpe-${rowNumber}`
147
- row.extendedData = {
148
- feature: featureData,
149
- }
150
- })
151
-
152
- data.assemblyName = options.selectedAssemblyName
153
-
154
- return data
155
- }
@@ -1,25 +0,0 @@
1
- import { promises as fsPromises } from 'fs'
2
- import path from 'path'
3
-
4
- // locals
5
- import { parseCsvBuffer } from './ImportUtils'
6
- import SpreadsheetModel from '../models/Spreadsheet'
7
-
8
- test('csv to spreadsheet snapshot', async () => {
9
- const filepath = path.join(
10
- __dirname,
11
- '..',
12
- 'test_data',
13
- 'breast_cancer.subset.csv',
14
- )
15
- const buf = await fsPromises.readFile(filepath)
16
- const spreadsheetSnap = await parseCsvBuffer(buf, {
17
- hasColumnNameLine: true,
18
- columnNameLineNumber: 1,
19
- isValidRefName: () => true,
20
- })
21
- expect(spreadsheetSnap).toMatchSnapshot()
22
- // @ts-expect-error
23
- const spreadsheet = SpreadsheetModel.create(spreadsheetSnap)
24
- expect(spreadsheet.rowSet.rows.length).toBe(49)
25
- })
@@ -1,152 +0,0 @@
1
- import { parseLocString } from '@jbrowse/core/util'
2
-
3
- export function bufferToString(buffer: Buffer) {
4
- return new TextDecoder('utf8', { fatal: true }).decode(buffer)
5
- }
6
-
7
- async function parseWith(buffer: Buffer, options = {}) {
8
- const csv = await import('csvtojson').then(module => module.default)
9
- return csv({ noheader: true, output: 'csv', ...options }).fromString(
10
- bufferToString(buffer),
11
- )
12
- }
13
-
14
- export interface Row {
15
- id: string
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- extendedData?: any
18
- cells: {
19
- text: string
20
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
- extendedData?: any
22
- }[]
23
- }
24
-
25
- export interface RowSet {
26
- isLoaded: boolean
27
- rows: Row[]
28
- }
29
-
30
- export interface ParseOptions {
31
- hasColumnNameLine?: boolean
32
- columnNameLineNumber?: number
33
- selectedAssemblyName?: string
34
- isValidRefName?: (refName: string, assemblyName?: string) => boolean
35
- }
36
-
37
- export interface Column {
38
- name: string
39
- dataType: { type: string }
40
- isDerived?: boolean
41
- derivationFunctionText?: string
42
- }
43
-
44
- function guessColumnType(
45
- rowSet: RowSet,
46
- columnNumber: number,
47
- isValidRefName: (refName: string, assemblyName?: string) => boolean,
48
- ) {
49
- const text = rowSet.rows[0].cells[columnNumber].text || ''
50
-
51
- let guessedType = 'Text'
52
-
53
- let parsedLoc
54
- try {
55
- parsedLoc = parseLocString(text, isValidRefName)
56
- } catch (error) {
57
- //
58
- }
59
- if (parsedLoc && parsedLoc.refName && typeof parsedLoc.start === 'number') {
60
- guessedType = 'LocString'
61
- } else if (/^\d+(\.\d+)?$/.test(text)) {
62
- guessedType = 'Number'
63
- }
64
-
65
- // MAYBE TODO: iterate over the rest of the rows to confirm
66
- // the type for all the rows
67
-
68
- return guessedType
69
- }
70
-
71
- function dataToSpreadsheetSnapshot(
72
- rows: string[][],
73
- options: ParseOptions = {},
74
- ) {
75
- const {
76
- hasColumnNameLine = false,
77
- columnNameLineNumber = 1,
78
- isValidRefName = () => false,
79
- selectedAssemblyName,
80
- } = options
81
- // rows is an array of row objects and columnNames
82
- // is an array of column names (in import order)
83
- let maxCols = 0
84
- const rowSet: RowSet = {
85
- isLoaded: true,
86
- rows: rows.map((row, rowNumber) => {
87
- const id = rowNumber + (hasColumnNameLine ? 0 : 1)
88
- if (row.length > maxCols) {
89
- maxCols = row.length
90
- }
91
- return {
92
- id: String(id),
93
- cells: row.map((text, columnNumber) => {
94
- return { columnNumber, text }
95
- }),
96
- }
97
- }),
98
- }
99
-
100
- // process the column names row if present
101
- const columnNames: Record<string, string> = {}
102
- if (hasColumnNameLine && columnNameLineNumber !== undefined) {
103
- const [colNamesRow] = rowSet.rows.splice(columnNameLineNumber - 1, 1)
104
-
105
- if (colNamesRow) {
106
- colNamesRow.cells.forEach((cell, columnNumber) => {
107
- columnNames[columnNumber] = cell.text || ''
108
- })
109
- }
110
- }
111
-
112
- // make our column definitions
113
- const columns: Column[] = []
114
- const columnDisplayOrder = []
115
- for (let columnNumber = 0; columnNumber < maxCols; columnNumber += 1) {
116
- columnDisplayOrder.push(columnNumber)
117
- const guessedType = guessColumnType(rowSet, columnNumber, isValidRefName)
118
-
119
- // store extendeddata for LocString column
120
- if (guessedType === 'LocString') {
121
- for (const row of rowSet.rows) {
122
- const cell = row.cells[columnNumber]
123
- cell.extendedData = parseLocString(cell.text, isValidRefName)
124
- }
125
- }
126
-
127
- columns[columnNumber] = {
128
- name: columnNames[columnNumber],
129
- dataType: {
130
- type: guessedType,
131
- },
132
- }
133
- }
134
-
135
- return {
136
- rowSet,
137
- columnDisplayOrder,
138
- hasColumnNames: !!hasColumnNameLine,
139
- columns,
140
- assemblyName: selectedAssemblyName,
141
- }
142
- }
143
-
144
- export async function parseCsvBuffer(buffer: Buffer, options?: ParseOptions) {
145
- const rows = await parseWith(buffer)
146
- return dataToSpreadsheetSnapshot(rows, options)
147
- }
148
-
149
- export async function parseTsvBuffer(buffer: Buffer, options?: ParseOptions) {
150
- const rows = await parseWith(buffer, { delimiter: '\t' })
151
- return dataToSpreadsheetSnapshot(rows, options)
152
- }
@@ -1,27 +0,0 @@
1
- import { promises as fsPromises } from 'fs'
2
- import path from 'path'
3
-
4
- // locals
5
- import { parseSTARFusionBuffer } from './STARFusionImport'
6
- import SpreadsheetModel from '../models/Spreadsheet'
7
-
8
- test('starfusion import', async () => {
9
- const filepath = path.join(
10
- __dirname,
11
- '..',
12
- 'test_data',
13
- 'starfusion_example.fusion_predictions.tsv',
14
- )
15
- const buf = await fsPromises.readFile(filepath)
16
- const spreadsheetSnap = await parseSTARFusionBuffer(buf, {
17
- selectedAssemblyName: 'fogbat',
18
- isValidRefName() {
19
- return true
20
- },
21
- })
22
- expect(spreadsheetSnap).toMatchSnapshot()
23
-
24
- // @ts-expect-error
25
- const spreadsheet = SpreadsheetModel.create(spreadsheetSnap)
26
- expect(spreadsheet.rowSet.rows.length).toBe(24)
27
- })
@@ -1,74 +0,0 @@
1
- import { parseTsvBuffer, ParseOptions } from './ImportUtils'
2
-
3
- function parseSTARFusionBreakpointString(str: string) {
4
- const fields = str.split(':')
5
- const refName = fields[0]
6
- const pos = Number.parseInt(fields[1], 10)
7
- const strand = fields[2] === '-' ? -1 : 1
8
- return { refName, pos, strand }
9
- }
10
-
11
- const numericColumns: Record<string, boolean> = {
12
- SpanningFragCount: true,
13
- FFPM: true,
14
- LeftBreakEntropy: true,
15
- RightBreakEntropy: true,
16
- JunctionReadCount: true,
17
- }
18
-
19
- export async function parseSTARFusionBuffer(
20
- buffer: Buffer,
21
- options: ParseOptions,
22
- ) {
23
- const data = await parseTsvBuffer(buffer, {
24
- hasColumnNameLine: true,
25
- columnNameLineNumber: 1,
26
- selectedAssemblyName: options.selectedAssemblyName,
27
- isValidRefName: () => false,
28
- })
29
-
30
- // remove the # in #FusionName
31
- data.columns[0].name = data.columns[0].name.replace('#', '')
32
- // set some columns to be numeric
33
- data.columns.forEach(col => {
34
- if (numericColumns[col.name]) {
35
- col.dataType = { type: 'Number' }
36
- }
37
- })
38
-
39
- // decorate each row with a feature object in its extendedData
40
- data.rowSet.rows.forEach((row, rowNumber) => {
41
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
- const featureData: Record<string, any> = {}
43
- row.cells.forEach(({ text }, columnNumber) => {
44
- const column = data.columns[columnNumber]
45
- if (column.name === 'LeftBreakpoint' && text) {
46
- const { refName, pos, strand } = parseSTARFusionBreakpointString(text)
47
- featureData.refName = refName
48
- featureData.start = pos
49
- featureData.end = pos
50
- featureData.strand = strand
51
- } else if (column.name === 'RightBreakpoint' && text) {
52
- const { refName, pos, strand } = parseSTARFusionBreakpointString(text)
53
- featureData.mate = {
54
- refName,
55
- start: pos,
56
- end: pos,
57
- strand,
58
- }
59
- } else if (text && numericColumns[column.name]) {
60
- // some other column, numeric
61
- featureData[column.name] = parseFloat(text)
62
- } else {
63
- // some other column, text
64
- featureData[column.name] = text
65
- }
66
- })
67
- featureData.uniqueId = `sf-${rowNumber + 1}`
68
- row.extendedData = {
69
- feature: featureData,
70
- }
71
- })
72
-
73
- return data
74
- }
@@ -1,42 +0,0 @@
1
- import { promises as fsPromises } from 'fs'
2
- import path from 'path'
3
- import { parseVcfBuffer, splitVcfFileHeaderAndBody } from './VcfImport'
4
- import SpreadsheetModel from '../models/Spreadsheet'
5
-
6
- describe('vcf file splitter', () => {
7
- const cases: [string, {}][] = [
8
- [
9
- '##fileformat=VCFv4.3\nfogbat\n',
10
- { header: '##fileformat=VCFv4.3\n', body: 'fogbat\n' },
11
- ],
12
- [
13
- '##fileformat=VCFv4.3\n##zonker\n##deek\n##donk\nfogbat\n',
14
- {
15
- header: '##fileformat=VCFv4.3\n##zonker\n##deek\n##donk\n',
16
- body: 'fogbat\n',
17
- },
18
- ],
19
- ]
20
-
21
- cases.forEach(([input, output], caseNumber) => {
22
- test(`case ${caseNumber}`, () => {
23
- expect(splitVcfFileHeaderAndBody(input)).toEqual(output)
24
- })
25
- })
26
- })
27
-
28
- test('vcf file import', async () => {
29
- const filepath = path.join(
30
- __dirname,
31
- '..',
32
- 'test_data',
33
- '1801160099-N32519_26611_S51_56704.hard-filtered.vcf',
34
- )
35
- const buf = await fsPromises.readFile(filepath)
36
- const spreadsheetSnap = parseVcfBuffer(buf)
37
- expect(spreadsheetSnap).toMatchSnapshot()
38
-
39
- // @ts-expect-error
40
- const spreadsheet = SpreadsheetModel.create(spreadsheetSnap)
41
- expect(spreadsheet.rowSet.rows.length).toBe(101)
42
- })
@@ -1,118 +0,0 @@
1
- import VCF from '@gmod/vcf'
2
- import { VcfFeature } from '@jbrowse/plugin-variants'
3
- import {
4
- bufferToString,
5
- Row,
6
- RowSet,
7
- Column,
8
- ParseOptions,
9
- } from './ImportUtils'
10
-
11
- const vcfCoreColumns: { name: string; type: string }[] = [
12
- { name: 'CHROM', type: 'Text' }, // 0
13
- { name: 'POS', type: 'Number' }, // 1
14
- { name: 'ID', type: 'Text' }, // 2
15
- { name: 'REF', type: 'Text' }, // 3
16
- { name: 'ALT', type: 'Text' }, // 4
17
- { name: 'QUAL', type: 'Number' }, // 5
18
- { name: 'FILTER', type: 'Text' }, // 6
19
- { name: 'INFO', type: 'Text' }, // 7
20
- { name: 'FORMAT', type: 'Text' }, // 8
21
- ]
22
-
23
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
- function vcfRecordToRow(vcfParser: any, line: string, lineNumber: number): Row {
25
- const vcfVariant = vcfParser.parseLine(line)
26
- const vcfFeature = new VcfFeature({
27
- variant: vcfVariant,
28
- parser: vcfParser,
29
- id: `vcf-${lineNumber}`,
30
- })
31
-
32
- const data = line.split('\t').map(d => (d === '.' ? '' : d))
33
- // no format column, add blank
34
- if (data.length === 8) {
35
- data.push('')
36
- }
37
- const row: Row = {
38
- id: String(lineNumber + 1),
39
- extendedData: { vcfFeature: vcfFeature.toJSON() },
40
- cells: data.map((text, columnNumber) => {
41
- return {
42
- columnNumber,
43
- text,
44
- }
45
- }),
46
- }
47
- return row
48
- }
49
-
50
- export function parseVcfBuffer(buffer: Buffer, options: ParseOptions = {}) {
51
- const { selectedAssemblyName } = options
52
- let { header, body } = splitVcfFileHeaderAndBody(bufferToString(buffer))
53
- const rows: Row[] = []
54
- const vcfParser = new VCF({ header })
55
- header = '' // garbage collect
56
- body.split(/\n|\r\n|\r/).forEach((line: string, lineNumber) => {
57
- if (/\S/.test(line)) {
58
- rows.push(vcfRecordToRow(vcfParser, line, lineNumber))
59
- }
60
- })
61
- body = '' // garbage collect
62
-
63
- const rowSet: RowSet = {
64
- isLoaded: true,
65
- rows,
66
- }
67
-
68
- const columnDisplayOrder: number[] = []
69
- const columns: Column[] = []
70
- for (let i = 0; i < vcfCoreColumns.length; i += 1) {
71
- columnDisplayOrder.push(i)
72
- columns[i] = {
73
- name: vcfCoreColumns[i].name,
74
- dataType: { type: vcfCoreColumns[i].type },
75
- }
76
- }
77
- for (let i = 0; i < vcfParser.samples.length; i += 1) {
78
- const oi = vcfCoreColumns.length + i
79
- columnDisplayOrder.push(oi)
80
- columns[oi] = { name: vcfParser.samples[i], dataType: { type: 'Text' } }
81
- }
82
-
83
- columnDisplayOrder.push(columnDisplayOrder.length)
84
- columns.unshift({
85
- name: 'Location',
86
- dataType: { type: 'LocString' },
87
- isDerived: true,
88
- derivationFunctionText: `jexl:{text:row.extendedData.vcfFeature.refName+':'\n
89
- +row.extendedData.vcfFeature.start+'..'+row.extendedData.vcfFeature.end, extendedData:\n
90
- {refName:row.extendedData.vcfFeature.refName,start:row.extendedData.vcfFeature.start,end:row.extendedData.vcfFeature.end}}`,
91
- })
92
-
93
- return {
94
- rowSet,
95
- columnDisplayOrder,
96
- hasColumnNames: true,
97
- columns,
98
- assemblyName: selectedAssemblyName,
99
- }
100
- }
101
-
102
- export function splitVcfFileHeaderAndBody(wholeFile: string) {
103
- // split into header and the rest of the file
104
- let headerEndIndex = 0
105
- let prevChar
106
- for (; headerEndIndex < wholeFile.length; headerEndIndex += 1) {
107
- const c = wholeFile[headerEndIndex]
108
- if (prevChar === '\n' && c !== '#') {
109
- break
110
- }
111
- prevChar = c
112
- }
113
-
114
- return {
115
- header: wholeFile.slice(0, Math.max(0, headerEndIndex)),
116
- body: wholeFile.slice(headerEndIndex),
117
- }
118
- }