clustal-js 2.0.6 → 2.0.8

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 CHANGED
@@ -4,15 +4,15 @@ exports.parseClustalIter = parseClustalIter;
4
4
  exports.parsePairwiseIter = parsePairwiseIter;
5
5
  exports.parse = parse;
6
6
  exports.parsePairwise = parsePairwise;
7
- const pairwise_1 = require("./pairwise");
8
- const util_1 = require("./util");
7
+ const pairwise_ts_1 = require("./pairwise.js");
8
+ const util_ts_1 = require("./util.js");
9
9
  function parseClustalIter(arr) {
10
- const line = (0, util_1.getFirstNonEmptyLine)(arr);
10
+ const line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
11
11
  if (!line) {
12
12
  throw new Error('Empty file received');
13
13
  }
14
- const header = (0, util_1.parseHeader)(line);
15
- const res = (0, util_1.parseBlocks)(arr);
14
+ const header = (0, util_ts_1.parseHeader)(line);
15
+ const res = (0, util_ts_1.parseBlocks)(arr);
16
16
  if (res === undefined) {
17
17
  throw new Error('No blocks parsed');
18
18
  }
@@ -24,7 +24,7 @@ function parseClustalIter(arr) {
24
24
  return { consensus, alns, header };
25
25
  }
26
26
  function parsePairwiseIter(arr) {
27
- const res = (0, pairwise_1.parsePairwiseBlocks)(arr.split('\n')[Symbol.iterator]());
27
+ const 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
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -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,40 +3,50 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSeqBounds = getSeqBounds;
4
4
  exports.parsePairwiseBlock = parsePairwiseBlock;
5
5
  exports.parsePairwiseBlocks = parsePairwiseBlocks;
6
- const util_1 = require("./util");
7
- function getSeqBounds(line) {
8
- const fields = line.split(/\s+/);
9
- const k1 = fields[0].length + fields[1].length;
10
- const temp = line.slice(k1);
11
- const s = k1 + temp.indexOf(fields[2]);
12
- const e = s + fields[2].length;
13
- return [s, e];
6
+ const util_ts_1 = require("./util.js");
7
+ function isSequenceLine(line) {
8
+ const 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
+ const trimmed = line.trim();
16
+ const fields = trimmed.split(/\s+/);
17
+ const seq = fields[seqIndex];
18
+ const 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
- let line = (0, util_1.getFirstNonEmptyLine)(arr);
23
+ let line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
18
24
  const block = [];
19
25
  let consensusLine = '';
20
26
  if (!line) {
21
27
  return undefined;
22
28
  }
23
29
  while (line) {
24
- if (line.startsWith(' ')) {
25
- consensusLine = line;
30
+ if (isSequenceLine(line)) {
31
+ block.push(line);
26
32
  }
27
33
  else {
28
- block.push(line);
34
+ consensusLine = line;
29
35
  }
30
36
  line = arr.next().value;
31
37
  }
32
- const [start, end] = getSeqBounds(block[0]);
33
- const fields = block.map(s => s.split(/\s+/));
38
+ if (block.length === 0) {
39
+ return undefined;
40
+ }
41
+ const fields = block.map(s => s.trim().split(/\s+/));
42
+ const seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1;
43
+ const [start, end] = getSeqBounds(block[0], seqIndex);
34
44
  const ids = fields.map(s => s[0]);
35
- const seqs = fields.map(s => s[2]);
45
+ const seqs = fields.map(s => s[seqIndex]);
36
46
  let consensus = consensusLine.slice(start, end);
37
47
  // handle if the consensus trailing whitespace got trimmed
38
48
  const remainder = seqs[0].length - consensus.length;
39
- if (remainder) {
49
+ if (remainder > 0) {
40
50
  consensus += ' '.repeat(remainder);
41
51
  }
42
52
  return { ids, seqs, consensus };
@@ -1 +1 @@
1
- {"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":";;AAEA,oCAOC;AAGD,gDA4BC;AAED,kDAYC;AAtDD,iCAA6C;AAE7C,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3B,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC9B,OAAO,CAAC,CAAC,EAAE,CAAC,CAAU,CAAA;AACxB,CAAC;AAED,sDAAsD;AACtD,SAAgB,kBAAkB,CAAC,GAAqB;IACtD,IAAI,IAAI,GAAG,IAAA,2BAAoB,EAAC,GAAG,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,IAAI,aAAa,GAAG,EAAE,CAAA;IACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,aAAa,GAAG,IAAI,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;IACzB,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAE/C,0DAA0D;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAqB;IACvD,IAAI,KAAK,CAAA;IACT,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9B,CAAC;YACD,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAA;QAClC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { parsePairwiseBlocks } from './pairwise';
2
- import { parseBlocks, parseHeader, getFirstNonEmptyLine } from './util';
1
+ import { parsePairwiseBlocks } from "./pairwise.js";
2
+ import { parseBlocks, parseHeader, getFirstNonEmptyLine } from "./util.js";
3
3
  export function parseClustalIter(arr) {
4
4
  const line = getFirstNonEmptyLine(arr);
5
5
  if (!line) {
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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,11 +1,17 @@
1
- import { getFirstNonEmptyLine } from './util';
2
- export function getSeqBounds(line) {
3
- const fields = line.split(/\s+/);
4
- const k1 = fields[0].length + fields[1].length;
5
- const temp = line.slice(k1);
6
- const s = k1 + temp.indexOf(fields[2]);
7
- const e = s + fields[2].length;
8
- return [s, e];
1
+ import { getFirstNonEmptyLine } from "./util.js";
2
+ function isSequenceLine(line) {
3
+ const trimmed = line.trim();
4
+ return /^\w+\s+/.test(trimmed);
5
+ }
6
+ function hasPositionNumbers(fields) {
7
+ return fields.length >= 3 && /^\d+$/.test(fields[1]);
8
+ }
9
+ export function getSeqBounds(line, seqIndex) {
10
+ const trimmed = line.trim();
11
+ const fields = trimmed.split(/\s+/);
12
+ const seq = fields[seqIndex];
13
+ const seqStart = line.indexOf(seq, line.indexOf(fields[0]) + fields[0].length);
14
+ return [seqStart, seqStart + seq.length];
9
15
  }
10
16
  // Use the first block to get the sequence identifiers
11
17
  export function parsePairwiseBlock(arr) {
@@ -16,22 +22,26 @@ export function parsePairwiseBlock(arr) {
16
22
  return undefined;
17
23
  }
18
24
  while (line) {
19
- if (line.startsWith(' ')) {
20
- consensusLine = line;
25
+ if (isSequenceLine(line)) {
26
+ block.push(line);
21
27
  }
22
28
  else {
23
- block.push(line);
29
+ consensusLine = line;
24
30
  }
25
31
  line = arr.next().value;
26
32
  }
27
- const [start, end] = getSeqBounds(block[0]);
28
- const fields = block.map(s => s.split(/\s+/));
33
+ if (block.length === 0) {
34
+ return undefined;
35
+ }
36
+ const fields = block.map(s => s.trim().split(/\s+/));
37
+ const seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1;
38
+ const [start, end] = getSeqBounds(block[0], seqIndex);
29
39
  const ids = fields.map(s => s[0]);
30
- const seqs = fields.map(s => s[2]);
40
+ const seqs = fields.map(s => s[seqIndex]);
31
41
  let consensus = consensusLine.slice(start, end);
32
42
  // handle if the consensus trailing whitespace got trimmed
33
43
  const remainder = seqs[0].length - consensus.length;
34
- if (remainder) {
44
+ if (remainder > 0) {
35
45
  consensus += ' '.repeat(remainder);
36
46
  }
37
47
  return { ids, seqs, consensus };
@@ -1 +1 @@
1
- {"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.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.6",
4
- "main": "dist/index.js",
5
- "module": "esm/index.js",
3
+ "version": "2.0.8",
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-unicorn": "^55.0.0",
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": "^2.0.5"
30
+ "vitest": "^4.0.16"
24
31
  },
25
32
  "scripts": {
26
33
  "clean": "rimraf dist esm",
27
- "test": "vitest run",
34
+ "test": "vitest",
28
35
  "lint": "eslint --report-unused-disable-directives --max-warnings 0",
29
- "build": "npm run build:esm && npm run build:es5",
30
- "build:esm": "tsc --target es2018 --outDir esm",
31
- "build:es5": "tsc --target es2015 --module commonjs --outDir dist",
32
- "prebuild": "npm run clean",
33
- "preversion": "npm run lint && npm test && npm run build",
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
- export function getSeqBounds(line: string) {
4
- const fields = line.split(/\s+/)
5
- const k1 = fields[0].length + fields[1].length
6
- const temp = line.slice(k1)
7
- const s = k1 + temp.indexOf(fields[2])
8
- const e = s + fields[2].length
9
- return [s, e] as const
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.startsWith(' ')) {
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
- const [start, end] = getSeqBounds(block[0])
30
- const fields = block.map(s => s.split(/\s+/))
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[2])
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 }