@jbrowse/plugin-gtf 1.7.3 → 1.7.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.
@@ -4,11 +4,18 @@ import IntervalTree from '@flatten-js/interval-tree';
4
4
  import { Feature } from '@jbrowse/core/util/simpleFeature';
5
5
  export default class extends BaseFeatureDataAdapter {
6
6
  protected gtfFeatures?: Promise<{
7
- intervalTree: Record<string, IntervalTree>;
7
+ feats: {
8
+ [key: string]: string[];
9
+ };
8
10
  }>;
11
+ protected intervalTrees: {
12
+ [key: string]: Promise<IntervalTree | undefined> | undefined;
13
+ };
9
14
  private loadDataP;
10
15
  private loadData;
11
16
  getRefNames(opts?: BaseOptions): Promise<string[]>;
17
+ private loadFeatureIntervalTreeHelper;
18
+ private loadFeatureIntervalTree;
12
19
  getFeatures(query: NoAssemblyRegion, opts?: BaseOptions): import("rxjs").Observable<Feature>;
13
20
  freeResources(): void;
14
21
  }
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports["default"] = void 0;
8
+ exports.default = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
@@ -27,8 +27,6 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
27
27
 
28
28
  var _BaseAdapter = require("@jbrowse/core/data_adapters/BaseAdapter");
29
29
 
30
- var _configuration = require("@jbrowse/core/configuration");
31
-
32
30
  var _io = require("@jbrowse/core/util/io");
33
31
 
34
32
  var _rxjs = require("@jbrowse/core/util/rxjs");
@@ -43,7 +41,7 @@ var _gtf = _interopRequireDefault(require("@gmod/gtf"));
43
41
 
44
42
  var _util = require("../util");
45
43
 
46
- 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); }; }
44
+ 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); }; }
47
45
 
48
46
  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; } }
49
47
 
@@ -52,37 +50,36 @@ function isGzip(buf) {
52
50
  }
53
51
 
54
52
  var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
55
- (0, _inherits2["default"])(_default, _BaseFeatureDataAdapt);
53
+ (0, _inherits2.default)(_default, _BaseFeatureDataAdapt);
56
54
 
57
55
  var _super = _createSuper(_default);
58
56
 
59
57
  function _default() {
60
58
  var _this;
61
59
 
62
- (0, _classCallCheck2["default"])(this, _default);
60
+ (0, _classCallCheck2.default)(this, _default);
63
61
 
64
62
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
65
63
  args[_key] = arguments[_key];
66
64
  }
67
65
 
68
66
  _this = _super.call.apply(_super, [this].concat(args));
69
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "gtfFeatures", void 0);
67
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "gtfFeatures", void 0);
68
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "intervalTrees", {});
70
69
  return _this;
71
70
  }
72
71
 
73
- (0, _createClass2["default"])(_default, [{
72
+ (0, _createClass2.default)(_default, [{
74
73
  key: "loadDataP",
75
74
  value: function () {
76
- var _loadDataP = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
77
- var _this2 = this;
78
-
79
- var buffer, buf, data, feats, intervalTree;
80
- return _regenerator["default"].wrap(function _callee$(_context) {
75
+ var _loadDataP = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
76
+ var buffer, buf, data, lines, feats, i, refName;
77
+ return _regenerator.default.wrap(function _callee$(_context) {
81
78
  while (1) {
82
79
  switch (_context.prev = _context.next) {
83
80
  case 0:
84
81
  _context.next = 2;
85
- return (0, _io.openLocation)((0, _configuration.readConfObject)(this.config, 'gtfLocation'), this.pluginManager).readFile();
82
+ return (0, _io.openLocation)(this.getConf('gtfLocation'), this.pluginManager).readFile();
86
83
 
87
84
  case 2:
88
85
  buffer = _context.sent;
@@ -117,32 +114,26 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
117
114
  data = new TextDecoder('utf8', {
118
115
  fatal: true
119
116
  }).decode(buf);
120
- feats = _gtf["default"].parseStringSync(data, {
121
- parseFeatures: true,
122
- parseComments: false,
123
- parseDirectives: false,
124
- parseSequences: false
117
+ lines = data.split('\n').filter(function (f) {
118
+ return !!f && !f.startsWith('#');
125
119
  });
126
- intervalTree = feats.flat().map(function (f, i) {
127
- return new _simpleFeature["default"]({
128
- data: (0, _util.featureData)(f),
129
- id: "".concat(_this2.id, "-offset-").concat(i)
130
- });
131
- }).reduce(function (acc, obj) {
132
- var key = obj.get('refName');
120
+ feats = {};
133
121
 
134
- if (!acc[key]) {
135
- acc[key] = new _intervalTree["default"]();
122
+ for (i = 0; i < lines.length; i++) {
123
+ refName = lines[i].split('\t')[0];
124
+
125
+ if (!feats[refName]) {
126
+ feats[refName] = [];
136
127
  }
137
128
 
138
- acc[key].insert([obj.get('start'), obj.get('end')], obj);
139
- return acc;
140
- }, {});
129
+ feats[refName].push(lines[i]);
130
+ }
131
+
141
132
  return _context.abrupt("return", {
142
- intervalTree: intervalTree
133
+ feats: feats
143
134
  });
144
135
 
145
- case 17:
136
+ case 18:
146
137
  case "end":
147
138
  return _context.stop();
148
139
  }
@@ -159,16 +150,16 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
159
150
  }, {
160
151
  key: "loadData",
161
152
  value: function () {
162
- var _loadData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
163
- var _this3 = this;
153
+ var _loadData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
154
+ var _this2 = this;
164
155
 
165
- return _regenerator["default"].wrap(function _callee2$(_context2) {
156
+ return _regenerator.default.wrap(function _callee2$(_context2) {
166
157
  while (1) {
167
158
  switch (_context2.prev = _context2.next) {
168
159
  case 0:
169
160
  if (!this.gtfFeatures) {
170
- this.gtfFeatures = this.loadDataP()["catch"](function (e) {
171
- _this3.gtfFeatures = undefined;
161
+ this.gtfFeatures = this.loadDataP().catch(function (e) {
162
+ _this2.gtfFeatures = undefined;
172
163
  throw e;
173
164
  });
174
165
  }
@@ -192,13 +183,13 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
192
183
  }, {
193
184
  key: "getRefNames",
194
185
  value: function () {
195
- var _getRefNames = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
186
+ var _getRefNames = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
196
187
  var opts,
197
188
  _yield$this$loadData,
198
- intervalTree,
189
+ feats,
199
190
  _args3 = arguments;
200
191
 
201
- return _regenerator["default"].wrap(function _callee3$(_context3) {
192
+ return _regenerator.default.wrap(function _callee3$(_context3) {
202
193
  while (1) {
203
194
  switch (_context3.prev = _context3.next) {
204
195
  case 0:
@@ -208,8 +199,8 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
208
199
 
209
200
  case 3:
210
201
  _yield$this$loadData = _context3.sent;
211
- intervalTree = _yield$this$loadData.intervalTree;
212
- return _context3.abrupt("return", Object.keys(intervalTree));
202
+ feats = _yield$this$loadData.feats;
203
+ return _context3.abrupt("return", Object.keys(feats));
213
204
 
214
205
  case 6:
215
206
  case "end":
@@ -225,49 +216,143 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
225
216
 
226
217
  return getRefNames;
227
218
  }()
219
+ }, {
220
+ key: "loadFeatureIntervalTreeHelper",
221
+ value: function () {
222
+ var _loadFeatureIntervalTreeHelper = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(refName) {
223
+ var _this3 = this;
224
+
225
+ var _yield$this$loadData2, feats, lines, data, intervalTree, ret, i, obj;
226
+
227
+ return _regenerator.default.wrap(function _callee4$(_context4) {
228
+ while (1) {
229
+ switch (_context4.prev = _context4.next) {
230
+ case 0:
231
+ _context4.next = 2;
232
+ return this.loadData();
233
+
234
+ case 2:
235
+ _yield$this$loadData2 = _context4.sent;
236
+ feats = _yield$this$loadData2.feats;
237
+ lines = feats[refName];
238
+
239
+ if (lines) {
240
+ _context4.next = 7;
241
+ break;
242
+ }
243
+
244
+ return _context4.abrupt("return", undefined);
245
+
246
+ case 7:
247
+ data = _gtf.default.parseStringSync(lines.join('\n'), {
248
+ parseFeatures: true,
249
+ parseComments: false,
250
+ parseDirectives: false,
251
+ parseSequences: false
252
+ });
253
+ intervalTree = new _intervalTree.default();
254
+ ret = data.flat().map(function (f, i) {
255
+ return new _simpleFeature.default({
256
+ data: (0, _util.featureData)(f),
257
+ id: "".concat(_this3.id, "-offset-").concat(i)
258
+ });
259
+ });
260
+
261
+ for (i = 0; i < ret.length; i++) {
262
+ obj = ret[i];
263
+ intervalTree.insert([obj.get('start'), obj.get('end')], obj);
264
+ }
265
+
266
+ return _context4.abrupt("return", intervalTree);
267
+
268
+ case 12:
269
+ case "end":
270
+ return _context4.stop();
271
+ }
272
+ }
273
+ }, _callee4, this);
274
+ }));
275
+
276
+ function loadFeatureIntervalTreeHelper(_x) {
277
+ return _loadFeatureIntervalTreeHelper.apply(this, arguments);
278
+ }
279
+
280
+ return loadFeatureIntervalTreeHelper;
281
+ }()
282
+ }, {
283
+ key: "loadFeatureIntervalTree",
284
+ value: function () {
285
+ var _loadFeatureIntervalTree = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(refName) {
286
+ var _this4 = this;
287
+
288
+ return _regenerator.default.wrap(function _callee5$(_context5) {
289
+ while (1) {
290
+ switch (_context5.prev = _context5.next) {
291
+ case 0:
292
+ if (!this.intervalTrees[refName]) {
293
+ this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(refName).catch(function (e) {
294
+ _this4.intervalTrees[refName] = undefined;
295
+ throw e;
296
+ });
297
+ }
298
+
299
+ return _context5.abrupt("return", this.intervalTrees[refName]);
300
+
301
+ case 2:
302
+ case "end":
303
+ return _context5.stop();
304
+ }
305
+ }
306
+ }, _callee5, this);
307
+ }));
308
+
309
+ function loadFeatureIntervalTree(_x2) {
310
+ return _loadFeatureIntervalTree.apply(this, arguments);
311
+ }
312
+
313
+ return loadFeatureIntervalTree;
314
+ }()
228
315
  }, {
229
316
  key: "getFeatures",
230
317
  value: function getFeatures(query) {
231
- var _this4 = this;
318
+ var _this5 = this;
232
319
 
233
320
  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
234
321
  return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
235
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(observer) {
236
- var _intervalTree$refName, start, end, refName, _yield$_this4$loadDat, intervalTree;
237
-
238
- return _regenerator["default"].wrap(function _callee4$(_context4) {
322
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(observer) {
323
+ var start, end, refName, intervalTree;
324
+ return _regenerator.default.wrap(function _callee6$(_context6) {
239
325
  while (1) {
240
- switch (_context4.prev = _context4.next) {
326
+ switch (_context6.prev = _context6.next) {
241
327
  case 0:
242
- _context4.prev = 0;
328
+ _context6.prev = 0;
243
329
  start = query.start, end = query.end, refName = query.refName;
244
- _context4.next = 4;
245
- return _this4.loadData();
330
+ _context6.next = 4;
331
+ return _this5.loadFeatureIntervalTree(refName);
246
332
 
247
333
  case 4:
248
- _yield$_this4$loadDat = _context4.sent;
249
- intervalTree = _yield$_this4$loadDat.intervalTree;
250
- (_intervalTree$refName = intervalTree[refName]) === null || _intervalTree$refName === void 0 ? void 0 : _intervalTree$refName.search([start, end]).forEach(function (f) {
334
+ intervalTree = _context6.sent;
335
+ intervalTree === null || intervalTree === void 0 ? void 0 : intervalTree.search([start, end]).forEach(function (f) {
251
336
  return observer.next(f);
252
337
  });
253
338
  observer.complete();
254
- _context4.next = 13;
339
+ _context6.next = 12;
255
340
  break;
256
341
 
257
- case 10:
258
- _context4.prev = 10;
259
- _context4.t0 = _context4["catch"](0);
260
- observer.error(_context4.t0);
342
+ case 9:
343
+ _context6.prev = 9;
344
+ _context6.t0 = _context6["catch"](0);
345
+ observer.error(_context6.t0);
261
346
 
262
- case 13:
347
+ case 12:
263
348
  case "end":
264
- return _context4.stop();
349
+ return _context6.stop();
265
350
  }
266
351
  }
267
- }, _callee4, null, [[0, 10]]);
352
+ }, _callee6, null, [[0, 9]]);
268
353
  }));
269
354
 
270
- return function (_x) {
355
+ return function (_x3) {
271
356
  return _ref.apply(this, arguments);
272
357
  };
273
358
  }(), opts.signal);
@@ -281,4 +366,4 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
281
366
  return _default;
282
367
  }(_BaseAdapter.BaseFeatureDataAdapter);
283
368
 
284
- exports["default"] = _default;
369
+ exports.default = _default;
@@ -18,15 +18,15 @@ window.TextDecoder = _webEncoding.TextDecoder;
18
18
  describe('adapter can fetch features from volvox.sorted.gtf', function () {
19
19
  var adapter;
20
20
  beforeEach(function () {
21
- adapter = new _GtfAdapter["default"](_configSchema["default"].create({
21
+ adapter = new _GtfAdapter.default(_configSchema.default.create({
22
22
  gtfLocation: {
23
23
  localPath: require.resolve('../test_data/volvox.sorted.gtf')
24
24
  }
25
25
  }));
26
26
  });
27
- it('test getfeatures on gtf plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
27
+ it('test getfeatures on gtf plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
28
28
  var features, featuresArray, featuresJsonArray;
29
- return _regenerator["default"].wrap(function _callee$(_context) {
29
+ return _regenerator.default.wrap(function _callee$(_context) {
30
30
  while (1) {
31
31
  switch (_context.prev = _context.next) {
32
32
  case 0:
@@ -69,13 +69,13 @@ describe('adapter can fetch features from volvox.sorted.gtf', function () {
69
69
  }, _callee);
70
70
  })));
71
71
  });
72
- test('can instantiate new GtfAdapter and check for demo data', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
72
+ test('can instantiate new GtfAdapter and check for demo data', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
73
73
  var demoAdapter, features, featuresArray, featuresJsonArray;
74
- return _regenerator["default"].wrap(function _callee2$(_context2) {
74
+ return _regenerator.default.wrap(function _callee2$(_context2) {
75
75
  while (1) {
76
76
  switch (_context2.prev = _context2.next) {
77
77
  case 0:
78
- demoAdapter = new _GtfAdapter["default"](_configSchema["default"].create({
78
+ demoAdapter = new _GtfAdapter.default(_configSchema.default.create({
79
79
  gtfLocation: {
80
80
  localPath: require.resolve('../test_data/demo.gtf')
81
81
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports["default"] = void 0;
6
+ exports.default = void 0;
7
7
 
8
8
  var _configuration = require("@jbrowse/core/configuration");
9
9
 
@@ -19,4 +19,4 @@ var _default = (0, _configuration.ConfigurationSchema)('GtfAdapter', {
19
19
  explicitlyTyped: true
20
20
  });
21
21
 
22
- exports["default"] = _default;
22
+ exports.default = _default;
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  Object.defineProperty(exports, "configSchema", {
9
9
  enumerable: true,
10
10
  get: function get() {
11
- return _configSchema["default"];
11
+ return _configSchema.default;
12
12
  }
13
13
  });
14
14
 
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports["default"] = void 0;
10
+ exports.default = void 0;
11
11
 
12
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
13
 
@@ -33,43 +33,43 @@ var _tracks = require("@jbrowse/core/util/tracks");
33
33
 
34
34
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
35
 
36
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
36
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
37
 
38
- 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); }; }
38
+ 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); }; }
39
39
 
40
40
  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; } }
41
41
 
42
42
  var GtfPlugin = /*#__PURE__*/function (_Plugin) {
43
- (0, _inherits2["default"])(GtfPlugin, _Plugin);
43
+ (0, _inherits2.default)(GtfPlugin, _Plugin);
44
44
 
45
45
  var _super = _createSuper(GtfPlugin);
46
46
 
47
47
  function GtfPlugin() {
48
48
  var _this;
49
49
 
50
- (0, _classCallCheck2["default"])(this, GtfPlugin);
50
+ (0, _classCallCheck2.default)(this, GtfPlugin);
51
51
 
52
52
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
53
53
  args[_key] = arguments[_key];
54
54
  }
55
55
 
56
56
  _this = _super.call.apply(_super, [this].concat(args));
57
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "name", 'GTFPlugin');
57
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "name", 'GTFPlugin');
58
58
  return _this;
59
59
  }
60
60
 
61
- (0, _createClass2["default"])(GtfPlugin, [{
61
+ (0, _createClass2.default)(GtfPlugin, [{
62
62
  key: "install",
63
63
  value: function install(pluginManager) {
64
64
  pluginManager.addAdapterType(function () {
65
- return new _AdapterType["default"]({
65
+ return new _AdapterType.default({
66
66
  name: 'GtfAdapter',
67
67
  configSchema: _GtfAdapter.configSchema,
68
68
  getAdapterClass: function getAdapterClass() {
69
69
  return Promise.resolve().then(function () {
70
70
  return _interopRequireWildcard(require('./GtfAdapter/GtfAdapter'));
71
71
  }).then(function (r) {
72
- return r["default"];
72
+ return r.default;
73
73
  });
74
74
  }
75
75
  });
@@ -96,6 +96,6 @@ var GtfPlugin = /*#__PURE__*/function (_Plugin) {
96
96
  }
97
97
  }]);
98
98
  return GtfPlugin;
99
- }(_Plugin2["default"]);
99
+ }(_Plugin2.default);
100
100
 
101
- exports["default"] = GtfPlugin;
101
+ exports.default = GtfPlugin;
package/dist/util.js CHANGED
@@ -11,7 +11,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
11
11
 
12
12
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
13
 
14
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
15
 
16
16
  function featureData(data) {
17
17
  var f = _objectSpread({}, data);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-gtf",
3
- "version": "1.7.3",
3
+ "version": "1.7.6",
4
4
  "description": "JBrowse 2 gtf feature adapter",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -33,6 +33,7 @@
33
33
  "postbuild": "tsc --build tsconfig.build.json"
34
34
  },
35
35
  "dependencies": {
36
+ "@babel/runtime": "^7.17.9",
36
37
  "@flatten-js/interval-tree": "^1.0.15",
37
38
  "@gmod/bgzf-filehandle": "^1.4.3",
38
39
  "@gmod/gtf": "^0.0.6"
@@ -50,5 +51,5 @@
50
51
  "publishConfig": {
51
52
  "access": "public"
52
53
  },
53
- "gitHead": "09b13c85acf4ac68dd71ab23af87656c7552fdaf"
54
+ "gitHead": "dbd73f99714e395cf20877d5e05d26855857a0e3"
54
55
  }
@@ -3,13 +3,11 @@ import {
3
3
  BaseOptions,
4
4
  } from '@jbrowse/core/data_adapters/BaseAdapter'
5
5
  import { NoAssemblyRegion } from '@jbrowse/core/util/types'
6
- import { readConfObject } from '@jbrowse/core/configuration'
7
6
  import { openLocation } from '@jbrowse/core/util/io'
8
7
  import { ObservableCreate } from '@jbrowse/core/util/rxjs'
9
8
  import IntervalTree from '@flatten-js/interval-tree'
10
9
  import SimpleFeature, { Feature } from '@jbrowse/core/util/simpleFeature'
11
10
  import { unzip } from '@gmod/bgzf-filehandle'
12
-
13
11
  import gtf from '@gmod/gtf'
14
12
  import { FeatureLoc, featureData } from '../util'
15
13
  function isGzip(buf: Buffer) {
@@ -18,12 +16,16 @@ function isGzip(buf: Buffer) {
18
16
 
19
17
  export default class extends BaseFeatureDataAdapter {
20
18
  protected gtfFeatures?: Promise<{
21
- intervalTree: Record<string, IntervalTree>
19
+ feats: { [key: string]: string[] }
22
20
  }>
23
21
 
22
+ protected intervalTrees: {
23
+ [key: string]: Promise<IntervalTree | undefined> | undefined
24
+ } = {}
25
+
24
26
  private async loadDataP() {
25
27
  const buffer = await openLocation(
26
- readConfObject(this.config, 'gtfLocation'),
28
+ this.getConf('gtfLocation'),
27
29
  this.pluginManager,
28
30
  ).readFile()
29
31
 
@@ -33,31 +35,18 @@ export default class extends BaseFeatureDataAdapter {
33
35
  throw new Error('Data exceeds maximum string length (512MB)')
34
36
  }
35
37
  const data = new TextDecoder('utf8', { fatal: true }).decode(buf)
36
- const feats = gtf.parseStringSync(data, {
37
- parseFeatures: true,
38
- parseComments: false,
39
- parseDirectives: false,
40
- parseSequences: false,
41
- }) as FeatureLoc[][]
42
38
 
43
- const intervalTree = feats
44
- .flat()
45
- .map(
46
- (f, i) =>
47
- new SimpleFeature({
48
- data: featureData(f),
49
- id: `${this.id}-offset-${i}`,
50
- }),
51
- )
52
- .reduce((acc, obj) => {
53
- const key = obj.get('refName')
54
- if (!acc[key]) {
55
- acc[key] = new IntervalTree()
56
- }
57
- acc[key].insert([obj.get('start'), obj.get('end')], obj)
58
- return acc
59
- }, {} as Record<string, IntervalTree>)
60
- return { intervalTree }
39
+ const lines = data.split('\n').filter(f => !!f && !f.startsWith('#'))
40
+ const feats = {} as { [key: string]: string[] }
41
+ for (let i = 0; i < lines.length; i++) {
42
+ const refName = lines[i].split('\t')[0]
43
+ if (!feats[refName]) {
44
+ feats[refName] = []
45
+ }
46
+ feats[refName].push(lines[i])
47
+ }
48
+
49
+ return { feats }
61
50
  }
62
51
 
63
52
  private async loadData() {
@@ -72,18 +61,57 @@ export default class extends BaseFeatureDataAdapter {
72
61
  }
73
62
 
74
63
  public async getRefNames(opts: BaseOptions = {}) {
75
- const { intervalTree } = await this.loadData()
76
- return Object.keys(intervalTree)
64
+ const { feats } = await this.loadData()
65
+ return Object.keys(feats)
66
+ }
67
+
68
+ private async loadFeatureIntervalTreeHelper(refName: string) {
69
+ const { feats } = await this.loadData()
70
+ const lines = feats[refName]
71
+ if (!lines) {
72
+ return undefined
73
+ }
74
+ const data = gtf.parseStringSync(lines.join('\n'), {
75
+ parseFeatures: true,
76
+ parseComments: false,
77
+ parseDirectives: false,
78
+ parseSequences: false,
79
+ }) as FeatureLoc[][]
80
+
81
+ const intervalTree = new IntervalTree()
82
+ const ret = data.flat().map(
83
+ (f, i) =>
84
+ new SimpleFeature({
85
+ data: featureData(f),
86
+ id: `${this.id}-offset-${i}`,
87
+ }),
88
+ )
89
+
90
+ for (let i = 0; i < ret.length; i++) {
91
+ const obj = ret[i]
92
+ intervalTree.insert([obj.get('start'), obj.get('end')], obj)
93
+ }
94
+ return intervalTree
95
+ }
96
+
97
+ private async loadFeatureIntervalTree(refName: string) {
98
+ if (!this.intervalTrees[refName]) {
99
+ this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(
100
+ refName,
101
+ ).catch(e => {
102
+ this.intervalTrees[refName] = undefined
103
+ throw e
104
+ })
105
+ }
106
+ return this.intervalTrees[refName]
77
107
  }
78
108
 
79
109
  public getFeatures(query: NoAssemblyRegion, opts: BaseOptions = {}) {
80
110
  return ObservableCreate<Feature>(async observer => {
81
111
  try {
82
112
  const { start, end, refName } = query
83
- const { intervalTree } = await this.loadData()
84
- intervalTree[refName]
85
- ?.search([start, end])
86
- .forEach(f => observer.next(f))
113
+ const intervalTree = await this.loadFeatureIntervalTree(refName)
114
+ intervalTree?.search([start, end]).forEach(f => observer.next(f))
87
115
  observer.complete()
88
116
  } catch (e) {
89
117
  observer.error(e)