@jbrowse/plugin-spreadsheet-view 2.17.0 → 3.0.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 (201) hide show
  1. package/dist/LaunchSpreadsheetView/index.d.ts +1 -1
  2. package/dist/LaunchSpreadsheetView/index.js +1 -3
  3. package/dist/SpreadsheetView/ImportWizard.d.ts +51 -0
  4. package/dist/SpreadsheetView/ImportWizard.js +250 -0
  5. package/dist/SpreadsheetView/SpreadsheetModel.d.ts +78 -0
  6. package/dist/SpreadsheetView/SpreadsheetModel.js +119 -0
  7. package/dist/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
  8. package/dist/SpreadsheetView/SpreadsheetViewModel.js +101 -0
  9. package/dist/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
  10. package/dist/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +5 -0
  11. package/dist/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
  12. package/dist/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +5 -0
  13. package/dist/SpreadsheetView/components/FeatureMenu.d.ts +7 -0
  14. package/dist/SpreadsheetView/components/FeatureMenu.js +105 -0
  15. package/dist/SpreadsheetView/components/ImportWizard.d.ts +3 -4
  16. package/dist/SpreadsheetView/components/ImportWizard.js +25 -68
  17. package/dist/SpreadsheetView/components/LocationCell.d.ts +7 -0
  18. package/dist/SpreadsheetView/components/LocationCell.js +29 -0
  19. package/dist/SpreadsheetView/components/NumberEditor.d.ts +2 -3
  20. package/dist/SpreadsheetView/components/NumberEditor.js +4 -28
  21. package/dist/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +5 -0
  22. package/dist/SpreadsheetView/components/SpreadsheetDataGrid.js +23 -0
  23. package/dist/SpreadsheetView/components/SpreadsheetView.d.ts +4 -5
  24. package/dist/SpreadsheetView/components/SpreadsheetView.js +25 -63
  25. package/dist/SpreadsheetView/components/SpreadsheetViewActual.d.ts +5 -0
  26. package/dist/SpreadsheetView/components/SpreadsheetViewActual.js +34 -0
  27. package/dist/SpreadsheetView/components/TrackSelector.d.ts +6 -0
  28. package/dist/SpreadsheetView/components/TrackSelector.js +27 -0
  29. package/dist/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
  30. package/dist/SpreadsheetView/importAdapters/BedImport.js +53 -139
  31. package/dist/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
  32. package/dist/SpreadsheetView/importAdapters/BedpeImport.js +79 -0
  33. package/dist/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
  34. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
  35. package/dist/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
  36. package/dist/SpreadsheetView/importAdapters/VcfImport.js +53 -98
  37. package/dist/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
  38. package/dist/SpreadsheetView/importAdapters/isNumber.js +14 -0
  39. package/dist/SpreadsheetView/importAdapters/util.d.ts +2 -0
  40. package/dist/SpreadsheetView/importAdapters/util.js +22 -0
  41. package/dist/SpreadsheetView/index.d.ts +2 -2
  42. package/dist/SpreadsheetView/index.js +19 -9
  43. package/dist/SpreadsheetView/util.d.ts +7 -0
  44. package/dist/SpreadsheetView/util.js +13 -0
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +1 -3
  47. package/esm/LaunchSpreadsheetView/index.d.ts +1 -1
  48. package/esm/LaunchSpreadsheetView/index.js +1 -3
  49. package/esm/SpreadsheetView/ImportWizard.d.ts +51 -0
  50. package/esm/SpreadsheetView/ImportWizard.js +214 -0
  51. package/esm/SpreadsheetView/SpreadsheetModel.d.ts +78 -0
  52. package/esm/SpreadsheetView/SpreadsheetModel.js +113 -0
  53. package/esm/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
  54. package/esm/SpreadsheetView/SpreadsheetViewModel.js +95 -0
  55. package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
  56. package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +1 -0
  57. package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
  58. package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +1 -0
  59. package/esm/SpreadsheetView/components/FeatureMenu.d.ts +7 -0
  60. package/esm/SpreadsheetView/components/FeatureMenu.js +66 -0
  61. package/esm/SpreadsheetView/components/ImportWizard.d.ts +3 -4
  62. package/esm/SpreadsheetView/components/ImportWizard.js +26 -46
  63. package/esm/SpreadsheetView/components/LocationCell.d.ts +7 -0
  64. package/esm/SpreadsheetView/components/LocationCell.js +23 -0
  65. package/esm/SpreadsheetView/components/NumberEditor.d.ts +2 -3
  66. package/esm/SpreadsheetView/components/NumberEditor.js +4 -5
  67. package/esm/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +5 -0
  68. package/esm/SpreadsheetView/components/SpreadsheetDataGrid.js +21 -0
  69. package/esm/SpreadsheetView/components/SpreadsheetView.d.ts +4 -5
  70. package/esm/SpreadsheetView/components/SpreadsheetView.js +8 -56
  71. package/esm/SpreadsheetView/components/SpreadsheetViewActual.d.ts +5 -0
  72. package/esm/SpreadsheetView/components/SpreadsheetViewActual.js +29 -0
  73. package/esm/SpreadsheetView/components/TrackSelector.d.ts +6 -0
  74. package/esm/SpreadsheetView/components/TrackSelector.js +25 -0
  75. package/esm/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
  76. package/esm/SpreadsheetView/importAdapters/BedImport.js +53 -137
  77. package/esm/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
  78. package/esm/SpreadsheetView/importAdapters/BedpeImport.js +76 -0
  79. package/esm/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
  80. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
  81. package/esm/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
  82. package/esm/SpreadsheetView/importAdapters/VcfImport.js +53 -97
  83. package/esm/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
  84. package/esm/SpreadsheetView/importAdapters/isNumber.js +11 -0
  85. package/esm/SpreadsheetView/importAdapters/util.d.ts +2 -0
  86. package/esm/SpreadsheetView/importAdapters/util.js +18 -0
  87. package/esm/SpreadsheetView/index.d.ts +2 -2
  88. package/esm/SpreadsheetView/index.js +2 -2
  89. package/esm/SpreadsheetView/util.d.ts +7 -0
  90. package/esm/SpreadsheetView/util.js +10 -0
  91. package/esm/index.d.ts +1 -1
  92. package/esm/index.js +1 -3
  93. package/package.json +7 -7
  94. package/dist/SpreadsheetView/components/CellData.d.ts +0 -9
  95. package/dist/SpreadsheetView/components/CellData.js +0 -14
  96. package/dist/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
  97. package/dist/SpreadsheetView/components/ColumnFilterControls.js +0 -58
  98. package/dist/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
  99. package/dist/SpreadsheetView/components/ColumnMenu.js +0 -140
  100. package/dist/SpreadsheetView/components/DataRow.d.ts +0 -12
  101. package/dist/SpreadsheetView/components/DataRow.js +0 -81
  102. package/dist/SpreadsheetView/components/DataTable.d.ts +0 -10
  103. package/dist/SpreadsheetView/components/DataTable.js +0 -42
  104. package/dist/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
  105. package/dist/SpreadsheetView/components/DataTableHeader.js +0 -104
  106. package/dist/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
  107. package/dist/SpreadsheetView/components/GlobalFilterControls.js +0 -68
  108. package/dist/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
  109. package/dist/SpreadsheetView/components/RowCountMessage.js +0 -33
  110. package/dist/SpreadsheetView/components/RowMenu.d.ts +0 -9
  111. package/dist/SpreadsheetView/components/RowMenu.js +0 -39
  112. package/dist/SpreadsheetView/components/SortIndicator.d.ts +0 -6
  113. package/dist/SpreadsheetView/components/SortIndicator.js +0 -27
  114. package/dist/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
  115. package/dist/SpreadsheetView/components/Spreadsheet.js +0 -25
  116. package/dist/SpreadsheetView/components/StatusBar.d.ts +0 -11
  117. package/dist/SpreadsheetView/components/StatusBar.js +0 -44
  118. package/dist/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
  119. package/dist/SpreadsheetView/importAdapters/ImportUtils.js +0 -123
  120. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
  121. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -20
  122. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
  123. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -20
  124. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
  125. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -20
  126. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
  127. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -183
  128. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
  129. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -23
  130. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
  131. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -126
  132. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
  133. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -129
  134. package/dist/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
  135. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +0 -37
  136. package/dist/SpreadsheetView/models/FilterControls.d.ts +0 -26
  137. package/dist/SpreadsheetView/models/FilterControls.js +0 -85
  138. package/dist/SpreadsheetView/models/ImportWizard.d.ts +0 -31
  139. package/dist/SpreadsheetView/models/ImportWizard.js +0 -186
  140. package/dist/SpreadsheetView/models/Row.d.ts +0 -17
  141. package/dist/SpreadsheetView/models/Row.js +0 -43
  142. package/dist/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
  143. package/dist/SpreadsheetView/models/Spreadsheet.js +0 -174
  144. package/dist/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
  145. package/dist/SpreadsheetView/models/SpreadsheetView.js +0 -199
  146. package/dist/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
  147. package/dist/SpreadsheetView/models/StaticRowSet.js +0 -56
  148. package/esm/SpreadsheetView/components/CellData.d.ts +0 -9
  149. package/esm/SpreadsheetView/components/CellData.js +0 -9
  150. package/esm/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
  151. package/esm/SpreadsheetView/components/ColumnFilterControls.js +0 -53
  152. package/esm/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
  153. package/esm/SpreadsheetView/components/ColumnMenu.js +0 -135
  154. package/esm/SpreadsheetView/components/DataRow.d.ts +0 -12
  155. package/esm/SpreadsheetView/components/DataRow.js +0 -76
  156. package/esm/SpreadsheetView/components/DataTable.d.ts +0 -10
  157. package/esm/SpreadsheetView/components/DataTable.js +0 -37
  158. package/esm/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
  159. package/esm/SpreadsheetView/components/DataTableHeader.js +0 -76
  160. package/esm/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
  161. package/esm/SpreadsheetView/components/GlobalFilterControls.js +0 -40
  162. package/esm/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
  163. package/esm/SpreadsheetView/components/RowCountMessage.js +0 -28
  164. package/esm/SpreadsheetView/components/RowMenu.d.ts +0 -9
  165. package/esm/SpreadsheetView/components/RowMenu.js +0 -34
  166. package/esm/SpreadsheetView/components/SortIndicator.d.ts +0 -6
  167. package/esm/SpreadsheetView/components/SortIndicator.js +0 -21
  168. package/esm/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
  169. package/esm/SpreadsheetView/components/Spreadsheet.js +0 -20
  170. package/esm/SpreadsheetView/components/StatusBar.d.ts +0 -11
  171. package/esm/SpreadsheetView/components/StatusBar.js +0 -39
  172. package/esm/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
  173. package/esm/SpreadsheetView/importAdapters/ImportUtils.js +0 -95
  174. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
  175. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -15
  176. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
  177. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -15
  178. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
  179. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -15
  180. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
  181. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -178
  182. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
  183. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -20
  184. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
  185. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -119
  186. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
  187. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -122
  188. package/esm/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
  189. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +0 -29
  190. package/esm/SpreadsheetView/models/FilterControls.d.ts +0 -26
  191. package/esm/SpreadsheetView/models/FilterControls.js +0 -83
  192. package/esm/SpreadsheetView/models/ImportWizard.d.ts +0 -31
  193. package/esm/SpreadsheetView/models/ImportWizard.js +0 -161
  194. package/esm/SpreadsheetView/models/Row.d.ts +0 -17
  195. package/esm/SpreadsheetView/models/Row.js +0 -41
  196. package/esm/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
  197. package/esm/SpreadsheetView/models/Spreadsheet.js +0 -169
  198. package/esm/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
  199. package/esm/SpreadsheetView/models/SpreadsheetView.js +0 -194
  200. package/esm/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
  201. package/esm/SpreadsheetView/models/StaticRowSet.js +0 -51
@@ -1,144 +1,58 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.removeBedHeaders = removeBedHeaders;
4
3
  exports.parseBedBuffer = parseBedBuffer;
5
- exports.parseBedPEBuffer = parseBedPEBuffer;
6
- const ImportUtils_1 = require("./ImportUtils");
7
- const browserBytes = 'browser '.split('').map(c => c.charCodeAt(0));
8
- const trackBytes = 'track '.split('').map(c => c.charCodeAt(0));
9
- const commentBytes = '#'.split('').map(c => c.charCodeAt(0));
10
- function bytesAreFoundAt(position, buffer, bytes) {
11
- let i = 0;
12
- for (; i < bytes.length; i += 1) {
13
- if (buffer[position + i] !== bytes[i]) {
14
- return false;
15
- }
16
- }
17
- return true;
18
- }
19
- function removeBedHeaders(buffer) {
20
- // slice off the first lines of the buffer if it starts with one or more
21
- // header lines
22
- let i = 0;
23
- for (; i < buffer.length; i += 1) {
24
- if (bytesAreFoundAt(i, buffer, browserBytes) ||
25
- bytesAreFoundAt(i, buffer, trackBytes) ||
26
- bytesAreFoundAt(i, buffer, commentBytes)) {
27
- // consume up to the next newline
28
- do {
29
- i += 1;
30
- } while (buffer[i] !== 10);
31
- }
32
- else {
33
- // end of headers, return
34
- break;
35
- }
36
- }
37
- if (i) {
38
- return buffer.subarray(i);
39
- }
40
- return buffer;
41
- }
42
- async function parseBedBuffer(buffer, options) {
43
- const b = removeBedHeaders(buffer);
44
- const data = await (0, ImportUtils_1.parseTsvBuffer)(b);
45
- const bedColumns = [
46
- { name: 'chrom', dataType: { type: 'LocRef' } },
47
- { name: 'chromStart', dataType: { type: 'LocStart' } },
48
- { name: 'chromEnd', dataType: { type: 'LocEnd' } },
49
- { name: 'name', dataType: { type: 'Text' } },
50
- { name: 'score', dataType: { type: 'Number' } },
51
- { name: 'strand', dataType: { type: 'Text' } },
52
- ];
53
- data.columns.forEach((col, colNumber) => {
54
- const bedColumn = bedColumns[colNumber];
55
- if (bedColumn) {
56
- col.name = bedColumn.name;
57
- col.dataType = bedColumn.dataType;
58
- }
59
- });
60
- data.hasColumnNames = true;
61
- data.assemblyName = options.selectedAssemblyName;
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
- async function parseBedPEBuffer(buffer, options) {
73
- const b = removeBedHeaders(buffer);
74
- const data = await (0, ImportUtils_1.parseTsvBuffer)(b);
75
- const bedColumns = [
76
- { name: 'chrom1', dataType: { type: 'Text' }, featureField: ['refName'] },
77
- { name: 'start1', dataType: { type: 'Number' }, featureField: ['start'] },
78
- { name: 'end1', dataType: { type: 'Number' }, featureField: ['end'] },
79
- {
80
- name: 'chrom2',
81
- dataType: { type: 'Text' },
82
- featureField: ['mate', 'refName'],
83
- },
84
- {
85
- name: 'start2',
86
- dataType: { type: 'Number' },
87
- featureField: ['mate', 'start'],
88
- },
89
- {
90
- name: 'end2',
91
- dataType: { type: 'Number' },
92
- featureField: ['mate', 'end'],
93
- },
94
- { name: 'name', dataType: { type: 'Text' }, featureField: ['name'] },
95
- { name: 'score', dataType: { type: 'Number' }, featureField: ['score'] },
96
- { name: 'strand1', dataType: { type: 'Text' }, featureField: ['strand'] },
97
- {
98
- name: 'strand2',
99
- dataType: { type: 'Text' },
100
- featureField: ['mate', 'strand'],
4
+ const isNumber_1 = require("./isNumber");
5
+ const util_1 = require("./util");
6
+ function parseBedBuffer(buffer) {
7
+ var _a, _b;
8
+ const lines = (0, util_1.bufferToLines)(buffer);
9
+ const rest = lines.filter(line => !(line.startsWith('#') ||
10
+ line.startsWith('browser') ||
11
+ line.startsWith('track')));
12
+ const lastHeaderLine = lines.findLast(line => line.startsWith('#'));
13
+ const coreColumns = ['refName', 'start', 'end'];
14
+ const numExtraColumns = Math.max(0, (((_b = (_a = rest[0]) === null || _a === void 0 ? void 0 : _a.split('\t')) === null || _b === void 0 ? void 0 : _b.length) || 0) - coreColumns.length);
15
+ const extraNames = (lastHeaderLine === null || lastHeaderLine === void 0 ? void 0 : lastHeaderLine.includes('\t'))
16
+ ? lastHeaderLine
17
+ .slice(1)
18
+ .split('\t')
19
+ .slice(coreColumns.length)
20
+ .map(t => t.trim())
21
+ : Array.from({ length: numExtraColumns }, (_v, i) => `field_${i}`);
22
+ const colNames = [...coreColumns, ...extraNames];
23
+ return {
24
+ columns: colNames.map(c => ({ name: c })),
25
+ rowSet: {
26
+ rows: rest.map((line, idx) => {
27
+ const cols = line.split('\t');
28
+ return {
29
+ cellData: {
30
+ refName: cols[0],
31
+ start: +cols[1],
32
+ end: +cols[2],
33
+ name: cols[3],
34
+ score: cols[4],
35
+ strand: cols[5],
36
+ ...Object.fromEntries(extraNames.map((n, idx) => {
37
+ const r = cols[idx + coreColumns.length];
38
+ return [n, (0, isNumber_1.isNumber)(r) ? +r : r];
39
+ })),
40
+ },
41
+ feature: {
42
+ uniqueId: `bed-${idx}`,
43
+ refName: cols[0],
44
+ start: +cols[1],
45
+ end: +cols[2],
46
+ name: cols[3],
47
+ score: cols[4],
48
+ strand: (0, util_1.parseStrand)(cols[5]),
49
+ ...Object.fromEntries(extraNames.map((n, idx) => {
50
+ const r = cols[idx + coreColumns.length];
51
+ return [n, (0, isNumber_1.isNumber)(r) ? +r : r];
52
+ })),
53
+ },
54
+ };
55
+ }),
101
56
  },
102
- ];
103
- data.columns.forEach((col, colNumber) => {
104
- const bedColumn = bedColumns[colNumber];
105
- if (bedColumn) {
106
- col.name = bedColumn.name;
107
- col.dataType = bedColumn.dataType;
108
- }
109
- });
110
- data.hasColumnNames = true;
111
- // decorate each row with a feature object in its extendedData
112
- data.rowSet.rows.forEach((row, rowNumber) => {
113
- const featureData = {};
114
- row.cells.forEach(({ text }, columnNumber) => {
115
- const bedColumn = bedColumns[columnNumber];
116
- const val = bedColumn && bedColumn.dataType.type === 'Number' && text
117
- ? Number.parseFloat(text)
118
- : text;
119
- if (bedColumn) {
120
- // a predefined column
121
- if (bedColumn.featureField.length === 2) {
122
- if (!featureData[bedColumn.featureField[0]]) {
123
- featureData[bedColumn.featureField[0]] = {};
124
- }
125
- featureData[bedColumn.featureField[0]][bedColumn.featureField[1]] =
126
- val;
127
- }
128
- else {
129
- featureData[bedColumn.featureField[0]] = val;
130
- }
131
- }
132
- else {
133
- // some other column
134
- featureData[`column${columnNumber + 1}`] = val;
135
- }
136
- });
137
- featureData.uniqueId = `bedpe-${rowNumber}`;
138
- row.extendedData = {
139
- feature: featureData,
140
- };
141
- });
142
- data.assemblyName = options.selectedAssemblyName;
143
- return data;
57
+ };
144
58
  }
@@ -0,0 +1,36 @@
1
+ export declare function parseBedPEBuffer(buffer: Uint8Array): {
2
+ columns: {
3
+ name: string;
4
+ }[];
5
+ rowSet: {
6
+ rows: {
7
+ cellData: {
8
+ refName: string | undefined;
9
+ start: string | undefined;
10
+ end: string | undefined;
11
+ mateRefName: string | undefined;
12
+ mateStart: string | undefined;
13
+ mateEnd: string | undefined;
14
+ name: string | undefined;
15
+ score: string | number | undefined;
16
+ strand: string | undefined;
17
+ mateStrand: string | undefined;
18
+ };
19
+ feature: {
20
+ uniqueId: string;
21
+ refName: string | undefined;
22
+ start: number;
23
+ end: number;
24
+ strand: number | undefined;
25
+ mate: {
26
+ refName: string | undefined;
27
+ start: number;
28
+ end: number;
29
+ strand: number | undefined;
30
+ };
31
+ name: string | undefined;
32
+ score: string | undefined;
33
+ };
34
+ }[];
35
+ };
36
+ };
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBedPEBuffer = parseBedPEBuffer;
4
+ const internals_1 = require("@mui/x-data-grid/internals");
5
+ const util_1 = require("./util");
6
+ function parseBedPEBuffer(buffer) {
7
+ var _a, _b;
8
+ const lines = (0, util_1.bufferToLines)(buffer);
9
+ const rest = lines.filter(line => !(line.startsWith('#') ||
10
+ line.startsWith('browser') ||
11
+ line.startsWith('track')));
12
+ const lastHeaderLine = lines.findLast(line => line.startsWith('#'));
13
+ const coreColumns = [
14
+ 'refName',
15
+ 'start',
16
+ 'end',
17
+ 'mateRef',
18
+ 'mateStart',
19
+ 'mateEnd',
20
+ 'name',
21
+ 'score',
22
+ 'strand',
23
+ 'mateStrand',
24
+ ];
25
+ const numExtraColumns = Math.max(0, (((_b = (_a = rest[0]) === null || _a === void 0 ? void 0 : _a.split('\t')) === null || _b === void 0 ? void 0 : _b.length) || 0) - coreColumns.length);
26
+ const extraNames = (lastHeaderLine === null || lastHeaderLine === void 0 ? void 0 : lastHeaderLine.includes('\t'))
27
+ ? lastHeaderLine
28
+ .slice(1)
29
+ .split('\t')
30
+ .slice(coreColumns.length)
31
+ .map(t => t.trim())
32
+ : Array.from({ length: numExtraColumns }, (_v, i) => `field_${i}`);
33
+ const colNames = [...coreColumns, ...extraNames];
34
+ return {
35
+ columns: colNames.map(c => ({ name: c })),
36
+ rowSet: {
37
+ rows: rest.map((line, idx) => {
38
+ const cols = line.split('\t');
39
+ return {
40
+ cellData: {
41
+ refName: cols[0],
42
+ start: cols[1],
43
+ end: cols[2],
44
+ mateRefName: cols[3],
45
+ mateStart: cols[4],
46
+ mateEnd: cols[5],
47
+ name: cols[6],
48
+ score: +cols[7] || cols[7],
49
+ strand: cols[8],
50
+ mateStrand: cols[9],
51
+ ...Object.fromEntries(extraNames.map((n, idx) => {
52
+ const r = cols[idx + coreColumns.length];
53
+ return [n, (0, internals_1.isNumber)(r) ? +r : r];
54
+ })),
55
+ },
56
+ feature: {
57
+ uniqueId: `bedpe-${idx}`,
58
+ refName: cols[0],
59
+ start: +cols[1],
60
+ end: +cols[2],
61
+ strand: (0, util_1.parseStrand)(cols[8]),
62
+ mate: {
63
+ refName: cols[3],
64
+ start: +cols[4],
65
+ end: +cols[5],
66
+ strand: (0, util_1.parseStrand)(cols[9]),
67
+ },
68
+ name: cols[6],
69
+ score: cols[7],
70
+ ...Object.fromEntries(extraNames.map((n, idx) => {
71
+ const r = cols[idx + coreColumns.length];
72
+ return [n, (0, internals_1.isNumber)(r) ? +r : r];
73
+ })),
74
+ },
75
+ };
76
+ }),
77
+ },
78
+ };
79
+ }
@@ -1,9 +1,25 @@
1
- import { ParseOptions } from './ImportUtils';
2
- import type { Buffer } from 'buffer';
3
- export declare function parseSTARFusionBuffer(buffer: Buffer, options: ParseOptions): Promise<{
4
- rowSet: import("./ImportUtils").RowSet;
5
- columnDisplayOrder: number[];
6
- hasColumnNames: boolean;
7
- columns: import("./ImportUtils").Column[];
8
- assemblyName: string | undefined;
9
- }>;
1
+ export declare function parseSTARFusionBuffer(buffer: Uint8Array): {
2
+ columns: {
3
+ name: string;
4
+ }[];
5
+ rowSet: {
6
+ rows: {
7
+ cellData: {
8
+ [k: string]: string | number;
9
+ };
10
+ feature: {
11
+ mate: {
12
+ refName: string | undefined;
13
+ start: number;
14
+ end: number;
15
+ strand: number | undefined;
16
+ };
17
+ refName: string | undefined;
18
+ start: number;
19
+ end: number;
20
+ strand: number | undefined;
21
+ uniqueId: string;
22
+ };
23
+ }[];
24
+ };
25
+ };
@@ -1,70 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseSTARFusionBuffer = parseSTARFusionBuffer;
4
- const ImportUtils_1 = require("./ImportUtils");
4
+ const isNumber_1 = require("./isNumber");
5
+ const util_1 = require("./util");
5
6
  function parseSTARFusionBreakpointString(str) {
6
7
  const fields = str.split(':');
7
- const refName = fields[0];
8
- const pos = Number.parseInt(fields[1], 10);
9
- const strand = fields[2] === '-' ? -1 : 1;
10
- return { refName, pos, strand };
8
+ return {
9
+ refName: fields[0],
10
+ start: +fields[1],
11
+ end: +fields[1] + 1,
12
+ strand: (0, util_1.parseStrand)(fields[2]),
13
+ };
11
14
  }
12
- const numericColumns = {
13
- SpanningFragCount: true,
14
- FFPM: true,
15
- LeftBreakEntropy: true,
16
- RightBreakEntropy: true,
17
- JunctionReadCount: true,
18
- };
19
- async function parseSTARFusionBuffer(buffer, options) {
20
- const data = await (0, ImportUtils_1.parseTsvBuffer)(buffer, {
21
- hasColumnNameLine: true,
22
- columnNameLineNumber: 1,
23
- selectedAssemblyName: options.selectedAssemblyName,
24
- isValidRefName: () => false,
25
- });
26
- // remove the # in #FusionName
27
- data.columns[0].name = data.columns[0].name.replace('#', '');
28
- // set some columns to be numeric
29
- data.columns.forEach(col => {
30
- if (numericColumns[col.name]) {
31
- col.dataType = { type: 'Number' };
32
- }
33
- });
34
- // decorate each row with a feature object in its extendedData
35
- data.rowSet.rows.forEach((row, rowNumber) => {
36
- const featureData = {};
37
- row.cells.forEach(({ text }, columnNumber) => {
38
- const column = data.columns[columnNumber];
39
- if (column.name === 'LeftBreakpoint' && text) {
40
- const { refName, pos, strand } = parseSTARFusionBreakpointString(text);
41
- featureData.refName = refName;
42
- featureData.start = pos;
43
- featureData.end = pos;
44
- featureData.strand = strand;
45
- }
46
- else if (column.name === 'RightBreakpoint' && text) {
47
- const { refName, pos, strand } = parseSTARFusionBreakpointString(text);
48
- featureData.mate = {
49
- refName,
50
- start: pos,
51
- end: pos,
52
- strand,
15
+ function parseSTARFusionBuffer(buffer) {
16
+ const lines = (0, util_1.bufferToLines)(buffer);
17
+ const columns = lines[0].slice(1).split('\t');
18
+ return {
19
+ columns: columns.map(c => ({ name: c })),
20
+ rowSet: {
21
+ rows: lines.slice(1).map((line, rowNumber) => {
22
+ const cols = line.split('\t');
23
+ const row = Object.fromEntries(columns.map((h, i) => [h, (0, isNumber_1.isNumber)(cols[i]) ? +cols[i] : cols[i]]));
24
+ return {
25
+ cellData: row,
26
+ feature: {
27
+ uniqueId: `sf-${rowNumber}`,
28
+ ...parseSTARFusionBreakpointString(row.LeftBreakpoint),
29
+ mate: parseSTARFusionBreakpointString(row.RightBreakpoint),
30
+ },
53
31
  };
54
- }
55
- else if (text && numericColumns[column.name]) {
56
- // some other column, numeric
57
- featureData[column.name] = Number.parseFloat(text);
58
- }
59
- else {
60
- // some other column, text
61
- featureData[column.name] = text;
62
- }
63
- });
64
- featureData.uniqueId = `sf-${rowNumber + 1}`;
65
- row.extendedData = {
66
- feature: featureData,
67
- };
68
- });
69
- return data;
32
+ }),
33
+ },
34
+ };
70
35
  }
@@ -1,13 +1,20 @@
1
- import { RowSet, Column, ParseOptions } from './ImportUtils';
2
- import type { Buffer } from 'buffer';
3
- export declare function parseVcfBuffer(buffer: Buffer, options?: ParseOptions): {
4
- rowSet: RowSet;
5
- columnDisplayOrder: number[];
6
- hasColumnNames: boolean;
7
- columns: Column[];
8
- assemblyName: string | undefined;
9
- };
10
- export declare function splitVcfFileHeaderAndBody(wholeFile: string): {
11
- header: string;
12
- body: string;
1
+ export declare function parseVcfBuffer(buffer: Uint8Array): {
2
+ columns: {
3
+ name: string;
4
+ }[];
5
+ rowSet: {
6
+ rows: {
7
+ cellData: {
8
+ CHROM: string | undefined;
9
+ POS: number;
10
+ ID: string | undefined;
11
+ REF: string | undefined;
12
+ ALT: string | undefined;
13
+ QUAL: string | number | undefined;
14
+ FILTER: string | undefined;
15
+ FORMAT: string | undefined;
16
+ };
17
+ feature: any;
18
+ }[];
19
+ };
13
20
  };
@@ -4,108 +4,63 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.parseVcfBuffer = parseVcfBuffer;
7
- exports.splitVcfFileHeaderAndBody = splitVcfFileHeaderAndBody;
8
7
  const vcf_1 = __importDefault(require("@gmod/vcf"));
9
8
  const plugin_variants_1 = require("@jbrowse/plugin-variants");
10
- const ImportUtils_1 = require("./ImportUtils");
11
- const vcfCoreColumns = [
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
- function vcfRecordToRow(vcfParser, line, lineNumber) {
23
- const vcfVariant = vcfParser.parseLine(line);
24
- const vcfFeature = new plugin_variants_1.VcfFeature({
25
- variant: vcfVariant,
26
- parser: vcfParser,
27
- id: `vcf-${lineNumber}`,
28
- });
29
- const data = line.split('\t').map(d => (d === '.' ? '' : d));
30
- // no format column, add blank
31
- if (data.length === 8) {
32
- data.push('');
33
- }
34
- const row = {
35
- id: String(lineNumber + 1),
36
- extendedData: { vcfFeature: vcfFeature.toJSON() },
37
- cells: data.map((text, columnNumber) => {
38
- return {
39
- columnNumber,
40
- text,
41
- };
42
- }),
43
- };
44
- return row;
45
- }
46
- function parseVcfBuffer(buffer, options = {}) {
47
- const { selectedAssemblyName } = options;
48
- let { header, body } = splitVcfFileHeaderAndBody((0, ImportUtils_1.bufferToString)(buffer));
49
- const rows = [];
9
+ const isNumber_1 = require("./isNumber");
10
+ const util_1 = require("./util");
11
+ function parseVcfBuffer(buffer) {
12
+ const lines = (0, util_1.bufferToLines)(buffer);
13
+ const header = lines.filter(l => l.startsWith('#')).join('\n');
14
+ const body = lines.filter(l => !l.startsWith('#'));
50
15
  const vcfParser = new vcf_1.default({ header });
51
- header = ''; // garbage collect
52
- body.split(/\n|\r\n|\r/).forEach((line, lineNumber) => {
53
- if (/\S/.test(line)) {
54
- rows.push(vcfRecordToRow(vcfParser, line, lineNumber));
55
- }
56
- });
57
- body = ''; // garbage collect
58
- const rowSet = {
59
- isLoaded: true,
60
- rows,
61
- };
62
- const columnDisplayOrder = [];
63
- const columns = [];
64
- for (let i = 0; i < vcfCoreColumns.length; i += 1) {
65
- columnDisplayOrder.push(i);
66
- columns[i] = {
67
- name: vcfCoreColumns[i].name,
68
- dataType: { type: vcfCoreColumns[i].type },
69
- };
70
- }
71
- for (let i = 0; i < vcfParser.samples.length; i += 1) {
72
- const oi = vcfCoreColumns.length + i;
73
- columnDisplayOrder.push(oi);
74
- columns[oi] = {
75
- name: vcfParser.samples[i],
76
- dataType: { type: 'Text' },
77
- };
78
- }
79
- columnDisplayOrder.push(columnDisplayOrder.length);
80
- columns.unshift({
81
- name: 'Location',
82
- dataType: { type: 'LocString' },
83
- isDerived: true,
84
- derivationFunctionText: `jexl:{text:row.extendedData.vcfFeature.refName+':'\n
85
- +row.extendedData.vcfFeature.start+'..'+row.extendedData.vcfFeature.end, extendedData:\n
86
- {refName:row.extendedData.vcfFeature.refName,start:row.extendedData.vcfFeature.start,end:row.extendedData.vcfFeature.end}}`,
87
- });
88
- return {
89
- rowSet,
90
- columnDisplayOrder,
91
- hasColumnNames: true,
92
- columns,
93
- assemblyName: selectedAssemblyName,
94
- };
95
- }
96
- function splitVcfFileHeaderAndBody(wholeFile) {
97
- // split into header and the rest of the file
98
- let headerEndIndex = 0;
99
- let prevChar;
100
- for (; headerEndIndex < wholeFile.length; headerEndIndex += 1) {
101
- const c = wholeFile[headerEndIndex];
102
- if (prevChar === '\n' && c !== '#') {
103
- break;
104
- }
105
- prevChar = c;
16
+ const keys = new Set();
17
+ const rows = [];
18
+ let i = 0;
19
+ for (const line of body) {
20
+ const [CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO, FORMAT, ...rest] = line.split('\t');
21
+ const ret = Object.fromEntries((INFO === null || INFO === void 0 ? void 0 : INFO.split(';').map(f => f.trim()).map(e => {
22
+ const [key, val = 'true'] = e.split('=');
23
+ const k = `INFO.${key.trim()}`;
24
+ keys.add(k);
25
+ const v = val.trim();
26
+ return [k, (0, isNumber_1.isNumber)(v) ? +v : v];
27
+ })) || []);
28
+ rows.push({
29
+ cellData: {
30
+ CHROM,
31
+ POS: +POS,
32
+ ID,
33
+ REF,
34
+ ALT,
35
+ QUAL: (0, isNumber_1.isNumber)(QUAL) ? +QUAL : QUAL,
36
+ FILTER,
37
+ FORMAT,
38
+ ...ret,
39
+ ...Object.fromEntries(vcfParser.samples.map((s, idx) => [s, rest[idx]])),
40
+ },
41
+ feature: new plugin_variants_1.VcfFeature({
42
+ parser: vcfParser,
43
+ variant: vcfParser.parseLine(line),
44
+ id: `vcf-${i}`,
45
+ }).toJSON(),
46
+ });
47
+ i++;
106
48
  }
107
49
  return {
108
- header: wholeFile.slice(0, Math.max(0, headerEndIndex)),
109
- body: wholeFile.slice(headerEndIndex),
50
+ columns: [
51
+ 'CHROM',
52
+ 'POS',
53
+ 'ID',
54
+ 'REF',
55
+ 'ALT',
56
+ 'QUAL',
57
+ 'FILTER',
58
+ ...keys,
59
+ 'FORMAT',
60
+ ...vcfParser.samples,
61
+ ].map(c => ({ name: c })),
62
+ rowSet: {
63
+ rows,
64
+ },
110
65
  };
111
66
  }
@@ -0,0 +1 @@
1
+ export declare function isNumber(num: unknown): num is number;