@jbrowse/plugin-sequence 1.6.7 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/BgzipFastaAdapter/BgzipFastaAdapter.js +70 -0
  2. package/dist/BgzipFastaAdapter/BgzipFastaAdapter.test.js +64 -0
  3. package/dist/BgzipFastaAdapter/configSchema.js +36 -0
  4. package/dist/BgzipFastaAdapter/index.js +15 -0
  5. package/dist/ChromSizesAdapter/ChromSizesAdapter.js +170 -0
  6. package/dist/ChromSizesAdapter/ChromSizesAdapter.test.js +46 -0
  7. package/dist/ChromSizesAdapter/configSchema.js +22 -0
  8. package/dist/ChromSizesAdapter/index.js +15 -0
  9. package/dist/DivSequenceRenderer/components/DivSequenceRendering.js +239 -0
  10. package/dist/DivSequenceRenderer/components/DivSequenceRendering.test.js +245 -0
  11. package/dist/DivSequenceRenderer/configSchema.js +20 -0
  12. package/dist/DivSequenceRenderer/index.js +23 -0
  13. package/dist/GCContentAdapter/GCContentAdapter.js +261 -0
  14. package/dist/GCContentAdapter/configSchema.js +18 -0
  15. package/dist/GCContentAdapter/index.js +31 -0
  16. package/dist/IndexedFastaAdapter/IndexedFastaAdapter.d.ts +0 -5
  17. package/dist/IndexedFastaAdapter/IndexedFastaAdapter.js +228 -0
  18. package/dist/IndexedFastaAdapter/IndexedFastaAdapter.test.js +71 -0
  19. package/dist/IndexedFastaAdapter/configSchema.js +29 -0
  20. package/dist/IndexedFastaAdapter/index.js +15 -0
  21. package/dist/LinearReferenceSequenceDisplay/configSchema.js +18 -0
  22. package/dist/LinearReferenceSequenceDisplay/index.js +21 -0
  23. package/dist/LinearReferenceSequenceDisplay/model.d.ts +8 -8
  24. package/dist/LinearReferenceSequenceDisplay/model.js +102 -0
  25. package/dist/TwoBitAdapter/TwoBitAdapter.js +289 -0
  26. package/dist/TwoBitAdapter/TwoBitAdapter.test.js +94 -0
  27. package/dist/TwoBitAdapter/configSchema.js +30 -0
  28. package/dist/TwoBitAdapter/index.js +15 -0
  29. package/dist/declare.d.js +1 -0
  30. package/dist/index.js +325 -6
  31. package/dist/index.test.js +29 -0
  32. package/dist/plugin-sequence.cjs.development.js +0 -6
  33. package/dist/plugin-sequence.cjs.development.js.map +1 -1
  34. package/dist/plugin-sequence.cjs.production.min.js.map +1 -1
  35. package/dist/plugin-sequence.esm.js +0 -6
  36. package/dist/plugin-sequence.esm.js.map +1 -1
  37. package/dist/referenceSeqTrackConfig.js +88 -0
  38. package/package.json +3 -6
  39. package/src/IndexedFastaAdapter/IndexedFastaAdapter.ts +0 -5
  40. package/src/index.ts +7 -8
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+
16
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
17
+
18
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
19
+
20
+ var _indexedfasta = require("@gmod/indexedfasta");
21
+
22
+ var _io = require("@jbrowse/core/util/io");
23
+
24
+ var _configuration = require("@jbrowse/core/configuration");
25
+
26
+ var _IndexedFastaAdapter = _interopRequireDefault(require("../IndexedFastaAdapter/IndexedFastaAdapter"));
27
+
28
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
29
+
30
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
31
+
32
+ var _default = /*#__PURE__*/function (_IndexedFasta) {
33
+ (0, _inherits2["default"])(_default, _IndexedFasta);
34
+
35
+ var _super = _createSuper(_default);
36
+
37
+ function _default(config, getSubAdapter, pluginManager) {
38
+ var _this;
39
+
40
+ (0, _classCallCheck2["default"])(this, _default);
41
+ _this = _super.call(this, config, getSubAdapter, pluginManager);
42
+ var fastaLocation = (0, _configuration.readConfObject)(config, 'fastaLocation');
43
+ var faiLocation = (0, _configuration.readConfObject)(config, 'faiLocation');
44
+ var gziLocation = (0, _configuration.readConfObject)(config, 'gziLocation');
45
+
46
+ if (!fastaLocation) {
47
+ throw new Error('must provide fastaLocation');
48
+ }
49
+
50
+ if (!faiLocation) {
51
+ throw new Error('must provide faiLocation');
52
+ }
53
+
54
+ if (!gziLocation) {
55
+ throw new Error('must provide gziLocation');
56
+ }
57
+
58
+ var fastaOpts = {
59
+ fasta: (0, _io.openLocation)(fastaLocation, _this.pluginManager),
60
+ fai: (0, _io.openLocation)(faiLocation, _this.pluginManager),
61
+ gzi: (0, _io.openLocation)(gziLocation, _this.pluginManager)
62
+ };
63
+ _this.fasta = new _indexedfasta.BgzipIndexedFasta(fastaOpts);
64
+ return _this;
65
+ }
66
+
67
+ return (0, _createClass2["default"])(_default);
68
+ }(_IndexedFastaAdapter["default"]);
69
+
70
+ exports["default"] = _default;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _operators = require("rxjs/operators");
10
+
11
+ var _BgzipFastaAdapter = _interopRequireDefault(require("./BgzipFastaAdapter"));
12
+
13
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
14
+
15
+ test('can use a indexed fasta with gzi', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
16
+ var adapter, features, featuresArray, features2, featuresArray2;
17
+ return _regenerator["default"].wrap(function _callee$(_context) {
18
+ while (1) {
19
+ switch (_context.prev = _context.next) {
20
+ case 0:
21
+ adapter = new _BgzipFastaAdapter["default"](_configSchema["default"].create({
22
+ fastaLocation: {
23
+ localPath: require.resolve('../../test_data/volvox.fa.gz'),
24
+ locationType: 'LocalPathLocation'
25
+ },
26
+ faiLocation: {
27
+ localPath: require.resolve('../../test_data/volvox.fa.gz.fai'),
28
+ locationType: 'LocalPathLocation'
29
+ },
30
+ gziLocation: {
31
+ localPath: require.resolve('../../test_data/volvox.fa.gz.gzi'),
32
+ locationType: 'LocalPathLocation'
33
+ }
34
+ }));
35
+ features = adapter.getFeatures({
36
+ refName: 'ctgA',
37
+ start: 0,
38
+ end: 20000
39
+ });
40
+ _context.next = 4;
41
+ return features.pipe((0, _operators.toArray)()).toPromise();
42
+
43
+ case 4:
44
+ featuresArray = _context.sent;
45
+ expect(featuresArray).toMatchSnapshot();
46
+ features2 = adapter.getFeatures({
47
+ refName: 'ctgC',
48
+ start: 0,
49
+ end: 20000
50
+ });
51
+ _context.next = 9;
52
+ return features2.pipe((0, _operators.toArray)()).toPromise();
53
+
54
+ case 9:
55
+ featuresArray2 = _context.sent;
56
+ expect(featuresArray2).toMatchSnapshot();
57
+
58
+ case 11:
59
+ case "end":
60
+ return _context.stop();
61
+ }
62
+ }
63
+ }, _callee);
64
+ })));
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _configuration = require("@jbrowse/core/configuration");
9
+
10
+ var _default = (0, _configuration.ConfigurationSchema)('BgzipFastaAdapter', {
11
+ fastaLocation: {
12
+ type: 'fileLocation',
13
+ defaultValue: {
14
+ uri: '/path/to/seq.fa.gz',
15
+ locationType: 'UriLocation'
16
+ }
17
+ },
18
+ faiLocation: {
19
+ type: 'fileLocation',
20
+ defaultValue: {
21
+ uri: '/path/to/seq.fa.gz.fai',
22
+ locationType: 'UriLocation'
23
+ }
24
+ },
25
+ gziLocation: {
26
+ type: 'fileLocation',
27
+ defaultValue: {
28
+ uri: '/path/to/seq.fa.gz.gzi',
29
+ locationType: 'UriLocation'
30
+ }
31
+ }
32
+ }, {
33
+ explicitlyTyped: true
34
+ });
35
+
36
+ exports["default"] = _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "configSchema", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _configSchema["default"];
12
+ }
13
+ });
14
+
15
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
+
18
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
+
20
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
21
+
22
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
23
+
24
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
25
+
26
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
27
+
28
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
+
30
+ var _BaseAdapter2 = require("@jbrowse/core/data_adapters/BaseAdapter");
31
+
32
+ var _io = require("@jbrowse/core/util/io");
33
+
34
+ var _configuration = require("@jbrowse/core/configuration");
35
+
36
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
37
+
38
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
39
+
40
+ var _default = /*#__PURE__*/function (_BaseAdapter) {
41
+ (0, _inherits2["default"])(_default, _BaseAdapter);
42
+
43
+ var _super = _createSuper(_default);
44
+
45
+ // the map of refSeq to length
46
+ function _default(config, getSubAdapter, pluginManager) {
47
+ var _this;
48
+
49
+ (0, _classCallCheck2["default"])(this, _default);
50
+ _this = _super.call(this, config, getSubAdapter, pluginManager);
51
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "refSeqs", void 0);
52
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "source", void 0);
53
+ var chromSizesLocation = (0, _configuration.readConfObject)(config, 'chromSizesLocation');
54
+
55
+ if (!chromSizesLocation) {
56
+ throw new Error('must provide chromSizesLocation');
57
+ }
58
+
59
+ var file = (0, _io.openLocation)(chromSizesLocation, _this.pluginManager);
60
+ _this.source = file.toString();
61
+ _this.refSeqs = _this.init(file);
62
+ return _this;
63
+ }
64
+
65
+ (0, _createClass2["default"])(_default, [{
66
+ key: "init",
67
+ value: function () {
68
+ var _init = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(file) {
69
+ var data, refSeqs;
70
+ return _regenerator["default"].wrap(function _callee$(_context) {
71
+ while (1) {
72
+ switch (_context.prev = _context.next) {
73
+ case 0:
74
+ _context.next = 2;
75
+ return file.readFile('utf8');
76
+
77
+ case 2:
78
+ data = _context.sent;
79
+ refSeqs = {};
80
+
81
+ if (data.length) {
82
+ _context.next = 6;
83
+ break;
84
+ }
85
+
86
+ throw new Error("Could not read file ".concat(file.toString()));
87
+
88
+ case 6:
89
+ data.split('\n').forEach(function (line) {
90
+ if (line.length) {
91
+ var _line$split = line.split('\t'),
92
+ _line$split2 = (0, _slicedToArray2["default"])(_line$split, 2),
93
+ name = _line$split2[0],
94
+ length = _line$split2[1];
95
+
96
+ refSeqs[name] = +length;
97
+ }
98
+ });
99
+ return _context.abrupt("return", refSeqs);
100
+
101
+ case 8:
102
+ case "end":
103
+ return _context.stop();
104
+ }
105
+ }
106
+ }, _callee);
107
+ }));
108
+
109
+ function init(_x) {
110
+ return _init.apply(this, arguments);
111
+ }
112
+
113
+ return init;
114
+ }()
115
+ }, {
116
+ key: "getRegions",
117
+ value: function () {
118
+ var _getRegions = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
119
+ var refSeqs;
120
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
121
+ while (1) {
122
+ switch (_context2.prev = _context2.next) {
123
+ case 0:
124
+ _context2.next = 2;
125
+ return this.refSeqs;
126
+
127
+ case 2:
128
+ refSeqs = _context2.sent;
129
+ return _context2.abrupt("return", Object.keys(refSeqs).map(function (refName) {
130
+ return {
131
+ refName: refName,
132
+ start: 0,
133
+ end: refSeqs[refName]
134
+ };
135
+ }));
136
+
137
+ case 4:
138
+ case "end":
139
+ return _context2.stop();
140
+ }
141
+ }
142
+ }, _callee2, this);
143
+ }));
144
+
145
+ function getRegions() {
146
+ return _getRegions.apply(this, arguments);
147
+ }
148
+
149
+ return getRegions;
150
+ }()
151
+ }, {
152
+ key: "getFeatures",
153
+ value: function getFeatures() {
154
+ throw new Error('sequence not available');
155
+ }
156
+ }, {
157
+ key: "getHeader",
158
+ value: function getHeader() {
159
+ return {};
160
+ }
161
+ }, {
162
+ key: "freeResources",
163
+ value: function
164
+ /* { region } */
165
+ freeResources() {}
166
+ }]);
167
+ return _default;
168
+ }(_BaseAdapter2.BaseAdapter);
169
+
170
+ exports["default"] = _default;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _ChromSizesAdapter = _interopRequireDefault(require("./ChromSizesAdapter"));
10
+
11
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
12
+
13
+ test('adapter can fetch sequence from volvox.chrom.sizes', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
14
+ var adapter, regions;
15
+ return _regenerator["default"].wrap(function _callee$(_context) {
16
+ while (1) {
17
+ switch (_context.prev = _context.next) {
18
+ case 0:
19
+ adapter = new _ChromSizesAdapter["default"](_configSchema["default"].create({
20
+ chromSizesLocation: {
21
+ localPath: require.resolve('./test_data/volvox.chrom.sizes'),
22
+ locationType: 'LocalPathLocation'
23
+ }
24
+ }));
25
+ _context.next = 3;
26
+ return adapter.getRegions();
27
+
28
+ case 3:
29
+ regions = _context.sent;
30
+ expect(regions).toEqual([{
31
+ refName: 'ctgA',
32
+ start: 0,
33
+ end: 50001
34
+ }, {
35
+ refName: 'ctgB',
36
+ start: 0,
37
+ end: 6079
38
+ }]);
39
+
40
+ case 5:
41
+ case "end":
42
+ return _context.stop();
43
+ }
44
+ }
45
+ }, _callee);
46
+ })));
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _configuration = require("@jbrowse/core/configuration");
9
+
10
+ var _default = (0, _configuration.ConfigurationSchema)('ChromSizesAdapter', {
11
+ chromSizesLocation: {
12
+ type: 'fileLocation',
13
+ defaultValue: {
14
+ uri: '/path/to/species.chrom.sizes',
15
+ locationType: 'UriLocation'
16
+ }
17
+ }
18
+ }, {
19
+ explicitlyTyped: true
20
+ });
21
+
22
+ exports["default"] = _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "configSchema", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _configSchema["default"];
12
+ }
13
+ });
14
+
15
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = _interopRequireDefault(require("react"));
17
+
18
+ var _color = require("@jbrowse/core/util/color");
19
+
20
+ var _ui = require("@jbrowse/core/ui");
21
+
22
+ var _mobxReact = require("mobx-react");
23
+
24
+ var _util = require("@jbrowse/core/util");
25
+
26
+ /* eslint-disable @typescript-eslint/no-explicit-any */
27
+ function Translation(props) {
28
+ var codonTable = props.codonTable,
29
+ seq = props.seq,
30
+ frame = props.frame,
31
+ bpPerPx = props.bpPerPx,
32
+ region = props.region,
33
+ height = props.height,
34
+ y = props.y,
35
+ _props$reverse = props.reverse,
36
+ reverse = _props$reverse === void 0 ? false : _props$reverse,
37
+ theme = props.theme;
38
+ var scale = bpPerPx; // the tilt variable normalizes the frame to where we are starting from,
39
+ // which increases consistency across blocks
40
+
41
+ var tilt = 3 - region.start % 3; // the effectiveFrame incorporates tilt and the frame to say what the
42
+ // effective frame that is plotted. The +3 is for when frame is -2 and this
43
+ // can otherwise result in effectiveFrame -1
44
+
45
+ var effectiveFrame = (frame + tilt + 3) % 3;
46
+ var seqSliced = seq.slice(effectiveFrame);
47
+ var translated = [];
48
+
49
+ for (var i = 0; i < seqSliced.length; i += 3) {
50
+ var codon = seqSliced.slice(i, i + 3);
51
+ var normalizedCodon = reverse ? (0, _util.revcom)(codon) : codon;
52
+ var aminoAcid = codonTable[normalizedCodon] || '';
53
+ translated.push({
54
+ letter: aminoAcid,
55
+ codon: normalizedCodon.toUpperCase()
56
+ });
57
+ }
58
+
59
+ var w = 1 / scale * 3;
60
+ var drop = region.start === 0 ? 0 : w;
61
+ var render = 1 / bpPerPx >= 12;
62
+ var width = (region.end - region.start) / bpPerPx;
63
+ var map = ['#d8d8d8', '#adadad', '#8f8f8f'].reverse();
64
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, translated.map(function (element, index) {
65
+ var x = region.reversed ? width - (w * (index + 1) + effectiveFrame / scale - drop) : w * index + effectiveFrame / scale - drop;
66
+ var letter = element.letter,
67
+ codon = element.codon;
68
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
69
+ key: "".concat(index, "-").concat(letter)
70
+ }, /*#__PURE__*/_react["default"].createElement("rect", {
71
+ x: x,
72
+ y: y,
73
+ width: render ? w : w + 0.7
74
+ /* small fudge factor when zoomed out*/
75
+ ,
76
+ height: height,
77
+ stroke: render ? '#555' : 'none',
78
+ fill: _util.defaultStarts.includes(codon) ? theme.palette.startCodon : _util.defaultStops.includes(codon) ? theme.palette.stopCodon : map[Math.abs(frame)]
79
+ }), render ? /*#__PURE__*/_react["default"].createElement("text", {
80
+ x: x + w / 2,
81
+ y: y + height / 2,
82
+ dominantBaseline: "middle",
83
+ textAnchor: "middle"
84
+ }, letter) : null);
85
+ }));
86
+ }
87
+
88
+ function DNA(props) {
89
+ var bpPerPx = props.bpPerPx,
90
+ region = props.region,
91
+ feature = props.feature,
92
+ theme = props.theme,
93
+ height = props.height,
94
+ seq = props.seq,
95
+ y = props.y;
96
+ var render = 1 / bpPerPx >= 12;
97
+
98
+ var _bpSpanPx = (0, _util.bpSpanPx)(feature.get('start'), feature.get('end'), region, bpPerPx),
99
+ _bpSpanPx2 = (0, _slicedToArray2["default"])(_bpSpanPx, 2),
100
+ leftPx = _bpSpanPx2[0],
101
+ rightPx = _bpSpanPx2[1];
102
+
103
+ var reverse = region.reversed;
104
+ var len = feature.get('end') - feature.get('start');
105
+ var w = Math.max((rightPx - leftPx) / len, 0.8);
106
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, seq.split('').map(function (letter, index) {
107
+ var color = theme.palette.bases[letter.toUpperCase()];
108
+ var x = reverse ? rightPx - (index + 1) * w : leftPx + index * w;
109
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
110
+ key: index
111
+ }, /*#__PURE__*/_react["default"].createElement("rect", {
112
+ x: x,
113
+ y: y,
114
+ width: w,
115
+ height: height,
116
+ fill: color ? color.main : '#aaa',
117
+ stroke: render ? '#555' : 'none'
118
+ }), render ? /*#__PURE__*/_react["default"].createElement("text", {
119
+ x: x + w / 2,
120
+ y: y + height / 2,
121
+ dominantBaseline: "middle",
122
+ textAnchor: "middle",
123
+ fill: color ? (0, _color.contrastingTextColor)(color.main) : 'black'
124
+ }, letter) : null);
125
+ }));
126
+ }
127
+
128
+ var SequenceSVG = function SequenceSVG(_ref) {
129
+ var regions = _ref.regions,
130
+ configTheme = _ref.theme,
131
+ _ref$features = _ref.features,
132
+ features = _ref$features === void 0 ? new Map() : _ref$features,
133
+ showReverse = _ref.showReverse,
134
+ showForward = _ref.showForward,
135
+ showTranslation = _ref.showTranslation,
136
+ bpPerPx = _ref.bpPerPx;
137
+
138
+ var _regions = (0, _slicedToArray2["default"])(regions, 1),
139
+ region = _regions[0];
140
+
141
+ var theme = (0, _ui.createJBrowseTheme)(configTheme);
142
+ var codonTable = (0, _util.generateCodonTable)(_util.defaultCodonTable);
143
+ var height = 20;
144
+
145
+ var _ref2 = (0, _toConsumableArray2["default"])(features.values()),
146
+ feature = _ref2[0];
147
+
148
+ if (!feature) {
149
+ return null;
150
+ }
151
+
152
+ var seq = feature.get('seq');
153
+
154
+ if (!seq) {
155
+ return null;
156
+ } // incrementer for the y-position of the current sequence being rendered
157
+ // (applies to both translation rows and dna rows)
158
+
159
+
160
+ var currY = -20;
161
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, showTranslation && (region.reversed ? showReverse : showForward) ? [2, 1, 0].map(function (index) {
162
+ return /*#__PURE__*/_react["default"].createElement(Translation, {
163
+ key: "translation-".concat(index),
164
+ seq: seq,
165
+ y: currY += 20,
166
+ codonTable: codonTable,
167
+ frame: index,
168
+ bpPerPx: bpPerPx,
169
+ region: region,
170
+ theme: theme,
171
+ height: height,
172
+ reverse: region.reversed
173
+ });
174
+ }) : null, showForward ? /*#__PURE__*/_react["default"].createElement(DNA, {
175
+ height: height,
176
+ y: currY += 20,
177
+ feature: feature,
178
+ region: region,
179
+ seq: region.reversed ? (0, _util.complement)(seq) : seq,
180
+ bpPerPx: bpPerPx,
181
+ theme: theme
182
+ }) : null, showReverse ? /*#__PURE__*/_react["default"].createElement(DNA, {
183
+ height: height,
184
+ y: currY += 20,
185
+ feature: feature,
186
+ region: region,
187
+ seq: region.reversed ? seq : (0, _util.complement)(seq),
188
+ bpPerPx: bpPerPx,
189
+ theme: theme
190
+ }) : null, showTranslation && (region.reversed ? showForward : showReverse) ? [0, -1, -2].map(function (index) {
191
+ return /*#__PURE__*/_react["default"].createElement(Translation, {
192
+ key: "rev-translation-".concat(index),
193
+ seq: seq,
194
+ y: currY += 20,
195
+ codonTable: codonTable,
196
+ frame: index,
197
+ bpPerPx: bpPerPx,
198
+ region: region,
199
+ theme: theme,
200
+ height: height,
201
+ reverse: !region.reversed
202
+ });
203
+ }) : null);
204
+ };
205
+
206
+ var Wrapper = function Wrapper(_ref3) {
207
+ var exportSVG = _ref3.exportSVG,
208
+ width = _ref3.width,
209
+ totalHeight = _ref3.totalHeight,
210
+ children = _ref3.children;
211
+ return exportSVG ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, children) : /*#__PURE__*/_react["default"].createElement("svg", {
212
+ "data-testid": "sequence_track",
213
+ width: width,
214
+ height: totalHeight,
215
+ style: {
216
+ width: width,
217
+ height: totalHeight
218
+ }
219
+ }, children);
220
+ };
221
+
222
+ function Sequence(props) {
223
+ var regions = props.regions,
224
+ bpPerPx = props.bpPerPx;
225
+
226
+ var _regions2 = (0, _slicedToArray2["default"])(regions, 1),
227
+ region = _regions2[0];
228
+
229
+ var width = (region.end - region.start) / bpPerPx;
230
+ var totalHeight = 200;
231
+ return /*#__PURE__*/_react["default"].createElement(Wrapper, (0, _extends2["default"])({}, props, {
232
+ totalHeight: totalHeight,
233
+ width: width
234
+ }), /*#__PURE__*/_react["default"].createElement(SequenceSVG, props));
235
+ }
236
+
237
+ var _default = (0, _mobxReact.observer)(Sequence);
238
+
239
+ exports["default"] = _default;