@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,147 @@
|
|
|
1
|
+
import { DiagnosticError, isParamRef, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
|
+
import { clampPage, clampShow } from "./Pagination.js";
|
|
3
|
+
// alias → SQL column. Aliases mirror RESERVED_ENTRY_COLUMNS from
|
|
4
|
+
// spec; SQL column shape (snake_case) is local to the storage layout.
|
|
5
|
+
// The compile-time check below ensures the alias set stays in sync —
|
|
6
|
+
// adding to spec without updating here is a type error.
|
|
7
|
+
const RESERVED_COLUMN = {
|
|
8
|
+
id: "id",
|
|
9
|
+
status: "status",
|
|
10
|
+
version: "version",
|
|
11
|
+
createdAt: "created_at",
|
|
12
|
+
updatedAt: "updated_at",
|
|
13
|
+
authorId: "author_id",
|
|
14
|
+
};
|
|
15
|
+
const _aliasCheck = RESERVED_COLUMN;
|
|
16
|
+
void _aliasCheck;
|
|
17
|
+
const DEFAULT_PROJECTION = Object.entries(RESERVED_COLUMN)
|
|
18
|
+
.map(([alias, col]) => (alias === col ? col : `${col} AS ${alias}`))
|
|
19
|
+
.join(", ");
|
|
20
|
+
export function compileView(view, options = {}) {
|
|
21
|
+
const sqlParams = [view.spec.from];
|
|
22
|
+
const selectExpr = buildSelect(view.spec.fields);
|
|
23
|
+
const whereParts = ["collection = ?"];
|
|
24
|
+
if (view.spec.filter) {
|
|
25
|
+
const compiled = compileFilter(view.spec.filter, options.params ?? {});
|
|
26
|
+
if (compiled !== null) {
|
|
27
|
+
whereParts.push(`(${compiled.sql})`);
|
|
28
|
+
sqlParams.push(...compiled.params);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const where = `WHERE ${whereParts.join(" AND ")}`;
|
|
32
|
+
const orderBy = buildOrderBy(view.spec.orderBy);
|
|
33
|
+
const effectiveShow = clampShow(options.show, view.spec.limit);
|
|
34
|
+
const effectivePage = clampPage(options.page);
|
|
35
|
+
const offset = (effectivePage - 1) * effectiveShow;
|
|
36
|
+
const sql = `SELECT ${selectExpr} FROM entries ${where}${orderBy} LIMIT ${effectiveShow} OFFSET ${offset}`;
|
|
37
|
+
return { sql, params: sqlParams, effectivePage, effectiveShow };
|
|
38
|
+
}
|
|
39
|
+
function buildSelect(fields) {
|
|
40
|
+
if (!fields || fields.length === 0)
|
|
41
|
+
return DEFAULT_PROJECTION;
|
|
42
|
+
return fields.map(fieldExpr).join(", ");
|
|
43
|
+
}
|
|
44
|
+
function fieldExpr(field) {
|
|
45
|
+
const reserved = RESERVED_COLUMN[field];
|
|
46
|
+
if (reserved) {
|
|
47
|
+
return reserved === field ? reserved : `${reserved} AS ${field}`;
|
|
48
|
+
}
|
|
49
|
+
return `json_extract(data, ${quotedJsonPath(field)}) AS ${quoteIdent(field)}`;
|
|
50
|
+
}
|
|
51
|
+
function fieldRefExpr(field) {
|
|
52
|
+
const reserved = RESERVED_COLUMN[field];
|
|
53
|
+
if (reserved)
|
|
54
|
+
return reserved;
|
|
55
|
+
return `json_extract(data, ${quotedJsonPath(field)})`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Returns `null` when the node has no constraint to emit: an `eq`
|
|
59
|
+
* whose `{ $param }` ref is unresolved, or an AND/OR whose children
|
|
60
|
+
* all dropped. v0.1.0 parser enforces required-only param refs so
|
|
61
|
+
* the drop path is dead today; kept so v0.1.x "optional param ref"
|
|
62
|
+
* promotion is a parser-only change.
|
|
63
|
+
*
|
|
64
|
+
* Each node returns its own `{ sql, params }` (vs. pushing into a
|
|
65
|
+
* shared array) so a dropped sub-tree can never leave orphan params
|
|
66
|
+
* bound to the parent's `?` placeholders.
|
|
67
|
+
*/
|
|
68
|
+
function compileFilter(node, paramValues) {
|
|
69
|
+
if ("eq" in node) {
|
|
70
|
+
const value = node.eq.value;
|
|
71
|
+
let bound;
|
|
72
|
+
if (isParamRef(value)) {
|
|
73
|
+
const resolved = paramValues[value.$param];
|
|
74
|
+
if (resolved === undefined)
|
|
75
|
+
return null;
|
|
76
|
+
bound = resolved;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
bound = value;
|
|
80
|
+
}
|
|
81
|
+
return { sql: `${fieldRefExpr(node.eq.field)} = ?`, params: [bound] };
|
|
82
|
+
}
|
|
83
|
+
const op = "and" in node ? "AND" : "OR";
|
|
84
|
+
const children = "and" in node ? node.and : node.or;
|
|
85
|
+
const compiled = children
|
|
86
|
+
.map((c) => compileFilter(c, paramValues))
|
|
87
|
+
.filter((c) => c !== null);
|
|
88
|
+
if (compiled.length === 0)
|
|
89
|
+
return null;
|
|
90
|
+
return {
|
|
91
|
+
sql: compiled.map((c) => `(${c.sql})`).join(` ${op} `),
|
|
92
|
+
params: compiled.flatMap((c) => c.params),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function buildOrderBy(orderBy) {
|
|
96
|
+
if (!orderBy || orderBy.length === 0)
|
|
97
|
+
return "";
|
|
98
|
+
const parts = orderBy.map((o) => {
|
|
99
|
+
const dir = (o.direction ?? "asc").toUpperCase();
|
|
100
|
+
return `${fieldRefExpr(o.field)} ${dir}`;
|
|
101
|
+
});
|
|
102
|
+
return ` ORDER BY ${parts.join(", ")}`;
|
|
103
|
+
}
|
|
104
|
+
// Schema JSON property keys can be arbitrary strings per RFC 8259,
|
|
105
|
+
// but SQLite's JSON1 path syntax (`$."key"`) has no documented way
|
|
106
|
+
// to escape an inner `"` or `\` inside a quoted key — doubled-quote
|
|
107
|
+
// escaping is the SQLite identifier convention, NOT a JSON-path
|
|
108
|
+
// convention. So we always quote the path/alias (admitting hyphens,
|
|
109
|
+
// spaces, etc.) but refuse `"`, `\`, and `\0` in field names —
|
|
110
|
+
// those break either the JSON-path resolution or the SQL string
|
|
111
|
+
// literal. Real Schema authors don't use those characters in keys;
|
|
112
|
+
// rejecting them keeps the path always-resolvable.
|
|
113
|
+
const FORBIDDEN_FIELD_CHARS = /["\\\0]/;
|
|
114
|
+
function assertFieldNameSafe(name, callsite) {
|
|
115
|
+
if (!FORBIDDEN_FIELD_CHARS.test(name))
|
|
116
|
+
return;
|
|
117
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
118
|
+
code: "INTERNAL_ERROR",
|
|
119
|
+
severity: "error",
|
|
120
|
+
path: `compileView/${callsite}`,
|
|
121
|
+
value: name,
|
|
122
|
+
expected: 'field name without `"`, `\\`, or NUL',
|
|
123
|
+
message: `field name '${name}' contains an unrepresentable character (\", \\, or NUL); Schema validation should have caught this.`,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Emit `'$."<field>"'` — a SQL string literal containing a SQLite
|
|
128
|
+
* JSON path. Doubles single quotes for the surrounding SQL literal
|
|
129
|
+
* (SQLite literal escape). Field name itself is guaranteed free of
|
|
130
|
+
* `"` / `\` / NUL by `assertFieldNameSafe`, so the inner double-
|
|
131
|
+
* quoted key needs no further escape.
|
|
132
|
+
*/
|
|
133
|
+
function quotedJsonPath(field) {
|
|
134
|
+
assertFieldNameSafe(field, "quotedJsonPath");
|
|
135
|
+
// Only `'` needs escaping for the surrounding SQL literal; field
|
|
136
|
+
// is guaranteed free of `"` / `\` / NUL.
|
|
137
|
+
return `'$."${field.replace(/'/g, "''")}"'`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* SQLite quoted-identifier alias (`"hero-image"`). Used as the result
|
|
141
|
+
* column name so callers read the field back under its declared key.
|
|
142
|
+
*/
|
|
143
|
+
function quoteIdent(name) {
|
|
144
|
+
assertFieldNameSafe(name, "quoteIdent");
|
|
145
|
+
return `"${name}"`;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=ViewSqlCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewSqlCompiler.js","sourceRoot":"","sources":["../../../src/domain/service/ViewSqlCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `domain/service/` — pure stateless algorithms operating on the
|
|
3
|
+
* domain model + spec types. No env, no I/O.
|
|
4
|
+
*
|
|
5
|
+
* `PublishedEntries` + `JoinedEntryReader` take a `DatabaseDriver`
|
|
6
|
+
* and perform real reads; they live in `./io/` and are imported
|
|
7
|
+
* directly by their consumers — NOT re-exported here, so the barrel's
|
|
8
|
+
* purity claim above holds.
|
|
9
|
+
*/
|
|
10
|
+
export * from "./PublishKeys.js";
|
|
11
|
+
export * from "./MarkdownSerializer.js";
|
|
12
|
+
export * from "./SitemapSerializer.js";
|
|
13
|
+
export * from "./HtmlRenderer.js";
|
|
14
|
+
export * from "./PreviewBanner.js";
|
|
15
|
+
export * from "./PublicPathResolver.js";
|
|
16
|
+
export * from "./LocaleNegotiator.js";
|
|
17
|
+
export * from "./AbsoluteUrl.js";
|
|
18
|
+
export * from "./SeoMetaComposer.js";
|
|
19
|
+
export * from "./ViewSqlCompiler.js";
|
|
20
|
+
export * from "./Pagination.js";
|
|
21
|
+
export * from "./ViewParamCoercer.js";
|
|
22
|
+
export * from "./PathMatcher.js";
|
|
23
|
+
export * from "./TriggerIndex.js";
|
|
24
|
+
export * from "./BuiltinProjector.js";
|
|
25
|
+
export * from "./McpToolNaming.js";
|
|
26
|
+
export * from "./AuthPredicateEvaluator.js";
|
|
27
|
+
export * from "./EntrySeoSupport.js";
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `domain/service/` — pure stateless algorithms operating on the
|
|
3
|
+
* domain model + spec types. No env, no I/O.
|
|
4
|
+
*
|
|
5
|
+
* `PublishedEntries` + `JoinedEntryReader` take a `DatabaseDriver`
|
|
6
|
+
* and perform real reads; they live in `./io/` and are imported
|
|
7
|
+
* directly by their consumers — NOT re-exported here, so the barrel's
|
|
8
|
+
* purity claim above holds.
|
|
9
|
+
*/
|
|
10
|
+
export * from "./PublishKeys.js";
|
|
11
|
+
export * from "./MarkdownSerializer.js";
|
|
12
|
+
export * from "./SitemapSerializer.js";
|
|
13
|
+
export * from "./HtmlRenderer.js";
|
|
14
|
+
export * from "./PreviewBanner.js";
|
|
15
|
+
export * from "./PublicPathResolver.js";
|
|
16
|
+
export * from "./LocaleNegotiator.js";
|
|
17
|
+
export * from "./AbsoluteUrl.js";
|
|
18
|
+
export * from "./SeoMetaComposer.js";
|
|
19
|
+
export * from "./ViewSqlCompiler.js";
|
|
20
|
+
export * from "./Pagination.js";
|
|
21
|
+
export * from "./ViewParamCoercer.js";
|
|
22
|
+
export * from "./PathMatcher.js";
|
|
23
|
+
export * from "./TriggerIndex.js";
|
|
24
|
+
export * from "./BuiltinProjector.js";
|
|
25
|
+
export * from "./McpToolNaming.js";
|
|
26
|
+
export * from "./AuthPredicateEvaluator.js";
|
|
27
|
+
export * from "./EntrySeoSupport.js";
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { EntryRepository } from "../../port/EntryRepository.js";
|
|
3
|
+
import type { SiteConfigRepository } from "../../port/SiteConfigRepository.js";
|
|
4
|
+
export interface AssertEntryWritableArgs {
|
|
5
|
+
readonly opPath: string;
|
|
6
|
+
readonly entries: EntryRepository;
|
|
7
|
+
readonly schema: SchemaManifest;
|
|
8
|
+
readonly data: Record<string, unknown>;
|
|
9
|
+
readonly excludeId?: string;
|
|
10
|
+
readonly siteConfig?: SiteConfigRepository;
|
|
11
|
+
}
|
|
12
|
+
/** Shared post-projection guard for every authoring path.
|
|
13
|
+
*
|
|
14
|
+
* MCP, admin/API, and builtin Procedure writes all land here after
|
|
15
|
+
* `x-clam-bind` stamping, so schema validation and unique-index
|
|
16
|
+
* semantics cannot drift by transport.
|
|
17
|
+
*/
|
|
18
|
+
export declare function assertEntryWritable(args: AssertEntryWritableArgs): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=EntryWriteGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryWriteGuard.d.ts","sourceRoot":"","sources":["../../../../src/domain/service/io/EntryWriteGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { DiagnosticError, EntryDataValidator, CLAM_BIND_KEYWORD, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
|
+
/** Shared post-projection guard for every authoring path.
|
|
3
|
+
*
|
|
4
|
+
* MCP, admin/API, and builtin Procedure writes all land here after
|
|
5
|
+
* `x-clam-bind` stamping, so schema validation and unique-index
|
|
6
|
+
* semantics cannot drift by transport.
|
|
7
|
+
*/
|
|
8
|
+
export async function assertEntryWritable(args) {
|
|
9
|
+
const validator = new EntryDataValidator();
|
|
10
|
+
const diagnostics = validator.validate(args.schema, dataForValidation(args.schema, args.data));
|
|
11
|
+
if (diagnostics.length > 0)
|
|
12
|
+
throw new DiagnosticError(diagnostics);
|
|
13
|
+
await assertLocale(args);
|
|
14
|
+
await assertUniqueIndexes(args);
|
|
15
|
+
}
|
|
16
|
+
async function assertLocale(args) {
|
|
17
|
+
const localized = args.schema.spec.localized === true;
|
|
18
|
+
const value = args.data["locale"];
|
|
19
|
+
if (!localized) {
|
|
20
|
+
if (value === undefined || value === null)
|
|
21
|
+
return;
|
|
22
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
23
|
+
code: "INPUT_VALIDATION_FAILED",
|
|
24
|
+
severity: "error",
|
|
25
|
+
path: `${args.opPath}/locale`,
|
|
26
|
+
value,
|
|
27
|
+
expected: `no data.locale because Schema '${args.schema.metadata.name}' is not localized`,
|
|
28
|
+
message: `Entry for non-localized Schema '${args.schema.metadata.name}' must not carry data.locale.`,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
32
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
33
|
+
code: "INPUT_VALIDATION_FAILED",
|
|
34
|
+
severity: "error",
|
|
35
|
+
path: `${args.opPath}/locale`,
|
|
36
|
+
value,
|
|
37
|
+
expected: "data.locale string",
|
|
38
|
+
message: `Entry for localized Schema '${args.schema.metadata.name}' must carry data.locale.`,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
if (!args.siteConfig)
|
|
42
|
+
return;
|
|
43
|
+
const locales = await args.siteConfig.readLocales();
|
|
44
|
+
// ADR-0010: empty `site_config.locales` means the locale subsystem
|
|
45
|
+
// is off site-wide. Pass through so a fresh deploy whose `bootInit`
|
|
46
|
+
// hasn't seeded locales yet can still accept localized writes.
|
|
47
|
+
if (locales.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
if (locales.includes(value))
|
|
50
|
+
return;
|
|
51
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
52
|
+
code: "INPUT_VALIDATION_FAILED",
|
|
53
|
+
severity: "error",
|
|
54
|
+
path: `${args.opPath}/locale`,
|
|
55
|
+
value,
|
|
56
|
+
expected: `one of site.locales: ${locales.join(", ")}`,
|
|
57
|
+
candidates: locales,
|
|
58
|
+
message: `Locale '${value}' is not enabled for this site.`,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
function dataForValidation(schema, data) {
|
|
62
|
+
const properties = schema.spec.schema.properties ?? {};
|
|
63
|
+
let out = null;
|
|
64
|
+
for (const [key, propDef] of Object.entries(properties)) {
|
|
65
|
+
if (!isClamBindProperty(propDef) || data[key] !== null)
|
|
66
|
+
continue;
|
|
67
|
+
if (!out)
|
|
68
|
+
out = { ...data };
|
|
69
|
+
delete out[key];
|
|
70
|
+
}
|
|
71
|
+
return out ?? data;
|
|
72
|
+
}
|
|
73
|
+
function isClamBindProperty(propDef) {
|
|
74
|
+
return typeof propDef === "object" && propDef !== null && CLAM_BIND_KEYWORD in propDef;
|
|
75
|
+
}
|
|
76
|
+
async function assertUniqueIndexes(args) {
|
|
77
|
+
const indexes = args.schema.spec.uniqueIndexes ?? [];
|
|
78
|
+
for (let i = 0; i < indexes.length; i += 1) {
|
|
79
|
+
const index = indexes[i] ?? [];
|
|
80
|
+
const fields = {};
|
|
81
|
+
let complete = true;
|
|
82
|
+
for (const field of index) {
|
|
83
|
+
const value = args.data[field];
|
|
84
|
+
if (value === undefined || value === null) {
|
|
85
|
+
complete = false;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
fields[field] = value;
|
|
89
|
+
}
|
|
90
|
+
if (!complete || Object.keys(fields).length === 0)
|
|
91
|
+
continue;
|
|
92
|
+
const existing = await args.entries.findByDataFields({
|
|
93
|
+
collection: args.schema.metadata.name,
|
|
94
|
+
fields,
|
|
95
|
+
excludeId: args.excludeId,
|
|
96
|
+
});
|
|
97
|
+
if (!existing)
|
|
98
|
+
continue;
|
|
99
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
100
|
+
code: "CONFLICT",
|
|
101
|
+
severity: "error",
|
|
102
|
+
path: `${args.opPath}/uniqueIndexes/${i}`,
|
|
103
|
+
value: fields,
|
|
104
|
+
expected: `unique ${index.map((f) => `data.${f}`).join(" + ")} in collection '${args.schema.metadata.name}'`,
|
|
105
|
+
message: `Entry data conflicts with existing '${args.schema.metadata.name}' entry '${existing.id}' on unique index (${index.join(", ")}).`,
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=EntryWriteGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryWriteGuard.js","sourceRoot":"","sources":["../../../../src/domain/service/io/EntryWriteGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ContentState, Entry, SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { DatabaseDriver } from "../../port/DatabaseDriver.js";
|
|
3
|
+
/**
|
|
4
|
+
* `joinParentIfTranslation` — when `entry.collection` declares
|
|
5
|
+
* `translates.parent`, fetch the parent and merge its data into the
|
|
6
|
+
* child's data (translation wins on key conflict). Implements
|
|
7
|
+
* ADR-0010's promise that public render paths join translations to
|
|
8
|
+
* their parent on the declared field, so parent-only fields like
|
|
9
|
+
* `posts.coverUrl` reach templates that read `data.coverUrl`.
|
|
10
|
+
*
|
|
11
|
+
* Status filter: parent must be in the same lifecycle bucket as the
|
|
12
|
+
* child (typically "published"). `RequestPublishUseCase` already
|
|
13
|
+
* blocks publishing a translation whose parent isn't published, so at
|
|
14
|
+
* render time `parentStatus: "published"` always finds the parent.
|
|
15
|
+
* Preview omits the filter — a draft translation can preview against
|
|
16
|
+
* its already-published parent.
|
|
17
|
+
*/
|
|
18
|
+
export declare function joinParentIfTranslation(db: DatabaseDriver, schemas: ReadonlyMap<string, SchemaManifest>, entry: Entry, options?: {
|
|
19
|
+
readonly parentStatus?: ContentState;
|
|
20
|
+
}): Promise<Entry>;
|
|
21
|
+
/**
|
|
22
|
+
* Batch sibling for list paths. Issues one `IN (...)` query for all
|
|
23
|
+
* parent lookups across the list, deduplicating join values — so a
|
|
24
|
+
* 20-locale list keyed off the same parent slug costs 1 D1 read, not
|
|
25
|
+
* 20. Assumes all entries share a single collection (the contract of
|
|
26
|
+
* `RenderListLiveUseCase` / `HtmlPublishOrchestrator.renderList`); if
|
|
27
|
+
* mixed collections ever land here, fall back path-per-entry would
|
|
28
|
+
* be needed.
|
|
29
|
+
*/
|
|
30
|
+
export declare function joinParentForList(db: DatabaseDriver, schemas: ReadonlyMap<string, SchemaManifest>, entries: readonly Entry[], options?: {
|
|
31
|
+
readonly parentStatus?: ContentState;
|
|
32
|
+
}): Promise<Entry[]>;
|
|
33
|
+
//# sourceMappingURL=JoinedEntryReader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JoinedEntryReader.d.ts","sourceRoot":"","sources":["../../../../src/domain/service/io/JoinedEntryReader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAMnE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAO,GACrD,OAAO,CAAC,KAAK,CAAC,CAuBhB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,OAAO,EAAE,SAAS,KAAK,EAAE,EACzB,OAAO,GAAE;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAO,GACrD,OAAO,CAAC,KAAK,EAAE,CAAC,CA0ClB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readEntriesByDataFieldIn, readEntryByDataField, } from "./PublishedEntries.js";
|
|
2
|
+
/**
|
|
3
|
+
* `joinParentIfTranslation` — when `entry.collection` declares
|
|
4
|
+
* `translates.parent`, fetch the parent and merge its data into the
|
|
5
|
+
* child's data (translation wins on key conflict). Implements
|
|
6
|
+
* ADR-0010's promise that public render paths join translations to
|
|
7
|
+
* their parent on the declared field, so parent-only fields like
|
|
8
|
+
* `posts.coverUrl` reach templates that read `data.coverUrl`.
|
|
9
|
+
*
|
|
10
|
+
* Status filter: parent must be in the same lifecycle bucket as the
|
|
11
|
+
* child (typically "published"). `RequestPublishUseCase` already
|
|
12
|
+
* blocks publishing a translation whose parent isn't published, so at
|
|
13
|
+
* render time `parentStatus: "published"` always finds the parent.
|
|
14
|
+
* Preview omits the filter — a draft translation can preview against
|
|
15
|
+
* its already-published parent.
|
|
16
|
+
*/
|
|
17
|
+
export async function joinParentIfTranslation(db, schemas, entry, options = {}) {
|
|
18
|
+
const schema = schemas.get(entry.collection);
|
|
19
|
+
const translates = schema?.spec.translates;
|
|
20
|
+
if (!translates)
|
|
21
|
+
return entry;
|
|
22
|
+
const joinValue = entry.data[translates.on];
|
|
23
|
+
if (typeof joinValue !== "string" || joinValue === "")
|
|
24
|
+
return entry;
|
|
25
|
+
const parent = await readEntryByDataField(db, {
|
|
26
|
+
collection: translates.parent,
|
|
27
|
+
field: translates.on,
|
|
28
|
+
value: joinValue,
|
|
29
|
+
// Parent is non-localized by ADR-0010 contract (CrossSchemaChecker
|
|
30
|
+
// enforces `parent.localized: false` when a child has `translates`).
|
|
31
|
+
locale: null,
|
|
32
|
+
status: options.parentStatus,
|
|
33
|
+
});
|
|
34
|
+
if (!parent)
|
|
35
|
+
return entry;
|
|
36
|
+
return {
|
|
37
|
+
...entry,
|
|
38
|
+
data: { ...parent.data, ...entry.data },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Batch sibling for list paths. Issues one `IN (...)` query for all
|
|
43
|
+
* parent lookups across the list, deduplicating join values — so a
|
|
44
|
+
* 20-locale list keyed off the same parent slug costs 1 D1 read, not
|
|
45
|
+
* 20. Assumes all entries share a single collection (the contract of
|
|
46
|
+
* `RenderListLiveUseCase` / `HtmlPublishOrchestrator.renderList`); if
|
|
47
|
+
* mixed collections ever land here, fall back path-per-entry would
|
|
48
|
+
* be needed.
|
|
49
|
+
*/
|
|
50
|
+
export async function joinParentForList(db, schemas, entries, options = {}) {
|
|
51
|
+
if (entries.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const probe = schemas.get(entries[0].collection);
|
|
54
|
+
const translates = probe?.spec.translates;
|
|
55
|
+
if (!translates)
|
|
56
|
+
return [...entries];
|
|
57
|
+
const joinValues = new Set();
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
const value = entry.data[translates.on];
|
|
60
|
+
if (typeof value === "string" && value !== "")
|
|
61
|
+
joinValues.add(value);
|
|
62
|
+
}
|
|
63
|
+
if (joinValues.size === 0)
|
|
64
|
+
return [...entries];
|
|
65
|
+
const parents = await readEntriesByDataFieldIn(db, {
|
|
66
|
+
collection: translates.parent,
|
|
67
|
+
field: translates.on,
|
|
68
|
+
values: [...joinValues],
|
|
69
|
+
locale: null,
|
|
70
|
+
status: options.parentStatus,
|
|
71
|
+
});
|
|
72
|
+
// Multiple rows per joinValue are sorted updated_at DESC by the
|
|
73
|
+
// query; first occurrence wins (matches single-entry path which
|
|
74
|
+
// does LIMIT 1).
|
|
75
|
+
const parentByValue = new Map();
|
|
76
|
+
for (const parent of parents) {
|
|
77
|
+
const key = parent.data[translates.on];
|
|
78
|
+
if (typeof key === "string" && !parentByValue.has(key)) {
|
|
79
|
+
parentByValue.set(key, parent);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return entries.map((entry) => {
|
|
83
|
+
const value = entry.data[translates.on];
|
|
84
|
+
if (typeof value !== "string")
|
|
85
|
+
return entry;
|
|
86
|
+
const parent = parentByValue.get(value);
|
|
87
|
+
if (!parent)
|
|
88
|
+
return entry;
|
|
89
|
+
return {
|
|
90
|
+
...entry,
|
|
91
|
+
data: { ...parent.data, ...entry.data },
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=JoinedEntryReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JoinedEntryReader.js","sourceRoot":"","sources":["../../../../src/domain/service/io/JoinedEntryReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type ContentState, type Entry } from "@aotter/mantle-spec";
|
|
2
|
+
import type { DatabaseDriver } from "../../port/DatabaseDriver.js";
|
|
3
|
+
/**
|
|
4
|
+
* Cross-collection scan of `status='published'` entries. Pure read,
|
|
5
|
+
* no rendering. Used by every renderer that crosses Schema boundaries
|
|
6
|
+
* (`HtmlPublishOrchestrator`, `ComposeLlmsTxtUseCase`,
|
|
7
|
+
* `ComposeSitemapUseCase`). Distinguishes the three locale modes:
|
|
8
|
+
*
|
|
9
|
+
* - locale: string — only entries where `data.locale = locale`
|
|
10
|
+
* - locale: null — only non-localized entries (`data.locale IS NULL`)
|
|
11
|
+
* - omitted — every locale + non-localized
|
|
12
|
+
*
|
|
13
|
+
* The locale=null case matters for publish: writing a non-localized
|
|
14
|
+
* entry must not overwrite per-locale indexes with cross-locale soup.
|
|
15
|
+
*/
|
|
16
|
+
export interface PublishedEntriesFilter {
|
|
17
|
+
readonly locale?: string | null;
|
|
18
|
+
readonly collection?: string;
|
|
19
|
+
/** Optional `LIMIT N` on the SQL query — caps both D1 read and JS
|
|
20
|
+
* memory. Sitemap composition uses this; publish pipeline omits
|
|
21
|
+
* (one entry-locale-collection scan is naturally small). */
|
|
22
|
+
readonly limit?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function readPublishedEntries(db: DatabaseDriver, filter?: PublishedEntriesFilter): Promise<Entry[]>;
|
|
25
|
+
/** Single-entry lookup by id. Used by the publish pipeline to load
|
|
26
|
+
* the entry it's about to render; lifted into the domain service so
|
|
27
|
+
* the orchestrator stops owning row-to-domain mapping. */
|
|
28
|
+
export declare function readEntryById(db: DatabaseDriver, id: string): Promise<Entry | null>;
|
|
29
|
+
/** Lookup an entry by (collection, slug[, locale][, status]). Used by
|
|
30
|
+
* request-time render paths (preview, live-dev) that route by URL
|
|
31
|
+
* slug — not the publish pipeline's flow which already holds the
|
|
32
|
+
* entry id. Returns the most-recently-updated row if multiple
|
|
33
|
+
* match. */
|
|
34
|
+
export interface ReadEntryBySlugArgs {
|
|
35
|
+
readonly collection: string;
|
|
36
|
+
readonly slug: string;
|
|
37
|
+
/** `string` filters to that locale; `null` filters to non-localized
|
|
38
|
+
* entries (data.locale IS NULL); omitted = no locale filter. */
|
|
39
|
+
readonly locale?: string | null;
|
|
40
|
+
readonly status?: ContentState;
|
|
41
|
+
}
|
|
42
|
+
export declare function readEntryBySlug(db: DatabaseDriver, args: ReadEntryBySlugArgs): Promise<Entry | null>;
|
|
43
|
+
/** Lookup an entry by an arbitrary `data.<field>` value. Generalizes
|
|
44
|
+
* `readEntryBySlug` for the parent-join code path: `translates.on`
|
|
45
|
+
* is conventionally "slug" but the grammar permits other field names,
|
|
46
|
+
* so the join reader must not hard-code `$.slug`. */
|
|
47
|
+
export interface ReadEntryByDataFieldArgs {
|
|
48
|
+
readonly collection: string;
|
|
49
|
+
readonly field: string;
|
|
50
|
+
readonly value: string;
|
|
51
|
+
readonly locale?: string | null;
|
|
52
|
+
readonly status?: ContentState;
|
|
53
|
+
}
|
|
54
|
+
export declare function readEntryByDataField(db: DatabaseDriver, args: ReadEntryByDataFieldArgs): Promise<Entry | null>;
|
|
55
|
+
/** Batch sibling to `readEntryByDataField`. Issues a single
|
|
56
|
+
* `... WHERE data.<field> IN (?, ?, ...)` query, returning one row per
|
|
57
|
+
* distinct value (most-recently-updated when multiple rows share the
|
|
58
|
+
* same value). Used by the list-render parent-join to avoid N+1 reads
|
|
59
|
+
* when a list of translations shares parents on a small set of join
|
|
60
|
+
* values. */
|
|
61
|
+
export interface ReadEntriesByDataFieldInArgs {
|
|
62
|
+
readonly collection: string;
|
|
63
|
+
readonly field: string;
|
|
64
|
+
readonly values: readonly string[];
|
|
65
|
+
readonly locale?: string | null;
|
|
66
|
+
readonly status?: ContentState;
|
|
67
|
+
}
|
|
68
|
+
export declare function readEntriesByDataFieldIn(db: DatabaseDriver, args: ReadEntriesByDataFieldInArgs): Promise<Entry[]>;
|
|
69
|
+
//# sourceMappingURL=PublishedEntries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublishedEntries.d.ts","sourceRoot":"","sources":["../../../../src/domain/service/io/PublishedEntries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;iEAE6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAYD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,MAAM,GAAE,sBAA2B,GAClC,OAAO,CAAC,KAAK,EAAE,CAAC,CAqBlB;AAED;;2DAE2D;AAC3D,wBAAsB,aAAa,CACjC,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CASvB;AAED;;;;aAIa;AACb,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;qEACiE;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAQvB;AAED;;;sDAGsD;AACtD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAgBD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAsBvB;AAED;;;;;cAKc;AACd,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,KAAK,EAAE,CAAC,CAwBlB"}
|