@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.
Files changed (210) hide show
  1. package/README.md +59 -164
  2. package/bin/chat-server.ts +270 -0
  3. package/bin/dist/analytics-server.d.ts +11 -0
  4. package/bin/dist/analytics-server.d.ts.map +1 -0
  5. package/bin/dist/analytics-server.js +121 -0
  6. package/bin/dist/analytics-server.js.map +1 -0
  7. package/bin/dist/automation.d.ts +35 -0
  8. package/bin/dist/automation.d.ts.map +1 -0
  9. package/bin/dist/automation.js +259 -0
  10. package/bin/dist/automation.js.map +1 -0
  11. package/bin/dist/chat-server.d.ts +8 -0
  12. package/bin/dist/chat-server.d.ts.map +1 -0
  13. package/bin/dist/chat-server.js +322 -0
  14. package/bin/dist/chat-server.js.map +1 -0
  15. package/bin/dist/check.d.ts +16 -0
  16. package/bin/dist/check.d.ts.map +1 -0
  17. package/bin/dist/check.js +247 -0
  18. package/bin/dist/check.js.map +1 -0
  19. package/bin/dist/dependency-overlay.d.ts +7 -0
  20. package/bin/dist/dependency-overlay.d.ts.map +1 -0
  21. package/bin/dist/dependency-overlay.js +137 -0
  22. package/bin/dist/dependency-overlay.js.map +1 -0
  23. package/bin/dist/dory.js +254 -402
  24. package/bin/dist/dory.js.map +1 -1
  25. package/bin/dist/i18n-init.d.ts +6 -0
  26. package/bin/dist/i18n-init.d.ts.map +1 -0
  27. package/bin/dist/i18n-init.js +56 -0
  28. package/bin/dist/i18n-init.js.map +1 -0
  29. package/bin/dist/mcp-http.d.ts +8 -0
  30. package/bin/dist/mcp-http.d.ts.map +1 -0
  31. package/bin/dist/mcp-http.js +72 -0
  32. package/bin/dist/mcp-http.js.map +1 -0
  33. package/bin/dist/mcp.d.ts +2 -0
  34. package/bin/dist/mcp.d.ts.map +1 -0
  35. package/bin/dist/mcp.js +81 -0
  36. package/bin/dist/mcp.js.map +1 -0
  37. package/bin/dist/preview-entry.d.ts +2 -0
  38. package/bin/dist/preview-entry.d.ts.map +1 -0
  39. package/bin/dist/preview-entry.js +6 -0
  40. package/bin/dist/preview-entry.js.map +1 -0
  41. package/bin/dist/preview-server.d.ts +5 -0
  42. package/bin/dist/preview-server.d.ts.map +1 -0
  43. package/bin/dist/preview-server.js +146 -0
  44. package/bin/dist/preview-server.js.map +1 -0
  45. package/bin/dist/preview-static.d.ts +7 -0
  46. package/bin/dist/preview-static.d.ts.map +1 -0
  47. package/bin/dist/preview-static.js +70 -0
  48. package/bin/dist/preview-static.js.map +1 -0
  49. package/bin/dist/project-config.d.ts +22 -0
  50. package/bin/dist/project-config.d.ts.map +1 -0
  51. package/bin/dist/project-config.js +44 -0
  52. package/bin/dist/project-config.js.map +1 -0
  53. package/dist/index.html +57 -0
  54. package/dist/runtime/dory-runtime.css +2 -0
  55. package/dist/runtime/dory-runtime.html +14 -0
  56. package/dist/runtime/dory-runtime.js +5490 -0
  57. package/docs/api-playground-demo.mdx +119 -0
  58. package/docs/api-reference/asyncapi.json +324 -0
  59. package/docs/api-reference/openapi.json +366 -0
  60. package/docs/api-reference/operations/create.mdx +5 -0
  61. package/docs/api-reference/operations/delete.mdx +5 -0
  62. package/docs/api-reference/operations/get.mdx +5 -0
  63. package/docs/api-reference/operations/update.mdx +5 -0
  64. package/docs/api-reference/websocket-operations/receive-chat-message.mdx +5 -0
  65. package/docs/api-reference/websocket-operations/receive-notifications.mdx +5 -0
  66. package/docs/api-reference/websocket-operations/receive-presence-update.mdx +5 -0
  67. package/docs/api-reference/websocket-operations/send-chat-message.mdx +5 -0
  68. package/docs/api-reference/websocket-operations/send-presence-update.mdx +5 -0
  69. package/docs/assets/dory.jpeg +0 -0
  70. package/docs/components/accordion.mdx +145 -0
  71. package/docs/components/callouts.mdx +134 -0
  72. package/docs/components/cards.mdx +153 -0
  73. package/docs/components/code-blocks.mdx +281 -0
  74. package/docs/components/expandable.mdx +189 -0
  75. package/docs/components/icons.mdx +71 -0
  76. package/docs/components/images.mdx +82 -0
  77. package/docs/components/latex.mdx +148 -0
  78. package/docs/components/layout.mdx +178 -0
  79. package/docs/components/lists.mdx +134 -0
  80. package/docs/components/mermaid.mdx +149 -0
  81. package/docs/components/overview.mdx +81 -0
  82. package/docs/components/source.mdx +130 -0
  83. package/docs/components/steps.mdx +122 -0
  84. package/docs/components/tables.mdx +114 -0
  85. package/docs/components/tags.mdx +179 -0
  86. package/docs/components/typography.mdx +185 -0
  87. package/docs/configuration/analytics.mdx +45 -0
  88. package/docs/configuration/chat.mdx +59 -0
  89. package/docs/configuration/dory-json.mdx +278 -0
  90. package/docs/configuration/embed.mdx +73 -0
  91. package/docs/configuration/fonts.mdx +86 -0
  92. package/docs/configuration/internationalization.mdx +61 -0
  93. package/docs/configuration/navigation.mdx +217 -0
  94. package/docs/configuration/theming.mdx +166 -0
  95. package/docs/contributing.mdx +47 -0
  96. package/docs/dory.json +136 -0
  97. package/docs/embed-example.html +176 -0
  98. package/docs/favicon.svg +18 -0
  99. package/docs/features.mdx +440 -0
  100. package/docs/getting-started/automation.mdx +76 -0
  101. package/docs/getting-started/configuration.mdx +95 -0
  102. package/docs/getting-started/custom-components.mdx +60 -0
  103. package/docs/getting-started/installation.mdx +88 -0
  104. package/docs/getting-started/quick-start.mdx +53 -0
  105. package/docs/introduction.mdx +50 -0
  106. package/docs/logo/logo.svg +18 -0
  107. package/docs/playgrounds/api-playground.mdx +122 -0
  108. package/docs/playgrounds/websocket-playground.mdx +98 -0
  109. package/docs/social-card.png +0 -0
  110. package/docs/social-card.svg +17 -0
  111. package/docs/websocket-playground-demo.mdx +135 -0
  112. package/package.json +23 -17
  113. package/scripts/verify-component-examples.mjs +126 -0
  114. package/scripts/verify-runtime-parity.mjs +147 -0
  115. package/src/app.css +22 -1
  116. package/src/assets/fonts/HankenGrotesk.ttf +0 -0
  117. package/src/assets/fonts/OFL.txt +94 -0
  118. package/src/components/chat-assistant.tsx +229 -0
  119. package/src/components/dropdown.tsx +3 -3
  120. package/src/components/error-boundary.tsx +2 -2
  121. package/src/components/hooks.tsx +20 -1
  122. package/src/components/navigation.tsx +82 -51
  123. package/src/components/notification.tsx +2 -3
  124. package/src/components/routes.tsx +17 -19
  125. package/src/components/search-index.test.ts +15 -0
  126. package/src/components/search-index.ts +49 -48
  127. package/src/components/search.tsx +208 -104
  128. package/src/components/store.ts +27 -9
  129. package/src/config/mdx-common.ts +11 -0
  130. package/src/config/mdx.ts +10 -11
  131. package/src/embed/loader.ts +0 -3
  132. package/src/embed/types.ts +0 -2
  133. package/src/embed/widget-iframe.ts +19 -21
  134. package/src/embedded-runtime/config.ts +138 -0
  135. package/src/embedded-runtime/index.tsx +680 -0
  136. package/src/embedded-runtime/runtime.html +14 -0
  137. package/src/entry-server.tsx +46 -124
  138. package/src/main.tsx +17 -5
  139. package/src/mdx/accordion.tsx +3 -3
  140. package/src/mdx/api-playground.tsx +18 -16
  141. package/src/mdx/async-api.tsx +2 -2
  142. package/src/mdx/card.tsx +3 -2
  143. package/src/mdx/code.tsx +11 -9
  144. package/src/mdx/fence.tsx +6 -5
  145. package/src/mdx/icon-grid.tsx +4 -1
  146. package/src/mdx/icon-names.test.ts +15 -0
  147. package/src/mdx/icon-names.ts +60 -0
  148. package/src/mdx/icon-source-variants.ts +102 -0
  149. package/src/mdx/icon.tsx +12 -73
  150. package/src/mdx/latex.test.ts +38 -0
  151. package/src/mdx/latex.tsx +42 -64
  152. package/src/mdx/mdx.tsx +1 -1
  153. package/src/mdx/mermaid.tsx +12 -6
  154. package/src/mdx/open-api.tsx +130 -74
  155. package/src/mdx/preprocess.test.ts +16 -0
  156. package/src/mdx/preprocess.ts +61 -0
  157. package/src/mdx/processor.test.ts +135 -37
  158. package/src/mdx/processor.ts +54 -92
  159. package/src/mdx/source.tsx +5 -4
  160. package/src/mdx/specimen.tsx +57 -43
  161. package/src/mdx/tabs.tsx +32 -21
  162. package/src/mdx/text.tsx +11 -11
  163. package/src/mdx/try-it-panel.tsx +284 -0
  164. package/src/mdx/type-scale.tsx +7 -7
  165. package/src/mdx/websocket-playground.tsx +21 -14
  166. package/src/plugins/analytics-injector.ts +8 -0
  167. package/src/plugins/chat-dev-server.ts +32 -0
  168. package/src/plugins/docs-assets.test.ts +25 -0
  169. package/src/plugins/docs-assets.ts +6 -2
  170. package/src/plugins/frontmatter-dev-server.ts +2 -2
  171. package/src/plugins/frontmatter-generator.ts +1 -1
  172. package/src/plugins/html-files-middleware.test.ts +21 -1
  173. package/src/plugins/html-files-middleware.ts +26 -6
  174. package/src/plugins/html-metadata-injector.ts +24 -4
  175. package/src/plugins/llm-txt-dev-server.ts +2 -2
  176. package/src/plugins/llm-txt-generator.ts +21 -4
  177. package/src/plugins/prerender.ts +47 -20
  178. package/src/plugins/robots-generator.ts +1 -1
  179. package/src/plugins/sanitize.ts +6 -5
  180. package/src/plugins/shared.ts +6 -18
  181. package/src/plugins/sitemap-generator.ts +1 -1
  182. package/src/plugins/social-preview.test.ts +71 -0
  183. package/src/plugins/social-preview.ts +87 -0
  184. package/src/plugins/unified-mdx-plugin.ts +1 -1
  185. package/src/theme.scss +630 -207
  186. package/src/types/config.ts +53 -1
  187. package/src/ui/breadcrumb.tsx +17 -0
  188. package/src/ui/docs-header-view.tsx +32 -0
  189. package/src/ui/docs-navigation-view.tsx +69 -0
  190. package/src/ui/docs-page-frame.tsx +50 -0
  191. package/src/ui/dory-mark.tsx +9 -0
  192. package/src/ui/header.tsx +33 -90
  193. package/src/ui/layout.tsx +99 -153
  194. package/src/ui/mobile-navigation.tsx +10 -8
  195. package/src/ui/page-actions.tsx +67 -0
  196. package/src/ui/page-feedback.tsx +50 -0
  197. package/src/ui/page-footer.tsx +23 -0
  198. package/src/ui/prev-next-link.tsx +15 -69
  199. package/src/ui/prev-next-view.tsx +27 -0
  200. package/src/ui/table-of-content-view.tsx +167 -0
  201. package/src/ui/table-of-content.tsx +25 -183
  202. package/src/utils/analytics.test.ts +36 -0
  203. package/src/utils/analytics.ts +35 -0
  204. package/src/utils/colors.ts +7 -0
  205. package/src/utils/content-scope.test.ts +26 -0
  206. package/src/utils/content-scope.ts +39 -0
  207. package/src/utils/search-content.ts +12 -0
  208. package/src/utils/theme.ts +1 -7
  209. package/vite.config.ssr.ts +4 -4
  210. 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":"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"}
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/E,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,SAAS;YACrC,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;iBACxF,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjI,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAY;IACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACvG,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,OAAO,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxH,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAY;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;IACnE,WAAW,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,UAAkB,EAAE,IAAc;IAC5E,OAAO,IAAI,OAAO,CAAmC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACpE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9F,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO;YAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,8DAA8D;QAC9D,oDAAoD;QACpD,wBAAwB;QACxB,mBAAmB;QACnB,2BAA2B;QAC3B,4DAA4D;KAC7D,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAUD,SAAS,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IACvD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QACtH,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QAC/B,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACpI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAO,GAAsB,EAAE;IAC5E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAClH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,qBAAqB,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,CAAC;IAC3I,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxF,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC/F,IAAI,OAAgE,CAAC;IACrE,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/K,MAAM,GAAG,GAAG,oBAAoB,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC;QAChE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QAC5C,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,OAAO,CAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,SAAS,EAAE,CAAC;AACpC,MAAM,WAAW,GAAG,IAAI,SAAS,EAAE,CAAC;AACpC,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI;IAC9B,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC1D,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;IAC3D,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;IAC7D,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;CAC1B;IAAE,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3D,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI;IAC9B,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;CACzD;IAAE,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAQ;IACnC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvJ,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAU,EAAE,CAAC;QAC1D,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1J,OAAO,SAAS,CAAC,CAAC,CAAuC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAQ;IAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAsD,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACvG,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE;gBAC5E,MAAM;gBACN,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,UAAU,EAAE;gBAC3E,aAAa,EAAE,MAAM;gBACrB,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;oBACvC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG;wBAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;;wBACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrD,CAAC;aACF,EAAE,GAAG,CAAC,EAAE;gBACP,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;gBACnC,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC1D,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC5C,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC/B,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;oBACrB,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;wBACrB,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,wBAAwB,CAAC,CAAC,CAAC;wBACvD,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;QAC7C,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,4HAA4H,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChK,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5J,IAAI,QAAyB,CAAC;IAC9B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YACxC,QAAQ,GAAG,SAAS,CAAC;YACrB,KAAK,GAAG,OAAO,CAAC;YAChB,MAAM;QACR,CAAC;QAAC,MAAM,CAAC,CAAC,+CAA+C,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5H,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACtI,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC"}
@@ -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"}