jbrowse-plugin-mafviewer 1.4.3 → 1.4.6

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/README.md +1 -1
  2. package/dist/BigMafAdapter/BigMafAdapter.js +4 -5
  3. package/dist/BigMafAdapter/BigMafAdapter.js.map +1 -1
  4. package/dist/BigMafAdapter/configSchema.d.ts +2 -2
  5. package/dist/LinearMafDisplay/components/LinearMafDisplayComponent.js +39 -109
  6. package/dist/LinearMafDisplay/components/LinearMafDisplayComponent.js.map +1 -1
  7. package/dist/LinearMafDisplay/components/MAFTooltip.d.ts +0 -3
  8. package/dist/LinearMafDisplay/components/MAFTooltip.js.map +1 -1
  9. package/dist/LinearMafDisplay/components/MsaHighlightOverlay.d.ts +9 -0
  10. package/dist/LinearMafDisplay/components/MsaHighlightOverlay.js +34 -0
  11. package/dist/LinearMafDisplay/components/MsaHighlightOverlay.js.map +1 -0
  12. package/dist/LinearMafDisplay/components/Sidebar/ColorLegend.js +2 -2
  13. package/dist/LinearMafDisplay/components/Sidebar/ColorLegend.js.map +1 -1
  14. package/dist/LinearMafDisplay/components/Sidebar/RectBg.d.ts +1 -1
  15. package/dist/LinearMafDisplay/components/Sidebar/RectBg.js +2 -3
  16. package/dist/LinearMafDisplay/components/Sidebar/RectBg.js.map +1 -1
  17. package/dist/LinearMafDisplay/components/Sidebar/SvgWrapper.js +81 -11
  18. package/dist/LinearMafDisplay/components/Sidebar/SvgWrapper.js.map +1 -1
  19. package/dist/LinearMafDisplay/components/Sidebar/Tree.js +30 -9
  20. package/dist/LinearMafDisplay/components/Sidebar/Tree.js.map +1 -1
  21. package/dist/LinearMafDisplay/components/Sidebar/YScaleBars.d.ts +0 -1
  22. package/dist/LinearMafDisplay/components/Sidebar/YScaleBars.js.map +1 -1
  23. package/dist/LinearMafDisplay/components/useDragSelection.d.ts +25 -0
  24. package/dist/LinearMafDisplay/components/useDragSelection.js +103 -0
  25. package/dist/LinearMafDisplay/components/useDragSelection.js.map +1 -0
  26. package/dist/LinearMafDisplay/configSchema.d.ts +3 -30
  27. package/dist/LinearMafDisplay/renderSvg.js +1 -1
  28. package/dist/LinearMafDisplay/renderSvg.js.map +1 -1
  29. package/dist/LinearMafDisplay/stateModel.d.ts +1090 -102
  30. package/dist/LinearMafDisplay/stateModel.js +156 -17
  31. package/dist/LinearMafDisplay/stateModel.js.map +1 -1
  32. package/dist/LinearMafDisplay/types.d.ts +2 -2
  33. package/dist/LinearMafDisplay/util.d.ts +6 -0
  34. package/dist/LinearMafDisplay/util.js +28 -6
  35. package/dist/LinearMafDisplay/util.js.map +1 -1
  36. package/dist/LinearMafRenderer/LinearMafRenderer.d.ts +43 -10
  37. package/dist/LinearMafRenderer/LinearMafRenderer.js +1 -1
  38. package/dist/LinearMafRenderer/LinearMafRenderer.js.map +1 -1
  39. package/dist/LinearMafRenderer/components/LinearMafRendering.d.ts +14 -5
  40. package/dist/LinearMafRenderer/components/LinearMafRendering.js +40 -20
  41. package/dist/LinearMafRenderer/components/LinearMafRendering.js.map +1 -1
  42. package/dist/LinearMafRenderer/configSchema.d.ts +1 -6
  43. package/dist/LinearMafRenderer/configSchema.js +1 -6
  44. package/dist/LinearMafRenderer/configSchema.js.map +1 -1
  45. package/dist/LinearMafRenderer/makeImageData.js +6 -7
  46. package/dist/LinearMafRenderer/makeImageData.js.map +1 -1
  47. package/dist/LinearMafRenderer/rendering/features.d.ts +0 -1
  48. package/dist/LinearMafRenderer/rendering/features.js +1 -14
  49. package/dist/LinearMafRenderer/rendering/features.js.map +1 -1
  50. package/dist/LinearMafRenderer/rendering/insertions.d.ts +1 -1
  51. package/dist/LinearMafRenderer/rendering/insertions.js +10 -8
  52. package/dist/LinearMafRenderer/rendering/insertions.js.map +1 -1
  53. package/dist/LinearMafRenderer/rendering/matches.d.ts +1 -1
  54. package/dist/LinearMafRenderer/rendering/matches.js +3 -15
  55. package/dist/LinearMafRenderer/rendering/matches.js.map +1 -1
  56. package/dist/LinearMafRenderer/rendering/mismatches.d.ts +1 -1
  57. package/dist/LinearMafRenderer/rendering/mismatches.js +3 -3
  58. package/dist/LinearMafRenderer/rendering/spatialIndex.js +8 -2
  59. package/dist/LinearMafRenderer/rendering/spatialIndex.js.map +1 -1
  60. package/dist/LinearMafRenderer/rendering/text.js +1 -3
  61. package/dist/LinearMafRenderer/rendering/text.js.map +1 -1
  62. package/dist/LinearMafRenderer/rendering/types.d.ts +6 -5
  63. package/dist/MafAddTrackWorkflow/AddTrackWorkflow.js +1 -1
  64. package/dist/MafAddTrackWorkflow/AddTrackWorkflow.js.map +1 -1
  65. package/dist/MafAddTrackWorkflow/index.js +1 -1
  66. package/dist/MafAddTrackWorkflow/index.js.map +1 -1
  67. package/dist/MafGetSequences/MafGetSequences.d.ts +1 -0
  68. package/dist/MafGetSequences/MafGetSequences.js +2 -1
  69. package/dist/MafGetSequences/MafGetSequences.js.map +1 -1
  70. package/dist/MafSequenceWidget/LabelsCanvas.d.ts +8 -0
  71. package/dist/MafSequenceWidget/LabelsCanvas.js +37 -0
  72. package/dist/MafSequenceWidget/LabelsCanvas.js.map +1 -0
  73. package/dist/MafSequenceWidget/MafSequenceHoverHighlight.d.ts +6 -0
  74. package/dist/MafSequenceWidget/MafSequenceHoverHighlight.js +52 -0
  75. package/dist/MafSequenceWidget/MafSequenceHoverHighlight.js.map +1 -0
  76. package/dist/MafSequenceWidget/MafSequenceHoverHighlightExtension.d.ts +2 -0
  77. package/dist/MafSequenceWidget/MafSequenceHoverHighlightExtension.js +12 -0
  78. package/dist/MafSequenceWidget/MafSequenceHoverHighlightExtension.js.map +1 -0
  79. package/dist/MafSequenceWidget/MafSequenceWidget.d.ts +6 -0
  80. package/dist/MafSequenceWidget/MafSequenceWidget.js +189 -0
  81. package/dist/MafSequenceWidget/MafSequenceWidget.js.map +1 -0
  82. package/dist/MafSequenceWidget/SequenceCanvas.d.ts +12 -0
  83. package/dist/MafSequenceWidget/SequenceCanvas.js +86 -0
  84. package/dist/MafSequenceWidget/SequenceCanvas.js.map +1 -0
  85. package/dist/MafSequenceWidget/SequenceDisplay.d.ts +12 -0
  86. package/dist/MafSequenceWidget/SequenceDisplay.js +117 -0
  87. package/dist/MafSequenceWidget/SequenceDisplay.js.map +1 -0
  88. package/dist/MafSequenceWidget/SequenceTooltip.d.ts +11 -0
  89. package/dist/MafSequenceWidget/SequenceTooltip.js +39 -0
  90. package/dist/MafSequenceWidget/SequenceTooltip.js.map +1 -0
  91. package/dist/MafSequenceWidget/baseColors.d.ts +3 -0
  92. package/dist/MafSequenceWidget/baseColors.js +64 -0
  93. package/dist/MafSequenceWidget/baseColors.js.map +1 -0
  94. package/dist/MafSequenceWidget/colToGenomePos.d.ts +13 -0
  95. package/dist/MafSequenceWidget/colToGenomePos.js +32 -0
  96. package/dist/MafSequenceWidget/colToGenomePos.js.map +1 -0
  97. package/dist/MafSequenceWidget/colToGenomePos.test.d.ts +1 -0
  98. package/dist/MafSequenceWidget/colToGenomePos.test.js +136 -0
  99. package/dist/MafSequenceWidget/colToGenomePos.test.js.map +1 -0
  100. package/dist/MafSequenceWidget/configSchema.d.ts +1 -0
  101. package/dist/MafSequenceWidget/configSchema.js +3 -0
  102. package/dist/MafSequenceWidget/configSchema.js.map +1 -0
  103. package/dist/MafSequenceWidget/constants.d.ts +4 -0
  104. package/dist/MafSequenceWidget/constants.js +5 -0
  105. package/dist/MafSequenceWidget/constants.js.map +1 -0
  106. package/dist/MafSequenceWidget/index.d.ts +2 -0
  107. package/dist/MafSequenceWidget/index.js +16 -0
  108. package/dist/MafSequenceWidget/index.js.map +1 -0
  109. package/dist/MafSequenceWidget/stateModelFactory.d.ts +67 -0
  110. package/dist/MafSequenceWidget/stateModelFactory.js +21 -0
  111. package/dist/MafSequenceWidget/stateModelFactory.js.map +1 -0
  112. package/dist/MafTabixAdapter/MafTabixAdapter.js +4 -35
  113. package/dist/MafTabixAdapter/MafTabixAdapter.js.map +1 -1
  114. package/dist/MafTabixAdapter/configSchema.d.ts +4 -4
  115. package/dist/MafTrack/configSchema.d.ts +16 -11
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/jbrowse-plugin-mafviewer.umd.production.min.js +12 -24
  119. package/dist/jbrowse-plugin-mafviewer.umd.production.min.js.map +4 -4
  120. package/dist/util/clipboard.d.ts +2 -0
  121. package/dist/util/clipboard.js +28 -0
  122. package/dist/util/clipboard.js.map +1 -0
  123. package/dist/util/fastaUtils.d.ts +2 -1
  124. package/dist/util/fastaUtils.js +93 -50
  125. package/dist/util/fastaUtils.js.map +1 -1
  126. package/dist/util/fastaUtils.test.js +190 -0
  127. package/dist/util/fastaUtils.test.js.map +1 -1
  128. package/dist/util/parseAssemblyName.d.ts +32 -0
  129. package/dist/util/parseAssemblyName.js +87 -0
  130. package/dist/util/parseAssemblyName.js.map +1 -0
  131. package/dist/util/parseAssemblyName.test.d.ts +1 -0
  132. package/dist/util/parseAssemblyName.test.js +269 -0
  133. package/dist/util/parseAssemblyName.test.js.map +1 -0
  134. package/package.json +12 -12
  135. package/src/BigMafAdapter/BigMafAdapter.ts +5 -5
  136. package/src/LinearMafDisplay/components/LinearMafDisplayComponent.tsx +63 -145
  137. package/src/LinearMafDisplay/components/MAFTooltip.tsx +0 -3
  138. package/src/LinearMafDisplay/components/MsaHighlightOverlay.tsx +62 -0
  139. package/src/LinearMafDisplay/components/Sidebar/ColorLegend.tsx +2 -6
  140. package/src/LinearMafDisplay/components/Sidebar/RectBg.tsx +8 -3
  141. package/src/LinearMafDisplay/components/Sidebar/SvgWrapper.tsx +117 -15
  142. package/src/LinearMafDisplay/components/Sidebar/Tree.tsx +53 -8
  143. package/src/LinearMafDisplay/components/Sidebar/YScaleBars.tsx +0 -1
  144. package/src/LinearMafDisplay/components/useDragSelection.ts +159 -0
  145. package/src/LinearMafDisplay/renderSvg.tsx +1 -1
  146. package/src/LinearMafDisplay/stateModel.ts +215 -20
  147. package/src/LinearMafDisplay/types.ts +2 -2
  148. package/src/LinearMafDisplay/util.ts +35 -7
  149. package/src/LinearMafRenderer/LinearMafRenderer.ts +3 -5
  150. package/src/LinearMafRenderer/components/LinearMafRendering.tsx +67 -33
  151. package/src/LinearMafRenderer/configSchema.ts +1 -6
  152. package/src/LinearMafRenderer/makeImageData.ts +5 -14
  153. package/src/LinearMafRenderer/rendering/features.ts +2 -36
  154. package/src/LinearMafRenderer/rendering/insertions.ts +13 -8
  155. package/src/LinearMafRenderer/rendering/matches.ts +2 -27
  156. package/src/LinearMafRenderer/rendering/mismatches.ts +3 -3
  157. package/src/LinearMafRenderer/rendering/spatialIndex.ts +9 -2
  158. package/src/LinearMafRenderer/rendering/text.ts +1 -2
  159. package/src/LinearMafRenderer/rendering/types.ts +8 -5
  160. package/src/MafAddTrackWorkflow/AddTrackWorkflow.tsx +1 -1
  161. package/src/MafAddTrackWorkflow/index.ts +1 -1
  162. package/src/MafGetSequences/MafGetSequences.ts +10 -2
  163. package/src/MafSequenceWidget/LabelsCanvas.tsx +58 -0
  164. package/src/MafSequenceWidget/MafSequenceHoverHighlight.tsx +83 -0
  165. package/src/MafSequenceWidget/MafSequenceHoverHighlightExtension.tsx +24 -0
  166. package/src/MafSequenceWidget/MafSequenceWidget.tsx +294 -0
  167. package/src/MafSequenceWidget/SequenceCanvas.tsx +136 -0
  168. package/src/MafSequenceWidget/SequenceDisplay.tsx +188 -0
  169. package/src/MafSequenceWidget/SequenceTooltip.tsx +70 -0
  170. package/src/MafSequenceWidget/baseColors.ts +76 -0
  171. package/src/MafSequenceWidget/colToGenomePos.test.ts +166 -0
  172. package/src/MafSequenceWidget/colToGenomePos.ts +40 -0
  173. package/src/MafSequenceWidget/configSchema.ts +3 -0
  174. package/src/MafSequenceWidget/constants.ts +4 -0
  175. package/src/MafSequenceWidget/index.ts +24 -0
  176. package/src/MafSequenceWidget/stateModelFactory.ts +43 -0
  177. package/src/MafTabixAdapter/MafTabixAdapter.ts +12 -51
  178. package/src/index.ts +2 -0
  179. package/src/util/__snapshots__/fastaUtils.test.ts.snap +35 -0
  180. package/src/util/clipboard.ts +35 -0
  181. package/src/util/fastaUtils.test.ts +199 -0
  182. package/src/util/fastaUtils.ts +118 -51
  183. package/src/util/parseAssemblyName.test.ts +350 -0
  184. package/src/util/parseAssemblyName.ts +106 -0
  185. package/dist/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.d.ts +0 -11
  186. package/dist/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.js +0 -97
  187. package/dist/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.js.map +0 -1
  188. package/dist/LinearMafDisplay/components/util.d.ts +0 -1
  189. package/dist/LinearMafDisplay/components/util.js +0 -8
  190. package/dist/LinearMafDisplay/components/util.js.map +0 -1
  191. package/dist/LinearMafRenderer/components/util.d.ts +0 -1
  192. package/dist/LinearMafRenderer/components/util.js +0 -13
  193. package/dist/LinearMafRenderer/components/util.js.map +0 -1
  194. package/dist/util/fetchSequences.d.ts +0 -18
  195. package/dist/util/fetchSequences.js +0 -39
  196. package/dist/util/fetchSequences.js.map +0 -1
  197. package/dist/util/useSequences.d.ts +0 -21
  198. package/dist/util/useSequences.js +0 -64
  199. package/dist/util/useSequences.js.map +0 -1
  200. package/src/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.tsx +0 -175
  201. package/src/LinearMafDisplay/components/util.ts +0 -7
  202. package/src/LinearMafRenderer/components/util.ts +0 -13
  203. package/src/util/fetchSequences.ts +0 -57
  204. package/src/util/useSequences.ts +0 -90
@@ -0,0 +1,2 @@
1
+ export declare function copyToClipboard(text: string, onSuccess?: () => void, onError?: (e: unknown) => void): Promise<void>;
2
+ export declare function downloadAsFile(content: string, filename: string, onSuccess?: () => void, onError?: (e: unknown) => void): void;
@@ -0,0 +1,28 @@
1
+ export async function copyToClipboard(text, onSuccess, onError) {
2
+ try {
3
+ await navigator.clipboard.writeText(text);
4
+ onSuccess?.();
5
+ }
6
+ catch (e) {
7
+ console.error(e);
8
+ onError?.(e);
9
+ }
10
+ }
11
+ export function downloadAsFile(content, filename, onSuccess, onError) {
12
+ try {
13
+ const url = URL.createObjectURL(new Blob([content], { type: 'text/plain' }));
14
+ const a = document.createElement('a');
15
+ a.href = url;
16
+ a.download = filename;
17
+ document.body.append(a);
18
+ a.click();
19
+ a.remove();
20
+ URL.revokeObjectURL(url);
21
+ onSuccess?.();
22
+ }
23
+ catch (e) {
24
+ console.error(e);
25
+ onError?.(e);
26
+ }
27
+ }
28
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/util/clipboard.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,SAAsB,EACtB,OAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACzC,SAAS,EAAE,EAAE,CAAA;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,QAAgB,EAChB,SAAsB,EACtB,OAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;QAC5E,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QACrC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAA;QACZ,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACrB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,CAAC,CAAC,KAAK,EAAE,CAAA;QACT,CAAC,CAAC,MAAM,EAAE,CAAA;QACV,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QACxB,SAAS,EAAE,EAAE,CAAA;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -6,11 +6,12 @@ import type { Feature, Region } from '@jbrowse/core/util';
6
6
  * @param selectedRegion - Optional region to extract
7
7
  * @returns FASTA formatted text
8
8
  */
9
- export declare function processFeaturesToFasta({ regions, showAllLetters, samples, features, }: {
9
+ export declare function processFeaturesToFasta({ regions, showAllLetters, samples, features, includeInsertions, }: {
10
10
  regions: Region[];
11
11
  samples: Sample[];
12
12
  showAsUpperCase?: boolean;
13
13
  mismatchRendering?: boolean;
14
14
  showAllLetters?: boolean;
15
+ includeInsertions?: boolean;
15
16
  features: Map<string, Feature>;
16
17
  }): string[];
@@ -4,81 +4,124 @@
4
4
  * @param selectedRegion - Optional region to extract
5
5
  * @returns FASTA formatted text
6
6
  */
7
- export function processFeaturesToFasta({ regions, showAllLetters, samples, features, }) {
7
+ export function processFeaturesToFasta({ regions, showAllLetters, samples, features, includeInsertions, }) {
8
8
  const region = regions[0];
9
9
  const sampleToRowMap = new Map(samples.map((s, i) => [s.id, i]));
10
10
  const rlen = region.end - region.start;
11
- const outputRows = samples.map(() => '-'.repeat(rlen));
11
+ // Use character arrays instead of strings for O(1) mutations
12
+ const outputRowsArrays = samples.map(() => new Array(rlen).fill('-'));
13
+ // Track insertions at each position if includeInsertions is enabled
14
+ // Key is the reference position (0-based relative to region), value is array of insertions
15
+ const insertionsAtPosition = new Map();
12
16
  for (const feature of features.values()) {
13
17
  const leftCoord = feature.get('start');
14
18
  const vals = feature.get('alignments');
15
19
  const seq = feature.get('seq');
16
20
  for (const [sample, val] of Object.entries(vals)) {
17
- const origAlignment = val.seq;
18
- const alignment = origAlignment;
21
+ const alignment = val.seq;
19
22
  const row = sampleToRowMap.get(sample);
20
23
  if (row === undefined) {
21
24
  continue;
22
25
  }
23
- // gaps
26
+ const rowArray = outputRowsArrays[row];
27
+ // Single-pass processing: handle gaps, matches, mismatches, and collect insertions
24
28
  for (let i = 0, o = 0, l = alignment.length; i < l; i++) {
25
29
  if (seq[i] !== '-') {
26
- if (alignment[i] === '-') {
27
- const l = leftCoord + o - region.start;
28
- if (l >= 0 && l < rlen) {
29
- outputRows[row] =
30
- outputRows[row].slice(0, l) +
31
- '-' +
32
- outputRows[row].slice(l + 1);
30
+ const c = alignment[i];
31
+ const pos = leftCoord + o - region.start;
32
+ if (pos >= 0 && pos < rlen) {
33
+ if (c === '-') {
34
+ // Gap
35
+ rowArray[pos] = '-';
36
+ }
37
+ else if (c !== ' ') {
38
+ if (showAllLetters) {
39
+ // Show all letters mode: write character directly
40
+ rowArray[pos] = c;
41
+ }
42
+ else if (seq[i] === c) {
43
+ // Match: use dot notation
44
+ rowArray[pos] = '.';
45
+ }
46
+ else {
47
+ // Mismatch: write character
48
+ rowArray[pos] = c;
49
+ }
33
50
  }
34
51
  }
35
52
  o++;
36
53
  }
37
- }
38
- if (!showAllLetters) {
39
- // matches
40
- for (let i = 0, o = 0, l = alignment.length; i < l; i++) {
41
- if (seq[i] !== '-') {
54
+ else if (includeInsertions) {
55
+ // This is an insertion (reference has gap)
56
+ // Collect all consecutive insertion characters
57
+ let insertionSequence = '';
58
+ while (i < alignment.length && seq[i] === '-') {
42
59
  const c = alignment[i];
43
- const l = leftCoord + o - region.start;
44
- if (l >= 0 && l < rlen) {
45
- if (seq[i] === c && c !== '-' && c !== ' ') {
46
- outputRows[row] =
47
- outputRows[row].slice(0, l) +
48
- '.' +
49
- outputRows[row].slice(l + 1);
50
- }
51
- }
52
- o++;
60
+ insertionSequence += c !== '-' && c !== ' ' ? c : '-';
61
+ i++;
53
62
  }
54
- }
55
- }
56
- // mismatches
57
- for (let i = 0, o = 0, l = alignment.length; i < l; i++) {
58
- const c = alignment[i];
59
- if (seq[i] !== '-') {
60
- if (c !== '-') {
61
- const l = leftCoord + o - region.start;
62
- if (l >= 0 && l < rlen) {
63
- if (seq[i] !== c && c !== ' ') {
64
- outputRows[row] =
65
- outputRows[row].slice(0, l) +
66
- c +
67
- outputRows[row].slice(l + 1);
68
- }
69
- else if (showAllLetters) {
70
- outputRows[row] =
71
- outputRows[row].slice(0, l) +
72
- c +
73
- outputRows[row].slice(l + 1);
74
- }
63
+ i--; // Back up one since the outer loop will increment
64
+ if (insertionSequence.length > 0) {
65
+ // Position is relative to region start, insertions come after position o-1
66
+ // (or before position 0 if o is 0)
67
+ const insertPos = leftCoord + o - region.start;
68
+ if (insertPos >= 0 && insertPos <= rlen) {
69
+ const existing = insertionsAtPosition.get(insertPos) || [];
70
+ existing.push({ sequence: insertionSequence, sampleIndex: row });
71
+ insertionsAtPosition.set(insertPos, existing);
75
72
  }
76
73
  }
77
- o++;
78
74
  }
79
75
  }
80
76
  }
81
77
  }
82
- return outputRows;
78
+ if (includeInsertions && insertionsAtPosition.size > 0) {
79
+ return expandWithInsertions(outputRowsArrays, insertionsAtPosition, samples.length);
80
+ }
81
+ // Convert character arrays back to strings
82
+ return outputRowsArrays.map(arr => arr.join(''));
83
+ }
84
+ /**
85
+ * Expand sequences to include insertions
86
+ * At each position with insertions, find the max insertion length,
87
+ * then expand all sequences by that amount
88
+ */
89
+ function expandWithInsertions(outputRowsArrays, insertionsAtPosition, numSamples) {
90
+ // Sort insertion positions in descending order so we can insert from right to left
91
+ // without affecting earlier positions
92
+ const sortedPositions = [...insertionsAtPosition.keys()].sort((a, b) => b - a);
93
+ for (const pos of sortedPositions) {
94
+ const insertions = insertionsAtPosition.get(pos);
95
+ // Find max insertion length at this position
96
+ let maxLen = 0;
97
+ for (const ins of insertions) {
98
+ if (ins.sequence.length > maxLen) {
99
+ maxLen = ins.sequence.length;
100
+ }
101
+ }
102
+ // Create a map from sample index to insertion sequence
103
+ const sampleInsertions = new Map();
104
+ for (const ins of insertions) {
105
+ sampleInsertions.set(ins.sampleIndex, ins.sequence);
106
+ }
107
+ // Insert characters at this position for each sample
108
+ for (let sampleIdx = 0; sampleIdx < numSamples; sampleIdx++) {
109
+ const rowArray = outputRowsArrays[sampleIdx];
110
+ const insertionSeq = sampleInsertions.get(sampleIdx);
111
+ if (insertionSeq) {
112
+ // This sample has an insertion - add it, padded with gaps if needed
113
+ const paddedInsertion = insertionSeq.padEnd(maxLen, '-');
114
+ // Insert after position `pos`
115
+ rowArray.splice(pos, 0, ...paddedInsertion.split(''));
116
+ }
117
+ else {
118
+ // No insertion for this sample - fill with gaps
119
+ const gaps = new Array(maxLen).fill('-');
120
+ rowArray.splice(pos, 0, ...gaps);
121
+ }
122
+ }
123
+ }
124
+ // Convert character arrays back to strings
125
+ return outputRowsArrays.map(arr => arr.join(''));
83
126
  }
84
127
  //# sourceMappingURL=fastaUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastaUtils.js","sourceRoot":"","sources":["../../src/util/fastaUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fastaUtils.js","sourceRoot":"","sources":["../../src/util/fastaUtils.ts"],"names":[],"mappings":"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"}
@@ -92,4 +92,194 @@ test('gap in assembly1', () => {
92
92
  });
93
93
  expect(result).toMatchSnapshot();
94
94
  });
95
+ test('includeInsertions - single insertion in one sample', () => {
96
+ // Reference seq has a gap (insertion in assembly2)
97
+ // seq: AC--GTAC (reference with gap = insertion in aligned seq)
98
+ // assembly1: AC--GTAC (no insertion, matches reference gap)
99
+ // assembly2: ACTTGTAC (has TT insertion)
100
+ const mockFeature = new SimpleFeature({
101
+ uniqueId: '123',
102
+ refName: 'abc',
103
+ start: 100,
104
+ end: 106, // 6 bp reference (AC GTAC without the gap)
105
+ seq: 'AC--GTAC',
106
+ alignments: {
107
+ assembly1: {
108
+ chr: 'chr1',
109
+ start: 100,
110
+ seq: 'AC--GTAC',
111
+ strand: 1,
112
+ },
113
+ assembly2: {
114
+ chr: 'chr2',
115
+ start: 200,
116
+ seq: 'ACTTGTAC',
117
+ strand: 1,
118
+ },
119
+ },
120
+ });
121
+ const result = processFeaturesToFasta({
122
+ features: makeMap([mockFeature]),
123
+ samples: [{ id: 'assembly1' }, { id: 'assembly2' }],
124
+ includeInsertions: true,
125
+ showAllLetters: true,
126
+ regions: [
127
+ {
128
+ refName: 'chr1',
129
+ start: 100,
130
+ end: 106,
131
+ assemblyName: 'assembly1',
132
+ },
133
+ ],
134
+ });
135
+ // assembly1 should have gaps where the insertion is
136
+ // assembly2 should have the TT insertion
137
+ expect(result).toMatchSnapshot();
138
+ });
139
+ test('includeInsertions - insertions in multiple samples with different lengths', () => {
140
+ // Reference has gap, different samples have different insertion lengths
141
+ // seq: AC---GTAC (reference with 3-bp gap)
142
+ // assembly1: AC-T-GTAC (has T insertion, 1 bp)
143
+ // assembly2: ACTTTGTAC (has TTT insertion, 3 bp)
144
+ const mockFeature = new SimpleFeature({
145
+ uniqueId: '123',
146
+ refName: 'abc',
147
+ start: 100,
148
+ end: 106,
149
+ seq: 'AC---GTAC',
150
+ alignments: {
151
+ assembly1: {
152
+ chr: 'chr1',
153
+ start: 100,
154
+ seq: 'AC-T-GTAC',
155
+ strand: 1,
156
+ },
157
+ assembly2: {
158
+ chr: 'chr2',
159
+ start: 200,
160
+ seq: 'ACTTTGTAC',
161
+ strand: 1,
162
+ },
163
+ },
164
+ });
165
+ const result = processFeaturesToFasta({
166
+ features: makeMap([mockFeature]),
167
+ samples: [{ id: 'assembly1' }, { id: 'assembly2' }],
168
+ includeInsertions: true,
169
+ showAllLetters: true,
170
+ regions: [
171
+ {
172
+ refName: 'chr1',
173
+ start: 100,
174
+ end: 106,
175
+ assemblyName: 'assembly1',
176
+ },
177
+ ],
178
+ });
179
+ // assembly1 should have T-- (padded to max insertion length 3)
180
+ // assembly2 should have TTT
181
+ expect(result).toMatchSnapshot();
182
+ });
183
+ test('includeInsertions - insertions at multiple positions', () => {
184
+ // Reference has gaps at two positions
185
+ // seq: A-CG-TAC
186
+ // assembly1: ATCGGTAC (T insertion at pos 1, G insertion at pos 4)
187
+ // assembly2: A-CG-TAC (no insertions)
188
+ const mockFeature = new SimpleFeature({
189
+ uniqueId: '123',
190
+ refName: 'abc',
191
+ start: 100,
192
+ end: 106,
193
+ seq: 'A-CG-TAC',
194
+ alignments: {
195
+ assembly1: {
196
+ chr: 'chr1',
197
+ start: 100,
198
+ seq: 'ATCGGTAC',
199
+ strand: 1,
200
+ },
201
+ assembly2: {
202
+ chr: 'chr2',
203
+ start: 200,
204
+ seq: 'A-CG-TAC',
205
+ strand: 1,
206
+ },
207
+ },
208
+ });
209
+ const result = processFeaturesToFasta({
210
+ features: makeMap([mockFeature]),
211
+ samples: [{ id: 'assembly1' }, { id: 'assembly2' }],
212
+ includeInsertions: true,
213
+ showAllLetters: true,
214
+ regions: [
215
+ {
216
+ refName: 'chr1',
217
+ start: 100,
218
+ end: 106,
219
+ assemblyName: 'assembly1',
220
+ },
221
+ ],
222
+ });
223
+ expect(result).toMatchSnapshot();
224
+ });
225
+ test('includeInsertions=false ignores insertions', () => {
226
+ const mockFeature = new SimpleFeature({
227
+ uniqueId: '123',
228
+ refName: 'abc',
229
+ start: 100,
230
+ end: 106,
231
+ seq: 'AC--GTAC',
232
+ alignments: {
233
+ assembly1: {
234
+ chr: 'chr1',
235
+ start: 100,
236
+ seq: 'AC--GTAC',
237
+ strand: 1,
238
+ },
239
+ assembly2: {
240
+ chr: 'chr2',
241
+ start: 200,
242
+ seq: 'ACTTGTAC',
243
+ strand: 1,
244
+ },
245
+ },
246
+ });
247
+ const result = processFeaturesToFasta({
248
+ features: makeMap([mockFeature]),
249
+ samples: [{ id: 'assembly1' }, { id: 'assembly2' }],
250
+ includeInsertions: false,
251
+ showAllLetters: true,
252
+ regions: [
253
+ {
254
+ refName: 'chr1',
255
+ start: 100,
256
+ end: 106,
257
+ assemblyName: 'assembly1',
258
+ },
259
+ ],
260
+ });
261
+ // Without insertions, both should be 6 characters (no expansion)
262
+ expect(result[0]).toHaveLength(6);
263
+ expect(result[1]).toHaveLength(6);
264
+ expect(result).toMatchSnapshot();
265
+ });
266
+ test('includeInsertions with no insertions present', () => {
267
+ // No gaps in reference = no insertions
268
+ const result = processFeaturesToFasta({
269
+ features: makeMap([mockFeature]),
270
+ samples: [{ id: 'assembly1' }, { id: 'assembly2' }],
271
+ includeInsertions: true,
272
+ showAllLetters: true,
273
+ regions: [
274
+ {
275
+ refName: 'chr1',
276
+ start: 100,
277
+ end: 105,
278
+ assemblyName: 'assembly1',
279
+ },
280
+ ],
281
+ });
282
+ // Should behave same as without includeInsertions since there are none
283
+ expect(result).toMatchSnapshot();
284
+ });
95
285
  //# sourceMappingURL=fastaUtils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastaUtils.test.js","sourceRoot":"","sources":["../../src/util/fastaUtils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fastaUtils.test.js","sourceRoot":"","sources":["../../src/util/fastaUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface ParsedAssemblyName {
2
+ assemblyName: string;
3
+ chr: string;
4
+ }
5
+ /**
6
+ * Parses assembly name and chromosome from a combined string in MAF tabix format.
7
+ *
8
+ * Handles multiple formats:
9
+ * - Single string with no dots: assemblyName is the entire string, chr is empty
10
+ * - `assembly.chr`: Single dot separates assembly name from chromosome
11
+ * - `assembly.version.chr`: Two dots where middle part is numeric (version number)
12
+ * - assemblyName includes the version (e.g., "hg38.1" from "hg38.1.chr1")
13
+ * - `assembly.chr.more`: Two dots where middle part is non-numeric
14
+ * - assemblyName is first part, chr includes rest (e.g., "mm10" and "chr1.random")
15
+ */
16
+ export declare function parseAssemblyAndChr(assemblyAndChr: string): ParsedAssemblyName;
17
+ /**
18
+ * Parses assembly name and chromosome from a combined string in BigMaf format.
19
+ *
20
+ * Uses simple dot splitting: org.chr where org is before the first dot,
21
+ * chr is everything after the first dot.
22
+ */
23
+ export declare function parseAssemblyAndChrSimple(organismChr: string): ParsedAssemblyName;
24
+ /**
25
+ * Selects the appropriate sequence from alignments based on the lookup order:
26
+ * 1. refAssemblyName config value (if provided)
27
+ * 2. query.assemblyName (from the region being queried)
28
+ * 3. firstAssemblyNameFound (fallback to first assembly in data)
29
+ */
30
+ export declare function selectReferenceSequence(alignments: Record<string, {
31
+ seq: string;
32
+ }>, refAssemblyName: string | undefined, queryAssemblyName: string | undefined, firstAssemblyNameFound: string | undefined): string | undefined;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Parses assembly name and chromosome from a combined string in MAF tabix format.
3
+ *
4
+ * Handles multiple formats:
5
+ * - Single string with no dots: assemblyName is the entire string, chr is empty
6
+ * - `assembly.chr`: Single dot separates assembly name from chromosome
7
+ * - `assembly.version.chr`: Two dots where middle part is numeric (version number)
8
+ * - assemblyName includes the version (e.g., "hg38.1" from "hg38.1.chr1")
9
+ * - `assembly.chr.more`: Two dots where middle part is non-numeric
10
+ * - assemblyName is first part, chr includes rest (e.g., "mm10" and "chr1.random")
11
+ */
12
+ export function parseAssemblyAndChr(assemblyAndChr) {
13
+ const firstDotIndex = assemblyAndChr.indexOf('.');
14
+ if (firstDotIndex === -1) {
15
+ return {
16
+ assemblyName: assemblyAndChr,
17
+ chr: '',
18
+ };
19
+ }
20
+ const secondDotIndex = assemblyAndChr.indexOf('.', firstDotIndex + 1);
21
+ if (secondDotIndex === -1) {
22
+ return {
23
+ assemblyName: assemblyAndChr.slice(0, firstDotIndex),
24
+ chr: assemblyAndChr.slice(firstDotIndex + 1),
25
+ };
26
+ }
27
+ const secondPart = assemblyAndChr.slice(firstDotIndex + 1, secondDotIndex);
28
+ const isNumeric = secondPart.length > 0 && !Number.isNaN(+secondPart);
29
+ if (isNumeric) {
30
+ return {
31
+ assemblyName: assemblyAndChr.slice(0, secondDotIndex),
32
+ chr: assemblyAndChr.slice(secondDotIndex + 1),
33
+ };
34
+ }
35
+ return {
36
+ assemblyName: assemblyAndChr.slice(0, firstDotIndex),
37
+ chr: assemblyAndChr.slice(firstDotIndex + 1),
38
+ };
39
+ }
40
+ /**
41
+ * Parses assembly name and chromosome from a combined string in BigMaf format.
42
+ *
43
+ * Uses simple dot splitting: org.chr where org is before the first dot,
44
+ * chr is everything after the first dot.
45
+ */
46
+ export function parseAssemblyAndChrSimple(organismChr) {
47
+ const dotIndex = organismChr.indexOf('.');
48
+ if (dotIndex === -1) {
49
+ return {
50
+ assemblyName: organismChr,
51
+ chr: '',
52
+ };
53
+ }
54
+ return {
55
+ assemblyName: organismChr.slice(0, dotIndex),
56
+ chr: organismChr.slice(dotIndex + 1),
57
+ };
58
+ }
59
+ /**
60
+ * Selects the appropriate sequence from alignments based on the lookup order:
61
+ * 1. refAssemblyName config value (if provided)
62
+ * 2. query.assemblyName (from the region being queried)
63
+ * 3. firstAssemblyNameFound (fallback to first assembly in data)
64
+ */
65
+ export function selectReferenceSequence(alignments, refAssemblyName, queryAssemblyName, firstAssemblyNameFound) {
66
+ let entry;
67
+ if (refAssemblyName) {
68
+ entry = alignments[refAssemblyName];
69
+ if (entry) {
70
+ return entry.seq;
71
+ }
72
+ }
73
+ if (queryAssemblyName) {
74
+ entry = alignments[queryAssemblyName];
75
+ if (entry) {
76
+ return entry.seq;
77
+ }
78
+ }
79
+ if (firstAssemblyNameFound) {
80
+ entry = alignments[firstAssemblyNameFound];
81
+ if (entry) {
82
+ return entry.seq;
83
+ }
84
+ }
85
+ return undefined;
86
+ }
87
+ //# sourceMappingURL=parseAssemblyName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAssemblyName.js","sourceRoot":"","sources":["../../src/util/parseAssemblyName.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAAsB;IAEtB,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,YAAY,EAAE,cAAc;YAC5B,GAAG,EAAE,EAAE;SACR,CAAA;IACH,CAAC;IAED,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,CAAC,CAAC,CAAA;IACrE,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC;YACpD,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;SAC7C,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAA;IAErE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;YACrD,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;SAC9C,CAAA;IACH,CAAC;IAED,OAAO;QACL,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC;QACpD,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;KAC7C,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACzC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,YAAY,EAAE,WAAW;YACzB,GAAG,EAAE,EAAE;SACR,CAAA;IACH,CAAC;IACD,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC5C,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;KACrC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAA2C,EAC3C,eAAmC,EACnC,iBAAqC,EACrC,sBAA0C;IAE1C,IAAI,KAAK,CAAA;IACT,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,GAAG,CAAA;QAClB,CAAC;IACH,CAAC;IACD,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAA;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,GAAG,CAAA;QAClB,CAAC;IACH,CAAC;IACD,IAAI,sBAAsB,EAAE,CAAC;QAC3B,KAAK,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAA;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,GAAG,CAAA;QAClB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};