@debriefer/sources 1.0.1
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 +59 -0
- package/dist/__tests__/archives/chronicling-america.test.d.ts +8 -0
- package/dist/__tests__/archives/chronicling-america.test.d.ts.map +1 -0
- package/dist/__tests__/archives/chronicling-america.test.js +151 -0
- package/dist/__tests__/archives/chronicling-america.test.js.map +1 -0
- package/dist/__tests__/archives/europeana.test.d.ts +8 -0
- package/dist/__tests__/archives/europeana.test.d.ts.map +1 -0
- package/dist/__tests__/archives/europeana.test.js +200 -0
- package/dist/__tests__/archives/europeana.test.js.map +1 -0
- package/dist/__tests__/archives/internet-archive.test.d.ts +8 -0
- package/dist/__tests__/archives/internet-archive.test.d.ts.map +1 -0
- package/dist/__tests__/archives/internet-archive.test.js +189 -0
- package/dist/__tests__/archives/internet-archive.test.js.map +1 -0
- package/dist/__tests__/archives/trove.test.d.ts +8 -0
- package/dist/__tests__/archives/trove.test.d.ts.map +1 -0
- package/dist/__tests__/archives/trove.test.js +202 -0
- package/dist/__tests__/archives/trove.test.js.map +1 -0
- package/dist/__tests__/books/google-books.test.d.ts +8 -0
- package/dist/__tests__/books/google-books.test.d.ts.map +1 -0
- package/dist/__tests__/books/google-books.test.js +221 -0
- package/dist/__tests__/books/google-books.test.js.map +1 -0
- package/dist/__tests__/books/open-library.test.d.ts +8 -0
- package/dist/__tests__/books/open-library.test.d.ts.map +1 -0
- package/dist/__tests__/books/open-library.test.js +159 -0
- package/dist/__tests__/books/open-library.test.js.map +1 -0
- package/dist/__tests__/news/guardian.test.d.ts +9 -0
- package/dist/__tests__/news/guardian.test.d.ts.map +1 -0
- package/dist/__tests__/news/guardian.test.js +224 -0
- package/dist/__tests__/news/guardian.test.js.map +1 -0
- package/dist/__tests__/news/nytimes.test.d.ts +9 -0
- package/dist/__tests__/news/nytimes.test.d.ts.map +1 -0
- package/dist/__tests__/news/nytimes.test.js +271 -0
- package/dist/__tests__/news/nytimes.test.js.map +1 -0
- package/dist/__tests__/news/site-search-source.test.d.ts +9 -0
- package/dist/__tests__/news/site-search-source.test.d.ts.map +1 -0
- package/dist/__tests__/news/site-search-source.test.js +342 -0
- package/dist/__tests__/news/site-search-source.test.js.map +1 -0
- package/dist/__tests__/obituary/find-a-grave.test.d.ts +8 -0
- package/dist/__tests__/obituary/find-a-grave.test.d.ts.map +1 -0
- package/dist/__tests__/obituary/find-a-grave.test.js +238 -0
- package/dist/__tests__/obituary/find-a-grave.test.js.map +1 -0
- package/dist/__tests__/shared/duckduckgo-search.test.d.ts +9 -0
- package/dist/__tests__/shared/duckduckgo-search.test.d.ts.map +1 -0
- package/dist/__tests__/shared/duckduckgo-search.test.js +218 -0
- package/dist/__tests__/shared/duckduckgo-search.test.js.map +1 -0
- package/dist/__tests__/shared/fetch-page.test.d.ts +9 -0
- package/dist/__tests__/shared/fetch-page.test.d.ts.map +1 -0
- package/dist/__tests__/shared/fetch-page.test.js +281 -0
- package/dist/__tests__/shared/fetch-page.test.js.map +1 -0
- package/dist/__tests__/shared/html-utils.test.d.ts +2 -0
- package/dist/__tests__/shared/html-utils.test.d.ts.map +1 -0
- package/dist/__tests__/shared/html-utils.test.js +169 -0
- package/dist/__tests__/shared/html-utils.test.js.map +1 -0
- package/dist/__tests__/shared/readability-extract.test.d.ts +2 -0
- package/dist/__tests__/shared/readability-extract.test.d.ts.map +1 -0
- package/dist/__tests__/shared/readability-extract.test.js +107 -0
- package/dist/__tests__/shared/readability-extract.test.js.map +1 -0
- package/dist/__tests__/shared/sanitize-text.test.d.ts +2 -0
- package/dist/__tests__/shared/sanitize-text.test.d.ts.map +1 -0
- package/dist/__tests__/shared/sanitize-text.test.js +77 -0
- package/dist/__tests__/shared/sanitize-text.test.js.map +1 -0
- package/dist/__tests__/shared/search-utils.test.d.ts +2 -0
- package/dist/__tests__/shared/search-utils.test.d.ts.map +1 -0
- package/dist/__tests__/shared/search-utils.test.js +26 -0
- package/dist/__tests__/shared/search-utils.test.js.map +1 -0
- package/dist/__tests__/structured/wikidata.test.d.ts +9 -0
- package/dist/__tests__/structured/wikidata.test.d.ts.map +1 -0
- package/dist/__tests__/structured/wikidata.test.js +509 -0
- package/dist/__tests__/structured/wikidata.test.js.map +1 -0
- package/dist/__tests__/structured/wikipedia.test.d.ts +9 -0
- package/dist/__tests__/structured/wikipedia.test.d.ts.map +1 -0
- package/dist/__tests__/structured/wikipedia.test.js +643 -0
- package/dist/__tests__/structured/wikipedia.test.js.map +1 -0
- package/dist/__tests__/web-search/base.test.d.ts +9 -0
- package/dist/__tests__/web-search/base.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/base.test.js +622 -0
- package/dist/__tests__/web-search/base.test.js.map +1 -0
- package/dist/__tests__/web-search/bing.test.d.ts +10 -0
- package/dist/__tests__/web-search/bing.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/bing.test.js +277 -0
- package/dist/__tests__/web-search/bing.test.js.map +1 -0
- package/dist/__tests__/web-search/brave.test.d.ts +10 -0
- package/dist/__tests__/web-search/brave.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/brave.test.js +264 -0
- package/dist/__tests__/web-search/brave.test.js.map +1 -0
- package/dist/__tests__/web-search/duckduckgo.test.d.ts +10 -0
- package/dist/__tests__/web-search/duckduckgo.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/duckduckgo.test.js +107 -0
- package/dist/__tests__/web-search/duckduckgo.test.js.map +1 -0
- package/dist/__tests__/web-search/google.test.d.ts +9 -0
- package/dist/__tests__/web-search/google.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/google.test.js +189 -0
- package/dist/__tests__/web-search/google.test.js.map +1 -0
- package/dist/archives/chronicling-america.d.ts +33 -0
- package/dist/archives/chronicling-america.d.ts.map +1 -0
- package/dist/archives/chronicling-america.js +85 -0
- package/dist/archives/chronicling-america.js.map +1 -0
- package/dist/archives/europeana.d.ts +37 -0
- package/dist/archives/europeana.d.ts.map +1 -0
- package/dist/archives/europeana.js +92 -0
- package/dist/archives/europeana.js.map +1 -0
- package/dist/archives/internet-archive.d.ts +32 -0
- package/dist/archives/internet-archive.d.ts.map +1 -0
- package/dist/archives/internet-archive.js +90 -0
- package/dist/archives/internet-archive.js.map +1 -0
- package/dist/archives/trove.d.ts +37 -0
- package/dist/archives/trove.d.ts.map +1 -0
- package/dist/archives/trove.js +97 -0
- package/dist/archives/trove.js.map +1 -0
- package/dist/books/google-books.d.ts +48 -0
- package/dist/books/google-books.d.ts.map +1 -0
- package/dist/books/google-books.js +111 -0
- package/dist/books/google-books.js.map +1 -0
- package/dist/books/open-library.d.ts +44 -0
- package/dist/books/open-library.d.ts.map +1 -0
- package/dist/books/open-library.js +103 -0
- package/dist/books/open-library.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/news/guardian.d.ts +51 -0
- package/dist/news/guardian.d.ts.map +1 -0
- package/dist/news/guardian.js +131 -0
- package/dist/news/guardian.js.map +1 -0
- package/dist/news/nytimes.d.ts +27 -0
- package/dist/news/nytimes.d.ts.map +1 -0
- package/dist/news/nytimes.js +104 -0
- package/dist/news/nytimes.js.map +1 -0
- package/dist/news/site-search-source.d.ts +89 -0
- package/dist/news/site-search-source.d.ts.map +1 -0
- package/dist/news/site-search-source.js +182 -0
- package/dist/news/site-search-source.js.map +1 -0
- package/dist/news/sources.d.ts +52 -0
- package/dist/news/sources.d.ts.map +1 -0
- package/dist/news/sources.js +276 -0
- package/dist/news/sources.js.map +1 -0
- package/dist/obituary/find-a-grave.d.ts +43 -0
- package/dist/obituary/find-a-grave.d.ts.map +1 -0
- package/dist/obituary/find-a-grave.js +173 -0
- package/dist/obituary/find-a-grave.js.map +1 -0
- package/dist/shared/duckduckgo-search.d.ts +86 -0
- package/dist/shared/duckduckgo-search.d.ts.map +1 -0
- package/dist/shared/duckduckgo-search.js +218 -0
- package/dist/shared/duckduckgo-search.js.map +1 -0
- package/dist/shared/fetch-page.d.ts +50 -0
- package/dist/shared/fetch-page.d.ts.map +1 -0
- package/dist/shared/fetch-page.js +212 -0
- package/dist/shared/fetch-page.js.map +1 -0
- package/dist/shared/html-utils.d.ts +99 -0
- package/dist/shared/html-utils.d.ts.map +1 -0
- package/dist/shared/html-utils.js +246 -0
- package/dist/shared/html-utils.js.map +1 -0
- package/dist/shared/readability-extract.d.ts +33 -0
- package/dist/shared/readability-extract.d.ts.map +1 -0
- package/dist/shared/readability-extract.js +45 -0
- package/dist/shared/readability-extract.js.map +1 -0
- package/dist/shared/sanitize-text.d.ts +24 -0
- package/dist/shared/sanitize-text.d.ts.map +1 -0
- package/dist/shared/sanitize-text.js +49 -0
- package/dist/shared/sanitize-text.js.map +1 -0
- package/dist/shared/search-utils.d.ts +18 -0
- package/dist/shared/search-utils.d.ts.map +1 -0
- package/dist/shared/search-utils.js +20 -0
- package/dist/shared/search-utils.js.map +1 -0
- package/dist/structured/wikidata.d.ts +128 -0
- package/dist/structured/wikidata.d.ts.map +1 -0
- package/dist/structured/wikidata.js +361 -0
- package/dist/structured/wikidata.js.map +1 -0
- package/dist/structured/wikipedia.d.ts +184 -0
- package/dist/structured/wikipedia.d.ts.map +1 -0
- package/dist/structured/wikipedia.js +275 -0
- package/dist/structured/wikipedia.js.map +1 -0
- package/dist/web-search/base.d.ts +128 -0
- package/dist/web-search/base.d.ts.map +1 -0
- package/dist/web-search/base.js +251 -0
- package/dist/web-search/base.js.map +1 -0
- package/dist/web-search/bing.d.ts +21 -0
- package/dist/web-search/bing.d.ts.map +1 -0
- package/dist/web-search/bing.js +53 -0
- package/dist/web-search/bing.js.map +1 -0
- package/dist/web-search/brave.d.ts +21 -0
- package/dist/web-search/brave.d.ts.map +1 -0
- package/dist/web-search/brave.js +56 -0
- package/dist/web-search/brave.js.map +1 -0
- package/dist/web-search/duckduckgo.d.ts +15 -0
- package/dist/web-search/duckduckgo.d.ts.map +1 -0
- package/dist/web-search/duckduckgo.js +21 -0
- package/dist/web-search/duckduckgo.js.map +1 -0
- package/dist/web-search/google.d.ts +24 -0
- package/dist/web-search/google.d.ts.map +1 -0
- package/dist/web-search/google.js +48 -0
- package/dist/web-search/google.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brave.test.js","sourceRoot":"","sources":["../../../src/__tests__/web-search/brave.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for DuckDuckGoSearchSource.
|
|
3
|
+
*
|
|
4
|
+
* Mocks the shared searchDuckDuckGo utility and the WebSearchBase pipeline
|
|
5
|
+
* utilities (fetchPage, extractArticleContent) so the tests only exercise
|
|
6
|
+
* DuckDuckGo-specific code: metadata, isAvailable, performSearch delegation,
|
|
7
|
+
* and the factory function.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=duckduckgo.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckduckgo.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/web-search/duckduckgo.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for DuckDuckGoSearchSource.
|
|
3
|
+
*
|
|
4
|
+
* Mocks the shared searchDuckDuckGo utility and the WebSearchBase pipeline
|
|
5
|
+
* utilities (fetchPage, extractArticleContent) so the tests only exercise
|
|
6
|
+
* DuckDuckGo-specific code: metadata, isAvailable, performSearch delegation,
|
|
7
|
+
* and the factory function.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
10
|
+
import { ReliabilityTier } from "@debriefer/core";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Mocks — must be declared before importing the module under test
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const mockSearchDDG = vi.fn();
|
|
15
|
+
vi.mock("../../shared/duckduckgo-search.js", () => ({
|
|
16
|
+
searchDuckDuckGo: (...args) => mockSearchDDG(...args),
|
|
17
|
+
}));
|
|
18
|
+
vi.mock("../../shared/fetch-page.js", () => ({
|
|
19
|
+
fetchPage: vi.fn().mockResolvedValue({ content: "", url: "", fetchMethod: "none" }),
|
|
20
|
+
}));
|
|
21
|
+
vi.mock("../../shared/readability-extract.js", () => ({
|
|
22
|
+
extractArticleContent: vi.fn().mockReturnValue(null),
|
|
23
|
+
}));
|
|
24
|
+
import { DuckDuckGoSearchSource, duckduckgoSearch } from "../../web-search/duckduckgo.js";
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Lifecycle
|
|
27
|
+
// ============================================================================
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
mockSearchDDG.mockReset();
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
vi.restoreAllMocks();
|
|
33
|
+
});
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Tests
|
|
36
|
+
// ============================================================================
|
|
37
|
+
describe("DuckDuckGoSearchSource", () => {
|
|
38
|
+
// ==========================================================================
|
|
39
|
+
// Metadata
|
|
40
|
+
// ==========================================================================
|
|
41
|
+
describe("metadata", () => {
|
|
42
|
+
it("has correct name, type, reliabilityTier, domain, isFree, and estimatedCostPerQuery", () => {
|
|
43
|
+
const source = new DuckDuckGoSearchSource();
|
|
44
|
+
expect(source.name).toBe("DuckDuckGo");
|
|
45
|
+
expect(source.type).toBe("duckduckgo-search");
|
|
46
|
+
expect(source.reliabilityTier).toBe(ReliabilityTier.SEARCH_AGGREGATOR);
|
|
47
|
+
expect(source.domain).toBe("html.duckduckgo.com");
|
|
48
|
+
expect(source.isFree).toBe(true);
|
|
49
|
+
expect(source.estimatedCostPerQuery).toBe(0);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
// ==========================================================================
|
|
53
|
+
// isAvailable — always true (no API key needed)
|
|
54
|
+
// ==========================================================================
|
|
55
|
+
describe("isAvailable", () => {
|
|
56
|
+
it("always returns true since no API key is required", () => {
|
|
57
|
+
const source = new DuckDuckGoSearchSource();
|
|
58
|
+
expect(source.isAvailable()).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
// ==========================================================================
|
|
62
|
+
// performSearch — delegates to shared searchDuckDuckGo
|
|
63
|
+
// ==========================================================================
|
|
64
|
+
describe("performSearch", () => {
|
|
65
|
+
it("delegates to shared searchDuckDuckGo with correct query", async () => {
|
|
66
|
+
const mockResults = [
|
|
67
|
+
{ url: "https://example.com/1", title: "Result 1", snippet: "Snippet 1" },
|
|
68
|
+
{ url: "https://example.com/2", title: "Result 2", snippet: "Snippet 2" },
|
|
69
|
+
];
|
|
70
|
+
mockSearchDDG.mockResolvedValue(mockResults);
|
|
71
|
+
const source = new DuckDuckGoSearchSource();
|
|
72
|
+
const signal = AbortSignal.timeout(5000);
|
|
73
|
+
await source.lookup({ id: 1, name: "test query" }, signal);
|
|
74
|
+
expect(mockSearchDDG).toHaveBeenCalledTimes(1);
|
|
75
|
+
// Verify query was passed through
|
|
76
|
+
const callArgs = mockSearchDDG.mock.calls[0][0];
|
|
77
|
+
expect(callArgs.query).toBe("test query");
|
|
78
|
+
});
|
|
79
|
+
it("passes signal to searchDuckDuckGo", async () => {
|
|
80
|
+
mockSearchDDG.mockResolvedValue([]);
|
|
81
|
+
const source = new DuckDuckGoSearchSource();
|
|
82
|
+
const signal = AbortSignal.timeout(5000);
|
|
83
|
+
await source.lookup({ id: 1, name: "test" }, signal);
|
|
84
|
+
expect(mockSearchDDG).toHaveBeenCalledTimes(1);
|
|
85
|
+
// Verify a signal was passed (may be wrapped by AbortSignal.any in base class)
|
|
86
|
+
const callArgs = mockSearchDDG.mock.calls[0][0];
|
|
87
|
+
expect(callArgs.signal).toBeDefined();
|
|
88
|
+
expect(callArgs.signal).toBeInstanceOf(AbortSignal);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
// ==========================================================================
|
|
92
|
+
// Factory function
|
|
93
|
+
// ==========================================================================
|
|
94
|
+
describe("factory function", () => {
|
|
95
|
+
it("duckduckgoSearch() creates a DuckDuckGoSearchSource instance", () => {
|
|
96
|
+
const source = duckduckgoSearch();
|
|
97
|
+
expect(source).toBeInstanceOf(DuckDuckGoSearchSource);
|
|
98
|
+
expect(source.name).toBe("DuckDuckGo");
|
|
99
|
+
expect(source.isAvailable()).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it("duckduckgoSearch() passes options through to the constructor", () => {
|
|
102
|
+
const source = duckduckgoSearch({ maxLinksToFollow: 5 });
|
|
103
|
+
expect(source).toBeInstanceOf(DuckDuckGoSearchSource);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=duckduckgo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckduckgo.test.js","sourceRoot":"","sources":["../../../src/__tests__/web-search/duckduckgo.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the Google Custom Search source.
|
|
3
|
+
*
|
|
4
|
+
* Mocks global fetch and the shared WebSearchBase pipeline utilities
|
|
5
|
+
* (fetch-page, readability-extract) so the tests only exercise
|
|
6
|
+
* Google-specific code: metadata, isAvailable, performSearch, and the factory.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=google.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/web-search/google.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the Google Custom Search source.
|
|
3
|
+
*
|
|
4
|
+
* Mocks global fetch and the shared WebSearchBase pipeline utilities
|
|
5
|
+
* (fetch-page, readability-extract) so the tests only exercise
|
|
6
|
+
* Google-specific code: metadata, isAvailable, performSearch, and the factory.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
9
|
+
import { ReliabilityTier } from "@debriefer/core";
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Mocks — must be declared before importing the module under test
|
|
12
|
+
// ============================================================================
|
|
13
|
+
vi.mock("../../shared/fetch-page.js", () => ({
|
|
14
|
+
fetchPage: vi.fn().mockResolvedValue({ content: "", url: "", fetchMethod: "none" }),
|
|
15
|
+
}));
|
|
16
|
+
vi.mock("../../shared/readability-extract.js", () => ({
|
|
17
|
+
extractArticleContent: vi.fn().mockReturnValue(null),
|
|
18
|
+
}));
|
|
19
|
+
import { GoogleSearchSource, googleSearch } from "../../web-search/google.js";
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Helpers
|
|
22
|
+
// ============================================================================
|
|
23
|
+
const VALID_OPTIONS = { apiKey: "test-key", cx: "test-cx" };
|
|
24
|
+
function makeGoogleResponse(items) {
|
|
25
|
+
return items ? { items } : {};
|
|
26
|
+
}
|
|
27
|
+
function mockFetchSuccess(body) {
|
|
28
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
29
|
+
ok: true,
|
|
30
|
+
status: 200,
|
|
31
|
+
statusText: "OK",
|
|
32
|
+
json: () => Promise.resolve(body),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
function mockFetchError(status, statusText) {
|
|
36
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
37
|
+
ok: false,
|
|
38
|
+
status,
|
|
39
|
+
statusText,
|
|
40
|
+
json: () => Promise.resolve({}),
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Lifecycle
|
|
45
|
+
// ============================================================================
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
vi.stubGlobal("fetch", vi.fn());
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
vi.restoreAllMocks();
|
|
51
|
+
vi.unstubAllGlobals();
|
|
52
|
+
});
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Tests
|
|
55
|
+
// ============================================================================
|
|
56
|
+
describe("GoogleSearchSource", () => {
|
|
57
|
+
// ==========================================================================
|
|
58
|
+
// Metadata
|
|
59
|
+
// ==========================================================================
|
|
60
|
+
describe("metadata", () => {
|
|
61
|
+
it("has correct name, type, reliabilityTier, isFree, and cost", () => {
|
|
62
|
+
const source = new GoogleSearchSource(VALID_OPTIONS);
|
|
63
|
+
expect(source.name).toBe("Google Search");
|
|
64
|
+
expect(source.type).toBe("google-search");
|
|
65
|
+
expect(source.reliabilityTier).toBe(ReliabilityTier.SEARCH_AGGREGATOR);
|
|
66
|
+
expect(source.isFree).toBe(false);
|
|
67
|
+
expect(source.estimatedCostPerQuery).toBe(0.005);
|
|
68
|
+
expect(source.domain).toBe("www.googleapis.com");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
// ==========================================================================
|
|
72
|
+
// isAvailable
|
|
73
|
+
// ==========================================================================
|
|
74
|
+
describe("isAvailable", () => {
|
|
75
|
+
it("returns true when both apiKey and cx are provided", () => {
|
|
76
|
+
const source = new GoogleSearchSource({ apiKey: "key", cx: "cx-id" });
|
|
77
|
+
expect(source.isAvailable()).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it("returns false when apiKey is missing", () => {
|
|
80
|
+
const source = new GoogleSearchSource({ cx: "cx-id" });
|
|
81
|
+
expect(source.isAvailable()).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
it("returns false when cx is missing", () => {
|
|
84
|
+
const source = new GoogleSearchSource({ apiKey: "key" });
|
|
85
|
+
expect(source.isAvailable()).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
it("returns false when both apiKey and cx are missing", () => {
|
|
88
|
+
const source = new GoogleSearchSource();
|
|
89
|
+
expect(source.isAvailable()).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
// ==========================================================================
|
|
93
|
+
// performSearch — correct API call
|
|
94
|
+
// ==========================================================================
|
|
95
|
+
describe("performSearch", () => {
|
|
96
|
+
it("calls Google CSE API with correct URL params", async () => {
|
|
97
|
+
const items = [
|
|
98
|
+
{ title: "Result 1", link: "https://example.com/1", snippet: "Snippet 1" },
|
|
99
|
+
{ title: "Result 2", link: "https://example.com/2", snippet: "Snippet 2" },
|
|
100
|
+
];
|
|
101
|
+
mockFetchSuccess(makeGoogleResponse(items));
|
|
102
|
+
const source = new GoogleSearchSource({
|
|
103
|
+
...VALID_OPTIONS,
|
|
104
|
+
maxResults: 5,
|
|
105
|
+
});
|
|
106
|
+
// We call lookup which goes through the base class pipeline.
|
|
107
|
+
// Since fetchPage and extractArticleContent are mocked to return nothing,
|
|
108
|
+
// the result will be null — but we can still verify the fetch call.
|
|
109
|
+
const signal = AbortSignal.timeout(5000);
|
|
110
|
+
await source.lookup({ id: 1, name: "John Wayne" }, signal);
|
|
111
|
+
const fetchMock = vi.mocked(globalThis.fetch);
|
|
112
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
113
|
+
const callUrl = new URL(fetchMock.mock.calls[0][0]);
|
|
114
|
+
expect(callUrl.origin + callUrl.pathname).toBe("https://www.googleapis.com/customsearch/v1");
|
|
115
|
+
expect(callUrl.searchParams.get("key")).toBe("test-key");
|
|
116
|
+
expect(callUrl.searchParams.get("cx")).toBe("test-cx");
|
|
117
|
+
expect(callUrl.searchParams.get("q")).toBe("John Wayne");
|
|
118
|
+
expect(callUrl.searchParams.get("num")).toBe("5");
|
|
119
|
+
// Verify a signal is passed through (may be wrapped by AbortSignal.any)
|
|
120
|
+
const passedOptions = fetchMock.mock.calls[0][1];
|
|
121
|
+
expect(passedOptions.signal).toBeDefined();
|
|
122
|
+
expect(passedOptions.signal).toBeInstanceOf(AbortSignal);
|
|
123
|
+
});
|
|
124
|
+
it("uses default maxResults of 10", async () => {
|
|
125
|
+
mockFetchSuccess(makeGoogleResponse([]));
|
|
126
|
+
const source = new GoogleSearchSource(VALID_OPTIONS);
|
|
127
|
+
await source.lookup({ id: 1, name: "Jane Doe" }, AbortSignal.timeout(5000));
|
|
128
|
+
const fetchMock = vi.mocked(globalThis.fetch);
|
|
129
|
+
const callUrl = new URL(fetchMock.mock.calls[0][0]);
|
|
130
|
+
expect(callUrl.searchParams.get("num")).toBe("10");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// ==========================================================================
|
|
134
|
+
// API error handling
|
|
135
|
+
// ==========================================================================
|
|
136
|
+
describe("API error handling", () => {
|
|
137
|
+
it("returns null on non-OK HTTP response", async () => {
|
|
138
|
+
mockFetchError(403, "Forbidden");
|
|
139
|
+
const source = new GoogleSearchSource(VALID_OPTIONS);
|
|
140
|
+
const result = await source.lookup({ id: 1, name: "John Wayne" }, AbortSignal.timeout(5000));
|
|
141
|
+
// BaseResearchSource.lookup() catches errors and returns null
|
|
142
|
+
expect(result).toBeNull();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
// ==========================================================================
|
|
146
|
+
// Empty / no items response
|
|
147
|
+
// ==========================================================================
|
|
148
|
+
describe("empty results", () => {
|
|
149
|
+
it("returns null when response has no items", async () => {
|
|
150
|
+
mockFetchSuccess(makeGoogleResponse(null));
|
|
151
|
+
const source = new GoogleSearchSource(VALID_OPTIONS);
|
|
152
|
+
const result = await source.lookup({ id: 1, name: "Obscure Person" }, AbortSignal.timeout(5000));
|
|
153
|
+
expect(result).toBeNull();
|
|
154
|
+
});
|
|
155
|
+
it("returns null when items array is empty", async () => {
|
|
156
|
+
mockFetchSuccess(makeGoogleResponse([]));
|
|
157
|
+
const source = new GoogleSearchSource(VALID_OPTIONS);
|
|
158
|
+
const result = await source.lookup({ id: 1, name: "Obscure Person" }, AbortSignal.timeout(5000));
|
|
159
|
+
expect(result).toBeNull();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
// ==========================================================================
|
|
163
|
+
// No credentials → empty results (no API call)
|
|
164
|
+
// ==========================================================================
|
|
165
|
+
describe("missing credentials", () => {
|
|
166
|
+
it("returns null without calling fetch when credentials are missing", async () => {
|
|
167
|
+
const source = new GoogleSearchSource();
|
|
168
|
+
const result = await source.lookup({ id: 1, name: "John Wayne" }, AbortSignal.timeout(5000));
|
|
169
|
+
expect(result).toBeNull();
|
|
170
|
+
expect(globalThis.fetch).not.toHaveBeenCalled();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
// ==========================================================================
|
|
174
|
+
// Factory function
|
|
175
|
+
// ==========================================================================
|
|
176
|
+
describe("factory function", () => {
|
|
177
|
+
it("creates a GoogleSearchSource instance", () => {
|
|
178
|
+
const source = googleSearch(VALID_OPTIONS);
|
|
179
|
+
expect(source).toBeInstanceOf(GoogleSearchSource);
|
|
180
|
+
expect(source.name).toBe("Google Search");
|
|
181
|
+
});
|
|
182
|
+
it("creates instance with default options when no options provided", () => {
|
|
183
|
+
const source = googleSearch();
|
|
184
|
+
expect(source).toBeInstanceOf(GoogleSearchSource);
|
|
185
|
+
expect(source.isAvailable()).toBe(false);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=google.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.test.js","sourceRoot":"","sources":["../../../src/__tests__/web-search/google.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chronicling America (Library of Congress) source.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Library of Congress Chronicling America digital newspaper
|
|
5
|
+
* archive for historical newspaper articles about a research subject.
|
|
6
|
+
* No authentication required.
|
|
7
|
+
*/
|
|
8
|
+
import { BaseResearchSource, ReliabilityTier, type BaseSourceOptions, type ResearchSubject, type RawFinding } from "@debriefer/core";
|
|
9
|
+
export type ChroniclingAmericaOptions = BaseSourceOptions;
|
|
10
|
+
/**
|
|
11
|
+
* Research source backed by the Library of Congress Chronicling America API.
|
|
12
|
+
*
|
|
13
|
+
* Searches historical digitized US newspapers for mentions of a subject.
|
|
14
|
+
* Free, no API key required.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ChroniclingAmericaSource extends BaseResearchSource<ResearchSubject> {
|
|
17
|
+
readonly name = "Chronicling America";
|
|
18
|
+
readonly type = "chronicling-america";
|
|
19
|
+
readonly reliabilityTier = ReliabilityTier.ARCHIVAL;
|
|
20
|
+
readonly domain = "www.loc.gov";
|
|
21
|
+
readonly isFree = true;
|
|
22
|
+
readonly estimatedCostPerQuery = 0;
|
|
23
|
+
constructor(options?: ChroniclingAmericaOptions);
|
|
24
|
+
protected fetchResult(subject: ResearchSubject, signal: AbortSignal): Promise<RawFinding | null>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a Chronicling America source instance.
|
|
28
|
+
*
|
|
29
|
+
* @param options - Source options (rateLimitMs, etc.)
|
|
30
|
+
* @returns A configured ChroniclingAmericaSource
|
|
31
|
+
*/
|
|
32
|
+
export declare function chroniclingAmerica(options?: ChroniclingAmericaOptions): ChroniclingAmericaSource;
|
|
33
|
+
//# sourceMappingURL=chronicling-america.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chronicling-america.d.ts","sourceRoot":"","sources":["../../src/archives/chronicling-america.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAA;AAaxB,MAAM,MAAM,yBAAyB,GAAG,iBAAiB,CAAA;AAmBzD;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,kBAAkB,CAAC,eAAe,CAAC;IAC/E,QAAQ,CAAC,IAAI,yBAAwB;IACrC,QAAQ,CAAC,IAAI,yBAAwB;IACrC,QAAQ,CAAC,eAAe,4BAA2B;IACnD,QAAQ,CAAC,MAAM,iBAAgB;IAC/B,QAAQ,CAAC,MAAM,QAAO;IACtB,QAAQ,CAAC,qBAAqB,KAAI;gBAEtB,OAAO,GAAE,yBAA8B;cAInC,WAAW,CACzB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CA8C9B;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,wBAAwB,CAEhG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chronicling America (Library of Congress) source.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Library of Congress Chronicling America digital newspaper
|
|
5
|
+
* archive for historical newspaper articles about a research subject.
|
|
6
|
+
* No authentication required.
|
|
7
|
+
*/
|
|
8
|
+
import { BaseResearchSource, ReliabilityTier, } from "@debriefer/core";
|
|
9
|
+
import { sanitizeSourceText } from "../shared/sanitize-text.js";
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Constants
|
|
12
|
+
// ============================================================================
|
|
13
|
+
const LOC_API_URL = "https://www.loc.gov/collections/chronicling-america/";
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// ChroniclingAmericaSource
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Research source backed by the Library of Congress Chronicling America API.
|
|
19
|
+
*
|
|
20
|
+
* Searches historical digitized US newspapers for mentions of a subject.
|
|
21
|
+
* Free, no API key required.
|
|
22
|
+
*/
|
|
23
|
+
export class ChroniclingAmericaSource extends BaseResearchSource {
|
|
24
|
+
name = "Chronicling America";
|
|
25
|
+
type = "chronicling-america";
|
|
26
|
+
reliabilityTier = ReliabilityTier.ARCHIVAL;
|
|
27
|
+
domain = "www.loc.gov";
|
|
28
|
+
isFree = true;
|
|
29
|
+
estimatedCostPerQuery = 0;
|
|
30
|
+
constructor(options = {}) {
|
|
31
|
+
super({ rateLimitMs: 1000, ...options });
|
|
32
|
+
}
|
|
33
|
+
async fetchResult(subject, signal) {
|
|
34
|
+
const url = new URL(LOC_API_URL);
|
|
35
|
+
url.searchParams.set("q", `"${subject.name}"`);
|
|
36
|
+
url.searchParams.set("fo", "json");
|
|
37
|
+
url.searchParams.set("c", "5");
|
|
38
|
+
const response = await fetch(url.toString(), { signal });
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`Chronicling America API error: HTTP ${response.status} ${response.statusText}`);
|
|
41
|
+
}
|
|
42
|
+
const data = (await response.json());
|
|
43
|
+
if (!data.results?.length)
|
|
44
|
+
return null;
|
|
45
|
+
// Combine title + description from all results
|
|
46
|
+
const parts = [];
|
|
47
|
+
for (const result of data.results) {
|
|
48
|
+
if (result.title)
|
|
49
|
+
parts.push(result.title);
|
|
50
|
+
if (result.description?.length) {
|
|
51
|
+
parts.push(result.description.join(" "));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const text = parts.join("\n\n");
|
|
55
|
+
if (!text.trim())
|
|
56
|
+
return null;
|
|
57
|
+
const sanitized = sanitizeSourceText(text);
|
|
58
|
+
if (!sanitized)
|
|
59
|
+
return null;
|
|
60
|
+
const firstWithUrl = data.results.find((r) => r.url);
|
|
61
|
+
return {
|
|
62
|
+
text: sanitized,
|
|
63
|
+
confidence: -1,
|
|
64
|
+
costUsd: 0,
|
|
65
|
+
url: firstWithUrl?.url,
|
|
66
|
+
publication: "Chronicling America (Library of Congress)",
|
|
67
|
+
metadata: {
|
|
68
|
+
title: data.results[0]?.title ?? "",
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Factory
|
|
75
|
+
// ============================================================================
|
|
76
|
+
/**
|
|
77
|
+
* Create a Chronicling America source instance.
|
|
78
|
+
*
|
|
79
|
+
* @param options - Source options (rateLimitMs, etc.)
|
|
80
|
+
* @returns A configured ChroniclingAmericaSource
|
|
81
|
+
*/
|
|
82
|
+
export function chroniclingAmerica(options) {
|
|
83
|
+
return new ChroniclingAmericaSource(options);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=chronicling-america.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chronicling-america.js","sourceRoot":"","sources":["../../src/archives/chronicling-america.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Europeana source.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Europeana Search API for cultural heritage records about
|
|
5
|
+
* a research subject. Requires a free API key from Europeana.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseResearchSource, ReliabilityTier, type BaseSourceOptions, type ResearchSubject, type RawFinding } from "@debriefer/core";
|
|
8
|
+
export interface EuropeanaOptions extends BaseSourceOptions {
|
|
9
|
+
/** Europeana API key. Defaults to process.env.EUROPEANA_API_KEY. */
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Research source backed by the Europeana Search API.
|
|
14
|
+
*
|
|
15
|
+
* Searches European cultural heritage collections for records about
|
|
16
|
+
* a subject. Requires a free API key.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EuropeanaSource extends BaseResearchSource<ResearchSubject> {
|
|
19
|
+
readonly name = "Europeana";
|
|
20
|
+
readonly type = "europeana";
|
|
21
|
+
readonly reliabilityTier = ReliabilityTier.ARCHIVAL;
|
|
22
|
+
readonly domain = "api.europeana.eu";
|
|
23
|
+
readonly isFree = true;
|
|
24
|
+
readonly estimatedCostPerQuery = 0;
|
|
25
|
+
private apiKey;
|
|
26
|
+
constructor(options?: EuropeanaOptions);
|
|
27
|
+
isAvailable(): boolean;
|
|
28
|
+
protected fetchResult(subject: ResearchSubject, signal: AbortSignal): Promise<RawFinding | null>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a Europeana source instance.
|
|
32
|
+
*
|
|
33
|
+
* @param options - Europeana-specific options (apiKey, rateLimitMs, etc.)
|
|
34
|
+
* @returns A configured EuropeanaSource
|
|
35
|
+
*/
|
|
36
|
+
export declare function europeana(options?: EuropeanaOptions): EuropeanaSource;
|
|
37
|
+
//# sourceMappingURL=europeana.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"europeana.d.ts","sourceRoot":"","sources":["../../src/archives/europeana.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAA;AAaxB,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAoBD;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,kBAAkB,CAAC,eAAe,CAAC;IACtE,QAAQ,CAAC,IAAI,eAAc;IAC3B,QAAQ,CAAC,IAAI,eAAc;IAC3B,QAAQ,CAAC,eAAe,4BAA2B;IACnD,QAAQ,CAAC,MAAM,sBAAqB;IACpC,QAAQ,CAAC,MAAM,QAAO;IACtB,QAAQ,CAAC,qBAAqB,KAAI;IAElC,OAAO,CAAC,MAAM,CAAoB;gBAEtB,OAAO,GAAE,gBAAqB;IAKjC,WAAW,IAAI,OAAO;cAIf,WAAW,CACzB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CA8C9B;AAMD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAErE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Europeana source.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Europeana Search API for cultural heritage records about
|
|
5
|
+
* a research subject. Requires a free API key from Europeana.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseResearchSource, ReliabilityTier, } from "@debriefer/core";
|
|
8
|
+
import { sanitizeSourceText } from "../shared/sanitize-text.js";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Constants
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const EUROPEANA_API_URL = "https://api.europeana.eu/record/v2/search.json";
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// EuropeanaSource
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Research source backed by the Europeana Search API.
|
|
18
|
+
*
|
|
19
|
+
* Searches European cultural heritage collections for records about
|
|
20
|
+
* a subject. Requires a free API key.
|
|
21
|
+
*/
|
|
22
|
+
export class EuropeanaSource extends BaseResearchSource {
|
|
23
|
+
name = "Europeana";
|
|
24
|
+
type = "europeana";
|
|
25
|
+
reliabilityTier = ReliabilityTier.ARCHIVAL;
|
|
26
|
+
domain = "api.europeana.eu";
|
|
27
|
+
isFree = true;
|
|
28
|
+
estimatedCostPerQuery = 0;
|
|
29
|
+
apiKey;
|
|
30
|
+
constructor(options = {}) {
|
|
31
|
+
super({ rateLimitMs: 1000, ...options });
|
|
32
|
+
this.apiKey = options.apiKey ?? process.env.EUROPEANA_API_KEY;
|
|
33
|
+
}
|
|
34
|
+
isAvailable() {
|
|
35
|
+
return Boolean(this.apiKey);
|
|
36
|
+
}
|
|
37
|
+
async fetchResult(subject, signal) {
|
|
38
|
+
if (!this.apiKey)
|
|
39
|
+
return null;
|
|
40
|
+
const url = new URL(EUROPEANA_API_URL);
|
|
41
|
+
url.searchParams.set("wskey", this.apiKey);
|
|
42
|
+
url.searchParams.set("query", `"${subject.name}" biography`);
|
|
43
|
+
url.searchParams.set("rows", "5");
|
|
44
|
+
const response = await fetch(url.toString(), { signal });
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
throw new Error(`Europeana API error: HTTP ${response.status} ${response.statusText}`);
|
|
47
|
+
}
|
|
48
|
+
const data = (await response.json());
|
|
49
|
+
if (!data.items?.length)
|
|
50
|
+
return null;
|
|
51
|
+
// Combine title + description from all items
|
|
52
|
+
const parts = [];
|
|
53
|
+
for (const item of data.items) {
|
|
54
|
+
if (item.title?.length)
|
|
55
|
+
parts.push(item.title.join(" "));
|
|
56
|
+
if (item.dcDescription?.length)
|
|
57
|
+
parts.push(item.dcDescription.join(" "));
|
|
58
|
+
}
|
|
59
|
+
const text = parts.join("\n\n");
|
|
60
|
+
if (!text.trim())
|
|
61
|
+
return null;
|
|
62
|
+
const sanitized = sanitizeSourceText(text);
|
|
63
|
+
if (!sanitized)
|
|
64
|
+
return null;
|
|
65
|
+
// Use edmIsShownAt[0] or fall back to guid for URL
|
|
66
|
+
const firstItem = data.items[0];
|
|
67
|
+
const resultUrl = firstItem?.edmIsShownAt?.[0] ?? firstItem?.guid;
|
|
68
|
+
return {
|
|
69
|
+
text: sanitized,
|
|
70
|
+
confidence: -1,
|
|
71
|
+
costUsd: 0,
|
|
72
|
+
url: resultUrl,
|
|
73
|
+
publication: "Europeana",
|
|
74
|
+
metadata: {
|
|
75
|
+
title: firstItem?.title?.[0] ?? "",
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Factory
|
|
82
|
+
// ============================================================================
|
|
83
|
+
/**
|
|
84
|
+
* Create a Europeana source instance.
|
|
85
|
+
*
|
|
86
|
+
* @param options - Europeana-specific options (apiKey, rateLimitMs, etc.)
|
|
87
|
+
* @returns A configured EuropeanaSource
|
|
88
|
+
*/
|
|
89
|
+
export function europeana(options) {
|
|
90
|
+
return new EuropeanaSource(options);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=europeana.js.map
|