@clidey/dory 1.0.8 → 1.10.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.
- package/README.md +59 -164
- package/bin/chat-server.ts +270 -0
- package/bin/dist/analytics-server.d.ts +11 -0
- package/bin/dist/analytics-server.d.ts.map +1 -0
- package/bin/dist/analytics-server.js +121 -0
- package/bin/dist/analytics-server.js.map +1 -0
- package/bin/dist/automation.d.ts +35 -0
- package/bin/dist/automation.d.ts.map +1 -0
- package/bin/dist/automation.js +259 -0
- package/bin/dist/automation.js.map +1 -0
- package/bin/dist/chat-server.d.ts +8 -0
- package/bin/dist/chat-server.d.ts.map +1 -0
- package/bin/dist/chat-server.js +322 -0
- package/bin/dist/chat-server.js.map +1 -0
- package/bin/dist/check.d.ts +16 -0
- package/bin/dist/check.d.ts.map +1 -0
- package/bin/dist/check.js +247 -0
- package/bin/dist/check.js.map +1 -0
- package/bin/dist/dependency-overlay.d.ts +7 -0
- package/bin/dist/dependency-overlay.d.ts.map +1 -0
- package/bin/dist/dependency-overlay.js +137 -0
- package/bin/dist/dependency-overlay.js.map +1 -0
- package/bin/dist/dory.js +254 -402
- package/bin/dist/dory.js.map +1 -1
- package/bin/dist/i18n-init.d.ts +6 -0
- package/bin/dist/i18n-init.d.ts.map +1 -0
- package/bin/dist/i18n-init.js +56 -0
- package/bin/dist/i18n-init.js.map +1 -0
- package/bin/dist/mcp-http.d.ts +8 -0
- package/bin/dist/mcp-http.d.ts.map +1 -0
- package/bin/dist/mcp-http.js +72 -0
- package/bin/dist/mcp-http.js.map +1 -0
- package/bin/dist/mcp.d.ts +2 -0
- package/bin/dist/mcp.d.ts.map +1 -0
- package/bin/dist/mcp.js +81 -0
- package/bin/dist/mcp.js.map +1 -0
- package/bin/dist/preview-entry.d.ts +2 -0
- package/bin/dist/preview-entry.d.ts.map +1 -0
- package/bin/dist/preview-entry.js +6 -0
- package/bin/dist/preview-entry.js.map +1 -0
- package/bin/dist/preview-server.d.ts +5 -0
- package/bin/dist/preview-server.d.ts.map +1 -0
- package/bin/dist/preview-server.js +146 -0
- package/bin/dist/preview-server.js.map +1 -0
- package/bin/dist/preview-static.d.ts +7 -0
- package/bin/dist/preview-static.d.ts.map +1 -0
- package/bin/dist/preview-static.js +70 -0
- package/bin/dist/preview-static.js.map +1 -0
- package/bin/dist/project-config.d.ts +22 -0
- package/bin/dist/project-config.d.ts.map +1 -0
- package/bin/dist/project-config.js +44 -0
- package/bin/dist/project-config.js.map +1 -0
- package/dist/index.html +57 -0
- package/dist/runtime/dory-runtime.css +2 -0
- package/dist/runtime/dory-runtime.html +14 -0
- package/dist/runtime/dory-runtime.js +5490 -0
- package/docs/api-playground-demo.mdx +119 -0
- package/docs/api-reference/asyncapi.json +324 -0
- package/docs/api-reference/openapi.json +366 -0
- package/docs/api-reference/operations/create.mdx +5 -0
- package/docs/api-reference/operations/delete.mdx +5 -0
- package/docs/api-reference/operations/get.mdx +5 -0
- package/docs/api-reference/operations/update.mdx +5 -0
- package/docs/api-reference/websocket-operations/receive-chat-message.mdx +5 -0
- package/docs/api-reference/websocket-operations/receive-notifications.mdx +5 -0
- package/docs/api-reference/websocket-operations/receive-presence-update.mdx +5 -0
- package/docs/api-reference/websocket-operations/send-chat-message.mdx +5 -0
- package/docs/api-reference/websocket-operations/send-presence-update.mdx +5 -0
- package/docs/assets/dory.jpeg +0 -0
- package/docs/components/accordion.mdx +145 -0
- package/docs/components/callouts.mdx +134 -0
- package/docs/components/cards.mdx +153 -0
- package/docs/components/code-blocks.mdx +281 -0
- package/docs/components/expandable.mdx +189 -0
- package/docs/components/icons.mdx +71 -0
- package/docs/components/images.mdx +82 -0
- package/docs/components/latex.mdx +148 -0
- package/docs/components/layout.mdx +178 -0
- package/docs/components/lists.mdx +134 -0
- package/docs/components/mermaid.mdx +149 -0
- package/docs/components/overview.mdx +81 -0
- package/docs/components/source.mdx +130 -0
- package/docs/components/steps.mdx +122 -0
- package/docs/components/tables.mdx +114 -0
- package/docs/components/tags.mdx +179 -0
- package/docs/components/typography.mdx +185 -0
- package/docs/configuration/analytics.mdx +45 -0
- package/docs/configuration/chat.mdx +59 -0
- package/docs/configuration/dory-json.mdx +278 -0
- package/docs/configuration/embed.mdx +73 -0
- package/docs/configuration/fonts.mdx +86 -0
- package/docs/configuration/internationalization.mdx +61 -0
- package/docs/configuration/navigation.mdx +217 -0
- package/docs/configuration/theming.mdx +166 -0
- package/docs/contributing.mdx +47 -0
- package/docs/dory.json +136 -0
- package/docs/embed-example.html +176 -0
- package/docs/favicon.svg +18 -0
- package/docs/features.mdx +440 -0
- package/docs/getting-started/automation.mdx +76 -0
- package/docs/getting-started/configuration.mdx +95 -0
- package/docs/getting-started/custom-components.mdx +60 -0
- package/docs/getting-started/installation.mdx +88 -0
- package/docs/getting-started/quick-start.mdx +53 -0
- package/docs/introduction.mdx +50 -0
- package/docs/logo/logo.svg +18 -0
- package/docs/playgrounds/api-playground.mdx +122 -0
- package/docs/playgrounds/websocket-playground.mdx +98 -0
- package/docs/social-card.png +0 -0
- package/docs/social-card.svg +17 -0
- package/docs/websocket-playground-demo.mdx +135 -0
- package/package.json +23 -17
- package/scripts/verify-component-examples.mjs +126 -0
- package/scripts/verify-runtime-parity.mjs +147 -0
- package/src/app.css +22 -1
- package/src/assets/fonts/HankenGrotesk.ttf +0 -0
- package/src/assets/fonts/OFL.txt +94 -0
- package/src/components/chat-assistant.tsx +229 -0
- package/src/components/dropdown.tsx +3 -3
- package/src/components/error-boundary.tsx +2 -2
- package/src/components/hooks.tsx +20 -1
- package/src/components/navigation.tsx +82 -51
- package/src/components/notification.tsx +2 -3
- package/src/components/routes.tsx +17 -19
- package/src/components/search-index.test.ts +15 -0
- package/src/components/search-index.ts +49 -48
- package/src/components/search.tsx +208 -104
- package/src/components/store.ts +27 -9
- package/src/config/mdx-common.ts +11 -0
- package/src/config/mdx.ts +10 -11
- package/src/embed/loader.ts +0 -3
- package/src/embed/types.ts +0 -2
- package/src/embed/widget-iframe.ts +19 -21
- package/src/embedded-runtime/config.ts +138 -0
- package/src/embedded-runtime/index.tsx +680 -0
- package/src/embedded-runtime/runtime.html +14 -0
- package/src/entry-server.tsx +46 -124
- package/src/main.tsx +17 -5
- package/src/mdx/accordion.tsx +3 -3
- package/src/mdx/api-playground.tsx +18 -16
- package/src/mdx/async-api.tsx +2 -2
- package/src/mdx/card.tsx +3 -2
- package/src/mdx/code.tsx +11 -9
- package/src/mdx/fence.tsx +6 -5
- package/src/mdx/icon-grid.tsx +4 -1
- package/src/mdx/icon-names.test.ts +15 -0
- package/src/mdx/icon-names.ts +60 -0
- package/src/mdx/icon-source-variants.ts +102 -0
- package/src/mdx/icon.tsx +12 -73
- package/src/mdx/latex.test.ts +38 -0
- package/src/mdx/latex.tsx +42 -64
- package/src/mdx/mdx.tsx +1 -1
- package/src/mdx/mermaid.tsx +12 -6
- package/src/mdx/open-api.tsx +130 -74
- package/src/mdx/preprocess.test.ts +16 -0
- package/src/mdx/preprocess.ts +61 -0
- package/src/mdx/processor.test.ts +135 -37
- package/src/mdx/processor.ts +54 -92
- package/src/mdx/source.tsx +5 -4
- package/src/mdx/specimen.tsx +57 -43
- package/src/mdx/tabs.tsx +32 -21
- package/src/mdx/text.tsx +11 -11
- package/src/mdx/try-it-panel.tsx +284 -0
- package/src/mdx/type-scale.tsx +7 -7
- package/src/mdx/websocket-playground.tsx +21 -14
- package/src/plugins/analytics-injector.ts +8 -0
- package/src/plugins/chat-dev-server.ts +32 -0
- package/src/plugins/docs-assets.test.ts +25 -0
- package/src/plugins/docs-assets.ts +6 -2
- package/src/plugins/frontmatter-dev-server.ts +2 -2
- package/src/plugins/frontmatter-generator.ts +1 -1
- package/src/plugins/html-files-middleware.test.ts +21 -1
- package/src/plugins/html-files-middleware.ts +26 -6
- package/src/plugins/html-metadata-injector.ts +24 -4
- package/src/plugins/llm-txt-dev-server.ts +2 -2
- package/src/plugins/llm-txt-generator.ts +21 -4
- package/src/plugins/prerender.ts +47 -20
- package/src/plugins/robots-generator.ts +1 -1
- package/src/plugins/sanitize.ts +6 -5
- package/src/plugins/shared.ts +6 -18
- package/src/plugins/sitemap-generator.ts +1 -1
- package/src/plugins/social-preview.test.ts +71 -0
- package/src/plugins/social-preview.ts +87 -0
- package/src/plugins/unified-mdx-plugin.ts +1 -1
- package/src/theme.scss +630 -207
- package/src/types/config.ts +53 -1
- package/src/ui/breadcrumb.tsx +17 -0
- package/src/ui/docs-header-view.tsx +32 -0
- package/src/ui/docs-navigation-view.tsx +69 -0
- package/src/ui/docs-page-frame.tsx +50 -0
- package/src/ui/dory-mark.tsx +9 -0
- package/src/ui/header.tsx +33 -90
- package/src/ui/layout.tsx +99 -153
- package/src/ui/mobile-navigation.tsx +10 -8
- package/src/ui/page-actions.tsx +67 -0
- package/src/ui/page-feedback.tsx +50 -0
- package/src/ui/page-footer.tsx +23 -0
- package/src/ui/prev-next-link.tsx +15 -69
- package/src/ui/prev-next-view.tsx +27 -0
- package/src/ui/table-of-content-view.tsx +167 -0
- package/src/ui/table-of-content.tsx +25 -183
- package/src/utils/analytics.test.ts +36 -0
- package/src/utils/analytics.ts +35 -0
- package/src/utils/colors.ts +7 -0
- package/src/utils/content-scope.test.ts +26 -0
- package/src/utils/content-scope.ts +39 -0
- package/src/utils/search-content.ts +12 -0
- package/src/utils/theme.ts +1 -7
- package/vite.config.ssr.ts +4 -4
- package/vite.config.ts +22 -16
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';
|
|
5
|
+
const aiAgents = [
|
|
6
|
+
['ChatGPT-User', /chatgpt-user/i], ['GPTBot', /gptbot/i], ['OAI-SearchBot', /oai-searchbot/i],
|
|
7
|
+
['Claude-User', /claude-user/i], ['ClaudeBot', /claudebot/i], ['Claude-SearchBot', /claude-searchbot/i],
|
|
8
|
+
['PerplexityBot', /perplexitybot/i], ['Perplexity-User', /perplexity-user/i],
|
|
9
|
+
['Meta-ExternalAgent', /meta-externalagent/i],
|
|
10
|
+
];
|
|
11
|
+
function postHogConfig(projectRoot) {
|
|
12
|
+
const rootConfig = join(projectRoot, 'dory.json');
|
|
13
|
+
const configPath = existsSync(rootConfig) ? rootConfig : join(projectRoot, 'docs', 'dory.json');
|
|
14
|
+
if (!existsSync(configPath))
|
|
15
|
+
return undefined;
|
|
16
|
+
try {
|
|
17
|
+
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
18
|
+
const token = config.analytics?.posthog?.token;
|
|
19
|
+
if (typeof token !== 'string' || !token.trim())
|
|
20
|
+
return undefined;
|
|
21
|
+
const host = config.analytics?.posthog?.apiHost || DEFAULT_POSTHOG_HOST;
|
|
22
|
+
if (typeof host !== 'string')
|
|
23
|
+
return undefined;
|
|
24
|
+
const url = new URL(host);
|
|
25
|
+
const loopback = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);
|
|
26
|
+
if ((url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) || url.username || url.password || url.search || url.hash)
|
|
27
|
+
return undefined;
|
|
28
|
+
const base = url.href.endsWith('/') ? url : new URL(url.href + '/');
|
|
29
|
+
return { token: token.trim(), endpoint: new URL('i/v0/e/', base).href };
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
console.warn('Dory analytics could not read PostHog configuration');
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function safePath(value) {
|
|
37
|
+
const path = value.split(/[?#]/, 1)[0];
|
|
38
|
+
return path.length <= 240 && /^\/[a-zA-Z0-9/_~.%-]*$/.test(path) ? path : '/';
|
|
39
|
+
}
|
|
40
|
+
function safeReferrer(value, host) {
|
|
41
|
+
if (!value)
|
|
42
|
+
return 'Direct';
|
|
43
|
+
try {
|
|
44
|
+
const url = new URL(value);
|
|
45
|
+
return url.host === host ? 'Internal' : url.hostname.slice(0, 100);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return 'Direct';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function isDocumentationPath(path) {
|
|
52
|
+
if (path.startsWith('/__dory/') || path.startsWith('/api/') || path.startsWith('/assets/'))
|
|
53
|
+
return false;
|
|
54
|
+
if (['/favicon.ico', '/favicon.svg', '/robots.txt', '/sitemap.xml', '/frontmatter.json', '/search-content.json', '/embed.js', '/embed-widget.js'].includes(path))
|
|
55
|
+
return false;
|
|
56
|
+
if (path === '/llms.txt' || path === '/llms-full.txt')
|
|
57
|
+
return true;
|
|
58
|
+
if (/\.(?:mdx|md)$/.test(path))
|
|
59
|
+
return true;
|
|
60
|
+
return !/\.[a-z0-9]{1,8}$/i.test(path);
|
|
61
|
+
}
|
|
62
|
+
function declaredAgent(userAgent) {
|
|
63
|
+
return aiAgents.find(([, pattern]) => pattern.test(userAgent))?.[0];
|
|
64
|
+
}
|
|
65
|
+
function isOtherBot(userAgent) {
|
|
66
|
+
return /bot|crawler|spider|curl\/|wget\/|python-requests|headless/i.test(userAgent);
|
|
67
|
+
}
|
|
68
|
+
/** Sends server-observed requests to PostHog without retaining IPs or user-agent strings. */
|
|
69
|
+
export function createAnalytics(options) {
|
|
70
|
+
const posthog = postHogConfig(options.projectRoot);
|
|
71
|
+
let warnedDeliveryFailure = false;
|
|
72
|
+
function capture(event, properties) {
|
|
73
|
+
if (!posthog)
|
|
74
|
+
return;
|
|
75
|
+
void fetch(posthog.endpoint, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: { 'Content-Type': 'application/json' },
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
token: posthog.token,
|
|
80
|
+
event,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
properties: { ...properties, distinct_id: randomUUID(), $process_person_profile: false },
|
|
83
|
+
}),
|
|
84
|
+
signal: AbortSignal.timeout(5_000),
|
|
85
|
+
}).then(response => {
|
|
86
|
+
if (!response.ok)
|
|
87
|
+
throw new Error('PostHog rejected an analytics event');
|
|
88
|
+
}).catch(() => {
|
|
89
|
+
if (!warnedDeliveryFailure) {
|
|
90
|
+
console.warn('Dory could not deliver analytics to PostHog');
|
|
91
|
+
warnedDeliveryFailure = true;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function recordRequest(req, status) {
|
|
96
|
+
if (!posthog || req.method !== 'GET' || (status !== 200 && status !== 304))
|
|
97
|
+
return;
|
|
98
|
+
let pathname;
|
|
99
|
+
try {
|
|
100
|
+
pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const prefix = options.basePath?.replace(/\/$/, '') ?? '';
|
|
106
|
+
const path = safePath(prefix && pathname.startsWith(prefix + '/') ? pathname.slice(prefix.length) : pathname);
|
|
107
|
+
if (!isDocumentationPath(path))
|
|
108
|
+
return;
|
|
109
|
+
const userAgent = String(req.headers['user-agent'] ?? '').slice(0, 250);
|
|
110
|
+
const agent = declaredAgent(userAgent);
|
|
111
|
+
if (agent) {
|
|
112
|
+
capture('docs_ai_request', { path, agent });
|
|
113
|
+
}
|
|
114
|
+
else if (!isOtherBot(userAgent)) {
|
|
115
|
+
const referrer = safeReferrer(typeof req.headers.referer === 'string' ? req.headers.referer : undefined, req.headers.host);
|
|
116
|
+
capture('docs_page_request', { path, referrer });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { recordRequest };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=analytics-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-server.js","sourceRoot":"","sources":["../analytics-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AACxD,MAAM,QAAQ,GAA4B;IACxC,CAAC,cAAc,EAAE,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC7F,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;IACvG,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAC5E,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;CAC9C,CAAC;AAEF,SAAS,aAAa,CAAC,WAAmB;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAChG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAEzD,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,oBAAoB,CAAC;QACxE,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QACvJ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAChF,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB,EAAE,IAAwB;IACvE,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACzG,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/K,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACnC,OAAO,4DAA4D,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACtF,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,SAAS,OAAO,CAAC,KAA8C,EAAE,UAAkC;QACjG,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE;aACzF,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC5D,qBAAqB,GAAG,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,aAAa,CAAC,GAAoB,EAAE,MAAc;QACzD,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;YAAE,OAAO;QACnF,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;QAAC,CAAC;QACxE,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9G,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,OAAO;QAEvC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3H,OAAO,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare function projectInfo(root: string): {
|
|
2
|
+
root: string;
|
|
3
|
+
config: any;
|
|
4
|
+
pages: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function listPages(root: string): string[];
|
|
7
|
+
export declare function pagePath(root: string, page: string): string;
|
|
8
|
+
export declare function readPage(root: string, page: string): string;
|
|
9
|
+
export declare function writePage(root: string, page: string, content: string): string;
|
|
10
|
+
export declare function runDory(root: string, entrypoint: string, args: string[]): Promise<{
|
|
11
|
+
code: number;
|
|
12
|
+
output: string;
|
|
13
|
+
}>;
|
|
14
|
+
export interface ScreenshotOptions {
|
|
15
|
+
route?: string;
|
|
16
|
+
output?: string;
|
|
17
|
+
width?: number;
|
|
18
|
+
height?: number;
|
|
19
|
+
theme?: 'light' | 'dark';
|
|
20
|
+
}
|
|
21
|
+
export declare function screenshot(root: string, options?: ScreenshotOptions): Promise<{
|
|
22
|
+
output: string;
|
|
23
|
+
url: string;
|
|
24
|
+
data: Buffer<ArrayBufferLike>;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function isPublicAddress(address: string): boolean;
|
|
27
|
+
export declare function discoverSite(address: string): Promise<{
|
|
28
|
+
site: string;
|
|
29
|
+
indexUrl: string;
|
|
30
|
+
fullUrl: string;
|
|
31
|
+
pages: string[];
|
|
32
|
+
index: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare function readRemotePage(address: string): Promise<string>;
|
|
35
|
+
//# sourceMappingURL=automation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../automation.ts"],"names":[],"mappings":"AAWA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM;;;;EAKvC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAY3D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;UACjD,MAAM;YAAU,MAAM;GASlD;AAqBD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAkBD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;;;;GA+B7E;AAgBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKxD;AA2DD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM;;;;;;GAqBjD;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,mBAInD"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { createServer, request as httpRequest } from 'node:http';
|
|
3
|
+
import { request as httpsRequest } from 'node:https';
|
|
4
|
+
import { lookup } from 'node:dns/promises';
|
|
5
|
+
import { BlockList, isIP } from 'node:net';
|
|
6
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { basename, dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
8
|
+
import sirv from 'sirv';
|
|
9
|
+
const excludedDirectories = new Set(['node_modules', 'dist', '.git', '.dory']);
|
|
10
|
+
export function projectInfo(root) {
|
|
11
|
+
const path = resolve(root, 'dory.json');
|
|
12
|
+
if (!existsSync(path))
|
|
13
|
+
throw new Error(`dory.json not found in ${root}`);
|
|
14
|
+
const config = JSON.parse(readFileSync(path, 'utf8'));
|
|
15
|
+
return { root: resolve(root), config, pages: listPages(root) };
|
|
16
|
+
}
|
|
17
|
+
export function listPages(root) {
|
|
18
|
+
const pages = [];
|
|
19
|
+
const walk = (dir) => {
|
|
20
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
21
|
+
if (entry.isSymbolicLink())
|
|
22
|
+
continue;
|
|
23
|
+
if (entry.isDirectory() && !excludedDirectories.has(entry.name))
|
|
24
|
+
walk(join(dir, entry.name));
|
|
25
|
+
else if (entry.isFile() && entry.name.endsWith('.mdx'))
|
|
26
|
+
pages.push(relative(root, join(dir, entry.name)).split(sep).join('/'));
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
walk(resolve(root));
|
|
30
|
+
return pages.sort();
|
|
31
|
+
}
|
|
32
|
+
export function pagePath(root, page) {
|
|
33
|
+
if (!page.endsWith('.mdx') || isAbsolute(page))
|
|
34
|
+
throw new Error('Page must be a relative .mdx path');
|
|
35
|
+
const absolute = resolve(root, page);
|
|
36
|
+
const rel = relative(resolve(root), absolute);
|
|
37
|
+
if (!rel || rel === '..' || rel.startsWith(`..${sep}`))
|
|
38
|
+
throw new Error('Page is outside the project');
|
|
39
|
+
let parent = dirname(absolute);
|
|
40
|
+
while (parent !== resolve(root)) {
|
|
41
|
+
if (existsSync(parent) && lstatSync(parent).isSymbolicLink())
|
|
42
|
+
throw new Error('Symbolic link directory is not allowed');
|
|
43
|
+
parent = dirname(parent);
|
|
44
|
+
}
|
|
45
|
+
if (existsSync(absolute) && lstatSync(absolute).isSymbolicLink())
|
|
46
|
+
throw new Error('Symbolic link page is not allowed');
|
|
47
|
+
return absolute;
|
|
48
|
+
}
|
|
49
|
+
export function readPage(root, page) {
|
|
50
|
+
const path = pagePath(root, page);
|
|
51
|
+
if (!existsSync(path))
|
|
52
|
+
throw new Error(`Page not found: ${page}`);
|
|
53
|
+
return readFileSync(path, 'utf8');
|
|
54
|
+
}
|
|
55
|
+
export function writePage(root, page, content) {
|
|
56
|
+
projectInfo(root);
|
|
57
|
+
const path = pagePath(root, page);
|
|
58
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
59
|
+
writeFileSync(path, content, 'utf8');
|
|
60
|
+
return path;
|
|
61
|
+
}
|
|
62
|
+
export async function runDory(root, entrypoint, args) {
|
|
63
|
+
return new Promise((done, reject) => {
|
|
64
|
+
const child = spawn(process.execPath, [entrypoint, ...args], { cwd: root, env: process.env });
|
|
65
|
+
let output = '';
|
|
66
|
+
const append = (chunk) => { output += chunk.toString(); if (output.length > 100_000)
|
|
67
|
+
output = output.slice(-100_000); };
|
|
68
|
+
child.stdout.on('data', append);
|
|
69
|
+
child.stderr.on('data', append);
|
|
70
|
+
child.once('error', reject);
|
|
71
|
+
child.once('close', code => done({ code: code ?? 1, output }));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function basePath(root) {
|
|
75
|
+
const config = projectInfo(root).config;
|
|
76
|
+
const value = typeof config.basePath === 'string' ? config.basePath.replace(/^\/+|\/+$/g, '') : '';
|
|
77
|
+
return value ? `/${value}` : '';
|
|
78
|
+
}
|
|
79
|
+
function browserPath() {
|
|
80
|
+
const candidates = [
|
|
81
|
+
process.env.DORY_CHROME_PATH,
|
|
82
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
83
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium',
|
|
84
|
+
'/usr/bin/google-chrome',
|
|
85
|
+
'/usr/bin/chromium',
|
|
86
|
+
'/usr/bin/chromium-browser',
|
|
87
|
+
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
88
|
+
];
|
|
89
|
+
return candidates.find(path => path && existsSync(path));
|
|
90
|
+
}
|
|
91
|
+
function screenshotOutput(root, requested) {
|
|
92
|
+
const projectRoot = realpathSync(root);
|
|
93
|
+
const screenshotsDir = resolve(projectRoot, '.dory', 'screenshots');
|
|
94
|
+
const output = resolve(projectRoot, requested);
|
|
95
|
+
const rel = relative(screenshotsDir, output);
|
|
96
|
+
if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel) || extname(output).toLowerCase() !== '.png') {
|
|
97
|
+
throw new Error('Screenshot output must be a .png file inside .dory/screenshots');
|
|
98
|
+
}
|
|
99
|
+
let current = output;
|
|
100
|
+
while (current !== projectRoot) {
|
|
101
|
+
if (lstatSync(current, { throwIfNoEntry: false })?.isSymbolicLink())
|
|
102
|
+
throw new Error('Screenshot output cannot use symbolic links');
|
|
103
|
+
current = dirname(current);
|
|
104
|
+
}
|
|
105
|
+
return output;
|
|
106
|
+
}
|
|
107
|
+
export async function screenshot(root, options = {}) {
|
|
108
|
+
const { chromium } = await import('playwright-core');
|
|
109
|
+
const dist = resolve(root, 'dist');
|
|
110
|
+
if (!existsSync(resolve(dist, 'index.html')))
|
|
111
|
+
throw new Error('dist/index.html is missing; run dory build first');
|
|
112
|
+
const route = `/${(options.route ?? '').replace(/^\/+/, '')}`;
|
|
113
|
+
const output = screenshotOutput(root, options.output ?? `.dory/screenshots/${basename(route) || 'index'}-${options.theme ?? 'light'}.png`);
|
|
114
|
+
const executablePath = browserPath();
|
|
115
|
+
if (!executablePath)
|
|
116
|
+
throw new Error('Chrome/Chromium not found. Set DORY_CHROME_PATH to its executable.');
|
|
117
|
+
const prefix = basePath(root);
|
|
118
|
+
const serve = sirv(dist, { single: true, dev: false });
|
|
119
|
+
const server = createServer((req, res) => {
|
|
120
|
+
if (prefix && req.url?.startsWith(`${prefix}/`))
|
|
121
|
+
req.url = req.url.slice(prefix.length);
|
|
122
|
+
serve(req, res);
|
|
123
|
+
});
|
|
124
|
+
await new Promise((done, reject) => { server.once('error', reject); server.listen(0, '127.0.0.1', done); });
|
|
125
|
+
const address = server.address();
|
|
126
|
+
if (!address || typeof address === 'string')
|
|
127
|
+
throw new Error('Could not start preview server');
|
|
128
|
+
let browser;
|
|
129
|
+
try {
|
|
130
|
+
browser = await chromium.launch({ executablePath, headless: true });
|
|
131
|
+
const page = await browser.newPage({ viewport: { width: options.width ?? 1440, height: options.height ?? 900 }, colorScheme: options.theme ?? 'light', deviceScaleFactor: 1 });
|
|
132
|
+
const url = `http://127.0.0.1:${address.port}${prefix}${route}`;
|
|
133
|
+
await page.goto(url, { waitUntil: 'networkidle', timeout: 30_000 });
|
|
134
|
+
await page.evaluate('document.fonts.ready');
|
|
135
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
136
|
+
const data = await page.screenshot({ path: output, fullPage: true });
|
|
137
|
+
return { output, url, data };
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
await browser?.close();
|
|
141
|
+
await new Promise(done => server.close(() => done()));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const blockedIPv4 = new BlockList();
|
|
145
|
+
const blockedIPv6 = new BlockList();
|
|
146
|
+
for (const [address, prefix] of [
|
|
147
|
+
['0.0.0.0', 8], ['10.0.0.0', 8], ['100.64.0.0', 10], ['127.0.0.0', 8],
|
|
148
|
+
['169.254.0.0', 16], ['172.16.0.0', 12], ['192.0.0.0', 24],
|
|
149
|
+
['192.0.2.0', 24], ['192.88.99.0', 24], ['192.168.0.0', 16],
|
|
150
|
+
['198.18.0.0', 15], ['198.51.100.0', 24], ['203.0.113.0', 24],
|
|
151
|
+
['224.0.0.0', 4], ['240.0.0.0', 4],
|
|
152
|
+
])
|
|
153
|
+
blockedIPv4.addSubnet(address, prefix, 'ipv4');
|
|
154
|
+
for (const [address, prefix] of [
|
|
155
|
+
['::', 128], ['::1', 128], ['::ffff:0:0', 96], ['fc00::', 7],
|
|
156
|
+
['fe80::', 10], ['ff00::', 8], ['2001:db8::', 32], ['2002::', 16],
|
|
157
|
+
])
|
|
158
|
+
blockedIPv6.addSubnet(address, prefix, 'ipv6');
|
|
159
|
+
export function isPublicAddress(address) {
|
|
160
|
+
const family = isIP(address);
|
|
161
|
+
if (family === 4)
|
|
162
|
+
return !blockedIPv4.check(address, 'ipv4');
|
|
163
|
+
if (family === 6)
|
|
164
|
+
return /^[23]/.test(address) && !blockedIPv6.check(address, 'ipv6');
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
async function publicAddress(url) {
|
|
168
|
+
if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
|
|
169
|
+
throw new Error('Use a public HTTP or HTTPS URL without credentials');
|
|
170
|
+
const hostname = url.hostname.replace(/^\[|\]$/g, '');
|
|
171
|
+
const addresses = isIP(hostname)
|
|
172
|
+
? [{ address: hostname, family: isIP(hostname) }]
|
|
173
|
+
: await lookup(hostname, { all: true, verbatim: true });
|
|
174
|
+
if (!addresses.length || addresses.some(item => !isPublicAddress(item.address)))
|
|
175
|
+
throw new Error(`URL must resolve to a public address: ${url.hostname}`);
|
|
176
|
+
return addresses[0];
|
|
177
|
+
}
|
|
178
|
+
async function getText(url) {
|
|
179
|
+
const signal = AbortSignal.timeout(15_000);
|
|
180
|
+
for (let redirects = 0; redirects <= 5; redirects++) {
|
|
181
|
+
const pinned = await publicAddress(url);
|
|
182
|
+
const response = await new Promise((done, reject) => {
|
|
183
|
+
const request = (url.protocol === 'https:' ? httpsRequest : httpRequest)(url, {
|
|
184
|
+
signal,
|
|
185
|
+
headers: { Accept: 'text/plain, text/html', 'Accept-Encoding': 'identity' },
|
|
186
|
+
maxHeaderSize: 16_384,
|
|
187
|
+
lookup: (_hostname, options, callback) => {
|
|
188
|
+
if (typeof options === 'object' && options.all)
|
|
189
|
+
callback(null, [pinned]);
|
|
190
|
+
else
|
|
191
|
+
callback(null, pinned.address, pinned.family);
|
|
192
|
+
},
|
|
193
|
+
}, res => {
|
|
194
|
+
const status = res.statusCode ?? 0;
|
|
195
|
+
if (status >= 300 && status < 400 && res.headers.location) {
|
|
196
|
+
done({ status, location: res.headers.location, body: '' });
|
|
197
|
+
res.destroy();
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (status < 200 || status >= 300) {
|
|
201
|
+
reject(new Error(`${url}: HTTP ${status}`));
|
|
202
|
+
res.destroy();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const chunks = [];
|
|
206
|
+
let size = 0;
|
|
207
|
+
res.on('data', (chunk) => {
|
|
208
|
+
size += chunk.length;
|
|
209
|
+
if (size > 5_000_000) {
|
|
210
|
+
res.destroy(new Error(`${url}: content exceeds 5 MB`));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
chunks.push(chunk);
|
|
214
|
+
});
|
|
215
|
+
res.once('end', () => done({ status, body: Buffer.concat(chunks).toString('utf8') }));
|
|
216
|
+
res.once('error', reject);
|
|
217
|
+
});
|
|
218
|
+
request.once('error', reject);
|
|
219
|
+
request.end();
|
|
220
|
+
});
|
|
221
|
+
if (!response.location)
|
|
222
|
+
return response.body;
|
|
223
|
+
url = new URL(response.location, url);
|
|
224
|
+
}
|
|
225
|
+
throw new Error('Too many redirects while reading documentation');
|
|
226
|
+
}
|
|
227
|
+
export async function discoverSite(address) {
|
|
228
|
+
const site = new URL(address);
|
|
229
|
+
if (!['http:', 'https:'].includes(site.protocol))
|
|
230
|
+
throw new Error('Use an HTTP or HTTPS URL');
|
|
231
|
+
const html = await getText(site);
|
|
232
|
+
const alternate = html.match(/<link\b(?=[^>]*\brel=["']alternate["'])(?=[^>]*\btitle=["']LLM documentation index["'])[^>]*\bhref=["']([^"']+)["'][^>]*>/i)?.[1];
|
|
233
|
+
const candidates = [alternate && new URL(alternate, site), new URL('llms.txt', site), new URL('/llms.txt', site)].filter((url) => Boolean(url));
|
|
234
|
+
let indexUrl;
|
|
235
|
+
let index = '';
|
|
236
|
+
for (const candidate of candidates) {
|
|
237
|
+
try {
|
|
238
|
+
const content = await getText(candidate);
|
|
239
|
+
if (!/^#\s+.+/m.test(content))
|
|
240
|
+
continue;
|
|
241
|
+
indexUrl = candidate;
|
|
242
|
+
index = content;
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
catch { /* Try the next standard discovery location. */ }
|
|
246
|
+
}
|
|
247
|
+
if (!indexUrl)
|
|
248
|
+
throw new Error(`No llms.txt index found for ${site.href}`);
|
|
249
|
+
const pages = [...index.matchAll(/\[[^\]]+\]\(([^)]+\.mdx(?:\?[^)]*)?)\)/g)].map(match => new URL(match[1], indexUrl).href);
|
|
250
|
+
const fullUrl = new URL('llms-full.txt', indexUrl);
|
|
251
|
+
return { site: site.href, indexUrl: indexUrl.href, fullUrl: fullUrl.href, pages, index };
|
|
252
|
+
}
|
|
253
|
+
export async function readRemotePage(address) {
|
|
254
|
+
const url = new URL(address);
|
|
255
|
+
if (!['http:', 'https:'].includes(url.protocol) || extname(url.pathname) !== '.mdx')
|
|
256
|
+
throw new Error('Use an HTTP or HTTPS .mdx URL');
|
|
257
|
+
return getText(url);
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=automation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation.js","sourceRoot":"","sources":["../automation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
type ChatOptions = {
|
|
3
|
+
docsDir: string;
|
|
4
|
+
localDevelopment?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function handleChatRequest(req: IncomingMessage, res: ServerResponse, options: ChatOptions): Promise<boolean>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=chat-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-server.d.ts","sourceRoot":"","sources":["../chat-server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAoNnE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAqDzH"}
|