clustal-js 2.0.6 → 2.0.7
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/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -0
- package/dist/pairwise.d.ts +1 -1
- package/dist/pairwise.js +35 -25
- package/dist/pairwise.js.map +1 -1
- package/dist/util.js +24 -24
- package/dist/util.js.map +1 -1
- package/esm/index.js +26 -20
- package/esm/index.js.map +1 -1
- package/esm/pairwise.d.ts +1 -1
- package/esm/pairwise.js +42 -27
- package/esm/pairwise.js.map +1 -1
- package/esm/util.js +38 -30
- package/esm/util.js.map +1 -1
- package/package.json +22 -13
- package/src/index.ts +2 -2
- package/src/pairwise.ts +31 -17
package/dist/index.js
CHANGED
|
@@ -4,51 +4,51 @@ exports.parseClustalIter = parseClustalIter;
|
|
|
4
4
|
exports.parsePairwiseIter = parsePairwiseIter;
|
|
5
5
|
exports.parse = parse;
|
|
6
6
|
exports.parsePairwise = parsePairwise;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
var pairwise_ts_1 = require("./pairwise.js");
|
|
8
|
+
var util_ts_1 = require("./util.js");
|
|
9
9
|
function parseClustalIter(arr) {
|
|
10
|
-
|
|
10
|
+
var line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
11
11
|
if (!line) {
|
|
12
12
|
throw new Error('Empty file received');
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
var header = (0, util_ts_1.parseHeader)(line);
|
|
15
|
+
var res = (0, util_ts_1.parseBlocks)(arr);
|
|
16
16
|
if (res === undefined) {
|
|
17
17
|
throw new Error('No blocks parsed');
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
var alns = res.seqs.map(function (n, index) { return ({ id: res.ids[index], seq: n }); });
|
|
20
|
+
var consensus = res.consensus;
|
|
21
21
|
if (consensus.length != alns[0].seq.length) {
|
|
22
|
-
throw new Error(
|
|
22
|
+
throw new Error("Consensus length != sequence length. Con ".concat(consensus.length, " seq ").concat(alns[0].seq.length));
|
|
23
23
|
}
|
|
24
|
-
return { consensus, alns, header };
|
|
24
|
+
return { consensus: consensus, alns: alns, header: header };
|
|
25
25
|
}
|
|
26
26
|
function parsePairwiseIter(arr) {
|
|
27
|
-
|
|
27
|
+
var res = (0, pairwise_ts_1.parsePairwiseBlocks)(arr.split('\n')[Symbol.iterator]());
|
|
28
28
|
if (res === undefined) {
|
|
29
29
|
throw new Error('No blocks parsed');
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
var alns = res.seqs.map(function (n, index) { return ({ id: res.ids[index], seq: n }); });
|
|
32
|
+
var consensus = res.consensus;
|
|
33
33
|
if (consensus.length != alns[0].seq.length) {
|
|
34
|
-
throw new Error(
|
|
34
|
+
throw new Error("Consensus length != sequence length. Con ".concat(consensus.length, " seq ").concat(alns[0].seq.length));
|
|
35
35
|
}
|
|
36
36
|
if (alns.length !== 2) {
|
|
37
37
|
throw new Error('More than two sequences in pairwise alignment');
|
|
38
38
|
}
|
|
39
39
|
return {
|
|
40
|
-
consensus,
|
|
40
|
+
consensus: consensus,
|
|
41
41
|
alns: alns,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
function parse(contents) {
|
|
45
|
-
|
|
45
|
+
var iter = contents.split('\n')[Symbol.iterator]();
|
|
46
46
|
return parseClustalIter(iter);
|
|
47
47
|
}
|
|
48
48
|
function parsePairwise(contents) {
|
|
49
49
|
return parsePairwiseIter(contents
|
|
50
50
|
.split('\n')
|
|
51
|
-
.filter(f
|
|
51
|
+
.filter(function (f) { return !f.startsWith('#'); })
|
|
52
52
|
.join('\n'));
|
|
53
53
|
}
|
|
54
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAGA,4CAqBC;AAMD,8CAoBC;AAED,sBAGC;AAED,sCAOC;AAhED,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAGA,4CAqBC;AAMD,8CAoBC;AAED,sBAGC;AAED,sCAOC;AAhED,6CAAmD;AACnD,qCAA0E;AAE1E,SAAgB,gBAAgB,CAAC,GAAqB;IACpD,IAAM,IAAI,GAAG,IAAA,8BAAoB,EAAC,GAAG,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,IAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAA;IAEhC,IAAM,GAAG,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,IAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAhC,CAAgC,CAAC,CAAA;IACjE,IAAA,SAAS,GAAK,GAAG,UAAR,CAAQ;IACzB,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,mDAA4C,SAAS,CAAC,MAAM,kBAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAE,CACzF,CAAA;IACH,CAAC;IAED,OAAO,EAAE,SAAS,WAAA,EAAE,IAAI,MAAA,EAAE,MAAM,QAAA,EAAE,CAAA;AACpC,CAAC;AAMD,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,IAAM,GAAG,GAAG,IAAA,iCAAmB,EAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACnE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,IAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAhC,CAAgC,CAAC,CAAA;IACjE,IAAA,SAAS,GAAK,GAAG,UAAR,CAAQ;IACzB,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,mDAA4C,SAAS,CAAC,MAAM,kBAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAE,CACzF,CAAA;IACH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IACD,OAAO;QACL,SAAS,WAAA;QACT,IAAI,EAAE,IAAkB;KACzB,CAAA;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,QAAgB;IACpC,IAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IACpD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB;IAC5C,OAAO,iBAAiB,CACtB,QAAQ;SACL,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAlB,CAAkB,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
package/dist/pairwise.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare function getSeqBounds(line: string): readonly [number, number];
|
|
1
|
+
export declare function getSeqBounds(line: string, seqIndex: number): readonly [number, number];
|
|
2
2
|
export declare function parsePairwiseBlock(arr: Iterator<string>): {
|
|
3
3
|
ids: string[];
|
|
4
4
|
seqs: string[];
|
package/dist/pairwise.js
CHANGED
|
@@ -3,50 +3,60 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getSeqBounds = getSeqBounds;
|
|
4
4
|
exports.parsePairwiseBlock = parsePairwiseBlock;
|
|
5
5
|
exports.parsePairwiseBlocks = parsePairwiseBlocks;
|
|
6
|
-
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
var util_ts_1 = require("./util.js");
|
|
7
|
+
function isSequenceLine(line) {
|
|
8
|
+
var trimmed = line.trim();
|
|
9
|
+
return /^\w+\s+/.test(trimmed);
|
|
10
|
+
}
|
|
11
|
+
function hasPositionNumbers(fields) {
|
|
12
|
+
return fields.length >= 3 && /^\d+$/.test(fields[1]);
|
|
13
|
+
}
|
|
14
|
+
function getSeqBounds(line, seqIndex) {
|
|
15
|
+
var trimmed = line.trim();
|
|
16
|
+
var fields = trimmed.split(/\s+/);
|
|
17
|
+
var seq = fields[seqIndex];
|
|
18
|
+
var seqStart = line.indexOf(seq, line.indexOf(fields[0]) + fields[0].length);
|
|
19
|
+
return [seqStart, seqStart + seq.length];
|
|
14
20
|
}
|
|
15
21
|
// Use the first block to get the sequence identifiers
|
|
16
22
|
function parsePairwiseBlock(arr) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
var line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
24
|
+
var block = [];
|
|
25
|
+
var consensusLine = '';
|
|
20
26
|
if (!line) {
|
|
21
27
|
return undefined;
|
|
22
28
|
}
|
|
23
29
|
while (line) {
|
|
24
|
-
if (line
|
|
25
|
-
|
|
30
|
+
if (isSequenceLine(line)) {
|
|
31
|
+
block.push(line);
|
|
26
32
|
}
|
|
27
33
|
else {
|
|
28
|
-
|
|
34
|
+
consensusLine = line;
|
|
29
35
|
}
|
|
30
36
|
line = arr.next().value;
|
|
31
37
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
if (block.length === 0) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
var fields = block.map(function (s) { return s.trim().split(/\s+/); });
|
|
42
|
+
var seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1;
|
|
43
|
+
var _a = getSeqBounds(block[0], seqIndex), start = _a[0], end = _a[1];
|
|
44
|
+
var ids = fields.map(function (s) { return s[0]; });
|
|
45
|
+
var seqs = fields.map(function (s) { return s[seqIndex]; });
|
|
46
|
+
var consensus = consensusLine.slice(start, end);
|
|
37
47
|
// handle if the consensus trailing whitespace got trimmed
|
|
38
|
-
|
|
39
|
-
if (remainder) {
|
|
48
|
+
var remainder = seqs[0].length - consensus.length;
|
|
49
|
+
if (remainder > 0) {
|
|
40
50
|
consensus += ' '.repeat(remainder);
|
|
41
51
|
}
|
|
42
|
-
return { ids, seqs, consensus };
|
|
52
|
+
return { ids: ids, seqs: seqs, consensus: consensus };
|
|
43
53
|
}
|
|
44
54
|
function parsePairwiseBlocks(arr) {
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
var block;
|
|
56
|
+
var res = parsePairwiseBlock(arr);
|
|
47
57
|
if (res !== undefined) {
|
|
48
58
|
while ((block = parsePairwiseBlock(arr))) {
|
|
49
|
-
for (
|
|
59
|
+
for (var i = 0; i < block.seqs.length; i++) {
|
|
50
60
|
res.seqs[i] += block.seqs[i];
|
|
51
61
|
}
|
|
52
62
|
res.consensus += block.consensus;
|
package/dist/pairwise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
|
package/dist/util.js
CHANGED
|
@@ -7,37 +7,37 @@ exports.getSeqBounds = getSeqBounds;
|
|
|
7
7
|
exports.parseBlock = parseBlock;
|
|
8
8
|
exports.parseBlocks = parseBlocks;
|
|
9
9
|
function parseVersion(line) {
|
|
10
|
-
|
|
10
|
+
var res = /\(?(\d+(\.\d+)+)\)?/.exec(line);
|
|
11
11
|
return res && res.length > 1 ? res[1] : '';
|
|
12
12
|
}
|
|
13
13
|
function parseHeader(info) {
|
|
14
|
-
|
|
15
|
-
if (!knownHeaders.some(l
|
|
16
|
-
console.warn(
|
|
14
|
+
var knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign'];
|
|
15
|
+
if (!knownHeaders.some(function (l) { return info.startsWith(l); })) {
|
|
16
|
+
console.warn("".concat(info, " is not a known CLUSTAL header: ").concat(knownHeaders.join(','), ", proceeding but could indicate an issue"));
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
return { info, version };
|
|
18
|
+
var version = parseVersion(info);
|
|
19
|
+
return { info: info, version: version };
|
|
20
20
|
}
|
|
21
21
|
function getFirstNonEmptyLine(arr) {
|
|
22
22
|
// There should be two blank lines after the header line
|
|
23
|
-
|
|
23
|
+
var line = arr.next();
|
|
24
24
|
while (!line.done && line.value.trim() === '') {
|
|
25
25
|
line = arr.next();
|
|
26
26
|
}
|
|
27
27
|
return line.value;
|
|
28
28
|
}
|
|
29
29
|
function getSeqBounds(line) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
var fields = line.split(/\s+/);
|
|
31
|
+
var temp = line.slice(fields[0].length);
|
|
32
|
+
var s = fields[0].length + temp.indexOf(fields[1]);
|
|
33
|
+
var e = s + fields[1].length;
|
|
34
34
|
return [s, e];
|
|
35
35
|
}
|
|
36
36
|
// Use the first block to get the sequence identifiers
|
|
37
37
|
function parseBlock(arr) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
var line = getFirstNonEmptyLine(arr);
|
|
39
|
+
var block = [];
|
|
40
|
+
var consensusLine = '';
|
|
41
41
|
if (!line) {
|
|
42
42
|
return undefined;
|
|
43
43
|
}
|
|
@@ -50,24 +50,24 @@ function parseBlock(arr) {
|
|
|
50
50
|
}
|
|
51
51
|
line = arr.next().value;
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
var _a = getSeqBounds(block[0]), start = _a[0], end = _a[1];
|
|
54
|
+
var fields = block.map(function (s) { return s.split(/\s+/); });
|
|
55
|
+
var ids = fields.map(function (s) { return s[0]; });
|
|
56
|
+
var seqs = block.map(function (s) { return s.slice(start, end); });
|
|
57
|
+
var consensus = consensusLine.slice(start, end);
|
|
58
58
|
// handle if the consensus trailing whitespace got trimmed
|
|
59
|
-
|
|
59
|
+
var remainder = seqs[0].length - consensus.length;
|
|
60
60
|
if (remainder) {
|
|
61
61
|
consensus += ' '.repeat(remainder);
|
|
62
62
|
}
|
|
63
|
-
return { ids, seqs, consensus };
|
|
63
|
+
return { ids: ids, seqs: seqs, consensus: consensus };
|
|
64
64
|
}
|
|
65
65
|
function parseBlocks(arr) {
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
var block;
|
|
67
|
+
var res = parseBlock(arr);
|
|
68
68
|
if (res !== undefined) {
|
|
69
69
|
while ((block = parseBlock(arr))) {
|
|
70
|
-
for (
|
|
70
|
+
for (var i = 0; i < block.seqs.length; i++) {
|
|
71
71
|
res.seqs[i] += block.seqs[i];
|
|
72
72
|
}
|
|
73
73
|
res.consensus += block.consensus;
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAAA,oCAGC;AACD,kCAYC;AAED,oDAOC;AAED,oCAMC;AAGD,gCA4BC;AAED,kCAYC;AA9ED,SAAgB,YAAY,CAAC,IAAY;IACvC,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/esm/index.js
CHANGED
|
@@ -1,48 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseClustalIter = parseClustalIter;
|
|
4
|
+
exports.parsePairwiseIter = parsePairwiseIter;
|
|
5
|
+
exports.parse = parse;
|
|
6
|
+
exports.parsePairwise = parsePairwise;
|
|
7
|
+
var pairwise_ts_1 = require("./pairwise.js");
|
|
8
|
+
var util_ts_1 = require("./util.js");
|
|
9
|
+
function parseClustalIter(arr) {
|
|
10
|
+
var line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
5
11
|
if (!line) {
|
|
6
12
|
throw new Error('Empty file received');
|
|
7
13
|
}
|
|
8
|
-
|
|
9
|
-
|
|
14
|
+
var header = (0, util_ts_1.parseHeader)(line);
|
|
15
|
+
var res = (0, util_ts_1.parseBlocks)(arr);
|
|
10
16
|
if (res === undefined) {
|
|
11
17
|
throw new Error('No blocks parsed');
|
|
12
18
|
}
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
var alns = res.seqs.map(function (n, index) { return ({ id: res.ids[index], seq: n }); });
|
|
20
|
+
var consensus = res.consensus;
|
|
15
21
|
if (consensus.length != alns[0].seq.length) {
|
|
16
|
-
throw new Error(
|
|
22
|
+
throw new Error("Consensus length != sequence length. Con ".concat(consensus.length, " seq ").concat(alns[0].seq.length));
|
|
17
23
|
}
|
|
18
|
-
return { consensus, alns, header };
|
|
24
|
+
return { consensus: consensus, alns: alns, header: header };
|
|
19
25
|
}
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
function parsePairwiseIter(arr) {
|
|
27
|
+
var res = (0, pairwise_ts_1.parsePairwiseBlocks)(arr.split('\n')[Symbol.iterator]());
|
|
22
28
|
if (res === undefined) {
|
|
23
29
|
throw new Error('No blocks parsed');
|
|
24
30
|
}
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
var alns = res.seqs.map(function (n, index) { return ({ id: res.ids[index], seq: n }); });
|
|
32
|
+
var consensus = res.consensus;
|
|
27
33
|
if (consensus.length != alns[0].seq.length) {
|
|
28
|
-
throw new Error(
|
|
34
|
+
throw new Error("Consensus length != sequence length. Con ".concat(consensus.length, " seq ").concat(alns[0].seq.length));
|
|
29
35
|
}
|
|
30
36
|
if (alns.length !== 2) {
|
|
31
37
|
throw new Error('More than two sequences in pairwise alignment');
|
|
32
38
|
}
|
|
33
39
|
return {
|
|
34
|
-
consensus,
|
|
40
|
+
consensus: consensus,
|
|
35
41
|
alns: alns,
|
|
36
42
|
};
|
|
37
43
|
}
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
function parse(contents) {
|
|
45
|
+
var iter = contents.split('\n')[Symbol.iterator]();
|
|
40
46
|
return parseClustalIter(iter);
|
|
41
47
|
}
|
|
42
|
-
|
|
48
|
+
function parsePairwise(contents) {
|
|
43
49
|
return parsePairwiseIter(contents
|
|
44
50
|
.split('\n')
|
|
45
|
-
.filter(f
|
|
51
|
+
.filter(function (f) { return !f.startsWith('#'); })
|
|
46
52
|
.join('\n'));
|
|
47
53
|
}
|
|
48
54
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/esm/pairwise.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare function getSeqBounds(line: string): readonly [number, number];
|
|
1
|
+
export declare function getSeqBounds(line: string, seqIndex: number): readonly [number, number];
|
|
2
2
|
export declare function parsePairwiseBlock(arr: Iterator<string>): {
|
|
3
3
|
ids: string[];
|
|
4
4
|
seqs: string[];
|
package/esm/pairwise.js
CHANGED
|
@@ -1,47 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSeqBounds = getSeqBounds;
|
|
4
|
+
exports.parsePairwiseBlock = parsePairwiseBlock;
|
|
5
|
+
exports.parsePairwiseBlocks = parsePairwiseBlocks;
|
|
6
|
+
var util_ts_1 = require("./util.js");
|
|
7
|
+
function isSequenceLine(line) {
|
|
8
|
+
var trimmed = line.trim();
|
|
9
|
+
return /^\w+\s+/.test(trimmed);
|
|
10
|
+
}
|
|
11
|
+
function hasPositionNumbers(fields) {
|
|
12
|
+
return fields.length >= 3 && /^\d+$/.test(fields[1]);
|
|
13
|
+
}
|
|
14
|
+
function getSeqBounds(line, seqIndex) {
|
|
15
|
+
var trimmed = line.trim();
|
|
16
|
+
var fields = trimmed.split(/\s+/);
|
|
17
|
+
var seq = fields[seqIndex];
|
|
18
|
+
var seqStart = line.indexOf(seq, line.indexOf(fields[0]) + fields[0].length);
|
|
19
|
+
return [seqStart, seqStart + seq.length];
|
|
9
20
|
}
|
|
10
21
|
// Use the first block to get the sequence identifiers
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
function parsePairwiseBlock(arr) {
|
|
23
|
+
var line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
24
|
+
var block = [];
|
|
25
|
+
var consensusLine = '';
|
|
15
26
|
if (!line) {
|
|
16
27
|
return undefined;
|
|
17
28
|
}
|
|
18
29
|
while (line) {
|
|
19
|
-
if (line
|
|
20
|
-
|
|
30
|
+
if (isSequenceLine(line)) {
|
|
31
|
+
block.push(line);
|
|
21
32
|
}
|
|
22
33
|
else {
|
|
23
|
-
|
|
34
|
+
consensusLine = line;
|
|
24
35
|
}
|
|
25
36
|
line = arr.next().value;
|
|
26
37
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
38
|
+
if (block.length === 0) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
var fields = block.map(function (s) { return s.trim().split(/\s+/); });
|
|
42
|
+
var seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1;
|
|
43
|
+
var _a = getSeqBounds(block[0], seqIndex), start = _a[0], end = _a[1];
|
|
44
|
+
var ids = fields.map(function (s) { return s[0]; });
|
|
45
|
+
var seqs = fields.map(function (s) { return s[seqIndex]; });
|
|
46
|
+
var consensus = consensusLine.slice(start, end);
|
|
32
47
|
// handle if the consensus trailing whitespace got trimmed
|
|
33
|
-
|
|
34
|
-
if (remainder) {
|
|
48
|
+
var remainder = seqs[0].length - consensus.length;
|
|
49
|
+
if (remainder > 0) {
|
|
35
50
|
consensus += ' '.repeat(remainder);
|
|
36
51
|
}
|
|
37
|
-
return { ids, seqs, consensus };
|
|
52
|
+
return { ids: ids, seqs: seqs, consensus: consensus };
|
|
38
53
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
54
|
+
function parsePairwiseBlocks(arr) {
|
|
55
|
+
var block;
|
|
56
|
+
var res = parsePairwiseBlock(arr);
|
|
42
57
|
if (res !== undefined) {
|
|
43
58
|
while ((block = parsePairwiseBlock(arr))) {
|
|
44
|
-
for (
|
|
59
|
+
for (var i = 0; i < block.seqs.length; i++) {
|
|
45
60
|
res.seqs[i] += block.seqs[i];
|
|
46
61
|
}
|
|
47
62
|
res.consensus += block.consensus;
|
package/esm/pairwise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
|
package/esm/util.js
CHANGED
|
@@ -1,35 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseVersion = parseVersion;
|
|
4
|
+
exports.parseHeader = parseHeader;
|
|
5
|
+
exports.getFirstNonEmptyLine = getFirstNonEmptyLine;
|
|
6
|
+
exports.getSeqBounds = getSeqBounds;
|
|
7
|
+
exports.parseBlock = parseBlock;
|
|
8
|
+
exports.parseBlocks = parseBlocks;
|
|
9
|
+
function parseVersion(line) {
|
|
10
|
+
var res = /\(?(\d+(\.\d+)+)\)?/.exec(line);
|
|
3
11
|
return res && res.length > 1 ? res[1] : '';
|
|
4
12
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
if (!knownHeaders.some(l
|
|
8
|
-
console.warn(
|
|
13
|
+
function parseHeader(info) {
|
|
14
|
+
var knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign'];
|
|
15
|
+
if (!knownHeaders.some(function (l) { return info.startsWith(l); })) {
|
|
16
|
+
console.warn("".concat(info, " is not a known CLUSTAL header: ").concat(knownHeaders.join(','), ", proceeding but could indicate an issue"));
|
|
9
17
|
}
|
|
10
|
-
|
|
11
|
-
return { info, version };
|
|
18
|
+
var version = parseVersion(info);
|
|
19
|
+
return { info: info, version: version };
|
|
12
20
|
}
|
|
13
|
-
|
|
21
|
+
function getFirstNonEmptyLine(arr) {
|
|
14
22
|
// There should be two blank lines after the header line
|
|
15
|
-
|
|
23
|
+
var line = arr.next();
|
|
16
24
|
while (!line.done && line.value.trim() === '') {
|
|
17
25
|
line = arr.next();
|
|
18
26
|
}
|
|
19
27
|
return line.value;
|
|
20
28
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
function getSeqBounds(line) {
|
|
30
|
+
var fields = line.split(/\s+/);
|
|
31
|
+
var temp = line.slice(fields[0].length);
|
|
32
|
+
var s = fields[0].length + temp.indexOf(fields[1]);
|
|
33
|
+
var e = s + fields[1].length;
|
|
26
34
|
return [s, e];
|
|
27
35
|
}
|
|
28
36
|
// Use the first block to get the sequence identifiers
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
function parseBlock(arr) {
|
|
38
|
+
var line = getFirstNonEmptyLine(arr);
|
|
39
|
+
var block = [];
|
|
40
|
+
var consensusLine = '';
|
|
33
41
|
if (!line) {
|
|
34
42
|
return undefined;
|
|
35
43
|
}
|
|
@@ -42,24 +50,24 @@ export function parseBlock(arr) {
|
|
|
42
50
|
}
|
|
43
51
|
line = arr.next().value;
|
|
44
52
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
var _a = getSeqBounds(block[0]), start = _a[0], end = _a[1];
|
|
54
|
+
var fields = block.map(function (s) { return s.split(/\s+/); });
|
|
55
|
+
var ids = fields.map(function (s) { return s[0]; });
|
|
56
|
+
var seqs = block.map(function (s) { return s.slice(start, end); });
|
|
57
|
+
var consensus = consensusLine.slice(start, end);
|
|
50
58
|
// handle if the consensus trailing whitespace got trimmed
|
|
51
|
-
|
|
59
|
+
var remainder = seqs[0].length - consensus.length;
|
|
52
60
|
if (remainder) {
|
|
53
61
|
consensus += ' '.repeat(remainder);
|
|
54
62
|
}
|
|
55
|
-
return { ids, seqs, consensus };
|
|
63
|
+
return { ids: ids, seqs: seqs, consensus: consensus };
|
|
56
64
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
function parseBlocks(arr) {
|
|
66
|
+
var block;
|
|
67
|
+
var res = parseBlock(arr);
|
|
60
68
|
if (res !== undefined) {
|
|
61
69
|
while ((block = parseBlock(arr))) {
|
|
62
|
-
for (
|
|
70
|
+
for (var i = 0; i < block.seqs.length; i++) {
|
|
63
71
|
res.seqs[i] += block.seqs[i];
|
|
64
72
|
}
|
|
65
73
|
res.consensus += block.consensus;
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clustal-js",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "2.0.7",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
|
+
"exports": {
|
|
7
|
+
"import": {
|
|
8
|
+
"import": "./esm/index.js"
|
|
9
|
+
},
|
|
10
|
+
"require": {
|
|
11
|
+
"require": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
6
14
|
"repository": "cmdcolin/clustal-js",
|
|
7
15
|
"files": [
|
|
8
16
|
"dist",
|
|
@@ -12,25 +20,26 @@
|
|
|
12
20
|
"license": "MIT",
|
|
13
21
|
"devDependencies": {
|
|
14
22
|
"@types/node": "^22.0.0",
|
|
15
|
-
"@typescript-eslint/eslint-plugin": "^8.1.0",
|
|
16
|
-
"@typescript-eslint/parser": "^8.1.0",
|
|
17
23
|
"eslint": "^9.9.0",
|
|
18
|
-
"eslint-plugin-
|
|
24
|
+
"eslint-plugin-import": "^2.32.0",
|
|
25
|
+
"eslint-plugin-unicorn": "^62.0.0",
|
|
19
26
|
"prettier": "^3.2.5",
|
|
20
27
|
"rimraf": "^6.0.1",
|
|
21
28
|
"typescript": "^5.3.3",
|
|
22
29
|
"typescript-eslint": "^8.1.0",
|
|
23
|
-
"vitest": "^
|
|
30
|
+
"vitest": "^4.0.16"
|
|
24
31
|
},
|
|
25
32
|
"scripts": {
|
|
26
33
|
"clean": "rimraf dist esm",
|
|
27
|
-
"test": "vitest
|
|
34
|
+
"test": "vitest",
|
|
28
35
|
"lint": "eslint --report-unused-disable-directives --max-warnings 0",
|
|
29
|
-
"
|
|
30
|
-
"build:esm": "tsc --
|
|
31
|
-
"build:es5": "tsc --
|
|
32
|
-
"
|
|
33
|
-
"
|
|
36
|
+
"format": "prettier --write .",
|
|
37
|
+
"build:esm": "tsc --outDir esm",
|
|
38
|
+
"build:es5": "tsc --module commonjs --outDir dist",
|
|
39
|
+
"build": "yarn build:esm && yarn build:es5",
|
|
40
|
+
"prebuild": "yarn clean",
|
|
41
|
+
"postbuild:es5": "echo '{\"type\": \"commonjs\"}' > dist/package.json",
|
|
42
|
+
"preversion": "yarn lint && yarn test --run && yarn build",
|
|
34
43
|
"postversion": "git push --follow-tags"
|
|
35
44
|
}
|
|
36
45
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { parsePairwiseBlocks } from './pairwise'
|
|
2
|
-
import { parseBlocks, parseHeader, getFirstNonEmptyLine } from './util'
|
|
1
|
+
import { parsePairwiseBlocks } from './pairwise.ts'
|
|
2
|
+
import { parseBlocks, parseHeader, getFirstNonEmptyLine } from './util.ts'
|
|
3
3
|
|
|
4
4
|
export function parseClustalIter(arr: Iterator<string>) {
|
|
5
5
|
const line = getFirstNonEmptyLine(arr)
|
package/src/pairwise.ts
CHANGED
|
@@ -1,40 +1,54 @@
|
|
|
1
|
-
import { getFirstNonEmptyLine } from './util'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return
|
|
1
|
+
import { getFirstNonEmptyLine } from './util.ts'
|
|
2
|
+
|
|
3
|
+
function isSequenceLine(line: string) {
|
|
4
|
+
const trimmed = line.trim()
|
|
5
|
+
return /^\w+\s+/.test(trimmed)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function hasPositionNumbers(fields: string[]) {
|
|
9
|
+
return fields.length >= 3 && /^\d+$/.test(fields[1])
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function getSeqBounds(line: string, seqIndex: number) {
|
|
13
|
+
const trimmed = line.trim()
|
|
14
|
+
const fields = trimmed.split(/\s+/)
|
|
15
|
+
const seq = fields[seqIndex]
|
|
16
|
+
const seqStart = line.indexOf(seq, line.indexOf(fields[0]) + fields[0].length)
|
|
17
|
+
return [seqStart, seqStart + seq.length] as const
|
|
10
18
|
}
|
|
11
19
|
|
|
12
20
|
// Use the first block to get the sequence identifiers
|
|
13
21
|
export function parsePairwiseBlock(arr: Iterator<string>) {
|
|
14
22
|
let line = getFirstNonEmptyLine(arr)
|
|
15
|
-
const block = []
|
|
23
|
+
const block: string[] = []
|
|
16
24
|
let consensusLine = ''
|
|
17
25
|
if (!line) {
|
|
18
26
|
return undefined
|
|
19
27
|
}
|
|
20
28
|
|
|
21
29
|
while (line) {
|
|
22
|
-
if (line
|
|
23
|
-
consensusLine = line
|
|
24
|
-
} else {
|
|
30
|
+
if (isSequenceLine(line)) {
|
|
25
31
|
block.push(line)
|
|
32
|
+
} else {
|
|
33
|
+
consensusLine = line
|
|
26
34
|
}
|
|
27
35
|
line = arr.next().value
|
|
28
36
|
}
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
|
|
38
|
+
if (block.length === 0) {
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const fields = block.map(s => s.trim().split(/\s+/))
|
|
43
|
+
const seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1
|
|
44
|
+
const [start, end] = getSeqBounds(block[0], seqIndex)
|
|
31
45
|
const ids = fields.map(s => s[0])
|
|
32
|
-
const seqs = fields.map(s => s[
|
|
46
|
+
const seqs = fields.map(s => s[seqIndex])
|
|
33
47
|
let consensus = consensusLine.slice(start, end)
|
|
34
48
|
|
|
35
49
|
// handle if the consensus trailing whitespace got trimmed
|
|
36
50
|
const remainder = seqs[0].length - consensus.length
|
|
37
|
-
if (remainder) {
|
|
51
|
+
if (remainder > 0) {
|
|
38
52
|
consensus += ' '.repeat(remainder)
|
|
39
53
|
}
|
|
40
54
|
return { ids, seqs, consensus }
|