react-msaview 4.4.6 → 4.6.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 (122) hide show
  1. package/bundle/index.js +9 -9
  2. package/bundle/index.js.LICENSE.txt +8 -8
  3. package/bundle/index.js.map +1 -1
  4. package/dist/colorSchemes.d.ts +0 -6
  5. package/dist/colorSchemes.js +1 -119
  6. package/dist/colorSchemes.js.map +1 -1
  7. package/dist/components/ConservationTrack.d.ts +8 -0
  8. package/dist/components/ConservationTrack.js +54 -0
  9. package/dist/components/ConservationTrack.js.map +1 -0
  10. package/dist/components/Loading.js +14 -2
  11. package/dist/components/Loading.js.map +1 -1
  12. package/dist/components/MSAView.js +36 -0
  13. package/dist/components/MSAView.js.map +1 -1
  14. package/dist/components/SequenceTextArea.js +3 -2
  15. package/dist/components/SequenceTextArea.js.map +1 -1
  16. package/dist/components/TextTrack.d.ts +3 -3
  17. package/dist/components/TextTrack.js +4 -1
  18. package/dist/components/TextTrack.js.map +1 -1
  19. package/dist/components/Track.js +21 -8
  20. package/dist/components/Track.js.map +1 -1
  21. package/dist/components/dialogs/ExportSVGDialog.js +19 -3
  22. package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
  23. package/dist/components/header/GappynessSlider.d.ts +6 -0
  24. package/dist/components/header/GappynessSlider.js +19 -0
  25. package/dist/components/header/GappynessSlider.js.map +1 -0
  26. package/dist/components/header/Header.js +3 -1
  27. package/dist/components/header/Header.js.map +1 -1
  28. package/dist/components/header/HeaderMenu.js +30 -14
  29. package/dist/components/header/HeaderMenu.js.map +1 -1
  30. package/dist/components/minimap/MinimapSVG.js +4 -3
  31. package/dist/components/minimap/MinimapSVG.js.map +1 -1
  32. package/dist/components/msa/MSACanvasBlock.js +56 -42
  33. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  34. package/dist/components/msa/renderMSABlock.js +71 -26
  35. package/dist/components/msa/renderMSABlock.js.map +1 -1
  36. package/dist/components/msa/renderMSAMouseover.js +8 -1
  37. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  38. package/dist/components/tracks/renderTracksSvg.d.ts +29 -0
  39. package/dist/components/tracks/renderTracksSvg.js +83 -0
  40. package/dist/components/tracks/renderTracksSvg.js.map +1 -0
  41. package/dist/components/tree/TreeNodeMenu.js +2 -2
  42. package/dist/components/tree/TreeNodeMenu.js.map +1 -1
  43. package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
  44. package/dist/components/tree/renderTreeCanvas.js +23 -24
  45. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  46. package/dist/constants.d.ts +22 -0
  47. package/dist/constants.js +26 -0
  48. package/dist/constants.js.map +1 -0
  49. package/dist/layout.js.map +1 -1
  50. package/dist/model/msaModel.js +3 -2
  51. package/dist/model/msaModel.js.map +1 -1
  52. package/dist/model/treeModel.js +9 -8
  53. package/dist/model/treeModel.js.map +1 -1
  54. package/dist/model.d.ts +271 -15
  55. package/dist/model.js +427 -128
  56. package/dist/model.js.map +1 -1
  57. package/dist/neighborJoining.d.ts +1 -0
  58. package/dist/neighborJoining.js +839 -0
  59. package/dist/neighborJoining.js.map +1 -0
  60. package/dist/neighborJoining.test.d.ts +1 -0
  61. package/dist/neighborJoining.test.js +110 -0
  62. package/dist/neighborJoining.test.js.map +1 -0
  63. package/dist/parsers/A3mMSA.d.ts +43 -0
  64. package/dist/parsers/A3mMSA.js +277 -0
  65. package/dist/parsers/A3mMSA.js.map +1 -0
  66. package/dist/parsers/A3mMSA.test.d.ts +1 -0
  67. package/dist/parsers/A3mMSA.test.js +138 -0
  68. package/dist/parsers/A3mMSA.test.js.map +1 -0
  69. package/dist/parsers/ClustalMSA.d.ts +4 -4
  70. package/dist/parsers/ClustalMSA.js +3 -1
  71. package/dist/parsers/ClustalMSA.js.map +1 -1
  72. package/dist/parsers/FastaMSA.js +17 -16
  73. package/dist/parsers/FastaMSA.js.map +1 -1
  74. package/dist/renderToSvg.d.ts +1 -0
  75. package/dist/renderToSvg.js +48 -18
  76. package/dist/renderToSvg.js.map +1 -1
  77. package/dist/rowCoordinateCalculations.js +2 -0
  78. package/dist/rowCoordinateCalculations.js.map +1 -1
  79. package/dist/types.d.ts +2 -3
  80. package/dist/util.js +17 -9
  81. package/dist/util.js.map +1 -1
  82. package/dist/version.d.ts +1 -1
  83. package/dist/version.js +1 -1
  84. package/package.json +6 -6
  85. package/src/colorSchemes.ts +1 -179
  86. package/src/components/ConservationTrack.tsx +104 -0
  87. package/src/components/Loading.tsx +44 -2
  88. package/src/components/MSAView.tsx +68 -0
  89. package/src/components/SequenceTextArea.tsx +3 -2
  90. package/src/components/TextTrack.tsx +7 -4
  91. package/src/components/Track.tsx +25 -9
  92. package/src/components/dialogs/ExportSVGDialog.tsx +25 -1
  93. package/src/components/header/GappynessSlider.tsx +35 -0
  94. package/src/components/header/Header.tsx +3 -1
  95. package/src/components/header/HeaderMenu.tsx +36 -15
  96. package/src/components/minimap/MinimapSVG.tsx +6 -3
  97. package/src/components/msa/MSACanvasBlock.tsx +66 -48
  98. package/src/components/msa/renderMSABlock.ts +103 -40
  99. package/src/components/msa/renderMSAMouseover.ts +9 -0
  100. package/src/components/tracks/renderTracksSvg.ts +157 -0
  101. package/src/components/tree/TreeNodeMenu.tsx +2 -2
  102. package/src/components/tree/renderTreeCanvas.ts +25 -34
  103. package/src/constants.ts +27 -0
  104. package/src/layout.ts +1 -6
  105. package/src/model/msaModel.ts +4 -2
  106. package/src/model/treeModel.ts +19 -8
  107. package/src/model.ts +517 -140
  108. package/src/neighborJoining.test.ts +129 -0
  109. package/src/neighborJoining.ts +885 -0
  110. package/src/parsers/A3mMSA.test.ts +164 -0
  111. package/src/parsers/A3mMSA.ts +321 -0
  112. package/src/parsers/ClustalMSA.ts +7 -5
  113. package/src/parsers/FastaMSA.ts +17 -17
  114. package/src/renderToSvg.tsx +105 -26
  115. package/src/rowCoordinateCalculations.ts +2 -0
  116. package/src/types.ts +2 -4
  117. package/src/util.ts +21 -8
  118. package/src/version.ts +1 -1
  119. package/dist/components/dialogs/TracklistDialog.d.ts +0 -7
  120. package/dist/components/dialogs/TracklistDialog.js +0 -23
  121. package/dist/components/dialogs/TracklistDialog.js.map +0 -1
  122. package/src/components/dialogs/TracklistDialog.tsx +0 -73
@@ -0,0 +1,129 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import { calculateNeighborJoiningTree } from './neighborJoining'
4
+
5
+ describe('calculateNeighborJoiningTree', () => {
6
+ test('generates valid Newick tree for 2 sequences', () => {
7
+ const rows: [string, string][] = [
8
+ ['seq1', 'MKAA'],
9
+ ['seq2', 'MKAA'],
10
+ ]
11
+ const tree = calculateNeighborJoiningTree(rows)
12
+
13
+ expect(tree).toMatch(/;$/)
14
+ expect(tree).toContain('seq1')
15
+ expect(tree).toContain('seq2')
16
+ })
17
+
18
+ test('generates valid Newick tree for 3 sequences', () => {
19
+ const rows: [string, string][] = [
20
+ ['human', 'MKAAYLSMFG'],
21
+ ['mouse', 'MKAAYLSMFG'],
22
+ ['chicken', 'MKAAFLSMFG'],
23
+ ]
24
+ const tree = calculateNeighborJoiningTree(rows)
25
+
26
+ expect(tree).toMatch(/;$/)
27
+ expect(tree).toContain('human')
28
+ expect(tree).toContain('mouse')
29
+ expect(tree).toContain('chicken')
30
+ expect(tree).toContain('(')
31
+ expect(tree).toContain(')')
32
+ })
33
+
34
+ test('generates valid Newick tree for 4 sequences', () => {
35
+ const rows: [string, string][] = [
36
+ ['A', 'MKAAYLSMFGKED'],
37
+ ['B', 'MKAAYLSMFGKED'],
38
+ ['C', 'MKAAFLSMFGKEE'],
39
+ ['D', 'MKAAFLSMFGKEE'],
40
+ ]
41
+ const tree = calculateNeighborJoiningTree(rows)
42
+
43
+ expect(tree).toMatch(/;$/)
44
+ expect(tree).toContain('A')
45
+ expect(tree).toContain('B')
46
+ expect(tree).toContain('C')
47
+ expect(tree).toContain('D')
48
+ })
49
+
50
+ test('includes branch lengths in tree', () => {
51
+ const rows: [string, string][] = [
52
+ ['seq1', 'MKAAYLSMFG'],
53
+ ['seq2', 'MKAAFLSMFG'],
54
+ ['seq3', 'MKBBFLSMFG'],
55
+ ]
56
+ const tree = calculateNeighborJoiningTree(rows)
57
+
58
+ // Branch lengths are formatted as :0.123456
59
+ expect(tree).toMatch(/:\d+\.\d+/)
60
+ })
61
+
62
+ test('throws error for less than 2 sequences', () => {
63
+ const rows: [string, string][] = [['seq1', 'MKAA']]
64
+ expect(() => calculateNeighborJoiningTree(rows)).toThrow(
65
+ 'Need at least 2 sequences',
66
+ )
67
+ })
68
+
69
+ test('handles sequences with gaps', () => {
70
+ const rows: [string, string][] = [
71
+ ['seq1', 'MK-AYLSMFG'],
72
+ ['seq2', 'MKAAYLSMFG'],
73
+ ['seq3', 'MKA-YLSMFG'],
74
+ ]
75
+ const tree = calculateNeighborJoiningTree(rows)
76
+
77
+ expect(tree).toMatch(/;$/)
78
+ expect(tree).toContain('seq1')
79
+ expect(tree).toContain('seq2')
80
+ expect(tree).toContain('seq3')
81
+ })
82
+
83
+ test('handles special characters in sequence names', () => {
84
+ const rows: [string, string][] = [
85
+ ['seq:1', 'MKAA'],
86
+ ['seq(2)', 'MKAA'],
87
+ ]
88
+ const tree = calculateNeighborJoiningTree(rows)
89
+
90
+ expect(tree).toMatch(/;$/)
91
+ // Special characters should be escaped
92
+ expect(tree).not.toMatch(/seq:1/)
93
+ expect(tree).not.toMatch(/seq\(2\)/)
94
+ })
95
+
96
+ test('identical sequences have zero distance', () => {
97
+ const rows: [string, string][] = [
98
+ ['seq1', 'MKAAYLSMFG'],
99
+ ['seq2', 'MKAAYLSMFG'],
100
+ ]
101
+ const tree = calculateNeighborJoiningTree(rows)
102
+
103
+ // Identical sequences should have equal branch lengths
104
+ const match = tree.match(/:(\d+\.\d+)/g)
105
+ expect(match).not.toBeNull()
106
+ if (match) {
107
+ const lengths = match.map(m => parseFloat(m.slice(1)))
108
+ // Branch lengths should be small or zero for identical sequences
109
+ for (const len of lengths) {
110
+ expect(len).toBeGreaterThanOrEqual(0)
111
+ }
112
+ }
113
+ })
114
+
115
+ test('more divergent sequences have larger distances', () => {
116
+ const rows: [string, string][] = [
117
+ ['similar1', 'MKAAYLSMFGKED'],
118
+ ['similar2', 'MKAAYLSMFGKED'],
119
+ ['different', 'WWWWWWWWWWWWW'],
120
+ ]
121
+ const tree = calculateNeighborJoiningTree(rows)
122
+
123
+ expect(tree).toMatch(/;$/)
124
+ // The tree should be valid even with very different sequences
125
+ expect(tree).toContain('similar1')
126
+ expect(tree).toContain('similar2')
127
+ expect(tree).toContain('different')
128
+ })
129
+ })