ax-audit 4.2.1 → 6.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.
Files changed (188) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +39 -4
  3. package/dist/baseline.js +1 -1
  4. package/dist/baseline.js.map +1 -1
  5. package/dist/check-ids.js +1 -1
  6. package/dist/check-ids.js.map +1 -1
  7. package/dist/cli.js +1 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/constants.d.ts +1 -85
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +0 -135
  12. package/dist/constants.js.map +1 -1
  13. package/dist/index.d.ts +3 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/license.d.ts +8 -0
  18. package/dist/license.d.ts.map +1 -0
  19. package/dist/license.js +18 -0
  20. package/dist/license.js.map +1 -0
  21. package/dist/metadata.d.ts +6 -0
  22. package/dist/metadata.d.ts.map +1 -0
  23. package/dist/metadata.js +205 -0
  24. package/dist/metadata.js.map +1 -0
  25. package/dist/orchestrator.d.ts +1 -0
  26. package/dist/orchestrator.d.ts.map +1 -1
  27. package/dist/orchestrator.js +134 -56
  28. package/dist/orchestrator.js.map +1 -1
  29. package/dist/scorer.js +2 -2
  30. package/dist/scorer.js.map +1 -1
  31. package/dist/types.d.ts +4 -0
  32. package/dist/types.d.ts.map +1 -1
  33. package/docs/api.md +14 -3
  34. package/docs/architecture.md +9 -98
  35. package/docs/ci.md +19 -0
  36. package/docs/cli.md +11 -0
  37. package/docs/faq.md +18 -0
  38. package/docs/getting-started.md +33 -1
  39. package/package.json +5 -5
  40. package/dist/checks/agent-access.d.ts +0 -33
  41. package/dist/checks/agent-access.d.ts.map +0 -1
  42. package/dist/checks/agent-access.js +0 -256
  43. package/dist/checks/agent-access.js.map +0 -1
  44. package/dist/checks/agent-card.d.ts +0 -37
  45. package/dist/checks/agent-card.d.ts.map +0 -1
  46. package/dist/checks/agent-card.js +0 -352
  47. package/dist/checks/agent-card.js.map +0 -1
  48. package/dist/checks/agent-operability.d.ts +0 -66
  49. package/dist/checks/agent-operability.d.ts.map +0 -1
  50. package/dist/checks/agent-operability.js +0 -383
  51. package/dist/checks/agent-operability.js.map +0 -1
  52. package/dist/checks/agent-skills.d.ts +0 -24
  53. package/dist/checks/agent-skills.d.ts.map +0 -1
  54. package/dist/checks/agent-skills.js +0 -316
  55. package/dist/checks/agent-skills.js.map +0 -1
  56. package/dist/checks/ai-catalog.d.ts +0 -28
  57. package/dist/checks/ai-catalog.d.ts.map +0 -1
  58. package/dist/checks/ai-catalog.js +0 -254
  59. package/dist/checks/ai-catalog.js.map +0 -1
  60. package/dist/checks/ai-directives.d.ts +0 -57
  61. package/dist/checks/ai-directives.d.ts.map +0 -1
  62. package/dist/checks/ai-directives.js +0 -263
  63. package/dist/checks/ai-directives.js.map +0 -1
  64. package/dist/checks/api-discovery.d.ts +0 -26
  65. package/dist/checks/api-discovery.d.ts.map +0 -1
  66. package/dist/checks/api-discovery.js +0 -432
  67. package/dist/checks/api-discovery.js.map +0 -1
  68. package/dist/checks/auth-discovery.d.ts +0 -28
  69. package/dist/checks/auth-discovery.d.ts.map +0 -1
  70. package/dist/checks/auth-discovery.js +0 -302
  71. package/dist/checks/auth-discovery.js.map +0 -1
  72. package/dist/checks/commerce-discovery.d.ts +0 -40
  73. package/dist/checks/commerce-discovery.d.ts.map +0 -1
  74. package/dist/checks/commerce-discovery.js +0 -295
  75. package/dist/checks/commerce-discovery.js.map +0 -1
  76. package/dist/checks/content-negotiation.d.ts +0 -4
  77. package/dist/checks/content-negotiation.d.ts.map +0 -1
  78. package/dist/checks/content-negotiation.js +0 -253
  79. package/dist/checks/content-negotiation.js.map +0 -1
  80. package/dist/checks/crawl-efficiency.d.ts +0 -16
  81. package/dist/checks/crawl-efficiency.d.ts.map +0 -1
  82. package/dist/checks/crawl-efficiency.js +0 -186
  83. package/dist/checks/crawl-efficiency.js.map +0 -1
  84. package/dist/checks/frontmatter.d.ts +0 -34
  85. package/dist/checks/frontmatter.d.ts.map +0 -1
  86. package/dist/checks/frontmatter.js +0 -100
  87. package/dist/checks/frontmatter.js.map +0 -1
  88. package/dist/checks/html-rendering.d.ts +0 -21
  89. package/dist/checks/html-rendering.d.ts.map +0 -1
  90. package/dist/checks/html-rendering.js +0 -221
  91. package/dist/checks/html-rendering.js.map +0 -1
  92. package/dist/checks/html-utils.d.ts +0 -66
  93. package/dist/checks/html-utils.d.ts.map +0 -1
  94. package/dist/checks/html-utils.js +0 -139
  95. package/dist/checks/html-utils.js.map +0 -1
  96. package/dist/checks/http-headers.d.ts +0 -11
  97. package/dist/checks/http-headers.d.ts.map +0 -1
  98. package/dist/checks/http-headers.js +0 -249
  99. package/dist/checks/http-headers.js.map +0 -1
  100. package/dist/checks/http-hygiene.d.ts +0 -26
  101. package/dist/checks/http-hygiene.d.ts.map +0 -1
  102. package/dist/checks/http-hygiene.js +0 -257
  103. package/dist/checks/http-hygiene.js.map +0 -1
  104. package/dist/checks/index.d.ts +0 -3
  105. package/dist/checks/index.d.ts.map +0 -1
  106. package/dist/checks/index.js +0 -55
  107. package/dist/checks/index.js.map +0 -1
  108. package/dist/checks/llms-txt.d.ts +0 -19
  109. package/dist/checks/llms-txt.d.ts.map +0 -1
  110. package/dist/checks/llms-txt.js +0 -281
  111. package/dist/checks/llms-txt.js.map +0 -1
  112. package/dist/checks/mcp-discovery.d.ts +0 -30
  113. package/dist/checks/mcp-discovery.d.ts.map +0 -1
  114. package/dist/checks/mcp-discovery.js +0 -523
  115. package/dist/checks/mcp-discovery.js.map +0 -1
  116. package/dist/checks/meta-tags.d.ts +0 -17
  117. package/dist/checks/meta-tags.d.ts.map +0 -1
  118. package/dist/checks/meta-tags.js +0 -188
  119. package/dist/checks/meta-tags.js.map +0 -1
  120. package/dist/checks/robots-parser.d.ts +0 -110
  121. package/dist/checks/robots-parser.d.ts.map +0 -1
  122. package/dist/checks/robots-parser.js +0 -277
  123. package/dist/checks/robots-parser.js.map +0 -1
  124. package/dist/checks/robots-txt.d.ts +0 -6
  125. package/dist/checks/robots-txt.d.ts.map +0 -1
  126. package/dist/checks/robots-txt.js +0 -367
  127. package/dist/checks/robots-txt.js.map +0 -1
  128. package/dist/checks/rsl.d.ts +0 -4
  129. package/dist/checks/rsl.d.ts.map +0 -1
  130. package/dist/checks/rsl.js +0 -242
  131. package/dist/checks/rsl.js.map +0 -1
  132. package/dist/checks/security-txt.d.ts +0 -4
  133. package/dist/checks/security-txt.d.ts.map +0 -1
  134. package/dist/checks/security-txt.js +0 -81
  135. package/dist/checks/security-txt.js.map +0 -1
  136. package/dist/checks/seo-basics.d.ts +0 -13
  137. package/dist/checks/seo-basics.d.ts.map +0 -1
  138. package/dist/checks/seo-basics.js +0 -221
  139. package/dist/checks/seo-basics.js.map +0 -1
  140. package/dist/checks/sitemap.d.ts +0 -12
  141. package/dist/checks/sitemap.d.ts.map +0 -1
  142. package/dist/checks/sitemap.js +0 -240
  143. package/dist/checks/sitemap.js.map +0 -1
  144. package/dist/checks/structured-data.d.ts +0 -4
  145. package/dist/checks/structured-data.d.ts.map +0 -1
  146. package/dist/checks/structured-data.js +0 -408
  147. package/dist/checks/structured-data.js.map +0 -1
  148. package/dist/checks/structured-fields.d.ts +0 -46
  149. package/dist/checks/structured-fields.d.ts.map +0 -1
  150. package/dist/checks/structured-fields.js +0 -112
  151. package/dist/checks/structured-fields.js.map +0 -1
  152. package/dist/checks/surface.d.ts +0 -59
  153. package/dist/checks/surface.d.ts.map +0 -1
  154. package/dist/checks/surface.js +0 -106
  155. package/dist/checks/surface.js.map +0 -1
  156. package/dist/checks/tls-https.d.ts +0 -13
  157. package/dist/checks/tls-https.d.ts.map +0 -1
  158. package/dist/checks/tls-https.js +0 -163
  159. package/dist/checks/tls-https.js.map +0 -1
  160. package/dist/checks/usage-policy.d.ts +0 -53
  161. package/dist/checks/usage-policy.d.ts.map +0 -1
  162. package/dist/checks/usage-policy.js +0 -339
  163. package/dist/checks/usage-policy.js.map +0 -1
  164. package/dist/checks/utils.d.ts +0 -40
  165. package/dist/checks/utils.d.ts.map +0 -1
  166. package/dist/checks/utils.js +0 -74
  167. package/dist/checks/utils.js.map +0 -1
  168. package/dist/checks/waf.d.ts +0 -75
  169. package/dist/checks/waf.d.ts.map +0 -1
  170. package/dist/checks/waf.js +0 -203
  171. package/dist/checks/waf.js.map +0 -1
  172. package/dist/checks/webmcp.d.ts +0 -55
  173. package/dist/checks/webmcp.d.ts.map +0 -1
  174. package/dist/checks/webmcp.js +0 -209
  175. package/dist/checks/webmcp.js.map +0 -1
  176. package/dist/checks/well-known.d.ts +0 -38
  177. package/dist/checks/well-known.d.ts.map +0 -1
  178. package/dist/checks/well-known.js +0 -202
  179. package/dist/checks/well-known.js.map +0 -1
  180. package/dist/fetcher.d.ts +0 -15
  181. package/dist/fetcher.d.ts.map +0 -1
  182. package/dist/fetcher.js +0 -127
  183. package/dist/fetcher.js.map +0 -1
  184. package/dist/guide-urls.d.ts +0 -2
  185. package/dist/guide-urls.d.ts.map +0 -1
  186. package/dist/guide-urls.js +0 -5
  187. package/dist/guide-urls.js.map +0 -1
  188. package/docs/roadmap.md +0 -367
@@ -1,202 +0,0 @@
1
- /**
2
- * Every path ax-audit knows about, keyed by path. Checks look up their probe
3
- * targets here so a rename in a draft spec is a one-line change in one file.
4
- */
5
- export const WELL_KNOWN = {
6
- /* ── IANA-registered ────────────────────────────────────────────────── */
7
- '/.well-known/agent-card.json': {
8
- path: '/.well-known/agent-card.json',
9
- standing: 'registered',
10
- label: 'A2A Agent Card',
11
- specUrl: 'https://a2a-protocol.org/latest/specification/',
12
- },
13
- '/.well-known/api-catalog': {
14
- path: '/.well-known/api-catalog',
15
- standing: 'registered',
16
- label: 'API Catalog (RFC 9727)',
17
- specUrl: 'https://www.rfc-editor.org/rfc/rfc9727.html',
18
- },
19
- '/.well-known/oauth-protected-resource': {
20
- path: '/.well-known/oauth-protected-resource',
21
- standing: 'registered',
22
- label: 'OAuth Protected Resource Metadata (RFC 9728)',
23
- specUrl: 'https://www.rfc-editor.org/rfc/rfc9728.html',
24
- },
25
- '/.well-known/oauth-authorization-server': {
26
- path: '/.well-known/oauth-authorization-server',
27
- standing: 'registered',
28
- label: 'OAuth Authorization Server Metadata (RFC 8414)',
29
- specUrl: 'https://www.rfc-editor.org/rfc/rfc8414.html',
30
- },
31
- '/.well-known/openid-configuration': {
32
- path: '/.well-known/openid-configuration',
33
- standing: 'registered',
34
- label: 'OpenID Provider Configuration',
35
- specUrl: 'https://openid.net/specs/openid-connect-discovery-1_0.html',
36
- },
37
- '/.well-known/security.txt': {
38
- path: '/.well-known/security.txt',
39
- standing: 'registered',
40
- label: 'security.txt (RFC 9116)',
41
- specUrl: 'https://www.rfc-editor.org/rfc/rfc9116',
42
- },
43
- '/.well-known/tdmrep.json': {
44
- path: '/.well-known/tdmrep.json',
45
- standing: 'registered',
46
- label: 'TDM Reservation Protocol',
47
- specUrl: 'https://www.w3.org/community/reports/tdmrep/CG-FINAL-tdmrep-20240510/',
48
- note: 'Provisional registration. W3C Community Group Final Report; referenced by the EU GPAI Code of Practice.',
49
- },
50
- '/.well-known/http-message-signatures-directory': {
51
- path: '/.well-known/http-message-signatures-directory',
52
- standing: 'registered',
53
- label: 'Web Bot Auth key directory',
54
- specUrl: 'https://datatracker.ietf.org/doc/html/draft-ietf-webbotauth-httpsig-protocol',
55
- note: 'Path registered; the protocol itself was adopted by the IETF webbotauth WG on 2026-09-01.',
56
- },
57
- /* ── Vendor conventions (unregistered, multi-vendor) ────────────────── */
58
- '/llms.txt': {
59
- path: '/llms.txt',
60
- standing: 'convention',
61
- label: 'llms.txt',
62
- specUrl: 'https://llmstxt.org/',
63
- note: 'Community proposal (v2, 2026-08-10). Read by coding agents (Claude Code, Cursor, OpenCode); Google Search states it ignores the file.',
64
- },
65
- '/.well-known/mcp/server-card.json': {
66
- path: '/.well-known/mcp/server-card.json',
67
- standing: 'convention',
68
- label: 'MCP Server Card (well-known path)',
69
- specUrl: 'https://github.com/modelcontextprotocol/experimental-ext-server-card',
70
- note: 'Served by Cloudflare and Mintlify. The MCP extension recommends <endpoint>/server-card instead.',
71
- },
72
- '/.well-known/skills/index.json': {
73
- path: '/.well-known/skills/index.json',
74
- standing: 'convention',
75
- label: 'Agent Skills index (Mintlify variant)',
76
- specUrl: 'https://www.mintlify.com/docs/ai/skillmd',
77
- },
78
- '/.well-known/ucp': {
79
- path: '/.well-known/ucp',
80
- standing: 'convention',
81
- label: 'Universal Commerce Protocol profile',
82
- specUrl: 'https://developers.google.com/merchant/ucp/guides/ucp-profile',
83
- note: 'Google-led, adopted by Shopify, Etsy, Walmart and Stripe. Not IANA-registered.',
84
- },
85
- '/openapi.json': {
86
- path: '/openapi.json',
87
- standing: 'convention',
88
- label: 'OpenAPI description',
89
- specUrl: 'https://spec.openapis.org/oas/latest.html',
90
- note: 'The OpenAPI spec recommends the file name openapi.json / openapi.yaml. No well-known path is registered.',
91
- },
92
- '/.well-known/openai-apps-challenge': {
93
- path: '/.well-known/openai-apps-challenge',
94
- standing: 'convention',
95
- label: 'OpenAI Apps domain verification',
96
- specUrl: 'https://developers.openai.com/plugins/deploy/submission.md',
97
- },
98
- '/.well-known/gpc.json': {
99
- path: '/.well-known/gpc.json',
100
- standing: 'registered',
101
- label: 'Global Privacy Control',
102
- specUrl: 'https://privacycg.github.io/gpc-spec/',
103
- },
104
- /* ── Drafts ─────────────────────────────────────────────────────────── */
105
- '/.well-known/agent-skills/index.json': {
106
- path: '/.well-known/agent-skills/index.json',
107
- standing: 'draft',
108
- label: 'Agent Skills discovery index',
109
- specUrl: 'https://github.com/cloudflare/agent-skills-discovery-rfc',
110
- note: 'Cloudflare RFC v0.2.0 (2026-03-12). Not registered; a competing shorter path (/.well-known/skills/) also ships.',
111
- },
112
- '/.well-known/ai-catalog.json': {
113
- path: '/.well-known/ai-catalog.json',
114
- standing: 'draft',
115
- label: 'AI Catalog',
116
- specUrl: 'https://ai-catalog.io/',
117
- note: 'Linux Foundation Agent Card WG draft. Adoption pending steering-committee votes.',
118
- },
119
- '/.well-known/ard.json': {
120
- path: '/.well-known/ard.json',
121
- standing: 'draft',
122
- label: 'Agentic Resource Discovery',
123
- specUrl: 'https://agenticresourcediscovery.org/spec/',
124
- note: 'Spec v0.91 (2026-08-26). Overlaps with ai-catalog.json; both are probed.',
125
- },
126
- '/.well-known/mcp/server-cards.json': {
127
- path: '/.well-known/mcp/server-cards.json',
128
- standing: 'draft',
129
- label: 'MCP Server Cards (multi-server)',
130
- specUrl: 'https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127',
131
- note: 'SEP-2127 is an open draft; the path has changed twice since 2025-10.',
132
- },
133
- '/.well-known/ai.txt': {
134
- path: '/.well-known/ai.txt',
135
- standing: 'draft',
136
- label: 'ai.txt (well-known variant)',
137
- specUrl: 'https://datatracker.ietf.org/doc/draft-car-ai-txt-wellknown/',
138
- note: 'Individual I-D (2026-06-12), not adopted by any working group.',
139
- },
140
- /* ── Legacy ─────────────────────────────────────────────────────────── */
141
- '/.well-known/agent.json': {
142
- path: '/.well-known/agent.json',
143
- standing: 'legacy',
144
- label: 'A2A Agent Card (pre-0.3 path)',
145
- specUrl: 'https://github.com/a2aproject/A2A/releases',
146
- note: 'A2A moved the card to /.well-known/agent-card.json in v0.3.0 (2025-07-30).',
147
- },
148
- '/.well-known/mcp.json': {
149
- path: '/.well-known/mcp.json',
150
- standing: 'legacy',
151
- label: 'MCP manifest (non-standard)',
152
- specUrl: 'https://modelcontextprotocol.io/specification/versioning',
153
- note: 'Never part of the MCP specification. Server cards superseded ad-hoc manifests.',
154
- },
155
- '/.well-known/ai-plugin.json': {
156
- path: '/.well-known/ai-plugin.json',
157
- standing: 'legacy',
158
- label: 'ChatGPT plugin manifest',
159
- specUrl: 'https://developers.openai.com/plugins/',
160
- note: 'ChatGPT plugins were shut down on 2024-04-09 and replaced by GPT Actions, then MCP.',
161
- },
162
- '/agents.json': {
163
- path: '/agents.json',
164
- standing: 'legacy',
165
- label: 'agents.json (Wildcard)',
166
- specUrl: 'https://github.com/wild-card-ai/agents-json',
167
- note: 'Repository dormant since 2025-08-21; no known consumer.',
168
- },
169
- '/.well-known/nlweb.json': {
170
- path: '/.well-known/nlweb.json',
171
- standing: 'legacy',
172
- label: 'NLWeb manifest',
173
- specUrl: 'https://github.com/nlweb-ai/NLWeb',
174
- note: 'No such file exists in the NLWeb project. NLWeb exposes /ask and /mcp endpoints instead.',
175
- },
176
- '/.well-known/genai.txt': {
177
- path: '/.well-known/genai.txt',
178
- standing: 'legacy',
179
- label: 'genai.txt',
180
- specUrl: 'https://llmstxt.org/',
181
- note: 'No specification, repository, or documented consumer was found for this file.',
182
- },
183
- };
184
- /** Look up a path's standing, defaulting to `convention` for unknown paths. */
185
- export function standingOf(path) {
186
- return WELL_KNOWN[path]?.standing ?? 'convention';
187
- }
188
- /** Human sentence describing a path's standing, for finding details. */
189
- export function standingNote(path) {
190
- const entry = WELL_KNOWN[path];
191
- if (!entry)
192
- return undefined;
193
- const prefix = entry.standing === 'registered'
194
- ? 'IANA-registered well-known URI.'
195
- : entry.standing === 'convention'
196
- ? 'Vendor convention, not IANA-registered.'
197
- : entry.standing === 'draft'
198
- ? 'Draft specification — the path may still change.'
199
- : 'Legacy path.';
200
- return entry.note ? `${prefix} ${entry.note}` : prefix;
201
- }
202
- //# sourceMappingURL=well-known.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"well-known.js","sourceRoot":"","sources":["../../src/checks/well-known.ts"],"names":[],"mappings":"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"}
package/dist/fetcher.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import type { FetchOptions, FetchResponse } from './types.js';
2
- interface FetcherOptions {
3
- timeout?: number;
4
- verbose?: boolean;
5
- /** Number of retry attempts for transient failures (timeouts, 5xx, network errors). Default 2. */
6
- retries?: number;
7
- /** Base delay in ms for exponential backoff between retries. Default 250. */
8
- retryBaseDelay?: number;
9
- }
10
- interface Fetcher {
11
- fetch: (url: string, options?: FetchOptions) => Promise<FetchResponse>;
12
- }
13
- export declare function createFetcher({ timeout, verbose, retries, retryBaseDelay, }?: FetcherOptions): Fetcher;
14
- export {};
15
- //# sourceMappingURL=fetcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AASD,UAAU,OAAO;IACf,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACxE;AA8CD,wBAAgB,aAAa,CAAC,EAC5B,OAAe,EACf,OAAe,EACf,OAAW,EACX,cAAoB,GACrB,GAAE,cAAmB,GAAG,OAAO,CAmF/B"}
package/dist/fetcher.js DELETED
@@ -1,127 +0,0 @@
1
- import { USER_AGENT } from './constants.js';
2
- /** Transient HTTP status codes worth retrying. */
3
- const RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);
4
- function sleep(ms) {
5
- return new Promise((resolve) => setTimeout(resolve, ms));
6
- }
7
- const DEFAULT_HEADERS = {
8
- 'User-Agent': USER_AGENT,
9
- Accept: 'text/html, application/json, text/plain, */*',
10
- };
11
- /**
12
- * Merge per-request headers over the fetcher defaults, case-insensitively.
13
- * A custom `accept` header therefore replaces the default `Accept` instead
14
- * of being sent alongside it.
15
- */
16
- function mergeHeaders(custom) {
17
- if (!custom)
18
- return { ...DEFAULT_HEADERS };
19
- const merged = { ...DEFAULT_HEADERS };
20
- for (const [name, value] of Object.entries(custom)) {
21
- const existing = Object.keys(merged).find((k) => k.toLowerCase() === name.toLowerCase());
22
- if (existing)
23
- delete merged[existing];
24
- merged[name] = value;
25
- }
26
- return merged;
27
- }
28
- /**
29
- * Build a deterministic cache key for a URL + request-shape combination.
30
- * Headers are lowercased and sorted so logically identical requests share one
31
- * cache entry, while requests that differ only in headers (e.g.
32
- * `Accept: text/markdown`) are cached separately — mirroring how `Vary: Accept`
33
- * works on the wire. Method and redirect mode are part of the key because a
34
- * `HEAD` has no body and a `manual` redirect returns the 3xx itself, so they
35
- * are different responses to the same URL.
36
- */
37
- function cacheKey(url, options) {
38
- const method = options?.method ?? 'GET';
39
- const redirect = options?.redirect ?? 'follow';
40
- const hasHeaders = options?.headers && Object.keys(options.headers).length > 0;
41
- if (method === 'GET' && redirect === 'follow' && !hasHeaders)
42
- return url;
43
- const normalized = hasHeaders
44
- ? Object.entries(options.headers)
45
- .map(([name, value]) => [name.toLowerCase(), value])
46
- .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
47
- : [];
48
- return `${url}\u0000${method}\u0000${redirect}\u0000${JSON.stringify(normalized)}`;
49
- }
50
- export function createFetcher({ timeout = 10000, verbose = false, retries = 2, retryBaseDelay = 250, } = {}) {
51
- const cache = new Map();
52
- const log = verbose ? (msg) => console.error(` [verbose] ${msg}`) : () => { };
53
- /** A single fetch attempt. Never throws — failures become a status-0 result. */
54
- async function attempt(url, options) {
55
- const controller = new AbortController();
56
- const timer = setTimeout(() => controller.abort(), timeout);
57
- const started = performance.now();
58
- try {
59
- const response = await fetch(url, {
60
- signal: controller.signal,
61
- method: options?.method ?? 'GET',
62
- headers: mergeHeaders(options?.headers),
63
- redirect: options?.redirect ?? 'follow',
64
- });
65
- // A HEAD response has no body to read; `.text()` resolves to '' but the
66
- // round-trip is wasted, so skip it and keep the empty-body contract.
67
- const body = options?.method === 'HEAD' ? '' : await response.text();
68
- const elapsedMs = Math.round(performance.now() - started);
69
- const headers = {};
70
- response.headers.forEach((value, key) => {
71
- headers[key.toLowerCase()] = value;
72
- });
73
- log(` ${response.status} ${response.statusText} (${body.length} bytes, ${elapsedMs}ms)`);
74
- return {
75
- status: response.status,
76
- headers,
77
- body,
78
- ok: response.ok,
79
- url: response.url || url,
80
- elapsedMs,
81
- redirected: response.redirected,
82
- ...(headers['location'] !== undefined ? { redirectLocation: headers['location'] } : {}),
83
- };
84
- }
85
- catch (err) {
86
- const error = err instanceof Error ? err : new Error(String(err));
87
- const errorMsg = error.name === 'AbortError' ? 'Request timed out' : error.message;
88
- log(` ERROR: ${errorMsg}`);
89
- return {
90
- status: 0,
91
- headers: {},
92
- body: '',
93
- ok: false,
94
- url,
95
- error: errorMsg,
96
- elapsedMs: Math.round(performance.now() - started),
97
- };
98
- }
99
- finally {
100
- clearTimeout(timer);
101
- }
102
- }
103
- async function fetchUrl(url, options) {
104
- const key = cacheKey(url, options);
105
- if (cache.has(key)) {
106
- log(`cache hit: ${url}`);
107
- return cache.get(key);
108
- }
109
- log(`fetch: ${url}`);
110
- let result = await attempt(url, options);
111
- // Retry transient failures with exponential backoff. A successful response
112
- // (even a 4xx that isn't in the retry set) short-circuits immediately.
113
- for (let i = 0; i < retries; i++) {
114
- const transient = result.status === 0 || RETRYABLE_STATUS.has(result.status);
115
- if (!transient)
116
- break;
117
- const delay = retryBaseDelay * 2 ** i;
118
- log(` retry ${i + 1}/${retries} after ${delay}ms (status ${result.status})`);
119
- await sleep(delay);
120
- result = await attempt(url, options);
121
- }
122
- cache.set(key, result);
123
- return result;
124
- }
125
- return { fetch: fetchUrl };
126
- }
127
- //# sourceMappingURL=fetcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function guideUrl(checkId: string, anchor?: string): string;
2
- //# sourceMappingURL=guide-urls.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guide-urls.d.ts","sourceRoot":"","sources":["../src/guide-urls.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -1,5 +0,0 @@
1
- const BASE_URL = 'https://axrush.com/guides';
2
- export function guideUrl(checkId, anchor) {
3
- return anchor ? `${BASE_URL}/${checkId}#${anchor}` : `${BASE_URL}/${checkId}`;
4
- }
5
- //# sourceMappingURL=guide-urls.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guide-urls.js","sourceRoot":"","sources":["../src/guide-urls.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAE7C,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,MAAe;IACvD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;AAChF,CAAC"}