massbank 0.0.2 → 0.1.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.
Files changed (142) hide show
  1. package/README.md +108 -5
  2. package/lib/index.d.ts +4 -3
  3. package/lib/index.d.ts.map +1 -1
  4. package/lib/index.js +4 -5
  5. package/lib/index.js.map +1 -1
  6. package/lib/parser/exceptions.d.ts +9 -0
  7. package/lib/parser/exceptions.d.ts.map +1 -0
  8. package/lib/parser/exceptions.js +17 -0
  9. package/lib/parser/exceptions.js.map +1 -0
  10. package/lib/parser/field-parsers.d.ts +53 -0
  11. package/lib/parser/field-parsers.d.ts.map +1 -0
  12. package/lib/parser/field-parsers.js +218 -0
  13. package/lib/parser/field-parsers.js.map +1 -0
  14. package/lib/parser/index.d.ts +5 -0
  15. package/lib/parser/index.d.ts.map +1 -0
  16. package/lib/parser/index.js +4 -0
  17. package/lib/parser/index.js.map +1 -0
  18. package/lib/parser/interfaces.d.ts +46 -0
  19. package/lib/parser/interfaces.d.ts.map +1 -0
  20. package/lib/parser/interfaces.js +2 -0
  21. package/lib/parser/interfaces.js.map +1 -0
  22. package/lib/parser/position-utils.d.ts +39 -0
  23. package/lib/parser/position-utils.d.ts.map +1 -0
  24. package/lib/parser/position-utils.js +102 -0
  25. package/lib/parser/position-utils.js.map +1 -0
  26. package/lib/parser/record-parser.d.ts +29 -0
  27. package/lib/parser/record-parser.d.ts.map +1 -0
  28. package/lib/parser/record-parser.js +104 -0
  29. package/lib/parser/record-parser.js.map +1 -0
  30. package/lib/parser/table-parsers.d.ts +27 -0
  31. package/lib/parser/table-parsers.d.ts.map +1 -0
  32. package/lib/parser/table-parsers.js +178 -0
  33. package/lib/parser/table-parsers.js.map +1 -0
  34. package/lib/record.d.ts +55 -0
  35. package/lib/record.d.ts.map +1 -0
  36. package/lib/record.js +5 -0
  37. package/lib/record.js.map +1 -0
  38. package/lib/serializer/index.d.ts +3 -0
  39. package/lib/serializer/index.d.ts.map +1 -0
  40. package/lib/serializer/index.js +2 -0
  41. package/lib/serializer/index.js.map +1 -0
  42. package/lib/serializer/interfaces.d.ts +14 -0
  43. package/lib/serializer/interfaces.d.ts.map +1 -0
  44. package/lib/serializer/interfaces.js +2 -0
  45. package/lib/serializer/interfaces.js.map +1 -0
  46. package/lib/serializer/record-serializer.d.ts +24 -0
  47. package/lib/serializer/record-serializer.d.ts.map +1 -0
  48. package/lib/serializer/record-serializer.js +176 -0
  49. package/lib/serializer/record-serializer.js.map +1 -0
  50. package/lib/splash/index.d.ts +3 -0
  51. package/lib/splash/index.d.ts.map +1 -0
  52. package/lib/splash/index.js +2 -0
  53. package/lib/splash/index.js.map +1 -0
  54. package/lib/splash/interfaces.d.ts +22 -0
  55. package/lib/splash/interfaces.d.ts.map +1 -0
  56. package/lib/splash/interfaces.js +2 -0
  57. package/lib/splash/interfaces.js.map +1 -0
  58. package/lib/splash/splash-validator.d.ts +31 -0
  59. package/lib/splash/splash-validator.d.ts.map +1 -0
  60. package/lib/splash/splash-validator.js +79 -0
  61. package/lib/splash/splash-validator.js.map +1 -0
  62. package/lib/types.d.ts +92 -0
  63. package/lib/types.d.ts.map +1 -0
  64. package/lib/types.js +2 -0
  65. package/lib/types.js.map +1 -0
  66. package/lib/validation/index.d.ts +4 -0
  67. package/lib/validation/index.d.ts.map +1 -0
  68. package/lib/validation/index.js +3 -0
  69. package/lib/validation/index.js.map +1 -0
  70. package/lib/validation/interfaces.d.ts +24 -0
  71. package/lib/validation/interfaces.d.ts.map +1 -0
  72. package/lib/validation/interfaces.js +2 -0
  73. package/lib/validation/interfaces.js.map +1 -0
  74. package/lib/validation/rules/accession-match-rule.d.ts +13 -0
  75. package/lib/validation/rules/accession-match-rule.d.ts.map +1 -0
  76. package/lib/validation/rules/accession-match-rule.js +27 -0
  77. package/lib/validation/rules/accession-match-rule.js.map +1 -0
  78. package/lib/validation/rules/index.d.ts +5 -0
  79. package/lib/validation/rules/index.d.ts.map +1 -0
  80. package/lib/validation/rules/index.js +5 -0
  81. package/lib/validation/rules/index.js.map +1 -0
  82. package/lib/validation/rules/non-standard-chars-rule.d.ts +13 -0
  83. package/lib/validation/rules/non-standard-chars-rule.d.ts.map +1 -0
  84. package/lib/validation/rules/non-standard-chars-rule.js +45 -0
  85. package/lib/validation/rules/non-standard-chars-rule.js.map +1 -0
  86. package/lib/validation/rules/serialization-rule.d.ts +14 -0
  87. package/lib/validation/rules/serialization-rule.d.ts.map +1 -0
  88. package/lib/validation/rules/serialization-rule.js +55 -0
  89. package/lib/validation/rules/serialization-rule.js.map +1 -0
  90. package/lib/validation/rules/unrecognized-field-rule.d.ts +16 -0
  91. package/lib/validation/rules/unrecognized-field-rule.d.ts.map +1 -0
  92. package/lib/validation/rules/unrecognized-field-rule.js +87 -0
  93. package/lib/validation/rules/unrecognized-field-rule.js.map +1 -0
  94. package/lib/validation/validator.d.ts +18 -0
  95. package/lib/validation/validator.d.ts.map +1 -0
  96. package/lib/validation/validator.js +30 -0
  97. package/lib/validation/validator.js.map +1 -0
  98. package/lib/validator/file-utils.d.ts +13 -0
  99. package/lib/validator/file-utils.d.ts.map +1 -0
  100. package/lib/validator/file-utils.js +24 -0
  101. package/lib/validator/file-utils.js.map +1 -0
  102. package/lib/validator/index.d.ts +2 -0
  103. package/lib/validator/index.d.ts.map +1 -0
  104. package/lib/validator/index.js +2 -0
  105. package/lib/validator/index.js.map +1 -0
  106. package/lib/validator/validator.d.ts +19 -0
  107. package/lib/validator/validator.d.ts.map +1 -0
  108. package/lib/validator/validator.js +158 -0
  109. package/lib/validator/validator.js.map +1 -0
  110. package/package.json +1 -1
  111. package/src/index.ts +13 -5
  112. package/src/parser/exceptions.ts +24 -0
  113. package/src/parser/field-parsers.ts +237 -0
  114. package/src/parser/index.ts +8 -0
  115. package/src/parser/interfaces.ts +56 -0
  116. package/src/parser/position-utils.ts +130 -0
  117. package/src/parser/record-parser.ts +155 -0
  118. package/src/parser/table-parsers.ts +217 -0
  119. package/src/record.ts +71 -0
  120. package/src/serializer/index.ts +6 -0
  121. package/src/serializer/interfaces.ts +14 -0
  122. package/src/serializer/record-serializer.ts +192 -0
  123. package/src/splash/index.ts +2 -0
  124. package/src/splash/interfaces.ts +20 -0
  125. package/src/splash/splash-validator.ts +95 -0
  126. package/src/types.ts +96 -0
  127. package/src/validation/index.ts +3 -0
  128. package/src/validation/interfaces.ts +36 -0
  129. package/src/validation/rules/accession-match-rule.ts +38 -0
  130. package/src/validation/rules/index.ts +4 -0
  131. package/src/validation/rules/non-standard-chars-rule.ts +67 -0
  132. package/src/validation/rules/serialization-rule.ts +74 -0
  133. package/src/validation/rules/unrecognized-field-rule.ts +102 -0
  134. package/src/validation/validator.ts +39 -0
  135. package/src/validator/file-utils.ts +25 -0
  136. package/src/validator/index.ts +1 -0
  137. package/src/validator/validator.ts +188 -0
  138. package/lib/isValid.d.ts +0 -12
  139. package/lib/isValid.d.ts.map +0 -1
  140. package/lib/isValid.js +0 -15
  141. package/lib/isValid.js.map +0 -1
  142. package/src/isValid.ts +0 -22
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![test coverage](https://img.shields.io/codecov/c/github/cheminfo/massbank.svg)](https://codecov.io/gh/cheminfo/massbank)
6
6
  [![license](https://img.shields.io/npm/l/massbank.svg)](https://github.com/cheminfo/massbank/blob/main/LICENSE)
7
7
 
8
- Utilities to submit massbank data.
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
- ```js
19
- import { myModule } from 'massbank';
18
+ ### Basic File Validation
20
19
 
21
- const result = myModule(args);
22
- // result is ...
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
- * My module
3
- * @returns A very important number
2
+ * MassBank validation library
3
+ * Main entry point for the package
4
4
  */
5
- export declare function myModule(): number;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC"}
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
- * My module
3
- * @returns A very important number
2
+ * MassBank validation library
3
+ * Main entry point for the package
4
4
  */
5
- export function myModule() {
6
- return 42;
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;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,CAAC;AACZ,CAAC"}
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,4 @@
1
+ export { RecordParser, createParser, parseRecord } from './record-parser.js';
2
+ export { ParseException } from './exceptions.js';
3
+ export { PositionUtils } from './position-utils.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -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"}