@aotter/mantle-runtime 0.0.11-alpha.11
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 +202 -0
- package/README.md +14 -0
- package/dist/domain/index.d.ts +4 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +4 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/model/EntryRow.d.ts +59 -0
- package/dist/domain/model/EntryRow.d.ts.map +1 -0
- package/dist/domain/model/EntryRow.js +42 -0
- package/dist/domain/model/EntryRow.js.map +1 -0
- package/dist/domain/model/HandlerContext.d.ts +65 -0
- package/dist/domain/model/HandlerContext.d.ts.map +1 -0
- package/dist/domain/model/HandlerContext.js +2 -0
- package/dist/domain/model/HandlerContext.js.map +1 -0
- package/dist/domain/model/SeoMeta.d.ts +49 -0
- package/dist/domain/model/SeoMeta.d.ts.map +1 -0
- package/dist/domain/model/SeoMeta.js +2 -0
- package/dist/domain/model/SeoMeta.js.map +1 -0
- package/dist/domain/model/TemplateRegistry.d.ts +47 -0
- package/dist/domain/model/TemplateRegistry.d.ts.map +1 -0
- package/dist/domain/model/TemplateRegistry.js +17 -0
- package/dist/domain/model/TemplateRegistry.js.map +1 -0
- package/dist/domain/model/index.d.ts +7 -0
- package/dist/domain/model/index.d.ts.map +1 -0
- package/dist/domain/model/index.js +6 -0
- package/dist/domain/model/index.js.map +1 -0
- package/dist/domain/port/AssetServer.d.ts +21 -0
- package/dist/domain/port/AssetServer.d.ts.map +1 -0
- package/dist/domain/port/AssetServer.js +2 -0
- package/dist/domain/port/AssetServer.js.map +1 -0
- package/dist/domain/port/Clock.d.ts +13 -0
- package/dist/domain/port/Clock.d.ts.map +1 -0
- package/dist/domain/port/Clock.js +2 -0
- package/dist/domain/port/Clock.js.map +1 -0
- package/dist/domain/port/DatabaseDriver.d.ts +91 -0
- package/dist/domain/port/DatabaseDriver.d.ts.map +1 -0
- package/dist/domain/port/DatabaseDriver.js +2 -0
- package/dist/domain/port/DatabaseDriver.js.map +1 -0
- package/dist/domain/port/DeferredHookDispatcher.d.ts +55 -0
- package/dist/domain/port/DeferredHookDispatcher.d.ts.map +1 -0
- package/dist/domain/port/DeferredHookDispatcher.js +16 -0
- package/dist/domain/port/DeferredHookDispatcher.js.map +1 -0
- package/dist/domain/port/EmailSender.d.ts +31 -0
- package/dist/domain/port/EmailSender.d.ts.map +1 -0
- package/dist/domain/port/EmailSender.js +2 -0
- package/dist/domain/port/EmailSender.js.map +1 -0
- package/dist/domain/port/EntryRepository.d.ts +132 -0
- package/dist/domain/port/EntryRepository.d.ts.map +1 -0
- package/dist/domain/port/EntryRepository.js +2 -0
- package/dist/domain/port/EntryRepository.js.map +1 -0
- package/dist/domain/port/HandlerRegistry.d.ts +38 -0
- package/dist/domain/port/HandlerRegistry.d.ts.map +1 -0
- package/dist/domain/port/HandlerRegistry.js +27 -0
- package/dist/domain/port/HandlerRegistry.js.map +1 -0
- package/dist/domain/port/IdGenerator.d.ts +28 -0
- package/dist/domain/port/IdGenerator.d.ts.map +1 -0
- package/dist/domain/port/IdGenerator.js +5 -0
- package/dist/domain/port/IdGenerator.js.map +1 -0
- package/dist/domain/port/KvCache.d.ts +34 -0
- package/dist/domain/port/KvCache.d.ts.map +1 -0
- package/dist/domain/port/KvCache.js +2 -0
- package/dist/domain/port/KvCache.js.map +1 -0
- package/dist/domain/port/LifecycleHookRunner.d.ts +41 -0
- package/dist/domain/port/LifecycleHookRunner.d.ts.map +1 -0
- package/dist/domain/port/LifecycleHookRunner.js +2 -0
- package/dist/domain/port/LifecycleHookRunner.js.map +1 -0
- package/dist/domain/port/MediaStorage.d.ts +102 -0
- package/dist/domain/port/MediaStorage.d.ts.map +1 -0
- package/dist/domain/port/MediaStorage.js +2 -0
- package/dist/domain/port/MediaStorage.js.map +1 -0
- package/dist/domain/port/PublishOrchestrator.d.ts +25 -0
- package/dist/domain/port/PublishOrchestrator.d.ts.map +1 -0
- package/dist/domain/port/PublishOrchestrator.js +2 -0
- package/dist/domain/port/PublishOrchestrator.js.map +1 -0
- package/dist/domain/port/SiteConfigRepository.d.ts +27 -0
- package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -0
- package/dist/domain/port/SiteConfigRepository.js +2 -0
- package/dist/domain/port/SiteConfigRepository.js.map +1 -0
- package/dist/domain/port/index.d.ts +30 -0
- package/dist/domain/port/index.d.ts.map +1 -0
- package/dist/domain/port/index.js +5 -0
- package/dist/domain/port/index.js.map +1 -0
- package/dist/domain/service/AbsoluteUrl.d.ts +6 -0
- package/dist/domain/service/AbsoluteUrl.d.ts.map +1 -0
- package/dist/domain/service/AbsoluteUrl.js +33 -0
- package/dist/domain/service/AbsoluteUrl.js.map +1 -0
- package/dist/domain/service/AuthPredicateEvaluator.d.ts +29 -0
- package/dist/domain/service/AuthPredicateEvaluator.d.ts.map +1 -0
- package/dist/domain/service/AuthPredicateEvaluator.js +48 -0
- package/dist/domain/service/AuthPredicateEvaluator.js.map +1 -0
- package/dist/domain/service/BuiltinProjector.d.ts +50 -0
- package/dist/domain/service/BuiltinProjector.d.ts.map +1 -0
- package/dist/domain/service/BuiltinProjector.js +61 -0
- package/dist/domain/service/BuiltinProjector.js.map +1 -0
- package/dist/domain/service/EntrySeoSupport.d.ts +27 -0
- package/dist/domain/service/EntrySeoSupport.d.ts.map +1 -0
- package/dist/domain/service/EntrySeoSupport.js +13 -0
- package/dist/domain/service/EntrySeoSupport.js.map +1 -0
- package/dist/domain/service/HtmlRenderer.d.ts +32 -0
- package/dist/domain/service/HtmlRenderer.d.ts.map +1 -0
- package/dist/domain/service/HtmlRenderer.js +38 -0
- package/dist/domain/service/HtmlRenderer.js.map +1 -0
- package/dist/domain/service/LocaleNegotiator.d.ts +29 -0
- package/dist/domain/service/LocaleNegotiator.d.ts.map +1 -0
- package/dist/domain/service/LocaleNegotiator.js +62 -0
- package/dist/domain/service/LocaleNegotiator.js.map +1 -0
- package/dist/domain/service/MarkdownSerializer.d.ts +48 -0
- package/dist/domain/service/MarkdownSerializer.d.ts.map +1 -0
- package/dist/domain/service/MarkdownSerializer.js +109 -0
- package/dist/domain/service/MarkdownSerializer.js.map +1 -0
- package/dist/domain/service/McpToolNaming.d.ts +12 -0
- package/dist/domain/service/McpToolNaming.d.ts.map +1 -0
- package/dist/domain/service/McpToolNaming.js +14 -0
- package/dist/domain/service/McpToolNaming.js.map +1 -0
- package/dist/domain/service/Pagination.d.ts +15 -0
- package/dist/domain/service/Pagination.d.ts.map +1 -0
- package/dist/domain/service/Pagination.js +29 -0
- package/dist/domain/service/Pagination.js.map +1 -0
- package/dist/domain/service/PathMatcher.d.ts +15 -0
- package/dist/domain/service/PathMatcher.d.ts.map +1 -0
- package/dist/domain/service/PathMatcher.js +54 -0
- package/dist/domain/service/PathMatcher.js.map +1 -0
- package/dist/domain/service/PreviewBanner.d.ts +10 -0
- package/dist/domain/service/PreviewBanner.d.ts.map +1 -0
- package/dist/domain/service/PreviewBanner.js +37 -0
- package/dist/domain/service/PreviewBanner.js.map +1 -0
- package/dist/domain/service/PublicPathResolver.d.ts +41 -0
- package/dist/domain/service/PublicPathResolver.d.ts.map +1 -0
- package/dist/domain/service/PublicPathResolver.js +24 -0
- package/dist/domain/service/PublicPathResolver.js.map +1 -0
- package/dist/domain/service/PublishKeys.d.ts +42 -0
- package/dist/domain/service/PublishKeys.d.ts.map +1 -0
- package/dist/domain/service/PublishKeys.js +69 -0
- package/dist/domain/service/PublishKeys.js.map +1 -0
- package/dist/domain/service/SeoMetaComposer.d.ts +47 -0
- package/dist/domain/service/SeoMetaComposer.d.ts.map +1 -0
- package/dist/domain/service/SeoMetaComposer.js +174 -0
- package/dist/domain/service/SeoMetaComposer.js.map +1 -0
- package/dist/domain/service/SitemapSerializer.d.ts +19 -0
- package/dist/domain/service/SitemapSerializer.d.ts.map +1 -0
- package/dist/domain/service/SitemapSerializer.js +27 -0
- package/dist/domain/service/SitemapSerializer.js.map +1 -0
- package/dist/domain/service/TriggerIndex.d.ts +27 -0
- package/dist/domain/service/TriggerIndex.d.ts.map +1 -0
- package/dist/domain/service/TriggerIndex.js +52 -0
- package/dist/domain/service/TriggerIndex.js.map +1 -0
- package/dist/domain/service/ViewParamCoercer.d.ts +20 -0
- package/dist/domain/service/ViewParamCoercer.d.ts.map +1 -0
- package/dist/domain/service/ViewParamCoercer.js +82 -0
- package/dist/domain/service/ViewParamCoercer.js.map +1 -0
- package/dist/domain/service/ViewSqlCompiler.d.ts +29 -0
- package/dist/domain/service/ViewSqlCompiler.d.ts.map +1 -0
- package/dist/domain/service/ViewSqlCompiler.js +147 -0
- package/dist/domain/service/ViewSqlCompiler.js.map +1 -0
- package/dist/domain/service/index.d.ts +28 -0
- package/dist/domain/service/index.d.ts.map +1 -0
- package/dist/domain/service/index.js +28 -0
- package/dist/domain/service/index.js.map +1 -0
- package/dist/domain/service/io/EntryWriteGuard.d.ts +19 -0
- package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -0
- package/dist/domain/service/io/EntryWriteGuard.js +109 -0
- package/dist/domain/service/io/EntryWriteGuard.js.map +1 -0
- package/dist/domain/service/io/JoinedEntryReader.d.ts +33 -0
- package/dist/domain/service/io/JoinedEntryReader.d.ts.map +1 -0
- package/dist/domain/service/io/JoinedEntryReader.js +95 -0
- package/dist/domain/service/io/JoinedEntryReader.js.map +1 -0
- package/dist/domain/service/io/PublishedEntries.d.ts +69 -0
- package/dist/domain/service/io/PublishedEntries.d.ts.map +1 -0
- package/dist/domain/service/io/PublishedEntries.js +116 -0
- package/dist/domain/service/io/PublishedEntries.js.map +1 -0
- package/dist/domain/service/io/index.d.ts +9 -0
- package/dist/domain/service/io/index.d.ts.map +1 -0
- package/dist/domain/service/io/index.js +9 -0
- package/dist/domain/service/io/index.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/boot/canonicalMigrations.d.ts +9 -0
- package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -0
- package/dist/infrastructure/boot/canonicalMigrations.js +162 -0
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -0
- package/dist/infrastructure/boot/index.d.ts +2 -0
- package/dist/infrastructure/boot/index.d.ts.map +1 -0
- package/dist/infrastructure/boot/index.js +2 -0
- package/dist/infrastructure/boot/index.js.map +1 -0
- package/dist/infrastructure/http/DiagnosticResponse.d.ts +12 -0
- package/dist/infrastructure/http/DiagnosticResponse.d.ts.map +1 -0
- package/dist/infrastructure/http/DiagnosticResponse.js +14 -0
- package/dist/infrastructure/http/DiagnosticResponse.js.map +1 -0
- package/dist/infrastructure/http/index.d.ts +2 -0
- package/dist/infrastructure/http/index.d.ts.map +1 -0
- package/dist/infrastructure/http/index.js +2 -0
- package/dist/infrastructure/http/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +12 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +12 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +60 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +281 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -0
- package/dist/infrastructure/mcp/McpResponses.d.ts +14 -0
- package/dist/infrastructure/mcp/McpResponses.d.ts.map +1 -0
- package/dist/infrastructure/mcp/McpResponses.js +49 -0
- package/dist/infrastructure/mcp/McpResponses.js.map +1 -0
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts +68 -0
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -0
- package/dist/infrastructure/mcp/McpToolCatalog.js +231 -0
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -0
- package/dist/infrastructure/mcp/index.d.ts +4 -0
- package/dist/infrastructure/mcp/index.d.ts.map +1 -0
- package/dist/infrastructure/mcp/index.js +4 -0
- package/dist/infrastructure/mcp/index.js.map +1 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +35 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +228 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +12 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +101 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +74 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +208 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -0
- package/dist/infrastructure/persistence/index.d.ts +4 -0
- package/dist/infrastructure/persistence/index.d.ts.map +1 -0
- package/dist/infrastructure/persistence/index.js +4 -0
- package/dist/infrastructure/persistence/index.js.map +1 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +34 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js +116 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -0
- package/dist/infrastructure/render/index.d.ts +2 -0
- package/dist/infrastructure/render/index.d.ts.map +1 -0
- package/dist/infrastructure/render/index.js +2 -0
- package/dist/infrastructure/render/index.js.map +1 -0
- package/dist/runtime.d.ts +132 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +142 -0
- package/dist/runtime.js.map +1 -0
- package/dist/usecase/boot/ValidateBootUseCase.d.ts +57 -0
- package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -0
- package/dist/usecase/boot/ValidateBootUseCase.js +181 -0
- package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -0
- package/dist/usecase/boot/index.d.ts +2 -0
- package/dist/usecase/boot/index.d.ts.map +1 -0
- package/dist/usecase/boot/index.js +2 -0
- package/dist/usecase/boot/index.js.map +1 -0
- package/dist/usecase/content/ArchiveUseCase.d.ts +20 -0
- package/dist/usecase/content/ArchiveUseCase.d.ts.map +1 -0
- package/dist/usecase/content/ArchiveUseCase.js +47 -0
- package/dist/usecase/content/ArchiveUseCase.js.map +1 -0
- package/dist/usecase/content/ContentPublishEffects.d.ts +11 -0
- package/dist/usecase/content/ContentPublishEffects.d.ts.map +1 -0
- package/dist/usecase/content/ContentPublishEffects.js +21 -0
- package/dist/usecase/content/ContentPublishEffects.js.map +1 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts +22 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -0
- package/dist/usecase/content/CreateDraftUseCase.js +61 -0
- package/dist/usecase/content/CreateDraftUseCase.js.map +1 -0
- package/dist/usecase/content/DeleteEntryUseCase.d.ts +20 -0
- package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -0
- package/dist/usecase/content/DeleteEntryUseCase.js +34 -0
- package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -0
- package/dist/usecase/content/GetEntryUseCase.d.ts +13 -0
- package/dist/usecase/content/GetEntryUseCase.d.ts.map +1 -0
- package/dist/usecase/content/GetEntryUseCase.js +24 -0
- package/dist/usecase/content/GetEntryUseCase.js.map +1 -0
- package/dist/usecase/content/ListEntriesUseCase.d.ts +39 -0
- package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -0
- package/dist/usecase/content/ListEntriesUseCase.js +58 -0
- package/dist/usecase/content/ListEntriesUseCase.js.map +1 -0
- package/dist/usecase/content/RequestPublishUseCase.d.ts +30 -0
- package/dist/usecase/content/RequestPublishUseCase.d.ts.map +1 -0
- package/dist/usecase/content/RequestPublishUseCase.js +111 -0
- package/dist/usecase/content/RequestPublishUseCase.js.map +1 -0
- package/dist/usecase/content/UnpublishUseCase.d.ts +19 -0
- package/dist/usecase/content/UnpublishUseCase.d.ts.map +1 -0
- package/dist/usecase/content/UnpublishUseCase.js +46 -0
- package/dist/usecase/content/UnpublishUseCase.js.map +1 -0
- package/dist/usecase/content/UpdateDraftUseCase.d.ts +20 -0
- package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -0
- package/dist/usecase/content/UpdateDraftUseCase.js +86 -0
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -0
- package/dist/usecase/content/diagnostics.d.ts +26 -0
- package/dist/usecase/content/diagnostics.d.ts.map +1 -0
- package/dist/usecase/content/diagnostics.js +100 -0
- package/dist/usecase/content/diagnostics.js.map +1 -0
- package/dist/usecase/content/index.d.ts +15 -0
- package/dist/usecase/content/index.d.ts.map +1 -0
- package/dist/usecase/content/index.js +15 -0
- package/dist/usecase/content/index.js.map +1 -0
- package/dist/usecase/dto/content/index.d.ts +73 -0
- package/dist/usecase/dto/content/index.d.ts.map +1 -0
- package/dist/usecase/dto/content/index.js +2 -0
- package/dist/usecase/dto/content/index.js.map +1 -0
- package/dist/usecase/dto/index.d.ts +13 -0
- package/dist/usecase/dto/index.d.ts.map +1 -0
- package/dist/usecase/dto/index.js +13 -0
- package/dist/usecase/dto/index.js.map +1 -0
- package/dist/usecase/dto/lifecycle/index.d.ts +15 -0
- package/dist/usecase/dto/lifecycle/index.d.ts.map +1 -0
- package/dist/usecase/dto/lifecycle/index.js +2 -0
- package/dist/usecase/dto/lifecycle/index.js.map +1 -0
- package/dist/usecase/dto/media/index.d.ts +32 -0
- package/dist/usecase/dto/media/index.d.ts.map +1 -0
- package/dist/usecase/dto/media/index.js +8 -0
- package/dist/usecase/dto/media/index.js.map +1 -0
- package/dist/usecase/dto/procedure/index.d.ts +37 -0
- package/dist/usecase/dto/procedure/index.d.ts.map +1 -0
- package/dist/usecase/dto/procedure/index.js +2 -0
- package/dist/usecase/dto/procedure/index.js.map +1 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts +14 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js +2 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js.map +1 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts +8 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js +2 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js.map +1 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts +11 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.js +2 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.js.map +1 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +27 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.js +2 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.js.map +1 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +17 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.js +2 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.js.map +1 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts +11 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.js +2 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.js.map +1 -0
- package/dist/usecase/dto/render/index.d.ts +7 -0
- package/dist/usecase/dto/render/index.d.ts.map +1 -0
- package/dist/usecase/dto/render/index.js +7 -0
- package/dist/usecase/dto/render/index.js.map +1 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts +16 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts.map +1 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.js +2 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.js.map +1 -0
- package/dist/usecase/dto/view/index.d.ts +2 -0
- package/dist/usecase/dto/view/index.d.ts.map +1 -0
- package/dist/usecase/dto/view/index.js +2 -0
- package/dist/usecase/dto/view/index.js.map +1 -0
- package/dist/usecase/index.d.ts +16 -0
- package/dist/usecase/index.d.ts.map +1 -0
- package/dist/usecase/index.js +16 -0
- package/dist/usecase/index.js.map +1 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts +26 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts.map +1 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.js +44 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.js.map +1 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts +38 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts.map +1 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js +67 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js.map +1 -0
- package/dist/usecase/lifecycle/index.d.ts +3 -0
- package/dist/usecase/lifecycle/index.d.ts.map +1 -0
- package/dist/usecase/lifecycle/index.js +3 -0
- package/dist/usecase/lifecycle/index.js.map +1 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.d.ts +15 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.d.ts.map +1 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.js +43 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.js.map +1 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts +18 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.js +71 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -0
- package/dist/usecase/media/PendingUploadRecord.d.ts +17 -0
- package/dist/usecase/media/PendingUploadRecord.d.ts.map +1 -0
- package/dist/usecase/media/PendingUploadRecord.js +2 -0
- package/dist/usecase/media/PendingUploadRecord.js.map +1 -0
- package/dist/usecase/media/diagnostics.d.ts +15 -0
- package/dist/usecase/media/diagnostics.d.ts.map +1 -0
- package/dist/usecase/media/diagnostics.js +88 -0
- package/dist/usecase/media/diagnostics.js.map +1 -0
- package/dist/usecase/media/index.d.ts +4 -0
- package/dist/usecase/media/index.d.ts.map +1 -0
- package/dist/usecase/media/index.js +4 -0
- package/dist/usecase/media/index.js.map +1 -0
- package/dist/usecase/media/mediaAllowlist.d.ts +30 -0
- package/dist/usecase/media/mediaAllowlist.d.ts.map +1 -0
- package/dist/usecase/media/mediaAllowlist.js +53 -0
- package/dist/usecase/media/mediaAllowlist.js.map +1 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts +43 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js +202 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +50 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.js +191 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -0
- package/dist/usecase/procedure/index.d.ts +3 -0
- package/dist/usecase/procedure/index.d.ts.map +1 -0
- package/dist/usecase/procedure/index.js +3 -0
- package/dist/usecase/procedure/index.js.map +1 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +25 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +55 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +19 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +1 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js +40 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +1 -0
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts +15 -0
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +1 -0
- package/dist/usecase/render/ComposeSitemapUseCase.js +29 -0
- package/dist/usecase/render/ComposeSitemapUseCase.js.map +1 -0
- package/dist/usecase/render/PreviewEntryUseCase.d.ts +26 -0
- package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -0
- package/dist/usecase/render/PreviewEntryUseCase.js +69 -0
- package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +35 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.js +59 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -0
- package/dist/usecase/render/RenderListLiveUseCase.d.ts +23 -0
- package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -0
- package/dist/usecase/render/RenderListLiveUseCase.js +41 -0
- package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -0
- package/dist/usecase/render/index.d.ts +7 -0
- package/dist/usecase/render/index.d.ts.map +1 -0
- package/dist/usecase/render/index.js +10 -0
- package/dist/usecase/render/index.js.map +1 -0
- package/dist/usecase/view/ExecuteViewUseCase.d.ts +31 -0
- package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -0
- package/dist/usecase/view/ExecuteViewUseCase.js +78 -0
- package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -0
- package/dist/usecase/view/index.d.ts +2 -0
- package/dist/usecase/view/index.d.ts.map +1 -0
- package/dist/usecase/view/index.js +2 -0
- package/dist/usecase/view/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { DiagnosticError, firstZodIssueAsJsonPointer, jsonSchemaToZod, makeDiagnostic, readJsonPointer, } from "@aotter/mantle-spec";
|
|
2
|
+
import { evaluateAuthAll } from "../../domain/service/AuthPredicateEvaluator.js";
|
|
3
|
+
/**
|
|
4
|
+
* `InvokeProcedureUseCase` — in-process invocation of a Procedure.
|
|
5
|
+
* HTTP-agnostic — the adapter's mount layer wraps this to map to/from
|
|
6
|
+
* `Request` / `Response`. The test harness exercises the same entry
|
|
7
|
+
* point.
|
|
8
|
+
*
|
|
9
|
+
* Order of operations:
|
|
10
|
+
* 1. Evaluate `requires.auth.all` predicates against `ctx`. Deny ⇒
|
|
11
|
+
* `AUTH_DENIED`.
|
|
12
|
+
* 2. Validate `input` against the Procedure's `input` JSON Schema.
|
|
13
|
+
* Fail ⇒ `INPUT_VALIDATION_FAILED` (first zod issue).
|
|
14
|
+
* 3. Dispatch by `handler.kind`:
|
|
15
|
+
* - `ref`: resolve in registry, call (`InvokeFailure` → unwrap;
|
|
16
|
+
* other throws → `INTERNAL_ERROR`).
|
|
17
|
+
* - `builtin`: delegate to `InvokeBuiltinUseCase` (project +
|
|
18
|
+
* stamp + chokepoint write per POC ADR-0014). When no builtin
|
|
19
|
+
* collaborator was injected (test paths, ref-only runtimes) the
|
|
20
|
+
* use case returns `HANDLER_BUILTIN_NOT_IN_V010`.
|
|
21
|
+
* 4. Validate the result against the `output` schema. Fail ⇒
|
|
22
|
+
* `OUTPUT_VALIDATION_FAILED` (handler / builtin bug).
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Throwable carrier for handlers that want to surface a structured
|
|
26
|
+
* Diagnostic without going through the generic `INTERNAL_ERROR`
|
|
27
|
+
* envelope. The use case catches it and converts to an
|
|
28
|
+
* `{ ok: false, diagnostic }` return. Lives here (not in
|
|
29
|
+
* `usecase/dto/`) because it's a runtime value, not a DTO type.
|
|
30
|
+
*/
|
|
31
|
+
export class InvokeFailure extends Error {
|
|
32
|
+
diagnostic;
|
|
33
|
+
constructor(diagnostic) {
|
|
34
|
+
super(diagnostic.message);
|
|
35
|
+
this.diagnostic = diagnostic;
|
|
36
|
+
this.name = "InvokeFailure";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export class InvokeProcedureUseCase {
|
|
40
|
+
registry;
|
|
41
|
+
builtin;
|
|
42
|
+
// Per-Procedure compiled zod schemas. zod composition is pure
|
|
43
|
+
// object-tree assembly (no `new Function`) — Workers-CSP-safe.
|
|
44
|
+
// Cached per use-case instance because `jsonSchemaToZod` walks the
|
|
45
|
+
// JSON Schema once per call. Two runtimes with manifests sharing a
|
|
46
|
+
// procedure name + different schemas will get separate caches
|
|
47
|
+
// because the runtime owns the use case instance.
|
|
48
|
+
inputCache = new Map();
|
|
49
|
+
outputCache = new Map();
|
|
50
|
+
constructor(registry, builtin) {
|
|
51
|
+
this.registry = registry;
|
|
52
|
+
this.builtin = builtin;
|
|
53
|
+
}
|
|
54
|
+
async execute(request) {
|
|
55
|
+
const { procedure, input, ctx } = request;
|
|
56
|
+
const phase = request.phase ?? "runtime";
|
|
57
|
+
const procPath = request.pathPrefix ?? `manifest:Procedure/${procedure.metadata.name}`;
|
|
58
|
+
// 1. Auth.
|
|
59
|
+
const denial = evaluateAuthAll(procedure.spec.requires, ctx, procPath, phase);
|
|
60
|
+
if (denial)
|
|
61
|
+
return { ok: false, diagnostic: denial };
|
|
62
|
+
// 2. Input validation.
|
|
63
|
+
const inputValidator = this.compileInput(procedure);
|
|
64
|
+
const inputResult = inputValidator.safeParse(input);
|
|
65
|
+
if (!inputResult.success) {
|
|
66
|
+
const { instancePath, message } = firstZodIssueAsJsonPointer(inputResult.error);
|
|
67
|
+
return {
|
|
68
|
+
ok: false,
|
|
69
|
+
diagnostic: makeDiagnostic({
|
|
70
|
+
code: "INPUT_VALIDATION_FAILED",
|
|
71
|
+
phase,
|
|
72
|
+
severity: "error",
|
|
73
|
+
path: `${procPath}#/input${instancePath}`,
|
|
74
|
+
value: readJsonPointer(input, instancePath),
|
|
75
|
+
expected: message,
|
|
76
|
+
}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// 3. Dispatch by handler kind.
|
|
80
|
+
const handlerBinding = procedure.spec.handler;
|
|
81
|
+
const handlerLabel = handlerBinding.kind === "builtin"
|
|
82
|
+
? `builtin/${handlerBinding.op}`
|
|
83
|
+
: handlerBinding.ref;
|
|
84
|
+
let result;
|
|
85
|
+
try {
|
|
86
|
+
if (handlerBinding.kind === "builtin") {
|
|
87
|
+
if (!this.builtin) {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
diagnostic: makeDiagnostic({
|
|
91
|
+
code: "HANDLER_BUILTIN_NOT_IN_V010",
|
|
92
|
+
phase,
|
|
93
|
+
severity: "error",
|
|
94
|
+
path: `${procPath}#/handler/kind`,
|
|
95
|
+
value: handlerBinding.kind,
|
|
96
|
+
expected: "InvokeBuiltinUseCase wired into the runtime",
|
|
97
|
+
message: `Procedure '${procedure.metadata.name}' uses handler.kind: 'builtin' but the runtime was constructed without an InvokeBuiltinUseCase.`,
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
result = await this.builtin.run({
|
|
102
|
+
procedure,
|
|
103
|
+
validatedInput: inputResult.data,
|
|
104
|
+
ctx,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const handler = this.registry.get(handlerBinding.ref);
|
|
109
|
+
if (!handler) {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
diagnostic: makeDiagnostic({
|
|
113
|
+
code: "HANDLER_NOT_REGISTERED",
|
|
114
|
+
phase,
|
|
115
|
+
severity: "error",
|
|
116
|
+
path: `${procPath}#/handler/ref`,
|
|
117
|
+
value: handlerBinding.ref,
|
|
118
|
+
expected: "a ref registered via the handlers option / sdk.registerHandler",
|
|
119
|
+
candidates: this.registry.list(),
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
result = await handler(inputResult.data, ctx);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
if (err instanceof InvokeFailure) {
|
|
128
|
+
return { ok: false, diagnostic: err.diagnostic };
|
|
129
|
+
}
|
|
130
|
+
if (err instanceof DiagnosticError) {
|
|
131
|
+
return { ok: false, diagnostic: err.diagnostic };
|
|
132
|
+
}
|
|
133
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
diagnostic: makeDiagnostic({
|
|
137
|
+
code: "INTERNAL_ERROR",
|
|
138
|
+
phase,
|
|
139
|
+
severity: "error",
|
|
140
|
+
path: procPath,
|
|
141
|
+
expected: "handler completes without throwing",
|
|
142
|
+
message: `Handler '${handlerLabel}' threw: ${msg}`,
|
|
143
|
+
}),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// 4. Output validation.
|
|
147
|
+
const outputValidator = this.compileOutput(procedure);
|
|
148
|
+
const outputResult = outputValidator.safeParse(result);
|
|
149
|
+
if (!outputResult.success) {
|
|
150
|
+
const { instancePath, message } = firstZodIssueAsJsonPointer(outputResult.error);
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
diagnostic: makeDiagnostic({
|
|
154
|
+
code: "OUTPUT_VALIDATION_FAILED",
|
|
155
|
+
phase,
|
|
156
|
+
severity: "error",
|
|
157
|
+
path: `${procPath}#/output${instancePath}`,
|
|
158
|
+
value: readJsonPointer(result, instancePath),
|
|
159
|
+
expected: message,
|
|
160
|
+
message: `Handler '${handlerLabel}' returned a value that does not match its declared output schema. This is a handler bug.`,
|
|
161
|
+
}),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return { ok: true, data: result };
|
|
165
|
+
}
|
|
166
|
+
/** Test seam — clear validator caches between tests when manifests
|
|
167
|
+
* change between runs. Production paths never call this. */
|
|
168
|
+
_clearValidatorCaches() {
|
|
169
|
+
this.inputCache.clear();
|
|
170
|
+
this.outputCache.clear();
|
|
171
|
+
}
|
|
172
|
+
compileInput(p) {
|
|
173
|
+
const k = p.metadata.name;
|
|
174
|
+
let v = this.inputCache.get(k);
|
|
175
|
+
if (!v) {
|
|
176
|
+
v = jsonSchemaToZod(p.spec.input);
|
|
177
|
+
this.inputCache.set(k, v);
|
|
178
|
+
}
|
|
179
|
+
return v;
|
|
180
|
+
}
|
|
181
|
+
compileOutput(p) {
|
|
182
|
+
const k = p.metadata.name;
|
|
183
|
+
let v = this.outputCache.get(k);
|
|
184
|
+
if (!v) {
|
|
185
|
+
v = jsonSchemaToZod(p.spec.output);
|
|
186
|
+
this.outputCache.set(k, v);
|
|
187
|
+
}
|
|
188
|
+
return v;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=InvokeProcedureUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvokeProcedureUseCase.js","sourceRoot":"","sources":["../../../src/usecase/procedure/InvokeProcedureUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/procedure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/procedure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
2
|
+
import { type SeoMeta } from "../../domain/service/SeoMetaComposer.js";
|
|
3
|
+
import type { ComposeEntrySeoMetaRequest } from "../dto/render/ComposeEntrySeoMetaRequest.js";
|
|
4
|
+
/**
|
|
5
|
+
* Compose the SEO/AEO meta block for an entry. Reads sibling
|
|
6
|
+
* translations from the DB (same collection, same slug, other
|
|
7
|
+
* locales) so hreflang links are accurate; calls the pure composer
|
|
8
|
+
* for the rest.
|
|
9
|
+
*
|
|
10
|
+
* "Same collection" is a deliberate simplification — works correctly
|
|
11
|
+
* for `post-translations`-style design where each locale has its own
|
|
12
|
+
* row in the same collection. Sites that split locales across
|
|
13
|
+
* collections (`posts-en`, `posts-zh`) need a custom resolver — out
|
|
14
|
+
* of scope for v0.1.
|
|
15
|
+
*
|
|
16
|
+
* Sibling lookup is one indexed `readEntryBySlug` per non-current
|
|
17
|
+
* locale — O(locales), not O(collection). Runs in parallel via
|
|
18
|
+
* `Promise.all`.
|
|
19
|
+
*/
|
|
20
|
+
export declare class ComposeEntrySeoMetaUseCase {
|
|
21
|
+
private readonly db;
|
|
22
|
+
constructor(db: DatabaseDriver);
|
|
23
|
+
execute(request: ComposeEntrySeoMetaRequest): Promise<SeoMeta>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ComposeEntrySeoMetaUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposeEntrySeoMetaUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/ComposeEntrySeoMetaUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAEL,KAAK,OAAO,EAEb,MAAM,yCAAyC,CAAC;AAGjD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAE9F;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEzC,OAAO,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;CAMrE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { composeEntrySeoMeta, } from "../../domain/service/SeoMetaComposer.js";
|
|
2
|
+
import { readEntryBySlug } from "../../domain/service/io/PublishedEntries.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compose the SEO/AEO meta block for an entry. Reads sibling
|
|
5
|
+
* translations from the DB (same collection, same slug, other
|
|
6
|
+
* locales) so hreflang links are accurate; calls the pure composer
|
|
7
|
+
* for the rest.
|
|
8
|
+
*
|
|
9
|
+
* "Same collection" is a deliberate simplification — works correctly
|
|
10
|
+
* for `post-translations`-style design where each locale has its own
|
|
11
|
+
* row in the same collection. Sites that split locales across
|
|
12
|
+
* collections (`posts-en`, `posts-zh`) need a custom resolver — out
|
|
13
|
+
* of scope for v0.1.
|
|
14
|
+
*
|
|
15
|
+
* Sibling lookup is one indexed `readEntryBySlug` per non-current
|
|
16
|
+
* locale — O(locales), not O(collection). Runs in parallel via
|
|
17
|
+
* `Promise.all`.
|
|
18
|
+
*/
|
|
19
|
+
export class ComposeEntrySeoMetaUseCase {
|
|
20
|
+
db;
|
|
21
|
+
constructor(db) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
}
|
|
24
|
+
async execute(request) {
|
|
25
|
+
const { entry, site, paths, type } = request;
|
|
26
|
+
const publicPath = paths.forEntry(entry) ?? "";
|
|
27
|
+
const siblings = await readSiblings(this.db, entry, site, paths);
|
|
28
|
+
return composeEntrySeoMeta({ entry, site, publicPath, siblings, type });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function readSiblings(db, current, site, paths) {
|
|
32
|
+
const slug = current.data["slug"];
|
|
33
|
+
if (typeof slug !== "string" || slug.length === 0)
|
|
34
|
+
return [];
|
|
35
|
+
if (site.locales.length <= 1)
|
|
36
|
+
return [];
|
|
37
|
+
const currentKey = current.locale?.toLowerCase();
|
|
38
|
+
const targetLocales = site.locales.filter((l) => l.toLowerCase() !== currentKey);
|
|
39
|
+
const lookups = await Promise.all(targetLocales.map((locale) => readEntryBySlug(db, {
|
|
40
|
+
collection: current.collection,
|
|
41
|
+
slug,
|
|
42
|
+
locale,
|
|
43
|
+
status: "published",
|
|
44
|
+
}).then((e) => ({ locale, entry: e }))));
|
|
45
|
+
const out = [];
|
|
46
|
+
for (const { locale, entry } of lookups) {
|
|
47
|
+
if (!entry)
|
|
48
|
+
continue;
|
|
49
|
+
const path = paths.forEntry(entry);
|
|
50
|
+
if (path)
|
|
51
|
+
out.push({ locale, publicPath: path });
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=ComposeEntrySeoMetaUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposeEntrySeoMetaUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/ComposeEntrySeoMetaUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,GAGpB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAG9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,0BAA0B;IACR;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAAmC;QAC/C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF;AAED,KAAK,UAAU,YAAY,CACzB,EAAkB,EAClB,OAAc,EACd,IAAgB,EAChB,KAAyB;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3B,eAAe,CAAC,EAAE,EAAE;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,WAAW;KACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CACvC,CACF,CAAC;IACF,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
2
|
+
import type { ComposeLlmsTxtRequest } from "../dto/render/ComposeLlmsTxtRequest.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compose a `/llms.txt` body from currently-published entries.
|
|
5
|
+
*
|
|
6
|
+
* - locale: string → entries with `data.locale === locale`
|
|
7
|
+
* - locale: null → non-localized entries only (publish-pipeline
|
|
8
|
+
* semantic; matches what HtmlPublishOrchestrator
|
|
9
|
+
* writes to `llms:root` on a non-localized
|
|
10
|
+
* publish). Consumers that want a cross-locale
|
|
11
|
+
* aggregate at the root URL should iterate
|
|
12
|
+
* site.locales themselves and concat.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ComposeLlmsTxtUseCase {
|
|
15
|
+
private readonly db;
|
|
16
|
+
constructor(db: DatabaseDriver);
|
|
17
|
+
execute(request: ComposeLlmsTxtRequest): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ComposeLlmsTxtUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposeLlmsTxtUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/ComposeLlmsTxtUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAEpF;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEzC,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;CAS/D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readPublishedEntries } from "../../domain/service/io/PublishedEntries.js";
|
|
2
|
+
import { serializeLlmsTxt } from "../../domain/service/MarkdownSerializer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compose a `/llms.txt` body from currently-published entries.
|
|
5
|
+
*
|
|
6
|
+
* - locale: string → entries with `data.locale === locale`
|
|
7
|
+
* - locale: null → non-localized entries only (publish-pipeline
|
|
8
|
+
* semantic; matches what HtmlPublishOrchestrator
|
|
9
|
+
* writes to `llms:root` on a non-localized
|
|
10
|
+
* publish). Consumers that want a cross-locale
|
|
11
|
+
* aggregate at the root URL should iterate
|
|
12
|
+
* site.locales themselves and concat.
|
|
13
|
+
*/
|
|
14
|
+
export class ComposeLlmsTxtUseCase {
|
|
15
|
+
db;
|
|
16
|
+
constructor(db) {
|
|
17
|
+
this.db = db;
|
|
18
|
+
}
|
|
19
|
+
async execute(request) {
|
|
20
|
+
const entries = await readPublishedEntries(this.db, { locale: request.locale });
|
|
21
|
+
const grouped = groupByCollection(entries);
|
|
22
|
+
return serializeLlmsTxt({
|
|
23
|
+
site: request.site,
|
|
24
|
+
locale: request.locale ?? "",
|
|
25
|
+
entriesByCollection: grouped,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function groupByCollection(entries) {
|
|
30
|
+
const out = new Map();
|
|
31
|
+
for (const e of entries) {
|
|
32
|
+
const arr = out.get(e.collection);
|
|
33
|
+
if (arr)
|
|
34
|
+
arr.push(e);
|
|
35
|
+
else
|
|
36
|
+
out.set(e.collection, [e]);
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ComposeLlmsTxtUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposeLlmsTxtUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/ComposeLlmsTxtUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAG9E;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,gBAAgB,CAAC;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,mBAAmB,EAAE,OAAO;SAC7B,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,OAAyB;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
2
|
+
import type { ComposeSitemapRequest } from "../dto/render/ComposeSitemapRequest.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compose `sitemap.xml` from every published entry across all
|
|
5
|
+
* collections + locales. Result is XML text; consumer routes it as
|
|
6
|
+
* `application/xml`. See ComposeSitemapRequest for the pathFor +
|
|
7
|
+
* maxUrls knobs.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SITEMAP_MAX_URLS_DEFAULT = 50000;
|
|
10
|
+
export declare class ComposeSitemapUseCase {
|
|
11
|
+
private readonly db;
|
|
12
|
+
constructor(db: DatabaseDriver);
|
|
13
|
+
execute(request: ComposeSitemapRequest): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ComposeSitemapUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposeSitemapUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/ComposeSitemapUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAI1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEzC,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;CAW/D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { readPublishedEntries } from "../../domain/service/io/PublishedEntries.js";
|
|
2
|
+
import { entryPublicPath } from "../../domain/service/PublishKeys.js";
|
|
3
|
+
import { serializeSitemap } from "../../domain/service/SitemapSerializer.js";
|
|
4
|
+
/**
|
|
5
|
+
* Compose `sitemap.xml` from every published entry across all
|
|
6
|
+
* collections + locales. Result is XML text; consumer routes it as
|
|
7
|
+
* `application/xml`. See ComposeSitemapRequest for the pathFor +
|
|
8
|
+
* maxUrls knobs.
|
|
9
|
+
*/
|
|
10
|
+
export const SITEMAP_MAX_URLS_DEFAULT = 50000;
|
|
11
|
+
export class ComposeSitemapUseCase {
|
|
12
|
+
db;
|
|
13
|
+
constructor(db) {
|
|
14
|
+
this.db = db;
|
|
15
|
+
}
|
|
16
|
+
async execute(request) {
|
|
17
|
+
const cap = request.maxUrls ?? SITEMAP_MAX_URLS_DEFAULT;
|
|
18
|
+
const all = await readPublishedEntries(this.db, { limit: cap });
|
|
19
|
+
const mapper = request.pathFor ?? entryPublicPath;
|
|
20
|
+
const entries = [];
|
|
21
|
+
for (const e of all) {
|
|
22
|
+
const path = mapper(e);
|
|
23
|
+
if (path !== null)
|
|
24
|
+
entries.push({ entry: e, path });
|
|
25
|
+
}
|
|
26
|
+
return serializeSitemap({ site: request.site, entries });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ComposeSitemapUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposeSitemapUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/ComposeSitemapUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG7E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,wBAAwB,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;QAClD,MAAM,OAAO,GAAqC,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
|
+
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
4
|
+
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
5
|
+
import type { PreviewEntryRequest } from "../dto/render/PreviewEntryRequest.js";
|
|
6
|
+
import { type SeoComposer } from "../../domain/service/EntrySeoSupport.js";
|
|
7
|
+
/**
|
|
8
|
+
* Render an entry with a preview banner. Walks `statusOrder` until a
|
|
9
|
+
* matching row is found, renders via the registered template, then
|
|
10
|
+
* injects the banner just inside `<body>`. Returns `null` when no
|
|
11
|
+
* matching row exists or no template is registered.
|
|
12
|
+
*
|
|
13
|
+
* Composes SEO/AEO meta when the runtime was built with a
|
|
14
|
+
* `publicPathResolver` — preview pages match the meta the published
|
|
15
|
+
* version would carry, so authors see real shape during review.
|
|
16
|
+
*/
|
|
17
|
+
export declare class PreviewEntryUseCase {
|
|
18
|
+
private readonly db;
|
|
19
|
+
private readonly templates;
|
|
20
|
+
private readonly paths;
|
|
21
|
+
private readonly composeSeo;
|
|
22
|
+
private readonly schemas;
|
|
23
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>);
|
|
24
|
+
execute(request: PreviewEntryRequest): Promise<string | null>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=PreviewEntryUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAQrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAUjD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAGzD,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA6BpE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readEntryBySlug } from "../../domain/service/io/PublishedEntries.js";
|
|
2
|
+
import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryReader.js";
|
|
3
|
+
import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
|
|
4
|
+
import { defaultPreviewBanner, injectPreviewBanner, } from "../../domain/service/PreviewBanner.js";
|
|
5
|
+
import { composeSeoIfPathed, } from "../../domain/service/EntrySeoSupport.js";
|
|
6
|
+
/** Default fallback: prefer drafts, fall back to published, then
|
|
7
|
+
* archived. Authors typically open `?preview=1` to see WIP. */
|
|
8
|
+
const DEFAULT_PREVIEW_STATUS_ORDER = [
|
|
9
|
+
"draft",
|
|
10
|
+
"published",
|
|
11
|
+
"archived",
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Render an entry with a preview banner. Walks `statusOrder` until a
|
|
15
|
+
* matching row is found, renders via the registered template, then
|
|
16
|
+
* injects the banner just inside `<body>`. Returns `null` when no
|
|
17
|
+
* matching row exists or no template is registered.
|
|
18
|
+
*
|
|
19
|
+
* Composes SEO/AEO meta when the runtime was built with a
|
|
20
|
+
* `publicPathResolver` — preview pages match the meta the published
|
|
21
|
+
* version would carry, so authors see real shape during review.
|
|
22
|
+
*/
|
|
23
|
+
export class PreviewEntryUseCase {
|
|
24
|
+
db;
|
|
25
|
+
templates;
|
|
26
|
+
paths;
|
|
27
|
+
composeSeo;
|
|
28
|
+
schemas;
|
|
29
|
+
constructor(db, templates, paths, composeSeo, schemas) {
|
|
30
|
+
this.db = db;
|
|
31
|
+
this.templates = templates;
|
|
32
|
+
this.paths = paths;
|
|
33
|
+
this.composeSeo = composeSeo;
|
|
34
|
+
this.schemas = schemas;
|
|
35
|
+
}
|
|
36
|
+
async execute(request) {
|
|
37
|
+
const order = request.statusOrder ?? DEFAULT_PREVIEW_STATUS_ORDER;
|
|
38
|
+
let raw = null;
|
|
39
|
+
for (const status of order) {
|
|
40
|
+
raw = await readEntryBySlug(this.db, {
|
|
41
|
+
collection: request.collection,
|
|
42
|
+
slug: request.slug,
|
|
43
|
+
locale: request.locale,
|
|
44
|
+
status,
|
|
45
|
+
});
|
|
46
|
+
if (raw)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
if (!raw)
|
|
50
|
+
return null;
|
|
51
|
+
// Preview can show drafts; parent lookup intentionally omits status
|
|
52
|
+
// filter so a draft translation can still preview against its
|
|
53
|
+
// already-published parent. RequestPublishUseCase enforces the
|
|
54
|
+
// published-parent invariant at publish time.
|
|
55
|
+
const entry = await joinParentIfTranslation(this.db, this.schemas, raw);
|
|
56
|
+
const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, request.site);
|
|
57
|
+
const html = renderEntryHtml({
|
|
58
|
+
entry,
|
|
59
|
+
site: request.site,
|
|
60
|
+
templates: this.templates,
|
|
61
|
+
seo,
|
|
62
|
+
});
|
|
63
|
+
if (html === null)
|
|
64
|
+
return null;
|
|
65
|
+
const banner = request.banner ?? defaultPreviewBanner(entry.status, request.slug);
|
|
66
|
+
return injectPreviewBanner(html, banner);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=PreviewEntryUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,kBAAkB,GAEnB,MAAM,yCAAyC,CAAC;AAEjD;gEACgE;AAChE,MAAM,4BAA4B,GAAgC;IAChE,OAAO;IACP,WAAW;IACX,UAAU;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IAEX;IACA;IACA;IACA;IACA;IALnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuB,EACvB,OAA4C;QAJ5C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;IAC5D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,4BAA4B,CAAC;QAClE,IAAI,GAAG,GAAiB,IAAI,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;gBACnC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM;aACP,CAAC,CAAC;YACH,IAAI,GAAG;gBAAE,MAAM;QACjB,CAAC;QACD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,oEAAoE;QACpE,8DAA8D;QAC9D,+DAA+D;QAC/D,8CAA8C;QAC9C,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG;SACJ,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
|
+
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
4
|
+
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
5
|
+
import type { RenderEntryLiveRequest } from "../dto/render/RenderEntryLiveRequest.js";
|
|
6
|
+
import { type SeoComposer } from "../../domain/service/EntrySeoSupport.js";
|
|
7
|
+
/**
|
|
8
|
+
* Render a single entry from current DB state. Used by adapter live-
|
|
9
|
+
* dev routes (`CLAM_LOCAL_DEV=1`) to bypass the KV cache and pick up
|
|
10
|
+
* template / chrome edits without re-running the publish pipeline.
|
|
11
|
+
*
|
|
12
|
+
* When the runtime was built with a `publicPathResolver`, the SEO/AEO
|
|
13
|
+
* meta block is composed and threaded into `EntryContext.seo` — so
|
|
14
|
+
* live-rendered HTML carries the same meta KV-cached HTML does.
|
|
15
|
+
*
|
|
16
|
+
* When the entry belongs to a collection with `translates.parent`,
|
|
17
|
+
* the parent's data is merged into the translation's data (ADR-0010)
|
|
18
|
+
* before rendering, so template fields living on the parent
|
|
19
|
+
* (`coverUrl`, `authorId`, `publishedAt`) reach the template.
|
|
20
|
+
*
|
|
21
|
+
* Returns the full HTML document, or `null` when:
|
|
22
|
+
* - no entry matches `(collection, slug, locale, status)`
|
|
23
|
+
* - the collection has no registered entry template
|
|
24
|
+
* Adapters map `null` to a 404 response.
|
|
25
|
+
*/
|
|
26
|
+
export declare class RenderEntryLiveUseCase {
|
|
27
|
+
private readonly db;
|
|
28
|
+
private readonly templates;
|
|
29
|
+
private readonly paths;
|
|
30
|
+
private readonly composeSeo;
|
|
31
|
+
private readonly schemas;
|
|
32
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>);
|
|
33
|
+
execute(request: RenderEntryLiveRequest): Promise<string | null>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=RenderEntryLiveUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderEntryLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAGzD,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAoBvE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readEntryBySlug } from "../../domain/service/io/PublishedEntries.js";
|
|
2
|
+
import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryReader.js";
|
|
3
|
+
import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
|
|
4
|
+
import { composeSeoIfPathed, } from "../../domain/service/EntrySeoSupport.js";
|
|
5
|
+
/**
|
|
6
|
+
* Render a single entry from current DB state. Used by adapter live-
|
|
7
|
+
* dev routes (`CLAM_LOCAL_DEV=1`) to bypass the KV cache and pick up
|
|
8
|
+
* template / chrome edits without re-running the publish pipeline.
|
|
9
|
+
*
|
|
10
|
+
* When the runtime was built with a `publicPathResolver`, the SEO/AEO
|
|
11
|
+
* meta block is composed and threaded into `EntryContext.seo` — so
|
|
12
|
+
* live-rendered HTML carries the same meta KV-cached HTML does.
|
|
13
|
+
*
|
|
14
|
+
* When the entry belongs to a collection with `translates.parent`,
|
|
15
|
+
* the parent's data is merged into the translation's data (ADR-0010)
|
|
16
|
+
* before rendering, so template fields living on the parent
|
|
17
|
+
* (`coverUrl`, `authorId`, `publishedAt`) reach the template.
|
|
18
|
+
*
|
|
19
|
+
* Returns the full HTML document, or `null` when:
|
|
20
|
+
* - no entry matches `(collection, slug, locale, status)`
|
|
21
|
+
* - the collection has no registered entry template
|
|
22
|
+
* Adapters map `null` to a 404 response.
|
|
23
|
+
*/
|
|
24
|
+
export class RenderEntryLiveUseCase {
|
|
25
|
+
db;
|
|
26
|
+
templates;
|
|
27
|
+
paths;
|
|
28
|
+
composeSeo;
|
|
29
|
+
schemas;
|
|
30
|
+
constructor(db, templates, paths, composeSeo, schemas) {
|
|
31
|
+
this.db = db;
|
|
32
|
+
this.templates = templates;
|
|
33
|
+
this.paths = paths;
|
|
34
|
+
this.composeSeo = composeSeo;
|
|
35
|
+
this.schemas = schemas;
|
|
36
|
+
}
|
|
37
|
+
async execute(request) {
|
|
38
|
+
const status = request.status ?? "published";
|
|
39
|
+
const raw = await readEntryBySlug(this.db, {
|
|
40
|
+
collection: request.collection,
|
|
41
|
+
slug: request.slug,
|
|
42
|
+
locale: request.locale,
|
|
43
|
+
status,
|
|
44
|
+
});
|
|
45
|
+
if (!raw)
|
|
46
|
+
return null;
|
|
47
|
+
const entry = await joinParentIfTranslation(this.db, this.schemas, raw, {
|
|
48
|
+
parentStatus: status,
|
|
49
|
+
});
|
|
50
|
+
const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, request.site);
|
|
51
|
+
return renderEntryHtml({
|
|
52
|
+
entry,
|
|
53
|
+
site: request.site,
|
|
54
|
+
templates: this.templates,
|
|
55
|
+
seo,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=RenderEntryLiveUseCase.js.map
|