@jbrowse/plugin-gff3 2.14.0 → 2.15.1

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.
@@ -9,7 +9,7 @@ const rxjs_1 = require("@jbrowse/core/util/rxjs");
9
9
  const interval_tree_1 = __importDefault(require("@flatten-js/interval-tree"));
10
10
  const simpleFeature_1 = __importDefault(require("@jbrowse/core/util/simpleFeature"));
11
11
  const bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
12
- const gff_1 = __importDefault(require("@gmod/gff"));
12
+ const gff_nostream_1 = require("gff-nostream");
13
13
  const util_1 = require("@jbrowse/core/util");
14
14
  const featureData_1 = require("../featureData");
15
15
  class Gff3Adapter extends BaseAdapter_1.BaseFeatureDataAdapter {
@@ -30,8 +30,8 @@ class Gff3Adapter extends BaseAdapter_1.BaseFeatureDataAdapter {
30
30
  let i = 0;
31
31
  while (blockStart < buffer.length) {
32
32
  const n = buffer.indexOf('\n', blockStart);
33
- // could be a non-newline ended file, so slice to end of file if n===-1
34
- const b = n === -1 ? buffer.slice(blockStart) : buffer.slice(blockStart, n);
33
+ // could be a non-newline ended file, so subarray to end of file if n===-1
34
+ const b = n === -1 ? buffer.subarray(blockStart) : buffer.subarray(blockStart, n);
35
35
  const line = ((decoder === null || decoder === void 0 ? void 0 : decoder.decode(b)) || b.toString()).trim();
36
36
  if (line) {
37
37
  if (line.startsWith('#')) {
@@ -60,14 +60,7 @@ class Gff3Adapter extends BaseAdapter_1.BaseFeatureDataAdapter {
60
60
  if (!this.calculatedIntervalTreeMap[refName]) {
61
61
  sc === null || sc === void 0 ? void 0 : sc('Parsing GFF data');
62
62
  const intervalTree = new interval_tree_1.default();
63
- gff_1.default
64
- .parseStringSync(lines, {
65
- parseFeatures: true,
66
- parseComments: false,
67
- parseDirectives: false,
68
- parseSequences: false,
69
- disableDerivesFromReferences: true,
70
- })
63
+ (0, gff_nostream_1.parseStringSync)(lines)
71
64
  .flat()
72
65
  .map((f, i) => new simpleFeature_1.default({
73
66
  data: (0, featureData_1.featureData)(f),
@@ -14,6 +14,5 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
14
14
  getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
15
15
  private getFeaturesHelper;
16
16
  private parseLine;
17
- private formatFeatures;
18
17
  freeResources(): void;
19
18
  }
@@ -9,7 +9,7 @@ const io_1 = require("@jbrowse/core/util/io");
9
9
  const rxjs_1 = require("@jbrowse/core/util/rxjs");
10
10
  const simpleFeature_1 = __importDefault(require("@jbrowse/core/util/simpleFeature"));
11
11
  const tabix_1 = require("@gmod/tabix");
12
- const gff_1 = __importDefault(require("@gmod/gff"));
12
+ const gff_nostream_1 = require("gff-nostream");
13
13
  const configuration_1 = require("@jbrowse/core/configuration");
14
14
  const featureData_1 = require("../featureData");
15
15
  class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
@@ -45,6 +45,7 @@ class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
45
45
  }, opts.signal);
46
46
  }
47
47
  async getFeaturesHelper(query, opts, metadata, observer, allowRedispatch, originalQuery = query) {
48
+ var _a, _b;
48
49
  try {
49
50
  const lines = [];
50
51
  await this.gff.getLines(query.refName, query.start, query.end, (line, fileOffset) => {
@@ -53,7 +54,7 @@ class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
53
54
  if (allowRedispatch && lines.length) {
54
55
  let minStart = Number.POSITIVE_INFINITY;
55
56
  let maxEnd = Number.NEGATIVE_INFINITY;
56
- lines.forEach(line => {
57
+ for (const line of lines) {
57
58
  const featureType = line.fields[2];
58
59
  // only expand redispatch range if feature is not a "dontRedispatch"
59
60
  // type skips large regions like chromosome,region
@@ -66,7 +67,7 @@ class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
66
67
  maxEnd = line.end;
67
68
  }
68
69
  }
69
- });
70
+ }
70
71
  if (maxEnd > query.end || minStart < query.start) {
71
72
  // make a new feature callback to only return top-level features
72
73
  // in the original query range
@@ -75,7 +76,7 @@ class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
75
76
  }
76
77
  }
77
78
  const gff3 = lines
78
- .map((lineRecord) => {
79
+ .map(lineRecord => {
79
80
  if (lineRecord.fields[8] && lineRecord.fields[8] !== '.') {
80
81
  if (!lineRecord.fields[8].includes('_lineHash')) {
81
82
  lineRecord.fields[8] += `;_lineHash=${lineRecord.lineHash}`;
@@ -87,20 +88,17 @@ class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
87
88
  return lineRecord.fields.join('\t');
88
89
  })
89
90
  .join('\n');
90
- const features = gff_1.default.parseStringSync(gff3, {
91
- parseFeatures: true,
92
- parseComments: false,
93
- parseDirectives: false,
94
- parseSequences: false,
95
- disableDerivesFromReferences: true,
96
- });
97
- features.forEach(featureLocs => {
98
- this.formatFeatures(featureLocs).forEach(f => {
91
+ for (const featureLocs of (0, gff_nostream_1.parseStringSync)(gff3)) {
92
+ for (const featureLoc of featureLocs) {
93
+ const f = new simpleFeature_1.default({
94
+ data: (0, featureData_1.featureData)(featureLoc),
95
+ id: `${this.id}-offset-${(_b = (_a = featureLoc.attributes) === null || _a === void 0 ? void 0 : _a._lineHash) === null || _b === void 0 ? void 0 : _b[0]}`,
96
+ });
99
97
  if ((0, range_1.doesIntersect2)(f.get('start'), f.get('end'), originalQuery.start, originalQuery.end)) {
100
98
  observer.next(f);
101
99
  }
102
- });
103
- });
100
+ }
101
+ }
104
102
  observer.complete();
105
103
  }
106
104
  catch (e) {
@@ -117,15 +115,6 @@ class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
117
115
  fields,
118
116
  };
119
117
  }
120
- formatFeatures(featureLocs) {
121
- return featureLocs.map(featureLoc => {
122
- var _a, _b;
123
- return new simpleFeature_1.default({
124
- data: (0, featureData_1.featureData)(featureLoc),
125
- id: `${this.id}-offset-${(_b = (_a = featureLoc.attributes) === null || _a === void 0 ? void 0 : _a._lineHash) === null || _b === void 0 ? void 0 : _b[0]}`,
126
- });
127
- });
128
- }
129
118
  freeResources( /* { region } */) { }
130
119
  }
131
120
  exports.default = Gff3TabixAdapter;
@@ -1,2 +1,2 @@
1
- import { GFF3FeatureLineWithRefs } from '@gmod/gff';
1
+ import { GFF3FeatureLineWithRefs } from 'gff-nostream';
2
2
  export declare function featureData(data: GFF3FeatureLineWithRefs): Record<string, unknown>;
@@ -4,7 +4,7 @@ import { ObservableCreate } from '@jbrowse/core/util/rxjs';
4
4
  import IntervalTree from '@flatten-js/interval-tree';
5
5
  import SimpleFeature from '@jbrowse/core/util/simpleFeature';
6
6
  import { unzip } from '@gmod/bgzf-filehandle';
7
- import gff from '@gmod/gff';
7
+ import { parseStringSync } from 'gff-nostream';
8
8
  import { isGzip, updateStatus } from '@jbrowse/core/util';
9
9
  import { featureData } from '../featureData';
10
10
  export default class Gff3Adapter extends BaseFeatureDataAdapter {
@@ -25,8 +25,8 @@ export default class Gff3Adapter extends BaseFeatureDataAdapter {
25
25
  let i = 0;
26
26
  while (blockStart < buffer.length) {
27
27
  const n = buffer.indexOf('\n', blockStart);
28
- // could be a non-newline ended file, so slice to end of file if n===-1
29
- const b = n === -1 ? buffer.slice(blockStart) : buffer.slice(blockStart, n);
28
+ // could be a non-newline ended file, so subarray to end of file if n===-1
29
+ const b = n === -1 ? buffer.subarray(blockStart) : buffer.subarray(blockStart, n);
30
30
  const line = ((decoder === null || decoder === void 0 ? void 0 : decoder.decode(b)) || b.toString()).trim();
31
31
  if (line) {
32
32
  if (line.startsWith('#')) {
@@ -55,14 +55,7 @@ export default class Gff3Adapter extends BaseFeatureDataAdapter {
55
55
  if (!this.calculatedIntervalTreeMap[refName]) {
56
56
  sc === null || sc === void 0 ? void 0 : sc('Parsing GFF data');
57
57
  const intervalTree = new IntervalTree();
58
- gff
59
- .parseStringSync(lines, {
60
- parseFeatures: true,
61
- parseComments: false,
62
- parseDirectives: false,
63
- parseSequences: false,
64
- disableDerivesFromReferences: true,
65
- })
58
+ parseStringSync(lines)
66
59
  .flat()
67
60
  .map((f, i) => new SimpleFeature({
68
61
  data: featureData(f),
@@ -14,6 +14,5 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
14
14
  getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
15
15
  private getFeaturesHelper;
16
16
  private parseLine;
17
- private formatFeatures;
18
17
  freeResources(): void;
19
18
  }
@@ -4,7 +4,7 @@ import { openLocation } from '@jbrowse/core/util/io';
4
4
  import { ObservableCreate } from '@jbrowse/core/util/rxjs';
5
5
  import SimpleFeature from '@jbrowse/core/util/simpleFeature';
6
6
  import { TabixIndexedFile } from '@gmod/tabix';
7
- import gff from '@gmod/gff';
7
+ import { parseStringSync } from 'gff-nostream';
8
8
  import { readConfObject, } from '@jbrowse/core/configuration';
9
9
  import { featureData } from '../featureData';
10
10
  export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
@@ -40,6 +40,7 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
40
40
  }, opts.signal);
41
41
  }
42
42
  async getFeaturesHelper(query, opts, metadata, observer, allowRedispatch, originalQuery = query) {
43
+ var _a, _b;
43
44
  try {
44
45
  const lines = [];
45
46
  await this.gff.getLines(query.refName, query.start, query.end, (line, fileOffset) => {
@@ -48,7 +49,7 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
48
49
  if (allowRedispatch && lines.length) {
49
50
  let minStart = Number.POSITIVE_INFINITY;
50
51
  let maxEnd = Number.NEGATIVE_INFINITY;
51
- lines.forEach(line => {
52
+ for (const line of lines) {
52
53
  const featureType = line.fields[2];
53
54
  // only expand redispatch range if feature is not a "dontRedispatch"
54
55
  // type skips large regions like chromosome,region
@@ -61,7 +62,7 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
61
62
  maxEnd = line.end;
62
63
  }
63
64
  }
64
- });
65
+ }
65
66
  if (maxEnd > query.end || minStart < query.start) {
66
67
  // make a new feature callback to only return top-level features
67
68
  // in the original query range
@@ -70,7 +71,7 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
70
71
  }
71
72
  }
72
73
  const gff3 = lines
73
- .map((lineRecord) => {
74
+ .map(lineRecord => {
74
75
  if (lineRecord.fields[8] && lineRecord.fields[8] !== '.') {
75
76
  if (!lineRecord.fields[8].includes('_lineHash')) {
76
77
  lineRecord.fields[8] += `;_lineHash=${lineRecord.lineHash}`;
@@ -82,20 +83,17 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
82
83
  return lineRecord.fields.join('\t');
83
84
  })
84
85
  .join('\n');
85
- const features = gff.parseStringSync(gff3, {
86
- parseFeatures: true,
87
- parseComments: false,
88
- parseDirectives: false,
89
- parseSequences: false,
90
- disableDerivesFromReferences: true,
91
- });
92
- features.forEach(featureLocs => {
93
- this.formatFeatures(featureLocs).forEach(f => {
86
+ for (const featureLocs of parseStringSync(gff3)) {
87
+ for (const featureLoc of featureLocs) {
88
+ const f = new SimpleFeature({
89
+ data: featureData(featureLoc),
90
+ id: `${this.id}-offset-${(_b = (_a = featureLoc.attributes) === null || _a === void 0 ? void 0 : _a._lineHash) === null || _b === void 0 ? void 0 : _b[0]}`,
91
+ });
94
92
  if (doesIntersect2(f.get('start'), f.get('end'), originalQuery.start, originalQuery.end)) {
95
93
  observer.next(f);
96
94
  }
97
- });
98
- });
95
+ }
96
+ }
99
97
  observer.complete();
100
98
  }
101
99
  catch (e) {
@@ -112,14 +110,5 @@ export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
112
110
  fields,
113
111
  };
114
112
  }
115
- formatFeatures(featureLocs) {
116
- return featureLocs.map(featureLoc => {
117
- var _a, _b;
118
- return new SimpleFeature({
119
- data: featureData(featureLoc),
120
- id: `${this.id}-offset-${(_b = (_a = featureLoc.attributes) === null || _a === void 0 ? void 0 : _a._lineHash) === null || _b === void 0 ? void 0 : _b[0]}`,
121
- });
122
- });
123
- }
124
113
  freeResources( /* { region } */) { }
125
114
  }
@@ -1,2 +1,2 @@
1
- import { GFF3FeatureLineWithRefs } from '@gmod/gff';
1
+ import { GFF3FeatureLineWithRefs } from 'gff-nostream';
2
2
  export declare function featureData(data: GFF3FeatureLineWithRefs): Record<string, unknown>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-gff3",
3
- "version": "2.14.0",
3
+ "version": "2.15.1",
4
4
  "description": "JBrowse 2 gff3.",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -38,13 +38,13 @@
38
38
  "dependencies": {
39
39
  "@flatten-js/interval-tree": "^1.0.15",
40
40
  "@gmod/bgzf-filehandle": "^1.4.3",
41
- "@gmod/gff": "^1.3.0",
42
- "@gmod/tabix": "^1.5.6"
41
+ "@gmod/tabix": "^1.5.6",
42
+ "gff-nostream": "^1.3.3"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@jbrowse/core": "^2.0.0",
46
46
  "@jbrowse/plugin-linear-genome-view": "^2.0.0",
47
- "@mui/material": "^5.0.0",
47
+ "@mui/material": "^6.0.0",
48
48
  "mobx": "^6.0.0",
49
49
  "mobx-state-tree": "^5.0.0",
50
50
  "rxjs": "^7.0.0"
@@ -55,5 +55,5 @@
55
55
  "distModule": "esm/index.js",
56
56
  "srcModule": "src/index.ts",
57
57
  "module": "esm/index.js",
58
- "gitHead": "9fb8231d932db40adf0a283081765431756c66ff"
58
+ "gitHead": "86ed70124fc5a0b1161266659d1ca9f8796bf3fe"
59
59
  }