gff-nostream 1.3.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 ADDED
@@ -0,0 +1,268 @@
1
+ // Fast, low-level functions for parsing and formatting GFF3.
2
+ // JavaScript port of Robert Buels's Bio::GFF3::LowLevel Perl module.
3
+ /**
4
+ * Unescape a string value used in a GFF3 attribute.
5
+ *
6
+ * @param stringVal - Escaped GFF3 string value
7
+ * @returns An unescaped string value
8
+ */
9
+ export function unescape(stringVal) {
10
+ return stringVal.replaceAll(/%([0-9A-Fa-f]{2})/g, (_match, seq) => String.fromCharCode(parseInt(seq, 16)));
11
+ }
12
+ function _escape(regex, s) {
13
+ return String(s).replace(regex, ch => {
14
+ const hex = ch.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0');
15
+ return `%${hex}`;
16
+ });
17
+ }
18
+ /**
19
+ * Escape a value for use in a GFF3 attribute value.
20
+ *
21
+ * @param rawVal - Raw GFF3 attribute value
22
+ * @returns An escaped string value
23
+ */
24
+ export function escape(rawVal) {
25
+ return _escape(/[\n;\r\t=%&,\u0000-\u001f\u007f-\u00ff]/g, rawVal);
26
+ }
27
+ /**
28
+ * Escape a value for use in a GFF3 column value.
29
+ *
30
+ * @param rawVal - Raw GFF3 column value
31
+ * @returns An escaped column value
32
+ */
33
+ export function escapeColumn(rawVal) {
34
+ return _escape(/[\n\r\t%\u0000-\u001f\u007f-\u00ff]/g, rawVal);
35
+ }
36
+ /**
37
+ * Parse the 9th column (attributes) of a GFF3 feature line.
38
+ *
39
+ * @param attrString - String of GFF3 9th column
40
+ * @returns Parsed attributes
41
+ */
42
+ export function parseAttributes(attrString) {
43
+ if (!attrString.length || attrString === '.') {
44
+ return {};
45
+ }
46
+ 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;
55
+ }
56
+ nv[0] = nv[0].trim();
57
+ let arec = attrs[nv[0].trim()];
58
+ if (!arec) {
59
+ arec = [];
60
+ attrs[nv[0]] = arec;
61
+ }
62
+ arec.push(...nv[1]
63
+ .split(',')
64
+ .map(s => s.trim())
65
+ .map(unescape));
66
+ });
67
+ return attrs;
68
+ }
69
+ /**
70
+ * Parse a GFF3 feature line
71
+ *
72
+ * @param line - GFF3 feature line
73
+ * @returns The parsed feature
74
+ */
75
+ 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]),
89
+ };
90
+ return parsed;
91
+ }
92
+ /**
93
+ * Parse a GFF3 directive line.
94
+ *
95
+ * @param line - GFF3 directive line
96
+ * @returns The parsed directive
97
+ */
98
+ export function parseDirective(line) {
99
+ var _a, _b;
100
+ const match = /^\s*##\s*(\S+)\s*(.*)/.exec(line);
101
+ if (!match) {
102
+ return null;
103
+ }
104
+ const [, name] = match;
105
+ let [, , contents] = match;
106
+ const parsed = { directive: name };
107
+ if (contents.length) {
108
+ contents = contents.replace(/\r?\n$/, '');
109
+ parsed.value = contents;
110
+ }
111
+ // do a little additional parsing for sequence-region and genome-build directives
112
+ if (name === 'sequence-region') {
113
+ const c = contents.split(/\s+/, 3);
114
+ return {
115
+ ...parsed,
116
+ 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, ''),
119
+ };
120
+ }
121
+ else if (name === 'genome-build') {
122
+ const [source, buildName] = contents.split(/\s+/, 2);
123
+ return {
124
+ ...parsed,
125
+ source,
126
+ buildName,
127
+ };
128
+ }
129
+ return parsed;
130
+ }
131
+ /**
132
+ * Format an attributes object into a string suitable for the 9th column of GFF3.
133
+ *
134
+ * @param attrs - Attributes
135
+ * @returns GFF3 9th column string
136
+ */
137
+ export function formatAttributes(attrs) {
138
+ const attrOrder = [];
139
+ Object.entries(attrs).forEach(([tag, val]) => {
140
+ if (!val) {
141
+ return;
142
+ }
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
+ });
157
+ return attrOrder.length ? attrOrder.join(';') : '.';
158
+ }
159
+ function _formatSingleFeature(f, seenFeature) {
160
+ const attrString = f.attributes === null || f.attributes === undefined
161
+ ? '.'
162
+ : formatAttributes(f.attributes);
163
+ const fields = [
164
+ f.seq_id === null ? '.' : escapeColumn(f.seq_id),
165
+ f.source === null ? '.' : escapeColumn(f.source),
166
+ f.type === null ? '.' : escapeColumn(f.type),
167
+ f.start === null ? '.' : escapeColumn(f.start),
168
+ f.end === null ? '.' : escapeColumn(f.end),
169
+ f.score === null ? '.' : escapeColumn(f.score),
170
+ f.strand === null ? '.' : escapeColumn(f.strand),
171
+ f.phase === null ? '.' : escapeColumn(f.phase),
172
+ attrString,
173
+ ];
174
+ const formattedString = `${fields.join('\t')}\n`;
175
+ // if we have already output this exact feature, skip it
176
+ if (seenFeature[formattedString]) {
177
+ return '';
178
+ }
179
+ seenFeature[formattedString] = true;
180
+ return formattedString;
181
+ }
182
+ function _formatFeature(feature, seenFeature) {
183
+ if (Array.isArray(feature)) {
184
+ return feature.map(f => _formatFeature(f, seenFeature)).join('');
185
+ }
186
+ const strings = [_formatSingleFeature(feature, seenFeature)];
187
+ if (_isFeatureLineWithRefs(feature)) {
188
+ strings.push(...feature.child_features.map(f => _formatFeature(f, seenFeature)), ...feature.derived_features.map(f => _formatFeature(f, seenFeature)));
189
+ }
190
+ return strings.join('');
191
+ }
192
+ /**
193
+ * Format a feature object or array of feature objects into one or more lines of
194
+ * GFF3.
195
+ *
196
+ * @param featureOrFeatures - A feature object or array of feature objects
197
+ * @returns A string of one or more GFF3 lines
198
+ */
199
+ export function formatFeature(featureOrFeatures) {
200
+ const seen = {};
201
+ return _formatFeature(featureOrFeatures, seen);
202
+ }
203
+ /**
204
+ * Format a directive into a line of GFF3.
205
+ *
206
+ * @param directive - A directive object
207
+ * @returns A directive line string
208
+ */
209
+ export function formatDirective(directive) {
210
+ let str = `##${directive.directive}`;
211
+ if (directive.value) {
212
+ str += ` ${directive.value}`;
213
+ }
214
+ str += '\n';
215
+ return str;
216
+ }
217
+ /**
218
+ * Format a comment into a GFF3 comment.
219
+ * Yes I know this is just adding a # and a newline.
220
+ *
221
+ * @param comment - A comment object
222
+ * @returns A comment line string
223
+ */
224
+ export function formatComment(comment) {
225
+ return `# ${comment.comment}\n`;
226
+ }
227
+ /**
228
+ * Format a sequence object as FASTA
229
+ *
230
+ * @param seq - A sequence object
231
+ * @returns Formatted single FASTA sequence string
232
+ */
233
+ export function formatSequence(seq) {
234
+ return `>${seq.id}${seq.description ? ` ${seq.description}` : ''}\n${seq.sequence}\n`;
235
+ }
236
+ /**
237
+ * Format a directive, comment, sequence, or feature, or array of such items,
238
+ * into one or more lines of GFF3.
239
+ *
240
+ * @param itemOrItems - A comment, sequence, or feature, or array of such items
241
+ * @returns A formatted string or array of strings
242
+ */
243
+ export function formatItem(itemOrItems) {
244
+ function formatSingleItem(item) {
245
+ if ('attributes' in item) {
246
+ return formatFeature(item);
247
+ }
248
+ if ('directive' in item) {
249
+ return formatDirective(item);
250
+ }
251
+ if ('sequence' in item) {
252
+ return formatSequence(item);
253
+ }
254
+ if ('comment' in item) {
255
+ return formatComment(item);
256
+ }
257
+ return '# (invalid item found during format)\n';
258
+ }
259
+ if (Array.isArray(itemOrItems)) {
260
+ return itemOrItems.map(formatSingleItem);
261
+ }
262
+ return formatSingleItem(itemOrItems);
263
+ }
264
+ function _isFeatureLineWithRefs(featureLine) {
265
+ return (featureLine.child_features !== undefined &&
266
+ featureLine.derived_features !== undefined);
267
+ }
268
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "gff-nostream",
3
+ "version": "1.3.1",
4
+ "description": "utilities to read GFF3 data",
5
+ "license": "MIT",
6
+ "repository": "cmdcolin/gff-nostream",
7
+ "main": "dist/index.js",
8
+ "module": "esm/index.js",
9
+ "author": {
10
+ "name": "Colin Diesh",
11
+ "email": "colin.diesh@gmail.com",
12
+ "url": "https://github.com/cmdcolin"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "esm",
17
+ "src"
18
+ ],
19
+ "scripts": {
20
+ "test": "vitest",
21
+ "clean": "rimraf dist esm",
22
+ "lint": "eslint src test",
23
+ "docs": "documentation readme src/api.ts --section=API --shallow && npm run format",
24
+ "format": "prettier --write .",
25
+ "prebuild": "npm run clean",
26
+ "build:esm": "tsc --target es2018 --outDir esm",
27
+ "build:es5": "tsc --target es2015 --module commonjs --outDir dist",
28
+ "build": "npm run build:es5 && npm run build:esm",
29
+ "prepublishOnly": "npm run test run && npm run build",
30
+ "postversion": "git push --follow-tags"
31
+ },
32
+ "keywords": [
33
+ "bionode",
34
+ "biojs",
35
+ "gff3",
36
+ "gff",
37
+ "genomics"
38
+ ],
39
+ "devDependencies": {
40
+ "@types/node": "^20.14.7",
41
+ "@typescript-eslint/eslint-plugin": "^8.4.0",
42
+ "@typescript-eslint/parser": "^8.4.0",
43
+ "@vitest/coverage-v8": "^2.0.5",
44
+ "documentation": "^14.0.1",
45
+ "eslint": "^9.9.1",
46
+ "prettier": "^3.3.3",
47
+ "rimraf": "^6.0.1",
48
+ "typescript": "^5.5.4",
49
+ "typescript-eslint": "^8.4.0",
50
+ "vitest": "^2.0.5"
51
+ }
52
+ }
package/src/api.ts ADDED
@@ -0,0 +1,86 @@
1
+ import Parser from './parse'
2
+ import { GFF3Item } from './util'
3
+
4
+ /** Parser options */
5
+ export interface ParseOptions {
6
+ /** Whether to resolve references to derives from features */
7
+ disableDerivesFromReferences?: boolean
8
+ /** Text encoding of the input GFF3. default 'utf8' */
9
+ encoding?: BufferEncoding
10
+ /** Whether to parse features, default true */
11
+ parseFeatures?: boolean
12
+ /** Whether to parse directives, default false */
13
+ parseDirectives?: boolean
14
+ /** Whether to parse comments, default false */
15
+ parseComments?: boolean
16
+ /** Whether to parse sequences, default true */
17
+ parseSequences?: boolean
18
+ /**
19
+ * Parse all features, directives, comments, and sequences. Overrides other
20
+ * parsing options. Default false.
21
+ */
22
+ parseAll?: boolean
23
+ }
24
+
25
+ type ParseOptionsProcessed = Required<Omit<ParseOptions, 'parseAll'>>
26
+
27
+ // shared arg processing for the parse routines
28
+ function _processParseOptions(options: ParseOptions): ParseOptionsProcessed {
29
+ const out = {
30
+ encoding: 'utf8' as const,
31
+ parseFeatures: true,
32
+ parseDirectives: false,
33
+ parseSequences: true,
34
+ parseComments: false,
35
+ disableDerivesFromReferences: false,
36
+ ...options,
37
+ }
38
+
39
+ if (options.parseAll) {
40
+ out.parseFeatures = true
41
+ out.parseDirectives = true
42
+ out.parseComments = true
43
+ out.parseSequences = true
44
+ }
45
+
46
+ return out
47
+ }
48
+
49
+ export function parseStringSync(
50
+ str: string,
51
+ inputOptions: ParseOptions = {},
52
+ ): GFF3Item[] {
53
+ if (!str) {
54
+ return []
55
+ }
56
+
57
+ const options = _processParseOptions(inputOptions)
58
+ const items: GFF3Item[] = []
59
+ const push = items.push.bind(items)
60
+
61
+ const parser = new Parser({
62
+ featureCallback: options.parseFeatures ? push : undefined,
63
+ directiveCallback: options.parseDirectives ? push : undefined,
64
+ commentCallback: options.parseComments ? push : undefined,
65
+ sequenceCallback: options.parseSequences ? push : undefined,
66
+ disableDerivesFromReferences: options.disableDerivesFromReferences || false,
67
+ errorCallback: err => {
68
+ throw err
69
+ },
70
+ })
71
+
72
+ str.split(/\r?\n/).forEach(parser.addLine.bind(parser))
73
+ parser.finish()
74
+
75
+ return items
76
+ }
77
+
78
+ export {
79
+ type GFF3FeatureLine,
80
+ type GFF3Comment,
81
+ type GFF3FeatureLineWithRefs,
82
+ type GFF3Directive,
83
+ type GFF3Sequence,
84
+ type GFF3Feature,
85
+ type GFF3Item,
86
+ } from './util'
package/src/index.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { parseStringSync } from './api'
2
+ export { parseStringSync }
3
+
4
+ export type {
5
+ GFF3Comment,
6
+ GFF3Feature,
7
+ GFF3Directive,
8
+ GFF3FeatureLineWithRefs,
9
+ GFF3FeatureLine,
10
+ GFF3Item,
11
+ GFF3Sequence,
12
+ } from './api'