@cosmocoder/mcp-web-docs 1.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 +22 -0
- package/README.md +368 -0
- package/build/__mocks__/embeddings.d.ts +17 -0
- package/build/__mocks__/embeddings.js +66 -0
- package/build/__mocks__/embeddings.js.map +1 -0
- package/build/config.d.ts +44 -0
- package/build/config.js +158 -0
- package/build/config.js.map +1 -0
- package/build/config.test.d.ts +1 -0
- package/build/config.test.js +165 -0
- package/build/config.test.js.map +1 -0
- package/build/crawler/auth.d.ts +128 -0
- package/build/crawler/auth.js +546 -0
- package/build/crawler/auth.js.map +1 -0
- package/build/crawler/auth.test.d.ts +1 -0
- package/build/crawler/auth.test.js +174 -0
- package/build/crawler/auth.test.js.map +1 -0
- package/build/crawler/base.d.ts +24 -0
- package/build/crawler/base.js +149 -0
- package/build/crawler/base.js.map +1 -0
- package/build/crawler/base.test.d.ts +1 -0
- package/build/crawler/base.test.js +234 -0
- package/build/crawler/base.test.js.map +1 -0
- package/build/crawler/browser-config.d.ts +2 -0
- package/build/crawler/browser-config.js +29 -0
- package/build/crawler/browser-config.js.map +1 -0
- package/build/crawler/browser-config.test.d.ts +1 -0
- package/build/crawler/browser-config.test.js +56 -0
- package/build/crawler/browser-config.test.js.map +1 -0
- package/build/crawler/cheerio.d.ts +11 -0
- package/build/crawler/cheerio.js +134 -0
- package/build/crawler/cheerio.js.map +1 -0
- package/build/crawler/chromium.d.ts +21 -0
- package/build/crawler/chromium.js +596 -0
- package/build/crawler/chromium.js.map +1 -0
- package/build/crawler/content-extractor-types.d.ts +25 -0
- package/build/crawler/content-extractor-types.js +2 -0
- package/build/crawler/content-extractor-types.js.map +1 -0
- package/build/crawler/content-extractors.d.ts +9 -0
- package/build/crawler/content-extractors.js +9 -0
- package/build/crawler/content-extractors.js.map +1 -0
- package/build/crawler/content-utils.d.ts +2 -0
- package/build/crawler/content-utils.js +22 -0
- package/build/crawler/content-utils.js.map +1 -0
- package/build/crawler/content-utils.test.d.ts +1 -0
- package/build/crawler/content-utils.test.js +99 -0
- package/build/crawler/content-utils.test.js.map +1 -0
- package/build/crawler/crawlee-crawler.d.ts +63 -0
- package/build/crawler/crawlee-crawler.js +342 -0
- package/build/crawler/crawlee-crawler.js.map +1 -0
- package/build/crawler/crawlee-crawler.test.d.ts +1 -0
- package/build/crawler/crawlee-crawler.test.js +280 -0
- package/build/crawler/crawlee-crawler.test.js.map +1 -0
- package/build/crawler/default-extractor.d.ts +4 -0
- package/build/crawler/default-extractor.js +26 -0
- package/build/crawler/default-extractor.js.map +1 -0
- package/build/crawler/default-extractor.test.d.ts +1 -0
- package/build/crawler/default-extractor.test.js +200 -0
- package/build/crawler/default-extractor.test.js.map +1 -0
- package/build/crawler/default.d.ts +11 -0
- package/build/crawler/default.js +138 -0
- package/build/crawler/default.js.map +1 -0
- package/build/crawler/docs-crawler.d.ts +26 -0
- package/build/crawler/docs-crawler.js +97 -0
- package/build/crawler/docs-crawler.js.map +1 -0
- package/build/crawler/docs-crawler.test.d.ts +1 -0
- package/build/crawler/docs-crawler.test.js +185 -0
- package/build/crawler/docs-crawler.test.js.map +1 -0
- package/build/crawler/factory.d.ts +6 -0
- package/build/crawler/factory.js +83 -0
- package/build/crawler/factory.js.map +1 -0
- package/build/crawler/github-pages-extractor.d.ts +4 -0
- package/build/crawler/github-pages-extractor.js +33 -0
- package/build/crawler/github-pages-extractor.js.map +1 -0
- package/build/crawler/github-pages-extractor.test.d.ts +1 -0
- package/build/crawler/github-pages-extractor.test.js +184 -0
- package/build/crawler/github-pages-extractor.test.js.map +1 -0
- package/build/crawler/github.d.ts +20 -0
- package/build/crawler/github.js +181 -0
- package/build/crawler/github.js.map +1 -0
- package/build/crawler/github.test.d.ts +1 -0
- package/build/crawler/github.test.js +326 -0
- package/build/crawler/github.test.js.map +1 -0
- package/build/crawler/puppeteer.d.ts +16 -0
- package/build/crawler/puppeteer.js +191 -0
- package/build/crawler/puppeteer.js.map +1 -0
- package/build/crawler/queue-manager.d.ts +43 -0
- package/build/crawler/queue-manager.js +169 -0
- package/build/crawler/queue-manager.js.map +1 -0
- package/build/crawler/queue-manager.test.d.ts +1 -0
- package/build/crawler/queue-manager.test.js +509 -0
- package/build/crawler/queue-manager.test.js.map +1 -0
- package/build/crawler/site-rules.d.ts +11 -0
- package/build/crawler/site-rules.js +104 -0
- package/build/crawler/site-rules.js.map +1 -0
- package/build/crawler/site-rules.test.d.ts +1 -0
- package/build/crawler/site-rules.test.js +139 -0
- package/build/crawler/site-rules.test.js.map +1 -0
- package/build/crawler/storybook-extractor.d.ts +34 -0
- package/build/crawler/storybook-extractor.js +767 -0
- package/build/crawler/storybook-extractor.js.map +1 -0
- package/build/crawler/storybook-extractor.test.d.ts +1 -0
- package/build/crawler/storybook-extractor.test.js +491 -0
- package/build/crawler/storybook-extractor.test.js.map +1 -0
- package/build/embeddings/fastembed.d.ts +25 -0
- package/build/embeddings/fastembed.js +188 -0
- package/build/embeddings/fastembed.js.map +1 -0
- package/build/embeddings/fastembed.test.d.ts +1 -0
- package/build/embeddings/fastembed.test.js +307 -0
- package/build/embeddings/fastembed.test.js.map +1 -0
- package/build/embeddings/openai.d.ts +8 -0
- package/build/embeddings/openai.js +56 -0
- package/build/embeddings/openai.js.map +1 -0
- package/build/embeddings/types.d.ts +4 -0
- package/build/embeddings/types.js +2 -0
- package/build/embeddings/types.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +1007 -0
- package/build/index.js.map +1 -0
- package/build/index.test.d.ts +1 -0
- package/build/index.test.js +364 -0
- package/build/index.test.js.map +1 -0
- package/build/indexing/queue-manager.d.ts +36 -0
- package/build/indexing/queue-manager.js +86 -0
- package/build/indexing/queue-manager.js.map +1 -0
- package/build/indexing/queue-manager.test.d.ts +1 -0
- package/build/indexing/queue-manager.test.js +257 -0
- package/build/indexing/queue-manager.test.js.map +1 -0
- package/build/indexing/status.d.ts +39 -0
- package/build/indexing/status.js +207 -0
- package/build/indexing/status.js.map +1 -0
- package/build/indexing/status.test.d.ts +1 -0
- package/build/indexing/status.test.js +246 -0
- package/build/indexing/status.test.js.map +1 -0
- package/build/processor/content.d.ts +16 -0
- package/build/processor/content.js +286 -0
- package/build/processor/content.js.map +1 -0
- package/build/processor/content.test.d.ts +1 -0
- package/build/processor/content.test.js +369 -0
- package/build/processor/content.test.js.map +1 -0
- package/build/processor/markdown.d.ts +11 -0
- package/build/processor/markdown.js +256 -0
- package/build/processor/markdown.js.map +1 -0
- package/build/processor/markdown.test.d.ts +1 -0
- package/build/processor/markdown.test.js +312 -0
- package/build/processor/markdown.test.js.map +1 -0
- package/build/processor/metadata-parser.d.ts +37 -0
- package/build/processor/metadata-parser.js +245 -0
- package/build/processor/metadata-parser.js.map +1 -0
- package/build/processor/metadata-parser.test.d.ts +1 -0
- package/build/processor/metadata-parser.test.js +357 -0
- package/build/processor/metadata-parser.test.js.map +1 -0
- package/build/processor/processor.d.ts +8 -0
- package/build/processor/processor.js +190 -0
- package/build/processor/processor.js.map +1 -0
- package/build/processor/processor.test.d.ts +1 -0
- package/build/processor/processor.test.js +357 -0
- package/build/processor/processor.test.js.map +1 -0
- package/build/rag/cache.d.ts +10 -0
- package/build/rag/cache.js +10 -0
- package/build/rag/cache.js.map +1 -0
- package/build/rag/code-generator.d.ts +11 -0
- package/build/rag/code-generator.js +30 -0
- package/build/rag/code-generator.js.map +1 -0
- package/build/rag/context-assembler.d.ts +23 -0
- package/build/rag/context-assembler.js +113 -0
- package/build/rag/context-assembler.js.map +1 -0
- package/build/rag/docs-search.d.ts +55 -0
- package/build/rag/docs-search.js +380 -0
- package/build/rag/docs-search.js.map +1 -0
- package/build/rag/pipeline.d.ts +26 -0
- package/build/rag/pipeline.js +91 -0
- package/build/rag/pipeline.js.map +1 -0
- package/build/rag/query-processor.d.ts +14 -0
- package/build/rag/query-processor.js +57 -0
- package/build/rag/query-processor.js.map +1 -0
- package/build/rag/reranker.d.ts +55 -0
- package/build/rag/reranker.js +210 -0
- package/build/rag/reranker.js.map +1 -0
- package/build/rag/response-generator.d.ts +20 -0
- package/build/rag/response-generator.js +101 -0
- package/build/rag/response-generator.js.map +1 -0
- package/build/rag/retriever.d.ts +19 -0
- package/build/rag/retriever.js +111 -0
- package/build/rag/retriever.js.map +1 -0
- package/build/rag/validator.d.ts +22 -0
- package/build/rag/validator.js +128 -0
- package/build/rag/validator.js.map +1 -0
- package/build/rag/version-manager.d.ts +23 -0
- package/build/rag/version-manager.js +98 -0
- package/build/rag/version-manager.js.map +1 -0
- package/build/setupTests.d.ts +4 -0
- package/build/setupTests.js +50 -0
- package/build/setupTests.js.map +1 -0
- package/build/storage/storage.d.ts +38 -0
- package/build/storage/storage.js +700 -0
- package/build/storage/storage.js.map +1 -0
- package/build/storage/storage.test.d.ts +1 -0
- package/build/storage/storage.test.js +338 -0
- package/build/storage/storage.test.js.map +1 -0
- package/build/types/rag.d.ts +27 -0
- package/build/types/rag.js +2 -0
- package/build/types/rag.js.map +1 -0
- package/build/types.d.ts +120 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/util/content-utils.d.ts +31 -0
- package/build/util/content-utils.js +120 -0
- package/build/util/content-utils.js.map +1 -0
- package/build/util/content.d.ts +1 -0
- package/build/util/content.js +16 -0
- package/build/util/content.js.map +1 -0
- package/build/util/docs.d.ts +1 -0
- package/build/util/docs.js +26 -0
- package/build/util/docs.js.map +1 -0
- package/build/util/docs.test.d.ts +1 -0
- package/build/util/docs.test.js +49 -0
- package/build/util/docs.test.js.map +1 -0
- package/build/util/favicon.d.ts +6 -0
- package/build/util/favicon.js +88 -0
- package/build/util/favicon.js.map +1 -0
- package/build/util/favicon.test.d.ts +1 -0
- package/build/util/favicon.test.js +140 -0
- package/build/util/favicon.test.js.map +1 -0
- package/build/util/logger.d.ts +17 -0
- package/build/util/logger.js +72 -0
- package/build/util/logger.js.map +1 -0
- package/build/util/logger.test.d.ts +1 -0
- package/build/util/logger.test.js +46 -0
- package/build/util/logger.test.js.map +1 -0
- package/build/util/security.d.ts +312 -0
- package/build/util/security.js +719 -0
- package/build/util/security.js.map +1 -0
- package/build/util/security.test.d.ts +1 -0
- package/build/util/security.test.js +524 -0
- package/build/util/security.test.js.map +1 -0
- package/build/util/site-detector.d.ts +22 -0
- package/build/util/site-detector.js +42 -0
- package/build/util/site-detector.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { isValidUrl, isValidPublicUrl, normalizeUrl, isGitHubUrl, isMarkdownPath, IGNORED_PATHS, RATE_LIMIT, QUEUE_OPTIONS, GITHUB_RATE_LIMIT, } from './config.js';
|
|
2
|
+
describe('Configuration Utilities', () => {
|
|
3
|
+
describe('isValidUrl', () => {
|
|
4
|
+
it('should accept valid HTTP URLs', () => {
|
|
5
|
+
expect(isValidUrl('http://example.com')).toBe(true);
|
|
6
|
+
expect(isValidUrl('http://example.com:8080')).toBe(true);
|
|
7
|
+
expect(isValidUrl('http://example.com/path/to/page')).toBe(true);
|
|
8
|
+
expect(isValidUrl('http://example.com?query=1&other=2')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('should accept valid HTTPS URLs', () => {
|
|
11
|
+
expect(isValidUrl('https://example.com')).toBe(true);
|
|
12
|
+
expect(isValidUrl('https://subdomain.example.com')).toBe(true);
|
|
13
|
+
expect(isValidUrl('https://example.com/path')).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it('should reject non-HTTP protocols', () => {
|
|
16
|
+
expect(isValidUrl('ftp://example.com')).toBe(false);
|
|
17
|
+
expect(isValidUrl('file:///etc/passwd')).toBe(false);
|
|
18
|
+
expect(isValidUrl('javascript:alert(1)')).toBe(false);
|
|
19
|
+
expect(isValidUrl('data:text/html,<h1>Test</h1>')).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
it('should reject invalid URLs', () => {
|
|
22
|
+
expect(isValidUrl('not-a-url')).toBe(false);
|
|
23
|
+
expect(isValidUrl('')).toBe(false);
|
|
24
|
+
expect(isValidUrl('example.com')).toBe(false);
|
|
25
|
+
expect(isValidUrl('://missing-protocol.com')).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('should handle edge cases', () => {
|
|
28
|
+
expect(isValidUrl('http://localhost')).toBe(true);
|
|
29
|
+
expect(isValidUrl('http://127.0.0.1')).toBe(true);
|
|
30
|
+
expect(isValidUrl('http://[::1]')).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('isValidPublicUrl', () => {
|
|
34
|
+
it('should accept valid public URLs', () => {
|
|
35
|
+
expect(isValidPublicUrl('https://example.com')).toBe(true);
|
|
36
|
+
expect(isValidPublicUrl('https://docs.microsoft.com')).toBe(true);
|
|
37
|
+
expect(isValidPublicUrl('https://developer.mozilla.org')).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
it('should reject private network URLs by default', () => {
|
|
40
|
+
expect(isValidPublicUrl('http://localhost')).toBe(false);
|
|
41
|
+
expect(isValidPublicUrl('http://127.0.0.1')).toBe(false);
|
|
42
|
+
expect(isValidPublicUrl('http://10.0.0.1')).toBe(false);
|
|
43
|
+
expect(isValidPublicUrl('http://192.168.1.1')).toBe(false);
|
|
44
|
+
expect(isValidPublicUrl('http://172.16.0.1')).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
it('should allow private URLs when allowPrivate is true', () => {
|
|
47
|
+
expect(isValidPublicUrl('http://localhost', true)).toBe(true);
|
|
48
|
+
expect(isValidPublicUrl('http://192.168.1.1', true)).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it('should reject invalid URLs regardless of allowPrivate', () => {
|
|
51
|
+
expect(isValidPublicUrl('not-a-url', true)).toBe(false);
|
|
52
|
+
expect(isValidPublicUrl('ftp://example.com', true)).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('should block cloud metadata endpoints', () => {
|
|
55
|
+
expect(isValidPublicUrl('http://169.254.169.254')).toBe(false);
|
|
56
|
+
expect(isValidPublicUrl('http://metadata.google.internal')).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('normalizeUrl', () => {
|
|
60
|
+
it('should remove trailing slashes', () => {
|
|
61
|
+
expect(normalizeUrl('https://example.com/')).toBe('https://example.com');
|
|
62
|
+
expect(normalizeUrl('https://example.com/path/')).toBe('https://example.com/path');
|
|
63
|
+
});
|
|
64
|
+
it('should preserve URL components', () => {
|
|
65
|
+
expect(normalizeUrl('https://example.com/path?query=1')).toBe('https://example.com/path?query=1');
|
|
66
|
+
expect(normalizeUrl('https://example.com:8080/path')).toBe('https://example.com:8080/path');
|
|
67
|
+
});
|
|
68
|
+
it('should handle URLs without trailing slash', () => {
|
|
69
|
+
expect(normalizeUrl('https://example.com')).toBe('https://example.com');
|
|
70
|
+
expect(normalizeUrl('https://example.com/path')).toBe('https://example.com/path');
|
|
71
|
+
});
|
|
72
|
+
it('should throw for invalid URLs', () => {
|
|
73
|
+
expect(() => normalizeUrl('not-a-url')).toThrow('Invalid URL');
|
|
74
|
+
expect(() => normalizeUrl('')).toThrow('Invalid URL');
|
|
75
|
+
});
|
|
76
|
+
it('should handle URLs with fragments', () => {
|
|
77
|
+
expect(normalizeUrl('https://example.com/page#section')).toBe('https://example.com/page#section');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('isGitHubUrl', () => {
|
|
81
|
+
it('should identify GitHub URLs', () => {
|
|
82
|
+
expect(isGitHubUrl('https://github.com/user/repo')).toBe(true);
|
|
83
|
+
expect(isGitHubUrl('https://github.com/user/repo/blob/main/README.md')).toBe(true);
|
|
84
|
+
expect(isGitHubUrl('https://github.com')).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
it('should not identify non-GitHub URLs', () => {
|
|
87
|
+
expect(isGitHubUrl('https://gitlab.com/user/repo')).toBe(false);
|
|
88
|
+
expect(isGitHubUrl('https://bitbucket.org/user/repo')).toBe(false);
|
|
89
|
+
expect(isGitHubUrl('https://example.com')).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it('should handle GitHub-related but non-GitHub URLs', () => {
|
|
92
|
+
expect(isGitHubUrl('https://github.io')).toBe(false);
|
|
93
|
+
expect(isGitHubUrl('https://user.github.io')).toBe(false);
|
|
94
|
+
expect(isGitHubUrl('https://raw.githubusercontent.com/user/repo/main/file')).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
it('should return false for invalid URLs', () => {
|
|
97
|
+
expect(isGitHubUrl('not-a-url')).toBe(false);
|
|
98
|
+
expect(isGitHubUrl('')).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('isMarkdownPath', () => {
|
|
102
|
+
it('should identify markdown file extensions', () => {
|
|
103
|
+
expect(isMarkdownPath('README.md')).toBe(true);
|
|
104
|
+
expect(isMarkdownPath('docs/guide.md')).toBe(true);
|
|
105
|
+
expect(isMarkdownPath('CHANGELOG.MD')).toBe(true);
|
|
106
|
+
expect(isMarkdownPath('file.mdx')).toBe(true);
|
|
107
|
+
expect(isMarkdownPath('file.markdown')).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
it('should not identify non-markdown paths', () => {
|
|
110
|
+
expect(isMarkdownPath('file.txt')).toBe(false);
|
|
111
|
+
expect(isMarkdownPath('file.html')).toBe(false);
|
|
112
|
+
expect(isMarkdownPath('file.js')).toBe(false);
|
|
113
|
+
expect(isMarkdownPath('markdown')).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
it('should handle paths without extensions', () => {
|
|
116
|
+
expect(isMarkdownPath('README')).toBe(false);
|
|
117
|
+
expect(isMarkdownPath('docs/guide')).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
it('should handle edge cases', () => {
|
|
120
|
+
expect(isMarkdownPath('.md')).toBe(true);
|
|
121
|
+
expect(isMarkdownPath('file.md.bak')).toBe(false);
|
|
122
|
+
expect(isMarkdownPath('file.md/path')).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('Constants', () => {
|
|
126
|
+
describe('IGNORED_PATHS', () => {
|
|
127
|
+
it('should contain common non-content paths', () => {
|
|
128
|
+
expect(IGNORED_PATHS).toContain('favicon.ico');
|
|
129
|
+
expect(IGNORED_PATHS).toContain('robots.txt');
|
|
130
|
+
expect(IGNORED_PATHS).toContain('assets/');
|
|
131
|
+
expect(IGNORED_PATHS).toContain('node_modules/');
|
|
132
|
+
});
|
|
133
|
+
it('should be an array of strings', () => {
|
|
134
|
+
expect(Array.isArray(IGNORED_PATHS)).toBe(true);
|
|
135
|
+
IGNORED_PATHS.forEach((path) => {
|
|
136
|
+
expect(typeof path).toBe('string');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('RATE_LIMIT', () => {
|
|
141
|
+
it('should have reasonable default values', () => {
|
|
142
|
+
expect(RATE_LIMIT.maxRequests).toBeGreaterThan(0);
|
|
143
|
+
expect(RATE_LIMIT.timeWindow).toBeGreaterThan(0);
|
|
144
|
+
expect(RATE_LIMIT.minDelay).toBeGreaterThanOrEqual(0);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('QUEUE_OPTIONS', () => {
|
|
148
|
+
it('should have retry configuration', () => {
|
|
149
|
+
expect(QUEUE_OPTIONS.maxRequestRetries).toBeGreaterThanOrEqual(0);
|
|
150
|
+
expect(QUEUE_OPTIONS.retryDelay).toBeGreaterThan(0);
|
|
151
|
+
expect(QUEUE_OPTIONS.maxRequestsPerCrawl).toBeGreaterThan(0);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('GITHUB_RATE_LIMIT', () => {
|
|
155
|
+
it('should have different limits for authenticated vs unauthenticated', () => {
|
|
156
|
+
expect(GITHUB_RATE_LIMIT.authenticated.maxRequests).toBeGreaterThan(GITHUB_RATE_LIMIT.unauthenticated.maxRequests);
|
|
157
|
+
});
|
|
158
|
+
it('should have time windows defined', () => {
|
|
159
|
+
expect(GITHUB_RATE_LIMIT.authenticated.timeWindow).toBeGreaterThan(0);
|
|
160
|
+
expect(GITHUB_RATE_LIMIT.unauthenticated.timeWindow).toBeGreaterThan(0);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Browser, BrowserContext } from 'playwright';
|
|
2
|
+
import { type LoginPageDetectionResult } from '../util/security.js';
|
|
3
|
+
/** Supported browser types */
|
|
4
|
+
export type BrowserType = 'chromium' | 'chrome' | 'firefox' | 'webkit' | 'edge';
|
|
5
|
+
/**
|
|
6
|
+
* Detect the user's default browser from OS settings using the default-browser package
|
|
7
|
+
* https://github.com/sindresorhus/default-browser
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectDefaultBrowser(): Promise<BrowserType>;
|
|
10
|
+
/** Authentication options for crawling */
|
|
11
|
+
export interface AuthOptions {
|
|
12
|
+
/** Whether authentication is required */
|
|
13
|
+
requiresAuth?: boolean;
|
|
14
|
+
/** Browser to use for authentication */
|
|
15
|
+
browser?: BrowserType;
|
|
16
|
+
/** URL pattern that indicates successful login (regex) */
|
|
17
|
+
loginSuccessPattern?: string;
|
|
18
|
+
/** CSS selector that appears after successful login */
|
|
19
|
+
loginSuccessSelector?: string;
|
|
20
|
+
/** Login page URL (if different from main URL) */
|
|
21
|
+
loginUrl?: string;
|
|
22
|
+
/** Timeout for waiting for login (seconds) */
|
|
23
|
+
loginTimeoutSecs?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Manages authentication sessions for crawling protected pages.
|
|
27
|
+
* Opens a visible browser for user to login, then saves the session for reuse.
|
|
28
|
+
*/
|
|
29
|
+
export declare class AuthManager {
|
|
30
|
+
private sessionsDir;
|
|
31
|
+
private activeBrowser;
|
|
32
|
+
private activeContext;
|
|
33
|
+
constructor(dataDir: string);
|
|
34
|
+
initialize(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the session file path for a domain with path traversal protection
|
|
37
|
+
*/
|
|
38
|
+
private getSessionPath;
|
|
39
|
+
/**
|
|
40
|
+
* Check if we have a saved session for a domain
|
|
41
|
+
*/
|
|
42
|
+
hasSession(url: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Load a saved session for a domain
|
|
45
|
+
* Sessions are encrypted at rest and validated on load
|
|
46
|
+
*/
|
|
47
|
+
loadSession(url: string): Promise<string | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Save a session for a domain with encryption
|
|
50
|
+
* The storage state is encrypted before being written to disk
|
|
51
|
+
*/
|
|
52
|
+
private saveSession;
|
|
53
|
+
/**
|
|
54
|
+
* Clear a saved session for a domain
|
|
55
|
+
*/
|
|
56
|
+
clearSession(url: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Validate that a stored session is still valid by making a test request.
|
|
59
|
+
* This detects expired sessions by checking for:
|
|
60
|
+
* 1. Redirects to login/auth pages
|
|
61
|
+
* 2. Login page content in the response
|
|
62
|
+
*
|
|
63
|
+
* @param url - The protected URL to validate against
|
|
64
|
+
* @param browserType - Browser type to use for validation
|
|
65
|
+
* @returns Validation result indicating if session is still valid
|
|
66
|
+
*/
|
|
67
|
+
validateSession(url: string, browserType?: BrowserType): Promise<{
|
|
68
|
+
isValid: boolean;
|
|
69
|
+
reason?: string;
|
|
70
|
+
loginDetection?: LoginPageDetectionResult;
|
|
71
|
+
finalUrl?: string;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Validate session and throw SessionExpiredError if expired.
|
|
75
|
+
* This is a convenience method for use in crawling workflows.
|
|
76
|
+
*
|
|
77
|
+
* @param url - The protected URL to validate against
|
|
78
|
+
* @param browserType - Browser type to use for validation
|
|
79
|
+
* @throws SessionExpiredError if the session has expired
|
|
80
|
+
*/
|
|
81
|
+
validateSessionOrThrow(url: string, browserType?: BrowserType): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Get the Playwright browser launcher for a browser type
|
|
84
|
+
*/
|
|
85
|
+
private getBrowserLauncher;
|
|
86
|
+
/**
|
|
87
|
+
* Get launch options for a browser type
|
|
88
|
+
*
|
|
89
|
+
* Note: Firefox cannot use the installed browser - Playwright requires its bundled
|
|
90
|
+
* Firefox (Nightly) which includes the Juggler automation protocol.
|
|
91
|
+
* Chrome and Edge can use the installed browser via the 'channel' option.
|
|
92
|
+
*/
|
|
93
|
+
private getLaunchOptions;
|
|
94
|
+
/**
|
|
95
|
+
* Open a visible browser for user to login interactively.
|
|
96
|
+
* Returns the storage state (cookies/localStorage) after successful login.
|
|
97
|
+
*
|
|
98
|
+
* Opens a fresh browser instance for the user to login manually.
|
|
99
|
+
* Note: We don't use the user's existing browser profile because:
|
|
100
|
+
* 1. Firefox locks profiles when already open
|
|
101
|
+
* 2. Playwright uses its own bundled browsers, not system browsers
|
|
102
|
+
*/
|
|
103
|
+
performInteractiveLogin(url: string, options?: AuthOptions): Promise<string>;
|
|
104
|
+
/**
|
|
105
|
+
* Login using a fresh browser instance (for manual login)
|
|
106
|
+
*/
|
|
107
|
+
private loginWithFreshBrowser;
|
|
108
|
+
/**
|
|
109
|
+
* Wait for the user to complete login.
|
|
110
|
+
*
|
|
111
|
+
* Detection methods (in order of priority):
|
|
112
|
+
* 1. If successPattern is provided: wait for URL to match the regex
|
|
113
|
+
* 2. If successSelector is provided: wait for the CSS selector to appear
|
|
114
|
+
* 3. Default: poll for common login success indicators (logout button, user menu, URL change)
|
|
115
|
+
*/
|
|
116
|
+
private waitForLogin;
|
|
117
|
+
/**
|
|
118
|
+
* Create a browser context with saved authentication
|
|
119
|
+
*/
|
|
120
|
+
createAuthenticatedContext(url: string, browserType?: BrowserType): Promise<{
|
|
121
|
+
browser: Browser;
|
|
122
|
+
context: BrowserContext;
|
|
123
|
+
} | null>;
|
|
124
|
+
/**
|
|
125
|
+
* Clean up any active browser instances
|
|
126
|
+
*/
|
|
127
|
+
cleanup(): Promise<void>;
|
|
128
|
+
}
|