@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,132 @@
|
|
|
1
|
+
import { type Manifest, type ProcedureManifest, type SchemaManifest, type SiteDefaults, type TriggerManifest, type ViewManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { AnyHandler } from "./domain/model/HandlerContext.js";
|
|
3
|
+
import type { TemplateRegistry } from "./domain/model/TemplateRegistry.js";
|
|
4
|
+
import type { AssetServer } from "./domain/port/AssetServer.js";
|
|
5
|
+
import type { DatabaseDriver } from "./domain/port/DatabaseDriver.js";
|
|
6
|
+
import type { DeferredHookDispatcher } from "./domain/port/DeferredHookDispatcher.js";
|
|
7
|
+
import type { KvCache } from "./domain/port/KvCache.js";
|
|
8
|
+
import type { MediaStorage } from "./domain/port/MediaStorage.js";
|
|
9
|
+
import type { PublishOrchestrator } from "./domain/port/PublishOrchestrator.js";
|
|
10
|
+
import type { SiteConfigRepository } from "./domain/port/SiteConfigRepository.js";
|
|
11
|
+
import { type Clock } from "./domain/port/Clock.js";
|
|
12
|
+
import { type IdGenerator } from "./domain/port/IdGenerator.js";
|
|
13
|
+
import { type HandlerRegistry } from "./domain/port/HandlerRegistry.js";
|
|
14
|
+
import { ArchiveUseCase, CreateDraftUseCase, DeleteEntryUseCase, GetEntryUseCase, ListEntriesUseCase, RequestPublishUseCase, UnpublishUseCase, UpdateDraftUseCase } from "./usecase/content/index.js";
|
|
15
|
+
import { InvokeProcedureUseCase } from "./usecase/procedure/index.js";
|
|
16
|
+
import { ExecuteViewUseCase } from "./usecase/view/index.js";
|
|
17
|
+
import { ValidateBootUseCase } from "./usecase/boot/index.js";
|
|
18
|
+
import { RunDeferredHookUseCase } from "./usecase/lifecycle/index.js";
|
|
19
|
+
import { ComposeEntrySeoMetaUseCase, ComposeLlmsTxtUseCase, ComposeSitemapUseCase, PreviewEntryUseCase, RenderEntryLiveUseCase, RenderListLiveUseCase } from "./usecase/render/index.js";
|
|
20
|
+
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase } from "./usecase/media/index.js";
|
|
21
|
+
import type { PublicPathResolver } from "./domain/service/PublicPathResolver.js";
|
|
22
|
+
/**
|
|
23
|
+
* `createCmsRuntime` — assembly root. Per the clean-architecture
|
|
24
|
+
* convention, this file is the only place that wires concrete
|
|
25
|
+
* adapters (`infrastructure/persistence/*`, `infrastructure/render/*`)
|
|
26
|
+
* to use cases (`usecase/content/*`, etc.) via ports
|
|
27
|
+
* (`domain/port/*`).
|
|
28
|
+
*
|
|
29
|
+
* Adapters call this once at boot, pass the required ADR-0011 ports +
|
|
30
|
+
* the consumer's manifests + handlers + templates + siteDefaults, and
|
|
31
|
+
* receive a `CmsRuntime` they expose to their HTTP framework's
|
|
32
|
+
* routing layer.
|
|
33
|
+
*
|
|
34
|
+
* `bootInit()` runs migrations, seeds `siteDefaults`, and validates
|
|
35
|
+
* the manifest set against the registry. Throws `BootValidationError`
|
|
36
|
+
* on any boot diagnostic — adapters surface the error in their init
|
|
37
|
+
* logs.
|
|
38
|
+
*/
|
|
39
|
+
export interface CreateCmsRuntimeArgs {
|
|
40
|
+
readonly manifests: readonly Manifest[];
|
|
41
|
+
readonly handlers?: Readonly<Record<string, AnyHandler>>;
|
|
42
|
+
readonly templates?: TemplateRegistry;
|
|
43
|
+
readonly siteDefaults?: SiteDefaults;
|
|
44
|
+
/** Required ADR-0011 ports. */
|
|
45
|
+
readonly db: DatabaseDriver;
|
|
46
|
+
readonly kv: KvCache;
|
|
47
|
+
readonly assets: AssetServer;
|
|
48
|
+
/** Optional public-path resolver. When set, the publish pipeline
|
|
49
|
+
* composes SEO/AEO meta on every entry render and the resolved
|
|
50
|
+
* paths drive sitemap / hreflang sibling URLs. Adapters that
|
|
51
|
+
* expose request-time render routes should also pass this through
|
|
52
|
+
* so request-time HTML matches publish-time HTML. */
|
|
53
|
+
readonly publicPathResolver?: PublicPathResolver;
|
|
54
|
+
/** Optional media storage adapter. When unset, media MCP tools and
|
|
55
|
+
* admin upload endpoints are not registered — uploads return 404 /
|
|
56
|
+
* `MEDIA_NOT_CONFIGURED`. When set, the runtime wires
|
|
57
|
+
* `CreateMediaUpload` + `CommitMediaUpload` use cases backed by
|
|
58
|
+
* this adapter. The KV mapping for pending uploads reuses `args.kv`. */
|
|
59
|
+
readonly mediaStorage?: MediaStorage;
|
|
60
|
+
/** Whether the SVG mime is allowed in `CreateMediaUpload`. Default
|
|
61
|
+
* false; object stores don't sanitize SVG payloads. */
|
|
62
|
+
readonly mediaAllowSvg?: boolean;
|
|
63
|
+
/** Optional override of the default 25 MB upload byte ceiling. */
|
|
64
|
+
readonly mediaMaxBytes?: number;
|
|
65
|
+
/** Optional deferred-delivery dispatcher for `after_*` lifecycle
|
|
66
|
+
* hooks. When set, after-hooks are enqueued through it instead of
|
|
67
|
+
* riding `ctx.waitUntil` / inline-await. Cloudflare adapter wires
|
|
68
|
+
* a Workers-Queues-backed impl by default. Absent → existing
|
|
69
|
+
* waitUntil → inline ladder applies. */
|
|
70
|
+
readonly deferredHookDispatcher?: DeferredHookDispatcher;
|
|
71
|
+
/** Optional clock — test seam. Defaults to `SystemClock`. */
|
|
72
|
+
readonly clock?: Clock;
|
|
73
|
+
/** Optional id generator — test seam. Defaults to `RandomUuidGenerator`. */
|
|
74
|
+
readonly idgen?: IdGenerator;
|
|
75
|
+
}
|
|
76
|
+
export interface CmsRuntime {
|
|
77
|
+
/** Required ADR-0011 ports — re-exposed so adapters can pass them downstream. */
|
|
78
|
+
readonly db: DatabaseDriver;
|
|
79
|
+
readonly kv: KvCache;
|
|
80
|
+
readonly assets: AssetServer;
|
|
81
|
+
/** Use cases (pre-wired with ports + clock + idgen). */
|
|
82
|
+
readonly createDraft: CreateDraftUseCase;
|
|
83
|
+
readonly updateDraft: UpdateDraftUseCase;
|
|
84
|
+
readonly getEntry: GetEntryUseCase;
|
|
85
|
+
readonly listEntries: ListEntriesUseCase;
|
|
86
|
+
readonly requestPublish: RequestPublishUseCase;
|
|
87
|
+
readonly unpublish: UnpublishUseCase;
|
|
88
|
+
readonly archive: ArchiveUseCase;
|
|
89
|
+
readonly deleteEntry: DeleteEntryUseCase;
|
|
90
|
+
readonly invokeProcedure: InvokeProcedureUseCase;
|
|
91
|
+
readonly executeView: ExecuteViewUseCase;
|
|
92
|
+
readonly composeLlmsTxt: ComposeLlmsTxtUseCase;
|
|
93
|
+
readonly composeSitemap: ComposeSitemapUseCase;
|
|
94
|
+
readonly composeEntrySeoMeta: ComposeEntrySeoMetaUseCase;
|
|
95
|
+
readonly renderEntryLive: RenderEntryLiveUseCase;
|
|
96
|
+
readonly renderListLive: RenderListLiveUseCase;
|
|
97
|
+
readonly previewEntry: PreviewEntryUseCase;
|
|
98
|
+
readonly validateBoot: ValidateBootUseCase;
|
|
99
|
+
readonly publishOrchestrator: PublishOrchestrator;
|
|
100
|
+
readonly siteConfig: SiteConfigRepository;
|
|
101
|
+
/** The resolver passed at boot, or `null` when the consumer didn't
|
|
102
|
+
* supply one. Adapters use this to derive URLs (sitemap, SEO
|
|
103
|
+
* hreflangs) without rebuilding the mapping. */
|
|
104
|
+
readonly publicPathResolver: PublicPathResolver | null;
|
|
105
|
+
/** Pre-wired media use cases when `mediaStorage` was supplied; null
|
|
106
|
+
* otherwise. Adapters route admin endpoints + MCP tools off this. */
|
|
107
|
+
readonly media: {
|
|
108
|
+
readonly storage: MediaStorage;
|
|
109
|
+
readonly createUpload: CreateMediaUploadUseCase;
|
|
110
|
+
readonly commitUpload: CommitMediaUploadUseCase;
|
|
111
|
+
} | null;
|
|
112
|
+
/** Drive a deferred after-hook from an enqueued envelope. Adapter
|
|
113
|
+
* queue consumers call `runDeferredHook.execute({ envelope, env })`
|
|
114
|
+
* with the consume-side binding bag (different invocation than
|
|
115
|
+
* the one that produced the envelope). */
|
|
116
|
+
readonly runDeferredHook: RunDeferredHookUseCase;
|
|
117
|
+
/** Adapter-helper bag. */
|
|
118
|
+
readonly registry: HandlerRegistry;
|
|
119
|
+
readonly templates: TemplateRegistry;
|
|
120
|
+
readonly schemasByName: ReadonlyMap<string, SchemaManifest>;
|
|
121
|
+
readonly proceduresByName: ReadonlyMap<string, ProcedureManifest>;
|
|
122
|
+
readonly viewsByName: ReadonlyMap<string, ViewManifest>;
|
|
123
|
+
readonly triggers: readonly TriggerManifest[];
|
|
124
|
+
readonly triggersByName: ReadonlyMap<string, TriggerManifest>;
|
|
125
|
+
readonly clock: Clock;
|
|
126
|
+
readonly idgen: IdGenerator;
|
|
127
|
+
/** Run migrations, seed siteDefaults, and validate boot. Adapters
|
|
128
|
+
* call this once per isolate before routing requests. */
|
|
129
|
+
bootInit(): Promise<void>;
|
|
130
|
+
}
|
|
131
|
+
export declare function createCmsRuntime(args: CreateCmsRuntimeArgs): CmsRuntime;
|
|
132
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { partitionManifests, } from "@aotter/mantle-spec";
|
|
2
|
+
import { SystemClock } from "./domain/port/Clock.js";
|
|
3
|
+
import { RandomUuidGenerator, } from "./domain/port/IdGenerator.js";
|
|
4
|
+
import { buildHandlerRegistry, } from "./domain/port/HandlerRegistry.js";
|
|
5
|
+
import { ArchiveUseCase, CreateDraftUseCase, DeleteEntryUseCase, GetEntryUseCase, ListEntriesUseCase, RequestPublishUseCase, UnpublishUseCase, UpdateDraftUseCase, } from "./usecase/content/index.js";
|
|
6
|
+
import { InvokeBuiltinUseCase, InvokeProcedureUseCase, } from "./usecase/procedure/index.js";
|
|
7
|
+
import { ExecuteViewUseCase } from "./usecase/view/index.js";
|
|
8
|
+
import { ValidateBootUseCase } from "./usecase/boot/index.js";
|
|
9
|
+
import { RunDeferredHookUseCase, RunLifecycleHooksUseCase, } from "./usecase/lifecycle/index.js";
|
|
10
|
+
import { ComposeEntrySeoMetaUseCase, ComposeLlmsTxtUseCase, ComposeSitemapUseCase, PreviewEntryUseCase, RenderEntryLiveUseCase, RenderListLiveUseCase, } from "./usecase/render/index.js";
|
|
11
|
+
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase, } from "./usecase/media/index.js";
|
|
12
|
+
import { TemplateRegistry as TemplateRegistryImpl } from "./domain/model/TemplateRegistry.js";
|
|
13
|
+
import { TriggerIndex } from "./domain/service/TriggerIndex.js";
|
|
14
|
+
import { DatabaseEntryRepository } from "./infrastructure/persistence/DatabaseEntryRepository.js";
|
|
15
|
+
import { DatabaseSiteConfigRepository } from "./infrastructure/persistence/DatabaseSiteConfigRepository.js";
|
|
16
|
+
import { LifecycleHookingEntryRepository } from "./infrastructure/persistence/LifecycleHookingEntryRepository.js";
|
|
17
|
+
import { HtmlPublishOrchestrator } from "./infrastructure/render/index.js";
|
|
18
|
+
import { CANONICAL_MIGRATIONS } from "./infrastructure/boot/index.js";
|
|
19
|
+
export function createCmsRuntime(args) {
|
|
20
|
+
const partitioned = partitionManifests([...args.manifests]);
|
|
21
|
+
const schemasByName = new Map();
|
|
22
|
+
for (const s of partitioned.schemas)
|
|
23
|
+
schemasByName.set(s.metadata.name, s);
|
|
24
|
+
const proceduresByName = new Map();
|
|
25
|
+
for (const p of partitioned.procedures)
|
|
26
|
+
proceduresByName.set(p.metadata.name, p);
|
|
27
|
+
const viewsByName = new Map();
|
|
28
|
+
for (const v of partitioned.views)
|
|
29
|
+
viewsByName.set(v.metadata.name, v);
|
|
30
|
+
const triggersByName = new Map();
|
|
31
|
+
for (const t of partitioned.triggers)
|
|
32
|
+
triggersByName.set(t.metadata.name, t);
|
|
33
|
+
const registry = buildHandlerRegistry(args.handlers ?? {});
|
|
34
|
+
const templates = args.templates ?? new TemplateRegistryImpl();
|
|
35
|
+
const clock = args.clock ?? SystemClock;
|
|
36
|
+
const idgen = args.idgen ?? RandomUuidGenerator;
|
|
37
|
+
// Repositories: DB-backed inner + lifecycle-hook decorator. Every
|
|
38
|
+
// mutation through `entries` (create / update / delete / archive /
|
|
39
|
+
// transitionStatus) fires the matching Triggers via
|
|
40
|
+
// `RunLifecycleHooksUseCase`. Symmetric chokepoint per POC ADR-0014:
|
|
41
|
+
// MCP, admin, and builtin paths all hit the same wrapped repository.
|
|
42
|
+
const innerEntries = new DatabaseEntryRepository(args.db);
|
|
43
|
+
const triggerIndex = new TriggerIndex(partitioned.triggers);
|
|
44
|
+
const siteConfig = new DatabaseSiteConfigRepository(args.db);
|
|
45
|
+
// `entries` is filled below — assigned via `let` so the lifecycle
|
|
46
|
+
// hooks (which run procedures, which can themselves write entries
|
|
47
|
+
// via builtin handlers) close over the wrapped repo, not the bare
|
|
48
|
+
// DB-backed one. Without this every builtin write inside a hook
|
|
49
|
+
// would skip the decorator and silently bypass downstream hooks.
|
|
50
|
+
let entries;
|
|
51
|
+
const entriesProxy = {
|
|
52
|
+
create: (a) => entries.create(a),
|
|
53
|
+
get: (id) => entries.get(id),
|
|
54
|
+
update: (a) => entries.update(a),
|
|
55
|
+
delete: (a) => entries.delete(a),
|
|
56
|
+
archive: (a) => entries.archive(a),
|
|
57
|
+
transitionStatus: (a) => entries.transitionStatus(a),
|
|
58
|
+
list: (a) => entries.list(a),
|
|
59
|
+
findByDataField: (a) => entries.findByDataField(a),
|
|
60
|
+
findByDataFields: (a) => entries.findByDataFields(a),
|
|
61
|
+
};
|
|
62
|
+
const invokeBuiltin = new InvokeBuiltinUseCase(entriesProxy, schemasByName, clock, idgen, siteConfig);
|
|
63
|
+
const invokeProcedure = new InvokeProcedureUseCase(registry, invokeBuiltin);
|
|
64
|
+
const lifecycleHooks = new RunLifecycleHooksUseCase(triggerIndex, proceduresByName, (req) => invokeProcedure.execute(req));
|
|
65
|
+
entries = new LifecycleHookingEntryRepository(innerEntries, triggerIndex, lifecycleHooks, args.deferredHookDispatcher);
|
|
66
|
+
const runDeferredHook = new RunDeferredHookUseCase(lifecycleHooks);
|
|
67
|
+
const publicPathResolver = args.publicPathResolver ?? null;
|
|
68
|
+
const composeEntrySeoMeta = new ComposeEntrySeoMetaUseCase(args.db);
|
|
69
|
+
const composeLlmsTxt = new ComposeLlmsTxtUseCase(args.db);
|
|
70
|
+
const publishOrchestrator = new HtmlPublishOrchestrator(args.db, args.kv, publicPathResolver, composeEntrySeoMeta, composeLlmsTxt, schemasByName);
|
|
71
|
+
// Content / view / boot use cases. They see `entries` only as the
|
|
72
|
+
// chokepoint port — hook firing is invisible to them.
|
|
73
|
+
const createDraft = new CreateDraftUseCase(entries, schemasByName, clock, idgen, siteConfig);
|
|
74
|
+
const updateDraft = new UpdateDraftUseCase(entries, schemasByName, clock, siteConfig);
|
|
75
|
+
const getEntry = new GetEntryUseCase(entries);
|
|
76
|
+
const listEntries = new ListEntriesUseCase(entries, schemasByName);
|
|
77
|
+
const contentPublishEffects = { publishOrchestrator, siteConfig, templates };
|
|
78
|
+
const requestPublish = new RequestPublishUseCase(entries, schemasByName, clock, contentPublishEffects, siteConfig);
|
|
79
|
+
const unpublish = new UnpublishUseCase(entries, schemasByName, clock, contentPublishEffects);
|
|
80
|
+
const archive = new ArchiveUseCase(entries, schemasByName, clock, contentPublishEffects);
|
|
81
|
+
const deleteEntry = new DeleteEntryUseCase(entries);
|
|
82
|
+
const executeView = new ExecuteViewUseCase(args.db);
|
|
83
|
+
const composeSitemap = new ComposeSitemapUseCase(args.db);
|
|
84
|
+
const renderEntryLive = new RenderEntryLiveUseCase(args.db, templates, publicPathResolver, composeEntrySeoMeta, schemasByName);
|
|
85
|
+
const renderListLive = new RenderListLiveUseCase(args.db, templates, schemasByName);
|
|
86
|
+
const previewEntry = new PreviewEntryUseCase(args.db, templates, publicPathResolver, composeEntrySeoMeta, schemasByName);
|
|
87
|
+
const validateBoot = new ValidateBootUseCase();
|
|
88
|
+
const media = args.mediaStorage
|
|
89
|
+
? {
|
|
90
|
+
storage: args.mediaStorage,
|
|
91
|
+
createUpload: new CreateMediaUploadUseCase(args.mediaStorage, args.kv, clock, siteConfig, { allowSvg: args.mediaAllowSvg ?? false, maxBytes: args.mediaMaxBytes }),
|
|
92
|
+
commitUpload: new CommitMediaUploadUseCase(args.mediaStorage, args.kv, clock, { maxBytes: args.mediaMaxBytes }),
|
|
93
|
+
}
|
|
94
|
+
: null;
|
|
95
|
+
return {
|
|
96
|
+
db: args.db,
|
|
97
|
+
kv: args.kv,
|
|
98
|
+
assets: args.assets,
|
|
99
|
+
createDraft,
|
|
100
|
+
updateDraft,
|
|
101
|
+
getEntry,
|
|
102
|
+
listEntries,
|
|
103
|
+
requestPublish,
|
|
104
|
+
unpublish,
|
|
105
|
+
archive,
|
|
106
|
+
deleteEntry,
|
|
107
|
+
invokeProcedure,
|
|
108
|
+
executeView,
|
|
109
|
+
composeLlmsTxt,
|
|
110
|
+
composeSitemap,
|
|
111
|
+
composeEntrySeoMeta,
|
|
112
|
+
renderEntryLive,
|
|
113
|
+
renderListLive,
|
|
114
|
+
previewEntry,
|
|
115
|
+
validateBoot,
|
|
116
|
+
publishOrchestrator,
|
|
117
|
+
siteConfig,
|
|
118
|
+
publicPathResolver,
|
|
119
|
+
media,
|
|
120
|
+
runDeferredHook,
|
|
121
|
+
registry,
|
|
122
|
+
templates,
|
|
123
|
+
schemasByName,
|
|
124
|
+
proceduresByName,
|
|
125
|
+
viewsByName,
|
|
126
|
+
triggers: partitioned.triggers,
|
|
127
|
+
triggersByName,
|
|
128
|
+
clock,
|
|
129
|
+
idgen,
|
|
130
|
+
async bootInit() {
|
|
131
|
+
await args.db.migrations.runAll(CANONICAL_MIGRATIONS);
|
|
132
|
+
await siteConfig.seed(args.siteDefaults);
|
|
133
|
+
const siteLocales = await siteConfig.readLocales();
|
|
134
|
+
validateBoot.assert({
|
|
135
|
+
manifests: args.manifests,
|
|
136
|
+
registry,
|
|
137
|
+
siteLocales,
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Diagnostic, type Manifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { HandlerRegistry } from "../../domain/port/HandlerRegistry.js";
|
|
3
|
+
/**
|
|
4
|
+
* `ValidateBootUseCase` — Loop 3 of the SDK authoring contract (see
|
|
5
|
+
* ADR-0007). Walks the parsed manifest set + in-memory handler
|
|
6
|
+
* registry; refuses to proceed if any load-bearing invariant is
|
|
7
|
+
* violated. Per ADR-0007: "process exit non-zero, do not serve" — a
|
|
8
|
+
* missing handler ref must surface as a deploy failure, not a runtime
|
|
9
|
+
* 500 to a customer.
|
|
10
|
+
*
|
|
11
|
+
* In Cloudflare Workers context "process exit" maps to: throw at
|
|
12
|
+
* runtime module-init so `wrangler tail` reports the init error and
|
|
13
|
+
* subsequent requests get the runtime's generic 500 (instead of
|
|
14
|
+
* unevaluated handlers being exercised).
|
|
15
|
+
*
|
|
16
|
+
* v0.1.0 invariants:
|
|
17
|
+
* - Every `Procedure.handler.ref` is in the supplied registry.
|
|
18
|
+
* - Every `Procedure.handler.builtin.schema` resolves to a declared
|
|
19
|
+
* Schema (`BUILTIN_HANDLER_SCHEMA_UNKNOWN`). Builtin op execution
|
|
20
|
+
* itself ships in `InvokeBuiltinUseCase`.
|
|
21
|
+
* - Every `Trigger.target.procedure` resolves to a manifest.
|
|
22
|
+
* - Every `http` Trigger has a unique `(method, path)` pair and a
|
|
23
|
+
* `/api/` prefix.
|
|
24
|
+
* - Every `Trigger.source.kind: lifecycle` watches a declared Schema
|
|
25
|
+
* (`LIFECYCLE_SCHEMA_UNKNOWN`). The hook runtime is the
|
|
26
|
+
* `LifecycleHookingEntryRepository` decorator.
|
|
27
|
+
* - Locale + translates cross-Schema invariants (ADR-0010) hold.
|
|
28
|
+
*/
|
|
29
|
+
export type ValidateBootResponse = {
|
|
30
|
+
readonly ok: true;
|
|
31
|
+
} | {
|
|
32
|
+
readonly ok: false;
|
|
33
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
34
|
+
};
|
|
35
|
+
export interface ValidateBootRequest {
|
|
36
|
+
readonly manifests: readonly Manifest[];
|
|
37
|
+
readonly registry: HandlerRegistry;
|
|
38
|
+
/** Site config locales (ADR-0010). Empty/absent enables the
|
|
39
|
+
* zero-locale-site path: any localized Schema fails boot with
|
|
40
|
+
* `SCHEMA_LOCALIZED_REQUIRES_SITE_LOCALES`. The runtime's
|
|
41
|
+
* bootInit reads this from `site_config` before validating. */
|
|
42
|
+
readonly siteLocales?: readonly string[];
|
|
43
|
+
}
|
|
44
|
+
export declare class ValidateBootUseCase {
|
|
45
|
+
execute(request: ValidateBootRequest): ValidateBootResponse;
|
|
46
|
+
/** Validate; on failure, throw `BootValidationError`. */
|
|
47
|
+
assert(request: ValidateBootRequest): void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Single Error wrapping every boot diagnostic. The runtime throws this
|
|
51
|
+
* during `bootInit`; adapters surface it in their init logs.
|
|
52
|
+
*/
|
|
53
|
+
export declare class BootValidationError extends Error {
|
|
54
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
55
|
+
constructor(diagnostics: readonly Diagnostic[]);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ValidateBootUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidateBootUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/boot/ValidateBootUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,QAAQ,EAId,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAG5E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC;;;oEAGgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,oBAAoB;IAkG3D,yDAAyD;IACzD,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;CAI3C;AA+ED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAChB,WAAW,EAAE,SAAS,UAAU,EAAE;gBAAlC,WAAW,EAAE,SAAS,UAAU,EAAE;CAW/D"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { bootDiagnostic, partitionManifests, checkLocaleAndTranslates, } from "@aotter/mantle-spec";
|
|
2
|
+
import { mcpToolNameSegment } from "../../domain/service/McpToolNaming.js";
|
|
3
|
+
export class ValidateBootUseCase {
|
|
4
|
+
execute(request) {
|
|
5
|
+
const partitioned = partitionManifests([...request.manifests]);
|
|
6
|
+
const proceduresByName = new Map();
|
|
7
|
+
for (const p of partitioned.procedures)
|
|
8
|
+
proceduresByName.set(p.metadata.name, p);
|
|
9
|
+
const schemasByName = new Map();
|
|
10
|
+
for (const s of partitioned.schemas)
|
|
11
|
+
schemasByName.set(s.metadata.name, s);
|
|
12
|
+
const diagnostics = [];
|
|
13
|
+
const procedureCandidates = [...proceduresByName.keys()];
|
|
14
|
+
const schemaCandidates = [...schemasByName.keys()];
|
|
15
|
+
const handlerCandidates = request.registry.list();
|
|
16
|
+
// 1. Procedure handler refs + builtin schema cross-resolution.
|
|
17
|
+
for (const p of partitioned.procedures) {
|
|
18
|
+
const h = p.spec.handler;
|
|
19
|
+
if (h.kind === "ref" && !request.registry.has(h.ref)) {
|
|
20
|
+
diagnostics.push(bootDiagnostic({
|
|
21
|
+
code: "HANDLER_NOT_REGISTERED",
|
|
22
|
+
severity: "error",
|
|
23
|
+
path: `manifest:Procedure/${p.metadata.name}#/spec/handler/ref`,
|
|
24
|
+
value: h.ref,
|
|
25
|
+
expected: `a function registered via the handlers option / sdk.registerHandler('${h.ref}', fn)`,
|
|
26
|
+
candidates: handlerCandidates,
|
|
27
|
+
message: `Procedure '${p.metadata.name}' declares handler.ref '${h.ref}' but no handler is registered for that key. Wire it in your project's handlers map: { '${h.ref}': ... }.`,
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
if (h.kind === "builtin" && !schemasByName.has(h.schema)) {
|
|
31
|
+
diagnostics.push(bootDiagnostic({
|
|
32
|
+
code: "BUILTIN_HANDLER_SCHEMA_UNKNOWN",
|
|
33
|
+
severity: "error",
|
|
34
|
+
path: `manifest:Procedure/${p.metadata.name}#/spec/handler/schema`,
|
|
35
|
+
value: h.schema,
|
|
36
|
+
expected: "name of a declared Schema",
|
|
37
|
+
candidates: schemaCandidates,
|
|
38
|
+
message: `Procedure '${p.metadata.name}' (handler.kind: builtin) targets unknown Schema '${h.schema}'.`,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// 2. Trigger.target.procedure resolves.
|
|
43
|
+
for (const t of partitioned.triggers) {
|
|
44
|
+
if (!proceduresByName.has(t.spec.target.procedure)) {
|
|
45
|
+
diagnostics.push(bootDiagnostic({
|
|
46
|
+
code: "TRIGGER_TARGET_PROCEDURE_UNKNOWN",
|
|
47
|
+
severity: "error",
|
|
48
|
+
path: `manifest:Trigger/${t.metadata.name}#/spec/target/procedure`,
|
|
49
|
+
value: t.spec.target.procedure,
|
|
50
|
+
expected: "name of a declared Procedure",
|
|
51
|
+
candidates: procedureCandidates,
|
|
52
|
+
message: `Trigger '${t.metadata.name}' targets unknown Procedure '${t.spec.target.procedure}'.`,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
if (t.spec.source.kind === "lifecycle") {
|
|
56
|
+
if (!schemasByName.has(t.spec.source.schema)) {
|
|
57
|
+
diagnostics.push(bootDiagnostic({
|
|
58
|
+
code: "LIFECYCLE_SCHEMA_UNKNOWN",
|
|
59
|
+
severity: "error",
|
|
60
|
+
path: `manifest:Trigger/${t.metadata.name}#/spec/source/schema`,
|
|
61
|
+
value: t.spec.source.schema,
|
|
62
|
+
expected: "name of a declared Schema",
|
|
63
|
+
candidates: schemaCandidates,
|
|
64
|
+
message: `Trigger '${t.metadata.name}' watches unknown Schema '${t.spec.source.schema}'.`,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// 3. HTTP trigger uniqueness + /api/ prefix.
|
|
70
|
+
diagnostics.push(...checkHttpRouteCollisions(partitioned.triggers));
|
|
71
|
+
diagnostics.push(...checkHttpRoutePrefix(partitioned.triggers));
|
|
72
|
+
// 4. MCP tool-name collision (POC PR #48): per-collection tool
|
|
73
|
+
// emission lowercases + kebab→snake the Schema name; two
|
|
74
|
+
// Schemas that mangle to the same suffix would silently
|
|
75
|
+
// overwrite each other in `tools/list`.
|
|
76
|
+
diagnostics.push(...checkMcpToolNameCollisions(partitioned.schemas));
|
|
77
|
+
// 5. Locale + translates cross-Schema invariants.
|
|
78
|
+
diagnostics.push(...checkLocaleAndTranslates({
|
|
79
|
+
schemas: partitioned.schemas,
|
|
80
|
+
phase: "boot",
|
|
81
|
+
siteLocales: request.siteLocales,
|
|
82
|
+
}));
|
|
83
|
+
if (diagnostics.length === 0)
|
|
84
|
+
return { ok: true };
|
|
85
|
+
return { ok: false, diagnostics };
|
|
86
|
+
}
|
|
87
|
+
/** Validate; on failure, throw `BootValidationError`. */
|
|
88
|
+
assert(request) {
|
|
89
|
+
const result = this.execute(request);
|
|
90
|
+
if (!result.ok)
|
|
91
|
+
throw new BootValidationError(result.diagnostics);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function checkHttpRouteCollisions(triggers) {
|
|
95
|
+
const seen = new Map();
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const t of triggers) {
|
|
98
|
+
if (t.spec.source.kind !== "http")
|
|
99
|
+
continue;
|
|
100
|
+
const key = `${t.spec.source.method} ${t.spec.source.path}`;
|
|
101
|
+
const prior = seen.get(key);
|
|
102
|
+
if (prior) {
|
|
103
|
+
out.push(bootDiagnostic({
|
|
104
|
+
code: "TRIGGER_PATH_COLLISION",
|
|
105
|
+
severity: "error",
|
|
106
|
+
path: `manifest:Trigger/${t.metadata.name}#/spec/source`,
|
|
107
|
+
value: key,
|
|
108
|
+
expected: `unique (method, path) across http Triggers (also declared by '${prior}')`,
|
|
109
|
+
message: `Trigger '${t.metadata.name}' shares route ${key} with Trigger '${prior}'.`,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
seen.set(key, t.metadata.name);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
function checkHttpRoutePrefix(triggers) {
|
|
119
|
+
const out = [];
|
|
120
|
+
for (const t of triggers) {
|
|
121
|
+
if (t.spec.source.kind !== "http")
|
|
122
|
+
continue;
|
|
123
|
+
const path = t.spec.source.path;
|
|
124
|
+
if (!path.startsWith("/api/")) {
|
|
125
|
+
out.push(bootDiagnostic({
|
|
126
|
+
code: "TRIGGER_PATH_INVALID",
|
|
127
|
+
severity: "error",
|
|
128
|
+
path: `manifest:Trigger/${t.metadata.name}#/spec/source/path`,
|
|
129
|
+
value: path,
|
|
130
|
+
expected: "path starting with '/api/'",
|
|
131
|
+
message: `Trigger '${t.metadata.name}' has path '${path}' — http Trigger ` +
|
|
132
|
+
`paths MUST start with '/api/' so adapters can route public ` +
|
|
133
|
+
`pages and Procedure endpoints without ambiguity.`,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
function checkMcpToolNameCollisions(schemas) {
|
|
140
|
+
const seen = new Map();
|
|
141
|
+
const out = [];
|
|
142
|
+
for (const s of schemas) {
|
|
143
|
+
const segment = mcpToolNameSegment(s.metadata.name);
|
|
144
|
+
const prior = seen.get(segment);
|
|
145
|
+
if (prior && prior !== s.metadata.name) {
|
|
146
|
+
out.push(bootDiagnostic({
|
|
147
|
+
code: "MCP_TOOL_NAME_COLLISION",
|
|
148
|
+
severity: "error",
|
|
149
|
+
path: `manifest:Schema/${s.metadata.name}#/metadata/name`,
|
|
150
|
+
value: segment,
|
|
151
|
+
expected: `Schema name unique after kebab→snake mangling (collides with '${prior}')`,
|
|
152
|
+
message: `Schema '${s.metadata.name}' mangles to MCP tool suffix '${segment}', ` +
|
|
153
|
+
`which already comes from Schema '${prior}'. Rename one of the Schemas ` +
|
|
154
|
+
`(e.g. avoid mixing '${prior}' and '${s.metadata.name}') so per-collection ` +
|
|
155
|
+
`MCP tool emission stays unambiguous.`,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
else if (!prior) {
|
|
159
|
+
seen.set(segment, s.metadata.name);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Single Error wrapping every boot diagnostic. The runtime throws this
|
|
166
|
+
* during `bootInit`; adapters surface it in their init logs.
|
|
167
|
+
*/
|
|
168
|
+
export class BootValidationError extends Error {
|
|
169
|
+
diagnostics;
|
|
170
|
+
constructor(diagnostics) {
|
|
171
|
+
const summary = diagnostics
|
|
172
|
+
.map((d) => ` - ${d.code} (phase: ${d.phase}) at ${d.path}: ${d.message}`)
|
|
173
|
+
.join("\n");
|
|
174
|
+
super(`Runtime boot validation failed (${diagnostics.length} error(s)):\n${summary}\n\n` +
|
|
175
|
+
`See ADR-0007 (boot-time fail-fast) for context. Diagnostics also ` +
|
|
176
|
+
`available on the .diagnostics field of this error for programmatic handling.`);
|
|
177
|
+
this.diagnostics = diagnostics;
|
|
178
|
+
this.name = "BootValidationError";
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=ValidateBootUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidateBootUseCase.js","sourceRoot":"","sources":["../../../src/usecase/boot/ValidateBootUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/boot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/boot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { EntryRow } from "../../domain/model/EntryRow.js";
|
|
3
|
+
import type { Clock } from "../../domain/port/Clock.js";
|
|
4
|
+
import type { EntryRepository } from "../../domain/port/EntryRepository.js";
|
|
5
|
+
import type { ArchiveRequest } from "../dto/content/index.js";
|
|
6
|
+
import { type ContentPublishEffects } from "./ContentPublishEffects.js";
|
|
7
|
+
/**
|
|
8
|
+
* `ArchiveUseCase` — flip an entry to `'archived'`. Per the simple-
|
|
9
|
+
* lifecycle state machine, draft and published rows can both be
|
|
10
|
+
* archived; archived rows go back to draft via `Unpublish`.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ArchiveUseCase {
|
|
13
|
+
private readonly entries;
|
|
14
|
+
private readonly schemas;
|
|
15
|
+
private readonly clock;
|
|
16
|
+
private readonly effects?;
|
|
17
|
+
constructor(entries: EntryRepository, schemas: ReadonlyMap<string, SchemaManifest>, clock: Clock, effects?: ContentPublishEffects | undefined);
|
|
18
|
+
execute(request: ArchiveRequest): Promise<EntryRow>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ArchiveUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArchiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/ArchiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAOpC;;;;GAIG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAHR,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,qBAAqB,YAAA;IAG5C,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;CA8B1D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { canTransition, DiagnosticError, } from "@aotter/mantle-spec";
|
|
2
|
+
import { unpublishCache, } from "./ContentPublishEffects.js";
|
|
3
|
+
import { illegalTransitionDiagnostic, notFoundDiagnostic, withConflictDiagnostic, } from "./diagnostics.js";
|
|
4
|
+
/**
|
|
5
|
+
* `ArchiveUseCase` — flip an entry to `'archived'`. Per the simple-
|
|
6
|
+
* lifecycle state machine, draft and published rows can both be
|
|
7
|
+
* archived; archived rows go back to draft via `Unpublish`.
|
|
8
|
+
*/
|
|
9
|
+
export class ArchiveUseCase {
|
|
10
|
+
entries;
|
|
11
|
+
schemas;
|
|
12
|
+
clock;
|
|
13
|
+
effects;
|
|
14
|
+
constructor(entries, schemas, clock, effects) {
|
|
15
|
+
this.entries = entries;
|
|
16
|
+
this.schemas = schemas;
|
|
17
|
+
this.clock = clock;
|
|
18
|
+
this.effects = effects;
|
|
19
|
+
}
|
|
20
|
+
async execute(request) {
|
|
21
|
+
const opPath = `usecase/Archive/${request.id}`;
|
|
22
|
+
const existing = await this.entries.get(request.id);
|
|
23
|
+
if (!existing) {
|
|
24
|
+
throw new DiagnosticError(notFoundDiagnostic(opPath, "<unknown>", request.id));
|
|
25
|
+
}
|
|
26
|
+
const schema = this.schemas.get(existing.collection);
|
|
27
|
+
if (!canTransition(schema, existing.status, "archived")) {
|
|
28
|
+
throw new DiagnosticError(illegalTransitionDiagnostic(opPath, existing.status, "archived"));
|
|
29
|
+
}
|
|
30
|
+
// Pin OCC to the version we just fetched so the guard above
|
|
31
|
+
// (canTransition against existing.status) and the chokepoint
|
|
32
|
+
// assertion see the same snapshot. Caller-supplied
|
|
33
|
+
// request.expectedVersion is deprecated — kept on the DTO for
|
|
34
|
+
// backwards compat but no longer load-bearing.
|
|
35
|
+
const archived = await withConflictDiagnostic(opPath, () => this.entries.archive({
|
|
36
|
+
id: request.id,
|
|
37
|
+
collection: existing.collection,
|
|
38
|
+
expectedVersion: existing.version,
|
|
39
|
+
now: this.clock.now(),
|
|
40
|
+
hookContext: request.ctx,
|
|
41
|
+
originalInput: request.originalInput,
|
|
42
|
+
}));
|
|
43
|
+
await unpublishCache(this.effects, archived.id);
|
|
44
|
+
return archived;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=ArchiveUseCase.js.map
|