massbank 0.0.2 → 0.2.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 +108 -5
- package/lib/index.d.ts +4 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -5
- package/lib/index.js.map +1 -1
- package/lib/parser/exceptions.d.ts +9 -0
- package/lib/parser/exceptions.d.ts.map +1 -0
- package/lib/parser/exceptions.js +17 -0
- package/lib/parser/exceptions.js.map +1 -0
- package/lib/parser/field-parsers.d.ts +53 -0
- package/lib/parser/field-parsers.d.ts.map +1 -0
- package/lib/parser/field-parsers.js +218 -0
- package/lib/parser/field-parsers.js.map +1 -0
- package/lib/parser/index.d.ts +5 -0
- package/lib/parser/index.d.ts.map +1 -0
- package/lib/parser/index.js +4 -0
- package/lib/parser/index.js.map +1 -0
- package/lib/parser/interfaces.d.ts +46 -0
- package/lib/parser/interfaces.d.ts.map +1 -0
- package/lib/parser/interfaces.js +2 -0
- package/lib/parser/interfaces.js.map +1 -0
- package/lib/parser/position-utils.d.ts +39 -0
- package/lib/parser/position-utils.d.ts.map +1 -0
- package/lib/parser/position-utils.js +102 -0
- package/lib/parser/position-utils.js.map +1 -0
- package/lib/parser/record-parser.d.ts +29 -0
- package/lib/parser/record-parser.d.ts.map +1 -0
- package/lib/parser/record-parser.js +104 -0
- package/lib/parser/record-parser.js.map +1 -0
- package/lib/parser/table-parsers.d.ts +27 -0
- package/lib/parser/table-parsers.d.ts.map +1 -0
- package/lib/parser/table-parsers.js +178 -0
- package/lib/parser/table-parsers.js.map +1 -0
- package/lib/record.d.ts +55 -0
- package/lib/record.d.ts.map +1 -0
- package/lib/record.js +5 -0
- package/lib/record.js.map +1 -0
- package/lib/serializer/index.d.ts +3 -0
- package/lib/serializer/index.d.ts.map +1 -0
- package/lib/serializer/index.js +2 -0
- package/lib/serializer/index.js.map +1 -0
- package/lib/serializer/interfaces.d.ts +14 -0
- package/lib/serializer/interfaces.d.ts.map +1 -0
- package/lib/serializer/interfaces.js +2 -0
- package/lib/serializer/interfaces.js.map +1 -0
- package/lib/serializer/record-serializer.d.ts +24 -0
- package/lib/serializer/record-serializer.d.ts.map +1 -0
- package/lib/serializer/record-serializer.js +176 -0
- package/lib/serializer/record-serializer.js.map +1 -0
- package/lib/splash/index.d.ts +3 -0
- package/lib/splash/index.d.ts.map +1 -0
- package/lib/splash/index.js +2 -0
- package/lib/splash/index.js.map +1 -0
- package/lib/splash/interfaces.d.ts +22 -0
- package/lib/splash/interfaces.d.ts.map +1 -0
- package/lib/splash/interfaces.js +2 -0
- package/lib/splash/interfaces.js.map +1 -0
- package/lib/splash/splash-validator.d.ts +31 -0
- package/lib/splash/splash-validator.d.ts.map +1 -0
- package/lib/splash/splash-validator.js +79 -0
- package/lib/splash/splash-validator.js.map +1 -0
- package/lib/types.d.ts +92 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/validation/index.d.ts +4 -0
- package/lib/validation/index.d.ts.map +1 -0
- package/lib/validation/index.js +3 -0
- package/lib/validation/index.js.map +1 -0
- package/lib/validation/interfaces.d.ts +24 -0
- package/lib/validation/interfaces.d.ts.map +1 -0
- package/lib/validation/interfaces.js +2 -0
- package/lib/validation/interfaces.js.map +1 -0
- package/lib/validation/rules/accession-match-rule.d.ts +13 -0
- package/lib/validation/rules/accession-match-rule.d.ts.map +1 -0
- package/lib/validation/rules/accession-match-rule.js +40 -0
- package/lib/validation/rules/accession-match-rule.js.map +1 -0
- package/lib/validation/rules/index.d.ts +5 -0
- package/lib/validation/rules/index.d.ts.map +1 -0
- package/lib/validation/rules/index.js +5 -0
- package/lib/validation/rules/index.js.map +1 -0
- package/lib/validation/rules/non-standard-chars-rule.d.ts +13 -0
- package/lib/validation/rules/non-standard-chars-rule.d.ts.map +1 -0
- package/lib/validation/rules/non-standard-chars-rule.js +61 -0
- package/lib/validation/rules/non-standard-chars-rule.js.map +1 -0
- package/lib/validation/rules/serialization-rule.d.ts +14 -0
- package/lib/validation/rules/serialization-rule.d.ts.map +1 -0
- package/lib/validation/rules/serialization-rule.js +78 -0
- package/lib/validation/rules/serialization-rule.js.map +1 -0
- package/lib/validation/rules/unrecognized-field-rule.d.ts +25 -0
- package/lib/validation/rules/unrecognized-field-rule.d.ts.map +1 -0
- package/lib/validation/rules/unrecognized-field-rule.js +149 -0
- package/lib/validation/rules/unrecognized-field-rule.js.map +1 -0
- package/lib/validation/validator.d.ts +18 -0
- package/lib/validation/validator.d.ts.map +1 -0
- package/lib/validation/validator.js +30 -0
- package/lib/validation/validator.js.map +1 -0
- package/lib/validator/file-utils.d.ts +13 -0
- package/lib/validator/file-utils.d.ts.map +1 -0
- package/lib/validator/file-utils.js +24 -0
- package/lib/validator/file-utils.js.map +1 -0
- package/lib/validator/index.d.ts +2 -0
- package/lib/validator/index.d.ts.map +1 -0
- package/lib/validator/index.js +2 -0
- package/lib/validator/index.js.map +1 -0
- package/lib/validator/validator.d.ts +19 -0
- package/lib/validator/validator.d.ts.map +1 -0
- package/lib/validator/validator.js +159 -0
- package/lib/validator/validator.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +13 -5
- package/src/parser/exceptions.ts +24 -0
- package/src/parser/field-parsers.ts +237 -0
- package/src/parser/index.ts +8 -0
- package/src/parser/interfaces.ts +56 -0
- package/src/parser/position-utils.ts +130 -0
- package/src/parser/record-parser.ts +155 -0
- package/src/parser/table-parsers.ts +217 -0
- package/src/record.ts +71 -0
- package/src/serializer/index.ts +6 -0
- package/src/serializer/interfaces.ts +14 -0
- package/src/serializer/record-serializer.ts +192 -0
- package/src/splash/index.ts +2 -0
- package/src/splash/interfaces.ts +20 -0
- package/src/splash/splash-validator.ts +95 -0
- package/src/types.ts +96 -0
- package/src/validation/index.ts +3 -0
- package/src/validation/interfaces.ts +36 -0
- package/src/validation/rules/accession-match-rule.ts +55 -0
- package/src/validation/rules/index.ts +4 -0
- package/src/validation/rules/non-standard-chars-rule.ts +86 -0
- package/src/validation/rules/serialization-rule.ts +101 -0
- package/src/validation/rules/unrecognized-field-rule.ts +172 -0
- package/src/validation/validator.ts +39 -0
- package/src/validator/file-utils.ts +25 -0
- package/src/validator/index.ts +1 -0
- package/src/validator/validator.ts +189 -0
- package/lib/isValid.d.ts +0 -12
- package/lib/isValid.d.ts.map +0 -1
- package/lib/isValid.js +0 -15
- package/lib/isValid.js.map +0 -1
- package/src/isValid.ts +0 -22
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://codecov.io/gh/cheminfo/massbank)
|
|
6
6
|
[](https://github.com/cheminfo/massbank/blob/main/LICENSE)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
A TypeScript/JavaScript library for validating MassBank record files. This library provides validation for MassBank format 2.6.0, ensuring compliance with MassBank standards for automated submission to the MassBank-data repository.
|
|
9
9
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
@@ -15,13 +15,116 @@ npm install massbank
|
|
|
15
15
|
|
|
16
16
|
## Usage
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
import { myModule } from 'massbank';
|
|
18
|
+
### Basic File Validation
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
```typescript
|
|
21
|
+
import { validate } from 'massbank';
|
|
22
|
+
|
|
23
|
+
// Validate a single file
|
|
24
|
+
const result = await validate('path/to/MSBNK-test-TST00001.txt');
|
|
25
|
+
|
|
26
|
+
if (result.success) {
|
|
27
|
+
console.log('Validation passed!');
|
|
28
|
+
console.log('Accession:', result.accessions[0]);
|
|
29
|
+
} else {
|
|
30
|
+
console.error('❌ Validation failed:');
|
|
31
|
+
result.errors.forEach((error) => {
|
|
32
|
+
console.error(` Line ${error.line}: ${error.message}`);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### In-Memory Validation
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { validateContent } from 'massbank';
|
|
41
|
+
|
|
42
|
+
// Validate record text without file I/O
|
|
43
|
+
const recordText = `ACCESSION: MSBNK-test-TST00001
|
|
44
|
+
RECORD_TITLE: Test Record
|
|
45
|
+
//`;
|
|
46
|
+
|
|
47
|
+
const result = await validateContent(recordText, 'MSBNK-test-TST00001.txt');
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### With Options
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { validate } from 'massbank';
|
|
54
|
+
import { FifoLogger } from 'fifo-logger';
|
|
55
|
+
|
|
56
|
+
const logger = new FifoLogger({ level: 'info' });
|
|
57
|
+
|
|
58
|
+
const result = await validate('record.txt', {
|
|
59
|
+
legacy: true, // Enable legacy mode for less strict validation
|
|
60
|
+
logger: logger, // Optional logger for validation messages
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Validation Rules
|
|
65
|
+
|
|
66
|
+
The validator performs the following checks:
|
|
67
|
+
|
|
68
|
+
1. **Parse Validation** - Ensures the record can be parsed correctly according to MassBank format 2.6.0
|
|
69
|
+
2. **ACCESSION Matching** - Validates that ACCESSION field matches the filename (CRITICAL for MassBank-data repository)
|
|
70
|
+
- Example: File `MSBNK-test-TST00001.txt` must contain `ACCESSION: MSBNK-test-TST00001`
|
|
71
|
+
3. **Unrecognized Fields** - Warns about unrecognized field names (helps catch typos like `RECRD_TITLE` instead of `RECORD_TITLE`)
|
|
72
|
+
4. **Non-Standard Characters** - Warns about non-standard ASCII characters (non-blocking)
|
|
73
|
+
5. **Serialization Round-Trip** - Ensures parse → serialize → compare matches exactly (guarantees no data loss)
|
|
74
|
+
|
|
75
|
+
## API Reference
|
|
76
|
+
|
|
77
|
+
### `validate(filePath, options?)`
|
|
78
|
+
|
|
79
|
+
Validate a single MassBank record file.
|
|
80
|
+
|
|
81
|
+
**Parameters:**
|
|
82
|
+
|
|
83
|
+
- `filePath: string` - Path to the .txt file to validate
|
|
84
|
+
- `options?: ValidationOptions` - Optional validation options
|
|
85
|
+
|
|
86
|
+
**Returns:** `Promise<ValidationResult>`
|
|
87
|
+
|
|
88
|
+
**ValidationResult:**
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
interface ValidationResult {
|
|
92
|
+
success: boolean; // true if no errors
|
|
93
|
+
errors: ValidationError[]; // Array of validation errors
|
|
94
|
+
warnings: ValidationWarning[]; // Array of warnings (non-blocking)
|
|
95
|
+
accessions: string[]; // Extracted ACCESSION values
|
|
96
|
+
filesProcessed: number; // Number of files processed (always 1)
|
|
97
|
+
}
|
|
23
98
|
```
|
|
24
99
|
|
|
100
|
+
### `validateContent(text, filename, options?)`
|
|
101
|
+
|
|
102
|
+
Validate in-memory MassBank record content (no file I/O).
|
|
103
|
+
|
|
104
|
+
**Parameters:**
|
|
105
|
+
|
|
106
|
+
- `text: string` - The MassBank record text
|
|
107
|
+
- `filename: string` - Logical filename for error reporting (e.g., 'user-upload.txt')
|
|
108
|
+
- `options?: ValidationOptions` - Optional validation options
|
|
109
|
+
|
|
110
|
+
**Returns:** `Promise<ValidationResult>`
|
|
111
|
+
|
|
112
|
+
## MassBank Format 2.6.0 Compliance
|
|
113
|
+
|
|
114
|
+
This library enforces MassBank format 2.6.0 standards, including:
|
|
115
|
+
|
|
116
|
+
- **ACCESSION format:** `MSBNK-[ContributorID]-[RecordID]`
|
|
117
|
+
- Contributor ID: up to 32 characters (letters, digits, underscore)
|
|
118
|
+
- Record ID: up to 64 characters (capital letters, digits, underscore)
|
|
119
|
+
- **Filename matching:** File must be named `{ACCESSION}.txt`
|
|
120
|
+
- **Required fields:** ACCESSION, RECORD_TITLE, DATE, AUTHORS, LICENSE, and more
|
|
121
|
+
- **SPLASH validation:** Optional spectral hash validation via API
|
|
122
|
+
|
|
123
|
+
## Requirements
|
|
124
|
+
|
|
125
|
+
- Node.js 18+ (for native fetch support in SPLASH validation)
|
|
126
|
+
- No external runtime dependencies (only optional `fifo-logger`)
|
|
127
|
+
|
|
25
128
|
## License
|
|
26
129
|
|
|
27
130
|
[MIT](./LICENSE)
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* MassBank validation library
|
|
3
|
+
* Main entry point for the package
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
5
|
+
export { validate, validateContent } from './validator/index.js';
|
|
6
|
+
export type { ValidationError, ValidationOptions, ValidationResult, ValidationWarning, } from './types.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGjE,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* MassBank validation library
|
|
3
|
+
* Main entry point for the package
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
5
|
+
// Validation functions
|
|
6
|
+
export { validate, validateContent } from './validator/index.js';
|
|
8
7
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uBAAuB;AACvB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ParseError } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Exception thrown when parsing fails
|
|
4
|
+
*/
|
|
5
|
+
export declare class ParseException extends Error {
|
|
6
|
+
readonly parseError: ParseError;
|
|
7
|
+
constructor(parseError: ParseError, message?: string);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=exceptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../src/parser/exceptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;gBACpB,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM;CAgBrD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exception thrown when parsing fails
|
|
3
|
+
*/
|
|
4
|
+
export class ParseException extends Error {
|
|
5
|
+
parseError;
|
|
6
|
+
constructor(parseError, message) {
|
|
7
|
+
super(message || parseError.message);
|
|
8
|
+
this.parseError = parseError;
|
|
9
|
+
this.name = 'ParseException';
|
|
10
|
+
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
11
|
+
const ErrorConstructor = Error;
|
|
12
|
+
if (typeof ErrorConstructor.captureStackTrace === 'function') {
|
|
13
|
+
ErrorConstructor.captureStackTrace(this, ParseException);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/parser/exceptions.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,UAAU,CAAa;IAChC,YAAY,UAAsB,EAAE,OAAgB;QAClD,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,qFAAqF;QACrF,MAAM,gBAAgB,GAAG,KAMxB,CAAC;QACF,IAAI,OAAO,gBAAgB,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;YAC7D,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Record } from '../record.js';
|
|
2
|
+
import type { IFieldParser } from './interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* Base class for field parsers
|
|
5
|
+
*/
|
|
6
|
+
declare abstract class BaseFieldParser implements IFieldParser {
|
|
7
|
+
abstract canParse(key: string): boolean;
|
|
8
|
+
abstract parse(key: string, value: string, record: Record): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Header field parser
|
|
12
|
+
*/
|
|
13
|
+
export declare class HeaderFieldParser extends BaseFieldParser {
|
|
14
|
+
canParse(key: string): boolean;
|
|
15
|
+
parse(key: string, value: string, record: Record): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Compound (CH$) field parser
|
|
19
|
+
*/
|
|
20
|
+
export declare class CompoundFieldParser extends BaseFieldParser {
|
|
21
|
+
canParse(key: string): boolean;
|
|
22
|
+
parse(key: string, value: string, record: Record): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Analytical conditions (AC$) field parser
|
|
26
|
+
*/
|
|
27
|
+
export declare class AnalyticalConditionsFieldParser extends BaseFieldParser {
|
|
28
|
+
canParse(key: string): boolean;
|
|
29
|
+
parse(key: string, value: string, record: Record): void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Mass spectrometry (MS$) field parser
|
|
33
|
+
*/
|
|
34
|
+
export declare class MassSpectrometryFieldParser extends BaseFieldParser {
|
|
35
|
+
canParse(key: string): boolean;
|
|
36
|
+
parse(key: string, value: string, record: Record): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Peak (PK$) field parser (non-table fields)
|
|
40
|
+
*/
|
|
41
|
+
export declare class PeakFieldParser extends BaseFieldParser {
|
|
42
|
+
canParse(key: string): boolean;
|
|
43
|
+
parse(key: string, value: string, record: Record): void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Species (SP$) field parser
|
|
47
|
+
*/
|
|
48
|
+
export declare class SpeciesFieldParser extends BaseFieldParser {
|
|
49
|
+
canParse(key: string): boolean;
|
|
50
|
+
parse(key: string, value: string, record: Record): void;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=field-parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-parsers.d.ts","sourceRoot":"","sources":["../../src/parser/field-parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;GAEG;AACH,uBAAe,eAAgB,YAAW,YAAY;IACpD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IACvC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CACjE;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAgB9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAuCxD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAiCxD;AAED;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,eAAe;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAwBxD;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,eAAe;IAC9D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAkBxD;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAiBxD;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;IACrD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAqBxD"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for field parsers
|
|
3
|
+
*/
|
|
4
|
+
class BaseFieldParser {
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Header field parser
|
|
8
|
+
*/
|
|
9
|
+
export class HeaderFieldParser extends BaseFieldParser {
|
|
10
|
+
canParse(key) {
|
|
11
|
+
const headerFields = [
|
|
12
|
+
'ACCESSION',
|
|
13
|
+
'RECORD_TITLE',
|
|
14
|
+
'DATE',
|
|
15
|
+
'AUTHORS',
|
|
16
|
+
'LICENSE',
|
|
17
|
+
'COPYRIGHT',
|
|
18
|
+
'PUBLICATION',
|
|
19
|
+
'PROJECT',
|
|
20
|
+
'COMMENT',
|
|
21
|
+
'DEPRECATED',
|
|
22
|
+
];
|
|
23
|
+
return headerFields.includes(key);
|
|
24
|
+
}
|
|
25
|
+
parse(key, value, record) {
|
|
26
|
+
switch (key) {
|
|
27
|
+
case 'ACCESSION':
|
|
28
|
+
record.ACCESSION = value;
|
|
29
|
+
break;
|
|
30
|
+
case 'RECORD_TITLE':
|
|
31
|
+
record.RECORD_TITLE = value;
|
|
32
|
+
break;
|
|
33
|
+
case 'DATE':
|
|
34
|
+
record.DATE = value;
|
|
35
|
+
break;
|
|
36
|
+
case 'AUTHORS':
|
|
37
|
+
record.AUTHORS = value;
|
|
38
|
+
break;
|
|
39
|
+
case 'LICENSE':
|
|
40
|
+
record.LICENSE = value;
|
|
41
|
+
break;
|
|
42
|
+
case 'COPYRIGHT':
|
|
43
|
+
record.COPYRIGHT = value;
|
|
44
|
+
break;
|
|
45
|
+
case 'PUBLICATION':
|
|
46
|
+
record.PUBLICATION = value;
|
|
47
|
+
break;
|
|
48
|
+
case 'PROJECT':
|
|
49
|
+
record.PROJECT = value;
|
|
50
|
+
break;
|
|
51
|
+
case 'COMMENT':
|
|
52
|
+
if (!record.COMMENT) {
|
|
53
|
+
record.COMMENT = [];
|
|
54
|
+
}
|
|
55
|
+
record.COMMENT.push(value);
|
|
56
|
+
break;
|
|
57
|
+
case 'DEPRECATED':
|
|
58
|
+
record.DEPRECATED = value;
|
|
59
|
+
break;
|
|
60
|
+
default:
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Compound (CH$) field parser
|
|
67
|
+
*/
|
|
68
|
+
export class CompoundFieldParser extends BaseFieldParser {
|
|
69
|
+
canParse(key) {
|
|
70
|
+
return key.startsWith('CH$');
|
|
71
|
+
}
|
|
72
|
+
parse(key, value, record) {
|
|
73
|
+
switch (key) {
|
|
74
|
+
case 'CH$NAME':
|
|
75
|
+
if (!record.CH$NAME) {
|
|
76
|
+
record.CH$NAME = [];
|
|
77
|
+
}
|
|
78
|
+
record.CH$NAME.push(value);
|
|
79
|
+
break;
|
|
80
|
+
case 'CH$COMPOUND_CLASS':
|
|
81
|
+
record.CH$COMPOUND_CLASS = value;
|
|
82
|
+
break;
|
|
83
|
+
case 'CH$FORMULA':
|
|
84
|
+
record.CH$FORMULA = value;
|
|
85
|
+
break;
|
|
86
|
+
case 'CH$EXACT_MASS':
|
|
87
|
+
record.CH$EXACT_MASS = value;
|
|
88
|
+
break;
|
|
89
|
+
case 'CH$SMILES':
|
|
90
|
+
record.CH$SMILES = value;
|
|
91
|
+
break;
|
|
92
|
+
case 'CH$IUPAC':
|
|
93
|
+
record.CH$IUPAC = value;
|
|
94
|
+
break;
|
|
95
|
+
case 'CH$LINK':
|
|
96
|
+
if (!record.CH$LINK) {
|
|
97
|
+
record.CH$LINK = [];
|
|
98
|
+
}
|
|
99
|
+
record.CH$LINK.push(value);
|
|
100
|
+
break;
|
|
101
|
+
default:
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Analytical conditions (AC$) field parser
|
|
108
|
+
*/
|
|
109
|
+
export class AnalyticalConditionsFieldParser extends BaseFieldParser {
|
|
110
|
+
canParse(key) {
|
|
111
|
+
return key.startsWith('AC$');
|
|
112
|
+
}
|
|
113
|
+
parse(key, value, record) {
|
|
114
|
+
switch (key) {
|
|
115
|
+
case 'AC$INSTRUMENT':
|
|
116
|
+
record.AC$INSTRUMENT = value;
|
|
117
|
+
break;
|
|
118
|
+
case 'AC$INSTRUMENT_TYPE':
|
|
119
|
+
record.AC$INSTRUMENT_TYPE = value;
|
|
120
|
+
break;
|
|
121
|
+
case 'AC$MASS_SPECTROMETRY':
|
|
122
|
+
if (!record.AC$MASS_SPECTROMETRY) {
|
|
123
|
+
record.AC$MASS_SPECTROMETRY = [];
|
|
124
|
+
}
|
|
125
|
+
record.AC$MASS_SPECTROMETRY.push(value);
|
|
126
|
+
break;
|
|
127
|
+
case 'AC$CHROMATOGRAPHY':
|
|
128
|
+
if (!record.AC$CHROMATOGRAPHY) {
|
|
129
|
+
record.AC$CHROMATOGRAPHY = [];
|
|
130
|
+
}
|
|
131
|
+
record.AC$CHROMATOGRAPHY.push(value);
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Mass spectrometry (MS$) field parser
|
|
140
|
+
*/
|
|
141
|
+
export class MassSpectrometryFieldParser extends BaseFieldParser {
|
|
142
|
+
canParse(key) {
|
|
143
|
+
return key.startsWith('MS$');
|
|
144
|
+
}
|
|
145
|
+
parse(key, value, record) {
|
|
146
|
+
switch (key) {
|
|
147
|
+
case 'MS$FOCUSED_ION':
|
|
148
|
+
if (!record.MS$FOCUSED_ION) {
|
|
149
|
+
record.MS$FOCUSED_ION = [];
|
|
150
|
+
}
|
|
151
|
+
record.MS$FOCUSED_ION.push(value);
|
|
152
|
+
break;
|
|
153
|
+
case 'MS$DATA_PROCESSING':
|
|
154
|
+
if (!record.MS$DATA_PROCESSING) {
|
|
155
|
+
record.MS$DATA_PROCESSING = [];
|
|
156
|
+
}
|
|
157
|
+
record.MS$DATA_PROCESSING.push(value);
|
|
158
|
+
break;
|
|
159
|
+
default:
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Peak (PK$) field parser (non-table fields)
|
|
166
|
+
*/
|
|
167
|
+
export class PeakFieldParser extends BaseFieldParser {
|
|
168
|
+
canParse(key) {
|
|
169
|
+
return (key.startsWith('PK$') && key !== 'PK$PEAK' && key !== 'PK$ANNOTATION');
|
|
170
|
+
}
|
|
171
|
+
parse(key, value, record) {
|
|
172
|
+
switch (key) {
|
|
173
|
+
case 'PK$SPLASH':
|
|
174
|
+
record.PK$SPLASH = value;
|
|
175
|
+
break;
|
|
176
|
+
case 'PK$NUM_PEAK': {
|
|
177
|
+
const numPeak = Number.parseInt(value, 10);
|
|
178
|
+
if (Number.isNaN(numPeak)) {
|
|
179
|
+
throw new Error(`Invalid PK$NUM_PEAK value: ${value}`);
|
|
180
|
+
}
|
|
181
|
+
record.PK$NUM_PEAK = numPeak;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Species (SP$) field parser
|
|
191
|
+
*/
|
|
192
|
+
export class SpeciesFieldParser extends BaseFieldParser {
|
|
193
|
+
canParse(key) {
|
|
194
|
+
return key.startsWith('SP$');
|
|
195
|
+
}
|
|
196
|
+
parse(key, value, record) {
|
|
197
|
+
switch (key) {
|
|
198
|
+
case 'SP$SCIENTIFIC_NAME':
|
|
199
|
+
record.SP$SCIENTIFIC_NAME = value;
|
|
200
|
+
break;
|
|
201
|
+
case 'SP$LINEAGE':
|
|
202
|
+
record.SP$LINEAGE = value;
|
|
203
|
+
break;
|
|
204
|
+
case 'SP$LINK':
|
|
205
|
+
if (!record.SP$LINK) {
|
|
206
|
+
record.SP$LINK = [];
|
|
207
|
+
}
|
|
208
|
+
record.SP$LINK.push(value);
|
|
209
|
+
break;
|
|
210
|
+
case 'SP$SAMPLE':
|
|
211
|
+
record.SP$SAMPLE = value;
|
|
212
|
+
break;
|
|
213
|
+
default:
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=field-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-parsers.js","sourceRoot":"","sources":["../../src/parser/field-parsers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { RecordParser, createParser, parseRecord } from './record-parser.js';
|
|
2
|
+
export { ParseException } from './exceptions.js';
|
|
3
|
+
export type { IFieldParser, IRecordParser, ITableParser, } from './interfaces.js';
|
|
4
|
+
export { PositionUtils } from './position-utils.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Record } from '../record.js';
|
|
2
|
+
/**
|
|
3
|
+
* Interface for parsing MassBank records
|
|
4
|
+
*/
|
|
5
|
+
export interface IRecordParser {
|
|
6
|
+
/**
|
|
7
|
+
* Parse a MassBank record string into a Record object
|
|
8
|
+
* @param text - The MassBank record text
|
|
9
|
+
* @returns The parsed Record object
|
|
10
|
+
* @throws {import('./exceptions.js').ParseException} if parsing fails
|
|
11
|
+
*/
|
|
12
|
+
parse(text: string): Record;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Interface for parsing field values
|
|
16
|
+
*/
|
|
17
|
+
export interface IFieldParser {
|
|
18
|
+
/**
|
|
19
|
+
* Check if this parser can handle the given key
|
|
20
|
+
*/
|
|
21
|
+
canParse(key: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Parse the field value
|
|
24
|
+
*/
|
|
25
|
+
parse(key: string, value: string, record: Record): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Interface for parsing table data (peaks, annotations)
|
|
29
|
+
*/
|
|
30
|
+
export interface ITableParser {
|
|
31
|
+
/**
|
|
32
|
+
* Check if this parser can handle the given key
|
|
33
|
+
*/
|
|
34
|
+
canParse(key: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Parse table data starting from the given line index
|
|
37
|
+
* @param key - The field key
|
|
38
|
+
* @param lines - All lines
|
|
39
|
+
* @param startIndex - Index of first data line (header is at startIndex - 1)
|
|
40
|
+
* @param record - Record to populate
|
|
41
|
+
* @param headerLine - The full header line (e.g., "PK$ANNOTATION: m/z ion")
|
|
42
|
+
* @returns The number of lines consumed
|
|
43
|
+
*/
|
|
44
|
+
parse(key: string, lines: string[], startIndex: number, record: Record, headerLine?: string): number;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/parser/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;;;;;;;OAQG;IACH,KAAK,CACH,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAAC;CACX"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/parser/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ParseError } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for position calculations
|
|
4
|
+
* Handle position/line/column calculations
|
|
5
|
+
*/
|
|
6
|
+
export declare const PositionUtils: {
|
|
7
|
+
/**
|
|
8
|
+
* Get character position from line and column (both 1-based).
|
|
9
|
+
* Converts 1-based line/column to a 0-based character offset in the text.
|
|
10
|
+
* @param text - The full text being parsed (used to determine actual newline lengths)
|
|
11
|
+
* @param lineIndex - Line number (1-based)
|
|
12
|
+
* @param column - Column number (1-based)
|
|
13
|
+
* @returns 0-based character position in the original text
|
|
14
|
+
*/
|
|
15
|
+
getPosition(text: string, lineIndex: number, column: number): number;
|
|
16
|
+
/**
|
|
17
|
+
* Create a ParseError from a 0-based character position.
|
|
18
|
+
* Converts the position to 1-based line and column numbers.
|
|
19
|
+
* Clamps position to valid range [0, text.length] to ensure correct line/column calculation.
|
|
20
|
+
* @param text - The full text being parsed
|
|
21
|
+
* @param position - 0-based character offset in the text
|
|
22
|
+
* @param message - Error message describing the problem
|
|
23
|
+
* @returns ParseError with 1-based line and column
|
|
24
|
+
*/
|
|
25
|
+
createParseError(text: string, position: number, message: string): ParseError;
|
|
26
|
+
/**
|
|
27
|
+
* Get line and column from a 0-based character position.
|
|
28
|
+
* Converts the position to 1-based line and column numbers.
|
|
29
|
+
* Clamps position to valid range [0, text.length] and correctly handles the last line.
|
|
30
|
+
* @param text - The full text being parsed
|
|
31
|
+
* @param position - 0-based character offset in the text
|
|
32
|
+
* @returns Object with 1-based line and column
|
|
33
|
+
*/
|
|
34
|
+
getLineColumn(text: string, position: number): {
|
|
35
|
+
line: number;
|
|
36
|
+
column: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=position-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-utils.d.ts","sourceRoot":"","sources":["../../src/parser/position-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,aAAa;IACxB;;;;;;;OAOG;sBACe,MAAM,aAAa,MAAM,UAAU,MAAM,GAAG,MAAM;IAqCpE;;;;;;;;OAQG;2BAEK,MAAM,YACF,MAAM,WACP,MAAM,GACd,UAAU;IAeb;;;;;;;OAOG;wBAEK,MAAM,YACF,MAAM,GACf;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAsCpC,CAAC"}
|