@jbrowse/plugin-gff3 2.11.0 → 2.11.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.d.ts +5 -4
- package/dist/Gff3Adapter/Gff3Adapter.js +73 -39
- package/dist/Gff3Adapter/index.d.ts +1 -2
- package/dist/Gff3Adapter/index.js +3 -2
- package/dist/Gff3TabixAdapter/Gff3TabixAdapter.d.ts +1 -1
- package/dist/Gff3TabixAdapter/Gff3TabixAdapter.js +2 -2
- package/dist/Gff3TabixAdapter/index.d.ts +1 -2
- package/dist/Gff3TabixAdapter/index.js +3 -2
- package/dist/GuessGff3/index.d.ts +1 -2
- package/dist/GuessGff3/index.js +3 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/esm/Gff3Adapter/Gff3Adapter.d.ts +5 -4
- package/esm/Gff3Adapter/Gff3Adapter.js +72 -38
- package/esm/Gff3Adapter/index.d.ts +1 -2
- package/esm/Gff3Adapter/index.js +2 -2
- package/esm/Gff3TabixAdapter/Gff3TabixAdapter.d.ts +1 -1
- package/esm/Gff3TabixAdapter/Gff3TabixAdapter.js +1 -1
- package/esm/Gff3TabixAdapter/index.d.ts +1 -2
- package/esm/Gff3TabixAdapter/index.js +2 -2
- package/esm/GuessGff3/index.d.ts +1 -2
- package/esm/GuessGff3/index.js +2 -2
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -1
- package/package.json +2 -2
|
@@ -2,15 +2,16 @@ import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters
|
|
|
2
2
|
import { NoAssemblyRegion } from '@jbrowse/core/util/types';
|
|
3
3
|
import IntervalTree from '@flatten-js/interval-tree';
|
|
4
4
|
import { Feature } from '@jbrowse/core/util/simpleFeature';
|
|
5
|
-
export default class extends BaseFeatureDataAdapter {
|
|
5
|
+
export default class Gff3Adapter extends BaseFeatureDataAdapter {
|
|
6
|
+
calculatedIntervalTreeMap: Record<string, IntervalTree>;
|
|
6
7
|
protected gffFeatures?: Promise<{
|
|
7
8
|
header: string;
|
|
8
|
-
|
|
9
|
+
intervalTreeMap: Record<string, (sc?: (arg: string) => void) => IntervalTree>;
|
|
9
10
|
}>;
|
|
10
11
|
private loadDataP;
|
|
11
12
|
private loadData;
|
|
12
|
-
getRefNames(
|
|
13
|
-
getHeader(): Promise<string>;
|
|
13
|
+
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
14
|
+
getHeader(opts?: BaseOptions): Promise<string>;
|
|
14
15
|
getFeatures(query: NoAssemblyRegion, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
15
16
|
private featureData;
|
|
16
17
|
freeResources(): void;
|
|
@@ -13,57 +13,91 @@ const gff_1 = __importDefault(require("@gmod/gff"));
|
|
|
13
13
|
function isGzip(buf) {
|
|
14
14
|
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
|
|
17
|
+
class Gff3Adapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
this.calculatedIntervalTreeMap = {};
|
|
21
|
+
}
|
|
22
|
+
async loadDataP(opts) {
|
|
23
|
+
const { statusCallback = () => { } } = opts || {};
|
|
18
24
|
const pm = this.pluginManager;
|
|
19
25
|
const buf = await (0, io_1.openLocation)(this.getConf('gffLocation'), pm).readFile();
|
|
20
26
|
const buffer = isGzip(buf) ? await (0, bgzf_filehandle_1.unzip)(buf) : buf;
|
|
21
|
-
// 512MB max chrome string length is 512MB
|
|
22
|
-
if (buffer.length > 536870888) {
|
|
23
|
-
throw new Error('Data exceeds maximum string length (512MB)');
|
|
24
|
-
}
|
|
25
|
-
const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
|
|
26
|
-
const lines = data.split(/\n|\r\n|\r/);
|
|
27
27
|
const headerLines = [];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
28
|
+
const featureMap = {};
|
|
29
|
+
let blockStart = 0;
|
|
30
|
+
let i = 0;
|
|
31
|
+
while (blockStart < buffer.length) {
|
|
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);
|
|
35
|
+
const line = ((decoder === null || decoder === void 0 ? void 0 : decoder.decode(b)) || b.toString()).trim();
|
|
36
|
+
if (line) {
|
|
37
|
+
if (line.startsWith('#')) {
|
|
38
|
+
headerLines.push(line);
|
|
39
|
+
}
|
|
40
|
+
else if (line.startsWith('>')) {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const ret = line.indexOf('\t');
|
|
45
|
+
const refName = line.slice(0, ret);
|
|
46
|
+
if (!featureMap[refName]) {
|
|
47
|
+
featureMap[refName] = '';
|
|
48
|
+
}
|
|
49
|
+
featureMap[refName] += line + '\n';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (i++ % 10000 === 0) {
|
|
53
|
+
statusCallback(`Loading ${Math.floor(blockStart / 1000000).toLocaleString('en-US')}/${Math.floor(buffer.length / 1000000).toLocaleString('en-US')} MB`);
|
|
47
54
|
}
|
|
48
|
-
|
|
55
|
+
blockStart = n + 1;
|
|
49
56
|
}
|
|
50
|
-
|
|
57
|
+
const intervalTreeMap = Object.fromEntries(Object.entries(featureMap).map(([refName, lines]) => {
|
|
58
|
+
return [
|
|
59
|
+
refName,
|
|
60
|
+
(sc) => {
|
|
61
|
+
sc === null || sc === void 0 ? void 0 : sc(`Parsing GFF data`);
|
|
62
|
+
if (!this.calculatedIntervalTreeMap[refName]) {
|
|
63
|
+
const intervalTree = new interval_tree_1.default();
|
|
64
|
+
gff_1.default
|
|
65
|
+
.parseStringSync(lines, {
|
|
66
|
+
parseFeatures: true,
|
|
67
|
+
parseComments: false,
|
|
68
|
+
parseDirectives: false,
|
|
69
|
+
parseSequences: false,
|
|
70
|
+
disableDerivesFromReferences: true,
|
|
71
|
+
})
|
|
72
|
+
.flat()
|
|
73
|
+
.map((f, i) => new simpleFeature_1.default({
|
|
74
|
+
data: this.featureData(f),
|
|
75
|
+
id: `${this.id}-${refName}-${i}`,
|
|
76
|
+
}))
|
|
77
|
+
.forEach(obj => intervalTree.insert([obj.get('start'), obj.get('end')], obj));
|
|
78
|
+
this.calculatedIntervalTreeMap[refName] = intervalTree;
|
|
79
|
+
}
|
|
80
|
+
return this.calculatedIntervalTreeMap[refName];
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
}));
|
|
84
|
+
return { header: headerLines.join('\n'), intervalTreeMap };
|
|
51
85
|
}
|
|
52
|
-
async loadData() {
|
|
86
|
+
async loadData(opts) {
|
|
53
87
|
if (!this.gffFeatures) {
|
|
54
|
-
this.gffFeatures = this.loadDataP().catch(e => {
|
|
88
|
+
this.gffFeatures = this.loadDataP(opts).catch(e => {
|
|
55
89
|
this.gffFeatures = undefined;
|
|
56
90
|
throw e;
|
|
57
91
|
});
|
|
58
92
|
}
|
|
59
93
|
return this.gffFeatures;
|
|
60
94
|
}
|
|
61
|
-
async getRefNames(
|
|
62
|
-
const {
|
|
63
|
-
return Object.keys(
|
|
95
|
+
async getRefNames(opts = {}) {
|
|
96
|
+
const { intervalTreeMap } = await this.loadData(opts);
|
|
97
|
+
return Object.keys(intervalTreeMap);
|
|
64
98
|
}
|
|
65
|
-
async getHeader() {
|
|
66
|
-
const { header } = await this.loadData();
|
|
99
|
+
async getHeader(opts = {}) {
|
|
100
|
+
const { header } = await this.loadData(opts);
|
|
67
101
|
return header;
|
|
68
102
|
}
|
|
69
103
|
getFeatures(query, opts = {}) {
|
|
@@ -71,8 +105,8 @@ class default_1 extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
71
105
|
var _a;
|
|
72
106
|
try {
|
|
73
107
|
const { start, end, refName } = query;
|
|
74
|
-
const {
|
|
75
|
-
(_a =
|
|
108
|
+
const { intervalTreeMap } = await this.loadData(opts);
|
|
109
|
+
(_a = intervalTreeMap[refName](opts.statusCallback)) === null || _a === void 0 ? void 0 : _a.search([start, end]).forEach(f => observer.next(f));
|
|
76
110
|
observer.complete();
|
|
77
111
|
}
|
|
78
112
|
catch (e) {
|
|
@@ -144,4 +178,4 @@ class default_1 extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
144
178
|
}
|
|
145
179
|
freeResources( /* { region } */) { }
|
|
146
180
|
}
|
|
147
|
-
exports.default =
|
|
181
|
+
exports.default = Gff3Adapter;
|
|
@@ -28,11 +28,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const pluggableElementTypes_1 = require("@jbrowse/core/pluggableElementTypes");
|
|
30
30
|
const configSchema_1 = __importDefault(require("./configSchema"));
|
|
31
|
-
|
|
31
|
+
function Gff3AdapterF(pluginManager) {
|
|
32
32
|
pluginManager.addAdapterType(() => new pluggableElementTypes_1.AdapterType({
|
|
33
33
|
name: 'Gff3Adapter',
|
|
34
34
|
displayName: 'GFF3 adapter',
|
|
35
35
|
configSchema: configSchema_1.default,
|
|
36
36
|
getAdapterClass: () => Promise.resolve().then(() => __importStar(require('./Gff3Adapter'))).then(r => r.default),
|
|
37
37
|
}));
|
|
38
|
-
}
|
|
38
|
+
}
|
|
39
|
+
exports.default = Gff3AdapterF;
|
|
@@ -5,7 +5,7 @@ import { TabixIndexedFile } from '@gmod/tabix';
|
|
|
5
5
|
import { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
6
6
|
import PluginManager from '@jbrowse/core/PluginManager';
|
|
7
7
|
import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache';
|
|
8
|
-
export default class extends BaseFeatureDataAdapter {
|
|
8
|
+
export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
|
|
9
9
|
protected gff: TabixIndexedFile;
|
|
10
10
|
protected dontRedispatch: string[];
|
|
11
11
|
constructor(config: AnyConfigurationModel, getSubAdapter?: getSubAdapterType, pluginManager?: PluginManager);
|
|
@@ -12,7 +12,7 @@ const simpleFeature_1 = __importDefault(require("@jbrowse/core/util/simpleFeatur
|
|
|
12
12
|
const tabix_1 = require("@gmod/tabix");
|
|
13
13
|
const gff_1 = __importDefault(require("@gmod/gff"));
|
|
14
14
|
const configuration_1 = require("@jbrowse/core/configuration");
|
|
15
|
-
class
|
|
15
|
+
class Gff3TabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
16
16
|
constructor(config, getSubAdapter, pluginManager) {
|
|
17
17
|
super(config, getSubAdapter, pluginManager);
|
|
18
18
|
const gffGzLocation = (0, configuration_1.readConfObject)(config, 'gffGzLocation');
|
|
@@ -186,4 +186,4 @@ class default_1 extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
186
186
|
}
|
|
187
187
|
freeResources( /* { region } */) { }
|
|
188
188
|
}
|
|
189
|
-
exports.default =
|
|
189
|
+
exports.default = Gff3TabixAdapter;
|
|
@@ -28,11 +28,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const pluggableElementTypes_1 = require("@jbrowse/core/pluggableElementTypes");
|
|
30
30
|
const configSchema_1 = __importDefault(require("./configSchema"));
|
|
31
|
-
|
|
31
|
+
function Gff3TabixAdapterF(pluginManager) {
|
|
32
32
|
pluginManager.addAdapterType(() => new pluggableElementTypes_1.AdapterType({
|
|
33
33
|
name: 'Gff3TabixAdapter',
|
|
34
34
|
displayName: 'GFF3 tabix adapter',
|
|
35
35
|
configSchema: configSchema_1.default,
|
|
36
36
|
getAdapterClass: () => Promise.resolve().then(() => __importStar(require('./Gff3TabixAdapter'))).then(r => r.default),
|
|
37
37
|
}));
|
|
38
|
-
}
|
|
38
|
+
}
|
|
39
|
+
exports.default = Gff3TabixAdapterF;
|
package/dist/GuessGff3/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tracks_1 = require("@jbrowse/core/util/tracks");
|
|
4
|
-
|
|
4
|
+
function GuessGff3F(pluginManager) {
|
|
5
5
|
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
|
|
6
6
|
return (file, index, adapterHint) => {
|
|
7
7
|
const regexGuess = /\.gff3?\.b?gz$/i;
|
|
@@ -40,4 +40,5 @@ exports.default = (pluginManager) => {
|
|
|
40
40
|
return adapterGuesser(file, index, adapterHint);
|
|
41
41
|
};
|
|
42
42
|
});
|
|
43
|
-
}
|
|
43
|
+
}
|
|
44
|
+
exports.default = GuessGff3F;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ const Plugin_1 = __importDefault(require("@jbrowse/core/Plugin"));
|
|
|
7
7
|
const Gff3TabixAdapter_1 = __importDefault(require("./Gff3TabixAdapter"));
|
|
8
8
|
const Gff3Adapter_1 = __importDefault(require("./Gff3Adapter"));
|
|
9
9
|
const GuessGff3_1 = __importDefault(require("./GuessGff3"));
|
|
10
|
-
class
|
|
10
|
+
class GFF3Plugin extends Plugin_1.default {
|
|
11
11
|
constructor() {
|
|
12
12
|
super(...arguments);
|
|
13
13
|
this.name = 'GFF3Plugin';
|
|
@@ -18,4 +18,4 @@ class default_1 extends Plugin_1.default {
|
|
|
18
18
|
(0, GuessGff3_1.default)(pluginManager);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
exports.default =
|
|
21
|
+
exports.default = GFF3Plugin;
|
|
@@ -2,15 +2,16 @@ import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters
|
|
|
2
2
|
import { NoAssemblyRegion } from '@jbrowse/core/util/types';
|
|
3
3
|
import IntervalTree from '@flatten-js/interval-tree';
|
|
4
4
|
import { Feature } from '@jbrowse/core/util/simpleFeature';
|
|
5
|
-
export default class extends BaseFeatureDataAdapter {
|
|
5
|
+
export default class Gff3Adapter extends BaseFeatureDataAdapter {
|
|
6
|
+
calculatedIntervalTreeMap: Record<string, IntervalTree>;
|
|
6
7
|
protected gffFeatures?: Promise<{
|
|
7
8
|
header: string;
|
|
8
|
-
|
|
9
|
+
intervalTreeMap: Record<string, (sc?: (arg: string) => void) => IntervalTree>;
|
|
9
10
|
}>;
|
|
10
11
|
private loadDataP;
|
|
11
12
|
private loadData;
|
|
12
|
-
getRefNames(
|
|
13
|
-
getHeader(): Promise<string>;
|
|
13
|
+
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
14
|
+
getHeader(opts?: BaseOptions): Promise<string>;
|
|
14
15
|
getFeatures(query: NoAssemblyRegion, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
15
16
|
private featureData;
|
|
16
17
|
freeResources(): void;
|
|
@@ -8,57 +8,91 @@ import gff from '@gmod/gff';
|
|
|
8
8
|
function isGzip(buf) {
|
|
9
9
|
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
|
|
12
|
+
export default class Gff3Adapter extends BaseFeatureDataAdapter {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.calculatedIntervalTreeMap = {};
|
|
16
|
+
}
|
|
17
|
+
async loadDataP(opts) {
|
|
18
|
+
const { statusCallback = () => { } } = opts || {};
|
|
13
19
|
const pm = this.pluginManager;
|
|
14
20
|
const buf = await openLocation(this.getConf('gffLocation'), pm).readFile();
|
|
15
21
|
const buffer = isGzip(buf) ? await unzip(buf) : buf;
|
|
16
|
-
// 512MB max chrome string length is 512MB
|
|
17
|
-
if (buffer.length > 536870888) {
|
|
18
|
-
throw new Error('Data exceeds maximum string length (512MB)');
|
|
19
|
-
}
|
|
20
|
-
const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
|
|
21
|
-
const lines = data.split(/\n|\r\n|\r/);
|
|
22
22
|
const headerLines = [];
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
const featureMap = {};
|
|
24
|
+
let blockStart = 0;
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (blockStart < buffer.length) {
|
|
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);
|
|
30
|
+
const line = ((decoder === null || decoder === void 0 ? void 0 : decoder.decode(b)) || b.toString()).trim();
|
|
31
|
+
if (line) {
|
|
32
|
+
if (line.startsWith('#')) {
|
|
33
|
+
headerLines.push(line);
|
|
34
|
+
}
|
|
35
|
+
else if (line.startsWith('>')) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const ret = line.indexOf('\t');
|
|
40
|
+
const refName = line.slice(0, ret);
|
|
41
|
+
if (!featureMap[refName]) {
|
|
42
|
+
featureMap[refName] = '';
|
|
43
|
+
}
|
|
44
|
+
featureMap[refName] += line + '\n';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (i++ % 10000 === 0) {
|
|
48
|
+
statusCallback(`Loading ${Math.floor(blockStart / 1000000).toLocaleString('en-US')}/${Math.floor(buffer.length / 1000000).toLocaleString('en-US')} MB`);
|
|
42
49
|
}
|
|
43
|
-
|
|
50
|
+
blockStart = n + 1;
|
|
44
51
|
}
|
|
45
|
-
|
|
52
|
+
const intervalTreeMap = Object.fromEntries(Object.entries(featureMap).map(([refName, lines]) => {
|
|
53
|
+
return [
|
|
54
|
+
refName,
|
|
55
|
+
(sc) => {
|
|
56
|
+
sc === null || sc === void 0 ? void 0 : sc(`Parsing GFF data`);
|
|
57
|
+
if (!this.calculatedIntervalTreeMap[refName]) {
|
|
58
|
+
const intervalTree = new IntervalTree();
|
|
59
|
+
gff
|
|
60
|
+
.parseStringSync(lines, {
|
|
61
|
+
parseFeatures: true,
|
|
62
|
+
parseComments: false,
|
|
63
|
+
parseDirectives: false,
|
|
64
|
+
parseSequences: false,
|
|
65
|
+
disableDerivesFromReferences: true,
|
|
66
|
+
})
|
|
67
|
+
.flat()
|
|
68
|
+
.map((f, i) => new SimpleFeature({
|
|
69
|
+
data: this.featureData(f),
|
|
70
|
+
id: `${this.id}-${refName}-${i}`,
|
|
71
|
+
}))
|
|
72
|
+
.forEach(obj => intervalTree.insert([obj.get('start'), obj.get('end')], obj));
|
|
73
|
+
this.calculatedIntervalTreeMap[refName] = intervalTree;
|
|
74
|
+
}
|
|
75
|
+
return this.calculatedIntervalTreeMap[refName];
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
}));
|
|
79
|
+
return { header: headerLines.join('\n'), intervalTreeMap };
|
|
46
80
|
}
|
|
47
|
-
async loadData() {
|
|
81
|
+
async loadData(opts) {
|
|
48
82
|
if (!this.gffFeatures) {
|
|
49
|
-
this.gffFeatures = this.loadDataP().catch(e => {
|
|
83
|
+
this.gffFeatures = this.loadDataP(opts).catch(e => {
|
|
50
84
|
this.gffFeatures = undefined;
|
|
51
85
|
throw e;
|
|
52
86
|
});
|
|
53
87
|
}
|
|
54
88
|
return this.gffFeatures;
|
|
55
89
|
}
|
|
56
|
-
async getRefNames(
|
|
57
|
-
const {
|
|
58
|
-
return Object.keys(
|
|
90
|
+
async getRefNames(opts = {}) {
|
|
91
|
+
const { intervalTreeMap } = await this.loadData(opts);
|
|
92
|
+
return Object.keys(intervalTreeMap);
|
|
59
93
|
}
|
|
60
|
-
async getHeader() {
|
|
61
|
-
const { header } = await this.loadData();
|
|
94
|
+
async getHeader(opts = {}) {
|
|
95
|
+
const { header } = await this.loadData(opts);
|
|
62
96
|
return header;
|
|
63
97
|
}
|
|
64
98
|
getFeatures(query, opts = {}) {
|
|
@@ -66,8 +100,8 @@ export default class extends BaseFeatureDataAdapter {
|
|
|
66
100
|
var _a;
|
|
67
101
|
try {
|
|
68
102
|
const { start, end, refName } = query;
|
|
69
|
-
const {
|
|
70
|
-
(_a =
|
|
103
|
+
const { intervalTreeMap } = await this.loadData(opts);
|
|
104
|
+
(_a = intervalTreeMap[refName](opts.statusCallback)) === null || _a === void 0 ? void 0 : _a.search([start, end]).forEach(f => observer.next(f));
|
|
71
105
|
observer.complete();
|
|
72
106
|
}
|
|
73
107
|
catch (e) {
|
package/esm/Gff3Adapter/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AdapterType } from '@jbrowse/core/pluggableElementTypes';
|
|
2
2
|
import configSchema from './configSchema';
|
|
3
|
-
export default (pluginManager)
|
|
3
|
+
export default function Gff3AdapterF(pluginManager) {
|
|
4
4
|
pluginManager.addAdapterType(() => new AdapterType({
|
|
5
5
|
name: 'Gff3Adapter',
|
|
6
6
|
displayName: 'GFF3 adapter',
|
|
7
7
|
configSchema,
|
|
8
8
|
getAdapterClass: () => import('./Gff3Adapter').then(r => r.default),
|
|
9
9
|
}));
|
|
10
|
-
}
|
|
10
|
+
}
|
|
@@ -5,7 +5,7 @@ import { TabixIndexedFile } from '@gmod/tabix';
|
|
|
5
5
|
import { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
6
6
|
import PluginManager from '@jbrowse/core/PluginManager';
|
|
7
7
|
import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache';
|
|
8
|
-
export default class extends BaseFeatureDataAdapter {
|
|
8
|
+
export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
|
|
9
9
|
protected gff: TabixIndexedFile;
|
|
10
10
|
protected dontRedispatch: string[];
|
|
11
11
|
constructor(config: AnyConfigurationModel, getSubAdapter?: getSubAdapterType, pluginManager?: PluginManager);
|
|
@@ -7,7 +7,7 @@ import SimpleFeature from '@jbrowse/core/util/simpleFeature';
|
|
|
7
7
|
import { TabixIndexedFile } from '@gmod/tabix';
|
|
8
8
|
import gff from '@gmod/gff';
|
|
9
9
|
import { readConfObject, } from '@jbrowse/core/configuration';
|
|
10
|
-
export default class extends BaseFeatureDataAdapter {
|
|
10
|
+
export default class Gff3TabixAdapter extends BaseFeatureDataAdapter {
|
|
11
11
|
constructor(config, getSubAdapter, pluginManager) {
|
|
12
12
|
super(config, getSubAdapter, pluginManager);
|
|
13
13
|
const gffGzLocation = readConfObject(config, 'gffGzLocation');
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AdapterType } from '@jbrowse/core/pluggableElementTypes';
|
|
2
2
|
import configSchema from './configSchema';
|
|
3
|
-
export default (pluginManager)
|
|
3
|
+
export default function Gff3TabixAdapterF(pluginManager) {
|
|
4
4
|
pluginManager.addAdapterType(() => new AdapterType({
|
|
5
5
|
name: 'Gff3TabixAdapter',
|
|
6
6
|
displayName: 'GFF3 tabix adapter',
|
|
7
7
|
configSchema,
|
|
8
8
|
getAdapterClass: () => import('./Gff3TabixAdapter').then(r => r.default),
|
|
9
9
|
}));
|
|
10
|
-
}
|
|
10
|
+
}
|
package/esm/GuessGff3/index.d.ts
CHANGED
package/esm/GuessGff3/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { makeIndex, makeIndexType, getFileName, } from '@jbrowse/core/util/tracks';
|
|
2
|
-
export default (pluginManager)
|
|
2
|
+
export default function GuessGff3F(pluginManager) {
|
|
3
3
|
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
|
|
4
4
|
return (file, index, adapterHint) => {
|
|
5
5
|
const regexGuess = /\.gff3?\.b?gz$/i;
|
|
@@ -38,4 +38,4 @@ export default (pluginManager) => {
|
|
|
38
38
|
return adapterGuesser(file, index, adapterHint);
|
|
39
39
|
};
|
|
40
40
|
});
|
|
41
|
-
}
|
|
41
|
+
}
|
package/esm/index.d.ts
CHANGED
package/esm/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import Plugin from '@jbrowse/core/Plugin';
|
|
|
2
2
|
import Gff3TabixAdapterF from './Gff3TabixAdapter';
|
|
3
3
|
import Gff3AdapterF from './Gff3Adapter';
|
|
4
4
|
import GuessGff3F from './GuessGff3';
|
|
5
|
-
export default class extends Plugin {
|
|
5
|
+
export default class GFF3Plugin extends Plugin {
|
|
6
6
|
constructor() {
|
|
7
7
|
super(...arguments);
|
|
8
8
|
this.name = 'GFF3Plugin';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-gff3",
|
|
3
|
-
"version": "2.11.
|
|
3
|
+
"version": "2.11.2",
|
|
4
4
|
"description": "JBrowse 2 gff3.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -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": "511048cb6965f0bf624c96de244e7fd47fce17d6"
|
|
59
59
|
}
|