rss-agent-discovery 0.1.0 → 0.1.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 CHANGED
@@ -47,12 +47,24 @@ npm start https://vercel.com | jq '.results[0].feeds'
47
47
 
48
48
  ### Custom timeout:
49
49
  ```bash
50
- npm start --timeout 15000 https://example.com
50
+ npm start -- --timeout 15000 https://example.com
51
51
  ```
52
52
 
53
53
  ### Skip blog scanning:
54
54
  ```bash
55
- npm start --skip-blogs https://example.com
55
+ npm start -- --skip-blogs https://example.com
56
+ ```
57
+
58
+ ### Custom blog paths:
59
+ ```bash
60
+ npm start -- --blog-paths '/blog,/news' https://example.com
61
+ # or with pipe separator
62
+ npm start -- --blog-paths '/blog|/updates' https://example.com
63
+ ```
64
+
65
+ ### Verbose mode (debug logging):
66
+ ```bash
67
+ npm start -- --verbose https://example.com
56
68
  ```
57
69
 
58
70
  ### Show help:
@@ -60,9 +72,18 @@ npm start --skip-blogs https://example.com
60
72
  npm start --help
61
73
  ```
62
74
 
75
+ ### Show version:
76
+ ```bash
77
+ npm start -- --version
78
+ # or
79
+ rss-discover --version
80
+ ```
81
+
63
82
  ### Run tests:
64
83
  ```bash
65
- npm test
84
+ npm test # Run all tests (unit + smoke)
85
+ npm run test:unit # Run unit tests only
86
+ npm run test:smoke # Run smoke tests (integration)
66
87
  ```
67
88
 
68
89
  ## Output Schema
@@ -70,6 +91,7 @@ npm test
70
91
  ```json
71
92
  {
72
93
  "success": true,
94
+ "partialResults": false,
73
95
  "results": [
74
96
  {
75
97
  "url": "https://vercel.com",
@@ -86,9 +108,17 @@ npm test
86
108
  }
87
109
  ```
88
110
 
111
+ **Fields:**
112
+ - `success` (boolean): `true` if no URLs had errors, `false` if at least one URL had an error
113
+ - `partialResults` (boolean, optional): `true` if `success === false` but some feeds were still found
114
+ - `results` (array): One entry per input URL
115
+ - `url` (string): The scanned URL
116
+ - `feeds` (array): Discovered feed objects with `url`, `title`, and `type` ('rss' | 'atom' | 'unknown')
117
+ - `error` (string | null): Error message if scanning failed, `null` otherwise
118
+
89
119
  ## Exit Codes
90
120
 
91
- - `0` - One or more feeds found
121
+ - `0` - One or more feeds found (or `--help` / `--version` used)
92
122
  - `1` - No feeds found
93
123
  - `2` - Error occurred
94
124
 
@@ -239,7 +269,9 @@ npm run build
239
269
 
240
270
  ### Test:
241
271
  ```bash
242
- npm test
272
+ npm test # Run all tests (unit + smoke)
273
+ npm run test:unit # Run unit tests only
274
+ npm run test:smoke # Run smoke tests (integration)
243
275
  ```
244
276
 
245
277
  ### Lint:
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ import { readFileSync } from 'fs';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+
9
+ const packageDir = dirname(dirname(__filename));
10
+ const mainPath = join(packageDir, 'dist', 'find-rss-feeds.js');
11
+
12
+ await import(mainPath);
@@ -1,2 +1,16 @@
1
+ interface CLIOptions {
2
+ help: boolean;
3
+ version: boolean;
4
+ verbose: boolean;
5
+ skipBlogs: boolean;
6
+ maxBlogs: number;
7
+ customBlogPaths: string[] | null;
8
+ timeout: number;
9
+ }
10
+ export declare const cliOptions: CLIOptions;
11
+ export declare const COMMON_BLOG_PATHS: string[];
12
+ export declare function parseArgs(args: string[]): string[];
13
+ export declare function extractBlogLinksFromHTML(html: string, baseUrl: string): string[];
14
+ export declare function discoverBlogSubdirectories(baseUrl: string, html?: string | null): string[];
1
15
  export {};
2
16
  //# sourceMappingURL=find-rss-feeds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-rss-feeds.d.ts","sourceRoot":"","sources":["../find-rss-feeds.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"find-rss-feeds.d.ts","sourceRoot":"","sources":["../find-rss-feeds.ts"],"names":[],"mappings":"AAkBA,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAmBD,eAAO,MAAM,UAAU,EAAE,UAQxB,CAAC;AASF,eAAO,MAAM,iBAAiB,UAkB7B,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwClD;AAkDD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAmDhF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,EAAE,CAiBhG"}
@@ -1,6 +1,24 @@
1
1
  import * as cheerio from 'cheerio';
2
- const cliOptions = {
2
+ import { readFileSync } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname, join } from 'path';
5
+ // Load version from package.json at runtime
6
+ let CLI_VERSION = '0.0.0';
7
+ try {
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ const packageJsonPath = join(__dirname, '..', 'package.json');
11
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
12
+ CLI_VERSION = packageJson.version || '0.0.0';
13
+ }
14
+ catch {
15
+ // Fallback if package.json can't be read
16
+ CLI_VERSION = '0.0.0';
17
+ }
18
+ export const cliOptions = {
3
19
  help: false,
20
+ version: false,
21
+ verbose: false,
4
22
  skipBlogs: false,
5
23
  maxBlogs: 5,
6
24
  customBlogPaths: null,
@@ -12,7 +30,7 @@ const BLOG_KEYWORDS = [
12
30
  'substack', 'the-edge', 'engineering-blog', 'dev',
13
31
  'engineering', 'developers', 'community'
14
32
  ];
15
- const COMMON_BLOG_PATHS = [
33
+ export const COMMON_BLOG_PATHS = [
16
34
  '/blog',
17
35
  '/news',
18
36
  '/articles',
@@ -31,24 +49,47 @@ const COMMON_BLOG_PATHS = [
31
49
  '/dev',
32
50
  '/community'
33
51
  ];
34
- function parseArgs(args) {
52
+ export function parseArgs(args) {
35
53
  const urls = [];
36
54
  for (let i = 0; i < args.length; i++) {
37
55
  const arg = args[i];
38
56
  if (arg === '--help' || arg === '-h') {
39
57
  cliOptions.help = true;
40
58
  }
59
+ else if (arg === '--version' || arg === '-V') {
60
+ cliOptions.version = true;
61
+ }
62
+ else if (arg === '--verbose' || arg === '-v') {
63
+ cliOptions.verbose = true;
64
+ }
41
65
  else if (arg === '--no-blogs' || arg === '--skip-blogs') {
42
66
  cliOptions.skipBlogs = true;
43
67
  }
44
68
  else if (arg === '--max-blogs') {
45
- cliOptions.maxBlogs = parseInt(args[++i], 10);
69
+ if (i + 1 >= args.length) {
70
+ throw new Error('--max-blogs requires a value');
71
+ }
72
+ const value = parseInt(args[++i], 10);
73
+ if (Number.isNaN(value) || value <= 0) {
74
+ throw new Error(`--max-blogs requires a positive number, got: ${args[i]}`);
75
+ }
76
+ cliOptions.maxBlogs = value;
46
77
  }
47
78
  else if (arg === '--blog-paths') {
48
- cliOptions.customBlogPaths = args[++i].split(',').map(p => p.trim());
79
+ if (i + 1 >= args.length || !args[i + 1].trim()) {
80
+ throw new Error('--blog-paths requires a value');
81
+ }
82
+ cliOptions.customBlogPaths = args[++i].split(/[,|]/).map(p => p.trim()).filter(Boolean);
49
83
  }
50
84
  else if (arg === '--timeout') {
51
- cliOptions.timeout = parseInt(args[++i], 10);
85
+ if (i + 1 >= args.length) {
86
+ throw new Error('--timeout requires a value');
87
+ }
88
+ const value = parseInt(args[++i], 10);
89
+ if (Number.isNaN(value) || value <= 0) {
90
+ throw new Error(`--timeout requires a positive number, got: ${args[i]}`);
91
+ }
92
+ cliOptions.timeout = value;
52
93
  }
53
94
  else if (arg.startsWith('http://') || arg.startsWith('https://')) {
54
95
  urls.push(arg);
@@ -70,12 +111,14 @@ Options:
70
111
  Skip blog subdirectory scanning
71
112
  --max-blogs <num> Maximum number of blog subdirectories to scan (default: 5)
72
113
  --blog-paths <paths>
73
- Comma-separated custom blog paths to try (e.g., '/blog,/news')
114
+ Comma- or pipe-separated custom blog paths to try (e.g., '/blog,/news' or '/blog|/news')
74
115
  --timeout <ms> Timeout per URL in milliseconds (default: 10000)
116
+ --verbose, -v Log debug info to stderr
117
+ --version, -V Print version and exit
75
118
  --help, -h Show this help message
76
119
 
77
120
  Exit codes:
78
- 0 One or more feeds found
121
+ 0 One or more feeds found (or --help/--version)
79
122
  1 No feeds found
80
123
  2 Error occurred
81
124
 
@@ -101,7 +144,7 @@ Output schema:
101
144
  }
102
145
  `);
103
146
  }
104
- function extractBlogLinksFromHTML(html, baseUrl) {
147
+ export function extractBlogLinksFromHTML(html, baseUrl) {
105
148
  const $ = cheerio.load(html);
106
149
  const blogPaths = new Set();
107
150
  const linkTextAndUrls = [];
@@ -127,9 +170,8 @@ function extractBlogLinksFromHTML(html, baseUrl) {
127
170
  for (const link of linkTextAndUrls) {
128
171
  if (seenPaths.has(link.path))
129
172
  continue;
130
- const lowerText = link.text.toLowerCase();
131
173
  const lowerPath = link.path.toLowerCase();
132
- const foundKeyword = BLOG_KEYWORDS.find(keyword => lowerText.includes(keyword) ||
174
+ const foundKeyword = BLOG_KEYWORDS.find(keyword => link.text.includes(keyword) ||
133
175
  lowerPath.includes(keyword));
134
176
  if (foundKeyword) {
135
177
  if (link.path.startsWith('/') && link.path !== '/') {
@@ -147,7 +189,7 @@ function extractBlogLinksFromHTML(html, baseUrl) {
147
189
  }
148
190
  return Array.from(blogPaths);
149
191
  }
150
- function discoverBlogSubdirectories(baseUrl, html = null) {
192
+ export function discoverBlogSubdirectories(baseUrl, html = null) {
151
193
  let blogPaths = [];
152
194
  if (html) {
153
195
  blogPaths = extractBlogLinksFromHTML(html, baseUrl);
@@ -162,11 +204,12 @@ function discoverBlogSubdirectories(baseUrl, html = null) {
162
204
  }
163
205
  return blogPaths.slice(0, cliOptions.maxBlogs);
164
206
  }
165
- async function scanURLForFeeds(url) {
207
+ async function scanURLForFeeds(url, signal) {
166
208
  const discoveredFeeds = new Map();
167
209
  try {
168
210
  const res = await fetch(url, {
169
- headers: { 'User-Agent': 'rss-agent-discovery/1.0' }
211
+ signal,
212
+ headers: { 'User-Agent': `rss-agent-discovery/${CLI_VERSION}` }
170
213
  });
171
214
  if (!res.ok) {
172
215
  throw new Error(`Failed to fetch ${url}: ${res.status}`);
@@ -186,7 +229,10 @@ async function scanURLForFeeds(url) {
186
229
  discoveredFeeds.set(fullHref, { url: fullHref, title, type: feedType });
187
230
  }
188
231
  }
189
- catch {
232
+ catch (e) {
233
+ if (cliOptions.verbose) {
234
+ console.error(`Skipping invalid feed href: ${href}`, e.message);
235
+ }
190
236
  }
191
237
  }
192
238
  }
@@ -207,25 +253,36 @@ async function scanURLForFeeds(url) {
207
253
  });
208
254
  }
209
255
  }
210
- catch {
256
+ catch (e) {
257
+ if (cliOptions.verbose) {
258
+ console.error(`Skipping invalid candidate URL: ${path}`, e.message);
259
+ }
211
260
  }
212
261
  }
213
262
  const validFeeds = [];
214
263
  for (const [feedUrl, feed] of Array.from(discoveredFeeds)) {
215
264
  try {
216
265
  const res = await fetch(feedUrl, {
217
- headers: { 'User-Agent': 'rss-agent-discovery/1.0' }
266
+ signal,
267
+ headers: { 'User-Agent': `rss-agent-discovery/${CLI_VERSION}` }
218
268
  });
219
269
  if (res.ok) {
220
270
  const contentType = res.headers.get('content-type') || '';
221
271
  const text = await res.text();
222
- if ((text.includes('<rss') || text.includes('<feed')) &&
223
- (contentType.includes('xml') || contentType.includes('rss'))) {
272
+ // Stricter validation: require XML declaration or XML content-type, and root-level RSS/Atom element
273
+ const hasXmlDeclaration = text.trimStart().startsWith('<?xml') || text.includes('<?xml');
274
+ const hasXmlContentType = contentType.includes('xml') || contentType.includes('rss') || contentType.includes('atom');
275
+ const hasRssOrFeed = text.includes('<rss') || text.includes('<feed');
276
+ const isHtml = contentType.includes('text/html');
277
+ if (hasRssOrFeed && (hasXmlDeclaration || hasXmlContentType) && !isHtml) {
224
278
  validFeeds.push(feed);
225
279
  }
226
280
  }
227
281
  }
228
- catch {
282
+ catch (e) {
283
+ if (cliOptions.verbose) {
284
+ console.error(`Failed to validate feed ${feedUrl}:`, e.message);
285
+ }
229
286
  }
230
287
  }
231
288
  return { html, feeds: validFeeds };
@@ -237,14 +294,9 @@ async function scanURLForFeeds(url) {
237
294
  }
238
295
  async function findRSSFeeds(baseUrl) {
239
296
  const timeoutMs = cliOptions.timeout;
240
- const timeoutPromise = new Promise((_, reject) => {
241
- setTimeout(() => reject(new Error('Timeout')), timeoutMs);
242
- });
297
+ const signal = AbortSignal.timeout(timeoutMs);
243
298
  try {
244
- const scanResult = await Promise.race([
245
- scanURLForFeeds(baseUrl),
246
- timeoutPromise
247
- ]);
299
+ const scanResult = await scanURLForFeeds(baseUrl, signal);
248
300
  const allFeeds = new Map();
249
301
  scanResult.feeds.forEach(feed => {
250
302
  if (!allFeeds.has(feed.url)) {
@@ -262,10 +314,7 @@ async function findRSSFeeds(baseUrl) {
262
314
  return null;
263
315
  }
264
316
  }).filter((url) => url !== null);
265
- const blogResults = await Promise.allSettled(blogURLs.map(blogUrl => Promise.race([
266
- scanURLForFeeds(blogUrl),
267
- timeoutPromise
268
- ])));
317
+ const blogResults = await Promise.allSettled(blogURLs.map(blogUrl => scanURLForFeeds(blogUrl, signal)));
269
318
  blogResults.forEach((result) => {
270
319
  if (result.status === 'fulfilled') {
271
320
  result.value.feeds.forEach((feed) => {
@@ -284,7 +333,14 @@ async function findRSSFeeds(baseUrl) {
284
333
  };
285
334
  }
286
335
  catch (e) {
287
- const errorMessage = e.message;
336
+ let errorMessage = e.message;
337
+ // Handle abort/timeout errors
338
+ if (e instanceof DOMException && e.name === 'AbortError') {
339
+ errorMessage = 'Timeout';
340
+ }
341
+ else if (errorMessage === 'Timeout') {
342
+ errorMessage = 'Timeout';
343
+ }
288
344
  console.error(`Error processing ${baseUrl}: ${errorMessage}`);
289
345
  return {
290
346
  url: baseUrl,
@@ -295,10 +351,21 @@ async function findRSSFeeds(baseUrl) {
295
351
  }
296
352
  async function main() {
297
353
  const args = process.argv.slice(2);
298
- const urls = parseArgs(args);
354
+ let urls;
355
+ try {
356
+ urls = parseArgs(args);
357
+ }
358
+ catch (e) {
359
+ console.error(`Error: ${e.message}`);
360
+ return 2;
361
+ }
362
+ if (cliOptions.version) {
363
+ console.log(CLI_VERSION);
364
+ return 0;
365
+ }
299
366
  if (cliOptions.help) {
300
367
  showHelp();
301
- return 2;
368
+ return 0;
302
369
  }
303
370
  if (urls.length === 0) {
304
371
  console.error('Error: No URLs provided. Use --help for usage information.');
@@ -321,6 +388,9 @@ async function main() {
321
388
  success: !hasError,
322
389
  results: results
323
390
  };
391
+ if (hasError && totalFeedsFound > 0) {
392
+ output.partialResults = true;
393
+ }
324
394
  console.log(JSON.stringify(output, null, 2));
325
395
  if (hasError) {
326
396
  return 2;
@@ -332,14 +402,22 @@ async function main() {
332
402
  return 0;
333
403
  }
334
404
  }
335
- main().then(exitCode => {
336
- process.exit(exitCode);
337
- }).catch(e => {
338
- console.error(JSON.stringify({
339
- success: false,
340
- error: e.message,
341
- results: []
342
- }, null, 2));
343
- process.exit(2);
344
- });
405
+ // Only run main if this file is executed directly or imported by the bin script
406
+ // Skip if imported by test files (they have .test.js in the caller)
407
+ const currentFile = fileURLToPath(import.meta.url);
408
+ const isMainModule = process.argv[1] === currentFile ||
409
+ process.argv[1]?.endsWith('find-rss-feeds.js') ||
410
+ (process.argv[1]?.includes('rss-agent-discovery') && !process.argv[1]?.includes('.test.'));
411
+ if (isMainModule) {
412
+ main().then(exitCode => {
413
+ process.exit(exitCode);
414
+ }).catch(e => {
415
+ console.error(JSON.stringify({
416
+ success: false,
417
+ error: e.message,
418
+ results: []
419
+ }, null, 2));
420
+ process.exit(2);
421
+ });
422
+ }
345
423
  //# sourceMappingURL=find-rss-feeds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-rss-feeds.js","sourceRoot":"","sources":["../find-rss-feeds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-rss-feeds.js","sourceRoot":"","sources":["../find-rss-feeds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=find-rss-feeds.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-rss-feeds.test.d.ts","sourceRoot":"","sources":["../find-rss-feeds.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,215 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert';
3
+ // Note: This file tests the compiled code in dist/
4
+ // Import will be resolved to dist/find-rss-feeds.js after build
5
+ import { parseArgs, extractBlogLinksFromHTML, discoverBlogSubdirectories, cliOptions, COMMON_BLOG_PATHS } from './find-rss-feeds.js';
6
+ // Reset cliOptions before each test
7
+ function resetCliOptions() {
8
+ cliOptions.help = false;
9
+ cliOptions.version = false;
10
+ cliOptions.verbose = false;
11
+ cliOptions.skipBlogs = false;
12
+ cliOptions.maxBlogs = 5;
13
+ cliOptions.customBlogPaths = null;
14
+ cliOptions.timeout = 10000;
15
+ }
16
+ test('parseArgs - valid flags and URLs', () => {
17
+ resetCliOptions();
18
+ const urls = parseArgs(['https://example.com', 'https://test.com']);
19
+ assert.strictEqual(urls.length, 2);
20
+ assert.strictEqual(urls[0], 'https://example.com');
21
+ assert.strictEqual(urls[1], 'https://test.com');
22
+ });
23
+ test('parseArgs - --help sets help flag', () => {
24
+ resetCliOptions();
25
+ parseArgs(['--help']);
26
+ assert.strictEqual(cliOptions.help, true);
27
+ });
28
+ test('parseArgs - --version / -V sets version flag', () => {
29
+ resetCliOptions();
30
+ parseArgs(['--version']);
31
+ assert.strictEqual(cliOptions.version, true);
32
+ resetCliOptions();
33
+ parseArgs(['-V']);
34
+ assert.strictEqual(cliOptions.version, true);
35
+ });
36
+ test('parseArgs - --verbose / -v sets verbose flag', () => {
37
+ resetCliOptions();
38
+ parseArgs(['--verbose']);
39
+ assert.strictEqual(cliOptions.verbose, true);
40
+ resetCliOptions();
41
+ parseArgs(['-v']);
42
+ assert.strictEqual(cliOptions.verbose, true);
43
+ });
44
+ test('parseArgs - --timeout missing value throws error', () => {
45
+ resetCliOptions();
46
+ assert.throws(() => {
47
+ parseArgs(['--timeout']);
48
+ }, /--timeout requires a value/);
49
+ });
50
+ test('parseArgs - --timeout invalid number throws error', () => {
51
+ resetCliOptions();
52
+ assert.throws(() => {
53
+ parseArgs(['--timeout', 'invalid']);
54
+ }, /--timeout requires a positive number/);
55
+ resetCliOptions();
56
+ assert.throws(() => {
57
+ parseArgs(['--timeout', '0']);
58
+ }, /--timeout requires a positive number/);
59
+ resetCliOptions();
60
+ assert.throws(() => {
61
+ parseArgs(['--timeout', '-5']);
62
+ }, /--timeout requires a positive number/);
63
+ });
64
+ test('parseArgs - --timeout valid value sets timeout', () => {
65
+ resetCliOptions();
66
+ parseArgs(['--timeout', '15000']);
67
+ assert.strictEqual(cliOptions.timeout, 15000);
68
+ });
69
+ test('parseArgs - --max-blogs missing value throws error', () => {
70
+ resetCliOptions();
71
+ assert.throws(() => {
72
+ parseArgs(['--max-blogs']);
73
+ }, /--max-blogs requires a value/);
74
+ });
75
+ test('parseArgs - --max-blogs invalid number throws error', () => {
76
+ resetCliOptions();
77
+ assert.throws(() => {
78
+ parseArgs(['--max-blogs', 'invalid']);
79
+ }, /--max-blogs requires a positive number/);
80
+ });
81
+ test('parseArgs - --max-blogs valid value sets maxBlogs', () => {
82
+ resetCliOptions();
83
+ parseArgs(['--max-blogs', '10']);
84
+ assert.strictEqual(cliOptions.maxBlogs, 10);
85
+ });
86
+ test('parseArgs - --blog-paths missing value throws error', () => {
87
+ resetCliOptions();
88
+ assert.throws(() => {
89
+ parseArgs(['--blog-paths']);
90
+ }, /--blog-paths requires a value/);
91
+ });
92
+ test('parseArgs - --blog-paths with comma separator', () => {
93
+ resetCliOptions();
94
+ parseArgs(['--blog-paths', '/blog,/news']);
95
+ assert.deepStrictEqual(cliOptions.customBlogPaths, ['/blog', '/news']);
96
+ });
97
+ test('parseArgs - --blog-paths with pipe separator', () => {
98
+ resetCliOptions();
99
+ parseArgs(['--blog-paths', '/blog|/news']);
100
+ assert.deepStrictEqual(cliOptions.customBlogPaths, ['/blog', '/news']);
101
+ });
102
+ test('parseArgs - --blog-paths with mixed separators', () => {
103
+ resetCliOptions();
104
+ parseArgs(['--blog-paths', '/blog,/news|/updates']);
105
+ assert.deepStrictEqual(cliOptions.customBlogPaths, ['/blog', '/news', '/updates']);
106
+ });
107
+ test('extractBlogLinksFromHTML - finds blog links', () => {
108
+ const html = `
109
+ <html>
110
+ <body>
111
+ <a href="/blog">Blog</a>
112
+ <a href="/news">News</a>
113
+ <a href="/articles">Articles</a>
114
+ <a href="https://external.com/blog">External</a>
115
+ </body>
116
+ </html>
117
+ `;
118
+ const paths = extractBlogLinksFromHTML(html, 'https://example.com');
119
+ assert.ok(paths.length > 0, 'Should find blog paths');
120
+ assert.ok(paths.includes('/blog'), 'Should include /blog');
121
+ });
122
+ test('extractBlogLinksFromHTML - only same-origin links', () => {
123
+ const html = `
124
+ <html>
125
+ <body>
126
+ <a href="/blog">Blog</a>
127
+ <a href="https://external.com/blog">External</a>
128
+ </body>
129
+ </html>
130
+ `;
131
+ const paths = extractBlogLinksFromHTML(html, 'https://example.com');
132
+ assert.ok(!paths.includes('https://external.com/blog'), 'Should not include external links');
133
+ });
134
+ test('extractBlogLinksFromHTML - keyword matching', () => {
135
+ const html = `
136
+ <html>
137
+ <body>
138
+ <a href="/blog">Blog</a>
139
+ <a href="/random">Random</a>
140
+ </body>
141
+ </html>
142
+ `;
143
+ const paths = extractBlogLinksFromHTML(html, 'https://example.com');
144
+ assert.ok(paths.includes('/blog'), 'Should find /blog via keyword');
145
+ });
146
+ test('discoverBlogSubdirectories - uses custom paths when provided', () => {
147
+ resetCliOptions();
148
+ cliOptions.customBlogPaths = ['/custom1', '/custom2'];
149
+ cliOptions.maxBlogs = 10;
150
+ const paths = discoverBlogSubdirectories('https://example.com');
151
+ assert.ok(paths.includes('/custom1'));
152
+ assert.ok(paths.includes('/custom2'));
153
+ });
154
+ test('discoverBlogSubdirectories - respects maxBlogs limit', () => {
155
+ resetCliOptions();
156
+ cliOptions.maxBlogs = 3;
157
+ const paths = discoverBlogSubdirectories('https://example.com');
158
+ assert.strictEqual(paths.length, 3);
159
+ });
160
+ test('discoverBlogSubdirectories - falls back to COMMON_BLOG_PATHS when no HTML', () => {
161
+ resetCliOptions();
162
+ cliOptions.customBlogPaths = null;
163
+ const paths = discoverBlogSubdirectories('https://example.com', null);
164
+ assert.ok(paths.length > 0);
165
+ assert.ok(paths.some(p => COMMON_BLOG_PATHS.includes(p)));
166
+ });
167
+ test('feed validation logic - valid RSS should pass', () => {
168
+ const validRSS = `<?xml version="1.0"?>
169
+ <rss version="2.0">
170
+ <channel>
171
+ <title>Test Feed</title>
172
+ </channel>
173
+ </rss>`;
174
+ const contentType = 'application/rss+xml';
175
+ const hasXmlDeclaration = validRSS.trimStart().startsWith('<?xml') || validRSS.includes('<?xml');
176
+ const hasXmlContentType = contentType.includes('xml') || contentType.includes('rss') || contentType.includes('atom');
177
+ const hasRssOrFeed = validRSS.includes('<rss') || validRSS.includes('<feed');
178
+ const isHtml = contentType.includes('text/html');
179
+ assert.ok(hasXmlDeclaration);
180
+ assert.ok(hasXmlContentType);
181
+ assert.ok(hasRssOrFeed);
182
+ assert.ok(!isHtml);
183
+ assert.ok(hasRssOrFeed && (hasXmlDeclaration || hasXmlContentType) && !isHtml);
184
+ });
185
+ test('feed validation logic - HTML with <rss> should be rejected', () => {
186
+ const htmlWithRss = `<html>
187
+ <body>
188
+ <p>Check out our <rss> feed!</p>
189
+ </body>
190
+ </html>`;
191
+ const contentType = 'text/html';
192
+ const hasXmlDeclaration = htmlWithRss.trimStart().startsWith('<?xml') || htmlWithRss.includes('<?xml');
193
+ const hasXmlContentType = contentType.includes('xml') || contentType.includes('rss') || contentType.includes('atom');
194
+ const hasRssOrFeed = htmlWithRss.includes('<rss') || htmlWithRss.includes('<feed');
195
+ const isHtml = contentType.includes('text/html');
196
+ assert.ok(isHtml, 'Should detect HTML content type');
197
+ assert.ok(!(hasRssOrFeed && (hasXmlDeclaration || hasXmlContentType) && !isHtml), 'Should reject HTML');
198
+ });
199
+ test('feed validation logic - valid Atom should pass', () => {
200
+ const validAtom = `<?xml version="1.0"?>
201
+ <feed xmlns="http://www.w3.org/2005/Atom">
202
+ <title>Test Feed</title>
203
+ </feed>`;
204
+ const contentType = 'application/atom+xml';
205
+ const hasXmlDeclaration = validAtom.trimStart().startsWith('<?xml') || validAtom.includes('<?xml');
206
+ const hasXmlContentType = contentType.includes('xml') || contentType.includes('rss') || contentType.includes('atom');
207
+ const hasRssOrFeed = validAtom.includes('<rss') || validAtom.includes('<feed');
208
+ const isHtml = contentType.includes('text/html');
209
+ assert.ok(hasXmlDeclaration);
210
+ assert.ok(hasXmlContentType);
211
+ assert.ok(hasRssOrFeed);
212
+ assert.ok(!isHtml);
213
+ assert.ok(hasRssOrFeed && (hasXmlDeclaration || hasXmlContentType) && !isHtml);
214
+ });
215
+ //# sourceMappingURL=find-rss-feeds.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-rss-feeds.test.js","sourceRoot":"","sources":["../find-rss-feeds.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,21 +1,24 @@
1
1
  {
2
2
  "name": "rss-agent-discovery",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "AI agent-focused RSS feed discovery. JSON output, semantic exit codes.",
5
5
  "main": "dist/find-rss-feeds.js",
6
6
  "type": "module",
7
7
  "bin": {
8
- "rss-agent-discovery": "dist/find-rss-feeds.js",
9
- "rss-discover": "dist/find-rss-feeds.js"
8
+ "rss-agent-discovery": "bin/rss-agent-discovery",
9
+ "rss-discover": "bin/rss-agent-discovery"
10
10
  },
11
11
  "files": [
12
- "dist"
12
+ "dist",
13
+ "bin"
13
14
  ],
14
15
  "scripts": {
15
16
  "build": "tsc",
16
17
  "start": "node dist/find-rss-feeds.js",
17
18
  "dev": "tsc && node dist/find-rss-feeds.js",
18
- "test": "npm run build && node dist/find-rss-feeds.js https://vercel.com https://news.ycombinator.com | jq",
19
+ "test": "npm run test:unit && npm run test:smoke",
20
+ "test:unit": "npm run build && node --test dist/find-rss-feeds.test.js",
21
+ "test:smoke": "npm run build && node dist/find-rss-feeds.js https://vercel.com https://news.ycombinator.com | jq",
19
22
  "prepublishOnly": "npm run build"
20
23
  },
21
24
  "keywords": [
@@ -29,6 +32,17 @@
29
32
  "json"
30
33
  ],
31
34
  "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/brooksy4503/rss-agent-discovery.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/brooksy4503/rss-agent-discovery/issues"
41
+ },
42
+ "homepage": "https://github.com/brooksy4503/rss-agent-discovery#readme",
43
+ "engines": {
44
+ "node": ">=18"
45
+ },
32
46
  "dependencies": {
33
47
  "cheerio": "^1.0.0"
34
48
  },