gff-nostream 1.3.9 → 2.0.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.
package/esm/util.js CHANGED
@@ -1,5 +1,14 @@
1
1
  // Fast, low-level functions for parsing and formatting GFF3.
2
2
  // JavaScript port of Robert Buels's Bio::GFF3::LowLevel Perl module.
3
+ const escapeRegex = /%([0-9A-Fa-f]{2})/g;
4
+ const directiveRegex = /^\s*##\s*(\S+)\s*(.*)/;
5
+ const lineEndRegex = /\r?\n$/;
6
+ const whitespaceRegex = /\s+/;
7
+ const nonDigitRegex = /\D/g;
8
+ // eslint-disable-next-line no-control-regex
9
+ const attrEscapeRegex = /[\n;\r\t=%&,\u0000-\u001f\u007f-\u00ff]/g;
10
+ // eslint-disable-next-line no-control-regex
11
+ const columnEscapeRegex = /[\n\r\t%\u0000-\u001f\u007f-\u00ff]/g;
3
12
  /**
4
13
  * Unescape a string value used in a GFF3 attribute.
5
14
  *
@@ -7,7 +16,10 @@
7
16
  * @returns An unescaped string value
8
17
  */
9
18
  export function unescape(stringVal) {
10
- return stringVal.replaceAll(/%([0-9A-Fa-f]{2})/g, (_match, seq) => String.fromCharCode(parseInt(seq, 16)));
19
+ if (!stringVal.includes('%')) {
20
+ return stringVal;
21
+ }
22
+ return stringVal.replaceAll(escapeRegex, (_match, seq) => String.fromCharCode(parseInt(seq, 16)));
11
23
  }
12
24
  function _escape(regex, s) {
13
25
  return String(s).replace(regex, ch => {
@@ -22,7 +34,7 @@ function _escape(regex, s) {
22
34
  * @returns An escaped string value
23
35
  */
24
36
  export function escape(rawVal) {
25
- return _escape(/[\n;\r\t=%&,\u0000-\u001f\u007f-\u00ff]/g, rawVal);
37
+ return _escape(attrEscapeRegex, rawVal);
26
38
  }
27
39
  /**
28
40
  * Escape a value for use in a GFF3 column value.
@@ -31,7 +43,7 @@ export function escape(rawVal) {
31
43
  * @returns An escaped column value
32
44
  */
33
45
  export function escapeColumn(rawVal) {
34
- return _escape(/[\n\r\t%\u0000-\u001f\u007f-\u00ff]/g, rawVal);
46
+ return _escape(columnEscapeRegex, rawVal);
35
47
  }
36
48
  /**
37
49
  * Parse the 9th column (attributes) of a GFF3 feature line.
@@ -44,26 +56,66 @@ export function parseAttributes(attrString) {
44
56
  return {};
45
57
  }
46
58
  const attrs = {};
47
- attrString
48
- .replace(/\r?\n$/, '')
49
- .split(';')
50
- .forEach(a => {
51
- var _a;
52
- const nv = a.split('=', 2);
53
- if (!((_a = nv[1]) === null || _a === void 0 ? void 0 : _a.length)) {
54
- return;
59
+ let str = attrString;
60
+ if (str.endsWith('\n')) {
61
+ str = str.slice(0, str.endsWith('\r\n') ? -2 : -1);
62
+ }
63
+ for (const a of str.split(';')) {
64
+ const eqIdx = a.indexOf('=');
65
+ if (eqIdx === -1) {
66
+ continue;
67
+ }
68
+ const value = a.slice(eqIdx + 1);
69
+ if (!value.length) {
70
+ continue;
55
71
  }
56
- nv[0] = nv[0].trim();
57
- let arec = attrs[nv[0].trim()];
72
+ const tag = a.slice(0, eqIdx).trim();
73
+ let arec = attrs[tag];
58
74
  if (!arec) {
59
75
  arec = [];
60
- attrs[nv[0]] = arec;
76
+ attrs[tag] = arec;
61
77
  }
62
- arec.push(...nv[1]
63
- .split(',')
64
- .map(s => s.trim())
65
- .map(unescape));
66
- });
78
+ for (const s of value.split(',')) {
79
+ arec.push(unescape(s.trim()));
80
+ }
81
+ }
82
+ return attrs;
83
+ }
84
+ /**
85
+ * Parse the 9th column (attributes) of a GFF3 feature line without unescaping.
86
+ * Fast path for data known to contain no escaped characters.
87
+ *
88
+ * @param attrString - String of GFF3 9th column
89
+ * @returns Parsed attributes
90
+ */
91
+ export function parseAttributesNoUnescape(attrString) {
92
+ if (!attrString.length || attrString === '.') {
93
+ return {};
94
+ }
95
+ const attrs = {};
96
+ let str = attrString;
97
+ if (str.endsWith('\n')) {
98
+ str = str.slice(0, str.endsWith('\r\n') ? -2 : -1);
99
+ }
100
+ for (const a of str.split(';')) {
101
+ const eqIdx = a.indexOf('=');
102
+ if (eqIdx === -1) {
103
+ continue;
104
+ }
105
+ const value = a.slice(eqIdx + 1);
106
+ if (!value.length) {
107
+ continue;
108
+ }
109
+ const tag = a.slice(0, eqIdx).trim();
110
+ let arec = attrs[tag];
111
+ if (!arec) {
112
+ arec = [];
113
+ attrs[tag] = arec;
114
+ }
115
+ for (const s of value.split(',')) {
116
+ arec.push(s.trim());
117
+ }
118
+ }
67
119
  return attrs;
68
120
  }
69
121
  /**
@@ -73,21 +125,67 @@ export function parseAttributes(attrString) {
73
125
  * @returns The parsed feature
74
126
  */
75
127
  export function parseFeature(line) {
76
- // split the line into columns and replace '.' with null in each column
77
- const f = line.split('\t').map(a => (a === '.' || a === '' ? null : a));
78
- // unescape only the ref, source, and type columns
79
- const parsed = {
80
- seq_id: f[0] && unescape(f[0]),
81
- source: f[1] && unescape(f[1]),
82
- type: f[2] && unescape(f[2]),
83
- start: f[3] === null ? null : parseInt(f[3], 10),
84
- end: f[4] === null ? null : parseInt(f[4], 10),
85
- score: f[5] === null ? null : parseFloat(f[5]),
86
- strand: f[6],
87
- phase: f[7],
88
- attributes: f[8] === null ? null : parseAttributes(f[8]),
128
+ return parseFieldsArray(line.split('\t'));
129
+ }
130
+ /**
131
+ * Parse a GFF3 feature from a pre-split fields array
132
+ *
133
+ * @param f - Array of 9 GFF3 column values (use null or '.' for empty values)
134
+ * @returns The parsed feature
135
+ */
136
+ function norm(a) {
137
+ return a === '.' || a === '' || a === undefined ? null : a;
138
+ }
139
+ export function parseFieldsArray(f) {
140
+ const seq_id = norm(f[0]);
141
+ const source = norm(f[1]);
142
+ const type = norm(f[2]);
143
+ const start = norm(f[3]);
144
+ const end = norm(f[4]);
145
+ const score = norm(f[5]);
146
+ const strand = norm(f[6]);
147
+ const phase = norm(f[7]);
148
+ const attrString = norm(f[8]);
149
+ return {
150
+ seq_id: seq_id ? unescape(seq_id) : null,
151
+ source: source ? unescape(source) : null,
152
+ type: type ? unescape(type) : null,
153
+ start: start === null ? null : parseInt(start, 10),
154
+ end: end === null ? null : parseInt(end, 10),
155
+ score: score === null ? null : parseFloat(score),
156
+ strand,
157
+ phase,
158
+ attributes: attrString === null ? null : parseAttributes(attrString),
159
+ };
160
+ }
161
+ /**
162
+ * Parse a GFF3 feature from a pre-split fields array without unescaping.
163
+ * Fast path for data known to contain no escaped characters.
164
+ *
165
+ * @param f - Array of 9 GFF3 column values (use null or '.' for empty values)
166
+ * @returns The parsed feature
167
+ */
168
+ export function parseFieldsArrayNoUnescape(f) {
169
+ const seq_id = norm(f[0]);
170
+ const source = norm(f[1]);
171
+ const type = norm(f[2]);
172
+ const start = norm(f[3]);
173
+ const end = norm(f[4]);
174
+ const score = norm(f[5]);
175
+ const strand = norm(f[6]);
176
+ const phase = norm(f[7]);
177
+ const attrString = norm(f[8]);
178
+ return {
179
+ seq_id,
180
+ source,
181
+ type,
182
+ start: start === null ? null : parseInt(start, 10),
183
+ end: end === null ? null : parseInt(end, 10),
184
+ score: score === null ? null : parseFloat(score),
185
+ strand,
186
+ phase,
187
+ attributes: attrString === null ? null : parseAttributesNoUnescape(attrString),
89
188
  };
90
- return parsed;
91
189
  }
92
190
  /**
93
191
  * Parse a GFF3 directive line.
@@ -96,8 +194,7 @@ export function parseFeature(line) {
96
194
  * @returns The parsed directive
97
195
  */
98
196
  export function parseDirective(line) {
99
- var _a, _b;
100
- const match = /^\s*##\s*(\S+)\s*(.*)/.exec(line);
197
+ const match = directiveRegex.exec(line);
101
198
  if (!match) {
102
199
  return null;
103
200
  }
@@ -105,21 +202,21 @@ export function parseDirective(line) {
105
202
  let [, , contents] = match;
106
203
  const parsed = { directive: name };
107
204
  if (contents.length) {
108
- contents = contents.replace(/\r?\n$/, '');
205
+ contents = contents.replace(lineEndRegex, '');
109
206
  parsed.value = contents;
110
207
  }
111
208
  // do a little additional parsing for sequence-region and genome-build directives
112
209
  if (name === 'sequence-region') {
113
- const c = contents.split(/\s+/, 3);
210
+ const c = contents.split(whitespaceRegex, 3);
114
211
  return {
115
212
  ...parsed,
116
213
  seq_id: c[0],
117
- start: (_a = c[1]) === null || _a === void 0 ? void 0 : _a.replaceAll(/\D/g, ''),
118
- end: (_b = c[2]) === null || _b === void 0 ? void 0 : _b.replaceAll(/\D/g, ''),
214
+ start: c[1]?.replaceAll(nonDigitRegex, ''),
215
+ end: c[2]?.replaceAll(nonDigitRegex, ''),
119
216
  };
120
217
  }
121
218
  else if (name === 'genome-build') {
122
- const [source, buildName] = contents.split(/\s+/, 2);
219
+ const [source, buildName] = contents.split(whitespaceRegex, 2);
123
220
  return {
124
221
  ...parsed,
125
222
  source,
@@ -136,28 +233,18 @@ export function parseDirective(line) {
136
233
  */
137
234
  export function formatAttributes(attrs) {
138
235
  const attrOrder = [];
139
- Object.entries(attrs).forEach(([tag, val]) => {
236
+ for (const [tag, val] of Object.entries(attrs)) {
140
237
  if (!val) {
141
- return;
238
+ continue;
142
239
  }
143
- let valstring;
144
- if (val.hasOwnProperty('toString')) {
145
- valstring = escape(val.toString());
146
- // } else if (Array.isArray(val.values)) {
147
- // valstring = val.values.map(escape).join(',')
148
- }
149
- else if (Array.isArray(val)) {
150
- valstring = val.map(escape).join(',');
151
- }
152
- else {
153
- valstring = escape(val);
154
- }
155
- attrOrder.push(`${escape(tag)}=${valstring}`);
156
- });
240
+ attrOrder.push(`${escape(tag)}=${val.map(escape).join(',')}`);
241
+ }
157
242
  return attrOrder.length ? attrOrder.join(';') : '.';
158
243
  }
159
244
  function _formatSingleFeature(f, seenFeature) {
160
- const attrString = f.attributes === null || f.attributes === undefined
245
+ const attrString =
246
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
247
+ f.attributes === null || f.attributes === undefined
161
248
  ? '.'
162
249
  : formatAttributes(f.attributes);
163
250
  const fields = [
@@ -262,7 +349,10 @@ export function formatItem(itemOrItems) {
262
349
  return formatSingleItem(itemOrItems);
263
350
  }
264
351
  function _isFeatureLineWithRefs(featureLine) {
265
- return (featureLine.child_features !== undefined &&
352
+ return (
353
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
354
+ featureLine.child_features !== undefined &&
355
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
266
356
  featureLine.derived_features !== undefined);
267
357
  }
268
358
  //# 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":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,19 @@
1
1
  {
2
2
  "name": "gff-nostream",
3
- "version": "1.3.9",
3
+ "version": "2.0.1",
4
4
  "description": "utilities to read GFF3 data",
5
5
  "license": "MIT",
6
6
  "repository": "cmdcolin/gff-nostream",
7
- "main": "dist/index.js",
8
- "module": "esm/index.js",
7
+ "type": "module",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ "import": {
11
+ "import": "./esm/index.js"
12
+ },
13
+ "require": {
14
+ "require": "./dist/index.js"
15
+ }
16
+ },
9
17
  "author": {
10
18
  "name": "Colin Diesh",
11
19
  "email": "colin.diesh@gmail.com",
@@ -18,13 +26,15 @@
18
26
  ],
19
27
  "scripts": {
20
28
  "test": "vitest",
29
+ "benchonly": "vitest bench",
30
+ "bench": "./scripts/build-both-branches.sh \"$BRANCH1\" \"$BRANCH2\" && vitest bench",
21
31
  "clean": "rimraf dist esm",
22
- "lint": "eslint src test",
32
+ "lint": "eslint --report-unused-disable-directives --max-warnings 0",
23
33
  "docs": "documentation readme src/api.ts --section=API --shallow && yarn format",
24
34
  "format": "prettier --write .",
25
35
  "prebuild": "yarn clean",
26
- "build:esm": "tsc --target es2018 --outDir esm",
27
- "build:es5": "tsc --target es2015 --module commonjs --outDir dist",
36
+ "build:esm": "tsc --target esnext --outDir esm",
37
+ "build:es5": "tsc --target es2020 --module commonjs --outDir dist",
28
38
  "postbuild:es5": "echo '{\"type\": \"commonjs\"}' > dist/package.json",
29
39
  "build": "yarn build:es5 && yarn build:esm",
30
40
  "prepublishOnly": "yarn test --run && yarn build",
@@ -38,16 +48,17 @@
38
48
  "genomics"
39
49
  ],
40
50
  "devDependencies": {
41
- "@types/node": "^22.15.17",
42
- "@typescript-eslint/eslint-plugin": "^8.4.0",
43
- "@typescript-eslint/parser": "^8.4.0",
44
- "@vitest/coverage-v8": "^3.0.1",
51
+ "@types/node": "^24.10.1",
52
+ "@typescript-eslint/eslint-plugin": "^8.48.0",
53
+ "@typescript-eslint/parser": "^8.48.0",
54
+ "@vitest/coverage-v8": "^4.0.14",
45
55
  "documentation": "^14.0.1",
46
- "eslint": "^9.9.1",
47
- "prettier": "^3.3.3",
48
- "rimraf": "^6.0.1",
49
- "typescript": "^5.5.4",
50
- "typescript-eslint": "^8.4.0",
51
- "vitest": "^3.0.1"
56
+ "eslint": "^9.39.1",
57
+ "eslint-plugin-import": "^2.32.0",
58
+ "prettier": "^3.6.2",
59
+ "rimraf": "^6.1.2",
60
+ "typescript": "^5.9.3",
61
+ "typescript-eslint": "^8.48.0",
62
+ "vitest": "^4.0.14"
52
63
  }
53
64
  }
package/src/api.ts CHANGED
@@ -1,5 +1,12 @@
1
- import Parser from './parse'
2
- import { GFF3Feature } from './util'
1
+ import Parser from './parse.ts'
2
+ import { parseFieldsArray, parseFieldsArrayNoUnescape } from './util.ts'
3
+
4
+ import type { GFF3Feature, GFF3FeatureLine } from './util.ts'
5
+
6
+ export interface LineRecord {
7
+ fields: string[]
8
+ lineHash?: string | number
9
+ }
3
10
 
4
11
  /**
5
12
  * Synchronously parse a string containing GFF3 and return an array of the
@@ -15,7 +22,7 @@ export function parseStringSync(str: string): GFF3Feature[] {
15
22
  featureCallback: arg => items.push(arg),
16
23
  disableDerivesFromReferences: true,
17
24
  errorCallback: err => {
18
- throw err
25
+ throw new Error(err)
19
26
  },
20
27
  })
21
28
 
@@ -27,12 +34,106 @@ export function parseStringSync(str: string): GFF3Feature[] {
27
34
  return items
28
35
  }
29
36
 
30
- export {
31
- type GFF3FeatureLine,
32
- type GFF3Comment,
33
- type GFF3FeatureLineWithRefs,
34
- type GFF3Directive,
35
- type GFF3Sequence,
36
- type GFF3Feature,
37
- type GFF3Item,
38
- } from './util'
37
+ /**
38
+ * Synchronously parse an array of strings containing GFF3 and return an array of the
39
+ * parsed items.
40
+ *
41
+ * @param arr - GFF3 array of strings
42
+ * @param inputOptions - Parsing options
43
+ * @returns array of parsed features, directives, comments and/or sequences
44
+ */
45
+ export function parseArraySync(arr: string[]): GFF3Feature[] {
46
+ const items: GFF3Feature[] = []
47
+ const parser = new Parser({
48
+ featureCallback: arg => items.push(arg),
49
+ disableDerivesFromReferences: true,
50
+ errorCallback: err => {
51
+ throw new Error(err)
52
+ },
53
+ })
54
+
55
+ for (const line of arr) {
56
+ parser.addLine(line)
57
+ }
58
+ parser.finish()
59
+
60
+ return items
61
+ }
62
+
63
+ /**
64
+ * Synchronously parse an array of LineRecord objects containing pre-split GFF3
65
+ * fields and return an array of the parsed items.
66
+ *
67
+ * @param records - Array of LineRecord objects with fields array and optional lineHash
68
+ * @returns array of parsed features
69
+ */
70
+ export function parseRecordsSync(records: LineRecord[]): GFF3Feature[] {
71
+ const items: GFF3Feature[] = []
72
+ const parser = new Parser({
73
+ featureCallback: arg => items.push(arg),
74
+ disableDerivesFromReferences: true,
75
+ errorCallback: err => {
76
+ throw new Error(err)
77
+ },
78
+ })
79
+
80
+ for (const record of records) {
81
+ const featureLine: GFF3FeatureLine = parseFieldsArray(record.fields)
82
+ if (record.lineHash !== undefined) {
83
+ if (!featureLine.attributes) {
84
+ featureLine.attributes = {}
85
+ }
86
+ featureLine.attributes._lineHash = [String(record.lineHash)]
87
+ }
88
+ parser.addParsedFeatureLine(featureLine)
89
+ }
90
+ parser.finish()
91
+
92
+ return items
93
+ }
94
+
95
+ /**
96
+ * Synchronously parse an array of LineRecord objects containing pre-split GFF3
97
+ * fields and return an array of the parsed items. Uses a fast path that skips
98
+ * unescaping when hasEscapes is false.
99
+ *
100
+ * @param records - Array of LineRecord objects with fields array and optional lineHash
101
+ * @param hasEscapes - Whether the records contain percent-encoded characters
102
+ * @returns array of parsed features
103
+ */
104
+ export function parseRecordsSyncFast(records: LineRecord[], hasEscapes: boolean): GFF3Feature[] {
105
+ const items: GFF3Feature[] = []
106
+ const parser = new Parser({
107
+ featureCallback: arg => items.push(arg),
108
+ disableDerivesFromReferences: true,
109
+ errorCallback: err => {
110
+ throw new Error(err)
111
+ },
112
+ })
113
+
114
+ const parseFunc = hasEscapes ? parseFieldsArray : parseFieldsArrayNoUnescape
115
+
116
+ for (const record of records) {
117
+ const featureLine: GFF3FeatureLine = parseFunc(record.fields)
118
+ if (record.lineHash !== undefined) {
119
+ if (!featureLine.attributes) {
120
+ featureLine.attributes = {}
121
+ }
122
+ featureLine.attributes._lineHash = [String(record.lineHash)]
123
+ }
124
+ parser.addParsedFeatureLine(featureLine)
125
+ }
126
+ parser.finish()
127
+
128
+ return items
129
+ }
130
+
131
+ export type {
132
+ GFF3Comment,
133
+ GFF3Directive,
134
+ GFF3Feature,
135
+ GFF3FeatureLine,
136
+ GFF3FeatureLineWithRefs,
137
+ GFF3Item,
138
+ GFF3Sequence,
139
+ } from './util.ts'
package/src/index.ts CHANGED
@@ -1,12 +1,13 @@
1
- import { parseStringSync } from './api'
2
- export { parseStringSync }
1
+ import { parseArraySync, parseRecordsSync, parseRecordsSyncFast, parseStringSync } from './api.ts'
2
+ export { parseArraySync, parseRecordsSync, parseRecordsSyncFast, parseStringSync }
3
3
 
4
4
  export type {
5
5
  GFF3Comment,
6
- GFF3Feature,
7
6
  GFF3Directive,
8
- GFF3FeatureLineWithRefs,
7
+ GFF3Feature,
9
8
  GFF3FeatureLine,
9
+ GFF3FeatureLineWithRefs,
10
10
  GFF3Item,
11
11
  GFF3Sequence,
12
- } from './api'
12
+ LineRecord,
13
+ } from './api.ts'