@wrikka/create-docs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/bin/cli.js +408 -0
- package/dist/index.cjs +20 -0
- package/dist/index.d.cts +475 -0
- package/dist/index.d.ts +475 -0
- package/dist/index.js +20 -0
- package/docs/_dir.yml +2 -0
- package/docs/config.md +75 -0
- package/docs/data-sources.md +88 -0
- package/docs/deploy.md +38 -0
- package/docs/features.md +51 -0
- package/docs/getting-started.md +42 -0
- package/docs/index.md +34 -0
- package/docs/markdown.md +154 -0
- package/docs/theming.md +53 -0
- package/package.json +142 -0
- package/scripts/generate-docs-index.ts +111 -0
- package/scripts/github-pull.ts +124 -0
- package/src/adapters/config/index.ts +1 -0
- package/src/adapters/config/node-config-loader.ts +36 -0
- package/src/adapters/fs/fs-docs-loader.ts +31 -0
- package/src/adapters/fs/index.ts +12 -0
- package/src/adapters/fs/memory-fs.ts +60 -0
- package/src/adapters/fs/node-fs.ts +116 -0
- package/src/adapters/git/index.ts +164 -0
- package/src/adapters/github/github-pull.ts +340 -0
- package/src/adapters/index.ts +6 -0
- package/src/adapters/velite.ts +112 -0
- package/src/adapters/vite/docs-watcher.ts +36 -0
- package/src/adapters/vite/index.ts +2 -0
- package/src/adapters/vite/polling-watcher.ts +89 -0
- package/src/code-block-enhancements/index.ts +3 -0
- package/src/config/index.ts +15 -0
- package/src/content/index.ts +11 -0
- package/src/content-validation/index.ts +5 -0
- package/src/index.ts +174 -0
- package/src/live-editor/index.ts +7 -0
- package/src/modules/analytics/application/plausible-adapter.ts +103 -0
- package/src/modules/analytics/application/umami-adapter.ts +109 -0
- package/src/modules/analytics/domain/events/index.ts +37 -0
- package/src/modules/analytics/domain/models/index.ts +35 -0
- package/src/modules/analytics/domain/operations/analytics-operations.ts +67 -0
- package/src/modules/analytics/domain/validators/index.ts +50 -0
- package/src/modules/analytics/index.ts +9 -0
- package/src/modules/analytics/ports/analytics-port.ts +17 -0
- package/src/modules/analytics/types/analytics.ts +16 -0
- package/src/modules/api-docs/application/type-docs-adapter.ts +34 -0
- package/src/modules/api-docs/domain/events/index.ts +42 -0
- package/src/modules/api-docs/domain/models/index.ts +40 -0
- package/src/modules/api-docs/domain/operations/api-docs-operations.ts +59 -0
- package/src/modules/api-docs/domain/validators/index.ts +56 -0
- package/src/modules/api-docs/index.ts +8 -0
- package/src/modules/api-docs/ports/api-docs-port.ts +21 -0
- package/src/modules/api-docs/types/api-docs.ts +15 -0
- package/src/modules/api-reference/openapi.ts +166 -0
- package/src/modules/api-reference/orpc.ts +94 -0
- package/src/modules/code-block-enhancements/application/usecases/index.ts +39 -0
- package/src/modules/code-block-enhancements/domain/code-operations.ts +72 -0
- package/src/modules/code-block-enhancements/domain/events/index.ts +58 -0
- package/src/modules/code-block-enhancements/domain/index.ts +11 -0
- package/src/modules/code-block-enhancements/domain/models/index.ts +36 -0
- package/src/modules/code-block-enhancements/domain/validators/index.ts +50 -0
- package/src/modules/code-block-enhancements/index.ts +10 -0
- package/src/modules/code-block-enhancements/ports/index.ts +18 -0
- package/src/modules/code-block-enhancements/types/index.ts +37 -0
- package/src/modules/code-execution/application/sandbox-adapter.ts +44 -0
- package/src/modules/code-execution/domain/events/index.ts +58 -0
- package/src/modules/code-execution/domain/models/index.ts +33 -0
- package/src/modules/code-execution/domain/operations/execution-operations.ts +60 -0
- package/src/modules/code-execution/domain/validators/index.ts +50 -0
- package/src/modules/code-execution/index.ts +8 -0
- package/src/modules/code-execution/ports/execution-port.ts +15 -0
- package/src/modules/code-execution/types/execution.ts +15 -0
- package/src/modules/comments/application/giscus-adapter.ts +55 -0
- package/src/modules/comments/domain/events/index.ts +55 -0
- package/src/modules/comments/domain/models/index.ts +30 -0
- package/src/modules/comments/domain/operations/comment-operations.ts +46 -0
- package/src/modules/comments/domain/validators/index.ts +50 -0
- package/src/modules/comments/index.ts +8 -0
- package/src/modules/comments/ports/comment-port.ts +18 -0
- package/src/modules/comments/types/comments.ts +19 -0
- package/src/modules/config/application/usecases/index.ts +1 -0
- package/src/modules/config/application/usecases/loadConfig.ts +38 -0
- package/src/modules/config/application/workflows/index.ts +1 -0
- package/src/modules/config/application/workflows/validateConfig.ts +14 -0
- package/src/modules/config/domain/events/index.ts +50 -0
- package/src/modules/config/domain/models/index.ts +9 -0
- package/src/modules/config/domain/operations/defaults.ts +74 -0
- package/src/modules/config/domain/operations/index.ts +2 -0
- package/src/modules/config/domain/operations/resolve.ts +40 -0
- package/src/modules/config/domain/validators/index.ts +152 -0
- package/src/modules/config/index.ts +23 -0
- package/src/modules/config/ports/index.ts +15 -0
- package/src/modules/config/types/index.ts +113 -0
- package/src/modules/config/types/public.ts +19 -0
- package/src/modules/content/application/cache/index.ts +6 -0
- package/src/modules/content/application/cache/parse-cache.ts +6 -0
- package/src/modules/content/application/cache/parseCache.ts +56 -0
- package/src/modules/content/application/usecases/index.ts +2 -0
- package/src/modules/content/application/usecases/load-doc-page.ts +1 -0
- package/src/modules/content/application/usecases/loadDocPage.ts +111 -0
- package/src/modules/content/application/usecases/scanDocsDir.ts +105 -0
- package/src/modules/content/application/workflows/index.ts +1 -0
- package/src/modules/content/application/workflows/processDocs.ts +51 -0
- package/src/modules/content/domain/events/index.ts +61 -0
- package/src/modules/content/domain/models/index.ts +13 -0
- package/src/modules/content/domain/operations/build-page.ts +146 -0
- package/src/modules/content/domain/operations/buildPage.ts +93 -0
- package/src/modules/content/domain/operations/index.ts +17 -0
- package/src/modules/content/domain/operations/parse.ts +241 -0
- package/src/modules/content/domain/validators/frontmatter.ts +82 -0
- package/src/modules/content/domain/validators/index.ts +6 -0
- package/src/modules/content/index.ts +27 -0
- package/src/modules/content/ports/index.ts +45 -0
- package/src/modules/content/ports/velite.ts +134 -0
- package/src/modules/content/types/index.ts +76 -0
- package/src/modules/content/types/public.ts +1 -0
- package/src/modules/content-linting/application/builtin-linting-adapter.ts +82 -0
- package/src/modules/content-linting/domain/events/index.ts +58 -0
- package/src/modules/content-linting/domain/models/index.ts +46 -0
- package/src/modules/content-linting/domain/operations/linting-operations.ts +82 -0
- package/src/modules/content-linting/domain/validators/index.ts +50 -0
- package/src/modules/content-linting/index.ts +8 -0
- package/src/modules/content-linting/ports/linting-port.ts +21 -0
- package/src/modules/content-linting/types/linting.ts +18 -0
- package/src/modules/content-validation/application/usecases/index.ts +18 -0
- package/src/modules/content-validation/domain/events/index.ts +7 -0
- package/src/modules/content-validation/domain/index.ts +16 -0
- package/src/modules/content-validation/domain/models/index.ts +33 -0
- package/src/modules/content-validation/domain/operations/index.ts +157 -0
- package/src/modules/content-validation/domain/types/index.ts +17 -0
- package/src/modules/content-validation/domain/validators/index.ts +8 -0
- package/src/modules/content-validation/index.ts +9 -0
- package/src/modules/content-validation/ports/index.ts +15 -0
- package/src/modules/content-validation/types/index.ts +5 -0
- package/src/modules/export/application/puppeteer-export-adapter.ts +63 -0
- package/src/modules/export/domain/events/index.ts +55 -0
- package/src/modules/export/domain/models/index.ts +38 -0
- package/src/modules/export/domain/operations/export-operations.ts +56 -0
- package/src/modules/export/domain/validators/index.ts +52 -0
- package/src/modules/export/index.ts +8 -0
- package/src/modules/export/ports/export-port.ts +15 -0
- package/src/modules/export/types/export.ts +15 -0
- package/src/modules/external-search/application/algolia-adapter.ts +182 -0
- package/src/modules/external-search/application/meilisearch-adapter.ts +161 -0
- package/src/modules/external-search/domain/events/index.ts +42 -0
- package/src/modules/external-search/domain/models/index.ts +42 -0
- package/src/modules/external-search/domain/operations/search-operations.ts +53 -0
- package/src/modules/external-search/domain/validators/index.ts +55 -0
- package/src/modules/external-search/index.ts +9 -0
- package/src/modules/external-search/ports/external-search-port.ts +23 -0
- package/src/modules/external-search/types/search.ts +19 -0
- package/src/modules/git-history/application/simple-git-adapter.ts +46 -0
- package/src/modules/git-history/domain/events/index.ts +34 -0
- package/src/modules/git-history/domain/models/index.ts +25 -0
- package/src/modules/git-history/domain/operations/git-history-operations.ts +56 -0
- package/src/modules/git-history/domain/validators/index.ts +52 -0
- package/src/modules/git-history/index.ts +8 -0
- package/src/modules/git-history/ports/git-history-port.ts +21 -0
- package/src/modules/git-history/types/git-history.ts +15 -0
- package/src/modules/i18n/application/fs-locale-loader.ts +39 -0
- package/src/modules/i18n/domain/events/index.ts +34 -0
- package/src/modules/i18n/domain/models/index.ts +34 -0
- package/src/modules/i18n/domain/operations/locale-operations.ts +74 -0
- package/src/modules/i18n/domain/validators/index.ts +52 -0
- package/src/modules/i18n/index.ts +8 -0
- package/src/modules/i18n/ports/locale-loader-port.ts +18 -0
- package/src/modules/i18n/types/locale.ts +17 -0
- package/src/modules/image-optimization/application/sharp-adapter.ts +58 -0
- package/src/modules/image-optimization/domain/events/index.ts +39 -0
- package/src/modules/image-optimization/domain/models/index.ts +27 -0
- package/src/modules/image-optimization/domain/operations/image-operations.ts +65 -0
- package/src/modules/image-optimization/domain/validators/index.ts +52 -0
- package/src/modules/image-optimization/index.ts +8 -0
- package/src/modules/image-optimization/ports/image-optimizer-port.ts +15 -0
- package/src/modules/image-optimization/types/image.ts +17 -0
- package/src/modules/live-editor/application/usecases/index.ts +60 -0
- package/src/modules/live-editor/domain/events/index.ts +37 -0
- package/src/modules/live-editor/domain/gitOperations.ts +110 -0
- package/src/modules/live-editor/domain/index.ts +15 -0
- package/src/modules/live-editor/domain/models/index.ts +21 -0
- package/src/modules/live-editor/domain/validators/index.ts +55 -0
- package/src/modules/live-editor/index.ts +14 -0
- package/src/modules/live-editor/ports/index.ts +49 -0
- package/src/modules/live-editor/types/index.ts +80 -0
- package/src/modules/live-preview/application/vite-preview-adapter.ts +20 -0
- package/src/modules/live-preview/domain/operations/preview-operations.ts +56 -0
- package/src/modules/live-preview/index.ts +8 -0
- package/src/modules/live-preview/ports/preview-port.ts +20 -0
- package/src/modules/live-preview/types/preview.ts +16 -0
- package/src/modules/mdx/application/mdx-js-adapter.ts +38 -0
- package/src/modules/mdx/domain/operations/parse-mdx.ts +43 -0
- package/src/modules/mdx/index.ts +8 -0
- package/src/modules/mdx/ports/mdx-parser-port.ts +15 -0
- package/src/modules/mdx/types/mdx.ts +14 -0
- package/src/modules/navigation/application/usecases/buildNav.ts +15 -0
- package/src/modules/navigation/application/usecases/buildSidebar.ts +45 -0
- package/src/modules/navigation/application/usecases/index.ts +2 -0
- package/src/modules/navigation/domain/events/index.ts +30 -0
- package/src/modules/navigation/domain/models/index.ts +7 -0
- package/src/modules/navigation/domain/operations/group.ts +79 -0
- package/src/modules/navigation/domain/operations/index.ts +10 -0
- package/src/modules/navigation/domain/operations/sort.ts +27 -0
- package/src/modules/navigation/domain/shared/utils/array.ts +39 -0
- package/src/modules/navigation/domain/validators/index.ts +88 -0
- package/src/modules/navigation/index.ts +15 -0
- package/src/modules/navigation/ports/index.ts +9 -0
- package/src/modules/navigation/types/index.ts +38 -0
- package/src/modules/navigation/types/public.ts +9 -0
- package/src/modules/openapi/application/swagger-parser-adapter.ts +178 -0
- package/src/modules/openapi/domain/operations/parse-openapi.ts +46 -0
- package/src/modules/openapi/index.ts +8 -0
- package/src/modules/openapi/ports/openapi-parser-port.ts +15 -0
- package/src/modules/openapi/types/openapi.ts +37 -0
- package/src/modules/plugin/application/usecases/build-virtual-modules.ts +53 -0
- package/src/modules/plugin/application/usecases/index.ts +1 -0
- package/src/modules/plugin/application/workflows/build-docs.ts +79 -0
- package/src/modules/plugin/application/workflows/index.ts +1 -0
- package/src/modules/plugin/domain/events/index.ts +62 -0
- package/src/modules/plugin/domain/models/index.ts +1 -0
- package/src/modules/plugin/domain/operations/build-virtual.ts +76 -0
- package/src/modules/plugin/domain/operations/index.ts +11 -0
- package/src/modules/plugin/domain/validators/index.ts +30 -0
- package/src/modules/plugin/index.ts +14 -0
- package/src/modules/plugin/ports/index.ts +21 -0
- package/src/modules/plugin/types/index.ts +27 -0
- package/src/modules/plugin/types/public.ts +1 -0
- package/src/modules/search/application/usecases/index.ts +1 -0
- package/src/modules/search/application/usecases/indexPages.ts +15 -0
- package/src/modules/search/domain/events/index.ts +32 -0
- package/src/modules/search/domain/models/index.ts +1 -0
- package/src/modules/search/domain/operations/build-index.ts +6 -0
- package/src/modules/search/domain/operations/buildIndex.ts +70 -0
- package/src/modules/search/domain/operations/index.ts +7 -0
- package/src/modules/search/domain/operations/query.ts +186 -0
- package/src/modules/search/domain/validators/index.ts +32 -0
- package/src/modules/search/index.ts +9 -0
- package/src/modules/search/types/index.ts +22 -0
- package/src/modules/search/types/public.ts +1 -0
- package/src/modules/search-analytics/application/local-storage-adapter.ts +68 -0
- package/src/modules/search-analytics/domain/operations/search-analytics-operations.ts +74 -0
- package/src/modules/search-analytics/index.ts +8 -0
- package/src/modules/search-analytics/ports/search-analytics-port.ts +20 -0
- package/src/modules/search-analytics/types/search-analytics.ts +16 -0
- package/src/modules/search-highlighting/application/dom-highlighting-adapter.ts +36 -0
- package/src/modules/search-highlighting/domain/operations/highlighting-operations.ts +72 -0
- package/src/modules/search-highlighting/index.ts +8 -0
- package/src/modules/search-highlighting/ports/highlighting-port.ts +14 -0
- package/src/modules/search-highlighting/types/highlighting.ts +15 -0
- package/src/modules/seo-optimization/application/usecases/index.ts +18 -0
- package/src/modules/seo-optimization/domain/index.ts +12 -0
- package/src/modules/seo-optimization/domain/seoOperations.ts +92 -0
- package/src/modules/seo-optimization/index.ts +8 -0
- package/src/modules/seo-optimization/ports/index.ts +18 -0
- package/src/modules/seo-optimization/types/index.ts +41 -0
- package/src/modules/theme/application/css-theme-adapter.ts +50 -0
- package/src/modules/theme/domain/operations/theme-operations.ts +68 -0
- package/src/modules/theme/index.ts +8 -0
- package/src/modules/theme/ports/theme-port.ts +8 -0
- package/src/modules/theme/types/theme.ts +12 -0
- package/src/modules/toc/application/markdown-toc-adapter.ts +106 -0
- package/src/modules/toc/domain/operations/toc-operations.ts +92 -0
- package/src/modules/toc/index.ts +8 -0
- package/src/modules/toc/ports/toc-port.ts +21 -0
- package/src/modules/toc/types/toc.ts +17 -0
- package/src/modules/toc-generator/application/usecases/index.ts +30 -0
- package/src/modules/toc-generator/domain/index.ts +12 -0
- package/src/modules/toc-generator/domain/tocOperations.ts +104 -0
- package/src/modules/toc-generator/index.ts +9 -0
- package/src/modules/toc-generator/ports/index.ts +20 -0
- package/src/modules/toc-generator/types/index.ts +50 -0
- package/src/modules/version-control/domain/events/index.ts +39 -0
- package/src/modules/version-control/domain/models/index.ts +25 -0
- package/src/modules/version-control/domain/validators/index.ts +50 -0
- package/src/modules/versioning/application/fs-version-loader.ts +44 -0
- package/src/modules/versioning/domain/operations/versioning-operations.ts +80 -0
- package/src/modules/versioning/index.ts +8 -0
- package/src/modules/versioning/ports/version-loader-port.ts +18 -0
- package/src/modules/versioning/types/versioning.ts +17 -0
- package/src/modules/workflow/domain/events/index.ts +55 -0
- package/src/modules/workflow/domain/models/index.ts +40 -0
- package/src/modules/workflow/domain/validators/index.ts +50 -0
- package/src/modules/yaml-parser/application/js-yaml-adapter.ts +34 -0
- package/src/modules/yaml-parser/domain/operations/parse-yaml.ts +58 -0
- package/src/modules/yaml-parser/index.ts +7 -0
- package/src/modules/yaml-parser/ports/yaml-parser-port.ts +18 -0
- package/src/navigation/index.ts +9 -0
- package/src/plugin/index.ts +4 -0
- package/src/presentation/index.ts +1 -0
- package/src/presentation/live-editor/index.ts +22 -0
- package/src/presentation/live-editor/live-editor-component.ts +219 -0
- package/src/presentation/live-editor/virtual-module.ts +16 -0
- package/src/presentation/solid/CodeBlock.tsx +120 -0
- package/src/presentation/solid/Toc.tsx +58 -0
- package/src/presentation/solid/index.ts +11 -0
- package/src/presentation/vite-plugin/docs-plugin.ts +212 -0
- package/src/presentation/vite-plugin/index.ts +9 -0
- package/src/presentation/vite-plugin/transform-markdown.ts +26 -0
- package/src/runtime/analytics.ts +59 -0
- package/src/runtime/api-diff.ts +115 -0
- package/src/runtime/app.tsx +32 -0
- package/src/runtime/components/AccentPicker.tsx +114 -0
- package/src/runtime/components/ApiPlayground.tsx +332 -0
- package/src/runtime/components/AskAiDialog.tsx +127 -0
- package/src/runtime/components/BackToTop.tsx +38 -0
- package/src/runtime/components/Banner.tsx +75 -0
- package/src/runtime/components/Breadcrumbs.tsx +42 -0
- package/src/runtime/components/CollectionDropdown.tsx +85 -0
- package/src/runtime/components/CustomizeDrawer.tsx +195 -0
- package/src/runtime/components/DocMarkdown.tsx +579 -0
- package/src/runtime/components/DocPrevNext.tsx +54 -0
- package/src/runtime/components/DocToc.tsx +147 -0
- package/src/runtime/components/DocsDropdown.tsx +184 -0
- package/src/runtime/components/Footer.tsx +52 -0
- package/src/runtime/components/GitHubAuth.tsx +82 -0
- package/src/runtime/components/GitHubStats.tsx +73 -0
- package/src/runtime/components/Head.tsx +225 -0
- package/src/runtime/components/LocaleDropdown.tsx +75 -0
- package/src/runtime/components/MobileBottomNav.tsx +111 -0
- package/src/runtime/components/NotFound.tsx +139 -0
- package/src/runtime/components/PageActions.tsx +144 -0
- package/src/runtime/components/RelatedDocs.tsx +50 -0
- package/src/runtime/components/ScrollProgress.tsx +32 -0
- package/src/runtime/components/SearchPalette.tsx +333 -0
- package/src/runtime/components/ShowcaseCard.tsx +87 -0
- package/src/runtime/components/SidebarNav.tsx +237 -0
- package/src/runtime/components/Skeleton.tsx +39 -0
- package/src/runtime/components/ThemeToggle.tsx +26 -0
- package/src/runtime/components/TopNav.tsx +270 -0
- package/src/runtime/components/VersionDropdown.tsx +189 -0
- package/src/runtime/components/markdown/components.ts +280 -0
- package/src/runtime/config.ts +225 -0
- package/src/runtime/content.ts +451 -0
- package/src/runtime/context.tsx +30 -0
- package/src/runtime/data.ts +93 -0
- package/src/runtime/github.ts +226 -0
- package/src/runtime/icons.ts +32 -0
- package/src/runtime/index.ts +153 -0
- package/src/runtime/layouts/DocsLayout.tsx +144 -0
- package/src/runtime/markdown-content.css +996 -0
- package/src/runtime/pages/AbTestPage.tsx +88 -0
- package/src/runtime/pages/AnalyticsPage.tsx +90 -0
- package/src/runtime/pages/ApiDiffPage.tsx +86 -0
- package/src/runtime/pages/ApiEndpointPage.tsx +248 -0
- package/src/runtime/pages/BuilderPage.tsx +150 -0
- package/src/runtime/pages/ChangelogPage.tsx +210 -0
- package/src/runtime/pages/CollectionPage.tsx +140 -0
- package/src/runtime/pages/CommunityPage.tsx +384 -0
- package/src/runtime/pages/CreatePage.tsx +448 -0
- package/src/runtime/pages/DocPage.tsx +193 -0
- package/src/runtime/pages/EditPage.tsx +201 -0
- package/src/runtime/pages/HomePage.tsx +187 -0
- package/src/runtime/pages/IssuesPage.tsx +140 -0
- package/src/runtime/pages/OAuthCallbackPage.tsx +80 -0
- package/src/runtime/pages/PluginsPage.tsx +249 -0
- package/src/runtime/pages/ShowcasePage.tsx +202 -0
- package/src/runtime/pwa.ts +39 -0
- package/src/runtime/router.tsx +192 -0
- package/src/runtime/seo.ts +192 -0
- package/src/runtime/theme.css +175 -0
- package/src/runtime/theme.ts +224 -0
- package/src/runtime/types.ts +217 -0
- package/src/search/index.ts +6 -0
- package/src/seo-optimization/index.ts +4 -0
- package/src/shared/constants/index.ts +26 -0
- package/src/shared/errors/index.ts +195 -0
- package/src/shared/index.ts +27 -0
- package/src/shared/types/brand.ts +14 -0
- package/src/shared/types/client.d.ts +45 -0
- package/src/shared/types/either.ts +38 -0
- package/src/shared/types/index.ts +42 -0
- package/src/shared/types/option.ts +52 -0
- package/src/shared/types/result.ts +81 -0
- package/src/shared/utils/array.ts +97 -0
- package/src/shared/utils/index.ts +46 -0
- package/src/shared/utils/object.ts +47 -0
- package/src/shared/utils/string.ts +74 -0
- package/src/toc-generator/index.ts +1 -0
- package/src/types/js-yaml.d.ts +42 -0
- package/src/worker.ts +462 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locale types for i18n support.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type Locale = string;
|
|
6
|
+
|
|
7
|
+
export type LocaleConfig = {
|
|
8
|
+
readonly defaultLocale: Locale;
|
|
9
|
+
readonly locales: readonly Locale[];
|
|
10
|
+
readonly localePaths: Readonly<Record<Locale, string>>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type LocalizedDocPage = {
|
|
14
|
+
readonly locale: Locale;
|
|
15
|
+
readonly slug: string;
|
|
16
|
+
readonly originalSlug: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sharp adapter implementation.
|
|
3
|
+
* Provides image optimization using the sharp library.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { configError, ioError } from "@create-docs/shared/errors";
|
|
7
|
+
import type { ImageOptimizerPort } from "../ports/image-optimizer-port";
|
|
8
|
+
import type { ImageConfig } from "../types/image";
|
|
9
|
+
|
|
10
|
+
const SHARP_MISSING_ERROR =
|
|
11
|
+
"sharp is not installed. Image optimization requires the sharp package and native image libraries.";
|
|
12
|
+
|
|
13
|
+
const validateImageConfig = (config: unknown): ImageConfig => {
|
|
14
|
+
const cfg = config as Partial<ImageConfig> | undefined;
|
|
15
|
+
|
|
16
|
+
if (!cfg?.formats?.length) {
|
|
17
|
+
throw configError("Image optimization config requires formats", {
|
|
18
|
+
context: { config: cfg },
|
|
19
|
+
hint: "Provide formats (e.g. ['webp']).",
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!cfg?.widths?.length) {
|
|
24
|
+
throw configError("Image optimization config requires widths", {
|
|
25
|
+
context: { config: cfg },
|
|
26
|
+
hint: "Provide widths (e.g. [640, 1024]).",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (cfg.quality == null || cfg.quality < 1 || cfg.quality > 100) {
|
|
31
|
+
throw configError(
|
|
32
|
+
"Image optimization config requires a quality between 1 and 100",
|
|
33
|
+
{
|
|
34
|
+
context: { config: cfg },
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return cfg as ImageConfig;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const createSharpAdapter = (): ImageOptimizerPort => ({
|
|
43
|
+
optimize: async (imagePath: string, config?: unknown) => {
|
|
44
|
+
try {
|
|
45
|
+
validateImageConfig(config);
|
|
46
|
+
throw ioError(imagePath, SHARP_MISSING_ERROR);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (error && typeof error === "object" && "kind" in error) {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
throw ioError(imagePath, SHARP_MISSING_ERROR);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
getMetadata: async (imagePath: string) => {
|
|
56
|
+
throw ioError(imagePath, SHARP_MISSING_ERROR);
|
|
57
|
+
},
|
|
58
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain events for image optimization
|
|
3
|
+
*/
|
|
4
|
+
export interface OptimizationStartedEvent {
|
|
5
|
+
readonly type: "OPTIMIZATION_STARTED";
|
|
6
|
+
readonly timestamp: number;
|
|
7
|
+
readonly imagePath: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface OptimizationCompletedEvent {
|
|
11
|
+
readonly type: "OPTIMIZATION_COMPLETED";
|
|
12
|
+
readonly timestamp: number;
|
|
13
|
+
readonly imagePath: string;
|
|
14
|
+
readonly sizeReduction: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type ImageOptimizationDomainEvent =
|
|
18
|
+
| OptimizationStartedEvent
|
|
19
|
+
| OptimizationCompletedEvent;
|
|
20
|
+
|
|
21
|
+
export const createOptimizationStartedEvent = (
|
|
22
|
+
imagePath: string,
|
|
23
|
+
now: number = Date.now(),
|
|
24
|
+
): OptimizationStartedEvent => ({
|
|
25
|
+
type: "OPTIMIZATION_STARTED",
|
|
26
|
+
timestamp: now,
|
|
27
|
+
imagePath,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export const createOptimizationCompletedEvent = (
|
|
31
|
+
imagePath: string,
|
|
32
|
+
sizeReduction: number,
|
|
33
|
+
now: number = Date.now(),
|
|
34
|
+
): OptimizationCompletedEvent => ({
|
|
35
|
+
type: "OPTIMIZATION_COMPLETED",
|
|
36
|
+
timestamp: now,
|
|
37
|
+
imagePath,
|
|
38
|
+
sizeReduction,
|
|
39
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain models for image optimization
|
|
3
|
+
*/
|
|
4
|
+
export interface ImageOptimization {
|
|
5
|
+
readonly originalPath: string;
|
|
6
|
+
readonly optimizedPath: string;
|
|
7
|
+
readonly originalSize: number;
|
|
8
|
+
readonly optimizedSize: number;
|
|
9
|
+
readonly format: "webp" | "avif" | "png" | "jpg";
|
|
10
|
+
readonly quality: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const createImageOptimization = (
|
|
14
|
+
originalPath: string,
|
|
15
|
+
optimizedPath: string,
|
|
16
|
+
originalSize: number,
|
|
17
|
+
optimizedSize: number,
|
|
18
|
+
format: ImageOptimization["format"],
|
|
19
|
+
quality: number,
|
|
20
|
+
): ImageOptimization => ({
|
|
21
|
+
originalPath,
|
|
22
|
+
optimizedPath,
|
|
23
|
+
originalSize,
|
|
24
|
+
optimizedSize,
|
|
25
|
+
format,
|
|
26
|
+
quality,
|
|
27
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure image optimization operations.
|
|
3
|
+
* No I/O. No exceptions thrown. Returns Result types.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Result } from "@create-docs/shared/types";
|
|
7
|
+
import { err, ok } from "@create-docs/shared/types";
|
|
8
|
+
import type { ImageConfig, OptimizedImage } from "../../types/image";
|
|
9
|
+
|
|
10
|
+
export type ImageOptimizationError = {
|
|
11
|
+
readonly kind: "image-optimization-error";
|
|
12
|
+
readonly message: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generate srcset for responsive images.
|
|
17
|
+
*/
|
|
18
|
+
export const generateSrcset = (
|
|
19
|
+
baseSrc: string,
|
|
20
|
+
widths: readonly number[],
|
|
21
|
+
): string => {
|
|
22
|
+
return widths.map((width) => `${baseSrc}?w=${width} ${width}w`).join(", ");
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Calculate aspect ratio from dimensions.
|
|
27
|
+
*/
|
|
28
|
+
export const calculateAspectRatio = (width: number, height: number): number => {
|
|
29
|
+
return width / height;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Validate image config.
|
|
34
|
+
*/
|
|
35
|
+
export const validateImageConfig = (config: ImageConfig): boolean => {
|
|
36
|
+
if (config.formats.length === 0) return false;
|
|
37
|
+
if (config.widths.length === 0) return false;
|
|
38
|
+
if (config.quality < 0 || config.quality > 100) return false;
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Process image metadata.
|
|
44
|
+
*/
|
|
45
|
+
export const processImageMetadata = (
|
|
46
|
+
_metadata: unknown,
|
|
47
|
+
_config: ImageConfig,
|
|
48
|
+
): Result<OptimizedImage, ImageOptimizationError> => {
|
|
49
|
+
try {
|
|
50
|
+
// This will be implemented via adapter
|
|
51
|
+
// For now, return a basic optimized image
|
|
52
|
+
return ok({
|
|
53
|
+
src: "",
|
|
54
|
+
srcset: "",
|
|
55
|
+
width: 0,
|
|
56
|
+
height: 0,
|
|
57
|
+
format: "webp",
|
|
58
|
+
});
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return err({
|
|
61
|
+
kind: "image-optimization-error",
|
|
62
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Image Optimization Domain Schemas - Arktype validation schemas
|
|
2
|
+
// Following /follow-arktype workflow for type-safe runtime validation
|
|
3
|
+
|
|
4
|
+
import { type Type, type } from "arktype";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Image Path Schema
|
|
8
|
+
*/
|
|
9
|
+
export const imagePathSchema: Type = type("string >= 1");
|
|
10
|
+
|
|
11
|
+
export type ImagePath = typeof imagePathSchema.infer;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Quality Schema
|
|
15
|
+
*/
|
|
16
|
+
export const qualitySchema: Type = type("number >= 0").narrow(
|
|
17
|
+
(quality: number) => quality <= 100,
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
export type Quality = typeof qualitySchema.infer;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Validation errors
|
|
24
|
+
*/
|
|
25
|
+
export class ValidationError extends Error {
|
|
26
|
+
constructor(message: string) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "ValidationError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Validate image path using Arktype
|
|
34
|
+
*/
|
|
35
|
+
export const validateImagePath = (path: unknown): ImagePath => {
|
|
36
|
+
const result = imagePathSchema(path);
|
|
37
|
+
if (result instanceof type.errors) {
|
|
38
|
+
throw new ValidationError("Image path must be a non-empty string");
|
|
39
|
+
}
|
|
40
|
+
return result as ImagePath;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Validate quality using Arktype
|
|
45
|
+
*/
|
|
46
|
+
export const validateQuality = (quality: unknown): Quality => {
|
|
47
|
+
const result = qualitySchema(quality);
|
|
48
|
+
if (result instanceof type.errors) {
|
|
49
|
+
throw new ValidationError("Quality must be a number between 0 and 100");
|
|
50
|
+
}
|
|
51
|
+
return result as Quality;
|
|
52
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port for image optimization operations.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type ImageOptimizerPort = {
|
|
6
|
+
/**
|
|
7
|
+
* Optimize image with specified formats and widths.
|
|
8
|
+
*/
|
|
9
|
+
readonly optimize: (imagePath: string, config: unknown) => Promise<unknown>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get image metadata.
|
|
13
|
+
*/
|
|
14
|
+
readonly getMetadata: (imagePath: string) => Promise<unknown>;
|
|
15
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image optimization types for image processing pipeline.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type ImageConfig = {
|
|
6
|
+
readonly formats: readonly ("webp" | "avif" | "jpeg" | "png")[];
|
|
7
|
+
readonly widths: readonly number[];
|
|
8
|
+
readonly quality: number;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type OptimizedImage = {
|
|
12
|
+
readonly src: string;
|
|
13
|
+
readonly srcset: string;
|
|
14
|
+
readonly width: number;
|
|
15
|
+
readonly height: number;
|
|
16
|
+
readonly format: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live Editor Use Cases
|
|
3
|
+
*
|
|
4
|
+
* Orchestration layer for live editor operations
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { CommitOptions, GitAdapter, PushOptions } from "../../ports";
|
|
8
|
+
import type { EditorState } from "../../types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Load editor state
|
|
12
|
+
*/
|
|
13
|
+
export const loadEditorState = async (
|
|
14
|
+
git: GitAdapter,
|
|
15
|
+
_filePath: string,
|
|
16
|
+
): Promise<EditorState> => {
|
|
17
|
+
try {
|
|
18
|
+
const gitStatus = await git.getStatus();
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
mode: "split",
|
|
22
|
+
currentFile: null, // Will be loaded separately
|
|
23
|
+
gitStatus,
|
|
24
|
+
loading: false,
|
|
25
|
+
};
|
|
26
|
+
} catch (error) {
|
|
27
|
+
return {
|
|
28
|
+
mode: "split",
|
|
29
|
+
currentFile: null,
|
|
30
|
+
gitStatus: null,
|
|
31
|
+
loading: false,
|
|
32
|
+
error: error instanceof Error ? error.message : String(error),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Commit and push changes
|
|
39
|
+
*/
|
|
40
|
+
export const commitAndPush = async (
|
|
41
|
+
git: GitAdapter,
|
|
42
|
+
options: CommitOptions & { push?: boolean; pushOptions?: PushOptions },
|
|
43
|
+
): Promise<void> => {
|
|
44
|
+
await git.commit(options);
|
|
45
|
+
|
|
46
|
+
if (options.push) {
|
|
47
|
+
await git.push(options.pushOptions);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Save file
|
|
53
|
+
*/
|
|
54
|
+
export const saveFile = async (
|
|
55
|
+
fileSystem: { writeFile: (path: string, content: string) => Promise<void> },
|
|
56
|
+
filePath: string,
|
|
57
|
+
content: string,
|
|
58
|
+
): Promise<void> => {
|
|
59
|
+
await fileSystem.writeFile(filePath, content);
|
|
60
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain events for live editor
|
|
3
|
+
*/
|
|
4
|
+
export interface ContentChangedEvent {
|
|
5
|
+
readonly type: "CONTENT_CHANGED";
|
|
6
|
+
readonly timestamp: number;
|
|
7
|
+
readonly contentLength: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface CursorMovedEvent {
|
|
11
|
+
readonly type: "CURSOR_MOVED";
|
|
12
|
+
readonly timestamp: number;
|
|
13
|
+
readonly line: number;
|
|
14
|
+
readonly column: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type LiveEditorDomainEvent = ContentChangedEvent | CursorMovedEvent;
|
|
18
|
+
|
|
19
|
+
export const createContentChangedEvent = (
|
|
20
|
+
contentLength: number,
|
|
21
|
+
now: number = Date.now(),
|
|
22
|
+
): ContentChangedEvent => ({
|
|
23
|
+
type: "CONTENT_CHANGED",
|
|
24
|
+
timestamp: now,
|
|
25
|
+
contentLength,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const createCursorMovedEvent = (
|
|
29
|
+
line: number,
|
|
30
|
+
column: number,
|
|
31
|
+
now: number = Date.now(),
|
|
32
|
+
): CursorMovedEvent => ({
|
|
33
|
+
type: "CURSOR_MOVED",
|
|
34
|
+
timestamp: now,
|
|
35
|
+
line,
|
|
36
|
+
column,
|
|
37
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Operations
|
|
3
|
+
*
|
|
4
|
+
* Pure functions for Git operations using simple-git
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { SimpleGit } from "simple-git";
|
|
8
|
+
import type { CommitOptions, GitStatus, PushOptions } from "../types";
|
|
9
|
+
|
|
10
|
+
interface GitFile {
|
|
11
|
+
path: string;
|
|
12
|
+
index: string;
|
|
13
|
+
working_dir: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get current branch name
|
|
18
|
+
*/
|
|
19
|
+
export const getCurrentBranch = async (git: SimpleGit): Promise<string> => {
|
|
20
|
+
const branch = await git.branch();
|
|
21
|
+
return branch.current;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get git status
|
|
26
|
+
*/
|
|
27
|
+
export const getGitStatus = async (git: SimpleGit): Promise<GitStatus> => {
|
|
28
|
+
const status = await git.status();
|
|
29
|
+
const branch = await getCurrentBranch(git);
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
branch,
|
|
33
|
+
hasChanges: status.files.length > 0,
|
|
34
|
+
untracked: status.files
|
|
35
|
+
.filter((f: GitFile) => f.working_dir === "?")
|
|
36
|
+
.map((f: GitFile) => f.path),
|
|
37
|
+
modified: status.files
|
|
38
|
+
.filter((f: GitFile) => f.working_dir === "M")
|
|
39
|
+
.map((f: GitFile) => f.path),
|
|
40
|
+
staged: status.files
|
|
41
|
+
.filter((f: GitFile) => f.index === "M")
|
|
42
|
+
.map((f: GitFile) => f.path),
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Commit changes
|
|
48
|
+
*/
|
|
49
|
+
export const commitChanges = async (
|
|
50
|
+
git: SimpleGit,
|
|
51
|
+
options: CommitOptions,
|
|
52
|
+
): Promise<void> => {
|
|
53
|
+
await git.add(".");
|
|
54
|
+
if (options.author && options.email) {
|
|
55
|
+
await git.commit([
|
|
56
|
+
options.message,
|
|
57
|
+
"--author",
|
|
58
|
+
`${options.author} <${options.email}>`,
|
|
59
|
+
]);
|
|
60
|
+
} else {
|
|
61
|
+
await git.commit(options.message);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Push changes
|
|
67
|
+
*/
|
|
68
|
+
export const pushChanges = async (
|
|
69
|
+
git: SimpleGit,
|
|
70
|
+
options: PushOptions = {},
|
|
71
|
+
): Promise<void> => {
|
|
72
|
+
const remote = options.remote || "origin";
|
|
73
|
+
const branch = options.branch || (await getCurrentBranch(git));
|
|
74
|
+
|
|
75
|
+
if (options.force) {
|
|
76
|
+
await git.push(["--force", remote, branch]);
|
|
77
|
+
} else {
|
|
78
|
+
await git.push(remote, branch);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Stage file
|
|
84
|
+
*/
|
|
85
|
+
export const stageFile = async (
|
|
86
|
+
git: SimpleGit,
|
|
87
|
+
path: string,
|
|
88
|
+
): Promise<void> => {
|
|
89
|
+
await git.add(path);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Unstage file
|
|
94
|
+
*/
|
|
95
|
+
export const unstageFile = async (
|
|
96
|
+
git: SimpleGit,
|
|
97
|
+
path: string,
|
|
98
|
+
): Promise<void> => {
|
|
99
|
+
await git.reset(["--mixed", path]);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Discard changes
|
|
104
|
+
*/
|
|
105
|
+
export const discardChanges = async (
|
|
106
|
+
git: SimpleGit,
|
|
107
|
+
path: string,
|
|
108
|
+
): Promise<void> => {
|
|
109
|
+
await git.checkout(["--", path]);
|
|
110
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain models for live editor
|
|
3
|
+
*/
|
|
4
|
+
export interface EditorState {
|
|
5
|
+
readonly content: string;
|
|
6
|
+
readonly language: string;
|
|
7
|
+
readonly cursorPosition: { line: number; column: number };
|
|
8
|
+
readonly selection?: { start: number; end: number };
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const createEditorState = (
|
|
12
|
+
content: string,
|
|
13
|
+
language: string,
|
|
14
|
+
cursorPosition: { line: number; column: number },
|
|
15
|
+
options?: { selection?: { start: number; end: number } },
|
|
16
|
+
): EditorState => ({
|
|
17
|
+
content,
|
|
18
|
+
language,
|
|
19
|
+
cursorPosition,
|
|
20
|
+
selection: options?.selection,
|
|
21
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Live Editor Domain Schemas - Arktype validation schemas
|
|
2
|
+
// Following /follow-arktype workflow for type-safe runtime validation
|
|
3
|
+
|
|
4
|
+
import { type Type, type } from "arktype";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Content Schema
|
|
8
|
+
*/
|
|
9
|
+
export const contentSchema: Type = type("string");
|
|
10
|
+
|
|
11
|
+
export type Content = typeof contentSchema.infer;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Cursor Position Schema
|
|
15
|
+
*/
|
|
16
|
+
export const cursorPositionSchema: Type = type({
|
|
17
|
+
line: "number >= 0",
|
|
18
|
+
column: "number >= 0",
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type CursorPosition = typeof cursorPositionSchema.infer;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Validation errors
|
|
25
|
+
*/
|
|
26
|
+
export class ValidationError extends Error {
|
|
27
|
+
constructor(message: string) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "ValidationError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Validate content using Arktype
|
|
35
|
+
*/
|
|
36
|
+
export const validateContent = (content: unknown): Content => {
|
|
37
|
+
const result = contentSchema(content);
|
|
38
|
+
if (result instanceof type.errors) {
|
|
39
|
+
throw new ValidationError("Content must be a string");
|
|
40
|
+
}
|
|
41
|
+
return result as Content;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Validate cursor position using Arktype
|
|
46
|
+
*/
|
|
47
|
+
export const validateCursorPosition = (position: unknown): CursorPosition => {
|
|
48
|
+
const result = cursorPositionSchema(position);
|
|
49
|
+
if (result instanceof type.errors) {
|
|
50
|
+
throw new ValidationError(
|
|
51
|
+
"Cursor position must be a valid object with line and column",
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
return result as CursorPosition;
|
|
55
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live Editor Module
|
|
3
|
+
*
|
|
4
|
+
* Live editor with Git integration for documentation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
commitAndPush,
|
|
9
|
+
loadEditorState,
|
|
10
|
+
saveFile,
|
|
11
|
+
} from "./application/usecases";
|
|
12
|
+
export * from "./domain";
|
|
13
|
+
export * from "./ports";
|
|
14
|
+
export * from "./types";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live Editor Ports
|
|
3
|
+
*
|
|
4
|
+
* Module-specific interfaces for live editor
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
CommitOptions,
|
|
9
|
+
FileContent,
|
|
10
|
+
GitStatus,
|
|
11
|
+
PushOptions,
|
|
12
|
+
} from "../types";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Git adapter interface
|
|
16
|
+
*/
|
|
17
|
+
export interface GitAdapter {
|
|
18
|
+
/** Get current branch */
|
|
19
|
+
getCurrentBranch(): Promise<string>;
|
|
20
|
+
/** Get git status */
|
|
21
|
+
getStatus(): Promise<GitStatus>;
|
|
22
|
+
/** Commit changes */
|
|
23
|
+
commit(options: CommitOptions): Promise<void>;
|
|
24
|
+
/** Push changes */
|
|
25
|
+
push(options?: PushOptions): Promise<void>;
|
|
26
|
+
/** Stage file */
|
|
27
|
+
stageFile(path: string): Promise<void>;
|
|
28
|
+
/** Unstage file */
|
|
29
|
+
unstageFile(path: string): Promise<void>;
|
|
30
|
+
/** Discard changes */
|
|
31
|
+
discardChanges(path: string): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* File system adapter interface
|
|
36
|
+
*/
|
|
37
|
+
export interface FileSystemAdapter {
|
|
38
|
+
/** Read file */
|
|
39
|
+
readFile(path: string): Promise<string>;
|
|
40
|
+
/** Write file */
|
|
41
|
+
writeFile(path: string, content: string): Promise<void>;
|
|
42
|
+
/** Watch file */
|
|
43
|
+
watchFile(path: string, callback: (content: string) => void): () => void;
|
|
44
|
+
/** Get file stats */
|
|
45
|
+
getFileStats(path: string): Promise<{ mtimeMs: number; size: number }>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Re-export types for convenience
|
|
49
|
+
export type { CommitOptions, FileContent, GitStatus, PushOptions };
|