@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.
Files changed (194) hide show
  1. package/README.md +59 -0
  2. package/dist/__tests__/archives/chronicling-america.test.d.ts +8 -0
  3. package/dist/__tests__/archives/chronicling-america.test.d.ts.map +1 -0
  4. package/dist/__tests__/archives/chronicling-america.test.js +151 -0
  5. package/dist/__tests__/archives/chronicling-america.test.js.map +1 -0
  6. package/dist/__tests__/archives/europeana.test.d.ts +8 -0
  7. package/dist/__tests__/archives/europeana.test.d.ts.map +1 -0
  8. package/dist/__tests__/archives/europeana.test.js +200 -0
  9. package/dist/__tests__/archives/europeana.test.js.map +1 -0
  10. package/dist/__tests__/archives/internet-archive.test.d.ts +8 -0
  11. package/dist/__tests__/archives/internet-archive.test.d.ts.map +1 -0
  12. package/dist/__tests__/archives/internet-archive.test.js +189 -0
  13. package/dist/__tests__/archives/internet-archive.test.js.map +1 -0
  14. package/dist/__tests__/archives/trove.test.d.ts +8 -0
  15. package/dist/__tests__/archives/trove.test.d.ts.map +1 -0
  16. package/dist/__tests__/archives/trove.test.js +202 -0
  17. package/dist/__tests__/archives/trove.test.js.map +1 -0
  18. package/dist/__tests__/books/google-books.test.d.ts +8 -0
  19. package/dist/__tests__/books/google-books.test.d.ts.map +1 -0
  20. package/dist/__tests__/books/google-books.test.js +221 -0
  21. package/dist/__tests__/books/google-books.test.js.map +1 -0
  22. package/dist/__tests__/books/open-library.test.d.ts +8 -0
  23. package/dist/__tests__/books/open-library.test.d.ts.map +1 -0
  24. package/dist/__tests__/books/open-library.test.js +159 -0
  25. package/dist/__tests__/books/open-library.test.js.map +1 -0
  26. package/dist/__tests__/news/guardian.test.d.ts +9 -0
  27. package/dist/__tests__/news/guardian.test.d.ts.map +1 -0
  28. package/dist/__tests__/news/guardian.test.js +224 -0
  29. package/dist/__tests__/news/guardian.test.js.map +1 -0
  30. package/dist/__tests__/news/nytimes.test.d.ts +9 -0
  31. package/dist/__tests__/news/nytimes.test.d.ts.map +1 -0
  32. package/dist/__tests__/news/nytimes.test.js +271 -0
  33. package/dist/__tests__/news/nytimes.test.js.map +1 -0
  34. package/dist/__tests__/news/site-search-source.test.d.ts +9 -0
  35. package/dist/__tests__/news/site-search-source.test.d.ts.map +1 -0
  36. package/dist/__tests__/news/site-search-source.test.js +342 -0
  37. package/dist/__tests__/news/site-search-source.test.js.map +1 -0
  38. package/dist/__tests__/obituary/find-a-grave.test.d.ts +8 -0
  39. package/dist/__tests__/obituary/find-a-grave.test.d.ts.map +1 -0
  40. package/dist/__tests__/obituary/find-a-grave.test.js +238 -0
  41. package/dist/__tests__/obituary/find-a-grave.test.js.map +1 -0
  42. package/dist/__tests__/shared/duckduckgo-search.test.d.ts +9 -0
  43. package/dist/__tests__/shared/duckduckgo-search.test.d.ts.map +1 -0
  44. package/dist/__tests__/shared/duckduckgo-search.test.js +218 -0
  45. package/dist/__tests__/shared/duckduckgo-search.test.js.map +1 -0
  46. package/dist/__tests__/shared/fetch-page.test.d.ts +9 -0
  47. package/dist/__tests__/shared/fetch-page.test.d.ts.map +1 -0
  48. package/dist/__tests__/shared/fetch-page.test.js +281 -0
  49. package/dist/__tests__/shared/fetch-page.test.js.map +1 -0
  50. package/dist/__tests__/shared/html-utils.test.d.ts +2 -0
  51. package/dist/__tests__/shared/html-utils.test.d.ts.map +1 -0
  52. package/dist/__tests__/shared/html-utils.test.js +169 -0
  53. package/dist/__tests__/shared/html-utils.test.js.map +1 -0
  54. package/dist/__tests__/shared/readability-extract.test.d.ts +2 -0
  55. package/dist/__tests__/shared/readability-extract.test.d.ts.map +1 -0
  56. package/dist/__tests__/shared/readability-extract.test.js +107 -0
  57. package/dist/__tests__/shared/readability-extract.test.js.map +1 -0
  58. package/dist/__tests__/shared/sanitize-text.test.d.ts +2 -0
  59. package/dist/__tests__/shared/sanitize-text.test.d.ts.map +1 -0
  60. package/dist/__tests__/shared/sanitize-text.test.js +77 -0
  61. package/dist/__tests__/shared/sanitize-text.test.js.map +1 -0
  62. package/dist/__tests__/shared/search-utils.test.d.ts +2 -0
  63. package/dist/__tests__/shared/search-utils.test.d.ts.map +1 -0
  64. package/dist/__tests__/shared/search-utils.test.js +26 -0
  65. package/dist/__tests__/shared/search-utils.test.js.map +1 -0
  66. package/dist/__tests__/structured/wikidata.test.d.ts +9 -0
  67. package/dist/__tests__/structured/wikidata.test.d.ts.map +1 -0
  68. package/dist/__tests__/structured/wikidata.test.js +509 -0
  69. package/dist/__tests__/structured/wikidata.test.js.map +1 -0
  70. package/dist/__tests__/structured/wikipedia.test.d.ts +9 -0
  71. package/dist/__tests__/structured/wikipedia.test.d.ts.map +1 -0
  72. package/dist/__tests__/structured/wikipedia.test.js +643 -0
  73. package/dist/__tests__/structured/wikipedia.test.js.map +1 -0
  74. package/dist/__tests__/web-search/base.test.d.ts +9 -0
  75. package/dist/__tests__/web-search/base.test.d.ts.map +1 -0
  76. package/dist/__tests__/web-search/base.test.js +622 -0
  77. package/dist/__tests__/web-search/base.test.js.map +1 -0
  78. package/dist/__tests__/web-search/bing.test.d.ts +10 -0
  79. package/dist/__tests__/web-search/bing.test.d.ts.map +1 -0
  80. package/dist/__tests__/web-search/bing.test.js +277 -0
  81. package/dist/__tests__/web-search/bing.test.js.map +1 -0
  82. package/dist/__tests__/web-search/brave.test.d.ts +10 -0
  83. package/dist/__tests__/web-search/brave.test.d.ts.map +1 -0
  84. package/dist/__tests__/web-search/brave.test.js +264 -0
  85. package/dist/__tests__/web-search/brave.test.js.map +1 -0
  86. package/dist/__tests__/web-search/duckduckgo.test.d.ts +10 -0
  87. package/dist/__tests__/web-search/duckduckgo.test.d.ts.map +1 -0
  88. package/dist/__tests__/web-search/duckduckgo.test.js +107 -0
  89. package/dist/__tests__/web-search/duckduckgo.test.js.map +1 -0
  90. package/dist/__tests__/web-search/google.test.d.ts +9 -0
  91. package/dist/__tests__/web-search/google.test.d.ts.map +1 -0
  92. package/dist/__tests__/web-search/google.test.js +189 -0
  93. package/dist/__tests__/web-search/google.test.js.map +1 -0
  94. package/dist/archives/chronicling-america.d.ts +33 -0
  95. package/dist/archives/chronicling-america.d.ts.map +1 -0
  96. package/dist/archives/chronicling-america.js +85 -0
  97. package/dist/archives/chronicling-america.js.map +1 -0
  98. package/dist/archives/europeana.d.ts +37 -0
  99. package/dist/archives/europeana.d.ts.map +1 -0
  100. package/dist/archives/europeana.js +92 -0
  101. package/dist/archives/europeana.js.map +1 -0
  102. package/dist/archives/internet-archive.d.ts +32 -0
  103. package/dist/archives/internet-archive.d.ts.map +1 -0
  104. package/dist/archives/internet-archive.js +90 -0
  105. package/dist/archives/internet-archive.js.map +1 -0
  106. package/dist/archives/trove.d.ts +37 -0
  107. package/dist/archives/trove.d.ts.map +1 -0
  108. package/dist/archives/trove.js +97 -0
  109. package/dist/archives/trove.js.map +1 -0
  110. package/dist/books/google-books.d.ts +48 -0
  111. package/dist/books/google-books.d.ts.map +1 -0
  112. package/dist/books/google-books.js +111 -0
  113. package/dist/books/google-books.js.map +1 -0
  114. package/dist/books/open-library.d.ts +44 -0
  115. package/dist/books/open-library.d.ts.map +1 -0
  116. package/dist/books/open-library.js +103 -0
  117. package/dist/books/open-library.js.map +1 -0
  118. package/dist/index.d.ts +45 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +35 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/news/guardian.d.ts +51 -0
  123. package/dist/news/guardian.d.ts.map +1 -0
  124. package/dist/news/guardian.js +131 -0
  125. package/dist/news/guardian.js.map +1 -0
  126. package/dist/news/nytimes.d.ts +27 -0
  127. package/dist/news/nytimes.d.ts.map +1 -0
  128. package/dist/news/nytimes.js +104 -0
  129. package/dist/news/nytimes.js.map +1 -0
  130. package/dist/news/site-search-source.d.ts +89 -0
  131. package/dist/news/site-search-source.d.ts.map +1 -0
  132. package/dist/news/site-search-source.js +182 -0
  133. package/dist/news/site-search-source.js.map +1 -0
  134. package/dist/news/sources.d.ts +52 -0
  135. package/dist/news/sources.d.ts.map +1 -0
  136. package/dist/news/sources.js +276 -0
  137. package/dist/news/sources.js.map +1 -0
  138. package/dist/obituary/find-a-grave.d.ts +43 -0
  139. package/dist/obituary/find-a-grave.d.ts.map +1 -0
  140. package/dist/obituary/find-a-grave.js +173 -0
  141. package/dist/obituary/find-a-grave.js.map +1 -0
  142. package/dist/shared/duckduckgo-search.d.ts +86 -0
  143. package/dist/shared/duckduckgo-search.d.ts.map +1 -0
  144. package/dist/shared/duckduckgo-search.js +218 -0
  145. package/dist/shared/duckduckgo-search.js.map +1 -0
  146. package/dist/shared/fetch-page.d.ts +50 -0
  147. package/dist/shared/fetch-page.d.ts.map +1 -0
  148. package/dist/shared/fetch-page.js +212 -0
  149. package/dist/shared/fetch-page.js.map +1 -0
  150. package/dist/shared/html-utils.d.ts +99 -0
  151. package/dist/shared/html-utils.d.ts.map +1 -0
  152. package/dist/shared/html-utils.js +246 -0
  153. package/dist/shared/html-utils.js.map +1 -0
  154. package/dist/shared/readability-extract.d.ts +33 -0
  155. package/dist/shared/readability-extract.d.ts.map +1 -0
  156. package/dist/shared/readability-extract.js +45 -0
  157. package/dist/shared/readability-extract.js.map +1 -0
  158. package/dist/shared/sanitize-text.d.ts +24 -0
  159. package/dist/shared/sanitize-text.d.ts.map +1 -0
  160. package/dist/shared/sanitize-text.js +49 -0
  161. package/dist/shared/sanitize-text.js.map +1 -0
  162. package/dist/shared/search-utils.d.ts +18 -0
  163. package/dist/shared/search-utils.d.ts.map +1 -0
  164. package/dist/shared/search-utils.js +20 -0
  165. package/dist/shared/search-utils.js.map +1 -0
  166. package/dist/structured/wikidata.d.ts +128 -0
  167. package/dist/structured/wikidata.d.ts.map +1 -0
  168. package/dist/structured/wikidata.js +361 -0
  169. package/dist/structured/wikidata.js.map +1 -0
  170. package/dist/structured/wikipedia.d.ts +184 -0
  171. package/dist/structured/wikipedia.d.ts.map +1 -0
  172. package/dist/structured/wikipedia.js +275 -0
  173. package/dist/structured/wikipedia.js.map +1 -0
  174. package/dist/web-search/base.d.ts +128 -0
  175. package/dist/web-search/base.d.ts.map +1 -0
  176. package/dist/web-search/base.js +251 -0
  177. package/dist/web-search/base.js.map +1 -0
  178. package/dist/web-search/bing.d.ts +21 -0
  179. package/dist/web-search/bing.d.ts.map +1 -0
  180. package/dist/web-search/bing.js +53 -0
  181. package/dist/web-search/bing.js.map +1 -0
  182. package/dist/web-search/brave.d.ts +21 -0
  183. package/dist/web-search/brave.d.ts.map +1 -0
  184. package/dist/web-search/brave.js +56 -0
  185. package/dist/web-search/brave.js.map +1 -0
  186. package/dist/web-search/duckduckgo.d.ts +15 -0
  187. package/dist/web-search/duckduckgo.d.ts.map +1 -0
  188. package/dist/web-search/duckduckgo.js +21 -0
  189. package/dist/web-search/duckduckgo.js.map +1 -0
  190. package/dist/web-search/google.d.ts +24 -0
  191. package/dist/web-search/google.d.ts.map +1 -0
  192. package/dist/web-search/google.js +48 -0
  193. package/dist/web-search/google.js.map +1 -0
  194. 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