@j0hanz/fetch-url-mcp 1.2.0 → 1.3.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/dist/cache.d.ts +9 -3
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +54 -119
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -4
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +2 -3
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -27
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +1 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +7 -3
- package/dist/crypto.js.map +1 -0
- package/dist/dom-noise-removal.d.ts +2 -1
- package/dist/dom-noise-removal.d.ts.map +1 -0
- package/dist/dom-noise-removal.js +9 -6
- package/dist/dom-noise-removal.js.map +1 -0
- package/dist/download.d.ts +4 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +106 -0
- package/dist/download.js.map +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -1
- package/dist/errors.js.map +1 -0
- package/dist/examples/mcp-fetch-url-client.js +19 -3
- package/dist/examples/mcp-fetch-url-client.js.map +1 -1
- package/dist/fetch-content.d.ts +1 -0
- package/dist/fetch-content.d.ts.map +1 -0
- package/dist/fetch-content.js +15 -14
- package/dist/fetch-content.js.map +1 -0
- package/dist/fetch-stream.d.ts +1 -0
- package/dist/fetch-stream.d.ts.map +1 -0
- package/dist/fetch-stream.js +1 -0
- package/dist/fetch-stream.js.map +1 -0
- package/dist/fetch.d.ts +1 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +123 -54
- package/dist/fetch.js.map +1 -0
- package/dist/host-normalization.d.ts +1 -0
- package/dist/host-normalization.d.ts.map +1 -0
- package/dist/host-normalization.js +22 -9
- package/dist/host-normalization.js.map +1 -0
- package/dist/http/auth.d.ts +51 -0
- package/dist/http/auth.d.ts.map +1 -0
- package/dist/http/auth.js +344 -0
- package/dist/http/auth.js.map +1 -0
- package/dist/http/health.d.ts +7 -0
- package/dist/http/health.d.ts.map +1 -0
- package/dist/http/health.js +156 -0
- package/dist/http/health.js.map +1 -0
- package/dist/http/helpers.d.ts +58 -0
- package/dist/http/helpers.d.ts.map +1 -0
- package/dist/http/helpers.js +370 -0
- package/dist/http/helpers.js.map +1 -0
- package/dist/{http-native.d.ts → http/native.d.ts} +1 -0
- package/dist/http/native.d.ts.map +1 -0
- package/dist/http/native.js +618 -0
- package/dist/http/native.js.map +1 -0
- package/dist/http/rate-limit.d.ts +13 -0
- package/dist/http/rate-limit.d.ts.map +1 -0
- package/dist/http/rate-limit.js +92 -0
- package/dist/http/rate-limit.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -14
- package/dist/index.js.map +1 -0
- package/dist/instructions.d.ts +2 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +41 -0
- package/dist/instructions.js.map +1 -0
- package/dist/ip-blocklist.d.ts +1 -0
- package/dist/ip-blocklist.d.ts.map +1 -0
- package/dist/ip-blocklist.js +13 -8
- package/dist/ip-blocklist.js.map +1 -0
- package/dist/json.d.ts +2 -1
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +16 -6
- package/dist/json.js.map +1 -0
- package/dist/language-detection.d.ts +1 -0
- package/dist/language-detection.d.ts.map +1 -0
- package/dist/language-detection.js +2 -7
- package/dist/language-detection.js.map +1 -0
- package/dist/markdown-cleanup.d.ts +2 -1
- package/dist/markdown-cleanup.d.ts.map +1 -0
- package/dist/markdown-cleanup.js +52 -54
- package/dist/markdown-cleanup.js.map +1 -0
- package/dist/mcp-validator.d.ts +1 -0
- package/dist/mcp-validator.d.ts.map +1 -0
- package/dist/mcp-validator.js +20 -18
- package/dist/mcp-validator.js.map +1 -0
- package/dist/mcp.d.ts +2 -2
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +35 -344
- package/dist/mcp.js.map +1 -0
- package/dist/observability.d.ts +2 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +32 -6
- package/dist/observability.js.map +1 -0
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +15 -3
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +1 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +46 -25
- package/dist/resources.js.map +1 -0
- package/dist/server-tuning.d.ts +1 -0
- package/dist/server-tuning.d.ts.map +1 -0
- package/dist/server-tuning.js +14 -17
- package/dist/server-tuning.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +29 -35
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +58 -29
- package/dist/session.js.map +1 -0
- package/dist/tasks/execution.d.ts +42 -0
- package/dist/tasks/execution.d.ts.map +1 -0
- package/dist/tasks/execution.js +241 -0
- package/dist/tasks/execution.js.map +1 -0
- package/dist/{tasks.d.ts → tasks/manager.d.ts} +12 -0
- package/dist/tasks/manager.d.ts.map +1 -0
- package/dist/{tasks.js → tasks/manager.js} +95 -43
- package/dist/tasks/manager.js.map +1 -0
- package/dist/tasks/owner.d.ts +32 -0
- package/dist/tasks/owner.d.ts.map +1 -0
- package/dist/tasks/owner.js +92 -0
- package/dist/tasks/owner.js.map +1 -0
- package/dist/timer-utils.d.ts +1 -0
- package/dist/timer-utils.d.ts.map +1 -0
- package/dist/timer-utils.js +8 -4
- package/dist/timer-utils.js.map +1 -0
- package/dist/tool-errors.d.ts +12 -0
- package/dist/tool-errors.d.ts.map +1 -0
- package/dist/tool-errors.js +55 -0
- package/dist/tool-errors.js.map +1 -0
- package/dist/tool-pipeline.d.ts +72 -0
- package/dist/tool-pipeline.d.ts.map +1 -0
- package/dist/tool-pipeline.js +408 -0
- package/dist/tool-pipeline.js.map +1 -0
- package/dist/tool-progress.d.ts +32 -0
- package/dist/tool-progress.d.ts.map +1 -0
- package/dist/tool-progress.js +129 -0
- package/dist/tool-progress.js.map +1 -0
- package/dist/tools.d.ts +35 -111
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +150 -610
- package/dist/tools.js.map +1 -0
- package/dist/{transform.d.ts → transform/transform.d.ts} +2 -1
- package/dist/transform/transform.d.ts.map +1 -0
- package/dist/{transform.js → transform/transform.js} +81 -771
- package/dist/transform/transform.js.map +1 -0
- package/dist/{transform-types.d.ts → transform/types.d.ts} +2 -0
- package/dist/transform/types.d.ts.map +1 -0
- package/dist/{transform-types.js → transform/types.js} +1 -0
- package/dist/transform/types.js.map +1 -0
- package/dist/transform/worker-pool.d.ts +93 -0
- package/dist/transform/worker-pool.d.ts.map +1 -0
- package/dist/transform/worker-pool.js +757 -0
- package/dist/transform/worker-pool.js.map +1 -0
- package/dist/transform/workers/transform-child.d.ts +2 -0
- package/dist/transform/workers/transform-child.d.ts.map +1 -0
- package/dist/{workers → transform/workers}/transform-child.js +17 -13
- package/dist/transform/workers/transform-child.js.map +1 -0
- package/dist/transform/workers/transform-worker.d.ts +2 -0
- package/dist/transform/workers/transform-worker.d.ts.map +1 -0
- package/dist/{workers → transform/workers}/transform-worker.js +16 -13
- package/dist/transform/workers/transform-worker.js.map +1 -0
- package/dist/type-guards.d.ts +1 -0
- package/dist/type-guards.d.ts.map +1 -0
- package/dist/type-guards.js +4 -4
- package/dist/type-guards.js.map +1 -0
- package/package.json +6 -7
- package/dist/AGENTS.md +0 -152
- package/dist/http-native.js +0 -1320
- package/dist/instructions.md +0 -113
- package/dist/workers/transform-child.d.ts +0 -1
- package/dist/workers/transform-worker.d.ts +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { setInterval as setIntervalPromise } from 'node:timers/promises';
|
|
2
|
+
import { logWarn } from '../observability.js';
|
|
3
|
+
import { sendJson } from './helpers.js';
|
|
4
|
+
function isAbortError(error) {
|
|
5
|
+
return error instanceof Error && error.name === 'AbortError';
|
|
6
|
+
}
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Rate limiter
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
class RateLimiter {
|
|
11
|
+
options;
|
|
12
|
+
store = new Map();
|
|
13
|
+
cleanup = new AbortController();
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.startCleanupLoop();
|
|
17
|
+
}
|
|
18
|
+
startCleanupLoop() {
|
|
19
|
+
const interval = setIntervalPromise(this.options.cleanupIntervalMs, Date.now, { signal: this.cleanup.signal, ref: false });
|
|
20
|
+
void (async () => {
|
|
21
|
+
try {
|
|
22
|
+
for await (const getNow of interval) {
|
|
23
|
+
this.cleanupEntries(getNow());
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (!isAbortError(err)) {
|
|
28
|
+
logWarn('Rate limit cleanup failed', { error: err });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
}
|
|
33
|
+
cleanupEntries(now) {
|
|
34
|
+
const maxIdle = this.options.windowMs * 2;
|
|
35
|
+
for (const [key, entry] of this.store.entries()) {
|
|
36
|
+
if (now - entry.lastAccessed > maxIdle) {
|
|
37
|
+
this.store.delete(key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
resetEntry(entry, now) {
|
|
42
|
+
entry.count = 1;
|
|
43
|
+
entry.resetTime = now + this.options.windowMs;
|
|
44
|
+
entry.lastAccessed = now;
|
|
45
|
+
}
|
|
46
|
+
incrementEntry(entry, now) {
|
|
47
|
+
entry.count += 1;
|
|
48
|
+
entry.lastAccessed = now;
|
|
49
|
+
}
|
|
50
|
+
createEntry(now) {
|
|
51
|
+
return {
|
|
52
|
+
count: 1,
|
|
53
|
+
resetTime: now + this.options.windowMs,
|
|
54
|
+
lastAccessed: now,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
check(ctx) {
|
|
58
|
+
if (!this.options.enabled || ctx.method === 'OPTIONS')
|
|
59
|
+
return true;
|
|
60
|
+
if (!ctx.ip)
|
|
61
|
+
return true; // no identifiable IP (e.g. Unix socket) — bypass rate limiting
|
|
62
|
+
const key = ctx.ip;
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
let entry = this.store.get(key);
|
|
65
|
+
if (entry) {
|
|
66
|
+
if (now > entry.resetTime) {
|
|
67
|
+
this.resetEntry(entry, now);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.incrementEntry(entry, now);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
entry = this.createEntry(now);
|
|
75
|
+
this.store.set(key, entry);
|
|
76
|
+
}
|
|
77
|
+
if (entry.count > this.options.maxRequests) {
|
|
78
|
+
const retryAfter = Math.max(1, Math.ceil((entry.resetTime - now) / 1000));
|
|
79
|
+
ctx.res.setHeader('Retry-After', String(retryAfter));
|
|
80
|
+
sendJson(ctx.res, 429, { error: 'Rate limit exceeded', retryAfter });
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
stop() {
|
|
86
|
+
this.cleanup.abort();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function createRateLimitManagerImpl(options) {
|
|
90
|
+
return new RateLimiter(options);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/http/rate-limit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import process from 'node:process';
|
|
3
3
|
import { parseCliArgs, renderCliUsage } from './cli.js';
|
|
4
4
|
import { serverVersion } from './config.js';
|
|
5
|
-
import { startHttpServer } from './http
|
|
5
|
+
import { startHttpServer } from './http/native.js';
|
|
6
6
|
import { logError } from './observability.js';
|
|
7
7
|
import { startStdioServer } from './server.js';
|
|
8
8
|
const FORCE_EXIT_TIMEOUT_MS = 10_000;
|
|
@@ -47,15 +47,25 @@ function attemptShutdown(signal) {
|
|
|
47
47
|
process.stderr.write('Attempting graceful shutdown...\n');
|
|
48
48
|
void shutdownHandlerRef.current(signal);
|
|
49
49
|
}
|
|
50
|
-
function
|
|
51
|
-
process.once(
|
|
52
|
-
|
|
53
|
-
attemptShutdown('SIGINT');
|
|
50
|
+
function registerOnceSignal(signal, handler) {
|
|
51
|
+
process.once(signal, () => {
|
|
52
|
+
handler(signal);
|
|
54
53
|
});
|
|
55
|
-
|
|
54
|
+
}
|
|
55
|
+
function registerHttpSignalHandlers() {
|
|
56
|
+
const tryShutdown = (signal) => {
|
|
56
57
|
if (shouldAttemptShutdown())
|
|
57
|
-
attemptShutdown(
|
|
58
|
-
}
|
|
58
|
+
attemptShutdown(signal);
|
|
59
|
+
};
|
|
60
|
+
for (const signal of ['SIGINT', 'SIGTERM']) {
|
|
61
|
+
registerOnceSignal(signal, tryShutdown);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function writeStartupError(error) {
|
|
65
|
+
logError('Failed to start server', error);
|
|
66
|
+
process.stderr.write(`Failed to start server: ${error.message}\n`);
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
scheduleForcedExit('Startup failure');
|
|
59
69
|
}
|
|
60
70
|
function handleFatalError(label, error, signal) {
|
|
61
71
|
logError(label, error);
|
|
@@ -85,10 +95,6 @@ try {
|
|
|
85
95
|
}
|
|
86
96
|
}
|
|
87
97
|
catch (error) {
|
|
88
|
-
|
|
89
|
-
logError('Failed to start server', resolvedError);
|
|
90
|
-
const { message } = resolvedError;
|
|
91
|
-
process.stderr.write(`Failed to start server: ${message}\n`);
|
|
92
|
-
process.exitCode = 1;
|
|
93
|
-
scheduleForcedExit('Startup failure');
|
|
98
|
+
writeStartupError(toError(error));
|
|
94
99
|
}
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,IAAI,MAAM,CAsChD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { config } from './config.js';
|
|
2
|
+
import { FETCH_URL_TOOL_NAME } from './tools.js';
|
|
3
|
+
export function buildServerInstructions() {
|
|
4
|
+
const maxHtmlSizeMb = config.constants.maxHtmlSize / 1024 / 1024;
|
|
5
|
+
const cacheSizeMb = config.cache.maxSizeBytes / 1024 / 1024;
|
|
6
|
+
const cacheTtlHours = config.cache.ttl / 3600;
|
|
7
|
+
return `<role>Web Content Extractor</role>
|
|
8
|
+
<task>Fetch public webpages and convert HTML to clean Markdown.</task>
|
|
9
|
+
|
|
10
|
+
<capabilities>
|
|
11
|
+
- Tools: \`${FETCH_URL_TOOL_NAME}\` (READ-ONLY).
|
|
12
|
+
- Resources: \`internal://cache/{namespace}/{hash}\` (ephemeral cached Markdown).
|
|
13
|
+
- Prompts: \`get-help\` (returns these instructions).
|
|
14
|
+
</capabilities>
|
|
15
|
+
|
|
16
|
+
<workflows>
|
|
17
|
+
1. Standard: Call \`${FETCH_URL_TOOL_NAME}\` -> Read \`markdown\`. If \`truncated: true\`, use \`cacheResourceUri\` with \`resources/read\` for full content.
|
|
18
|
+
2. Fresh: Set \`forceRefresh: true\` to bypass cache.
|
|
19
|
+
3. Full-Fidelity: Set \`skipNoiseRemoval: true\` to preserve nav/footers.
|
|
20
|
+
4. Async: Add \`task: { ttl: <ms> }\` to \`tools/call\` -> Poll \`tasks/get\` -> Call \`tasks/result\`.
|
|
21
|
+
</workflows>
|
|
22
|
+
|
|
23
|
+
<constraints>
|
|
24
|
+
- Blocked: localhost, private IPs (10.x, 172.16-31.x, 192.168.x), metadata endpoints (169.254.169.254), .local/.internal.
|
|
25
|
+
- Limits: Max HTML ${maxHtmlSizeMb}MB. Max ${config.fetcher.maxRedirects} redirects.
|
|
26
|
+
- Cache: ${config.cache.maxKeys} entries, ${cacheSizeMb}MB, ${cacheTtlHours}h TTL.
|
|
27
|
+
- No JS: Client-side rendered pages may be incomplete.
|
|
28
|
+
- Binary: Not supported.
|
|
29
|
+
- Batch JSON-RPC: Array requests (\`[{...}]\`) are rejected with HTTP 400.
|
|
30
|
+
- Tasks API: Experimental (SDK v1.26). \`tasks/get\`, \`tasks/result\`, \`tasks/list\`, \`tasks/cancel\` may change.
|
|
31
|
+
</constraints>
|
|
32
|
+
|
|
33
|
+
<error_handling>
|
|
34
|
+
- VALIDATION_ERROR: Invalid/blocked URL. Do not retry.
|
|
35
|
+
- FETCH_ERROR: Network failure. Retry once with backoff.
|
|
36
|
+
- HTTP_xxx: Upstream error. Retry only for 5xx.
|
|
37
|
+
- ABORTED: Cancelled. Retry if needed.
|
|
38
|
+
- queue_full: Worker pool busy. Wait and retry, or use task mode.
|
|
39
|
+
</error_handling>`;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,UAAU,uBAAuB;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;IAE9C,OAAO;;;;aAII,mBAAmB;;;;;;sBAMV,mBAAmB;;;;;;;;qBAQpB,aAAa,WAAW,MAAM,CAAC,OAAO,CAAC,YAAY;WAC7D,MAAM,CAAC,KAAK,CAAC,OAAO,aAAa,WAAW,OAAO,aAAa;;;;;;;;;;;;;kBAazD,CAAC;AACnB,CAAC"}
|
package/dist/ip-blocklist.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-blocklist.d.ts","sourceRoot":"","sources":["../src/ip-blocklist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,MAAM,UAAU,CAAC;AAE3C,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAkDhC,wBAAgB,sBAAsB,IAAI,SAAS,CAMlD;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GACZ;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAmBzC"}
|
package/dist/ip-blocklist.js
CHANGED
|
@@ -34,6 +34,7 @@ const BLOCKED_SUBNETS = [
|
|
|
34
34
|
{ subnet: IPV6_FC00, prefix: 7, family: 'ipv6' },
|
|
35
35
|
{ subnet: IPV6_FE80, prefix: 10, family: 'ipv6' },
|
|
36
36
|
{ subnet: IPV6_FF00, prefix: 8, family: 'ipv6' },
|
|
37
|
+
{ subnet: '::', prefix: 96, family: 'ipv6' },
|
|
37
38
|
];
|
|
38
39
|
export function createDefaultBlockList() {
|
|
39
40
|
const list = new BlockList();
|
|
@@ -62,13 +63,17 @@ export function normalizeIpForBlockList(input) {
|
|
|
62
63
|
if (!normalizedInput)
|
|
63
64
|
return null;
|
|
64
65
|
const ipType = isIP(normalizedInput);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return
|
|
71
|
-
|
|
66
|
+
switch (ipType) {
|
|
67
|
+
case 4:
|
|
68
|
+
return { ip: normalizedInput, family: 'ipv4' };
|
|
69
|
+
case 6: {
|
|
70
|
+
const mapped = extractMappedIpv4(normalizedInput);
|
|
71
|
+
return mapped
|
|
72
|
+
? { ip: mapped, family: 'ipv4' }
|
|
73
|
+
: { ip: normalizedInput, family: 'ipv6' };
|
|
74
|
+
}
|
|
75
|
+
default:
|
|
76
|
+
return null;
|
|
72
77
|
}
|
|
73
|
-
return null;
|
|
74
78
|
}
|
|
79
|
+
//# sourceMappingURL=ip-blocklist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-blocklist.js","sourceRoot":"","sources":["../src/ip-blocklist.ts"],"names":[],"mappings":"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"}
|
package/dist/json.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export declare function stableStringify(obj: unknown, depth?: number, seen?: WeakSet<
|
|
1
|
+
export declare function stableStringify(obj: unknown, depth?: number, seen?: WeakSet<WeakKey>): string;
|
|
2
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAoDA,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,KAAK,SAAI,EACT,IAAI,mBAAgB,GACnB,MAAM,CAGR"}
|
package/dist/json.js
CHANGED
|
@@ -1,27 +1,36 @@
|
|
|
1
1
|
const MAX_DEPTH = 20;
|
|
2
|
+
const MAX_DEPTH_ERROR = `stableStringify: Max depth (${MAX_DEPTH}) exceeded`;
|
|
3
|
+
const CIRCULAR_ERROR = 'stableStringify: Circular reference detected';
|
|
4
|
+
function compareObjectKeys(a, b) {
|
|
5
|
+
if (a === b)
|
|
6
|
+
return 0;
|
|
7
|
+
return a < b ? -1 : 1;
|
|
8
|
+
}
|
|
9
|
+
function getSortedObjectKeys(obj) {
|
|
10
|
+
return Object.keys(obj).sort(compareObjectKeys);
|
|
11
|
+
}
|
|
2
12
|
function processValue(obj, depth, seen) {
|
|
3
13
|
if (typeof obj !== 'object' || obj === null) {
|
|
4
14
|
return obj;
|
|
5
15
|
}
|
|
6
16
|
// Depth guard
|
|
7
17
|
if (depth > MAX_DEPTH) {
|
|
8
|
-
throw new Error(
|
|
18
|
+
throw new Error(MAX_DEPTH_ERROR);
|
|
9
19
|
}
|
|
10
20
|
// Cycle detection (track active recursion stack only).
|
|
11
21
|
if (seen.has(obj)) {
|
|
12
|
-
throw new Error(
|
|
22
|
+
throw new Error(CIRCULAR_ERROR);
|
|
13
23
|
}
|
|
14
24
|
seen.add(obj);
|
|
15
25
|
try {
|
|
16
|
-
const processChild = (value) => processValue(value, depth + 1, seen);
|
|
17
26
|
if (Array.isArray(obj)) {
|
|
18
|
-
return obj.map((item) =>
|
|
27
|
+
return obj.map((item) => processValue(item, depth + 1, seen));
|
|
19
28
|
}
|
|
20
|
-
const keys =
|
|
29
|
+
const keys = getSortedObjectKeys(obj);
|
|
21
30
|
const record = obj;
|
|
22
31
|
const sortedObj = {};
|
|
23
32
|
for (const key of keys) {
|
|
24
|
-
sortedObj[key] =
|
|
33
|
+
sortedObj[key] = processValue(record[key], depth + 1, seen);
|
|
25
34
|
}
|
|
26
35
|
return sortedObj;
|
|
27
36
|
}
|
|
@@ -33,3 +42,4 @@ export function stableStringify(obj, depth = 0, seen = new WeakSet()) {
|
|
|
33
42
|
const processed = processValue(obj, depth, seen);
|
|
34
43
|
return JSON.stringify(processed);
|
|
35
44
|
}
|
|
45
|
+
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,eAAe,GAAG,+BAA+B,SAAS,YAAY,CAAC;AAC7E,MAAM,cAAc,GAAG,8CAA8C,CAAC;AAEtE,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CACnB,GAAY,EACZ,KAAa,EACb,IAAqB;IAErB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,cAAc;IACd,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAY,EACZ,KAAK,GAAG,CAAC,EACT,IAAI,GAAG,IAAI,OAAO,EAAE;IAEpB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-detection.d.ts","sourceRoot":"","sources":["../src/language-detection.ts"],"names":[],"mappings":"AAoWA,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6BvE"}
|
|
@@ -101,13 +101,7 @@ function isBashLine(line) {
|
|
|
101
101
|
if (BASH_COMMANDS.has(firstWord))
|
|
102
102
|
return true;
|
|
103
103
|
// Package Managers
|
|
104
|
-
|
|
105
|
-
for (const mgr of BASH_PACKAGE_MANAGERS) {
|
|
106
|
-
if (firstWord === mgr) {
|
|
107
|
-
isPkgMgr = true;
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
104
|
+
const isPkgMgr = BASH_PACKAGE_MANAGERS.includes(firstWord);
|
|
111
105
|
if (isPkgMgr && spaceIdx !== -1) {
|
|
112
106
|
const rest = trimmed.slice(spaceIdx + 1);
|
|
113
107
|
const secondSpaceIdx = rest.indexOf(' ');
|
|
@@ -358,3 +352,4 @@ export function detectLanguageFromCode(code) {
|
|
|
358
352
|
}
|
|
359
353
|
return bestLang;
|
|
360
354
|
}
|
|
355
|
+
//# sourceMappingURL=language-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-detection.js","sourceRoot":"","sources":["../src/language-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MetadataBlock } from './transform
|
|
1
|
+
import type { MetadataBlock } from './transform/types.js';
|
|
2
2
|
interface CleanupOptions {
|
|
3
3
|
signal?: AbortSignal;
|
|
4
4
|
url?: string;
|
|
@@ -9,3 +9,4 @@ export declare function addSourceToMarkdown(content: string, url: string): strin
|
|
|
9
9
|
export declare function isRawTextContent(content: string): boolean;
|
|
10
10
|
export declare function buildMetadataFooter(metadata?: MetadataBlock, fallbackUrl?: string): string;
|
|
11
11
|
export {};
|
|
12
|
+
//# sourceMappingURL=markdown-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-cleanup.d.ts","sourceRoot":"","sources":["../src/markdown-cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsD1D,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+SD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,MAAM,CA6DR;AAoHD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAmCxE;AAgBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAczD;AAeD,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,aAAa,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAmBR"}
|
package/dist/markdown-cleanup.js
CHANGED
|
@@ -46,6 +46,13 @@ function throwIfAborted(signal, url, stage) {
|
|
|
46
46
|
stage,
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
|
+
function createAbortChecker(options) {
|
|
50
|
+
const signal = options?.signal;
|
|
51
|
+
const url = options?.url ?? '';
|
|
52
|
+
return (stage) => {
|
|
53
|
+
throwIfAborted(signal, url, stage);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
49
56
|
// --- Helper Functions ---
|
|
50
57
|
function getLineEnding(content) {
|
|
51
58
|
return content.includes('\r\n') ? '\r\n' : '\n';
|
|
@@ -55,8 +62,7 @@ function isBlank(line) {
|
|
|
55
62
|
}
|
|
56
63
|
function hasFollowingContent(lines, startIndex) {
|
|
57
64
|
// Optimization: Bound lookahead to avoid checking too many lines in huge files
|
|
58
|
-
|
|
59
|
-
for (let i = startIndex + 1; i < max; i++) {
|
|
65
|
+
for (let i = startIndex + 1; i < Math.min(lines.length, startIndex + 50); i++) {
|
|
60
66
|
if (!isBlank(lines[i]))
|
|
61
67
|
return true;
|
|
62
68
|
}
|
|
@@ -200,6 +206,7 @@ function preprocessLines(lines, options) {
|
|
|
200
206
|
const len = lines.length;
|
|
201
207
|
const promote = config.markdownCleanup.promoteOrphanHeadings;
|
|
202
208
|
const removeToc = config.markdownCleanup.removeTocBlocks;
|
|
209
|
+
const checkAbort = createAbortChecker(options);
|
|
203
210
|
let skipUntil = -1;
|
|
204
211
|
for (let i = 0; i < len; i++) {
|
|
205
212
|
if (i < skipUntil)
|
|
@@ -216,7 +223,7 @@ function preprocessLines(lines, options) {
|
|
|
216
223
|
continue;
|
|
217
224
|
}
|
|
218
225
|
if (promote && trimmed.length > 0) {
|
|
219
|
-
|
|
226
|
+
checkAbort('markdown:cleanup:promote');
|
|
220
227
|
const promoted = tryPromoteOrphan(lines, i, trimmed);
|
|
221
228
|
if (promoted)
|
|
222
229
|
line = promoted;
|
|
@@ -234,14 +241,15 @@ function processTextBuffer(lines, options) {
|
|
|
234
241
|
}
|
|
235
242
|
function applyGlobalRegexes(text, options) {
|
|
236
243
|
let result = text;
|
|
237
|
-
|
|
244
|
+
const checkAbort = createAbortChecker(options);
|
|
245
|
+
checkAbort('markdown:cleanup:headings');
|
|
238
246
|
// fixAndSpaceHeadings
|
|
239
247
|
result = result
|
|
240
248
|
.replace(REGEX.HEADING_SPACING, '$1\n\n$2')
|
|
241
249
|
.replace(REGEX.HEADING_CODE_BLOCK, '$1\n\n```')
|
|
242
250
|
.replace(REGEX.HEADING_CAMEL_CASE, '$1\n\n$2');
|
|
243
251
|
if (config.markdownCleanup.removeTypeDocComments) {
|
|
244
|
-
|
|
252
|
+
checkAbort('markdown:cleanup:typedoc');
|
|
245
253
|
result = result
|
|
246
254
|
.split('\n')
|
|
247
255
|
.filter((line) => !isTypeDocArtifactLine(line))
|
|
@@ -249,12 +257,12 @@ function applyGlobalRegexes(text, options) {
|
|
|
249
257
|
result = result.replace(REGEX.TYPEDOC_COMMENT, (match) => match.startsWith('`') ? match : '');
|
|
250
258
|
}
|
|
251
259
|
if (config.markdownCleanup.removeSkipLinks) {
|
|
252
|
-
|
|
260
|
+
checkAbort('markdown:cleanup:skip-links');
|
|
253
261
|
result = result
|
|
254
262
|
.replace(REGEX.ZERO_WIDTH_ANCHOR, '')
|
|
255
263
|
.replace(REGEX.COMBINED_LINE_REMOVALS, '');
|
|
256
264
|
}
|
|
257
|
-
|
|
265
|
+
checkAbort('markdown:cleanup:spacing');
|
|
258
266
|
// normalizeSpacing
|
|
259
267
|
result = result
|
|
260
268
|
.replace(REGEX.SPACING_LINK_FIX, ']($1)\n\n[')
|
|
@@ -264,7 +272,7 @@ function applyGlobalRegexes(text, options) {
|
|
|
264
272
|
.replace(REGEX.SPACING_LIST_NUM_COMBINED, '$1\n\n$2')
|
|
265
273
|
.replace(REGEX.DOUBLE_NEWLINE_REDUCER, '\n\n');
|
|
266
274
|
result = normalizeNestedListIndentation(result);
|
|
267
|
-
|
|
275
|
+
checkAbort('markdown:cleanup:properties');
|
|
268
276
|
// fixProperties
|
|
269
277
|
for (let k = 0; k < 3; k++) {
|
|
270
278
|
const next = result.replace(REGEX.CONCATENATED_PROPS, '$1$2\n\n$3');
|
|
@@ -283,65 +291,54 @@ function normalizeNestedListIndentation(text) {
|
|
|
283
291
|
return `${normalized}${marker} `;
|
|
284
292
|
});
|
|
285
293
|
}
|
|
286
|
-
function findNextLine(content, lastIndex, len) {
|
|
287
|
-
let nextIndex = content.indexOf('\n', lastIndex);
|
|
288
|
-
let line;
|
|
289
|
-
if (nextIndex === -1) {
|
|
290
|
-
line = content.slice(lastIndex);
|
|
291
|
-
nextIndex = len;
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
if (nextIndex > lastIndex && content.charCodeAt(nextIndex - 1) === 13) {
|
|
295
|
-
line = content.slice(lastIndex, nextIndex - 1);
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
line = content.slice(lastIndex, nextIndex);
|
|
299
|
-
}
|
|
300
|
-
nextIndex++; // Skip \n
|
|
301
|
-
}
|
|
302
|
-
return { line, nextIndex };
|
|
303
|
-
}
|
|
304
|
-
function checkFenceStart(line) {
|
|
305
|
-
const match = REGEX.FENCE_START.exec(line);
|
|
306
|
-
return match ? (match[1] ?? '```') : null;
|
|
307
|
-
}
|
|
308
|
-
function isFenceClosure(trimmed, marker) {
|
|
309
|
-
return (trimmed.startsWith(marker) && trimmed.slice(marker.length).trim() === '');
|
|
310
|
-
}
|
|
311
|
-
function handleFencedLine(line, trimmed, fenceMarker, segments) {
|
|
312
|
-
segments.push(line);
|
|
313
|
-
return isFenceClosure(trimmed, fenceMarker) ? null : fenceMarker;
|
|
314
|
-
}
|
|
315
|
-
function handleUnfencedLine(line, segments, buffer, options) {
|
|
316
|
-
const newMarker = checkFenceStart(line);
|
|
317
|
-
if (!newMarker) {
|
|
318
|
-
buffer.push(line);
|
|
319
|
-
return { fenceMarker: null, buffer };
|
|
320
|
-
}
|
|
321
|
-
if (buffer.length > 0) {
|
|
322
|
-
segments.push(processTextBuffer(buffer, options));
|
|
323
|
-
buffer = [];
|
|
324
|
-
}
|
|
325
|
-
segments.push(line);
|
|
326
|
-
return { fenceMarker: newMarker, buffer };
|
|
327
|
-
}
|
|
328
294
|
export function cleanupMarkdownArtifacts(content, options) {
|
|
329
295
|
if (!content)
|
|
330
296
|
return '';
|
|
331
|
-
|
|
297
|
+
const checkAbort = createAbortChecker(options);
|
|
298
|
+
checkAbort('markdown:cleanup:begin');
|
|
332
299
|
const len = content.length;
|
|
333
300
|
let lastIndex = 0;
|
|
334
301
|
let fenceMarker = null;
|
|
335
302
|
const segments = [];
|
|
336
303
|
let buffer = [];
|
|
337
304
|
while (lastIndex < len) {
|
|
338
|
-
|
|
305
|
+
let nextIndex = content.indexOf('\n', lastIndex);
|
|
306
|
+
let line;
|
|
307
|
+
if (nextIndex === -1) {
|
|
308
|
+
line = content.slice(lastIndex);
|
|
309
|
+
nextIndex = len;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
if (nextIndex > lastIndex && content.charCodeAt(nextIndex - 1) === 13) {
|
|
313
|
+
line = content.slice(lastIndex, nextIndex - 1);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
line = content.slice(lastIndex, nextIndex);
|
|
317
|
+
}
|
|
318
|
+
nextIndex++; // Skip \n
|
|
319
|
+
}
|
|
339
320
|
const trimmed = line.trimStart();
|
|
340
321
|
if (fenceMarker) {
|
|
341
|
-
|
|
322
|
+
segments.push(line);
|
|
323
|
+
if (trimmed.startsWith(fenceMarker) &&
|
|
324
|
+
trimmed.slice(fenceMarker.length).trim() === '') {
|
|
325
|
+
fenceMarker = null;
|
|
326
|
+
}
|
|
342
327
|
}
|
|
343
328
|
else {
|
|
344
|
-
|
|
329
|
+
const match = REGEX.FENCE_START.exec(line);
|
|
330
|
+
const newMarker = match ? (match[1] ?? '```') : null;
|
|
331
|
+
if (!newMarker) {
|
|
332
|
+
buffer.push(line);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
if (buffer.length > 0) {
|
|
336
|
+
segments.push(processTextBuffer(buffer, options));
|
|
337
|
+
buffer = [];
|
|
338
|
+
}
|
|
339
|
+
segments.push(line);
|
|
340
|
+
fenceMarker = newMarker;
|
|
341
|
+
}
|
|
345
342
|
}
|
|
346
343
|
lastIndex = nextIndex;
|
|
347
344
|
}
|
|
@@ -534,3 +531,4 @@ export function buildMetadataFooter(metadata, fallbackUrl) {
|
|
|
534
531
|
lines.push(` <sub>${metadata.description}</sub>`);
|
|
535
532
|
return lines.join('\n');
|
|
536
533
|
}
|
|
534
|
+
//# sourceMappingURL=markdown-cleanup.js.map
|