svedocs 0.1.0-beta.10
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 +85 -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 +20 -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 +32 -0
- package/dist/ai/runtime.d.ts.map +1 -0
- package/dist/ai/runtime.js +111 -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 +29 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +149 -0
- package/dist/config.d.ts +373 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +299 -0
- package/dist/core/checks.d.ts +4 -0
- package/dist/core/checks.d.ts.map +1 -0
- package/dist/core/checks.js +267 -0
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +178 -0
- package/dist/core/content.d.ts +7 -0
- package/dist/core/content.d.ts.map +1 -0
- package/dist/core/content.js +340 -0
- package/dist/core/i18n.d.ts +5 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/i18n.js +117 -0
- package/dist/core/links.d.ts +5 -0
- package/dist/core/links.d.ts.map +1 -0
- package/dist/core/links.js +60 -0
- package/dist/core/messages.d.ts +149 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +163 -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/routes.d.ts +36 -0
- package/dist/core/routes.d.ts.map +1 -0
- package/dist/core/routes.js +152 -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 +468 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/utils.d.ts +13 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +60 -0
- package/dist/core.d.ts +9 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +8 -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 +17 -0
- package/dist/mdx/code.d.ts.map +1 -0
- package/dist/mdx/code.js +327 -0
- package/dist/mdx/compile.d.ts +29 -0
- package/dist/mdx/compile.d.ts.map +1 -0
- package/dist/mdx/compile.js +59 -0
- package/dist/mdx/diff.d.ts +9 -0
- package/dist/mdx/diff.d.ts.map +1 -0
- package/dist/mdx/diff.js +171 -0
- package/dist/mdx/headings.d.ts +4 -0
- package/dist/mdx/headings.d.ts.map +1 -0
- package/dist/mdx/headings.js +42 -0
- package/dist/mdx/links.d.ts +4 -0
- package/dist/mdx/links.d.ts.map +1 -0
- package/dist/mdx/links.js +144 -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 +25 -0
- package/dist/og/image.d.ts.map +1 -0
- package/dist/og/image.js +224 -0
- package/dist/og/metadata.d.ts +7 -0
- package/dist/og/metadata.d.ts.map +1 -0
- package/dist/og/metadata.js +198 -0
- package/dist/og/response.d.ts +4 -0
- package/dist/og/response.d.ts.map +1 -0
- package/dist/og/response.js +49 -0
- package/dist/og/rss.d.ts +4 -0
- package/dist/og/rss.d.ts.map +1 -0
- package/dist/og/rss.js +96 -0
- package/dist/og/sitemap.d.ts +7 -0
- package/dist/og/sitemap.d.ts.map +1 -0
- package/dist/og/sitemap.js +90 -0
- package/dist/og/types.d.ts +65 -0
- package/dist/og/types.d.ts.map +1 -0
- package/dist/og/types.js +1 -0
- package/dist/og.d.ts +6 -0
- package/dist/og.d.ts.map +1 -0
- package/dist/og.js +5 -0
- package/dist/routes.d.ts +2 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +1 -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 +11 -0
- package/dist/search/cloudflare.d.ts.map +1 -0
- package/dist/search/cloudflare.js +126 -0
- package/dist/search/local.d.ts +9 -0
- package/dist/search/local.d.ts.map +1 -0
- package/dist/search/local.js +165 -0
- package/dist/search/runtime.d.ts +41 -0
- package/dist/search/runtime.d.ts.map +1 -0
- package/dist/search/runtime.js +152 -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 +11 -0
- package/dist/search/utils.d.ts.map +1 -0
- package/dist/search/utils.js +93 -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 +27 -0
- package/dist/svelte.d.ts.map +1 -0
- package/dist/svelte.js +45 -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/Article.svelte +145 -0
- package/dist/theme/Article.svelte.d.ts +36 -0
- package/dist/theme/Article.svelte.d.ts.map +1 -0
- package/dist/theme/AskAiPanel.svelte +241 -0
- package/dist/theme/AskAiPanel.svelte.d.ts +31 -0
- package/dist/theme/AskAiPanel.svelte.d.ts.map +1 -0
- package/dist/theme/Brand.svelte +19 -0
- package/dist/theme/Brand.svelte.d.ts +22 -0
- package/dist/theme/Brand.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 +15 -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 +194 -0
- package/dist/theme/DocsApp.svelte.d.ts +60 -0
- package/dist/theme/DocsApp.svelte.d.ts.map +1 -0
- package/dist/theme/DocsLayout.svelte +99 -0
- package/dist/theme/DocsLayout.svelte.d.ts +39 -0
- package/dist/theme/DocsLayout.svelte.d.ts.map +1 -0
- package/dist/theme/DocsShell.svelte +91 -0
- package/dist/theme/DocsShell.svelte.d.ts +34 -0
- package/dist/theme/DocsShell.svelte.d.ts.map +1 -0
- package/dist/theme/ErrorPage.svelte +113 -0
- package/dist/theme/ErrorPage.svelte.d.ts +34 -0
- package/dist/theme/ErrorPage.svelte.d.ts.map +1 -0
- package/dist/theme/FloatingToolbar.svelte +8 -0
- package/dist/theme/FloatingToolbar.svelte.d.ts +22 -0
- package/dist/theme/FloatingToolbar.svelte.d.ts.map +1 -0
- package/dist/theme/Footer.svelte +18 -0
- package/dist/theme/Footer.svelte.d.ts +24 -0
- package/dist/theme/Footer.svelte.d.ts.map +1 -0
- package/dist/theme/FooterLinks.svelte +37 -0
- package/dist/theme/FooterLinks.svelte.d.ts +22 -0
- package/dist/theme/FooterLinks.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 +284 -0
- package/dist/theme/HomePage.svelte.d.ts +65 -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/LayoutShell.svelte +120 -0
- package/dist/theme/LayoutShell.svelte.d.ts +43 -0
- package/dist/theme/LayoutShell.svelte.d.ts.map +1 -0
- package/dist/theme/LocalizedLink.svelte +21 -0
- package/dist/theme/LocalizedLink.svelte.d.ts +38 -0
- package/dist/theme/LocalizedLink.svelte.d.ts.map +1 -0
- package/dist/theme/MobileNav.svelte +20 -0
- package/dist/theme/MobileNav.svelte.d.ts +26 -0
- package/dist/theme/MobileNav.svelte.d.ts.map +1 -0
- package/dist/theme/Navbar.svelte +69 -0
- package/dist/theme/Navbar.svelte.d.ts +29 -0
- package/dist/theme/Navbar.svelte.d.ts.map +1 -0
- package/dist/theme/PageLayout.svelte +49 -0
- package/dist/theme/PageLayout.svelte.d.ts +34 -0
- package/dist/theme/PageLayout.svelte.d.ts.map +1 -0
- package/dist/theme/PageShell.svelte +98 -0
- package/dist/theme/PageShell.svelte.d.ts +35 -0
- package/dist/theme/PageShell.svelte.d.ts.map +1 -0
- package/dist/theme/PageTools.svelte +87 -0
- package/dist/theme/PageTools.svelte.d.ts +25 -0
- package/dist/theme/PageTools.svelte.d.ts.map +1 -0
- package/dist/theme/RenderError.svelte +62 -0
- package/dist/theme/RenderError.svelte.d.ts +31 -0
- package/dist/theme/RenderError.svelte.d.ts.map +1 -0
- package/dist/theme/RootLayout.svelte +274 -0
- package/dist/theme/RootLayout.svelte.d.ts +47 -0
- package/dist/theme/RootLayout.svelte.d.ts.map +1 -0
- package/dist/theme/RouteRenderError.svelte +53 -0
- package/dist/theme/RouteRenderError.svelte.d.ts +34 -0
- package/dist/theme/RouteRenderError.svelte.d.ts.map +1 -0
- package/dist/theme/SafeRenderError.svelte +49 -0
- package/dist/theme/SafeRenderError.svelte.d.ts +33 -0
- package/dist/theme/SafeRenderError.svelte.d.ts.map +1 -0
- package/dist/theme/ScopeSwitcher.svelte +107 -0
- package/dist/theme/ScopeSwitcher.svelte.d.ts +26 -0
- package/dist/theme/ScopeSwitcher.svelte.d.ts.map +1 -0
- package/dist/theme/SearchDialog.svelte +200 -0
- package/dist/theme/SearchDialog.svelte.d.ts +31 -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 +148 -0
- package/dist/theme/SidebarTree.svelte.d.ts +24 -0
- package/dist/theme/SidebarTree.svelte.d.ts.map +1 -0
- package/dist/theme/SocialNav.svelte +17 -0
- package/dist/theme/SocialNav.svelte.d.ts +22 -0
- package/dist/theme/SocialNav.svelte.d.ts.map +1 -0
- package/dist/theme/TableOfContents.svelte +73 -0
- package/dist/theme/TableOfContents.svelte.d.ts +25 -0
- package/dist/theme/TableOfContents.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/ThemeInit.svelte +16 -0
- package/dist/theme/ThemeInit.svelte.d.ts +23 -0
- package/dist/theme/ThemeInit.svelte.d.ts.map +1 -0
- package/dist/theme/ThemeToggle.svelte +37 -0
- package/dist/theme/ThemeToggle.svelte.d.ts +23 -0
- package/dist/theme/ThemeToggle.svelte.d.ts.map +1 -0
- package/dist/theme/TopNav.svelte +23 -0
- package/dist/theme/TopNav.svelte.d.ts +22 -0
- package/dist/theme/TopNav.svelte.d.ts.map +1 -0
- package/dist/theme/base.css +240 -0
- package/dist/theme/defaults.d.ts +4 -0
- package/dist/theme/defaults.d.ts.map +1 -0
- package/dist/theme/defaults.js +55 -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/headless.d.ts +62 -0
- package/dist/theme/headless.d.ts.map +1 -0
- package/dist/theme/headless.js +1064 -0
- package/dist/theme/index.d.ts +41 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +38 -0
- package/dist/theme/portal.d.ts +6 -0
- package/dist/theme/portal.d.ts.map +1 -0
- package/dist/theme/portal.js +59 -0
- package/dist/theme/styles.css +4232 -0
- package/dist/theme/types.d.ts +363 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +1 -0
- package/dist/virtual.d.ts +65 -0
- package/dist/vite.d.ts +16 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +386 -0
- package/package.json +132 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+IR,CAAC;AAE5B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAYzE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAC7C,eAAe,CAKjB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export const defaultSvedocsMessages = {
|
|
2
|
+
'nav.primary': 'Primary',
|
|
3
|
+
'nav.docs': 'Docs',
|
|
4
|
+
'nav.configuration': 'Configuration',
|
|
5
|
+
'nav.api': 'API',
|
|
6
|
+
'nav.documentation': 'Documentation',
|
|
7
|
+
'nav.footer': 'Footer',
|
|
8
|
+
'nav.social': 'Social links',
|
|
9
|
+
'nav.mobile.open': 'Open menu',
|
|
10
|
+
'nav.mobile.close': 'Close menu',
|
|
11
|
+
'nav.skipToContent': 'Skip to content',
|
|
12
|
+
'scope.group': 'Documentation scope',
|
|
13
|
+
'scope.locale': 'Locale',
|
|
14
|
+
'scope.localeOptions': 'Locale options',
|
|
15
|
+
'scope.langShort': 'Lang',
|
|
16
|
+
'search.trigger': 'Search',
|
|
17
|
+
'search.dialog': 'Search documentation',
|
|
18
|
+
'search.query': 'Search query',
|
|
19
|
+
'search.placeholder': 'Search docs',
|
|
20
|
+
'search.results': 'Search results',
|
|
21
|
+
'search.loading': 'Searching...',
|
|
22
|
+
'search.loadingIndex': 'Loading search index...',
|
|
23
|
+
'search.indexError': 'Search index could not be loaded.',
|
|
24
|
+
'search.remoteFallback': '{error} Showing local results.',
|
|
25
|
+
'search.empty': 'No matching docs yet.',
|
|
26
|
+
'search.fetchUnavailable': 'Fetch is not available.',
|
|
27
|
+
'search.requestError': 'Search returned {status}.',
|
|
28
|
+
'search.failed': 'Search failed.',
|
|
29
|
+
'ask.label': 'Ask AI',
|
|
30
|
+
'ask.placeholder': 'Ask about the docs',
|
|
31
|
+
'ask.welcome': '',
|
|
32
|
+
'ask.empty': 'Ask anything about these docs.',
|
|
33
|
+
'ask.newChat': 'New chat',
|
|
34
|
+
'ask.close': 'Close',
|
|
35
|
+
'ask.thinking': 'Thinking',
|
|
36
|
+
'ask.send': 'Send',
|
|
37
|
+
'ask.suggestion.1': '',
|
|
38
|
+
'ask.suggestion.2': '',
|
|
39
|
+
'ask.suggestion.3': '',
|
|
40
|
+
'ask.fetchUnavailable': 'Fetch is not available.',
|
|
41
|
+
'ask.requestError': 'Ask AI returned {status}.',
|
|
42
|
+
'ask.failed': 'Ask AI failed.',
|
|
43
|
+
'ask.streamUnreadable': 'Ask AI returned an unreadable stream event.',
|
|
44
|
+
'ask.localSource': 'I found 1 relevant source in this documentation.',
|
|
45
|
+
'ask.localSources': 'I found {count} relevant sources in this documentation.',
|
|
46
|
+
'ask.localEmpty': 'I could not find a matching local source for that question.',
|
|
47
|
+
'ask.fallbackSource': 'I found 1 relevant source. Connect the {provider} provider to replace this local draft with a hosted Ask AI response.',
|
|
48
|
+
'ask.fallbackSources': 'I found {count} relevant sources. Connect the {provider} provider to replace this local draft with a hosted Ask AI response.',
|
|
49
|
+
'ask.fallbackReady': 'Ask AI is ready. Connect {provider} and index your docs to answer this question with citations.',
|
|
50
|
+
'ask.sourceTitle': 'Source {index}',
|
|
51
|
+
'toc.label': 'On this page',
|
|
52
|
+
'heading.anchor': 'Link to this section',
|
|
53
|
+
'article.kind.doc': 'Documentation',
|
|
54
|
+
'article.kind.page': 'Page',
|
|
55
|
+
'article.breadcrumb': 'Breadcrumb',
|
|
56
|
+
'article.updated': 'Updated {date}',
|
|
57
|
+
'article.edit': 'Edit this page',
|
|
58
|
+
'article.previous': 'Previous',
|
|
59
|
+
'article.next': 'Next',
|
|
60
|
+
'code.copy': 'Copy code',
|
|
61
|
+
'code.copied': 'Copied',
|
|
62
|
+
'code.copyDiff': 'Copy diff',
|
|
63
|
+
'diff.label': 'Diff',
|
|
64
|
+
'diff.aria': '{title} diff',
|
|
65
|
+
'diff.before': 'Before',
|
|
66
|
+
'diff.after': 'After',
|
|
67
|
+
'tools.label': 'Page tools',
|
|
68
|
+
'tools.backToTop': 'Back to top',
|
|
69
|
+
'theme.switch': 'Switch to {mode} theme',
|
|
70
|
+
'theme.light': 'light',
|
|
71
|
+
'theme.dark': 'dark',
|
|
72
|
+
'home.kicker': 'SvelteKit-native docs',
|
|
73
|
+
'home.primaryAction': 'Read docs',
|
|
74
|
+
'home.features': 'Documentation entry points',
|
|
75
|
+
'home.card.start.label': 'Start',
|
|
76
|
+
'home.card.start.title': 'Quick Start',
|
|
77
|
+
'home.card.start.description': 'Get a site running, open the docs route, and move straight into the installed docs tree.',
|
|
78
|
+
'home.card.install.label': 'Install',
|
|
79
|
+
'home.card.install.title': 'Manual Installation',
|
|
80
|
+
'home.card.install.description': 'Add svedocs to an existing SvelteKit app and wire the Vite plugin plus theme styles.',
|
|
81
|
+
'home.card.write.label': 'Write',
|
|
82
|
+
'home.card.write.title': 'Writing',
|
|
83
|
+
'home.card.write.description': 'Use Markdown, frontmatter, and Svelte components in one content tree.',
|
|
84
|
+
'home.card.integrate.label': 'Integrate',
|
|
85
|
+
'home.card.integrate.title': 'Integrations',
|
|
86
|
+
'home.card.integrate.description': 'Add search, Ask AI, Cloudflare deployment, SEO, and OG assets when the content is ready.',
|
|
87
|
+
'footer.text': 'MIT licensed. Built with {site}.',
|
|
88
|
+
'error.notFound.title': 'Page not found',
|
|
89
|
+
'error.notFound.description': 'The page you are looking for is not in this documentation set.',
|
|
90
|
+
'error.generic.title': 'Something went wrong',
|
|
91
|
+
'error.generic.description': 'The docs shell is still available while this page recovers.',
|
|
92
|
+
'error.status': 'Error {status}',
|
|
93
|
+
'error.home': 'Home',
|
|
94
|
+
'error.docs': 'Docs',
|
|
95
|
+
'render.label': 'Rendering issue',
|
|
96
|
+
'render.title': 'This section could not render',
|
|
97
|
+
'render.message': 'Something in this part of the documentation failed while rendering. The rest of the page is still available.',
|
|
98
|
+
'render.details': 'Technical details',
|
|
99
|
+
'render.tryAgain': 'Try again',
|
|
100
|
+
'render.reload': 'Reload page',
|
|
101
|
+
'render.docsHome': 'Docs home',
|
|
102
|
+
'render.layout.label': 'Layout issue',
|
|
103
|
+
'render.layout.title': 'The page layout could not render',
|
|
104
|
+
'render.layout.message': 'A layout component failed while rendering. The default site shell is still available.',
|
|
105
|
+
'render.header.label': 'Header issue',
|
|
106
|
+
'render.header.title': 'Header could not render',
|
|
107
|
+
'render.header.message': 'The page is still available below. You can retry the header or use links inside the content.',
|
|
108
|
+
'render.ask.label': 'Ask AI issue',
|
|
109
|
+
'render.ask.title': 'Ask AI could not render',
|
|
110
|
+
'render.ask.message': 'The article is still available. Retry Ask AI when you need it.',
|
|
111
|
+
'render.tools.label': 'Page tools issue',
|
|
112
|
+
'render.tools.title': 'Page tools could not render',
|
|
113
|
+
'render.tools.message': 'The page tools failed to render. The document content is unaffected.',
|
|
114
|
+
'render.footer.label': 'Footer issue',
|
|
115
|
+
'render.footer.title': 'Footer could not render',
|
|
116
|
+
'render.footer.message': 'Footer links failed to render. The page content above is still available.',
|
|
117
|
+
'render.page.label': 'Page rendering issue',
|
|
118
|
+
'render.page.title': 'This page could not render',
|
|
119
|
+
'render.page.message': 'The page content failed while rendering. You can retry this section or reload the page.',
|
|
120
|
+
'render.article.label': 'Article rendering issue',
|
|
121
|
+
'render.article.title': 'This article could not render',
|
|
122
|
+
'render.article.message': 'The article content failed while rendering. Navigation and page tools are still available.',
|
|
123
|
+
'render.docs.label': 'Documentation layout issue',
|
|
124
|
+
'render.docs.title': 'This documentation layout could not render',
|
|
125
|
+
'render.docs.message': 'A layout component failed while rendering. Retry the section, or use the top navigation to continue.',
|
|
126
|
+
'render.home.label': 'Home content issue',
|
|
127
|
+
'render.home.title': 'Home content could not render',
|
|
128
|
+
'render.home.message': 'The home page content failed while rendering. The rest of the site is still available.',
|
|
129
|
+
'render.error.label': 'Error page issue',
|
|
130
|
+
'render.error.title': 'The error page could not render',
|
|
131
|
+
'render.error.message': 'A custom error page component failed while rendering. The default site shell is still available.',
|
|
132
|
+
'render.custom.label': 'Custom layout issue',
|
|
133
|
+
'render.custom.title': 'The custom layout could not render',
|
|
134
|
+
'render.custom.message': 'A custom page layout failed while rendering. The route is still loaded; retry after fixing the component.',
|
|
135
|
+
'render.navigation.label': 'Navigation issue',
|
|
136
|
+
'render.navigation.title': 'Navigation could not render',
|
|
137
|
+
'render.navigation.message': 'The page content is still available. You can retry the navigation area or use the top navigation.',
|
|
138
|
+
'render.outline.label': 'Outline issue',
|
|
139
|
+
'render.outline.title': 'Outline could not render',
|
|
140
|
+
'render.outline.message': 'The table of contents failed to render, but the article is still available.',
|
|
141
|
+
'render.errorUi.label': 'Error boundary issue',
|
|
142
|
+
'render.errorUi.title': 'Error UI could not render',
|
|
143
|
+
'render.errorUi.message': 'A custom error component failed while rendering. The default recovery UI is shown instead.'
|
|
144
|
+
};
|
|
145
|
+
export function createBaseMessages(config) {
|
|
146
|
+
const ai = config.ai === false ? undefined : config.ai;
|
|
147
|
+
const footerText = config.theme?.footer === false ? undefined : config.theme?.footer?.text;
|
|
148
|
+
return mergeMessages(defaultSvedocsMessages, {
|
|
149
|
+
...(footerText ? { 'footer.text': footerText } : {}),
|
|
150
|
+
...(ai?.label ? { 'ask.label': ai.label } : {}),
|
|
151
|
+
...(ai?.placeholder ? { 'ask.placeholder': ai.placeholder } : {}),
|
|
152
|
+
...(ai?.welcomeMessage ? { 'ask.welcome': ai.welcomeMessage } : {}),
|
|
153
|
+
...(ai?.suggestions?.[0] ? { 'ask.suggestion.1': ai.suggestions[0] } : {}),
|
|
154
|
+
...(ai?.suggestions?.[1] ? { 'ask.suggestion.2': ai.suggestions[1] } : {}),
|
|
155
|
+
...(ai?.suggestions?.[2] ? { 'ask.suggestion.3': ai.suggestions[2] } : {})
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export function mergeMessages(base, override) {
|
|
159
|
+
return {
|
|
160
|
+
...base,
|
|
161
|
+
...(override ?? {})
|
|
162
|
+
};
|
|
163
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SvedocsPage, SvedocsTreeItem } from './types.js';
|
|
2
|
+
export declare function createPageTree(pages?: readonly SvedocsPage[]): SvedocsTreeItem[];
|
|
3
|
+
export declare function flattenPageTree(tree?: readonly SvedocsTreeItem[]): SvedocsTreeItem[];
|
|
4
|
+
export declare function wirePrevNext(pages: SvedocsPage[], tree: SvedocsTreeItem[]): void;
|
|
5
|
+
//# sourceMappingURL=navigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/core/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAe/D,wBAAgB,cAAc,CAAC,KAAK,GAAE,SAAS,WAAW,EAAO,GAAG,eAAe,EAAE,CA8BpF;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,SAAS,eAAe,EAAO,GAAG,eAAe,EAAE,CAExF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAkBzE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { createGroupId, titleFromSegment } from './utils.js';
|
|
2
|
+
export function createPageTree(pages = []) {
|
|
3
|
+
const docs = [...pages].filter((page) => page.kind === 'doc' && !page.hidden);
|
|
4
|
+
const pageByPath = new Map(docs.map((page) => [page.routePath, page]));
|
|
5
|
+
const nodeByPath = new Map();
|
|
6
|
+
const root = [];
|
|
7
|
+
for (const page of docs.sort(comparePagesForNavigation)) {
|
|
8
|
+
const segments = getDocRouteSegments(page);
|
|
9
|
+
let children = root;
|
|
10
|
+
const accumulated = [];
|
|
11
|
+
for (const [index, segment] of segments.entries()) {
|
|
12
|
+
const isDocsIndex = segments.length === 1 && segment === 'index';
|
|
13
|
+
const isLeaf = index === segments.length - 1;
|
|
14
|
+
if (!isDocsIndex)
|
|
15
|
+
accumulated.push(segment);
|
|
16
|
+
const nodePath = isDocsIndex ? '/docs' : `/docs/${accumulated.join('/')}`;
|
|
17
|
+
const sourcePage = pageByPath.get(nodePath);
|
|
18
|
+
const node = upsertTreeNode({
|
|
19
|
+
children,
|
|
20
|
+
nodeByPath,
|
|
21
|
+
nodePath,
|
|
22
|
+
segment,
|
|
23
|
+
page: sourcePage,
|
|
24
|
+
leafPage: isLeaf ? page : undefined
|
|
25
|
+
});
|
|
26
|
+
children = node.children;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return finalizeTree(root);
|
|
30
|
+
}
|
|
31
|
+
export function flattenPageTree(tree = []) {
|
|
32
|
+
return tree.flatMap((item) => [item, ...flattenPageTree(item.children ?? [])]);
|
|
33
|
+
}
|
|
34
|
+
export function wirePrevNext(pages, tree) {
|
|
35
|
+
const pageByPath = new Map(pages.map((page) => [page.routePath, page]));
|
|
36
|
+
const docs = flattenPageTree(tree)
|
|
37
|
+
.map((item) => item.path ? pageByPath.get(item.path) : undefined)
|
|
38
|
+
.filter((page) => Boolean(page && page.kind === 'doc' && !page.hidden));
|
|
39
|
+
for (const page of pages) {
|
|
40
|
+
delete page.prev;
|
|
41
|
+
delete page.next;
|
|
42
|
+
}
|
|
43
|
+
const docsByScope = groupDocsByScope(docs);
|
|
44
|
+
for (const scopedDocs of docsByScope.values()) {
|
|
45
|
+
for (const [index, page] of scopedDocs.entries()) {
|
|
46
|
+
const prev = scopedDocs[index - 1];
|
|
47
|
+
const next = scopedDocs[index + 1];
|
|
48
|
+
if (prev)
|
|
49
|
+
page.prev = { title: prev.navTitle ?? prev.title, path: prev.routePath };
|
|
50
|
+
if (next)
|
|
51
|
+
page.next = { title: next.navTitle ?? next.title, path: next.routePath };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function getDocRouteSegments(page) {
|
|
56
|
+
if (page.routePath === '/docs')
|
|
57
|
+
return ['index'];
|
|
58
|
+
return page.routePath.replace(/^\/docs\/?/, '').split('/').filter(Boolean);
|
|
59
|
+
}
|
|
60
|
+
function upsertTreeNode(input) {
|
|
61
|
+
const page = input.page ?? input.leafPage;
|
|
62
|
+
const existing = input.nodeByPath.get(input.nodePath);
|
|
63
|
+
if (existing) {
|
|
64
|
+
if (page)
|
|
65
|
+
applyPageToTreeItem(existing, page);
|
|
66
|
+
return existing;
|
|
67
|
+
}
|
|
68
|
+
const item = {
|
|
69
|
+
id: page?.id ?? createGroupId(input.nodePath),
|
|
70
|
+
title: page?.navTitle ?? page?.title ?? titleFromSegment(input.segment),
|
|
71
|
+
children: [],
|
|
72
|
+
_weight: page?.order ?? Number.POSITIVE_INFINITY,
|
|
73
|
+
...(page ? { path: page.routePath } : {}),
|
|
74
|
+
...(typeof page?.order === 'number' ? { order: page.order } : {}),
|
|
75
|
+
...(typeof page?.collapsed === 'boolean' ? { collapsed: page.collapsed } : {}),
|
|
76
|
+
...(page?.section === true ? { section: true } : {}),
|
|
77
|
+
...(page?.icon ? { icon: page.icon } : {})
|
|
78
|
+
};
|
|
79
|
+
input.nodeByPath.set(input.nodePath, item);
|
|
80
|
+
input.children.push(item);
|
|
81
|
+
return item;
|
|
82
|
+
}
|
|
83
|
+
function applyPageToTreeItem(item, page) {
|
|
84
|
+
item.id = page.id;
|
|
85
|
+
item.title = page.navTitle ?? page.title;
|
|
86
|
+
item.path = page.routePath;
|
|
87
|
+
item._weight = page.order ?? item._weight;
|
|
88
|
+
if (typeof page.order === 'number')
|
|
89
|
+
item.order = page.order;
|
|
90
|
+
if (typeof page.collapsed === 'boolean')
|
|
91
|
+
item.collapsed = page.collapsed;
|
|
92
|
+
if (page.section === true)
|
|
93
|
+
item.section = true;
|
|
94
|
+
if (page.icon)
|
|
95
|
+
item.icon = page.icon;
|
|
96
|
+
}
|
|
97
|
+
function finalizeTree(items) {
|
|
98
|
+
for (const item of items) {
|
|
99
|
+
item._weight = Math.min(item._weight, ...item.children.map((child) => computeTreeWeight(child)));
|
|
100
|
+
}
|
|
101
|
+
return items
|
|
102
|
+
.sort(compareTreeItems)
|
|
103
|
+
.map((item) => {
|
|
104
|
+
const children = finalizeTree(item.children);
|
|
105
|
+
return {
|
|
106
|
+
id: item.id,
|
|
107
|
+
title: item.title,
|
|
108
|
+
...(item.path ? { path: item.path } : {}),
|
|
109
|
+
...(children.length > 0 ? { children } : {}),
|
|
110
|
+
...(typeof item.collapsed === 'boolean' ? { collapsed: item.collapsed } : {}),
|
|
111
|
+
...(typeof item.order === 'number' ? { order: item.order } : {}),
|
|
112
|
+
...(item.section === true ? { section: true } : {}),
|
|
113
|
+
...(item.icon ? { icon: item.icon } : {})
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function computeTreeWeight(item) {
|
|
118
|
+
item._weight = Math.min(item._weight, ...item.children.map((child) => computeTreeWeight(child)));
|
|
119
|
+
return item._weight;
|
|
120
|
+
}
|
|
121
|
+
function compareTreeItems(a, b) {
|
|
122
|
+
const byWeight = a._weight - b._weight;
|
|
123
|
+
if (Number.isFinite(byWeight) && byWeight !== 0)
|
|
124
|
+
return byWeight;
|
|
125
|
+
if (a.path && b.path)
|
|
126
|
+
return a.path.localeCompare(b.path);
|
|
127
|
+
return a.title.localeCompare(b.title);
|
|
128
|
+
}
|
|
129
|
+
function comparePagesForNavigation(a, b) {
|
|
130
|
+
const orderA = a.order ?? Number.POSITIVE_INFINITY;
|
|
131
|
+
const orderB = b.order ?? Number.POSITIVE_INFINITY;
|
|
132
|
+
const byOrder = orderA - orderB;
|
|
133
|
+
return byOrder === 0 ? a.routePath.localeCompare(b.routePath) : byOrder;
|
|
134
|
+
}
|
|
135
|
+
function groupDocsByScope(docs) {
|
|
136
|
+
const groups = new Map();
|
|
137
|
+
for (const page of docs) {
|
|
138
|
+
const key = page.locale ?? '';
|
|
139
|
+
const group = groups.get(key) ?? [];
|
|
140
|
+
group.push(page);
|
|
141
|
+
groups.set(key, group);
|
|
142
|
+
}
|
|
143
|
+
return groups;
|
|
144
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SvedocsResolvedConfig } from './types.js';
|
|
2
|
+
export interface SvedocsRouteTarget {
|
|
3
|
+
routePath: string;
|
|
4
|
+
scopePath: string;
|
|
5
|
+
sourcePath?: string;
|
|
6
|
+
locale?: string;
|
|
7
|
+
kind: 'doc' | 'page';
|
|
8
|
+
}
|
|
9
|
+
export type SvedocsPageRouteResolution<T extends SvedocsRouteTarget = SvedocsRouteTarget> = {
|
|
10
|
+
status: 'found';
|
|
11
|
+
page: T;
|
|
12
|
+
} | {
|
|
13
|
+
status: 'redirect';
|
|
14
|
+
page: T;
|
|
15
|
+
location: string;
|
|
16
|
+
requestedLocale: string;
|
|
17
|
+
resolvedLocale: string;
|
|
18
|
+
} | {
|
|
19
|
+
status: 'missing';
|
|
20
|
+
requestedLocale?: string;
|
|
21
|
+
};
|
|
22
|
+
export interface SvedocsHrefResolution<T extends SvedocsRouteTarget = SvedocsRouteTarget> {
|
|
23
|
+
href: string;
|
|
24
|
+
page?: T;
|
|
25
|
+
fallback: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function resolveSvedocsPageRoute<T extends SvedocsRouteTarget>(routePath: string, pages: readonly T[], config: SvedocsResolvedConfig): SvedocsPageRouteResolution<T>;
|
|
28
|
+
export declare function createSvedocsRouteEntries<T extends SvedocsRouteTarget>(pages: readonly T[], config: SvedocsResolvedConfig): string[];
|
|
29
|
+
export declare function resolveSvedocsHref<T extends SvedocsRouteTarget>(input: {
|
|
30
|
+
href: string;
|
|
31
|
+
pages: readonly T[];
|
|
32
|
+
config: SvedocsResolvedConfig;
|
|
33
|
+
page?: SvedocsRouteTarget;
|
|
34
|
+
localeCode?: string;
|
|
35
|
+
}): SvedocsHrefResolution<T>;
|
|
36
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/core/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IACpF;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAClG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,kBAAkB,EAClE,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,qBAAqB,GAC5B,0BAA0B,CAAC,CAAC,CAAC,CAyB/B;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,kBAAkB,EACpE,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,qBAAqB,GAC5B,MAAM,EAAE,CAsBV;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAoC3B"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { normalizePath, stripContentExtension } from './utils.js';
|
|
2
|
+
export function resolveSvedocsPageRoute(routePath, pages, config) {
|
|
3
|
+
const normalized = normalizeRoutePath(routePath);
|
|
4
|
+
const exact = pages.find((page) => normalizeRoutePath(page.routePath) === normalized);
|
|
5
|
+
if (exact)
|
|
6
|
+
return { status: 'found', page: exact };
|
|
7
|
+
const requested = resolveLocalizedScope(normalized, config);
|
|
8
|
+
if (!requested)
|
|
9
|
+
return { status: 'missing' };
|
|
10
|
+
const defaultLocale = config.i18n.defaultLocale;
|
|
11
|
+
if (!defaultLocale || requested.locale === defaultLocale) {
|
|
12
|
+
return { status: 'missing', requestedLocale: requested.locale };
|
|
13
|
+
}
|
|
14
|
+
const fallback = pages.find((page) => (page.kind === requested.kind
|
|
15
|
+
&& page.scopePath === requested.scopePath
|
|
16
|
+
&& page.locale === defaultLocale));
|
|
17
|
+
if (!fallback)
|
|
18
|
+
return { status: 'missing', requestedLocale: requested.locale };
|
|
19
|
+
return {
|
|
20
|
+
status: 'redirect',
|
|
21
|
+
page: fallback,
|
|
22
|
+
location: fallback.routePath,
|
|
23
|
+
requestedLocale: requested.locale,
|
|
24
|
+
resolvedLocale: defaultLocale
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function createSvedocsRouteEntries(pages, config) {
|
|
28
|
+
const entries = new Set(pages
|
|
29
|
+
.map((page) => normalizeRoutePath(page.routePath))
|
|
30
|
+
.filter((routePath) => routePath !== '/'));
|
|
31
|
+
const defaultLocale = config.i18n.defaultLocale;
|
|
32
|
+
if (!defaultLocale)
|
|
33
|
+
return [...entries];
|
|
34
|
+
const defaultPages = pages.filter((page) => page.locale === defaultLocale);
|
|
35
|
+
for (const page of defaultPages) {
|
|
36
|
+
for (const locale of config.i18n.locales) {
|
|
37
|
+
if (locale.code === defaultLocale)
|
|
38
|
+
continue;
|
|
39
|
+
const translationExists = pages.some((candidate) => (candidate.kind === page.kind
|
|
40
|
+
&& candidate.scopePath === page.scopePath
|
|
41
|
+
&& candidate.locale === locale.code));
|
|
42
|
+
if (!translationExists)
|
|
43
|
+
entries.add(createLocalizedRoutePath(page, locale.path));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return [...entries];
|
|
47
|
+
}
|
|
48
|
+
export function resolveSvedocsHref(input) {
|
|
49
|
+
const { pathname, suffix } = splitHref(input.href);
|
|
50
|
+
if (!pathname || isNonPageHref(input.href))
|
|
51
|
+
return { href: input.href, fallback: false };
|
|
52
|
+
const exactPath = pathname.startsWith('/') ? normalizeRoutePath(pathname) : undefined;
|
|
53
|
+
const exact = exactPath
|
|
54
|
+
? input.pages.find((page) => normalizeRoutePath(page.routePath) === exactPath)
|
|
55
|
+
: undefined;
|
|
56
|
+
if (exact && exact.scopePath !== exactPath) {
|
|
57
|
+
return { href: `${exact.routePath}${suffix}`, page: exact, fallback: false };
|
|
58
|
+
}
|
|
59
|
+
const scopePath = pathname.startsWith('/')
|
|
60
|
+
? normalizeContentPath(pathname)
|
|
61
|
+
: input.page
|
|
62
|
+
? resolveRelativeScopePath(input.page, pathname)
|
|
63
|
+
: undefined;
|
|
64
|
+
if (!scopePath)
|
|
65
|
+
return { href: input.href, fallback: false };
|
|
66
|
+
const localeCode = input.localeCode ?? input.page?.locale ?? input.config.i18n.defaultLocale;
|
|
67
|
+
const kind = exact?.kind ?? inferTargetKind(scopePath, input.page?.kind);
|
|
68
|
+
const localized = input.pages.find((page) => (page.scopePath === scopePath
|
|
69
|
+
&& page.kind === kind
|
|
70
|
+
&& page.locale === localeCode));
|
|
71
|
+
if (localized)
|
|
72
|
+
return { href: `${localized.routePath}${suffix}`, page: localized, fallback: false };
|
|
73
|
+
const defaultLocale = input.config.i18n.defaultLocale;
|
|
74
|
+
const fallback = input.pages.find((page) => (page.scopePath === scopePath
|
|
75
|
+
&& page.kind === kind
|
|
76
|
+
&& page.locale === defaultLocale));
|
|
77
|
+
if (fallback)
|
|
78
|
+
return { href: `${fallback.routePath}${suffix}`, page: fallback, fallback: true };
|
|
79
|
+
return { href: input.href, fallback: false };
|
|
80
|
+
}
|
|
81
|
+
function resolveLocalizedScope(routePath, config) {
|
|
82
|
+
const segments = routePath.split('/').filter(Boolean);
|
|
83
|
+
const kind = segments[0] === 'docs' ? 'doc' : 'page';
|
|
84
|
+
const localeIndex = kind === 'doc' ? 1 : 0;
|
|
85
|
+
const locale = config.i18n.locales.find((candidate) => candidate.path === segments[localeIndex]);
|
|
86
|
+
if (!locale)
|
|
87
|
+
return undefined;
|
|
88
|
+
const scopeSegments = segments.filter((_, index) => index !== localeIndex);
|
|
89
|
+
return {
|
|
90
|
+
locale: locale.code,
|
|
91
|
+
scopePath: normalizeRoutePath(`/${scopeSegments.join('/')}`),
|
|
92
|
+
kind
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function resolveRelativeScopePath(page, pathname) {
|
|
96
|
+
const sourceWithoutExtension = page.sourcePath ? stripContentExtension(normalizePath(page.sourcePath)) : '';
|
|
97
|
+
const sourceIsIndex = sourceWithoutExtension.endsWith('/index');
|
|
98
|
+
const base = sourceIsIndex || page.scopePath === '/' ? page.scopePath : dirnameRoutePath(page.scopePath);
|
|
99
|
+
return normalizeContentPath(`${base}/${pathname}`);
|
|
100
|
+
}
|
|
101
|
+
function createLocalizedRoutePath(page, localePath) {
|
|
102
|
+
const scopeSegments = normalizeRoutePath(page.scopePath).split('/').filter(Boolean);
|
|
103
|
+
if (page.kind === 'doc') {
|
|
104
|
+
const docSegments = scopeSegments[0] === 'docs' ? scopeSegments.slice(1) : scopeSegments;
|
|
105
|
+
return normalizeRoutePath(`/docs/${localePath}/${docSegments.join('/')}`);
|
|
106
|
+
}
|
|
107
|
+
return normalizeRoutePath(`/${localePath}/${scopeSegments.join('/')}`);
|
|
108
|
+
}
|
|
109
|
+
function normalizeContentPath(value) {
|
|
110
|
+
const normalized = normalizeRoutePath(stripContentExtension(normalizePath(value)));
|
|
111
|
+
return normalized.endsWith('/index')
|
|
112
|
+
? normalized.slice(0, -'/index'.length) || '/'
|
|
113
|
+
: normalized;
|
|
114
|
+
}
|
|
115
|
+
function inferTargetKind(scopePath, currentKind) {
|
|
116
|
+
if (scopePath === '/docs' || scopePath.startsWith('/docs/'))
|
|
117
|
+
return 'doc';
|
|
118
|
+
return currentKind === 'doc' ? 'doc' : 'page';
|
|
119
|
+
}
|
|
120
|
+
function normalizeRoutePath(value) {
|
|
121
|
+
const [pathname = ''] = normalizePath(value).split(/[?#]/, 1);
|
|
122
|
+
const segments = [];
|
|
123
|
+
for (const segment of pathname.split('/')) {
|
|
124
|
+
if (!segment || segment === '.')
|
|
125
|
+
continue;
|
|
126
|
+
if (segment === '..') {
|
|
127
|
+
segments.pop();
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
segments.push(segment);
|
|
131
|
+
}
|
|
132
|
+
return segments.length > 0 ? `/${segments.join('/')}` : '/';
|
|
133
|
+
}
|
|
134
|
+
function dirnameRoutePath(value) {
|
|
135
|
+
const segments = normalizeRoutePath(value).split('/').filter(Boolean);
|
|
136
|
+
segments.pop();
|
|
137
|
+
return segments.length > 0 ? `/${segments.join('/')}` : '/';
|
|
138
|
+
}
|
|
139
|
+
function splitHref(href) {
|
|
140
|
+
const suffixIndex = href.search(/[?#]/);
|
|
141
|
+
return suffixIndex < 0
|
|
142
|
+
? { pathname: href, suffix: '' }
|
|
143
|
+
: { pathname: href.slice(0, suffixIndex), suffix: href.slice(suffixIndex) };
|
|
144
|
+
}
|
|
145
|
+
function isNonPageHref(href) {
|
|
146
|
+
return href.startsWith('#')
|
|
147
|
+
|| href.startsWith('mailto:')
|
|
148
|
+
|| href.startsWith('tel:')
|
|
149
|
+
|| /^(https?:)?\/\//.test(href)
|
|
150
|
+
|| /^[a-z][a-z0-9+.-]*:/i.test(href)
|
|
151
|
+
|| /\.(avif|gif|jpe?g|png|svg|webp|pdf|zip)([#?].*)?$/i.test(href);
|
|
152
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SvedocsPage, SvedocsSearchRecord } from './types.js';
|
|
2
|
+
export declare function createSearchRecords(pages?: readonly SvedocsPage[]): SvedocsSearchRecord[];
|
|
3
|
+
export declare function createPageSearchRecords(page: SvedocsPage, markdown?: string): SvedocsSearchRecord[];
|
|
4
|
+
export declare function createPageSearchRecord(page: SvedocsPage): SvedocsSearchRecord;
|
|
5
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,SAAS,WAAW,EAAO,GAAG,mBAAmB,EAAE,CAE7F;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAInG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAa7E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { extractMarkdownSections } from '../mdx/ast.js';
|
|
2
|
+
export function createSearchRecords(pages = []) {
|
|
3
|
+
return pages.flatMap((page) => page.search.length > 0 ? page.search : [createPageSearchRecord(page)]);
|
|
4
|
+
}
|
|
5
|
+
export function createPageSearchRecords(page, markdown) {
|
|
6
|
+
const pageRecord = createPageSearchRecord(page);
|
|
7
|
+
if (!markdown)
|
|
8
|
+
return [pageRecord];
|
|
9
|
+
return [pageRecord, ...createSectionSearchRecords(page, markdown)];
|
|
10
|
+
}
|
|
11
|
+
export function createPageSearchRecord(page) {
|
|
12
|
+
return {
|
|
13
|
+
id: `${page.id}:page`,
|
|
14
|
+
pageId: page.id,
|
|
15
|
+
url: page.routePath,
|
|
16
|
+
title: page.title,
|
|
17
|
+
content: page.plainText,
|
|
18
|
+
metadata: {
|
|
19
|
+
kind: page.kind,
|
|
20
|
+
sourcePath: page.sourcePath,
|
|
21
|
+
...(page.locale ? { locale: page.locale } : {})
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createSectionSearchRecords(page, markdown) {
|
|
26
|
+
return extractMarkdownSections(markdown).map((section) => ({
|
|
27
|
+
id: `${page.id}:${section.id}`,
|
|
28
|
+
pageId: page.id,
|
|
29
|
+
url: `${page.routePath}#${section.id}`,
|
|
30
|
+
title: page.title,
|
|
31
|
+
section: section.title,
|
|
32
|
+
content: section.content,
|
|
33
|
+
metadata: {
|
|
34
|
+
kind: page.kind,
|
|
35
|
+
sourcePath: page.sourcePath,
|
|
36
|
+
...(page.locale ? { locale: page.locale } : {}),
|
|
37
|
+
headingId: section.id,
|
|
38
|
+
headingDepth: section.depth
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
}
|