@ozzylabs/feedradar 0.1.4 → 0.1.5

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 (117) hide show
  1. package/README.ja.md +12 -6
  2. package/README.md +10 -5
  3. package/dist/agents/claude-code.d.ts +12 -1
  4. package/dist/agents/claude-code.d.ts.map +1 -1
  5. package/dist/agents/claude-code.js +9 -5
  6. package/dist/agents/claude-code.js.map +1 -1
  7. package/dist/agents/codex-cli.d.ts +7 -1
  8. package/dist/agents/codex-cli.d.ts.map +1 -1
  9. package/dist/agents/codex-cli.js +9 -5
  10. package/dist/agents/codex-cli.js.map +1 -1
  11. package/dist/agents/copilot.d.ts +7 -1
  12. package/dist/agents/copilot.d.ts.map +1 -1
  13. package/dist/agents/copilot.js +9 -5
  14. package/dist/agents/copilot.js.map +1 -1
  15. package/dist/agents/gemini-cli.d.ts +7 -1
  16. package/dist/agents/gemini-cli.d.ts.map +1 -1
  17. package/dist/agents/gemini-cli.js +9 -5
  18. package/dist/agents/gemini-cli.js.map +1 -1
  19. package/dist/agents/index.d.ts +1 -1
  20. package/dist/agents/index.d.ts.map +1 -1
  21. package/dist/agents/types.d.ts +33 -0
  22. package/dist/agents/types.d.ts.map +1 -1
  23. package/dist/cli/_progress.d.ts +138 -0
  24. package/dist/cli/_progress.d.ts.map +1 -0
  25. package/dist/cli/_progress.js +176 -0
  26. package/dist/cli/_progress.js.map +1 -0
  27. package/dist/cli/index.d.ts.map +1 -1
  28. package/dist/cli/index.js +2 -0
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/research.d.ts +18 -20
  31. package/dist/cli/research.d.ts.map +1 -1
  32. package/dist/cli/research.js +318 -203
  33. package/dist/cli/research.js.map +1 -1
  34. package/dist/cli/review.d.ts +7 -0
  35. package/dist/cli/review.d.ts.map +1 -1
  36. package/dist/cli/review.js +46 -1
  37. package/dist/cli/review.js.map +1 -1
  38. package/dist/cli/source.d.ts +23 -2
  39. package/dist/cli/source.d.ts.map +1 -1
  40. package/dist/cli/source.js +425 -7
  41. package/dist/cli/source.js.map +1 -1
  42. package/dist/cli/update.d.ts +7 -0
  43. package/dist/cli/update.d.ts.map +1 -1
  44. package/dist/cli/update.js +41 -1
  45. package/dist/cli/update.js.map +1 -1
  46. package/dist/cli/watch.d.ts.map +1 -1
  47. package/dist/cli/watch.js +65 -3
  48. package/dist/cli/watch.js.map +1 -1
  49. package/dist/cli/workflow/generate-combined.d.ts +100 -0
  50. package/dist/cli/workflow/generate-combined.d.ts.map +1 -0
  51. package/dist/cli/workflow/generate-combined.js +387 -0
  52. package/dist/cli/workflow/generate-combined.js.map +1 -0
  53. package/dist/cli/workflow/generate-watch.d.ts +142 -0
  54. package/dist/cli/workflow/generate-watch.d.ts.map +1 -0
  55. package/dist/cli/workflow/generate-watch.js +338 -0
  56. package/dist/cli/workflow/generate-watch.js.map +1 -0
  57. package/dist/cli/workflow.d.ts +29 -0
  58. package/dist/cli/workflow.d.ts.map +1 -0
  59. package/dist/cli/workflow.js +66 -0
  60. package/dist/cli/workflow.js.map +1 -0
  61. package/dist/core/feeds/_fetch.d.ts +10 -0
  62. package/dist/core/feeds/_fetch.d.ts.map +1 -1
  63. package/dist/core/feeds/_fetch.js +182 -0
  64. package/dist/core/feeds/_fetch.js.map +1 -1
  65. package/dist/core/feeds/_jsonpath.d.ts +57 -0
  66. package/dist/core/feeds/_jsonpath.d.ts.map +1 -0
  67. package/dist/core/feeds/_jsonpath.js +207 -0
  68. package/dist/core/feeds/_jsonpath.js.map +1 -0
  69. package/dist/core/feeds/html-js.d.ts +8 -0
  70. package/dist/core/feeds/html-js.d.ts.map +1 -1
  71. package/dist/core/feeds/html-js.js +47 -1
  72. package/dist/core/feeds/html-js.js.map +1 -1
  73. package/dist/core/feeds/index.d.ts +1 -1
  74. package/dist/core/feeds/index.d.ts.map +1 -1
  75. package/dist/core/feeds/index.js +4 -0
  76. package/dist/core/feeds/index.js.map +1 -1
  77. package/dist/core/feeds/json-api.d.ts +3 -0
  78. package/dist/core/feeds/json-api.d.ts.map +1 -0
  79. package/dist/core/feeds/json-api.js +723 -0
  80. package/dist/core/feeds/json-api.js.map +1 -0
  81. package/dist/core/feeds/json-feed.d.ts +11 -0
  82. package/dist/core/feeds/json-feed.d.ts.map +1 -0
  83. package/dist/core/feeds/json-feed.js +242 -0
  84. package/dist/core/feeds/json-feed.js.map +1 -0
  85. package/dist/core/feeds/types.d.ts +123 -0
  86. package/dist/core/feeds/types.d.ts.map +1 -1
  87. package/dist/core/progress.d.ts +101 -0
  88. package/dist/core/progress.d.ts.map +1 -0
  89. package/dist/core/progress.js +212 -0
  90. package/dist/core/progress.js.map +1 -0
  91. package/dist/core/recipes.d.ts +138 -0
  92. package/dist/core/recipes.d.ts.map +1 -0
  93. package/dist/core/recipes.js +238 -0
  94. package/dist/core/recipes.js.map +1 -0
  95. package/dist/core/watcher.d.ts +61 -1
  96. package/dist/core/watcher.d.ts.map +1 -1
  97. package/dist/core/watcher.js +99 -2
  98. package/dist/core/watcher.js.map +1 -1
  99. package/dist/recipes/aws-whats-new.yaml +61 -0
  100. package/dist/recipes/dev-to.yaml +40 -0
  101. package/dist/schemas/index.d.ts +1 -0
  102. package/dist/schemas/index.d.ts.map +1 -1
  103. package/dist/schemas/index.js +1 -0
  104. package/dist/schemas/index.js.map +1 -1
  105. package/dist/schemas/recipe.d.ts +115 -0
  106. package/dist/schemas/recipe.d.ts.map +1 -0
  107. package/dist/schemas/recipe.js +54 -0
  108. package/dist/schemas/recipe.js.map +1 -0
  109. package/dist/schemas/source.d.ts +130 -0
  110. package/dist/schemas/source.d.ts.map +1 -1
  111. package/dist/schemas/source.js +130 -0
  112. package/dist/schemas/source.js.map +1 -1
  113. package/dist/templates/agents/AGENTS.md +31 -3
  114. package/dist/templates/feedradar.md +23 -8
  115. package/dist/templates/workflows/combined.template.yaml.tmpl +110 -0
  116. package/dist/templates/workflows/watch.template.yaml.tmpl +103 -0
  117. package/package.json +1 -2
@@ -40,6 +40,184 @@ function parsePositiveInt(value, fallback) {
40
40
  return fallback;
41
41
  return n;
42
42
  }
43
+ /**
44
+ * SSRF host-blocklist for the shared fetch wrapper (ADR-0009 §D5b /
45
+ * ADR-0012 §D5b). Every adapter that funnels through `fetchWithRetry`
46
+ * inherits this check, including pagination follow-up URLs and recipe-
47
+ * supplied URLs in `kind: json-api` where a malicious recipe / compromised
48
+ * upstream could otherwise point us at:
49
+ *
50
+ * - cloud instance metadata endpoints (`169.254.169.254`, etc.) — IAM
51
+ * credential theft
52
+ * - LAN / VPC internal services (`10.0.0.0/8`, `192.168.0.0/16`,
53
+ * `172.16.0.0/12`) — internal admin panels, unauthenticated dev servers
54
+ * - loopback (`127.0.0.0/8` / `::1`) — user's localhost dev / debug services
55
+ * - link-local (`169.254.0.0/16` / `fe80::/10`)
56
+ * - IPv6 ULA (`fc00::/7`)
57
+ * - non-HTTP schemes (`file://`, `data:`, `gopher://`, `ftp://`, …) —
58
+ * filesystem reads / SMTP smuggling / arbitrary protocol abuse
59
+ *
60
+ * Scope: this is the minimum useful defense — we inspect the URL hostname
61
+ * literal only. We do not resolve DNS; an attacker can still get past this
62
+ * by pointing a public DNS record at `127.0.0.1` (DNS rebinding). That
63
+ * deeper defense is tracked separately (see ADR-0009 §D5b note on DNS
64
+ * rebinding); the literal check still cuts off the common SSRF recipes
65
+ * (metadata IPs, `file://`, `localhost`) for negligible cost.
66
+ *
67
+ * Override via `RADAR_FETCH_HOST_ALLOWLIST` (comma-separated host literals).
68
+ * Intended for testing (e2e smoke tests that spin up a local HTTP fixture
69
+ * on `127.0.0.1`) and explicit opt-in to private-network targets. The
70
+ * allowlist is matched against the URL hostname after lowercasing and
71
+ * trimming IPv6 brackets; entries are exact-match (no glob / CIDR).
72
+ */
73
+ /** IPv4 octet sequence — used as a heuristic to detect numeric-only hosts. */
74
+ const IPV4_PATTERN = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
75
+ /** Hostnames that always resolve to a loopback / unspecified address. */
76
+ const BLOCKED_HOSTNAMES = new Set(["localhost", "ip6-localhost", "ip6-loopback"]);
77
+ /**
78
+ * Parse the `RADAR_FETCH_HOST_ALLOWLIST` env into a normalized Set. We
79
+ * lowercase and strip IPv6 brackets so users can write either `[::1]` or
80
+ * `::1` and have the override apply.
81
+ */
82
+ function parseHostAllowlist(value) {
83
+ if (!value)
84
+ return new Set();
85
+ const entries = value
86
+ .split(",")
87
+ .map((s) => s.trim())
88
+ .filter((s) => s.length > 0)
89
+ .map((s) => normalizeHost(s));
90
+ return new Set(entries);
91
+ }
92
+ /** Lowercase a host and strip wrapping `[` / `]` from IPv6 literals. */
93
+ function normalizeHost(host) {
94
+ const lower = host.toLowerCase();
95
+ if (lower.startsWith("[") && lower.endsWith("]")) {
96
+ return lower.slice(1, -1);
97
+ }
98
+ return lower;
99
+ }
100
+ /** Whether a host string is an IPv4 address in one of the private ranges. */
101
+ function isPrivateIPv4(host) {
102
+ const match = host.match(IPV4_PATTERN);
103
+ if (!match)
104
+ return false;
105
+ const [, a, b, c, d] = match;
106
+ const o1 = Number.parseInt(a ?? "", 10);
107
+ const o2 = Number.parseInt(b ?? "", 10);
108
+ const o3 = Number.parseInt(c ?? "", 10);
109
+ const o4 = Number.parseInt(d ?? "", 10);
110
+ // Reject malformed octets (>255). The URL parser already rejects most of
111
+ // these but we keep the bound check for defense in depth.
112
+ if (![o1, o2, o3, o4].every((n) => Number.isFinite(n) && n >= 0 && n <= 255)) {
113
+ return true; // malformed = unsafe; treat as blocked.
114
+ }
115
+ // 10.0.0.0/8
116
+ if (o1 === 10)
117
+ return true;
118
+ // 172.16.0.0/12 (172.16.x.x – 172.31.x.x)
119
+ if (o1 === 172 && o2 >= 16 && o2 <= 31)
120
+ return true;
121
+ // 192.168.0.0/16
122
+ if (o1 === 192 && o2 === 168)
123
+ return true;
124
+ // 127.0.0.0/8 (loopback)
125
+ if (o1 === 127)
126
+ return true;
127
+ // 169.254.0.0/16 (link-local / AWS metadata)
128
+ if (o1 === 169 && o2 === 254)
129
+ return true;
130
+ // 0.0.0.0/8 (unspecified — listens-everywhere on Linux)
131
+ if (o1 === 0)
132
+ return true;
133
+ return false;
134
+ }
135
+ /**
136
+ * Whether an IPv6 literal (already lowercase, brackets stripped) is in a
137
+ * blocked range. We do not implement full address arithmetic — instead we
138
+ * pattern-match the textual prefix, which is enough for the well-known
139
+ * ranges we want to block (loopback, link-local, ULA, unspecified).
140
+ *
141
+ * Edge: `::ffff:a.b.c.d` IPv4-mapped form is normalized by Node's URL
142
+ * parser to bracketed IPv6, so we also rerun the IPv4 check on the trailing
143
+ * dotted-quad to catch the mapped-loopback case (`::ffff:127.0.0.1`).
144
+ */
145
+ function isPrivateIPv6(host) {
146
+ if (host === "::" || host === "::1")
147
+ return true;
148
+ // Link-local: fe80::/10 — first 10 bits are 1111 1110 10, which in hex
149
+ // means `fe80::` through `febf::`. Match the first two chars after fe.
150
+ if (/^fe[89ab][0-9a-f]?:/.test(host))
151
+ return true;
152
+ // ULA: fc00::/7 — first 7 bits are 1111 110, i.e. fc00–fdff.
153
+ if (/^f[cd][0-9a-f]{2}:/.test(host))
154
+ return true;
155
+ // IPv4-mapped IPv6, dotted-quad form: ::ffff:127.0.0.1, ::ffff:10.0.0.1
156
+ const v4MappedDotted = host.match(/^::ffff:([\d.]+)$/);
157
+ if (v4MappedDotted?.[1] && isPrivateIPv4(v4MappedDotted[1]))
158
+ return true;
159
+ // IPv4-mapped IPv6, hex form: Node's URL parser normalizes
160
+ // `::ffff:127.0.0.1` → `[::ffff:7f00:1]`, so we also accept the two
161
+ // 16-bit hex groups after `::ffff:` and reconstruct the dotted quad.
162
+ const v4MappedHex = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
163
+ if (v4MappedHex?.[1] && v4MappedHex[2]) {
164
+ const high = Number.parseInt(v4MappedHex[1], 16);
165
+ const low = Number.parseInt(v4MappedHex[2], 16);
166
+ if (Number.isFinite(high) && Number.isFinite(low)) {
167
+ const dotted = `${(high >> 8) & 0xff}.${high & 0xff}.${(low >> 8) & 0xff}.${low & 0xff}`;
168
+ if (isPrivateIPv4(dotted))
169
+ return true;
170
+ }
171
+ }
172
+ return false;
173
+ }
174
+ /**
175
+ * Validate a fetch URL against the SSRF host blocklist (ADR-0009 §D5b).
176
+ *
177
+ * Throws a `TypeError` with a user-friendly message when the URL is
178
+ * rejected. Returns nothing on success.
179
+ *
180
+ * Exported so adapters / tests can trigger the check independently of
181
+ * `fetchWithRetry` (e.g. validate a recipe URL at config-load time).
182
+ */
183
+ export function validateFetchUrl(url, env = process.env) {
184
+ let parsed;
185
+ try {
186
+ parsed = url instanceof URL ? url : new URL(url);
187
+ }
188
+ catch {
189
+ throw new TypeError(`refused to fetch invalid URL: ${String(url)}`);
190
+ }
191
+ const allowlist = parseHostAllowlist(env.RADAR_FETCH_HOST_ALLOWLIST);
192
+ const host = normalizeHost(parsed.hostname);
193
+ // Allowlist short-circuits both scheme and host checks so users testing
194
+ // a local fixture over `http://127.0.0.1:PORT/` do not need to fight
195
+ // the blocklist for every adapter test.
196
+ if (allowlist.has(host))
197
+ return;
198
+ // Reject non-HTTP(S) schemes outright. `data:` / `file:` / `gopher:` /
199
+ // `ftp:` / `javascript:` all have no business being fetched through an
200
+ // adapter; even when they would not technically SSRF, they break the
201
+ // wrapper's invariant ("HTTP request, retry on transient errors").
202
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
203
+ throw new TypeError(`refused to fetch URL with non-HTTP scheme "${parsed.protocol}" (${String(url)}). ` +
204
+ `Only http:// and https:// are allowed.`);
205
+ }
206
+ // Blocked literal hostnames (`localhost` etc.).
207
+ if (BLOCKED_HOSTNAMES.has(host)) {
208
+ throw new TypeError(`refused to fetch loopback hostname "${host}" (${String(url)}). ` +
209
+ `Set RADAR_FETCH_HOST_ALLOWLIST=${host} to override (testing only).`);
210
+ }
211
+ // Numeric IPv4 / IPv6 ranges.
212
+ if (isPrivateIPv4(host)) {
213
+ throw new TypeError(`refused to fetch private / loopback IPv4 address "${host}" (${String(url)}). ` +
214
+ `Set RADAR_FETCH_HOST_ALLOWLIST=${host} to override (testing only).`);
215
+ }
216
+ if (host.includes(":") && isPrivateIPv6(host)) {
217
+ throw new TypeError(`refused to fetch private / loopback IPv6 address "${host}" (${String(url)}). ` +
218
+ `Set RADAR_FETCH_HOST_ALLOWLIST=${host} to override (testing only).`);
219
+ }
220
+ }
43
221
  /**
44
222
  * Build a `FetchConfig` from env vars + explicit overrides.
45
223
  *
@@ -134,6 +312,10 @@ export async function fetchWithRetry(fetchImpl, url, init = {}, options = {}) {
134
312
  const config = resolveFetchConfig(options);
135
313
  const sleep = options.sleep ?? defaultSleep;
136
314
  const callerSignal = options.signal ?? init.signal;
315
+ // SSRF host blocklist (ADR-0009 / ADR-0012 §D5b). Runs *before* the retry
316
+ // loop so a blocked URL fails fast with a single clear error rather than
317
+ // looking like a transient network failure across multiple attempts.
318
+ validateFetchUrl(url, options.env ?? process.env);
137
319
  let lastError;
138
320
  let lastResponse;
139
321
  // attempts = retries + 1; e.g. retries=2 → 3 total attempts.
@@ -1 +1 @@
1
- {"version":3,"file":"_fetch.js","sourceRoot":"","sources":["../../../src/core/feeds/_fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_fetch.js","sourceRoot":"","sources":["../../../src/core/feeds/_fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * JSONPath-lite — minimal expression evaluator for the `kind: json-api` adapter
3
+ * (ADR-0012 §D2).
4
+ *
5
+ * Supports the smallest subset of JSONPath that covers the page-based JSON
6
+ * APIs FeedRadar targets (AWS What's New, dev.to, Anthropic news, …) without
7
+ * bringing in a 30 KB dep:
8
+ *
9
+ * $ — root
10
+ * .field — property access (dotted form)
11
+ * ['field'] — property access (bracket form, single key)
12
+ * [N] — array index (non-negative integer)
13
+ * [*] — array wildcard (returns all elements)
14
+ * .* — object wildcard (returns all values)
15
+ * $.a.b.c — chained property access
16
+ * $.array[*].field — chain after wildcard
17
+ *
18
+ * Out of scope (throws `JsonPathError` at compile time):
19
+ *
20
+ * ..field — recursive descent
21
+ * [?(...)] — filter expressions
22
+ * [N:M] — slicing
23
+ * ['a','b'] — multi-key
24
+ * length() / min() / ... — functions
25
+ *
26
+ * Two evaluation modes:
27
+ *
28
+ * - `selectOne(path, root)`: returns a single value (the first match), or
29
+ * `undefined` when nothing matches. Used for scalar selectors like
30
+ * `selectors.title` / `selectors.url`.
31
+ *
32
+ * - `selectAll(path, root)`: returns an array of all matches. Used for
33
+ * `selectors.items` which is expected to yield the per-item list.
34
+ *
35
+ * Errors:
36
+ *
37
+ * - `JsonPathError` (compile time): syntactically invalid or unsupported.
38
+ * - At runtime, missing properties / out-of-range indices simply return
39
+ * `undefined` / `[]` so recipe authors can selectors-and-shrug their way
40
+ * through optional fields like `summary` / `publishedAt`.
41
+ */
42
+ /** Error thrown when a path expression is syntactically invalid or uses an unsupported feature. */
43
+ export declare class JsonPathError extends Error {
44
+ constructor(message: string);
45
+ }
46
+ /**
47
+ * Return the first match for `path` against `root`, or `undefined` when the
48
+ * path does not match anything. Used by scalar selectors.
49
+ */
50
+ export declare function selectOne(path: string, root: unknown): unknown;
51
+ /**
52
+ * Return all matches for `path` against `root`. Used by `selectors.items` to
53
+ * pick the per-item list. Always returns an array (never `undefined`) so the
54
+ * adapter can iterate without a null check.
55
+ */
56
+ export declare function selectAll(path: string, root: unknown): unknown[];
57
+ //# sourceMappingURL=_jsonpath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_jsonpath.d.ts","sourceRoot":"","sources":["../../../src/core/feeds/_jsonpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,mGAAmG;AACnG,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AA6JD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAEhE"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * JSONPath-lite — minimal expression evaluator for the `kind: json-api` adapter
3
+ * (ADR-0012 §D2).
4
+ *
5
+ * Supports the smallest subset of JSONPath that covers the page-based JSON
6
+ * APIs FeedRadar targets (AWS What's New, dev.to, Anthropic news, …) without
7
+ * bringing in a 30 KB dep:
8
+ *
9
+ * $ — root
10
+ * .field — property access (dotted form)
11
+ * ['field'] — property access (bracket form, single key)
12
+ * [N] — array index (non-negative integer)
13
+ * [*] — array wildcard (returns all elements)
14
+ * .* — object wildcard (returns all values)
15
+ * $.a.b.c — chained property access
16
+ * $.array[*].field — chain after wildcard
17
+ *
18
+ * Out of scope (throws `JsonPathError` at compile time):
19
+ *
20
+ * ..field — recursive descent
21
+ * [?(...)] — filter expressions
22
+ * [N:M] — slicing
23
+ * ['a','b'] — multi-key
24
+ * length() / min() / ... — functions
25
+ *
26
+ * Two evaluation modes:
27
+ *
28
+ * - `selectOne(path, root)`: returns a single value (the first match), or
29
+ * `undefined` when nothing matches. Used for scalar selectors like
30
+ * `selectors.title` / `selectors.url`.
31
+ *
32
+ * - `selectAll(path, root)`: returns an array of all matches. Used for
33
+ * `selectors.items` which is expected to yield the per-item list.
34
+ *
35
+ * Errors:
36
+ *
37
+ * - `JsonPathError` (compile time): syntactically invalid or unsupported.
38
+ * - At runtime, missing properties / out-of-range indices simply return
39
+ * `undefined` / `[]` so recipe authors can selectors-and-shrug their way
40
+ * through optional fields like `summary` / `publishedAt`.
41
+ */
42
+ /** Error thrown when a path expression is syntactically invalid or uses an unsupported feature. */
43
+ export class JsonPathError extends Error {
44
+ constructor(message) {
45
+ super(message);
46
+ this.name = "JsonPathError";
47
+ }
48
+ }
49
+ /** Tokens that mark an unsupported (out-of-scope) construct. Detected pre-parse. */
50
+ const UNSUPPORTED_PATTERNS = [
51
+ { pattern: /\.\./, message: "recursive descent ('..') is not supported" },
52
+ { pattern: /\[\?/, message: "filter expression ('[?(...)]') is not supported" },
53
+ { pattern: /\[\s*\d+\s*:/, message: "slice ('[N:M]') is not supported" },
54
+ { pattern: /\[\s*['"][^'"]+['"]\s*,/, message: "multi-key ('[a,b]') is not supported" },
55
+ ];
56
+ /**
57
+ * Compile a path expression into an array of steps.
58
+ *
59
+ * The expression must start with `$`. Trailing whitespace is tolerated; any
60
+ * other deviation throws so misconfigured recipes surface at parse time
61
+ * (rather than silently returning empty selectors on every fetch).
62
+ */
63
+ function compile(path) {
64
+ const trimmed = path.trim();
65
+ if (trimmed.length === 0) {
66
+ throw new JsonPathError("path is empty");
67
+ }
68
+ for (const { pattern, message } of UNSUPPORTED_PATTERNS) {
69
+ if (pattern.test(trimmed)) {
70
+ throw new JsonPathError(`jsonpath-lite: ${message} (path: '${path}')`);
71
+ }
72
+ }
73
+ if (trimmed[0] !== "$") {
74
+ throw new JsonPathError(`jsonpath-lite: path must start with '$' (path: '${path}')`);
75
+ }
76
+ const steps = [];
77
+ let i = 1; // past the '$'
78
+ while (i < trimmed.length) {
79
+ const ch = trimmed[i];
80
+ if (ch === ".") {
81
+ i++;
82
+ // Object wildcard: `.*`
83
+ if (trimmed[i] === "*") {
84
+ steps.push({ kind: "wildcard-object" });
85
+ i++;
86
+ continue;
87
+ }
88
+ // Property: `.field` — consume identifier-ish chars.
89
+ const start = i;
90
+ while (i < trimmed.length && /[A-Za-z0-9_-]/.test(trimmed[i] ?? "")) {
91
+ i++;
92
+ }
93
+ if (start === i) {
94
+ throw new JsonPathError(`jsonpath-lite: expected property name after '.' at position ${i} (path: '${path}')`);
95
+ }
96
+ steps.push({ kind: "prop", name: trimmed.slice(start, i) });
97
+ continue;
98
+ }
99
+ if (ch === "[") {
100
+ // Find the matching close bracket.
101
+ const close = trimmed.indexOf("]", i);
102
+ if (close === -1) {
103
+ throw new JsonPathError(`jsonpath-lite: unclosed '[' at position ${i} (path: '${path}')`);
104
+ }
105
+ const inner = trimmed.slice(i + 1, close).trim();
106
+ if (inner === "*") {
107
+ steps.push({ kind: "wildcard-array" });
108
+ }
109
+ else if (/^-?\d+$/.test(inner)) {
110
+ const idx = Number.parseInt(inner, 10);
111
+ if (idx < 0) {
112
+ throw new JsonPathError(`jsonpath-lite: negative index not supported (path: '${path}')`);
113
+ }
114
+ steps.push({ kind: "index", index: idx });
115
+ }
116
+ else if ((inner.startsWith("'") && inner.endsWith("'")) ||
117
+ (inner.startsWith('"') && inner.endsWith('"'))) {
118
+ // Single-key bracket form: ['field'] / ["field"]
119
+ const name = inner.slice(1, -1);
120
+ if (name.length === 0) {
121
+ throw new JsonPathError(`jsonpath-lite: empty bracket key not supported (path: '${path}')`);
122
+ }
123
+ steps.push({ kind: "prop", name });
124
+ }
125
+ else {
126
+ throw new JsonPathError(`jsonpath-lite: unsupported bracket expression '[${inner}]' (path: '${path}')`);
127
+ }
128
+ i = close + 1;
129
+ continue;
130
+ }
131
+ throw new JsonPathError(`jsonpath-lite: unexpected character '${ch}' at position ${i} (path: '${path}')`);
132
+ }
133
+ return steps;
134
+ }
135
+ /** Apply one step to a single value, producing zero or more values. */
136
+ function applyStep(step, value) {
137
+ if (value == null)
138
+ return [];
139
+ switch (step.kind) {
140
+ case "prop": {
141
+ if (typeof value !== "object")
142
+ return [];
143
+ // Arrays do not expose arbitrary string properties for JSON purposes;
144
+ // we restrict to plain objects so `$.items.title` does not accidentally
145
+ // match `Array.prototype.title`.
146
+ if (Array.isArray(value))
147
+ return [];
148
+ const obj = value;
149
+ // `hasOwnProperty` avoids picking up prototype-chain pollution.
150
+ if (!Object.hasOwn(obj, step.name))
151
+ return [];
152
+ return [obj[step.name]];
153
+ }
154
+ case "index": {
155
+ if (!Array.isArray(value))
156
+ return [];
157
+ if (step.index >= value.length)
158
+ return [];
159
+ return [value[step.index]];
160
+ }
161
+ case "wildcard-array": {
162
+ if (!Array.isArray(value))
163
+ return [];
164
+ return value.slice();
165
+ }
166
+ case "wildcard-object": {
167
+ if (typeof value !== "object" || Array.isArray(value))
168
+ return [];
169
+ return Object.values(value);
170
+ }
171
+ }
172
+ }
173
+ /**
174
+ * Walk every compiled step, fanning out at wildcards. Returns the full set
175
+ * of matches in document order.
176
+ */
177
+ function evaluate(path, root) {
178
+ const steps = compile(path);
179
+ let frontier = [root];
180
+ for (const step of steps) {
181
+ const next = [];
182
+ for (const v of frontier) {
183
+ next.push(...applyStep(step, v));
184
+ }
185
+ frontier = next;
186
+ if (frontier.length === 0)
187
+ return [];
188
+ }
189
+ return frontier;
190
+ }
191
+ /**
192
+ * Return the first match for `path` against `root`, or `undefined` when the
193
+ * path does not match anything. Used by scalar selectors.
194
+ */
195
+ export function selectOne(path, root) {
196
+ const matches = evaluate(path, root);
197
+ return matches.length > 0 ? matches[0] : undefined;
198
+ }
199
+ /**
200
+ * Return all matches for `path` against `root`. Used by `selectors.items` to
201
+ * pick the per-item list. Always returns an array (never `undefined`) so the
202
+ * adapter can iterate without a null check.
203
+ */
204
+ export function selectAll(path, root) {
205
+ return evaluate(path, root);
206
+ }
207
+ //# sourceMappingURL=_jsonpath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_jsonpath.js","sourceRoot":"","sources":["../../../src/core/feeds/_jsonpath.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,14 @@ export interface HtmlJsAdapterOptions extends FeedAdapterOptions {
66
66
  * deterministically testable without polluting the real process env.
67
67
  */
68
68
  env?: NodeJS.ProcessEnv;
69
+ /**
70
+ * Test seam (#198): override the `Still waiting…` reminder threshold in
71
+ * milliseconds. Production hardcodes 10s (a third of the default 30s
72
+ * timeout) so the prediction triggers well before the actual selector
73
+ * timeout. Tests shrink it so the reminder fires deterministically without
74
+ * blocking the suite on real time.
75
+ */
76
+ stillWaitingMs?: number;
69
77
  }
70
78
  export declare const htmlJsAdapter: FeedAdapter;
71
79
  //# sourceMappingURL=html-js.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-js.d.ts","sourceRoot":"","sources":["../../../src/core/feeds/html-js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA2DlE;;;;;GAKG;AACH;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE;QACR,MAAM,CAAC,OAAO,CAAC,EAAE;YACf,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,KAAK,CAAC,EAAE,sBAAsB,CAAC;SAChC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;KACpC,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,OAAO,CAAC,EAAE;QACnB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,+EAA+E;IAC/E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAqBD,eAAO,MAAM,aAAa,EAAE,WAmG3B,CAAC"}
1
+ {"version":3,"file":"html-js.d.ts","sourceRoot":"","sources":["../../../src/core/feeds/html-js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoElE;;;;;GAKG;AACH;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE;QACR,MAAM,CAAC,OAAO,CAAC,EAAE;YACf,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,KAAK,CAAC,EAAE,sBAAsB,CAAC;SAChC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;KACpC,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,OAAO,CAAC,EAAE;QACnB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,+EAA+E;IAC/E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAqBD,eAAO,MAAM,aAAa,EAAE,WAsI3B,CAAC"}
@@ -49,6 +49,15 @@ import { contentHash, parseHtmlDocument } from "./_html-common.js";
49
49
  * going through schema parse) still get the documented behavior.
50
50
  */
51
51
  const DEFAULT_TIMEOUT_MS = 30_000;
52
+ /**
53
+ * Default delay before the adapter emits a `Still waiting for "<sel>"…`
54
+ * reminder during `waitForSelector` (#198). Chosen at ~33% of the default
55
+ * 30s timeout so the user gets a heads-up well before the actual timeout
56
+ * fires; the reminder is purely informational and never causes the wait
57
+ * itself to abort. Override via `HtmlJsAdapterOptions.stillWaitingMs` in
58
+ * tests.
59
+ */
60
+ const DEFAULT_STILL_WAITING_MS = 10_000;
52
61
  /**
53
62
  * Default Playwright `page.goto()` waitUntil mode. `networkidle` is the
54
63
  * safest default for SPA / CSR pages where item data arrives via XHR after
@@ -88,6 +97,12 @@ export const htmlJsAdapter = {
88
97
  const playwright = options.playwright ?? (await loadPlaywright());
89
98
  const previous = options.state;
90
99
  const fetchedAt = new Date().toISOString();
100
+ // Progress reporter is optional — callers that did not opt in see the
101
+ // pre-#198 no-op behavior. Marker names follow ADR-0015 D4
102
+ // ("Chromium launching" / "Page navigated to <url>" etc.) verbatim so
103
+ // the user-guide stays accurate without per-call docstrings.
104
+ const progress = options.onProgress;
105
+ const stillWaitingMs = options.stillWaitingMs ?? DEFAULT_STILL_WAITING_MS;
91
106
  // Probe proxy env BEFORE launch. Playwright's `BrowserType.launch()` does
92
107
  // not honor `HTTPS_PROXY` / `HTTP_PROXY` automatically (unlike Node's
93
108
  // `--use-env-proxy` flag for built-in `fetch()`) — we must pass the URL
@@ -112,6 +127,7 @@ export const htmlJsAdapter = {
112
127
  : undefined;
113
128
  // Hardening: headless is forced true. Even if a future Playwright default
114
129
  // changes, the adapter pins it explicitly here.
130
+ progress?.phase("Launching Chromium…");
115
131
  const browser = await playwright.chromium.launch({
116
132
  headless: true,
117
133
  ...(proxyOption ? { proxy: proxyOption } : {}),
@@ -128,8 +144,37 @@ export const htmlJsAdapter = {
128
144
  try {
129
145
  const page = await context.newPage();
130
146
  try {
147
+ progress?.phase(`Navigating to ${source.url}…`);
131
148
  await page.goto(source.url, { waitUntil, timeout });
132
- await page.waitForSelector(waitFor, { timeout });
149
+ progress?.phase(`Waiting for selector "${waitFor}" (timeout: ${timeout}ms)…`);
150
+ // Long-running selector waits warrant a `Still waiting…` reminder
151
+ // so the user knows the adapter is alive (not hung). The timer is
152
+ // set up only when a progress reporter is wired so we do not keep
153
+ // an idle interval running in the no-progress fast path. `unref()`
154
+ // (when supported) lets the event loop exit if the underlying
155
+ // wait resolves quickly — we still clear the timer below in
156
+ // `finally`.
157
+ let stillWaitingTimer;
158
+ if (progress && stillWaitingMs > 0) {
159
+ const startedAt = Date.now();
160
+ stillWaitingTimer = setTimeout(() => {
161
+ const elapsed = Date.now() - startedAt;
162
+ const mm = String(Math.floor(elapsed / 60_000)).padStart(2, "0");
163
+ const ss = String(Math.floor((elapsed % 60_000) / 1000)).padStart(2, "0");
164
+ progress.phase(`Still waiting for "${waitFor}"… [${mm}:${ss}]`);
165
+ }, stillWaitingMs);
166
+ if (typeof stillWaitingTimer.unref === "function") {
167
+ stillWaitingTimer.unref();
168
+ }
169
+ }
170
+ try {
171
+ await page.waitForSelector(waitFor, { timeout });
172
+ }
173
+ finally {
174
+ if (stillWaitingTimer)
175
+ clearTimeout(stillWaitingTimer);
176
+ }
177
+ progress?.phase("Capturing page content…");
133
178
  html = await page.content();
134
179
  }
135
180
  finally {
@@ -143,6 +188,7 @@ export const htmlJsAdapter = {
143
188
  }
144
189
  }
145
190
  finally {
191
+ progress?.phase("Closing browser…");
146
192
  await browser.close();
147
193
  }
148
194
  // Dedup via content hash stored in the `lastEtag` slot (same convention
@@ -1 +1 @@
1
- {"version":3,"file":"html-js.js","sourceRoot":"","sources":["../../../src/core/feeds/html-js.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC;;;;GAIG;AACH,MAAM,kBAAkB,GAAiC,aAAa,CAAC;AAyEvE;;;GAGG;AACH,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC;QACH,wEAAwE;QACxE,kEAAkE;QAClE,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAA8B,CAAC;QACtE,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,+CAA+C,OAAO,KAAK;YACzD,wEAAwE,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,KAAK,EAAE,MAAc,EAAE,UAAgC,EAAE,EAAE,EAAE;QAClE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,EAAE,EAAE,OAAO,IAAI,kBAAkB,CAAC;QAClD,MAAM,SAAS,GAAG,EAAE,EAAE,SAAS,IAAI,kBAAkB,CAAC;QACtD,uEAAuE;QACvE,0EAA0E;QAC1E,MAAM,OAAO,GAAG,EAAE,EAAE,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC;QAE9C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,0EAA0E;QAC1E,sEAAsE;QACtE,wEAAwE;QACxE,sEAAsE;QACtE,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACvC,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,mEAAmE;QACnE,uEAAuE;QACvE,sEAAsE;QACtE,+BAA+B;QAC/B,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,SAAS;YAC3B,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS,CAAC,GAAG;gBACrB,mEAAmE;gBACnE,4DAA4D;gBAC5D,2CAA2C;gBAC3C,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,0EAA0E;QAC1E,gDAAgD;QAChD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/C,QAAQ,EAAE,IAAI;YACd,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,uEAAuE;YACvE,mEAAmE;YACnE,mEAAmE;YACnE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACvC,eAAe,EAAE,KAAK;gBACtB,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;oBACpD,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBACjD,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC9B,CAAC;wBAAS,CAAC;oBACT,mEAAmE;oBACnE,6DAA6D;oBAC7D,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,oEAAoE;QACpE,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE;oBACL,aAAa,EAAE,SAAS;oBACxB,QAAQ,EAAE,QAAQ;iBACnB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACzD,OAAO;YACL,KAAK;YACL,KAAK,EAAE;gBACL,aAAa,EAAE,SAAS;gBACxB,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"html-js.js","sourceRoot":"","sources":["../../../src/core/feeds/html-js.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Source } from "../../schemas/index.js";
2
2
  import type { FeedAdapter } from "./types.js";
3
3
  export declare function getFeedAdapter(kind: Source["kind"]): FeedAdapter;
4
- export type { FeedAdapter, FeedAdapterOptions, FeedFetchResult, FetchLike } from "./types.js";
4
+ export type { FeedAdapter, FeedAdapterOptions, FeedFetchDiag, FeedFetchResult, FetchLike, } from "./types.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/feeds/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAMhE;AAED,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/feeds/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAQrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY9C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAMhE;AAED,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,SAAS,GACV,MAAM,YAAY,CAAC"}