@jbrowse/plugin-gff3 2.15.0 → 2.15.2
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.
- package/dist/Gff3Adapter/Gff3Adapter.js +2 -9
- package/dist/Gff3TabixAdapter/Gff3TabixAdapter.d.ts +0 -1
- package/dist/Gff3TabixAdapter/Gff3TabixAdapter.js +13 -24
- package/dist/featureData.d.ts +16 -2
- package/dist/featureData.js +25 -32
- package/esm/Gff3Adapter/Gff3Adapter.js +2 -9
- package/esm/Gff3TabixAdapter/Gff3TabixAdapter.d.ts +0 -1
- package/esm/Gff3TabixAdapter/Gff3TabixAdapter.js +13 -24
- package/esm/featureData.d.ts +16 -2
- package/esm/featureData.js +25 -32
- package/package.json +4 -4
|
@@ -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
|
|
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 {
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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;
|
package/dist/featureData.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
import { GFF3FeatureLineWithRefs } from '
|
|
2
|
-
|
|
1
|
+
import { GFF3FeatureLineWithRefs } from 'gff-nostream';
|
|
2
|
+
interface GFF3Feature {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
strand?: number;
|
|
6
|
+
type: string | null;
|
|
7
|
+
source: string | null;
|
|
8
|
+
refName: string;
|
|
9
|
+
derived_features: unknown[] | null;
|
|
10
|
+
phase?: number;
|
|
11
|
+
score?: number;
|
|
12
|
+
subfeatures: GFF3Feature[] | undefined;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export declare function featureData(data: GFF3FeatureLineWithRefs): GFF3Feature;
|
|
16
|
+
export {};
|
package/dist/featureData.js
CHANGED
|
@@ -2,24 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.featureData = featureData;
|
|
4
4
|
function featureData(data) {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
if (
|
|
8
|
-
|
|
5
|
+
const { end, start, child_features, derived_features, attributes, type, source, phase, seq_id, score, strand, } = data;
|
|
6
|
+
let strand2;
|
|
7
|
+
if (strand === '+') {
|
|
8
|
+
strand2 = 1;
|
|
9
9
|
}
|
|
10
|
-
else if (
|
|
11
|
-
|
|
10
|
+
else if (strand === '-') {
|
|
11
|
+
strand2 = -1;
|
|
12
12
|
}
|
|
13
|
-
else if (
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
f.strand = undefined;
|
|
18
|
-
}
|
|
19
|
-
f.phase = data.phase === null ? undefined : Number(data.phase);
|
|
20
|
-
f.refName = data.seq_id;
|
|
21
|
-
if (data.score === null) {
|
|
22
|
-
f.score = undefined;
|
|
13
|
+
else if (strand === '.') {
|
|
14
|
+
strand2 = 0;
|
|
23
15
|
}
|
|
24
16
|
const defaultFields = new Set([
|
|
25
17
|
'start',
|
|
@@ -31,7 +23,8 @@ function featureData(data) {
|
|
|
31
23
|
'phase',
|
|
32
24
|
'strand',
|
|
33
25
|
]);
|
|
34
|
-
const dataAttributes =
|
|
26
|
+
const dataAttributes = attributes || {};
|
|
27
|
+
const resultAttributes = {};
|
|
35
28
|
for (const a of Object.keys(dataAttributes)) {
|
|
36
29
|
let b = a.toLowerCase();
|
|
37
30
|
if (defaultFields.has(b)) {
|
|
@@ -39,26 +32,26 @@ function featureData(data) {
|
|
|
39
32
|
// reproduces behavior of NCList
|
|
40
33
|
b += '2';
|
|
41
34
|
}
|
|
42
|
-
if (dataAttributes[a]) {
|
|
35
|
+
if (dataAttributes[a] && a !== '_lineHash') {
|
|
43
36
|
let attr = dataAttributes[a];
|
|
44
37
|
if (Array.isArray(attr) && attr.length === 1) {
|
|
45
38
|
;
|
|
46
39
|
[attr] = attr;
|
|
47
40
|
}
|
|
48
|
-
|
|
41
|
+
resultAttributes[b] = attr;
|
|
49
42
|
}
|
|
50
43
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
44
|
+
return {
|
|
45
|
+
...resultAttributes,
|
|
46
|
+
start: start - 1,
|
|
47
|
+
end: end,
|
|
48
|
+
strand: strand2,
|
|
49
|
+
type,
|
|
50
|
+
source,
|
|
51
|
+
refName: seq_id,
|
|
52
|
+
derived_features,
|
|
53
|
+
phase: phase === null ? undefined : Number(phase),
|
|
54
|
+
score: score === null ? undefined : score,
|
|
55
|
+
subfeatures: child_features.flatMap(childLocs => childLocs.map(childLoc => featureData(childLoc))),
|
|
56
|
+
};
|
|
64
57
|
}
|
|
@@ -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
|
|
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 {
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
}
|
package/esm/featureData.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
import { GFF3FeatureLineWithRefs } from '
|
|
2
|
-
|
|
1
|
+
import { GFF3FeatureLineWithRefs } from 'gff-nostream';
|
|
2
|
+
interface GFF3Feature {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
strand?: number;
|
|
6
|
+
type: string | null;
|
|
7
|
+
source: string | null;
|
|
8
|
+
refName: string;
|
|
9
|
+
derived_features: unknown[] | null;
|
|
10
|
+
phase?: number;
|
|
11
|
+
score?: number;
|
|
12
|
+
subfeatures: GFF3Feature[] | undefined;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export declare function featureData(data: GFF3FeatureLineWithRefs): GFF3Feature;
|
|
16
|
+
export {};
|
package/esm/featureData.js
CHANGED
|
@@ -1,22 +1,14 @@
|
|
|
1
1
|
export function featureData(data) {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
if (
|
|
5
|
-
|
|
2
|
+
const { end, start, child_features, derived_features, attributes, type, source, phase, seq_id, score, strand, } = data;
|
|
3
|
+
let strand2;
|
|
4
|
+
if (strand === '+') {
|
|
5
|
+
strand2 = 1;
|
|
6
6
|
}
|
|
7
|
-
else if (
|
|
8
|
-
|
|
7
|
+
else if (strand === '-') {
|
|
8
|
+
strand2 = -1;
|
|
9
9
|
}
|
|
10
|
-
else if (
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
f.strand = undefined;
|
|
15
|
-
}
|
|
16
|
-
f.phase = data.phase === null ? undefined : Number(data.phase);
|
|
17
|
-
f.refName = data.seq_id;
|
|
18
|
-
if (data.score === null) {
|
|
19
|
-
f.score = undefined;
|
|
10
|
+
else if (strand === '.') {
|
|
11
|
+
strand2 = 0;
|
|
20
12
|
}
|
|
21
13
|
const defaultFields = new Set([
|
|
22
14
|
'start',
|
|
@@ -28,7 +20,8 @@ export function featureData(data) {
|
|
|
28
20
|
'phase',
|
|
29
21
|
'strand',
|
|
30
22
|
]);
|
|
31
|
-
const dataAttributes =
|
|
23
|
+
const dataAttributes = attributes || {};
|
|
24
|
+
const resultAttributes = {};
|
|
32
25
|
for (const a of Object.keys(dataAttributes)) {
|
|
33
26
|
let b = a.toLowerCase();
|
|
34
27
|
if (defaultFields.has(b)) {
|
|
@@ -36,26 +29,26 @@ export function featureData(data) {
|
|
|
36
29
|
// reproduces behavior of NCList
|
|
37
30
|
b += '2';
|
|
38
31
|
}
|
|
39
|
-
if (dataAttributes[a]) {
|
|
32
|
+
if (dataAttributes[a] && a !== '_lineHash') {
|
|
40
33
|
let attr = dataAttributes[a];
|
|
41
34
|
if (Array.isArray(attr) && attr.length === 1) {
|
|
42
35
|
;
|
|
43
36
|
[attr] = attr;
|
|
44
37
|
}
|
|
45
|
-
|
|
38
|
+
resultAttributes[b] = attr;
|
|
46
39
|
}
|
|
47
40
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
41
|
+
return {
|
|
42
|
+
...resultAttributes,
|
|
43
|
+
start: start - 1,
|
|
44
|
+
end: end,
|
|
45
|
+
strand: strand2,
|
|
46
|
+
type,
|
|
47
|
+
source,
|
|
48
|
+
refName: seq_id,
|
|
49
|
+
derived_features,
|
|
50
|
+
phase: phase === null ? undefined : Number(phase),
|
|
51
|
+
score: score === null ? undefined : score,
|
|
52
|
+
subfeatures: child_features.flatMap(childLocs => childLocs.map(childLoc => featureData(childLoc))),
|
|
53
|
+
};
|
|
61
54
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-gff3",
|
|
3
|
-
"version": "2.15.
|
|
3
|
+
"version": "2.15.2",
|
|
4
4
|
"description": "JBrowse 2 gff3.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@flatten-js/interval-tree": "^1.0.15",
|
|
40
40
|
"@gmod/bgzf-filehandle": "^1.4.3",
|
|
41
|
-
"@gmod/
|
|
42
|
-
"
|
|
41
|
+
"@gmod/tabix": "^1.5.6",
|
|
42
|
+
"gff-nostream": "^1.3.3"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"@jbrowse/core": "^2.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": "
|
|
58
|
+
"gitHead": "8a58cefbfe39af4c97bcb6ead354d72c9fef9224"
|
|
59
59
|
}
|