@pharmatools/pubcrawl 2.0.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/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache.d.ts +19 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +52 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/dailymed.d.ts +9 -0
- package/dist/lib/dailymed.d.ts.map +1 -0
- package/dist/lib/dailymed.js +58 -0
- package/dist/lib/dailymed.js.map +1 -0
- package/dist/lib/emc.d.ts +13 -0
- package/dist/lib/emc.d.ts.map +1 -0
- package/dist/lib/emc.js +215 -0
- package/dist/lib/emc.js.map +1 -0
- package/dist/lib/label-mapping.d.ts +8 -0
- package/dist/lib/label-mapping.d.ts.map +1 -0
- package/dist/lib/label-mapping.js +23 -0
- package/dist/lib/label-mapping.js.map +1 -0
- package/dist/lib/ncbi.d.ts +37 -0
- package/dist/lib/ncbi.d.ts.map +1 -0
- package/dist/lib/ncbi.js +175 -0
- package/dist/lib/ncbi.js.map +1 -0
- package/dist/lib/openfda.d.ts +8 -0
- package/dist/lib/openfda.d.ts.map +1 -0
- package/dist/lib/openfda.js +83 -0
- package/dist/lib/openfda.js.map +1 -0
- package/dist/lib/xml-parser.d.ts +23 -0
- package/dist/lib/xml-parser.d.ts.map +1 -0
- package/dist/lib/xml-parser.js +273 -0
- package/dist/lib/xml-parser.js.map +1 -0
- package/dist/tools/abstract.d.ts +3 -0
- package/dist/tools/abstract.d.ts.map +1 -0
- package/dist/tools/abstract.js +107 -0
- package/dist/tools/abstract.js.map +1 -0
- package/dist/tools/cite.d.ts +3 -0
- package/dist/tools/cite.d.ts.map +1 -0
- package/dist/tools/cite.js +188 -0
- package/dist/tools/cite.js.map +1 -0
- package/dist/tools/compare-labels.d.ts +3 -0
- package/dist/tools/compare-labels.d.ts.map +1 -0
- package/dist/tools/compare-labels.js +126 -0
- package/dist/tools/compare-labels.js.map +1 -0
- package/dist/tools/fulltext.d.ts +3 -0
- package/dist/tools/fulltext.d.ts.map +1 -0
- package/dist/tools/fulltext.js +88 -0
- package/dist/tools/fulltext.js.map +1 -0
- package/dist/tools/related.d.ts +3 -0
- package/dist/tools/related.d.ts.map +1 -0
- package/dist/tools/related.js +63 -0
- package/dist/tools/related.js.map +1 -0
- package/dist/tools/search-indication.d.ts +3 -0
- package/dist/tools/search-indication.d.ts.map +1 -0
- package/dist/tools/search-indication.js +73 -0
- package/dist/tools/search-indication.js.map +1 -0
- package/dist/tools/search.d.ts +3 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +69 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/smpc.d.ts +3 -0
- package/dist/tools/smpc.d.ts.map +1 -0
- package/dist/tools/smpc.js +52 -0
- package/dist/tools/smpc.js.map +1 -0
- package/dist/tools/trending.d.ts +3 -0
- package/dist/tools/trending.d.ts.map +1 -0
- package/dist/tools/trending.js +106 -0
- package/dist/tools/trending.js.map +1 -0
- package/dist/tools/uspi.d.ts +3 -0
- package/dist/tools/uspi.d.ts.map +1 -0
- package/dist/tools/uspi.js +117 -0
- package/dist/tools/uspi.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
- package/server.json +29 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare function setApiKey(key: string): void;
|
|
2
|
+
export declare function esearch(params: {
|
|
3
|
+
db?: string;
|
|
4
|
+
term: string;
|
|
5
|
+
retmax?: number;
|
|
6
|
+
sort?: string;
|
|
7
|
+
datetype?: string;
|
|
8
|
+
mindate?: string;
|
|
9
|
+
maxdate?: string;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
idlist: string[];
|
|
12
|
+
count: number;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function esummary(params: {
|
|
15
|
+
db?: string;
|
|
16
|
+
id: string[];
|
|
17
|
+
}): Promise<Record<string, unknown>>;
|
|
18
|
+
export declare function efetch(params: {
|
|
19
|
+
db?: string;
|
|
20
|
+
id: string;
|
|
21
|
+
rettype?: string;
|
|
22
|
+
retmode?: string;
|
|
23
|
+
}): Promise<string>;
|
|
24
|
+
export declare function elink(params: {
|
|
25
|
+
dbfrom?: string;
|
|
26
|
+
db?: string;
|
|
27
|
+
id: string;
|
|
28
|
+
cmd?: string;
|
|
29
|
+
linkname?: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
links: Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
score?: number;
|
|
34
|
+
}>;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function pmidToPmcid(pmid: string): Promise<string | null>;
|
|
37
|
+
//# sourceMappingURL=ncbi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ncbi.d.ts","sourceRoot":"","sources":["../../src/lib/ncbi.ts"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAuCD,wBAAsB,OAAO,CAAC,MAAM,EAAE;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/C;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,EAAE,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoBnC;AAED,wBAAsB,MAAM,CAAC,MAAM,EAAE;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsC5D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkCtE"}
|
package/dist/lib/ncbi.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { cache, TTL } from "./cache.js";
|
|
2
|
+
const BASE_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
|
|
3
|
+
const TOOL = "pubcrawl";
|
|
4
|
+
const EMAIL = "nick@pharmatools.ai";
|
|
5
|
+
const REQUEST_DELAY_MS = 300;
|
|
6
|
+
const TIMEOUT_MS = 15000;
|
|
7
|
+
let apiKey;
|
|
8
|
+
let lastRequestTime = 0;
|
|
9
|
+
export function setApiKey(key) {
|
|
10
|
+
apiKey = key;
|
|
11
|
+
}
|
|
12
|
+
function buildParams(extra) {
|
|
13
|
+
const params = new URLSearchParams();
|
|
14
|
+
params.set("tool", TOOL);
|
|
15
|
+
params.set("email", EMAIL);
|
|
16
|
+
if (apiKey)
|
|
17
|
+
params.set("api_key", apiKey);
|
|
18
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
19
|
+
if (value !== undefined)
|
|
20
|
+
params.set(key, value);
|
|
21
|
+
}
|
|
22
|
+
return params;
|
|
23
|
+
}
|
|
24
|
+
async function rateLimitedFetch(url) {
|
|
25
|
+
const minDelay = apiKey ? 100 : REQUEST_DELAY_MS;
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const elapsed = now - lastRequestTime;
|
|
28
|
+
if (elapsed < minDelay) {
|
|
29
|
+
await new Promise((resolve) => setTimeout(resolve, minDelay - elapsed));
|
|
30
|
+
}
|
|
31
|
+
lastRequestTime = Date.now();
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
34
|
+
try {
|
|
35
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`NCBI API error: ${response.status} ${response.statusText}`);
|
|
38
|
+
}
|
|
39
|
+
return response;
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function esearch(params) {
|
|
46
|
+
const cacheKey = `esearch:${JSON.stringify(params)}`;
|
|
47
|
+
const cached = cache.get(cacheKey);
|
|
48
|
+
if (cached)
|
|
49
|
+
return cached;
|
|
50
|
+
const urlParams = buildParams({
|
|
51
|
+
db: params.db ?? "pubmed",
|
|
52
|
+
term: params.term,
|
|
53
|
+
retmax: String(params.retmax ?? 10),
|
|
54
|
+
sort: params.sort,
|
|
55
|
+
datetype: params.datetype,
|
|
56
|
+
mindate: params.mindate,
|
|
57
|
+
maxdate: params.maxdate,
|
|
58
|
+
retmode: "json",
|
|
59
|
+
});
|
|
60
|
+
const url = `${BASE_URL}/esearch.fcgi?${urlParams}`;
|
|
61
|
+
const response = await rateLimitedFetch(url);
|
|
62
|
+
const data = await response.json();
|
|
63
|
+
const result = {
|
|
64
|
+
idlist: data.esearchresult?.idlist ?? [],
|
|
65
|
+
count: parseInt(data.esearchresult?.count ?? "0", 10),
|
|
66
|
+
};
|
|
67
|
+
cache.set(cacheKey, result, TTL.SEARCH);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
export async function esummary(params) {
|
|
71
|
+
if (params.id.length === 0)
|
|
72
|
+
return {};
|
|
73
|
+
const cacheKey = `esummary:${params.db ?? "pubmed"}:${params.id.join(",")}`;
|
|
74
|
+
const cached = cache.get(cacheKey);
|
|
75
|
+
if (cached)
|
|
76
|
+
return cached;
|
|
77
|
+
const urlParams = buildParams({
|
|
78
|
+
db: params.db ?? "pubmed",
|
|
79
|
+
id: params.id.join(","),
|
|
80
|
+
retmode: "json",
|
|
81
|
+
});
|
|
82
|
+
const url = `${BASE_URL}/esummary.fcgi?${urlParams}`;
|
|
83
|
+
const response = await rateLimitedFetch(url);
|
|
84
|
+
const data = await response.json();
|
|
85
|
+
const result = data.result ?? {};
|
|
86
|
+
cache.set(cacheKey, result, TTL.SUMMARY);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
export async function efetch(params) {
|
|
90
|
+
const cacheKey = `efetch:${params.db ?? "pubmed"}:${params.id}:${params.rettype ?? "xml"}`;
|
|
91
|
+
const cached = cache.get(cacheKey);
|
|
92
|
+
if (cached)
|
|
93
|
+
return cached;
|
|
94
|
+
const urlParams = buildParams({
|
|
95
|
+
db: params.db ?? "pubmed",
|
|
96
|
+
id: params.id,
|
|
97
|
+
rettype: params.rettype ?? "xml",
|
|
98
|
+
retmode: params.retmode ?? "xml",
|
|
99
|
+
});
|
|
100
|
+
const url = `${BASE_URL}/efetch.fcgi?${urlParams}`;
|
|
101
|
+
const response = await rateLimitedFetch(url);
|
|
102
|
+
const text = await response.text();
|
|
103
|
+
const ttl = params.db === "pmc" ? TTL.FULLTEXT : TTL.ABSTRACT;
|
|
104
|
+
cache.set(cacheKey, text, ttl);
|
|
105
|
+
return text;
|
|
106
|
+
}
|
|
107
|
+
export async function elink(params) {
|
|
108
|
+
const cacheKey = `elink:${JSON.stringify(params)}`;
|
|
109
|
+
const cached = cache.get(cacheKey);
|
|
110
|
+
if (cached)
|
|
111
|
+
return cached;
|
|
112
|
+
const urlParams = buildParams({
|
|
113
|
+
dbfrom: params.dbfrom ?? "pubmed",
|
|
114
|
+
db: params.db ?? "pubmed",
|
|
115
|
+
id: params.id,
|
|
116
|
+
cmd: params.cmd,
|
|
117
|
+
linkname: params.linkname,
|
|
118
|
+
retmode: "json",
|
|
119
|
+
});
|
|
120
|
+
const url = `${BASE_URL}/elink.fcgi?${urlParams}`;
|
|
121
|
+
const response = await rateLimitedFetch(url);
|
|
122
|
+
const data = await response.json();
|
|
123
|
+
const linkSets = data.linksets ?? [];
|
|
124
|
+
const links = [];
|
|
125
|
+
for (const linkSet of linkSets) {
|
|
126
|
+
const linkSetDbs = linkSet.linksetdbs ?? [];
|
|
127
|
+
for (const lsdb of linkSetDbs) {
|
|
128
|
+
const dbLinks = lsdb.links ?? [];
|
|
129
|
+
for (const link of dbLinks) {
|
|
130
|
+
if (typeof link === "object" && link !== null) {
|
|
131
|
+
links.push({ id: String(link.id), score: link.score ? Number(link.score) : undefined });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
links.push({ id: String(link) });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const result = { links };
|
|
140
|
+
cache.set(cacheKey, result, TTL.RELATED);
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
export async function pmidToPmcid(pmid) {
|
|
144
|
+
const cacheKey = `pmid2pmc:${pmid}`;
|
|
145
|
+
const cached = cache.get(cacheKey);
|
|
146
|
+
if (cached !== undefined)
|
|
147
|
+
return cached;
|
|
148
|
+
const urlParams = buildParams({
|
|
149
|
+
dbfrom: "pubmed",
|
|
150
|
+
db: "pmc",
|
|
151
|
+
id: pmid,
|
|
152
|
+
linkname: "pubmed_pmc",
|
|
153
|
+
retmode: "json",
|
|
154
|
+
});
|
|
155
|
+
const url = `${BASE_URL}/elink.fcgi?${urlParams}`;
|
|
156
|
+
const response = await rateLimitedFetch(url);
|
|
157
|
+
const data = await response.json();
|
|
158
|
+
const linkSets = data.linksets ?? [];
|
|
159
|
+
let pmcid = null;
|
|
160
|
+
for (const linkSet of linkSets) {
|
|
161
|
+
const linkSetDbs = linkSet.linksetdbs ?? [];
|
|
162
|
+
for (const lsdb of linkSetDbs) {
|
|
163
|
+
if (lsdb.linkname === "pubmed_pmc" && lsdb.links?.length > 0) {
|
|
164
|
+
const rawId = lsdb.links[0];
|
|
165
|
+
pmcid = `PMC${typeof rawId === "object" ? rawId.id : rawId}`;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (pmcid)
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
cache.set(cacheKey, pmcid, TTL.ABSTRACT);
|
|
173
|
+
return pmcid;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=ncbi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ncbi.js","sourceRoot":"","sources":["../../src/lib/ncbi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface OpenFdaDrug {
|
|
2
|
+
generic_name: string;
|
|
3
|
+
brand_name: string;
|
|
4
|
+
manufacturer: string;
|
|
5
|
+
set_id: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function searchByIndication(condition: string, limit?: number): Promise<OpenFdaDrug[]>;
|
|
8
|
+
//# sourceMappingURL=openfda.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openfda.d.ts","sourceRoot":"","sources":["../../src/lib/openfda.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,KAAK,SAAK,GACT,OAAO,CAAC,WAAW,EAAE,CAAC,CAyDxB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { cache, TTL } from "./cache.js";
|
|
2
|
+
const BASE_URL = "https://api.fda.gov/drug/label.json";
|
|
3
|
+
const REQUEST_DELAY_MS = 300;
|
|
4
|
+
const TIMEOUT_MS = 15000;
|
|
5
|
+
let lastRequestTime = 0;
|
|
6
|
+
async function rateLimitedFetch(url) {
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
const elapsed = now - lastRequestTime;
|
|
9
|
+
if (elapsed < REQUEST_DELAY_MS) {
|
|
10
|
+
await new Promise((resolve) => setTimeout(resolve, REQUEST_DELAY_MS - elapsed));
|
|
11
|
+
}
|
|
12
|
+
lastRequestTime = Date.now();
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
throw new Error(`OpenFDA API error: ${response.status} ${response.statusText}`);
|
|
19
|
+
}
|
|
20
|
+
return response;
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
clearTimeout(timeout);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// OpenFDA max per request (unauthenticated)
|
|
27
|
+
const MAX_PER_PAGE = 99;
|
|
28
|
+
const MAX_PAGES = 3;
|
|
29
|
+
export async function searchByIndication(condition, limit = 20) {
|
|
30
|
+
const cacheKey = `openfda:indication:${condition.toLowerCase()}:${limit}`;
|
|
31
|
+
const cached = cache.get(cacheKey);
|
|
32
|
+
if (cached)
|
|
33
|
+
return cached;
|
|
34
|
+
// Use AND of individual terms so "rheumatoid arthritis" matches labels
|
|
35
|
+
// that say "moderately to severely active rheumatoid arthritis" etc.
|
|
36
|
+
const terms = condition.trim().split(/\s+/);
|
|
37
|
+
const query = terms
|
|
38
|
+
.map((t) => `indications_and_usage:${encodeURIComponent(t)}`)
|
|
39
|
+
.join("+AND+");
|
|
40
|
+
const seen = new Map();
|
|
41
|
+
// Always fetch all pages to maximise drug diversity, then trim.
|
|
42
|
+
// Page 1 is mostly NSAIDs; biologics appear on later pages.
|
|
43
|
+
for (let page = 0; page < MAX_PAGES; page++) {
|
|
44
|
+
const skip = page * MAX_PER_PAGE;
|
|
45
|
+
const url = `${BASE_URL}?search=${query}&limit=${MAX_PER_PAGE}&skip=${skip}`;
|
|
46
|
+
let data;
|
|
47
|
+
try {
|
|
48
|
+
const response = await rateLimitedFetch(url);
|
|
49
|
+
data = await response.json();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
if (!data.results || data.results.length === 0)
|
|
55
|
+
break;
|
|
56
|
+
for (const result of data.results) {
|
|
57
|
+
const openfda = result.openfda;
|
|
58
|
+
if (!openfda)
|
|
59
|
+
continue;
|
|
60
|
+
const genericName = openfda.generic_name?.[0] ?? "";
|
|
61
|
+
if (!genericName)
|
|
62
|
+
continue;
|
|
63
|
+
// Skip multi-ingredient kits/combos (e.g. "methylprednisolone acetate,
|
|
64
|
+
// lidocaine hydrochloride, bupivacaine hydrochloride") — these fill
|
|
65
|
+
// slots that should go to distinct therapeutic agents
|
|
66
|
+
if (genericName.includes(","))
|
|
67
|
+
continue;
|
|
68
|
+
const key = genericName.toLowerCase();
|
|
69
|
+
if (seen.has(key))
|
|
70
|
+
continue;
|
|
71
|
+
seen.set(key, {
|
|
72
|
+
generic_name: genericName,
|
|
73
|
+
brand_name: openfda.brand_name?.[0] ?? "",
|
|
74
|
+
manufacturer: openfda.manufacturer_name?.[0] ?? "",
|
|
75
|
+
set_id: openfda.spl_set_id?.[0] ?? "",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const drugs = [...seen.values()].slice(0, limit);
|
|
80
|
+
cache.set(cacheKey, drugs, TTL.SEARCH);
|
|
81
|
+
return drugs;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=openfda.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openfda.js","sourceRoot":"","sources":["../../src/lib/openfda.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare function parseXml(xml: string): any;
|
|
2
|
+
export declare function extractText(node: unknown): string;
|
|
3
|
+
export declare function parseAuthors(authorList: unknown): string[];
|
|
4
|
+
export declare function parseSummaryAuthors(authors: unknown): string[];
|
|
5
|
+
export declare function parseAbstractSections(abstractNode: unknown): Array<{
|
|
6
|
+
label: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function parseMeshTerms(meshList: unknown): string[];
|
|
10
|
+
export declare function parseKeywords(keywordList: unknown): string[];
|
|
11
|
+
export declare function parseJatsSections(body: unknown): Array<{
|
|
12
|
+
title: string;
|
|
13
|
+
content: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function parseFigureCaptions(body: unknown): string[];
|
|
16
|
+
export declare function parseTableCaptions(body: unknown): string[];
|
|
17
|
+
export declare function countReferences(back: unknown): number;
|
|
18
|
+
export declare function parseSplSections(structuredBody: unknown, requestedCodes?: string[]): Array<{
|
|
19
|
+
code: string;
|
|
20
|
+
title: string;
|
|
21
|
+
content: string;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=xml-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../src/lib/xml-parser.ts"],"names":[],"mappings":"AAwCA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAEzC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAwBjD;AAOD,wBAAgB,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,CAiB1D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAQ9D;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBnG;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAU1D;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,EAAE,CAK5D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAY1F;AA4BD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAS3D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAS1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,OAAO,EACvB,cAAc,CAAC,EAAE,MAAM,EAAE,GACxB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBzD"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
const parser = new XMLParser({
|
|
3
|
+
ignoreAttributes: false,
|
|
4
|
+
attributeNamePrefix: "@_",
|
|
5
|
+
textNodeName: "#text",
|
|
6
|
+
isArray: (name) => {
|
|
7
|
+
const arrayTags = [
|
|
8
|
+
"PubmedArticle",
|
|
9
|
+
"Author",
|
|
10
|
+
"AbstractText",
|
|
11
|
+
"MeshHeading",
|
|
12
|
+
"Keyword",
|
|
13
|
+
"sec",
|
|
14
|
+
"fig",
|
|
15
|
+
"table-wrap",
|
|
16
|
+
"ref",
|
|
17
|
+
"IdList",
|
|
18
|
+
"Link",
|
|
19
|
+
"LinkSet",
|
|
20
|
+
// SPL (DailyMed) tags
|
|
21
|
+
"component",
|
|
22
|
+
"section",
|
|
23
|
+
"paragraph",
|
|
24
|
+
"table",
|
|
25
|
+
"list",
|
|
26
|
+
"item",
|
|
27
|
+
"tbody",
|
|
28
|
+
"tr",
|
|
29
|
+
"td",
|
|
30
|
+
"thead",
|
|
31
|
+
"content",
|
|
32
|
+
"linkHtml",
|
|
33
|
+
];
|
|
34
|
+
return arrayTags.includes(name);
|
|
35
|
+
},
|
|
36
|
+
trimValues: true,
|
|
37
|
+
});
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
export function parseXml(xml) {
|
|
40
|
+
return parser.parse(xml);
|
|
41
|
+
}
|
|
42
|
+
export function extractText(node) {
|
|
43
|
+
if (typeof node === "string")
|
|
44
|
+
return node;
|
|
45
|
+
if (typeof node === "number")
|
|
46
|
+
return String(node);
|
|
47
|
+
if (node === null || node === undefined)
|
|
48
|
+
return "";
|
|
49
|
+
if (typeof node === "object") {
|
|
50
|
+
const obj = node;
|
|
51
|
+
if ("#text" in obj)
|
|
52
|
+
return String(obj["#text"]);
|
|
53
|
+
// Concatenate text from child elements
|
|
54
|
+
const parts = [];
|
|
55
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
56
|
+
if (!key.startsWith("@_")) {
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
parts.push(value.map(extractText).join(" "));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
parts.push(extractText(value));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return parts.join(" ").trim();
|
|
66
|
+
}
|
|
67
|
+
return String(node);
|
|
68
|
+
}
|
|
69
|
+
function ensureArray(val) {
|
|
70
|
+
if (val === undefined || val === null)
|
|
71
|
+
return [];
|
|
72
|
+
return Array.isArray(val) ? val : [val];
|
|
73
|
+
}
|
|
74
|
+
export function parseAuthors(authorList) {
|
|
75
|
+
if (!authorList)
|
|
76
|
+
return [];
|
|
77
|
+
const list = authorList?.Author;
|
|
78
|
+
const authors = ensureArray(list);
|
|
79
|
+
return authors.map((a) => {
|
|
80
|
+
const author = a;
|
|
81
|
+
const last = author.LastName ? String(author.LastName) : "";
|
|
82
|
+
const first = author.ForeName ? String(author.ForeName) : "";
|
|
83
|
+
const initials = author.Initials ? String(author.Initials) : "";
|
|
84
|
+
if (last && first)
|
|
85
|
+
return `${last} ${first}`;
|
|
86
|
+
if (last && initials)
|
|
87
|
+
return `${last} ${initials}`;
|
|
88
|
+
// CollectiveName for group authors
|
|
89
|
+
if (author.CollectiveName)
|
|
90
|
+
return String(author.CollectiveName);
|
|
91
|
+
return last || first || "";
|
|
92
|
+
}).filter(Boolean);
|
|
93
|
+
}
|
|
94
|
+
export function parseSummaryAuthors(authors) {
|
|
95
|
+
if (!authors)
|
|
96
|
+
return [];
|
|
97
|
+
const list = ensureArray(authors);
|
|
98
|
+
return list.map((a) => {
|
|
99
|
+
if (typeof a === "string")
|
|
100
|
+
return a;
|
|
101
|
+
const author = a;
|
|
102
|
+
return author.name ? String(author.name) : extractText(a);
|
|
103
|
+
}).filter(Boolean);
|
|
104
|
+
}
|
|
105
|
+
export function parseAbstractSections(abstractNode) {
|
|
106
|
+
if (!abstractNode)
|
|
107
|
+
return [];
|
|
108
|
+
const obj = abstractNode;
|
|
109
|
+
const textNodes = obj.AbstractText;
|
|
110
|
+
if (!textNodes)
|
|
111
|
+
return [];
|
|
112
|
+
const sections = ensureArray(textNodes);
|
|
113
|
+
return sections.map((section) => {
|
|
114
|
+
if (typeof section === "string") {
|
|
115
|
+
return { label: "", text: section };
|
|
116
|
+
}
|
|
117
|
+
const s = section;
|
|
118
|
+
const label = s["@_Label"] ? String(s["@_Label"]) : "";
|
|
119
|
+
const text = extractText(section);
|
|
120
|
+
return { label, text };
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function parseMeshTerms(meshList) {
|
|
124
|
+
if (!meshList)
|
|
125
|
+
return [];
|
|
126
|
+
const headings = ensureArray(meshList?.MeshHeading);
|
|
127
|
+
return headings.map((h) => {
|
|
128
|
+
const heading = h;
|
|
129
|
+
const descriptor = heading.DescriptorName;
|
|
130
|
+
return extractText(descriptor);
|
|
131
|
+
}).filter(Boolean);
|
|
132
|
+
}
|
|
133
|
+
export function parseKeywords(keywordList) {
|
|
134
|
+
if (!keywordList)
|
|
135
|
+
return [];
|
|
136
|
+
const keywords = ensureArray(keywordList?.Keyword);
|
|
137
|
+
return keywords.map(extractText).filter(Boolean);
|
|
138
|
+
}
|
|
139
|
+
export function parseJatsSections(body) {
|
|
140
|
+
if (!body)
|
|
141
|
+
return [];
|
|
142
|
+
const obj = body;
|
|
143
|
+
const sections = ensureArray(obj.sec);
|
|
144
|
+
return sections.map((sec) => {
|
|
145
|
+
const s = sec;
|
|
146
|
+
const title = s.title ? extractText(s.title) : "";
|
|
147
|
+
const content = extractJatsContent(s);
|
|
148
|
+
return { title, content };
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function extractJatsContent(node) {
|
|
152
|
+
if (!node || typeof node !== "object")
|
|
153
|
+
return extractText(node);
|
|
154
|
+
const obj = node;
|
|
155
|
+
const parts = [];
|
|
156
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
157
|
+
if (key === "title" || key.startsWith("@_"))
|
|
158
|
+
continue;
|
|
159
|
+
if (key === "p") {
|
|
160
|
+
const paragraphs = ensureArray(value);
|
|
161
|
+
parts.push(...paragraphs.map(extractText));
|
|
162
|
+
}
|
|
163
|
+
else if (key === "sec") {
|
|
164
|
+
// Nested sections
|
|
165
|
+
const subsections = ensureArray(value);
|
|
166
|
+
for (const sub of subsections) {
|
|
167
|
+
const subObj = sub;
|
|
168
|
+
if (subObj.title)
|
|
169
|
+
parts.push(`\n### ${extractText(subObj.title)}`);
|
|
170
|
+
parts.push(extractJatsContent(sub));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return parts.join("\n\n");
|
|
175
|
+
}
|
|
176
|
+
export function parseFigureCaptions(body) {
|
|
177
|
+
if (!body)
|
|
178
|
+
return [];
|
|
179
|
+
const figures = findAllElements(body, "fig");
|
|
180
|
+
return figures.map((fig) => {
|
|
181
|
+
const f = fig;
|
|
182
|
+
const label = f.label ? extractText(f.label) : "";
|
|
183
|
+
const caption = f.caption ? extractText(f.caption) : "";
|
|
184
|
+
return label ? `${label}: ${caption}` : caption;
|
|
185
|
+
}).filter(Boolean);
|
|
186
|
+
}
|
|
187
|
+
export function parseTableCaptions(body) {
|
|
188
|
+
if (!body)
|
|
189
|
+
return [];
|
|
190
|
+
const tables = findAllElements(body, "table-wrap");
|
|
191
|
+
return tables.map((tw) => {
|
|
192
|
+
const t = tw;
|
|
193
|
+
const label = t.label ? extractText(t.label) : "";
|
|
194
|
+
const caption = t.caption ? extractText(t.caption) : "";
|
|
195
|
+
return label ? `${label}: ${caption}` : caption;
|
|
196
|
+
}).filter(Boolean);
|
|
197
|
+
}
|
|
198
|
+
export function countReferences(back) {
|
|
199
|
+
if (!back)
|
|
200
|
+
return 0;
|
|
201
|
+
const refs = findAllElements(back, "ref");
|
|
202
|
+
return refs.length;
|
|
203
|
+
}
|
|
204
|
+
export function parseSplSections(structuredBody, requestedCodes) {
|
|
205
|
+
if (!structuredBody)
|
|
206
|
+
return [];
|
|
207
|
+
const obj = structuredBody;
|
|
208
|
+
const components = ensureArray(obj.component);
|
|
209
|
+
const results = [];
|
|
210
|
+
for (const comp of components) {
|
|
211
|
+
const c = comp;
|
|
212
|
+
const sections = ensureArray(c.section);
|
|
213
|
+
for (const sec of sections) {
|
|
214
|
+
extractSplSection(sec, results, requestedCodes);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return results;
|
|
218
|
+
}
|
|
219
|
+
function extractSplSection(section, results, requestedCodes) {
|
|
220
|
+
if (!section || typeof section !== "object")
|
|
221
|
+
return;
|
|
222
|
+
const s = section;
|
|
223
|
+
// Extract LOINC code from <code @_code>
|
|
224
|
+
const codeNode = s.code;
|
|
225
|
+
const code = codeNode?.["@_code"] ? String(codeNode["@_code"]) : "";
|
|
226
|
+
const title = s.title ? extractText(s.title) : "";
|
|
227
|
+
// Extract text content from <text> > <paragraph> elements
|
|
228
|
+
const textNode = s.text;
|
|
229
|
+
let content = "";
|
|
230
|
+
if (textNode) {
|
|
231
|
+
const paragraphs = ensureArray(textNode.paragraph);
|
|
232
|
+
content = paragraphs.map(extractText).filter(Boolean).join("\n\n");
|
|
233
|
+
if (!content) {
|
|
234
|
+
content = extractText(textNode);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (code && (!requestedCodes || requestedCodes.includes(code))) {
|
|
238
|
+
results.push({ code, title, content });
|
|
239
|
+
}
|
|
240
|
+
// Recurse into nested components > sections
|
|
241
|
+
const nestedComponents = ensureArray(s.component);
|
|
242
|
+
for (const nc of nestedComponents) {
|
|
243
|
+
const ncObj = nc;
|
|
244
|
+
const nestedSections = ensureArray(ncObj.section);
|
|
245
|
+
for (const ns of nestedSections) {
|
|
246
|
+
extractSplSection(ns, results, requestedCodes);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function findAllElements(node, tagName) {
|
|
251
|
+
const results = [];
|
|
252
|
+
if (!node || typeof node !== "object")
|
|
253
|
+
return results;
|
|
254
|
+
const obj = node;
|
|
255
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
256
|
+
if (key === tagName) {
|
|
257
|
+
const items = ensureArray(value);
|
|
258
|
+
results.push(...items);
|
|
259
|
+
}
|
|
260
|
+
else if (typeof value === "object" && value !== null) {
|
|
261
|
+
if (Array.isArray(value)) {
|
|
262
|
+
for (const item of value) {
|
|
263
|
+
results.push(...findAllElements(item, tagName));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
results.push(...findAllElements(value, tagName));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return results;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=xml-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../src/lib/xml-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract.d.ts","sourceRoot":"","sources":["../../src/tools/abstract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkH5D"}
|