doc-detective 4.0.2-dev.6 → 4.0.2-dev.8
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/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/common/src/schemas/schemas.json +594 -0
- package/dist/common/src/types/generated/checkLink_v3.d.ts +15 -0
- package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/config_v3.d.ts +4 -0
- package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts +4 -0
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/step_v3.d.ts +15 -0
- package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/test_v3.d.ts +30 -0
- package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
- package/dist/core/tests/checkLink.d.ts.map +1 -1
- package/dist/core/tests/checkLink.js +137 -30
- package/dist/core/tests/checkLink.js.map +1 -1
- package/dist/index.cjs +718 -25
- package/dist/reporters/htmlReporter.d.ts +2 -0
- package/dist/reporters/htmlReporter.d.ts.map +1 -0
- package/dist/reporters/htmlReporter.js +1589 -0
- package/dist/reporters/htmlReporter.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +29 -2
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,111 @@ import { validate } from "../../common/src/validate.js";
|
|
|
2
2
|
import { isRelativeUrl } from "../utils.js";
|
|
3
3
|
import axios from "axios";
|
|
4
4
|
export { checkLink };
|
|
5
|
+
const DEFAULT_HEADERS = {
|
|
6
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
7
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
|
8
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
9
|
+
"Accept-Encoding": "gzip, deflate, br",
|
|
10
|
+
"Upgrade-Insecure-Requests": "1",
|
|
11
|
+
"Sec-Fetch-Site": "none",
|
|
12
|
+
"Sec-Fetch-Mode": "navigate",
|
|
13
|
+
"Sec-Fetch-Dest": "document",
|
|
14
|
+
"Sec-Fetch-User": "?1",
|
|
15
|
+
"Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
|
|
16
|
+
"Sec-Ch-Ua-Mobile": "?0",
|
|
17
|
+
"Sec-Ch-Ua-Platform": '"Windows"',
|
|
18
|
+
};
|
|
19
|
+
// Initial request plus up to 3 retries, producing sleeps of 1s, 2s, 4s.
|
|
20
|
+
const MAX_ATTEMPTS = 4;
|
|
21
|
+
const BASE_BACKOFF_MS = 1000;
|
|
22
|
+
const MAX_RETRY_AFTER_MS = 10000;
|
|
23
|
+
function parseHeaderString(raw) {
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
26
|
+
const idx = line.indexOf(":");
|
|
27
|
+
if (idx === -1)
|
|
28
|
+
continue;
|
|
29
|
+
const key = line.slice(0, idx).trim();
|
|
30
|
+
const value = line.slice(idx + 1).trim();
|
|
31
|
+
// Match httpRequest's behavior: require a non-empty key AND a non-empty
|
|
32
|
+
// value. Silently dropping a header with no value avoids sending
|
|
33
|
+
// "X-Example:" lines that are almost always formatting mistakes.
|
|
34
|
+
if (key && value)
|
|
35
|
+
out[key] = value;
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function mergeHeaders(userHeaders) {
|
|
40
|
+
const merged = { ...DEFAULT_HEADERS };
|
|
41
|
+
if (!userHeaders)
|
|
42
|
+
return merged;
|
|
43
|
+
const parsed = typeof userHeaders === "string"
|
|
44
|
+
? parseHeaderString(userHeaders)
|
|
45
|
+
: userHeaders;
|
|
46
|
+
// Case-insensitive override: strip any default with the same name (any casing)
|
|
47
|
+
for (const userKey of Object.keys(parsed)) {
|
|
48
|
+
const raw = parsed[userKey];
|
|
49
|
+
if (raw === null || raw === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
const value = typeof raw === "string" ? raw : String(raw);
|
|
52
|
+
const lower = userKey.toLowerCase();
|
|
53
|
+
for (const existingKey of Object.keys(merged)) {
|
|
54
|
+
if (existingKey.toLowerCase() === lower)
|
|
55
|
+
delete merged[existingKey];
|
|
56
|
+
}
|
|
57
|
+
merged[userKey] = value;
|
|
58
|
+
}
|
|
59
|
+
return merged;
|
|
60
|
+
}
|
|
61
|
+
function parseRetryAfter(value) {
|
|
62
|
+
const candidate = Array.isArray(value) ? value[0] : value;
|
|
63
|
+
if (typeof candidate !== "string" && typeof candidate !== "number")
|
|
64
|
+
return null;
|
|
65
|
+
const str = String(candidate).trim();
|
|
66
|
+
if (!str)
|
|
67
|
+
return null;
|
|
68
|
+
const seconds = Number(str);
|
|
69
|
+
if (Number.isFinite(seconds)) {
|
|
70
|
+
return Math.max(0, Math.min(seconds * 1000, MAX_RETRY_AFTER_MS));
|
|
71
|
+
}
|
|
72
|
+
const date = Date.parse(str);
|
|
73
|
+
if (!Number.isNaN(date)) {
|
|
74
|
+
return Math.max(0, Math.min(date - Date.now(), MAX_RETRY_AFTER_MS));
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
function sleep(ms) {
|
|
79
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
80
|
+
}
|
|
81
|
+
function shouldRetry(statusCode) {
|
|
82
|
+
if (statusCode === null)
|
|
83
|
+
return false;
|
|
84
|
+
return statusCode === 429 || statusCode >= 500;
|
|
85
|
+
}
|
|
86
|
+
async function attemptRequest(method, url, headers) {
|
|
87
|
+
try {
|
|
88
|
+
const res = await axios.request({
|
|
89
|
+
method,
|
|
90
|
+
url,
|
|
91
|
+
headers,
|
|
92
|
+
timeout: 10000,
|
|
93
|
+
maxRedirects: 5,
|
|
94
|
+
validateStatus: () => true,
|
|
95
|
+
});
|
|
96
|
+
const retryAfter = parseRetryAfter(res.headers?.["retry-after"] ?? res.headers?.["Retry-After"]);
|
|
97
|
+
return { statusCode: res.status, retryAfter };
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (error?.response?.status) {
|
|
101
|
+
return {
|
|
102
|
+
statusCode: error.response.status,
|
|
103
|
+
retryAfter: parseRetryAfter(error.response.headers?.["retry-after"] ??
|
|
104
|
+
error.response.headers?.["Retry-After"]),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return { statusCode: null, retryAfter: null };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
5
110
|
async function checkLink({ config, step }) {
|
|
6
111
|
let result = { status: "PASS", description: "Checked link." };
|
|
7
112
|
// Resolve to object
|
|
@@ -43,44 +148,46 @@ async function checkLink({ config, step }) {
|
|
|
43
148
|
else if (typeof step.checkLink.statusCodes === "number") {
|
|
44
149
|
step.checkLink.statusCodes = [step.checkLink.statusCodes];
|
|
45
150
|
}
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return { error };
|
|
63
|
-
});
|
|
64
|
-
// If request returned an error
|
|
65
|
-
if (req.error) {
|
|
66
|
-
// If we have a response with a status code, check against accepted codes
|
|
67
|
-
if (req.error.response && req.error.response.status) {
|
|
68
|
-
req = { statusCode: req.error.response.status };
|
|
151
|
+
const headers = mergeHeaders(step.checkLink.headers);
|
|
152
|
+
const url = step.checkLink.url;
|
|
153
|
+
const acceptedCodes = step.checkLink.statusCodes;
|
|
154
|
+
const isAccepted = (code) => code !== null && acceptedCodes.indexOf(code) >= 0;
|
|
155
|
+
// Attempt GET with bounded retry on 429/5xx, honoring Retry-After.
|
|
156
|
+
// Short-circuit retries if the response is already an accepted status code.
|
|
157
|
+
let last = { statusCode: null, retryAfter: null };
|
|
158
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
|
159
|
+
last = await attemptRequest("get", url, headers);
|
|
160
|
+
if (isAccepted(last.statusCode))
|
|
161
|
+
break;
|
|
162
|
+
if (!shouldRetry(last.statusCode))
|
|
163
|
+
break;
|
|
164
|
+
if (attempt < MAX_ATTEMPTS - 1) {
|
|
165
|
+
const backoff = last.retryAfter ?? BASE_BACKOFF_MS * Math.pow(2, attempt);
|
|
166
|
+
await sleep(backoff);
|
|
69
167
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
168
|
+
}
|
|
169
|
+
// HEAD fallback on final 429/403 when the result is not already accepted.
|
|
170
|
+
// Some WAFs rate-limit HTML GETs but allow HEADs.
|
|
171
|
+
if (!isAccepted(last.statusCode) &&
|
|
172
|
+
(last.statusCode === 429 || last.statusCode === 403)) {
|
|
173
|
+
const headResult = await attemptRequest("head", url, headers);
|
|
174
|
+
if (isAccepted(headResult.statusCode)) {
|
|
175
|
+
last = headResult;
|
|
74
176
|
}
|
|
75
177
|
}
|
|
178
|
+
if (last.statusCode === null) {
|
|
179
|
+
result.status = "FAIL";
|
|
180
|
+
result.description = `Invalid or unresolvable URL: ${url}`;
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
76
183
|
// Compare status codes
|
|
77
|
-
if (step.checkLink.statusCodes.indexOf(
|
|
184
|
+
if (step.checkLink.statusCodes.indexOf(last.statusCode) >= 0) {
|
|
78
185
|
result.status = "PASS";
|
|
79
|
-
result.description = `Returned ${
|
|
186
|
+
result.description = `Returned ${last.statusCode}`;
|
|
80
187
|
}
|
|
81
188
|
else {
|
|
82
189
|
result.status = "FAIL";
|
|
83
|
-
result.description = `Returned ${
|
|
190
|
+
result.description = `Returned ${last.statusCode}. Expected one of ${JSON.stringify(step.checkLink.statusCodes)}`;
|
|
84
191
|
}
|
|
85
192
|
return result;
|
|
86
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkLink.js","sourceRoot":"","sources":["../../../src/core/tests/checkLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,KAAK,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAA8B;IACnE,IAAI,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IAE9D,oBAAoB;IACpB,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3C,CAAC;IAED,+BAA+B;IAC/B,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,MAAM,CAAC,WAAW;gBAChB,2FAA2F,CAAC;YAC9F,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC/D,6CAA6C;QAC7C,IACE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YACpC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EACnC,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAClE,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAEvD,wBAAwB;IACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,4BAA4B,WAAW,CAAC,MAAM,EAAE,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,sCAAsC;IACtC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;IAE1B,2CAA2C;IAC3C,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACtD,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"checkLink.js","sourceRoot":"","sources":["../../../src/core/tests/checkLink.ts"],"names":[],"mappings":"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"}
|