svedocs 0.1.0-beta.2
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/LICENSE +5 -0
- package/README.md +38 -0
- package/dist/ai/openai-compatible.d.ts +13 -0
- package/dist/ai/openai-compatible.d.ts.map +1 -0
- package/dist/ai/openai-compatible.js +92 -0
- package/dist/ai/providers.d.ts +19 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +185 -0
- package/dist/ai/rate-limit.d.ts +18 -0
- package/dist/ai/rate-limit.d.ts.map +1 -0
- package/dist/ai/rate-limit.js +52 -0
- package/dist/ai/response.d.ts +4 -0
- package/dist/ai/response.d.ts.map +1 -0
- package/dist/ai/response.js +151 -0
- package/dist/ai/runtime.d.ts +30 -0
- package/dist/ai/runtime.d.ts.map +1 -0
- package/dist/ai/runtime.js +105 -0
- package/dist/ai/types.d.ts +93 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +1 -0
- package/dist/ai.d.ts +7 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +6 -0
- package/dist/ambient.d.ts +5 -0
- package/dist/cloudflare.d.ts +27 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +146 -0
- package/dist/config.d.ts +311 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +243 -0
- package/dist/core/checks.d.ts +4 -0
- package/dist/core/checks.d.ts.map +1 -0
- package/dist/core/checks.js +252 -0
- package/dist/core/config.d.ts +5 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +182 -0
- package/dist/core/content.d.ts +7 -0
- package/dist/core/content.d.ts.map +1 -0
- package/dist/core/content.js +211 -0
- package/dist/core/links.d.ts +8 -0
- package/dist/core/links.d.ts.map +1 -0
- package/dist/core/links.js +94 -0
- package/dist/core/navigation.d.ts +5 -0
- package/dist/core/navigation.d.ts.map +1 -0
- package/dist/core/navigation.js +144 -0
- package/dist/core/search.d.ts +5 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +41 -0
- package/dist/core/types.d.ts +269 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/utils.d.ts +12 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +52 -0
- package/dist/core.d.ts +8 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/mdx/ast.d.ts +32 -0
- package/dist/mdx/ast.d.ts.map +1 -0
- package/dist/mdx/ast.js +148 -0
- package/dist/mdx/code.d.ts +14 -0
- package/dist/mdx/code.d.ts.map +1 -0
- package/dist/mdx/code.js +315 -0
- package/dist/mdx/compile.d.ts +26 -0
- package/dist/mdx/compile.d.ts.map +1 -0
- package/dist/mdx/compile.js +63 -0
- package/dist/mdx/diff.d.ts +5 -0
- package/dist/mdx/diff.d.ts.map +1 -0
- package/dist/mdx/diff.js +160 -0
- package/dist/mdx/utils.d.ts +10 -0
- package/dist/mdx/utils.d.ts.map +1 -0
- package/dist/mdx/utils.js +64 -0
- package/dist/og/image.d.ts +21 -0
- package/dist/og/image.d.ts.map +1 -0
- package/dist/og/image.js +216 -0
- package/dist/og/metadata.d.ts +7 -0
- package/dist/og/metadata.d.ts.map +1 -0
- package/dist/og/metadata.js +160 -0
- package/dist/og/types.d.ts +59 -0
- package/dist/og/types.d.ts.map +1 -0
- package/dist/og/types.js +1 -0
- package/dist/og.d.ts +4 -0
- package/dist/og.d.ts.map +1 -0
- package/dist/og.js +3 -0
- package/dist/search/algolia.d.ts +10 -0
- package/dist/search/algolia.d.ts.map +1 -0
- package/dist/search/algolia.js +82 -0
- package/dist/search/cloudflare-sync.d.ts +5 -0
- package/dist/search/cloudflare-sync.d.ts.map +1 -0
- package/dist/search/cloudflare-sync.js +169 -0
- package/dist/search/cloudflare.d.ts +9 -0
- package/dist/search/cloudflare.d.ts.map +1 -0
- package/dist/search/cloudflare.js +115 -0
- package/dist/search/local.d.ts +9 -0
- package/dist/search/local.d.ts.map +1 -0
- package/dist/search/local.js +122 -0
- package/dist/search/runtime.d.ts +41 -0
- package/dist/search/runtime.d.ts.map +1 -0
- package/dist/search/runtime.js +151 -0
- package/dist/search/types.d.ts +172 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +1 -0
- package/dist/search/typesense.d.ts +11 -0
- package/dist/search/typesense.d.ts.map +1 -0
- package/dist/search/typesense.js +91 -0
- package/dist/search/utils.d.ts +10 -0
- package/dist/search/utils.d.ts.map +1 -0
- package/dist/search/utils.js +55 -0
- package/dist/search.d.ts +8 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +7 -0
- package/dist/svelte.d.ts +24 -0
- package/dist/svelte.d.ts.map +1 -0
- package/dist/svelte.js +51 -0
- package/dist/testing.d.ts +3 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +23 -0
- package/dist/theme/AskAiPanel.svelte +433 -0
- package/dist/theme/AskAiPanel.svelte.d.ts +27 -0
- package/dist/theme/AskAiPanel.svelte.d.ts.map +1 -0
- package/dist/theme/Button.svelte +34 -0
- package/dist/theme/Button.svelte.d.ts +41 -0
- package/dist/theme/Button.svelte.d.ts.map +1 -0
- package/dist/theme/Checkbox.svelte +63 -0
- package/dist/theme/Checkbox.svelte.d.ts +45 -0
- package/dist/theme/Checkbox.svelte.d.ts.map +1 -0
- package/dist/theme/CodeBlock.svelte +6 -0
- package/dist/theme/CodeBlock.svelte.d.ts +22 -0
- package/dist/theme/CodeBlock.svelte.d.ts.map +1 -0
- package/dist/theme/DocPage.svelte +121 -0
- package/dist/theme/DocPage.svelte.d.ts +33 -0
- package/dist/theme/DocPage.svelte.d.ts.map +1 -0
- package/dist/theme/DocsApp.svelte +78 -0
- package/dist/theme/DocsApp.svelte.d.ts +63 -0
- package/dist/theme/DocsApp.svelte.d.ts.map +1 -0
- package/dist/theme/DocsLayout.svelte +167 -0
- package/dist/theme/DocsLayout.svelte.d.ts +40 -0
- package/dist/theme/DocsLayout.svelte.d.ts.map +1 -0
- package/dist/theme/FloatingToolbar.svelte +73 -0
- package/dist/theme/FloatingToolbar.svelte.d.ts +22 -0
- package/dist/theme/FloatingToolbar.svelte.d.ts.map +1 -0
- package/dist/theme/FormField.svelte +41 -0
- package/dist/theme/FormField.svelte.d.ts +35 -0
- package/dist/theme/FormField.svelte.d.ts.map +1 -0
- package/dist/theme/HomePage.svelte +228 -0
- package/dist/theme/HomePage.svelte.d.ts +58 -0
- package/dist/theme/HomePage.svelte.d.ts.map +1 -0
- package/dist/theme/Input.svelte +36 -0
- package/dist/theme/Input.svelte.d.ts +34 -0
- package/dist/theme/Input.svelte.d.ts.map +1 -0
- package/dist/theme/PageLayout.svelte +36 -0
- package/dist/theme/PageLayout.svelte.d.ts +31 -0
- package/dist/theme/PageLayout.svelte.d.ts.map +1 -0
- package/dist/theme/RootLayout.svelte +330 -0
- package/dist/theme/RootLayout.svelte.d.ts +40 -0
- package/dist/theme/RootLayout.svelte.d.ts.map +1 -0
- package/dist/theme/ScopeSwitcher.svelte +103 -0
- package/dist/theme/ScopeSwitcher.svelte.d.ts +24 -0
- package/dist/theme/ScopeSwitcher.svelte.d.ts.map +1 -0
- package/dist/theme/SearchDialog.svelte +253 -0
- package/dist/theme/SearchDialog.svelte.d.ts +28 -0
- package/dist/theme/SearchDialog.svelte.d.ts.map +1 -0
- package/dist/theme/Select.svelte +37 -0
- package/dist/theme/Select.svelte.d.ts +42 -0
- package/dist/theme/Select.svelte.d.ts.map +1 -0
- package/dist/theme/SidebarTree.svelte +136 -0
- package/dist/theme/SidebarTree.svelte.d.ts +24 -0
- package/dist/theme/SidebarTree.svelte.d.ts.map +1 -0
- package/dist/theme/Textarea.svelte +33 -0
- package/dist/theme/Textarea.svelte.d.ts +33 -0
- package/dist/theme/Textarea.svelte.d.ts.map +1 -0
- package/dist/theme/ThemeToggle.svelte +39 -0
- package/dist/theme/ThemeToggle.svelte.d.ts +21 -0
- package/dist/theme/ThemeToggle.svelte.d.ts.map +1 -0
- package/dist/theme/forms.d.ts +4 -0
- package/dist/theme/forms.d.ts.map +1 -0
- package/dist/theme/forms.js +3 -0
- package/dist/theme/index.d.ts +21 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +19 -0
- package/dist/theme/portal.d.ts +5 -0
- package/dist/theme/portal.d.ts.map +1 -0
- package/dist/theme/portal.js +19 -0
- package/dist/theme/styles.css +3697 -0
- package/dist/virtual.d.ts +59 -0
- package/dist/vite.d.ts +10 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +304 -0
- package/package.json +118 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createCloudflareAiSearchAiProvider, createMockAiProvider, createWorkersAiProvider } from './providers.js';
|
|
2
|
+
import { createAskResponse } from './response.js';
|
|
3
|
+
import { createOpenAiCompatibleProvider } from './openai-compatible.js';
|
|
4
|
+
export function createConfiguredAiProvider(options) {
|
|
5
|
+
const provider = normalizeProviderName(options.provider ?? options.config.ai.provider);
|
|
6
|
+
if (!options.config.ai.enabled)
|
|
7
|
+
return createMockAiProvider();
|
|
8
|
+
const systemPrompt = options.config.ai.systemPrompt;
|
|
9
|
+
const maxResults = options.config.ai.maxResults;
|
|
10
|
+
if (provider === 'cloudflare-workers-ai') {
|
|
11
|
+
const ai = readWorkersAiBinding(options.env);
|
|
12
|
+
if (ai)
|
|
13
|
+
return createWorkersAiProvider({
|
|
14
|
+
ai,
|
|
15
|
+
...(systemPrompt ? { systemPrompt } : {}),
|
|
16
|
+
...(typeof maxResults === 'number' ? { citationLimit: maxResults } : {})
|
|
17
|
+
});
|
|
18
|
+
return createMockAiProvider();
|
|
19
|
+
}
|
|
20
|
+
if (provider === 'cloudflare-ai-search') {
|
|
21
|
+
const binding = readCloudflareAiSearchBinding(options.env, options.config);
|
|
22
|
+
if (binding) {
|
|
23
|
+
return createCloudflareAiSearchAiProvider({
|
|
24
|
+
binding,
|
|
25
|
+
instanceName: options.config.cloudflare.aiSearch.instanceName,
|
|
26
|
+
...(systemPrompt ? { systemPrompt } : {}),
|
|
27
|
+
...(typeof maxResults === 'number' ? { maxResults } : {})
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return createMockAiProvider();
|
|
31
|
+
}
|
|
32
|
+
if (provider === 'openai-compatible') {
|
|
33
|
+
const apiKey = readFirstEnv(options.env, ['SVEDOCS_OPENAI_COMPATIBLE_API_KEY', 'OPENAI_COMPATIBLE_API_KEY']);
|
|
34
|
+
const baseUrl = readFirstEnv(options.env, ['SVEDOCS_OPENAI_COMPATIBLE_BASE_URL', 'OPENAI_COMPATIBLE_BASE_URL']);
|
|
35
|
+
const model = readFirstEnv(options.env, ['SVEDOCS_OPENAI_COMPATIBLE_MODEL', 'OPENAI_COMPATIBLE_MODEL']);
|
|
36
|
+
const temperature = readNumberEnv(options.env, ['SVEDOCS_OPENAI_COMPATIBLE_TEMPERATURE', 'OPENAI_COMPATIBLE_TEMPERATURE']);
|
|
37
|
+
if (apiKey && model) {
|
|
38
|
+
return createOpenAiCompatibleProvider({
|
|
39
|
+
apiKey,
|
|
40
|
+
model,
|
|
41
|
+
...(baseUrl ? { baseUrl } : {}),
|
|
42
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
43
|
+
...(systemPrompt ? { systemPrompt } : {}),
|
|
44
|
+
...(options.fetch ? { fetch: options.fetch } : {})
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return createMockAiProvider();
|
|
48
|
+
}
|
|
49
|
+
return createMockAiProvider();
|
|
50
|
+
}
|
|
51
|
+
export function createConfiguredAskResponse(config, records, request, options = {}) {
|
|
52
|
+
const provider = createConfiguredAiProvider({
|
|
53
|
+
config,
|
|
54
|
+
...(options.provider ? { provider: options.provider } : {}),
|
|
55
|
+
...(options.env ? { env: options.env } : {}),
|
|
56
|
+
...(options.fetch ? { fetch: options.fetch } : {})
|
|
57
|
+
});
|
|
58
|
+
return createAskResponse(provider, request, {
|
|
59
|
+
records,
|
|
60
|
+
...(typeof options.stream === 'boolean' ? { stream: options.stream } : {}),
|
|
61
|
+
...(options.scope ? { scope: options.scope } : {}),
|
|
62
|
+
...(options.rateLimiter ? { rateLimiter: options.rateLimiter } : {}),
|
|
63
|
+
...(options.rateLimitKey ? { rateLimitKey: options.rateLimitKey } : {})
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function readCloudflareAiSearchBinding(env, config) {
|
|
67
|
+
const bindingName = config.cloudflare.aiSearch.binding;
|
|
68
|
+
const dynamicBinding = env?.[bindingName];
|
|
69
|
+
if (isCloudflareAiSearchBinding(dynamicBinding))
|
|
70
|
+
return dynamicBinding;
|
|
71
|
+
if (isCloudflareAiSearchBinding(env?.SVEDOCS_AI_SEARCH))
|
|
72
|
+
return env.SVEDOCS_AI_SEARCH;
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
function readWorkersAiBinding(env) {
|
|
76
|
+
return isWorkersAiBinding(env?.AI) ? env.AI : undefined;
|
|
77
|
+
}
|
|
78
|
+
function isCloudflareAiSearchBinding(value) {
|
|
79
|
+
if (!value || typeof value !== 'object')
|
|
80
|
+
return false;
|
|
81
|
+
return 'search' in value || 'get' in value;
|
|
82
|
+
}
|
|
83
|
+
function isWorkersAiBinding(value) {
|
|
84
|
+
if (!value || typeof value !== 'object')
|
|
85
|
+
return false;
|
|
86
|
+
return 'run' in value && typeof value.run === 'function';
|
|
87
|
+
}
|
|
88
|
+
function readFirstEnv(env, keys) {
|
|
89
|
+
for (const key of keys) {
|
|
90
|
+
const value = env?.[key];
|
|
91
|
+
if (typeof value === 'string' && value.trim())
|
|
92
|
+
return value.trim();
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
function readNumberEnv(env, keys) {
|
|
97
|
+
const value = readFirstEnv(env, keys);
|
|
98
|
+
if (!value)
|
|
99
|
+
return undefined;
|
|
100
|
+
const parsed = Number(value);
|
|
101
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
102
|
+
}
|
|
103
|
+
function normalizeProviderName(provider) {
|
|
104
|
+
return provider?.trim().toLowerCase() || 'mock';
|
|
105
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { SvedocsSearchRecord } from '../core.js';
|
|
2
|
+
import type { CloudflareAiSearchChatOutput, CloudflareAiSearchInput, CloudflareAiSearchInstance, CloudflareAiSearchNamespace, SearchScope } from '../search.js';
|
|
3
|
+
export interface AiProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
ask(input: AskInput): Promise<AskResult> | AskResult;
|
|
6
|
+
stream?(input: AskInput): Promise<Response | ReadableStream<Uint8Array>> | Response | ReadableStream<Uint8Array>;
|
|
7
|
+
}
|
|
8
|
+
export interface AskCitation {
|
|
9
|
+
title: string;
|
|
10
|
+
url: string;
|
|
11
|
+
section?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ChatMessage {
|
|
14
|
+
role: 'user' | 'assistant';
|
|
15
|
+
content: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AskInput {
|
|
18
|
+
question: string;
|
|
19
|
+
messages?: ChatMessage[];
|
|
20
|
+
systemPrompt?: string;
|
|
21
|
+
context?: string[];
|
|
22
|
+
records?: SvedocsSearchRecord[];
|
|
23
|
+
scope?: SearchScope;
|
|
24
|
+
maxResults?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface AskResult {
|
|
27
|
+
answer: string;
|
|
28
|
+
citations: AskCitation[];
|
|
29
|
+
}
|
|
30
|
+
export interface AiRateLimitResult {
|
|
31
|
+
allowed: boolean;
|
|
32
|
+
retryAfter?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface AiRateLimiter {
|
|
35
|
+
check(input: {
|
|
36
|
+
key: string;
|
|
37
|
+
request: Request;
|
|
38
|
+
}): AiRateLimitResult | Promise<AiRateLimitResult>;
|
|
39
|
+
}
|
|
40
|
+
export interface AiRateLimitStore {
|
|
41
|
+
get(key: string): Promise<{
|
|
42
|
+
count: number;
|
|
43
|
+
resetAt: number;
|
|
44
|
+
} | undefined>;
|
|
45
|
+
put(key: string, value: {
|
|
46
|
+
count: number;
|
|
47
|
+
resetAt: number;
|
|
48
|
+
}, ttlSeconds: number): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
export interface CreateAskResponseOptions {
|
|
51
|
+
records?: SvedocsSearchRecord[];
|
|
52
|
+
stream?: boolean;
|
|
53
|
+
scope?: SearchScope | ((request: Request) => SearchScope);
|
|
54
|
+
rateLimiter?: AiRateLimiter;
|
|
55
|
+
rateLimitKey?: string | ((request: Request) => string);
|
|
56
|
+
systemPrompt?: string;
|
|
57
|
+
maxResults?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface CloudflareAiChatInstance extends CloudflareAiSearchInstance {
|
|
60
|
+
chatCompletions?(input: {
|
|
61
|
+
messages: Array<{
|
|
62
|
+
role: 'system' | 'developer' | 'user' | 'assistant' | 'tool';
|
|
63
|
+
content: string;
|
|
64
|
+
}>;
|
|
65
|
+
model?: string;
|
|
66
|
+
stream?: boolean;
|
|
67
|
+
ai_search_options?: CloudflareAiSearchInput['ai_search_options'];
|
|
68
|
+
}): Promise<CloudflareAiSearchChatOutput | Response | ReadableStream<Uint8Array>>;
|
|
69
|
+
}
|
|
70
|
+
export interface CloudflareWorkersAiBinding {
|
|
71
|
+
run(model: string, input: {
|
|
72
|
+
messages?: Array<{
|
|
73
|
+
role: 'system' | 'user' | 'assistant';
|
|
74
|
+
content: string;
|
|
75
|
+
}>;
|
|
76
|
+
prompt?: string;
|
|
77
|
+
stream?: boolean;
|
|
78
|
+
}): Promise<string | {
|
|
79
|
+
response?: string;
|
|
80
|
+
answer?: string;
|
|
81
|
+
result?: string;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
export interface CloudflareKvNamespace {
|
|
85
|
+
get<T = unknown>(key: string, options?: {
|
|
86
|
+
type?: 'json';
|
|
87
|
+
}): Promise<T | null>;
|
|
88
|
+
put(key: string, value: string, options?: {
|
|
89
|
+
expirationTtl?: number;
|
|
90
|
+
}): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
export type AiSearchBinding = CloudflareAiChatInstance | CloudflareAiSearchNamespace;
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/ai.d.ts
ADDED
package/dist/ai.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
|
package/dist/ai.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SvedocsResolvedConfig } from './core.js';
|
|
2
|
+
export type SvedocsBuildMode = 'edge' | 'static' | 'spa';
|
|
3
|
+
export type SvedocsPagePrerenderOption = true | false | 'auto';
|
|
4
|
+
export interface CloudflareBindingShape {
|
|
5
|
+
AI?: unknown;
|
|
6
|
+
SVEDOCS_AI_SEARCH?: unknown;
|
|
7
|
+
SVEDOCS_ASSETS?: unknown;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
export interface CloudflareBuildPreset {
|
|
11
|
+
mode: SvedocsBuildMode;
|
|
12
|
+
adapter: '@sveltejs/adapter-cloudflare' | '@sveltejs/adapter-static';
|
|
13
|
+
output: string;
|
|
14
|
+
recommended: boolean;
|
|
15
|
+
warning?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function createCloudflarePreset(mode?: SvedocsBuildMode): CloudflareBuildPreset;
|
|
18
|
+
export declare function readSvedocsBuildMode(value?: string | undefined): SvedocsBuildMode;
|
|
19
|
+
export declare function svedocsSsr(mode?: SvedocsBuildMode): boolean;
|
|
20
|
+
export declare function svedocsPagePrerender(mode?: SvedocsBuildMode): SvedocsPagePrerenderOption;
|
|
21
|
+
export declare function createWranglerJson(config: SvedocsResolvedConfig): Record<string, unknown>;
|
|
22
|
+
export declare function createWranglerJsonc(config: SvedocsResolvedConfig): string;
|
|
23
|
+
export declare function createWranglerToml(config: SvedocsResolvedConfig): string;
|
|
24
|
+
export declare function createCloudflareEnvDts(config: SvedocsResolvedConfig): string;
|
|
25
|
+
export declare function usesCloudflareAiSearch(config: SvedocsResolvedConfig): boolean;
|
|
26
|
+
export declare function usesCloudflareWorkersAi(config: SvedocsResolvedConfig): boolean;
|
|
27
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AACzD,MAAM,MAAM,0BAA0B,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,8BAA8B,GAAG,0BAA0B,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,gBAAyB,GAAG,qBAAqB,CAwB7F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,qBAA4B,GAAG,gBAAgB,CAExF;AAED,wBAAgB,UAAU,CAAC,IAAI,mBAAyB,GAAG,OAAO,CAEjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,mBAAyB,GAAG,0BAA0B,CAG9F;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkCzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAgCxE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAe5E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAG7E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAE9E"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
export function createCloudflarePreset(mode = 'edge') {
|
|
2
|
+
if (mode === 'edge') {
|
|
3
|
+
return {
|
|
4
|
+
mode,
|
|
5
|
+
adapter: '@sveltejs/adapter-cloudflare',
|
|
6
|
+
output: '.svelte-kit/cloudflare',
|
|
7
|
+
recommended: true
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
if (mode === 'static') {
|
|
11
|
+
return {
|
|
12
|
+
mode,
|
|
13
|
+
adapter: '@sveltejs/adapter-static',
|
|
14
|
+
output: 'build',
|
|
15
|
+
recommended: true
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
mode,
|
|
20
|
+
adapter: '@sveltejs/adapter-static',
|
|
21
|
+
output: 'build',
|
|
22
|
+
recommended: false,
|
|
23
|
+
warning: 'SPA mode prerenders known pages and writes a static fallback; edge SSR or full SSG is recommended when available.'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function readSvedocsBuildMode(value = readSvedocsBuildModeEnv()) {
|
|
27
|
+
return value === 'static' || value === 'spa' || value === 'edge' ? value : 'edge';
|
|
28
|
+
}
|
|
29
|
+
export function svedocsSsr(mode = readSvedocsBuildMode()) {
|
|
30
|
+
return mode === 'edge' || mode === 'static' || mode === 'spa';
|
|
31
|
+
}
|
|
32
|
+
export function svedocsPagePrerender(mode = readSvedocsBuildMode()) {
|
|
33
|
+
if (mode === 'static' || mode === 'spa')
|
|
34
|
+
return true;
|
|
35
|
+
return 'auto';
|
|
36
|
+
}
|
|
37
|
+
function readSvedocsBuildModeEnv() {
|
|
38
|
+
return typeof process !== 'undefined' ? process.env.SVEDOCS_BUILD_MODE : undefined;
|
|
39
|
+
}
|
|
40
|
+
export function createWranglerJson(config) {
|
|
41
|
+
const wrangler = {
|
|
42
|
+
$schema: 'node_modules/wrangler/config-schema.json',
|
|
43
|
+
name: config.site.name,
|
|
44
|
+
compatibility_date: config.cloudflare.compatibilityDate,
|
|
45
|
+
pages_build_output_dir: createCloudflarePreset(config.build.mode).output
|
|
46
|
+
};
|
|
47
|
+
if (usesCloudflareAiSearch(config)) {
|
|
48
|
+
const aiSearchBinding = {
|
|
49
|
+
binding: config.cloudflare.aiSearch.binding,
|
|
50
|
+
remote: config.cloudflare.aiSearch.remote
|
|
51
|
+
};
|
|
52
|
+
if (config.cloudflare.aiSearch.namespace) {
|
|
53
|
+
wrangler.ai_search_namespaces = [
|
|
54
|
+
{
|
|
55
|
+
...aiSearchBinding,
|
|
56
|
+
namespace: config.cloudflare.aiSearch.namespace
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
wrangler.ai_search = [
|
|
62
|
+
{
|
|
63
|
+
...aiSearchBinding,
|
|
64
|
+
instance_name: config.cloudflare.aiSearch.instanceName
|
|
65
|
+
}
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (usesCloudflareWorkersAi(config)) {
|
|
70
|
+
wrangler.ai = {
|
|
71
|
+
binding: 'AI'
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return wrangler;
|
|
75
|
+
}
|
|
76
|
+
export function createWranglerJsonc(config) {
|
|
77
|
+
return `${JSON.stringify(createWranglerJson(config), null, 2)}\n`;
|
|
78
|
+
}
|
|
79
|
+
export function createWranglerToml(config) {
|
|
80
|
+
const lines = [
|
|
81
|
+
`name = ${tomlString(config.site.name)}`,
|
|
82
|
+
`compatibility_date = ${tomlString(config.cloudflare.compatibilityDate)}`,
|
|
83
|
+
`pages_build_output_dir = ${tomlString(createCloudflarePreset(config.build.mode).output)}`
|
|
84
|
+
];
|
|
85
|
+
if (usesCloudflareAiSearch(config)) {
|
|
86
|
+
lines.push('');
|
|
87
|
+
if (config.cloudflare.aiSearch.namespace) {
|
|
88
|
+
lines.push('[[ai_search_namespaces]]', `binding = ${tomlString(config.cloudflare.aiSearch.binding)}`, `namespace = ${tomlString(config.cloudflare.aiSearch.namespace)}`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
lines.push('[[ai_search]]', `binding = ${tomlString(config.cloudflare.aiSearch.binding)}`, `instance_name = ${tomlString(config.cloudflare.aiSearch.instanceName)}`);
|
|
92
|
+
}
|
|
93
|
+
if (config.cloudflare.aiSearch.remote) {
|
|
94
|
+
lines.push('remote = true');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (usesCloudflareWorkersAi(config)) {
|
|
98
|
+
lines.push('', '[ai]', 'binding = "AI"');
|
|
99
|
+
}
|
|
100
|
+
return `${lines.join('\n')}\n`;
|
|
101
|
+
}
|
|
102
|
+
export function createCloudflareEnvDts(config) {
|
|
103
|
+
const lines = [
|
|
104
|
+
'declare namespace App {',
|
|
105
|
+
' interface Platform {',
|
|
106
|
+
' env: {',
|
|
107
|
+
...createCloudflareBindingLines(config),
|
|
108
|
+
' };',
|
|
109
|
+
' context: {',
|
|
110
|
+
' waitUntil(promise: Promise<unknown>): void;',
|
|
111
|
+
' };',
|
|
112
|
+
' caches: CacheStorage;',
|
|
113
|
+
' }',
|
|
114
|
+
'}'
|
|
115
|
+
];
|
|
116
|
+
return `${lines.join('\n')}\n`;
|
|
117
|
+
}
|
|
118
|
+
export function usesCloudflareAiSearch(config) {
|
|
119
|
+
return (config.search.enabled && config.search.provider === 'cloudflare-ai-search')
|
|
120
|
+
|| (config.ai.enabled && config.ai.provider === 'cloudflare-ai-search');
|
|
121
|
+
}
|
|
122
|
+
export function usesCloudflareWorkersAi(config) {
|
|
123
|
+
return config.ai.enabled && config.ai.provider === 'cloudflare-workers-ai';
|
|
124
|
+
}
|
|
125
|
+
function createCloudflareBindingLines(config) {
|
|
126
|
+
const bindings = new Map();
|
|
127
|
+
if (usesCloudflareAiSearch(config)) {
|
|
128
|
+
addBindingType(bindings, config.cloudflare.aiSearch.binding, config.cloudflare.aiSearch.namespace
|
|
129
|
+
? `import('svedocs/search').CloudflareAiSearchNamespace`
|
|
130
|
+
: `import('svedocs/search').CloudflareAiSearchInstance`);
|
|
131
|
+
}
|
|
132
|
+
if (usesCloudflareWorkersAi(config)) {
|
|
133
|
+
addBindingType(bindings, 'AI', `import('svedocs/ai').CloudflareWorkersAiBinding`);
|
|
134
|
+
}
|
|
135
|
+
const lines = Array.from(bindings.entries()).map(([name, types]) => ` ${formatBindingProperty(name)}: ${types.join(' & ')};`);
|
|
136
|
+
return lines.length > 0 ? lines : [' [key: string]: unknown;'];
|
|
137
|
+
}
|
|
138
|
+
function addBindingType(bindings, name, type) {
|
|
139
|
+
bindings.set(name, [...(bindings.get(name) ?? []), type]);
|
|
140
|
+
}
|
|
141
|
+
function formatBindingProperty(name) {
|
|
142
|
+
return /^[A-Za-z_$][\w$]*$/.test(name) ? name : JSON.stringify(name);
|
|
143
|
+
}
|
|
144
|
+
function tomlString(value) {
|
|
145
|
+
return JSON.stringify(value);
|
|
146
|
+
}
|