@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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port for TOC operations.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type TocPort = {
|
|
6
|
+
/**
|
|
7
|
+
* Extract headings from markdown content.
|
|
8
|
+
*/
|
|
9
|
+
readonly extractHeadings: (
|
|
10
|
+
content: string,
|
|
11
|
+
config: unknown,
|
|
12
|
+
) => Promise<readonly unknown[]>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generate TOC from headings.
|
|
16
|
+
*/
|
|
17
|
+
readonly generateToc: (
|
|
18
|
+
headings: readonly unknown[],
|
|
19
|
+
config: unknown,
|
|
20
|
+
) => Promise<unknown>;
|
|
21
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table of Contents types for enhanced TOC features.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type TocConfig = {
|
|
6
|
+
readonly enabled: boolean;
|
|
7
|
+
readonly maxDepth: number;
|
|
8
|
+
readonly minHeadingLevel: number;
|
|
9
|
+
readonly includeSubheadings: boolean;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type TocItemEnhanced = {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly text: string;
|
|
15
|
+
readonly level: number;
|
|
16
|
+
children?: TocItemEnhanced[];
|
|
17
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOC Generator Use Cases
|
|
3
|
+
*
|
|
4
|
+
* Orchestration layer for TOC generation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { buildTocTree, flattenToc, parseHeadings } from "../../domain";
|
|
8
|
+
import type { TocItem, TocOptions } from "../../types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generate TOC from markdown content
|
|
12
|
+
*/
|
|
13
|
+
export const generateToc = (
|
|
14
|
+
content: string,
|
|
15
|
+
options: TocOptions = {},
|
|
16
|
+
): TocItem[] => {
|
|
17
|
+
const headings = parseHeadings(content);
|
|
18
|
+
return buildTocTree(headings, options);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Generate flat TOC from markdown content
|
|
23
|
+
*/
|
|
24
|
+
export const generateFlatToc = (
|
|
25
|
+
content: string,
|
|
26
|
+
options: TocOptions = {},
|
|
27
|
+
): TocItem[] => {
|
|
28
|
+
const toc = generateToc(content, options);
|
|
29
|
+
return flattenToc(toc);
|
|
30
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOC Operations
|
|
3
|
+
*
|
|
4
|
+
* Pure functions for table of contents generation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Heading, TocItem, TocOptions } from "../types";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Parse headings from markdown content
|
|
11
|
+
*/
|
|
12
|
+
export const parseHeadings = (content: string): Heading[] => {
|
|
13
|
+
const headings: Heading[] = [];
|
|
14
|
+
const lines = content.split("\n");
|
|
15
|
+
|
|
16
|
+
for (const line of lines) {
|
|
17
|
+
const match = line.match(/^(#{1,6})\s+(.+)$/);
|
|
18
|
+
if (match) {
|
|
19
|
+
headings.push({
|
|
20
|
+
text: match[2].trim(),
|
|
21
|
+
level: match[1].length,
|
|
22
|
+
line: lines.indexOf(line) + 1,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return headings;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Generate slug from text
|
|
32
|
+
*/
|
|
33
|
+
export const generateSlug = (text: string): string => {
|
|
34
|
+
return text
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/[^\w\s-]/g, "")
|
|
37
|
+
.replace(/\s+/g, "-")
|
|
38
|
+
.replace(/-+/g, "-")
|
|
39
|
+
.replace(/^-|-$/g, "");
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Build TOC tree from headings
|
|
44
|
+
*/
|
|
45
|
+
export const buildTocTree = (
|
|
46
|
+
headings: Heading[],
|
|
47
|
+
options: TocOptions = {},
|
|
48
|
+
): TocItem[] => {
|
|
49
|
+
const { maxDepth = 6, minDepth = 1, include = [], exclude = [] } = options;
|
|
50
|
+
|
|
51
|
+
const filteredHeadings = headings.filter((heading) => {
|
|
52
|
+
if (heading.level < minDepth || heading.level > maxDepth) return false;
|
|
53
|
+
if (include.length > 0 && !include.includes(heading.text)) return false;
|
|
54
|
+
if (exclude.length > 0 && exclude.includes(heading.text)) return false;
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const root: TocItem[] = [];
|
|
59
|
+
const stack: { item: TocItem; level: number }[] = [];
|
|
60
|
+
|
|
61
|
+
for (const heading of filteredHeadings) {
|
|
62
|
+
const item: TocItem = {
|
|
63
|
+
text: heading.text,
|
|
64
|
+
level: heading.level,
|
|
65
|
+
id: generateSlug(heading.text),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Pop stack until we find the parent
|
|
69
|
+
while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {
|
|
70
|
+
stack.pop();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (stack.length === 0) {
|
|
74
|
+
root.push(item);
|
|
75
|
+
} else {
|
|
76
|
+
const parent = stack[stack.length - 1].item;
|
|
77
|
+
if (!parent.children) parent.children = [];
|
|
78
|
+
parent.children.push(item);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
stack.push({ item, level: heading.level });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return root;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Flatten TOC tree to list
|
|
89
|
+
*/
|
|
90
|
+
export const flattenToc = (toc: TocItem[]): TocItem[] => {
|
|
91
|
+
const result: TocItem[] = [];
|
|
92
|
+
|
|
93
|
+
const traverse = (items: TocItem[]) => {
|
|
94
|
+
for (const item of items) {
|
|
95
|
+
result.push(item);
|
|
96
|
+
if (item.children) {
|
|
97
|
+
traverse(item.children);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
traverse(toc);
|
|
103
|
+
return result;
|
|
104
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOC Generator Ports
|
|
3
|
+
*
|
|
4
|
+
* Module-specific interfaces for TOC generation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { TocItem, TocOptions } from "../types";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Content parser interface
|
|
11
|
+
*/
|
|
12
|
+
export interface ContentParser {
|
|
13
|
+
/** Parse content and return headings */
|
|
14
|
+
parseHeadings(
|
|
15
|
+
content: string,
|
|
16
|
+
): Promise<{ text: string; level: number; line: number }[]>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Re-export types for convenience
|
|
20
|
+
export type { TocItem, TocOptions };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOC Generator Types
|
|
3
|
+
*
|
|
4
|
+
* Domain types for table of contents generation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* TOC item
|
|
9
|
+
*/
|
|
10
|
+
export interface TocItem {
|
|
11
|
+
/** Heading text */
|
|
12
|
+
text: string;
|
|
13
|
+
/** Heading level (1-6) */
|
|
14
|
+
level: number;
|
|
15
|
+
/** Anchor ID */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Child items */
|
|
18
|
+
children?: TocItem[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* TOC options
|
|
23
|
+
*/
|
|
24
|
+
export interface TocOptions {
|
|
25
|
+
/** Max depth */
|
|
26
|
+
maxDepth?: number;
|
|
27
|
+
/** Min depth */
|
|
28
|
+
minDepth?: number;
|
|
29
|
+
/** Include headings */
|
|
30
|
+
include?: string[];
|
|
31
|
+
/** Exclude headings */
|
|
32
|
+
exclude?: string[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Heading
|
|
37
|
+
*/
|
|
38
|
+
export interface Heading {
|
|
39
|
+
/** Heading text */
|
|
40
|
+
text: string;
|
|
41
|
+
/** Heading level */
|
|
42
|
+
level: number;
|
|
43
|
+
/** Line number */
|
|
44
|
+
line: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Content parser port */
|
|
48
|
+
export interface ContentParser {
|
|
49
|
+
parse: (raw: string) => unknown;
|
|
50
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain events for version control
|
|
3
|
+
*/
|
|
4
|
+
export interface VersionCreatedEvent {
|
|
5
|
+
readonly type: "VERSION_CREATED";
|
|
6
|
+
readonly timestamp: number;
|
|
7
|
+
readonly versionNumber: string;
|
|
8
|
+
readonly author: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface VersionRestoredEvent {
|
|
12
|
+
readonly type: "VERSION_RESTORED";
|
|
13
|
+
readonly timestamp: number;
|
|
14
|
+
readonly versionNumber: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type VersionControlDomainEvent =
|
|
18
|
+
| VersionCreatedEvent
|
|
19
|
+
| VersionRestoredEvent;
|
|
20
|
+
|
|
21
|
+
export const createVersionCreatedEvent = (
|
|
22
|
+
versionNumber: string,
|
|
23
|
+
author: string,
|
|
24
|
+
now: number = Date.now(),
|
|
25
|
+
): VersionCreatedEvent => ({
|
|
26
|
+
type: "VERSION_CREATED",
|
|
27
|
+
timestamp: now,
|
|
28
|
+
versionNumber,
|
|
29
|
+
author,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const createVersionRestoredEvent = (
|
|
33
|
+
versionNumber: string,
|
|
34
|
+
now: number = Date.now(),
|
|
35
|
+
): VersionRestoredEvent => ({
|
|
36
|
+
type: "VERSION_RESTORED",
|
|
37
|
+
timestamp: now,
|
|
38
|
+
versionNumber,
|
|
39
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain models for version control
|
|
3
|
+
*/
|
|
4
|
+
export interface Version {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly number: string;
|
|
7
|
+
readonly timestamp: number;
|
|
8
|
+
readonly author: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const createVersion = (
|
|
13
|
+
id: string,
|
|
14
|
+
number: string,
|
|
15
|
+
author: string,
|
|
16
|
+
message: string,
|
|
17
|
+
options?: { timestamp?: number },
|
|
18
|
+
now: number = Date.now(),
|
|
19
|
+
): Version => ({
|
|
20
|
+
id,
|
|
21
|
+
number,
|
|
22
|
+
author,
|
|
23
|
+
message,
|
|
24
|
+
timestamp: options?.timestamp ?? now,
|
|
25
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Version Control 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
|
+
* Version Number Schema
|
|
8
|
+
*/
|
|
9
|
+
export const versionNumberSchema: Type = type(/^\d+\.\d+\.\d+$/);
|
|
10
|
+
|
|
11
|
+
export type VersionNumber = typeof versionNumberSchema.infer;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Author Schema
|
|
15
|
+
*/
|
|
16
|
+
export const authorSchema: Type = type("string >= 1");
|
|
17
|
+
|
|
18
|
+
export type Author = typeof authorSchema.infer;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Validation errors
|
|
22
|
+
*/
|
|
23
|
+
export class ValidationError extends Error {
|
|
24
|
+
constructor(message: string) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = "ValidationError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Validate version number using Arktype
|
|
32
|
+
*/
|
|
33
|
+
export const validateVersionNumber = (number: unknown): VersionNumber => {
|
|
34
|
+
const result = versionNumberSchema(number);
|
|
35
|
+
if (result instanceof type.errors) {
|
|
36
|
+
throw new ValidationError("Version number must be in format x.y.z");
|
|
37
|
+
}
|
|
38
|
+
return result as VersionNumber;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Validate author using Arktype
|
|
43
|
+
*/
|
|
44
|
+
export const validateAuthor = (author: unknown): Author => {
|
|
45
|
+
const result = authorSchema(author);
|
|
46
|
+
if (result instanceof type.errors) {
|
|
47
|
+
throw new ValidationError("Author must be a non-empty string");
|
|
48
|
+
}
|
|
49
|
+
return result as Author;
|
|
50
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File system adapter for version loading.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { readdir } from "node:fs/promises";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { ioError } from "@create-docs/shared/errors";
|
|
8
|
+
import type { VersionLoaderPort } from "../ports/version-loader-port";
|
|
9
|
+
|
|
10
|
+
export const createFsVersionLoader = (): VersionLoaderPort => ({
|
|
11
|
+
scanVersions: async (docsDir: string) => {
|
|
12
|
+
try {
|
|
13
|
+
const entries = await readdir(docsDir, { withFileTypes: true });
|
|
14
|
+
return entries
|
|
15
|
+
.filter((entry) => entry.isDirectory())
|
|
16
|
+
.map((entry) => entry.name);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
throw ioError(docsDir, "Failed to scan versions", error);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
loadVersionDocs: async (version: string, docsDir: string) => {
|
|
23
|
+
const versionDir = join(docsDir, version);
|
|
24
|
+
try {
|
|
25
|
+
const entries = await readdir(versionDir, {
|
|
26
|
+
withFileTypes: true,
|
|
27
|
+
recursive: true,
|
|
28
|
+
});
|
|
29
|
+
const results: string[] = [];
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
if (
|
|
32
|
+
entry.isFile() &&
|
|
33
|
+
(entry.name.endsWith(".md") || entry.name.endsWith(".mdoc"))
|
|
34
|
+
) {
|
|
35
|
+
const parentPath = entry.parentPath || versionDir;
|
|
36
|
+
results.push(join(parentPath, entry.name));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return results;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
throw ioError(versionDir, "Failed to load version docs", error);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure versioning operations.
|
|
3
|
+
* No I/O. No exceptions thrown.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
Version,
|
|
8
|
+
VersionConfig,
|
|
9
|
+
VersionedDocPage,
|
|
10
|
+
} from "../../types/versioning";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Extract version from a slug path.
|
|
14
|
+
* Example: "v1/getting-started/introduction" -> "v1"
|
|
15
|
+
*/
|
|
16
|
+
export const extractVersionFromSlug = (
|
|
17
|
+
slug: string,
|
|
18
|
+
versions: readonly Version[],
|
|
19
|
+
): Version | null => {
|
|
20
|
+
const parts = slug.split("/");
|
|
21
|
+
const firstPart = parts[0];
|
|
22
|
+
if (firstPart && versions.includes(firstPart)) {
|
|
23
|
+
return firstPart;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Remove version prefix from a slug.
|
|
30
|
+
* Example: "v1/getting-started/introduction" -> "getting-started/introduction"
|
|
31
|
+
*/
|
|
32
|
+
export const removeVersionFromSlug = (
|
|
33
|
+
slug: string,
|
|
34
|
+
version: Version,
|
|
35
|
+
): string => {
|
|
36
|
+
return slug.startsWith(`${version}/`) ? slug.slice(version.length + 1) : slug;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Add version prefix to a slug.
|
|
41
|
+
* Example: "getting-started/introduction" + "v1" -> "v1/getting-started/introduction"
|
|
42
|
+
*/
|
|
43
|
+
export const addVersionToSlug = (slug: string, version: Version): string => {
|
|
44
|
+
return `${version}/${slug}`;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Group doc pages by version.
|
|
49
|
+
*/
|
|
50
|
+
export const groupDocsByVersion = (
|
|
51
|
+
pages: readonly VersionedDocPage[],
|
|
52
|
+
): Readonly<Record<Version, readonly VersionedDocPage[]>> => {
|
|
53
|
+
const groups: Record<string, VersionedDocPage[]> = {};
|
|
54
|
+
for (const page of pages) {
|
|
55
|
+
const { version } = page;
|
|
56
|
+
if (!groups[version]) {
|
|
57
|
+
groups[version] = [];
|
|
58
|
+
}
|
|
59
|
+
groups[version].push(page);
|
|
60
|
+
}
|
|
61
|
+
return groups;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Validate version config.
|
|
66
|
+
*/
|
|
67
|
+
export const validateVersionConfig = (config: VersionConfig): boolean => {
|
|
68
|
+
if (
|
|
69
|
+
!config.defaultVersion ||
|
|
70
|
+
!config.versions.includes(config.defaultVersion)
|
|
71
|
+
) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
for (const version of config.versions) {
|
|
75
|
+
if (!config.versionPaths[version]) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API for the versioning module.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { createFsVersionLoader } from "./application/fs-version-loader";
|
|
6
|
+
export * from "./domain/operations/versioning-operations";
|
|
7
|
+
export * from "./ports/version-loader-port";
|
|
8
|
+
export * from "./types/versioning";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port for version loading operations.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type VersionLoaderPort = {
|
|
6
|
+
/**
|
|
7
|
+
* Scan docs directory for version-specific folders.
|
|
8
|
+
*/
|
|
9
|
+
readonly scanVersions: (docsDir: string) => Promise<readonly string[]>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Load docs for a specific version.
|
|
13
|
+
*/
|
|
14
|
+
readonly loadVersionDocs: (
|
|
15
|
+
version: string,
|
|
16
|
+
docsDir: string,
|
|
17
|
+
) => Promise<readonly string[]>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioning types for multi-version documentation support.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type Version = string;
|
|
6
|
+
|
|
7
|
+
export type VersionConfig = {
|
|
8
|
+
readonly defaultVersion: Version;
|
|
9
|
+
readonly versions: readonly Version[];
|
|
10
|
+
readonly versionPaths: Readonly<Record<Version, string>>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type VersionedDocPage = {
|
|
14
|
+
readonly version: Version;
|
|
15
|
+
readonly slug: string;
|
|
16
|
+
readonly originalSlug: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain events for workflow
|
|
3
|
+
*/
|
|
4
|
+
export interface WorkflowStartedEvent {
|
|
5
|
+
readonly type: "WORKFLOW_STARTED";
|
|
6
|
+
readonly timestamp: number;
|
|
7
|
+
readonly workflowId: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface WorkflowCompletedEvent {
|
|
11
|
+
readonly type: "WORKFLOW_COMPLETED";
|
|
12
|
+
readonly timestamp: number;
|
|
13
|
+
readonly workflowId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface StepCompletedEvent {
|
|
17
|
+
readonly type: "STEP_COMPLETED";
|
|
18
|
+
readonly timestamp: number;
|
|
19
|
+
readonly workflowId: string;
|
|
20
|
+
readonly stepId: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type WorkflowDomainEvent =
|
|
24
|
+
| WorkflowStartedEvent
|
|
25
|
+
| WorkflowCompletedEvent
|
|
26
|
+
| StepCompletedEvent;
|
|
27
|
+
|
|
28
|
+
export const createWorkflowStartedEvent = (
|
|
29
|
+
workflowId: string,
|
|
30
|
+
now: number = Date.now(),
|
|
31
|
+
): WorkflowStartedEvent => ({
|
|
32
|
+
type: "WORKFLOW_STARTED",
|
|
33
|
+
timestamp: now,
|
|
34
|
+
workflowId,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export const createWorkflowCompletedEvent = (
|
|
38
|
+
workflowId: string,
|
|
39
|
+
now: number = Date.now(),
|
|
40
|
+
): WorkflowCompletedEvent => ({
|
|
41
|
+
type: "WORKFLOW_COMPLETED",
|
|
42
|
+
timestamp: now,
|
|
43
|
+
workflowId,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export const createStepCompletedEvent = (
|
|
47
|
+
workflowId: string,
|
|
48
|
+
stepId: string,
|
|
49
|
+
now: number = Date.now(),
|
|
50
|
+
): StepCompletedEvent => ({
|
|
51
|
+
type: "STEP_COMPLETED",
|
|
52
|
+
timestamp: now,
|
|
53
|
+
workflowId,
|
|
54
|
+
stepId,
|
|
55
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain models for workflow
|
|
3
|
+
*/
|
|
4
|
+
export interface WorkflowStep {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly description: string;
|
|
8
|
+
readonly status: "pending" | "in-progress" | "completed" | "failed";
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface Workflow {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly steps: readonly WorkflowStep[];
|
|
15
|
+
readonly currentStepIndex: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const createWorkflowStep = (
|
|
19
|
+
id: string,
|
|
20
|
+
name: string,
|
|
21
|
+
description: string,
|
|
22
|
+
status: WorkflowStep["status"] = "pending",
|
|
23
|
+
): WorkflowStep => ({
|
|
24
|
+
id,
|
|
25
|
+
name,
|
|
26
|
+
description,
|
|
27
|
+
status,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export const createWorkflow = (
|
|
31
|
+
id: string,
|
|
32
|
+
name: string,
|
|
33
|
+
steps: readonly WorkflowStep[],
|
|
34
|
+
currentStepIndex: number = 0,
|
|
35
|
+
): Workflow => ({
|
|
36
|
+
id,
|
|
37
|
+
name,
|
|
38
|
+
steps,
|
|
39
|
+
currentStepIndex,
|
|
40
|
+
});
|