gff-nostream 3.0.11 → 4.0.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.
- package/README.md +33 -89
- package/dist/api.d.ts +6 -21
- package/dist/api.js +29 -126
- package/dist/api.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/util.d.ts +20 -120
- package/dist/util.js +29 -179
- package/dist/util.js.map +1 -1
- package/esm/api.d.ts +6 -21
- package/esm/api.js +30 -125
- package/esm/api.js.map +1 -1
- package/esm/index.d.ts +2 -2
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/esm/util.d.ts +20 -120
- package/esm/util.js +29 -172
- package/esm/util.js.map +1 -1
- package/package.json +1 -1
- package/src/api.ts +37 -153
- package/src/index.ts +2 -18
- package/src/util.ts +39 -308
package/esm/util.d.ts
CHANGED
|
@@ -6,122 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export declare function unescape(stringVal: string): string;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* @returns Parsed attributes
|
|
13
|
-
*/
|
|
14
|
-
export declare function parseAttributes(attrString: string): GFF3Attributes;
|
|
15
|
-
/**
|
|
16
|
-
* Parse the 9th column (attributes) of a GFF3 feature line without unescaping.
|
|
17
|
-
* Fast path for data known to contain no escaped characters.
|
|
18
|
-
*
|
|
19
|
-
* @param attrString - String of GFF3 9th column
|
|
20
|
-
* @returns Parsed attributes
|
|
21
|
-
*/
|
|
22
|
-
export declare function parseAttributesNoUnescape(attrString: string): GFF3Attributes;
|
|
23
|
-
/**
|
|
24
|
-
* Parse a GFF3 feature line
|
|
25
|
-
*
|
|
26
|
-
* @param line - GFF3 feature line
|
|
27
|
-
* @returns The parsed feature
|
|
9
|
+
* A parsed GFF3 feature: a flat object with 0-based half-open coordinates,
|
|
10
|
+
* numeric strand (`1`/`-1`/`0`), attributes spread as lowercase top-level keys,
|
|
11
|
+
* and child features nested under `subfeatures`.
|
|
28
12
|
*/
|
|
29
|
-
export
|
|
30
|
-
/**
|
|
31
|
-
* Parse a GFF3 feature line without unescaping.
|
|
32
|
-
* Fast path for data known to contain no escaped characters.
|
|
33
|
-
*
|
|
34
|
-
* @param line - GFF3 feature line
|
|
35
|
-
* @returns The parsed feature
|
|
36
|
-
*/
|
|
37
|
-
export declare function parseFeatureNoUnescape(line: string): GFF3FeatureLine;
|
|
38
|
-
/**
|
|
39
|
-
* Parse a GFF3 directive line.
|
|
40
|
-
*
|
|
41
|
-
* @param line - GFF3 directive line
|
|
42
|
-
* @returns The parsed directive
|
|
43
|
-
*/
|
|
44
|
-
export declare function parseDirective(line: string): GFF3Directive | GFF3SequenceRegionDirective | GFF3GenomeBuildDirective | null;
|
|
45
|
-
/** A record of GFF3 attribute identifiers and the values of those identifiers */
|
|
46
|
-
export type GFF3Attributes = Record<string, string[] | undefined>;
|
|
47
|
-
/** A representation of a single line of a GFF3 file */
|
|
48
|
-
export interface GFF3FeatureLine {
|
|
49
|
-
/** The ID of the landmark used to establish the coordinate system for the current feature */
|
|
50
|
-
seq_id: string | null;
|
|
51
|
-
/** A free text qualifier intended to describe the algorithm or operating procedure that generated this feature */
|
|
52
|
-
source: string | null;
|
|
53
|
-
/** The type of the feature */
|
|
54
|
-
type: string | null;
|
|
55
|
-
/** The start coordinates of the feature */
|
|
56
|
-
start: number | null;
|
|
57
|
-
/** The end coordinates of the feature */
|
|
58
|
-
end: number | null;
|
|
59
|
-
/** The score of the feature */
|
|
60
|
-
score: number | null;
|
|
61
|
-
/** The strand of the feature */
|
|
62
|
-
strand: string | null;
|
|
63
|
-
/** For features of type "CDS", the phase indicates where the next codon begins relative to the 5' end of the current CDS feature */
|
|
64
|
-
phase: string | null;
|
|
65
|
-
/** Feature attributes */
|
|
66
|
-
attributes: GFF3Attributes | null;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* A GFF3 Feature line that includes references to other features defined in
|
|
70
|
-
* their "Parent" or "Derives_from" attributes
|
|
71
|
-
*/
|
|
72
|
-
export interface GFF3FeatureLineWithRefs extends GFF3FeatureLine {
|
|
73
|
-
/** An array of child features */
|
|
74
|
-
child_features: GFF3Feature[];
|
|
75
|
-
/** An array of features derived from this feature */
|
|
76
|
-
derived_features: GFF3Feature[];
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* A GFF3 feature, which may include multiple individual feature lines
|
|
80
|
-
*/
|
|
81
|
-
export type GFF3Feature = GFF3FeatureLineWithRefs[];
|
|
82
|
-
/** A GFF3 directive */
|
|
83
|
-
export interface GFF3Directive {
|
|
84
|
-
/** The name of the directive */
|
|
85
|
-
directive: string;
|
|
86
|
-
/** The string value of the directive */
|
|
87
|
-
value?: string;
|
|
88
|
-
}
|
|
89
|
-
/** A GFF3 sequence-region directive */
|
|
90
|
-
export interface GFF3SequenceRegionDirective extends GFF3Directive {
|
|
91
|
-
/** The string value of the directive */
|
|
92
|
-
value: string;
|
|
93
|
-
/** The sequence ID parsed from the directive */
|
|
94
|
-
seq_id: string;
|
|
95
|
-
/** The sequence start parsed from the directive */
|
|
96
|
-
start: string;
|
|
97
|
-
/** The sequence end parsed from the directive */
|
|
98
|
-
end: string;
|
|
99
|
-
}
|
|
100
|
-
/** A GFF3 genome-build directive */
|
|
101
|
-
export interface GFF3GenomeBuildDirective extends GFF3Directive {
|
|
102
|
-
/** The string value of the directive */
|
|
103
|
-
value: string;
|
|
104
|
-
/** The genome build source parsed from the directive */
|
|
105
|
-
source: string;
|
|
106
|
-
/** The genome build name parsed from the directive */
|
|
107
|
-
buildName: string;
|
|
108
|
-
}
|
|
109
|
-
/** A GFF3 comment */
|
|
110
|
-
export interface GFF3Comment {
|
|
111
|
-
/** The text of the comment */
|
|
112
|
-
comment: string;
|
|
113
|
-
}
|
|
114
|
-
/** A GFF3 FASTA single sequence */
|
|
115
|
-
export interface GFF3Sequence {
|
|
116
|
-
/** The ID of the sequence */
|
|
117
|
-
id: string;
|
|
118
|
-
/** The description of the sequence */
|
|
119
|
-
description?: string;
|
|
120
|
-
/** The sequence */
|
|
121
|
-
sequence: string;
|
|
122
|
-
}
|
|
123
|
-
export type GFF3Item = GFF3Feature | GFF3Directive | GFF3Comment | GFF3Sequence;
|
|
124
|
-
export interface JBrowseFeature {
|
|
13
|
+
export interface GffFeature {
|
|
125
14
|
start: number;
|
|
126
15
|
end: number;
|
|
127
16
|
strand?: number;
|
|
@@ -130,10 +19,21 @@ export interface JBrowseFeature {
|
|
|
130
19
|
refName: string;
|
|
131
20
|
phase?: number;
|
|
132
21
|
score?: number;
|
|
133
|
-
subfeatures:
|
|
22
|
+
subfeatures: GffFeature[];
|
|
134
23
|
[key: string]: unknown;
|
|
135
24
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Parse the 9th column (attributes) of a GFF3 feature line into `result`,
|
|
27
|
+
* lowercasing keys and suffixing any that collide with a default field name.
|
|
28
|
+
* Pass shouldUnescape=false as a fast path for data with no escaped characters.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseAttributes(attrString: string, result: Record<string, unknown>, shouldUnescape: boolean): void;
|
|
31
|
+
/**
|
|
32
|
+
* Parse a GFF3 feature line. Pass shouldUnescape=false as a fast path for data
|
|
33
|
+
* known to contain no escaped characters.
|
|
34
|
+
*
|
|
35
|
+
* @param line - GFF3 feature line
|
|
36
|
+
* @param shouldUnescape - whether to unescape percent-encoded values
|
|
37
|
+
* @returns The parsed feature
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseFeature(line: string, shouldUnescape: boolean): GffFeature;
|
package/esm/util.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
// Fast, low-level functions for parsing
|
|
1
|
+
// Fast, low-level functions for parsing GFF3.
|
|
2
2
|
// JavaScript port of Robert Buels's Bio::GFF3::LowLevel Perl module.
|
|
3
|
-
const directiveRegex = /^\s*##\s*(\S+)\s*(.*)/;
|
|
4
|
-
const whitespaceRegex = /\s+/;
|
|
5
|
-
const nonDigitRegex = /\D/g;
|
|
6
3
|
const HEX_LOOKUP = {};
|
|
7
4
|
for (let i = 0; i < 256; i++) {
|
|
8
5
|
const hex = i.toString(16).toUpperCase().padStart(2, '0');
|
|
@@ -24,169 +21,28 @@ export function unescape(stringVal) {
|
|
|
24
21
|
let lastIdx = 0;
|
|
25
22
|
let i = idx;
|
|
26
23
|
while (i < stringVal.length) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
result += char;
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
result += stringVal.slice(i, i + 3);
|
|
36
|
-
}
|
|
24
|
+
const char = stringVal[i] === '%' && i + 2 < stringVal.length
|
|
25
|
+
? HEX_LOOKUP[stringVal.slice(i + 1, i + 3)]
|
|
26
|
+
: undefined;
|
|
27
|
+
if (char !== undefined) {
|
|
28
|
+
result += stringVal.slice(lastIdx, i) + char;
|
|
37
29
|
i += 3;
|
|
38
30
|
lastIdx = i;
|
|
39
31
|
}
|
|
40
32
|
else {
|
|
33
|
+
// Not a valid escape: advance one char so a '%' that begins a real
|
|
34
|
+
// escape immediately after isn't swallowed (e.g. the %20 in "a%b%20c").
|
|
41
35
|
i++;
|
|
42
36
|
}
|
|
43
37
|
}
|
|
44
38
|
return result + stringVal.slice(lastIdx);
|
|
45
39
|
}
|
|
46
|
-
function parseAttributesImpl(attrString, shouldUnescape) {
|
|
47
|
-
if (attrString.length === 0 || attrString === '.') {
|
|
48
|
-
return {};
|
|
49
|
-
}
|
|
50
|
-
const attrs = {};
|
|
51
|
-
let len = attrString.length;
|
|
52
|
-
if (attrString[len - 1] === '\n') {
|
|
53
|
-
len = attrString[len - 2] === '\r' ? len - 2 : len - 1;
|
|
54
|
-
attrString = attrString.slice(0, len);
|
|
55
|
-
}
|
|
56
|
-
let start = 0;
|
|
57
|
-
while (start < len) {
|
|
58
|
-
let semiIdx = attrString.indexOf(';', start);
|
|
59
|
-
if (semiIdx === -1) {
|
|
60
|
-
semiIdx = len;
|
|
61
|
-
}
|
|
62
|
-
if (semiIdx > start) {
|
|
63
|
-
const eqIdx = attrString.indexOf('=', start);
|
|
64
|
-
if (eqIdx !== -1 && eqIdx < semiIdx && eqIdx + 1 < semiIdx) {
|
|
65
|
-
const tag = attrString.slice(start, eqIdx);
|
|
66
|
-
let arec = attrs[tag];
|
|
67
|
-
if (!arec) {
|
|
68
|
-
arec = [];
|
|
69
|
-
attrs[tag] = arec;
|
|
70
|
-
}
|
|
71
|
-
let valStart = eqIdx + 1;
|
|
72
|
-
while (valStart < semiIdx) {
|
|
73
|
-
let commaIdx = attrString.indexOf(',', valStart);
|
|
74
|
-
if (commaIdx === -1 || commaIdx > semiIdx) {
|
|
75
|
-
commaIdx = semiIdx;
|
|
76
|
-
}
|
|
77
|
-
if (commaIdx > valStart) {
|
|
78
|
-
const val = attrString.slice(valStart, commaIdx);
|
|
79
|
-
arec.push(shouldUnescape ? unescape(val) : val);
|
|
80
|
-
}
|
|
81
|
-
valStart = commaIdx + 1;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
start = semiIdx + 1;
|
|
86
|
-
}
|
|
87
|
-
return attrs;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Parse the 9th column (attributes) of a GFF3 feature line.
|
|
91
|
-
*
|
|
92
|
-
* @param attrString - String of GFF3 9th column
|
|
93
|
-
* @returns Parsed attributes
|
|
94
|
-
*/
|
|
95
|
-
export function parseAttributes(attrString) {
|
|
96
|
-
return parseAttributesImpl(attrString, true);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Parse the 9th column (attributes) of a GFF3 feature line without unescaping.
|
|
100
|
-
* Fast path for data known to contain no escaped characters.
|
|
101
|
-
*
|
|
102
|
-
* @param attrString - String of GFF3 9th column
|
|
103
|
-
* @returns Parsed attributes
|
|
104
|
-
*/
|
|
105
|
-
export function parseAttributesNoUnescape(attrString) {
|
|
106
|
-
return parseAttributesImpl(attrString, false);
|
|
107
|
-
}
|
|
108
40
|
function isEmpty(s) {
|
|
109
41
|
return s.length === 0 || s === '.';
|
|
110
42
|
}
|
|
111
43
|
function strField(s, shouldUnescape, empty) {
|
|
112
44
|
return isEmpty(s) ? empty : shouldUnescape ? unescape(s) : s;
|
|
113
45
|
}
|
|
114
|
-
function numField(s) {
|
|
115
|
-
return isEmpty(s) ? null : +s;
|
|
116
|
-
}
|
|
117
|
-
function parseFeatureImpl(line, shouldUnescape) {
|
|
118
|
-
const f = line.split('\t');
|
|
119
|
-
const attrString = f[8];
|
|
120
|
-
return {
|
|
121
|
-
seq_id: strField(f[0], shouldUnescape, null),
|
|
122
|
-
source: strField(f[1], shouldUnescape, null),
|
|
123
|
-
type: strField(f[2], shouldUnescape, null),
|
|
124
|
-
start: numField(f[3]),
|
|
125
|
-
end: numField(f[4]),
|
|
126
|
-
score: numField(f[5]),
|
|
127
|
-
strand: strField(f[6], false, null),
|
|
128
|
-
phase: strField(f[7], false, null),
|
|
129
|
-
attributes: isEmpty(attrString)
|
|
130
|
-
? null
|
|
131
|
-
: parseAttributesImpl(attrString, shouldUnescape),
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Parse a GFF3 feature line
|
|
136
|
-
*
|
|
137
|
-
* @param line - GFF3 feature line
|
|
138
|
-
* @returns The parsed feature
|
|
139
|
-
*/
|
|
140
|
-
export function parseFeature(line) {
|
|
141
|
-
return parseFeatureImpl(line, true);
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Parse a GFF3 feature line without unescaping.
|
|
145
|
-
* Fast path for data known to contain no escaped characters.
|
|
146
|
-
*
|
|
147
|
-
* @param line - GFF3 feature line
|
|
148
|
-
* @returns The parsed feature
|
|
149
|
-
*/
|
|
150
|
-
export function parseFeatureNoUnescape(line) {
|
|
151
|
-
return parseFeatureImpl(line, false);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Parse a GFF3 directive line.
|
|
155
|
-
*
|
|
156
|
-
* @param line - GFF3 directive line
|
|
157
|
-
* @returns The parsed directive
|
|
158
|
-
*/
|
|
159
|
-
export function parseDirective(line) {
|
|
160
|
-
const match = directiveRegex.exec(line);
|
|
161
|
-
if (!match) {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
const name = match[1];
|
|
165
|
-
const contents = match[2];
|
|
166
|
-
const parsed = { directive: name };
|
|
167
|
-
if (contents.length) {
|
|
168
|
-
parsed.value = contents.trimEnd();
|
|
169
|
-
}
|
|
170
|
-
if (name === 'sequence-region') {
|
|
171
|
-
const c = contents.split(whitespaceRegex, 3);
|
|
172
|
-
return {
|
|
173
|
-
...parsed,
|
|
174
|
-
seq_id: c[0],
|
|
175
|
-
start: c[1].replaceAll(nonDigitRegex, ''),
|
|
176
|
-
end: c[2].replaceAll(nonDigitRegex, ''),
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
else if (name === 'genome-build') {
|
|
180
|
-
const [source, buildName] = contents.split(whitespaceRegex, 2);
|
|
181
|
-
return {
|
|
182
|
-
...parsed,
|
|
183
|
-
source: source,
|
|
184
|
-
buildName: buildName,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
return parsed;
|
|
188
|
-
}
|
|
189
|
-
// JBrowse format types and parsing functions
|
|
190
46
|
const JBROWSE_DEFAULT_FIELDS = new Set([
|
|
191
47
|
'start',
|
|
192
48
|
'end',
|
|
@@ -220,7 +76,17 @@ const COMMON_ATTRS = {
|
|
|
220
76
|
target: 'target',
|
|
221
77
|
gap: 'gap',
|
|
222
78
|
};
|
|
223
|
-
|
|
79
|
+
const STRAND_MAP = {
|
|
80
|
+
'+': 1,
|
|
81
|
+
'-': -1,
|
|
82
|
+
'.': 0,
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Parse the 9th column (attributes) of a GFF3 feature line into `result`,
|
|
86
|
+
* lowercasing keys and suffixing any that collide with a default field name.
|
|
87
|
+
* Pass shouldUnescape=false as a fast path for data with no escaped characters.
|
|
88
|
+
*/
|
|
89
|
+
export function parseAttributes(attrString, result, shouldUnescape) {
|
|
224
90
|
if (attrString.length === 0 || attrString === '.') {
|
|
225
91
|
return;
|
|
226
92
|
}
|
|
@@ -265,18 +131,15 @@ function parseAttributesJBrowseImpl(attrString, result, shouldUnescape) {
|
|
|
265
131
|
start = semiIdx + 1;
|
|
266
132
|
}
|
|
267
133
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
'.': 0,
|
|
278
|
-
};
|
|
279
|
-
function parseFeatureJBrowseImpl(line, shouldUnescape) {
|
|
134
|
+
/**
|
|
135
|
+
* Parse a GFF3 feature line. Pass shouldUnescape=false as a fast path for data
|
|
136
|
+
* known to contain no escaped characters.
|
|
137
|
+
*
|
|
138
|
+
* @param line - GFF3 feature line
|
|
139
|
+
* @param shouldUnescape - whether to unescape percent-encoded values
|
|
140
|
+
* @returns The parsed feature
|
|
141
|
+
*/
|
|
142
|
+
export function parseFeature(line, shouldUnescape) {
|
|
280
143
|
const f = line.split('\t');
|
|
281
144
|
const startStr = f[3];
|
|
282
145
|
const endStr = f[4];
|
|
@@ -294,13 +157,7 @@ function parseFeatureJBrowseImpl(line, shouldUnescape) {
|
|
|
294
157
|
phase: isEmpty(phase) ? undefined : +phase,
|
|
295
158
|
subfeatures: [],
|
|
296
159
|
};
|
|
297
|
-
|
|
160
|
+
parseAttributes(attrString, result, shouldUnescape);
|
|
298
161
|
return result;
|
|
299
162
|
}
|
|
300
|
-
export function parseFeatureJBrowse(line) {
|
|
301
|
-
return parseFeatureJBrowseImpl(line, true);
|
|
302
|
-
}
|
|
303
|
-
export function parseFeatureJBrowseNoUnescape(line) {
|
|
304
|
-
return parseFeatureJBrowseImpl(line, false);
|
|
305
|
-
}
|
|
306
163
|
//# sourceMappingURL=util.js.map
|
package/esm/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|