openrxiv-utils 0.0.2 → 0.0.3
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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +10 -8
- package/CHANGELOG.md +7 -0
- package/dist/biorxiv-parser.d.ts +5 -0
- package/dist/biorxiv-parser.d.ts.map +1 -1
- package/dist/biorxiv-parser.js +12 -7
- package/dist/biorxiv-parser.js.map +1 -1
- package/dist/biorxiv-parser.spec.js +25 -0
- package/dist/biorxiv-parser.spec.js.map +1 -1
- package/package.json +1 -1
- package/src/biorxiv-parser.spec.ts +27 -0
- package/src/biorxiv-parser.ts +15 -7
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
|
|
2
|
-
> openrxiv-utils@0.0.
|
|
2
|
+
> openrxiv-utils@0.0.3 test
|
|
3
3
|
> vitest run
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[1m[46m RUN [49m[22m [
|
|
6
|
+
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90m/home/runner/work/openrxiv/openrxiv/packages/utils[39m
|
|
7
7
|
|
|
8
|
-
[32m✓[39m
|
|
9
|
-
[32m✓[39m src/folder-structure.test.ts [2m([22m[2m162 tests[22m[2m)[22m[32m
|
|
8
|
+
[32m✓[39m dist/biorxiv-parser.spec.js [2m([22m[2m67 tests[22m[2m)[22m[32m 60[2mms[22m[39m
|
|
9
|
+
[32m✓[39m src/folder-structure.test.ts [2m([22m[2m162 tests[22m[2m)[22m[32m 99[2mms[22m[39m
|
|
10
|
+
[32m✓[39m dist/folder-structure.test.js [2m([22m[2m162 tests[22m[2m)[22m[32m 78[2mms[22m[39m
|
|
11
|
+
[32m✓[39m src/biorxiv-parser.spec.ts [2m([22m[2m67 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
10
12
|
|
|
11
|
-
[2m Test Files [22m [1m[
|
|
12
|
-
[2m Tests [22m [1m[
|
|
13
|
-
[2m Start at [22m
|
|
14
|
-
[2m Duration [22m 1.
|
|
13
|
+
[2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
|
|
14
|
+
[2m Tests [22m [1m[32m458 passed[39m[22m[90m (458)[39m
|
|
15
|
+
[2m Start at [22m 21:43:38
|
|
16
|
+
[2m Duration [22m 1.46s[2m (transform 826ms, setup 0ms, import 1.30s, tests 278ms, environment 1ms)[22m
|
|
15
17
|
|
package/CHANGELOG.md
CHANGED
package/dist/biorxiv-parser.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utility functions for parsing bioRxiv URLs and DOIs
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* bioRxiv DOI prefixes - both legacy (10.1101) and new (10.64898, Dec 2025+)
|
|
6
|
+
*/
|
|
7
|
+
export declare const BIORXIV_DOI_PREFIXES: readonly ["10.1101", "10.64898"];
|
|
8
|
+
export declare const BIORXIV_DOI_PREFIX_PATTERN = "(10\\.1101|10\\.64898)";
|
|
4
9
|
export interface ParsedBiorxivURL {
|
|
5
10
|
doi: string;
|
|
6
11
|
baseDOI: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biorxiv-parser.d.ts","sourceRoot":"","sources":["../src/biorxiv-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoC5D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"biorxiv-parser.d.ts","sourceRoot":"","sources":["../src/biorxiv-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB,kCAAmC,CAAC;AACrE,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoC5D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAwCrD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAiBpE"}
|
package/dist/biorxiv-parser.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utility functions for parsing bioRxiv URLs and DOIs
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* bioRxiv DOI prefixes - both legacy (10.1101) and new (10.64898, Dec 2025+)
|
|
6
|
+
*/
|
|
7
|
+
export const BIORXIV_DOI_PREFIXES = ['10.1101', '10.64898'];
|
|
8
|
+
export const BIORXIV_DOI_PREFIX_PATTERN = '(10\\.1101|10\\.64898)';
|
|
4
9
|
/**
|
|
5
10
|
* Extract DOI from a bioRxiv URL
|
|
6
11
|
*/
|
|
@@ -28,8 +33,8 @@ export function extractDOIFromURL(url) {
|
|
|
28
33
|
doi = match[1];
|
|
29
34
|
}
|
|
30
35
|
}
|
|
31
|
-
// Check for direct DOI input
|
|
32
|
-
else if (url.startsWith('10.1101/')) {
|
|
36
|
+
// Check for direct DOI input (both 10.1101 and 10.64898 prefixes)
|
|
37
|
+
else if (url.startsWith('10.1101/') || url.startsWith('10.64898/')) {
|
|
33
38
|
doi = url;
|
|
34
39
|
}
|
|
35
40
|
if (doi) {
|
|
@@ -43,12 +48,12 @@ export function extractDOIFromURL(url) {
|
|
|
43
48
|
* Supports both legacy numeric format (2019 and earlier) and current date-based format (2019+)
|
|
44
49
|
*/
|
|
45
50
|
export function parseDOI(doi) {
|
|
46
|
-
// Handle current date-based format (2019+):
|
|
47
|
-
const currentPattern =
|
|
51
|
+
// Handle current date-based format (2019+): {prefix}/YYYY.MM.DD.XXXXXXvN
|
|
52
|
+
const currentPattern = new RegExp(`^${BIORXIV_DOI_PREFIX_PATTERN}/(\\d{4})\\.(\\d{2})\\.(\\d{2})\\.(\\d{6,8})(v\\d+)?$`);
|
|
48
53
|
const currentMatch = doi.match(currentPattern);
|
|
49
54
|
if (currentMatch) {
|
|
50
55
|
const [prefix, suffix] = doi.split('/');
|
|
51
|
-
const [, year, month, day, identifier, version] = currentMatch;
|
|
56
|
+
const [, , year, month, day, identifier, version] = currentMatch;
|
|
52
57
|
const date = `${year}-${month}-${day}`;
|
|
53
58
|
return {
|
|
54
59
|
doi,
|
|
@@ -59,8 +64,8 @@ export function parseDOI(doi) {
|
|
|
59
64
|
version: version || null,
|
|
60
65
|
};
|
|
61
66
|
}
|
|
62
|
-
// Handle legacy numeric format (2019 and earlier): 10.1101
|
|
63
|
-
const legacyPattern =
|
|
67
|
+
// Handle legacy numeric format (2019 and earlier): {prefix}/XXXXXX (10.1101 only; 10.64898 uses date format)
|
|
68
|
+
const legacyPattern = new RegExp(`^${BIORXIV_DOI_PREFIX_PATTERN}/(\\d{6,8})(v\\d+)?$`);
|
|
64
69
|
const legacyMatch = doi.match(legacyPattern);
|
|
65
70
|
if (legacyMatch) {
|
|
66
71
|
const [prefix, suffix] = doi.split('/');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biorxiv-parser.js","sourceRoot":"","sources":["../src/biorxiv-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"biorxiv-parser.js","sourceRoot":"","sources":["../src/biorxiv-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,12 @@ describe('BioRxiv URL Parser', () => {
|
|
|
33
33
|
],
|
|
34
34
|
['https://doi.org/10.1101/2024.01.25.577295v3', '10.1101/2024.01.25.577295v3'],
|
|
35
35
|
['10.1101/2024.01.25.577295v3', '10.1101/2024.01.25.577295v3'],
|
|
36
|
+
// New prefix 10.64898 (Dec 2025+)
|
|
37
|
+
['10.64898/2025.12.15.123456v1', '10.64898/2025.12.15.123456v1'],
|
|
38
|
+
[
|
|
39
|
+
'https://www.biorxiv.org/content/10.64898/2025.12.01.999999v2',
|
|
40
|
+
'10.64898/2025.12.01.999999v2',
|
|
41
|
+
],
|
|
36
42
|
])('should extract DOI from standard content URL', (url, expected) => {
|
|
37
43
|
const result = extractDOIFromURL(url);
|
|
38
44
|
expect(result).toBe(expected);
|
|
@@ -85,6 +91,18 @@ describe('BioRxiv URL Parser', () => {
|
|
|
85
91
|
version: 'v1',
|
|
86
92
|
});
|
|
87
93
|
});
|
|
94
|
+
it('should parse DOI with new 10.64898 prefix (Dec 2025+)', () => {
|
|
95
|
+
const doi = '10.64898/2025.12.15.123456v1';
|
|
96
|
+
const result = parseDOI(doi);
|
|
97
|
+
expect(result).toEqual({
|
|
98
|
+
doi: '10.64898/2025.12.15.123456v1',
|
|
99
|
+
prefix: '10.64898',
|
|
100
|
+
date: '2025-12-15',
|
|
101
|
+
identifier: '123456',
|
|
102
|
+
suffix: '2025.12.15.123456',
|
|
103
|
+
version: 'v1',
|
|
104
|
+
});
|
|
105
|
+
});
|
|
88
106
|
it('should return null for invalid DOI format', () => {
|
|
89
107
|
const invalidDOIs = [
|
|
90
108
|
'10.1000/123.456.789',
|
|
@@ -108,6 +126,7 @@ describe('BioRxiv URL Parser', () => {
|
|
|
108
126
|
['10.1101/2024.01.25.577295v3', '10.1101/2024.01.25.577295'], // Remove version
|
|
109
127
|
['10.1101/2024.01.25.577295v12', '10.1101/2024.01.25.577295'], // Remove double digit version
|
|
110
128
|
['10.1101/2020.03.19.20039131v2', '10.1101/2020.03.19.20039131'], // medrxiv variant
|
|
129
|
+
['10.64898/2025.12.15.123456v1', '10.64898/2025.12.15.123456'],
|
|
111
130
|
])('should extract base DOI from versioned DOI', (doi, expected) => {
|
|
112
131
|
const result = extractBaseDOI(doi);
|
|
113
132
|
expect(result).toBe(expected);
|
|
@@ -134,6 +153,10 @@ describe('BioRxiv URL Parser', () => {
|
|
|
134
153
|
['10.1101/789012v12', true],
|
|
135
154
|
['10.1101/789012v3', true],
|
|
136
155
|
['10.1101/2020.03.19.20039131v2', true],
|
|
156
|
+
['10.64898/2025.12.15.123456', true],
|
|
157
|
+
['10.64898/2025.12.01.999999v1', true],
|
|
158
|
+
['10.64898/789012', true],
|
|
159
|
+
['10.64898/789012v3', true],
|
|
137
160
|
['10.1101/2024.1.25.577295', false],
|
|
138
161
|
['10.1101/2024.01.25.57729', false],
|
|
139
162
|
['invalid-doi', false],
|
|
@@ -153,6 +176,8 @@ describe('BioRxiv URL Parser', () => {
|
|
|
153
176
|
['10.1101/2024.01.25.577295v3', true],
|
|
154
177
|
['https://www.biorxiv.org/content/10.1101/486050v2.article-info', true],
|
|
155
178
|
['https://www.biorxiv.org/content/10.1101/486050', true],
|
|
179
|
+
['10.64898/2025.12.15.123456v1', true],
|
|
180
|
+
['https://www.biorxiv.org/content/10.64898/2025.12.01.999999v2', true],
|
|
156
181
|
// Invalid
|
|
157
182
|
['https://example.com/not-biorxiv', false],
|
|
158
183
|
['https://biorxiv.org/invalid-path', false],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biorxiv-parser.spec.js","sourceRoot":"","sources":["../src/biorxiv-parser.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,IAAI,CAAC;YACN;gBACE,6DAA6D;gBAC7D,6BAA6B;aAC9B;YACD;gBACE,+DAA+D;gBAC/D,+BAA+B;aAChC;YACD;gBACE,0EAA0E;gBAC1E,6BAA6B;aAC9B;YACD;gBACE,kEAAkE;gBAClE,6BAA6B;aAC9B;YACD;gBACE,sEAAsE;gBACtE,6BAA6B;aAC9B;YACD;gBACE,iEAAiE;gBACjE,6BAA6B;aAC9B;YACD;gBACE,mEAAmE;gBACnE,6BAA6B;aAC9B;YACD,CAAC,6CAA6C,EAAE,6BAA6B,CAAC;YAC9E,CAAC,6BAA6B,EAAE,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"biorxiv-parser.spec.js","sourceRoot":"","sources":["../src/biorxiv-parser.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -42,6 +42,12 @@ describe('BioRxiv URL Parser', () => {
|
|
|
42
42
|
],
|
|
43
43
|
['https://doi.org/10.1101/2024.01.25.577295v3', '10.1101/2024.01.25.577295v3'],
|
|
44
44
|
['10.1101/2024.01.25.577295v3', '10.1101/2024.01.25.577295v3'],
|
|
45
|
+
// New prefix 10.64898 (Dec 2025+)
|
|
46
|
+
['10.64898/2025.12.15.123456v1', '10.64898/2025.12.15.123456v1'],
|
|
47
|
+
[
|
|
48
|
+
'https://www.biorxiv.org/content/10.64898/2025.12.01.999999v2',
|
|
49
|
+
'10.64898/2025.12.01.999999v2',
|
|
50
|
+
],
|
|
45
51
|
])('should extract DOI from standard content URL', (url, expected) => {
|
|
46
52
|
const result = extractDOIFromURL(url);
|
|
47
53
|
expect(result).toBe(expected);
|
|
@@ -102,6 +108,20 @@ describe('BioRxiv URL Parser', () => {
|
|
|
102
108
|
});
|
|
103
109
|
});
|
|
104
110
|
|
|
111
|
+
it('should parse DOI with new 10.64898 prefix (Dec 2025+)', () => {
|
|
112
|
+
const doi = '10.64898/2025.12.15.123456v1';
|
|
113
|
+
const result = parseDOI(doi);
|
|
114
|
+
|
|
115
|
+
expect(result).toEqual({
|
|
116
|
+
doi: '10.64898/2025.12.15.123456v1',
|
|
117
|
+
prefix: '10.64898',
|
|
118
|
+
date: '2025-12-15',
|
|
119
|
+
identifier: '123456',
|
|
120
|
+
suffix: '2025.12.15.123456',
|
|
121
|
+
version: 'v1',
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
105
125
|
it('should return null for invalid DOI format', () => {
|
|
106
126
|
const invalidDOIs = [
|
|
107
127
|
'10.1000/123.456.789',
|
|
@@ -127,6 +147,7 @@ describe('BioRxiv URL Parser', () => {
|
|
|
127
147
|
['10.1101/2024.01.25.577295v3', '10.1101/2024.01.25.577295'], // Remove version
|
|
128
148
|
['10.1101/2024.01.25.577295v12', '10.1101/2024.01.25.577295'], // Remove double digit version
|
|
129
149
|
['10.1101/2020.03.19.20039131v2', '10.1101/2020.03.19.20039131'], // medrxiv variant
|
|
150
|
+
['10.64898/2025.12.15.123456v1', '10.64898/2025.12.15.123456'],
|
|
130
151
|
])('should extract base DOI from versioned DOI', (doi, expected) => {
|
|
131
152
|
const result = extractBaseDOI(doi);
|
|
132
153
|
expect(result).toBe(expected);
|
|
@@ -155,6 +176,10 @@ describe('BioRxiv URL Parser', () => {
|
|
|
155
176
|
['10.1101/789012v12', true],
|
|
156
177
|
['10.1101/789012v3', true],
|
|
157
178
|
['10.1101/2020.03.19.20039131v2', true],
|
|
179
|
+
['10.64898/2025.12.15.123456', true],
|
|
180
|
+
['10.64898/2025.12.01.999999v1', true],
|
|
181
|
+
['10.64898/789012', true],
|
|
182
|
+
['10.64898/789012v3', true],
|
|
158
183
|
['10.1101/2024.1.25.577295', false],
|
|
159
184
|
['10.1101/2024.01.25.57729', false],
|
|
160
185
|
['invalid-doi', false],
|
|
@@ -175,6 +200,8 @@ describe('BioRxiv URL Parser', () => {
|
|
|
175
200
|
['10.1101/2024.01.25.577295v3', true],
|
|
176
201
|
['https://www.biorxiv.org/content/10.1101/486050v2.article-info', true],
|
|
177
202
|
['https://www.biorxiv.org/content/10.1101/486050', true],
|
|
203
|
+
['10.64898/2025.12.15.123456v1', true],
|
|
204
|
+
['https://www.biorxiv.org/content/10.64898/2025.12.01.999999v2', true],
|
|
178
205
|
// Invalid
|
|
179
206
|
['https://example.com/not-biorxiv', false],
|
|
180
207
|
['https://biorxiv.org/invalid-path', false],
|
package/src/biorxiv-parser.ts
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
* Utility functions for parsing bioRxiv URLs and DOIs
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* bioRxiv DOI prefixes - both legacy (10.1101) and new (10.64898, Dec 2025+)
|
|
7
|
+
*/
|
|
8
|
+
export const BIORXIV_DOI_PREFIXES = ['10.1101', '10.64898'] as const;
|
|
9
|
+
export const BIORXIV_DOI_PREFIX_PATTERN = '(10\\.1101|10\\.64898)';
|
|
10
|
+
|
|
5
11
|
export interface ParsedBiorxivURL {
|
|
6
12
|
doi: string;
|
|
7
13
|
baseDOI: string;
|
|
@@ -47,8 +53,8 @@ export function extractDOIFromURL(url: string): string | null {
|
|
|
47
53
|
doi = match[1];
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
|
-
// Check for direct DOI input
|
|
51
|
-
else if (url.startsWith('10.1101/')) {
|
|
56
|
+
// Check for direct DOI input (both 10.1101 and 10.64898 prefixes)
|
|
57
|
+
else if (url.startsWith('10.1101/') || url.startsWith('10.64898/')) {
|
|
52
58
|
doi = url;
|
|
53
59
|
}
|
|
54
60
|
|
|
@@ -65,13 +71,15 @@ export function extractDOIFromURL(url: string): string | null {
|
|
|
65
71
|
* Supports both legacy numeric format (2019 and earlier) and current date-based format (2019+)
|
|
66
72
|
*/
|
|
67
73
|
export function parseDOI(doi: string): DOIParts | null {
|
|
68
|
-
// Handle current date-based format (2019+):
|
|
69
|
-
const currentPattern =
|
|
74
|
+
// Handle current date-based format (2019+): {prefix}/YYYY.MM.DD.XXXXXXvN
|
|
75
|
+
const currentPattern = new RegExp(
|
|
76
|
+
`^${BIORXIV_DOI_PREFIX_PATTERN}/(\\d{4})\\.(\\d{2})\\.(\\d{2})\\.(\\d{6,8})(v\\d+)?$`,
|
|
77
|
+
);
|
|
70
78
|
const currentMatch = doi.match(currentPattern);
|
|
71
79
|
|
|
72
80
|
if (currentMatch) {
|
|
73
81
|
const [prefix, suffix] = doi.split('/');
|
|
74
|
-
const [, year, month, day, identifier, version] = currentMatch;
|
|
82
|
+
const [, , year, month, day, identifier, version] = currentMatch;
|
|
75
83
|
const date = `${year}-${month}-${day}`;
|
|
76
84
|
|
|
77
85
|
return {
|
|
@@ -84,8 +92,8 @@ export function parseDOI(doi: string): DOIParts | null {
|
|
|
84
92
|
};
|
|
85
93
|
}
|
|
86
94
|
|
|
87
|
-
// Handle legacy numeric format (2019 and earlier): 10.1101
|
|
88
|
-
const legacyPattern =
|
|
95
|
+
// Handle legacy numeric format (2019 and earlier): {prefix}/XXXXXX (10.1101 only; 10.64898 uses date format)
|
|
96
|
+
const legacyPattern = new RegExp(`^${BIORXIV_DOI_PREFIX_PATTERN}/(\\d{6,8})(v\\d+)?$`);
|
|
89
97
|
const legacyMatch = doi.match(legacyPattern);
|
|
90
98
|
|
|
91
99
|
if (legacyMatch) {
|