@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 @@
|
|
|
1
|
+
{"version":3,"file":"ArchiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/ArchiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,GAEhB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EACL,cAAc,GAEf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAEN;IACA;IACA;IACA;IAJnB,YACmB,OAAwB,EACxB,OAA4C,EAC5C,KAAY,EACZ,OAA+B;QAH/B,YAAO,GAAP,OAAO,CAAiB;QACxB,YAAO,GAAP,OAAO,CAAqC;QAC5C,UAAK,GAAL,KAAK,CAAO;QACZ,YAAO,GAAP,OAAO,CAAwB;IAC/C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,MAAM,GAAG,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,eAAe,CACvB,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CACjE,CAAC;QACJ,CAAC;QACD,4DAA4D;QAC5D,6DAA6D;QAC7D,mDAAmD;QACnD,8DAA8D;QAC9D,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CACzD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACnB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,eAAe,EAAE,QAAQ,CAAC,OAAO;YACjC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,GAAG;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CACH,CAAC;QACF,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
2
|
+
import type { PublishOrchestrator } from "../../domain/port/PublishOrchestrator.js";
|
|
3
|
+
import type { SiteConfigRepository } from "../../domain/port/SiteConfigRepository.js";
|
|
4
|
+
export interface ContentPublishEffects {
|
|
5
|
+
readonly publishOrchestrator: PublishOrchestrator;
|
|
6
|
+
readonly siteConfig: SiteConfigRepository;
|
|
7
|
+
readonly templates: TemplateRegistry;
|
|
8
|
+
}
|
|
9
|
+
export declare function publishCache(effects: ContentPublishEffects | undefined, entryId: string): Promise<void>;
|
|
10
|
+
export declare function unpublishCache(effects: ContentPublishEffects | undefined, entryId: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=ContentPublishEffects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentPublishEffects.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/ContentPublishEffects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export async function publishCache(effects, entryId) {
|
|
2
|
+
if (!effects)
|
|
3
|
+
return;
|
|
4
|
+
const site = await effects.siteConfig.load();
|
|
5
|
+
await effects.publishOrchestrator.publish({
|
|
6
|
+
entryId,
|
|
7
|
+
site,
|
|
8
|
+
templates: effects.templates,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export async function unpublishCache(effects, entryId) {
|
|
12
|
+
if (!effects)
|
|
13
|
+
return;
|
|
14
|
+
const site = await effects.siteConfig.load();
|
|
15
|
+
await effects.publishOrchestrator.unpublish({
|
|
16
|
+
entryId,
|
|
17
|
+
site,
|
|
18
|
+
templates: effects.templates,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ContentPublishEffects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentPublishEffects.js","sourceRoot":"","sources":["../../../src/usecase/content/ContentPublishEffects.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA0C,EAC1C,OAAe;IAEf,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC;QACxC,OAAO;QACP,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA0C,EAC1C,OAAe;IAEf,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC;QAC1C,OAAO;QACP,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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 { IdGenerator } from "../../domain/port/IdGenerator.js";
|
|
6
|
+
import type { SiteConfigRepository } from "../../domain/port/SiteConfigRepository.js";
|
|
7
|
+
import type { CreateDraftRequest } from "../dto/content/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* `CreateDraftUseCase` — create a new draft entry. Both `simple` and
|
|
10
|
+
* `editorial` lifecycles start in `'draft'`; the difference shows up
|
|
11
|
+
* at publish time.
|
|
12
|
+
*/
|
|
13
|
+
export declare class CreateDraftUseCase {
|
|
14
|
+
private readonly entries;
|
|
15
|
+
private readonly schemas;
|
|
16
|
+
private readonly clock;
|
|
17
|
+
private readonly idgen;
|
|
18
|
+
private readonly siteConfig?;
|
|
19
|
+
constructor(entries: EntryRepository, schemas: ReadonlyMap<string, SchemaManifest>, clock: Clock, idgen: IdGenerator, siteConfig?: SiteConfigRepository | undefined);
|
|
20
|
+
execute(request: CreateDraftRequest): Promise<EntryRow>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=CreateDraftUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateDraftUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/CreateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,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,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAOlE;;;;GAIG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAJX,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,WAAW,EAClB,UAAU,CAAC,EAAE,oBAAoB,YAAA;IAG9C,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAgC9D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { DiagnosticError, } from "@aotter/mantle-spec";
|
|
2
|
+
import { projectAndStamp } from "../../domain/service/BuiltinProjector.js";
|
|
3
|
+
import { schemaUnknownDiagnostic, withConflictDiagnostic, } from "./diagnostics.js";
|
|
4
|
+
import { assertEntryWritable } from "../../domain/service/io/EntryWriteGuard.js";
|
|
5
|
+
/**
|
|
6
|
+
* `CreateDraftUseCase` — create a new draft entry. Both `simple` and
|
|
7
|
+
* `editorial` lifecycles start in `'draft'`; the difference shows up
|
|
8
|
+
* at publish time.
|
|
9
|
+
*/
|
|
10
|
+
export class CreateDraftUseCase {
|
|
11
|
+
entries;
|
|
12
|
+
schemas;
|
|
13
|
+
clock;
|
|
14
|
+
idgen;
|
|
15
|
+
siteConfig;
|
|
16
|
+
constructor(entries, schemas, clock, idgen, siteConfig) {
|
|
17
|
+
this.entries = entries;
|
|
18
|
+
this.schemas = schemas;
|
|
19
|
+
this.clock = clock;
|
|
20
|
+
this.idgen = idgen;
|
|
21
|
+
this.siteConfig = siteConfig;
|
|
22
|
+
}
|
|
23
|
+
async execute(request) {
|
|
24
|
+
const opPath = `usecase/CreateDraft/${request.collection}`;
|
|
25
|
+
const schema = this.schemas.get(request.collection);
|
|
26
|
+
if (!schema) {
|
|
27
|
+
throw new DiagnosticError(schemaUnknownDiagnostic(opPath, request.collection, [...this.schemas.keys()]));
|
|
28
|
+
}
|
|
29
|
+
const id = this.idgen.next();
|
|
30
|
+
const now = this.clock.now();
|
|
31
|
+
const ctx = authoringContext(request.ctx, request.authorId);
|
|
32
|
+
const data = projectAndStamp({ schema, input: request.data, ctx, clockNow: now });
|
|
33
|
+
await assertEntryWritable({
|
|
34
|
+
opPath,
|
|
35
|
+
entries: this.entries,
|
|
36
|
+
schema,
|
|
37
|
+
data,
|
|
38
|
+
siteConfig: this.siteConfig,
|
|
39
|
+
});
|
|
40
|
+
return withConflictDiagnostic(opPath, () => this.entries.create({
|
|
41
|
+
id,
|
|
42
|
+
collection: request.collection,
|
|
43
|
+
status: "draft",
|
|
44
|
+
data,
|
|
45
|
+
authorId: request.authorId,
|
|
46
|
+
now,
|
|
47
|
+
hookContext: ctx,
|
|
48
|
+
originalInput: request.originalInput,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function authoringContext(ctx, authorId) {
|
|
53
|
+
if (ctx)
|
|
54
|
+
return ctx;
|
|
55
|
+
return {
|
|
56
|
+
user: authorId ? { id: authorId } : null,
|
|
57
|
+
staff: null,
|
|
58
|
+
env: {},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=CreateDraftUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateDraftUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/CreateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAEhB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAEjF;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IACA;IACA;IALnB,YACmB,OAAwB,EACxB,OAA4C,EAC5C,KAAY,EACZ,KAAkB,EAClB,UAAiC;QAJjC,YAAO,GAAP,OAAO,CAAiB;QACxB,YAAO,GAAP,OAAO,CAAqC;QAC5C,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAa;QAClB,eAAU,GAAV,UAAU,CAAuB;IACjD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,MAAM,GAAG,uBAAuB,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CACvB,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAClF,MAAM,mBAAmB,CAAC;YACxB,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QACH,OAAO,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAClB,EAAE;YACF,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO;YACf,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG;YACH,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,GAA+B,EAAE,QAAuB;IAChF,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACxC,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,EAAE;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EntryRepository } from "../../domain/port/EntryRepository.js";
|
|
2
|
+
import type { DeleteEntryRequest, DeleteEntryResponse } from "../dto/content/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* `DeleteEntryUseCase` — permanently delete an entry + cascade
|
|
5
|
+
* revisions / approvals. Distinct from `Archive` — archive is a
|
|
6
|
+
* status flip, delete removes rows.
|
|
7
|
+
*
|
|
8
|
+
* The chokepoint enforces the cascade via `DatabaseDriver.batch`. We
|
|
9
|
+
* still read the row first so missing ids surface as a structured
|
|
10
|
+
* `NOT_FOUND` (matching every other content-op use case) instead of
|
|
11
|
+
* a silent `{ removed: false }` — callers building UIs need the
|
|
12
|
+
* diagnostic to distinguish "you deleted nothing" from "you tried to
|
|
13
|
+
* delete a ghost."
|
|
14
|
+
*/
|
|
15
|
+
export declare class DeleteEntryUseCase {
|
|
16
|
+
private readonly entries;
|
|
17
|
+
constructor(entries: EntryRepository);
|
|
18
|
+
execute(request: DeleteEntryRequest): Promise<DeleteEntryResponse>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=DeleteEntryUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/DeleteEntryUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,eAAe;IAE/C,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAazE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
2
|
+
import { notFoundDiagnostic } from "./diagnostics.js";
|
|
3
|
+
/**
|
|
4
|
+
* `DeleteEntryUseCase` — permanently delete an entry + cascade
|
|
5
|
+
* revisions / approvals. Distinct from `Archive` — archive is a
|
|
6
|
+
* status flip, delete removes rows.
|
|
7
|
+
*
|
|
8
|
+
* The chokepoint enforces the cascade via `DatabaseDriver.batch`. We
|
|
9
|
+
* still read the row first so missing ids surface as a structured
|
|
10
|
+
* `NOT_FOUND` (matching every other content-op use case) instead of
|
|
11
|
+
* a silent `{ removed: false }` — callers building UIs need the
|
|
12
|
+
* diagnostic to distinguish "you deleted nothing" from "you tried to
|
|
13
|
+
* delete a ghost."
|
|
14
|
+
*/
|
|
15
|
+
export class DeleteEntryUseCase {
|
|
16
|
+
entries;
|
|
17
|
+
constructor(entries) {
|
|
18
|
+
this.entries = entries;
|
|
19
|
+
}
|
|
20
|
+
async execute(request) {
|
|
21
|
+
const opPath = `usecase/DeleteEntry/${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
|
+
return this.entries.delete({
|
|
27
|
+
id: request.id,
|
|
28
|
+
collection: existing.collection,
|
|
29
|
+
hookContext: request.ctx,
|
|
30
|
+
originalInput: request.originalInput,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=DeleteEntryUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/DeleteEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEzD,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,MAAM,GAAG,uBAAuB,OAAO,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACzB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW,EAAE,OAAO,CAAC,GAAG;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EntryRow } from "../../domain/model/EntryRow.js";
|
|
2
|
+
import type { EntryRepository } from "../../domain/port/EntryRepository.js";
|
|
3
|
+
import type { GetEntryRequest } from "../dto/content/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* `GetEntryUseCase` — fetch an entry by id, optionally asserting its
|
|
6
|
+
* collection matches.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GetEntryUseCase {
|
|
9
|
+
private readonly entries;
|
|
10
|
+
constructor(entries: EntryRepository);
|
|
11
|
+
execute(request: GetEntryRequest): Promise<EntryRow>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=GetEntryUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/GetEntryUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,eAAe;IAE/C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;CAe3D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
2
|
+
import { notFoundDiagnostic } from "./diagnostics.js";
|
|
3
|
+
/**
|
|
4
|
+
* `GetEntryUseCase` — fetch an entry by id, optionally asserting its
|
|
5
|
+
* collection matches.
|
|
6
|
+
*/
|
|
7
|
+
export class GetEntryUseCase {
|
|
8
|
+
entries;
|
|
9
|
+
constructor(entries) {
|
|
10
|
+
this.entries = entries;
|
|
11
|
+
}
|
|
12
|
+
async execute(request) {
|
|
13
|
+
const opPath = `usecase/GetEntry/${request.id}`;
|
|
14
|
+
const row = await this.entries.get(request.id);
|
|
15
|
+
if (!row) {
|
|
16
|
+
throw new DiagnosticError(notFoundDiagnostic(opPath, request.collection ?? "<any>", request.id));
|
|
17
|
+
}
|
|
18
|
+
if (request.collection && row.collection !== request.collection) {
|
|
19
|
+
throw new DiagnosticError(notFoundDiagnostic(opPath, request.collection, request.id));
|
|
20
|
+
}
|
|
21
|
+
return row;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=GetEntryUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/GetEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEzD,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,MAAM,MAAM,GAAG,oBAAoB,OAAO,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,eAAe,CACvB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;YAChE,MAAM,IAAI,eAAe,CACvB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAC3D,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { EntryRow } from "../../domain/model/EntryRow.js";
|
|
3
|
+
import type { EntryRepository } from "../../domain/port/EntryRepository.js";
|
|
4
|
+
import type { ListEntriesRequest, ListEntriesResponse } from "../dto/content/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* `ListEntriesUseCase` — list entries in a collection, optionally
|
|
7
|
+
* filtered by status. Asserts the collection is a declared Schema.
|
|
8
|
+
*
|
|
9
|
+
* Two methods, two audiences:
|
|
10
|
+
*
|
|
11
|
+
* - `execute(req): readonly EntryRow[]` — what app code wants. A flat
|
|
12
|
+
* array, ready for `.find(...)` / `.filter(...)` / `.map(...)`. No
|
|
13
|
+
* pagination wrapper to unwrap. Returns one clamped page; if the
|
|
14
|
+
* collection has more rows than `limit`, they're silently dropped
|
|
15
|
+
* — agent authors who care about that reach for `executePage`.
|
|
16
|
+
*
|
|
17
|
+
* - `executePage(req): ListEntriesResponse<EntryRow>` — what
|
|
18
|
+
* cursor-aware callers (MCP `list_entries`, admin pagination,
|
|
19
|
+
* long-tail walkers) want. Returns `{ rows, nextCursor? }`.
|
|
20
|
+
*
|
|
21
|
+
* Why split: the CLAM thesis says the runtime should carry complexity
|
|
22
|
+
* away from authors. Asking a starter author to write
|
|
23
|
+
* `runtime.listEntries.execute(...).rows.find(...)` for the 99% case
|
|
24
|
+
* (small collection, single page is enough) is the runtime pushing
|
|
25
|
+
* cursor-walking concerns into authoring code. Two methods is one
|
|
26
|
+
* extra symbol on the use case — paid by the runtime, not the author.
|
|
27
|
+
*
|
|
28
|
+
* Caller-supplied `limit` is clamped at this layer (the trust
|
|
29
|
+
* boundary between MCP / admin transports and the chokepoint
|
|
30
|
+
* `EntryRepository`). Cursor is round-tripped opaquely.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ListEntriesUseCase {
|
|
33
|
+
private readonly entries;
|
|
34
|
+
private readonly schemas;
|
|
35
|
+
constructor(entries: EntryRepository, schemas: ReadonlyMap<string, SchemaManifest>);
|
|
36
|
+
execute(request: ListEntriesRequest): Promise<readonly EntryRow[]>;
|
|
37
|
+
executePage(request: ListEntriesRequest): Promise<ListEntriesResponse<EntryRow>>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ListEntriesUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListEntriesUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/ListEntriesUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAGzD,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC;IAKlE,WAAW,CACf,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CAiB1C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DiagnosticError, } from "@aotter/mantle-spec";
|
|
2
|
+
import { clampLimit } from "../../domain/service/Pagination.js";
|
|
3
|
+
import { schemaUnknownDiagnostic } from "./diagnostics.js";
|
|
4
|
+
/**
|
|
5
|
+
* `ListEntriesUseCase` — list entries in a collection, optionally
|
|
6
|
+
* filtered by status. Asserts the collection is a declared Schema.
|
|
7
|
+
*
|
|
8
|
+
* Two methods, two audiences:
|
|
9
|
+
*
|
|
10
|
+
* - `execute(req): readonly EntryRow[]` — what app code wants. A flat
|
|
11
|
+
* array, ready for `.find(...)` / `.filter(...)` / `.map(...)`. No
|
|
12
|
+
* pagination wrapper to unwrap. Returns one clamped page; if the
|
|
13
|
+
* collection has more rows than `limit`, they're silently dropped
|
|
14
|
+
* — agent authors who care about that reach for `executePage`.
|
|
15
|
+
*
|
|
16
|
+
* - `executePage(req): ListEntriesResponse<EntryRow>` — what
|
|
17
|
+
* cursor-aware callers (MCP `list_entries`, admin pagination,
|
|
18
|
+
* long-tail walkers) want. Returns `{ rows, nextCursor? }`.
|
|
19
|
+
*
|
|
20
|
+
* Why split: the CLAM thesis says the runtime should carry complexity
|
|
21
|
+
* away from authors. Asking a starter author to write
|
|
22
|
+
* `runtime.listEntries.execute(...).rows.find(...)` for the 99% case
|
|
23
|
+
* (small collection, single page is enough) is the runtime pushing
|
|
24
|
+
* cursor-walking concerns into authoring code. Two methods is one
|
|
25
|
+
* extra symbol on the use case — paid by the runtime, not the author.
|
|
26
|
+
*
|
|
27
|
+
* Caller-supplied `limit` is clamped at this layer (the trust
|
|
28
|
+
* boundary between MCP / admin transports and the chokepoint
|
|
29
|
+
* `EntryRepository`). Cursor is round-tripped opaquely.
|
|
30
|
+
*/
|
|
31
|
+
export class ListEntriesUseCase {
|
|
32
|
+
entries;
|
|
33
|
+
schemas;
|
|
34
|
+
constructor(entries, schemas) {
|
|
35
|
+
this.entries = entries;
|
|
36
|
+
this.schemas = schemas;
|
|
37
|
+
}
|
|
38
|
+
async execute(request) {
|
|
39
|
+
const page = await this.executePage(request);
|
|
40
|
+
return page.rows;
|
|
41
|
+
}
|
|
42
|
+
async executePage(request) {
|
|
43
|
+
const opPath = `usecase/ListEntries/${request.collection}`;
|
|
44
|
+
if (!this.schemas.has(request.collection)) {
|
|
45
|
+
throw new DiagnosticError(schemaUnknownDiagnostic(opPath, request.collection, [...this.schemas.keys()]));
|
|
46
|
+
}
|
|
47
|
+
// `ListEntriesResult` is structurally identical to
|
|
48
|
+
// `ListEntriesResponse<EntryRow>` — pass it through rather than
|
|
49
|
+
// re-spreading field-by-field.
|
|
50
|
+
return this.entries.list({
|
|
51
|
+
collection: request.collection,
|
|
52
|
+
status: request.status,
|
|
53
|
+
limit: clampLimit(request.limit),
|
|
54
|
+
cursor: request.cursor,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ListEntriesUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListEntriesUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/ListEntriesUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAEhB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAKhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,kBAAkB;IAEV;IACA;IAFnB,YACmB,OAAwB,EACxB,OAA4C;QAD5C,YAAO,GAAP,OAAO,CAAiB;QACxB,YAAO,GAAP,OAAO,CAAqC;IAC5D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAA2B;QAE3B,MAAM,MAAM,GAAG,uBAAuB,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,eAAe,CACvB,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAC9E,CAAC;QACJ,CAAC;QACD,mDAAmD;QACnD,gEAAgE;QAChE,+BAA+B;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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 { SiteConfigRepository } from "../../domain/port/SiteConfigRepository.js";
|
|
6
|
+
import type { RequestPublishRequest } from "../dto/content/index.js";
|
|
7
|
+
import { type ContentPublishEffects } from "./ContentPublishEffects.js";
|
|
8
|
+
/**
|
|
9
|
+
* `RequestPublishUseCase` — publish or queue-for-approval, depending
|
|
10
|
+
* on the Schema's `lifecycle` mode.
|
|
11
|
+
*
|
|
12
|
+
* v0.1.0 ships `simple` only — request goes straight to `published`
|
|
13
|
+
* with a status guard via the spec's state machine. The Schema parser
|
|
14
|
+
* accepts `lifecycle: editorial` (it's a v0.1.x-committed mode in
|
|
15
|
+
* `V01_LIFECYCLE_MODES`), so this use case is the only line of
|
|
16
|
+
* defense: when a Schema declares `editorial`, it surfaces a
|
|
17
|
+
* structured `LIFECYCLE_NOT_IN_V010` error here at request time.
|
|
18
|
+
* The approvals-queue branch lands in v0.1.x.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RequestPublishUseCase {
|
|
21
|
+
private readonly entries;
|
|
22
|
+
private readonly schemas;
|
|
23
|
+
private readonly clock;
|
|
24
|
+
private readonly effects?;
|
|
25
|
+
private readonly siteConfig?;
|
|
26
|
+
constructor(entries: EntryRepository, schemas: ReadonlyMap<string, SchemaManifest>, clock: Clock, effects?: ContentPublishEffects | undefined, siteConfig?: SiteConfigRepository | undefined);
|
|
27
|
+
execute(request: RequestPublishRequest): Promise<EntryRow>;
|
|
28
|
+
private assertTranslatesParentPublished;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=RequestPublishUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestPublishUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/RequestPublishUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,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,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAQpC;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAJX,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,qBAAqB,YAAA,EAC/B,UAAU,CAAC,EAAE,oBAAoB,YAAA;IAG9C,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC;YAwDlD,+BAA+B;CAsB9C"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { canTransition, DiagnosticError, publishRequiresApproval, resolveLifecycle, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
|
+
import { publishCache, } from "./ContentPublishEffects.js";
|
|
3
|
+
import { illegalTransitionDiagnostic, notFoundDiagnostic, withConflictDiagnostic, } from "./diagnostics.js";
|
|
4
|
+
import { assertEntryWritable } from "../../domain/service/io/EntryWriteGuard.js";
|
|
5
|
+
/**
|
|
6
|
+
* `RequestPublishUseCase` — publish or queue-for-approval, depending
|
|
7
|
+
* on the Schema's `lifecycle` mode.
|
|
8
|
+
*
|
|
9
|
+
* v0.1.0 ships `simple` only — request goes straight to `published`
|
|
10
|
+
* with a status guard via the spec's state machine. The Schema parser
|
|
11
|
+
* accepts `lifecycle: editorial` (it's a v0.1.x-committed mode in
|
|
12
|
+
* `V01_LIFECYCLE_MODES`), so this use case is the only line of
|
|
13
|
+
* defense: when a Schema declares `editorial`, it surfaces a
|
|
14
|
+
* structured `LIFECYCLE_NOT_IN_V010` error here at request time.
|
|
15
|
+
* The approvals-queue branch lands in v0.1.x.
|
|
16
|
+
*/
|
|
17
|
+
export class RequestPublishUseCase {
|
|
18
|
+
entries;
|
|
19
|
+
schemas;
|
|
20
|
+
clock;
|
|
21
|
+
effects;
|
|
22
|
+
siteConfig;
|
|
23
|
+
constructor(entries, schemas, clock, effects, siteConfig) {
|
|
24
|
+
this.entries = entries;
|
|
25
|
+
this.schemas = schemas;
|
|
26
|
+
this.clock = clock;
|
|
27
|
+
this.effects = effects;
|
|
28
|
+
this.siteConfig = siteConfig;
|
|
29
|
+
}
|
|
30
|
+
async execute(request) {
|
|
31
|
+
const opPath = `usecase/RequestPublish/${request.id}`;
|
|
32
|
+
const existing = await this.entries.get(request.id);
|
|
33
|
+
if (!existing) {
|
|
34
|
+
throw new DiagnosticError(notFoundDiagnostic(opPath, "<unknown>", request.id));
|
|
35
|
+
}
|
|
36
|
+
const schema = this.schemas.get(existing.collection);
|
|
37
|
+
if (publishRequiresApproval(schema)) {
|
|
38
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
39
|
+
code: "LIFECYCLE_NOT_IN_V010",
|
|
40
|
+
severity: "error",
|
|
41
|
+
path: opPath,
|
|
42
|
+
value: resolveLifecycle(schema),
|
|
43
|
+
expected: "lifecycle: 'simple' (editorial lands in v0.1.x)",
|
|
44
|
+
message: `Schema '${existing.collection}' uses lifecycle: 'editorial', which is v0.1.x-committed. v0.1.0 only supports 'simple' lifecycle.`,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
if (!canTransition(schema, existing.status, "published")) {
|
|
48
|
+
throw new DiagnosticError(illegalTransitionDiagnostic(opPath, existing.status, "published"));
|
|
49
|
+
}
|
|
50
|
+
if (schema) {
|
|
51
|
+
await assertEntryWritable({
|
|
52
|
+
opPath,
|
|
53
|
+
entries: this.entries,
|
|
54
|
+
schema,
|
|
55
|
+
data: existing.data,
|
|
56
|
+
excludeId: existing.id,
|
|
57
|
+
siteConfig: this.siteConfig,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
await this.assertTranslatesParentPublished(opPath, existing, schema);
|
|
61
|
+
const published = await withConflictDiagnostic(opPath, () => this.entries.transitionStatus({
|
|
62
|
+
id: request.id,
|
|
63
|
+
collection: existing.collection,
|
|
64
|
+
to: "published",
|
|
65
|
+
expectedStatus: existing.status,
|
|
66
|
+
// Validation above ran against this version; a concurrent
|
|
67
|
+
// UpdateDraft between then and the flip must fail rather than
|
|
68
|
+
// publish stale-but-passed data.
|
|
69
|
+
expectedVersion: existing.version,
|
|
70
|
+
now: this.clock.now(),
|
|
71
|
+
hookContext: request.ctx,
|
|
72
|
+
originalInput: request.originalInput,
|
|
73
|
+
}));
|
|
74
|
+
await publishCache(this.effects, published.id);
|
|
75
|
+
return published;
|
|
76
|
+
}
|
|
77
|
+
async assertTranslatesParentPublished(path, entry, schema) {
|
|
78
|
+
const translates = schema?.spec.translates;
|
|
79
|
+
if (!translates)
|
|
80
|
+
return;
|
|
81
|
+
const value = entry.data[translates.on];
|
|
82
|
+
if (value === undefined || value === null || value === "") {
|
|
83
|
+
throw missingTranslatesParentDiagnostic(path, entry, translates, value);
|
|
84
|
+
}
|
|
85
|
+
const parent = await this.entries.findByDataField({
|
|
86
|
+
collection: translates.parent,
|
|
87
|
+
status: "published",
|
|
88
|
+
field: translates.on,
|
|
89
|
+
value,
|
|
90
|
+
});
|
|
91
|
+
if (parent)
|
|
92
|
+
return;
|
|
93
|
+
throw missingTranslatesParentDiagnostic(path, entry, translates, value);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function missingTranslatesParentDiagnostic(path, entry, translates, value) {
|
|
97
|
+
return new DiagnosticError(runtimeDiagnostic({
|
|
98
|
+
code: "TRANSLATES_PARENT_UNKNOWN",
|
|
99
|
+
severity: "error",
|
|
100
|
+
path: `${path}/translates`,
|
|
101
|
+
value: {
|
|
102
|
+
child: entry.collection,
|
|
103
|
+
parent: translates.parent,
|
|
104
|
+
field: translates.on,
|
|
105
|
+
value,
|
|
106
|
+
},
|
|
107
|
+
expected: `published parent entry in '${translates.parent}' where data.${translates.on} === ${JSON.stringify(value)}`,
|
|
108
|
+
message: `Cannot publish '${entry.collection}' translation '${entry.id}' because no published parent '${translates.parent}' entry has ${translates.on}=${JSON.stringify(value)}. Publish the parent first.`,
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=RequestPublishUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestPublishUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/RequestPublishUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 { UnpublishRequest } from "../dto/content/index.js";
|
|
6
|
+
import { type ContentPublishEffects } from "./ContentPublishEffects.js";
|
|
7
|
+
/**
|
|
8
|
+
* `UnpublishUseCase` — flip published / archived rows back to
|
|
9
|
+
* `'draft'`. Used by the admin SPA's "edit a published entry" flow.
|
|
10
|
+
*/
|
|
11
|
+
export declare class UnpublishUseCase {
|
|
12
|
+
private readonly entries;
|
|
13
|
+
private readonly schemas;
|
|
14
|
+
private readonly clock;
|
|
15
|
+
private readonly effects?;
|
|
16
|
+
constructor(entries: EntryRepository, schemas: ReadonlyMap<string, SchemaManifest>, clock: Clock, effects?: ContentPublishEffects | undefined);
|
|
17
|
+
execute(request: UnpublishRequest): Promise<EntryRow>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=UnpublishUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnpublishUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/UnpublishUseCase.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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAOpC;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,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,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CA8B5D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { canTransition, DiagnosticError, } from "@aotter/mantle-spec";
|
|
2
|
+
import { unpublishCache, } from "./ContentPublishEffects.js";
|
|
3
|
+
import { illegalTransitionDiagnostic, notFoundDiagnostic, withConflictDiagnostic, } from "./diagnostics.js";
|
|
4
|
+
/**
|
|
5
|
+
* `UnpublishUseCase` — flip published / archived rows back to
|
|
6
|
+
* `'draft'`. Used by the admin SPA's "edit a published entry" flow.
|
|
7
|
+
*/
|
|
8
|
+
export class UnpublishUseCase {
|
|
9
|
+
entries;
|
|
10
|
+
schemas;
|
|
11
|
+
clock;
|
|
12
|
+
effects;
|
|
13
|
+
constructor(entries, schemas, clock, effects) {
|
|
14
|
+
this.entries = entries;
|
|
15
|
+
this.schemas = schemas;
|
|
16
|
+
this.clock = clock;
|
|
17
|
+
this.effects = effects;
|
|
18
|
+
}
|
|
19
|
+
async execute(request) {
|
|
20
|
+
const opPath = `usecase/Unpublish/${request.id}`;
|
|
21
|
+
const existing = await this.entries.get(request.id);
|
|
22
|
+
if (!existing) {
|
|
23
|
+
throw new DiagnosticError(notFoundDiagnostic(opPath, "<unknown>", request.id));
|
|
24
|
+
}
|
|
25
|
+
const schema = this.schemas.get(existing.collection);
|
|
26
|
+
if (!canTransition(schema, existing.status, "draft")) {
|
|
27
|
+
throw new DiagnosticError(illegalTransitionDiagnostic(opPath, existing.status, "draft"));
|
|
28
|
+
}
|
|
29
|
+
const unpublished = await withConflictDiagnostic(opPath, () => this.entries.transitionStatus({
|
|
30
|
+
id: request.id,
|
|
31
|
+
collection: existing.collection,
|
|
32
|
+
to: "draft",
|
|
33
|
+
expectedStatus: existing.status,
|
|
34
|
+
// Pin the version we read above — a concurrent mutation between
|
|
35
|
+
// get() and the flip must fail rather than silently unpublish a
|
|
36
|
+
// row whose state has moved on. Matches RequestPublishUseCase.
|
|
37
|
+
expectedVersion: existing.version,
|
|
38
|
+
now: this.clock.now(),
|
|
39
|
+
hookContext: request.ctx,
|
|
40
|
+
originalInput: request.originalInput,
|
|
41
|
+
}));
|
|
42
|
+
await unpublishCache(this.effects, unpublished.id);
|
|
43
|
+
return unpublished;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=UnpublishUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnpublishUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/UnpublishUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,GAEhB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EACL,cAAc,GAEf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAER;IACA;IACA;IACA;IAJnB,YACmB,OAAwB,EACxB,OAA4C,EAC5C,KAAY,EACZ,OAA+B;QAH/B,YAAO,GAAP,OAAO,CAAiB;QACxB,YAAO,GAAP,OAAO,CAAqC;QAC5C,UAAK,GAAL,KAAK,CAAO;QACZ,YAAO,GAAP,OAAO,CAAwB;IAC/C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAyB;QACrC,MAAM,MAAM,GAAG,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,eAAe,CACvB,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAC9D,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CAC5D,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,EAAE,EAAE,OAAO;YACX,cAAc,EAAE,QAAQ,CAAC,MAAM;YAC/B,gEAAgE;YAChE,gEAAgE;YAChE,+DAA+D;YAC/D,eAAe,EAAE,QAAQ,CAAC,OAAO;YACjC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,GAAG;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CACH,CAAC;QACF,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -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 { SiteConfigRepository } from "../../domain/port/SiteConfigRepository.js";
|
|
6
|
+
import type { UpdateDraftRequest } from "../dto/content/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* `UpdateDraftUseCase` — update a draft's data. Only entries in
|
|
9
|
+
* `'draft'` status are editable — `published` / `archived` go via the
|
|
10
|
+
* unpublish (back to draft) path first.
|
|
11
|
+
*/
|
|
12
|
+
export declare class UpdateDraftUseCase {
|
|
13
|
+
private readonly entries;
|
|
14
|
+
private readonly schemas;
|
|
15
|
+
private readonly clock;
|
|
16
|
+
private readonly siteConfig?;
|
|
17
|
+
constructor(entries: EntryRepository, schemas: ReadonlyMap<string, SchemaManifest>, clock: Clock, siteConfig?: SiteConfigRepository | undefined);
|
|
18
|
+
execute(request: UpdateDraftRequest): Promise<EntryRow>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=UpdateDraftUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateDraftUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/UpdateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,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,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAOlE;;;;GAIG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAHX,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,KAAK,EAAE,KAAK,EACZ,UAAU,CAAC,EAAE,oBAAoB,YAAA;IAG9C,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;CA6D9D"}
|