@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,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional first-party media storage — **public bucket only**. Not
|
|
3
|
+
* part of the required v0.1.0 provisioning path: starters must keep
|
|
4
|
+
* working without an implementation.
|
|
5
|
+
*
|
|
6
|
+
* The port is intentionally object-storage-shaped. Cloudflare R2, S3,
|
|
7
|
+
* filesystem, or a future hosted service can implement it without
|
|
8
|
+
* leaking adapter types into runtime use cases.
|
|
9
|
+
*
|
|
10
|
+
* # Scope: public bucket only
|
|
11
|
+
*
|
|
12
|
+
* `getPublicUrl()` returns an unconditional public URL; reads bypass
|
|
13
|
+
* the Worker (`MEDIA_PUBLIC_URL_BASE` → CDN → R2). `MediaAsset.publicUrl`
|
|
14
|
+
* is frozen at commit time and embedded directly into entry data
|
|
15
|
+
* (e.g. `posts.coverUrl`). For public assets the URL is permanent and
|
|
16
|
+
* the read path stays cheap.
|
|
17
|
+
*
|
|
18
|
+
* **Private content (subscription-gated, fan-club, signed-GET, etc.)
|
|
19
|
+
* is a separate port + separate R2 bucket in v0.2** — see ADR-0011
|
|
20
|
+
* § "Public vs private media — two buckets, two ports". The private
|
|
21
|
+
* port will live alongside this one (`PrivateMediaStorage`); current
|
|
22
|
+
* callers stay untouched. Don't bolt a `visibility` flag onto this
|
|
23
|
+
* port to retrofit private semantics — that's not the seam.
|
|
24
|
+
*
|
|
25
|
+
* Method-arg shapes use the `*Args` suffix (matching `EntryRepository`)
|
|
26
|
+
* to leave the `*Request` / `*Response` namespace for use-case DTOs in
|
|
27
|
+
* `usecase/dto/media/`.
|
|
28
|
+
*/
|
|
29
|
+
export interface MediaStorage {
|
|
30
|
+
/** Create a short-lived direct-upload capability for a single object. */
|
|
31
|
+
createUpload(args: CreateUploadArgs): Promise<CreateUploadResult>;
|
|
32
|
+
/** Commit a previously-uploaded object after adapter metadata checks. */
|
|
33
|
+
commitUpload(args: CommitUploadArgs): Promise<MediaAsset>;
|
|
34
|
+
/** Resolve the stable public URL for an already committed asset. */
|
|
35
|
+
getPublicUrl(args: GetPublicUrlArgs): Promise<string>;
|
|
36
|
+
deleteAsset(args: DeleteAssetArgs): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export interface CreateUploadArgs {
|
|
39
|
+
readonly filename: string;
|
|
40
|
+
readonly mimeType: string;
|
|
41
|
+
/** Already checked against `maxBytes` by the use case. Adapters may
|
|
42
|
+
* forward it as a `Content-Length` constraint when the backend
|
|
43
|
+
* supports it. */
|
|
44
|
+
readonly byteSize: number;
|
|
45
|
+
readonly maxBytes: number;
|
|
46
|
+
readonly purpose?: string;
|
|
47
|
+
readonly now: number;
|
|
48
|
+
readonly expiresAt: number;
|
|
49
|
+
readonly metadata?: Readonly<Record<string, string>>;
|
|
50
|
+
}
|
|
51
|
+
export interface CreateUploadResult {
|
|
52
|
+
readonly uploadId: string;
|
|
53
|
+
readonly method: "PUT";
|
|
54
|
+
readonly uploadUrl: string;
|
|
55
|
+
readonly storageKey: string;
|
|
56
|
+
readonly expiresAt: number;
|
|
57
|
+
readonly requiredHeaders?: Readonly<Record<string, string>>;
|
|
58
|
+
/** Optional preview of the eventual public URL. Commit remains authoritative. */
|
|
59
|
+
readonly publicUrl?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Adapter contract: before returning `MediaAsset`, verify the stored
|
|
63
|
+
* object's actual content-type against `expectedMimeType` and actual
|
|
64
|
+
* byte size against `maxBytes`. The use case only validates caller-
|
|
65
|
+
* declared MIME, not the bytes that landed in storage — without
|
|
66
|
+
* adapter-side verification, a caller can declare `image/png` and PUT
|
|
67
|
+
* a PDF. Mismatch → throw `DiagnosticError(MEDIA_MIME_REJECTED)` or
|
|
68
|
+
* `MEDIA_SIZE_EXCEEDED`. (Use whichever metadata primitive the
|
|
69
|
+
* backend exposes: R2 / S3 `head()`, filesystem `stat()`.)
|
|
70
|
+
*/
|
|
71
|
+
export interface CommitUploadArgs {
|
|
72
|
+
readonly uploadId: string;
|
|
73
|
+
readonly storageKey: string;
|
|
74
|
+
/** Adapter must verify stored object's actual content-type matches. */
|
|
75
|
+
readonly expectedMimeType: string;
|
|
76
|
+
/** Adapter must verify stored object's actual byte size ≤ this. */
|
|
77
|
+
readonly maxBytes: number;
|
|
78
|
+
readonly alt?: string;
|
|
79
|
+
readonly caption?: string;
|
|
80
|
+
readonly checksum?: string;
|
|
81
|
+
readonly now: number;
|
|
82
|
+
}
|
|
83
|
+
export interface GetPublicUrlArgs {
|
|
84
|
+
readonly assetId: string;
|
|
85
|
+
readonly storageKey: string;
|
|
86
|
+
}
|
|
87
|
+
export interface DeleteAssetArgs {
|
|
88
|
+
readonly assetId: string;
|
|
89
|
+
readonly storageKey: string;
|
|
90
|
+
}
|
|
91
|
+
export interface MediaAsset {
|
|
92
|
+
readonly id: string;
|
|
93
|
+
readonly storageKey: string;
|
|
94
|
+
readonly publicUrl: string;
|
|
95
|
+
readonly mimeType: string;
|
|
96
|
+
readonly byteSize: number;
|
|
97
|
+
readonly alt?: string;
|
|
98
|
+
readonly caption?: string;
|
|
99
|
+
readonly createdAt: number;
|
|
100
|
+
readonly metadata?: Readonly<Record<string, string>>;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=MediaStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaStorage.d.ts","sourceRoot":"","sources":["../../../src/domain/port/MediaStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAElE,yEAAyE;IACzE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1D,oEAAoE;IACpE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;uBAEmB;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,iFAAiF;IACjF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaStorage.js","sourceRoot":"","sources":["../../../src/domain/port/MediaStorage.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SiteConfig } from "@aotter/mantle-spec";
|
|
2
|
+
import type { TemplateRegistry } from "../model/TemplateRegistry.js";
|
|
3
|
+
/**
|
|
4
|
+
* `PublishOrchestrator` — the publish-pipeline surface adapters call
|
|
5
|
+
* after a successful `requestPublish` to materialize HTML / `.md` /
|
|
6
|
+
* list pages / `llms.txt` into the `KvCache`.
|
|
7
|
+
*
|
|
8
|
+
* `TemplateRegistry` is consumer-supplied (`createCmsRuntime` accepts
|
|
9
|
+
* it); rendering is idempotent — two invocations with the same entry
|
|
10
|
+
* id are safe.
|
|
11
|
+
*
|
|
12
|
+
* The HTML implementation is in
|
|
13
|
+
* `infrastructure/render/HtmlPublishOrchestrator`.
|
|
14
|
+
*/
|
|
15
|
+
export interface PublishOrchestrator {
|
|
16
|
+
publish(request: PublishEntryRequest): Promise<void>;
|
|
17
|
+
unpublish(request: PublishEntryRequest): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export interface PublishEntryRequest {
|
|
20
|
+
readonly entryId: string;
|
|
21
|
+
readonly site: SiteConfig;
|
|
22
|
+
readonly templates: TemplateRegistry;
|
|
23
|
+
readonly htmlDoctype?: string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=PublishOrchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublishOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/domain/port/PublishOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublishOrchestrator.js","sourceRoot":"","sources":["../../../src/domain/port/PublishOrchestrator.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SiteConfig, SiteDefaults } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* `SiteConfigRepository` — the `site_config` row read/write surface
|
|
4
|
+
* the runtime exposes to render paths and `bootInit`.
|
|
5
|
+
*
|
|
6
|
+
* `seed` is called once during `bootInit` with the config-supplied
|
|
7
|
+
* `siteDefaults`; subsequent operator edits to the row are preserved
|
|
8
|
+
* (INSERT … ON CONFLICT DO NOTHING).
|
|
9
|
+
*
|
|
10
|
+
* `load` returns the merged view template authors and adapters see.
|
|
11
|
+
* `readLocales` exists separately because boot-time validation needs
|
|
12
|
+
* the locales list before the rest of the row is meaningful.
|
|
13
|
+
*
|
|
14
|
+
* The DB-backed implementation is in
|
|
15
|
+
* `infrastructure/persistence/DatabaseSiteConfigRepository`.
|
|
16
|
+
*/
|
|
17
|
+
export interface SiteConfigRepository {
|
|
18
|
+
seed(defaults: SiteDefaults | undefined): Promise<void>;
|
|
19
|
+
load(): Promise<SiteConfig>;
|
|
20
|
+
readLocales(): Promise<readonly string[]>;
|
|
21
|
+
/** Declared media purpose taxonomy (`SiteConfig.media.purposes`).
|
|
22
|
+
* Empty array when the deployment didn't declare any — symmetric
|
|
23
|
+
* with "no `MediaStorage` configured" and used by the MCP tool
|
|
24
|
+
* catalog to gate `create_media_upload` / `commit_media_upload`. */
|
|
25
|
+
readMediaPurposes(): Promise<readonly string[]>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=SiteConfigRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteConfigRepository.d.ts","sourceRoot":"","sources":["../../../src/domain/port/SiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1C;;;yEAGqE;IACrE,iBAAiB,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteConfigRepository.js","sourceRoot":"","sources":["../../../src/domain/port/SiteConfigRepository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `domain/port/` — interface contracts the use cases depend on.
|
|
3
|
+
* Concrete implementations live in `infrastructure/` (or in adapter
|
|
4
|
+
* packages like `@aotter/mantle-cloudflare`).
|
|
5
|
+
*
|
|
6
|
+
* Required adapter ports — `DatabaseDriver`, `KvCache`, `AssetServer`.
|
|
7
|
+
* Optional feature ports — `MediaStorage` (public-bucket media
|
|
8
|
+
* uploads), `EmailSender` (transactional email — passwordless auth,
|
|
9
|
+
* receipts). Dispatcher-internal seams — `Clock`, `IdGenerator`,
|
|
10
|
+
* `HandlerRegistry`, `EntryRepository`. Identity / session / OAuth
|
|
11
|
+
* live outside the runtime via Better Auth (ADR-0014).
|
|
12
|
+
*
|
|
13
|
+
* Per the Aotter clean-architecture convention, no `*Port` suffix;
|
|
14
|
+
* ports are discoverable by the package alone.
|
|
15
|
+
*/
|
|
16
|
+
export type { DatabaseDriver, PreparedStatement, RunResult, BatchResult, MigrationRunner, Migration, } from "./DatabaseDriver.js";
|
|
17
|
+
export type { KvCache, KvPutOptions, KvListResult } from "./KvCache.js";
|
|
18
|
+
export type { AssetServer } from "./AssetServer.js";
|
|
19
|
+
export type { EntryRepository, CreateEntryArgs, UpdateEntryArgs, DeleteEntryArgs, ArchiveEntryArgs, TransitionStatusArgs, ListEntriesArgs, ListEntriesResult, FindEntryByDataFieldArgs, FindEntryByDataFieldsArgs, MutationHookFields, } from "./EntryRepository.js";
|
|
20
|
+
export type { SiteConfigRepository } from "./SiteConfigRepository.js";
|
|
21
|
+
export type { PublishOrchestrator, PublishEntryRequest, } from "./PublishOrchestrator.js";
|
|
22
|
+
export type { MediaStorage, CreateUploadArgs, CreateUploadResult, CommitUploadArgs, GetPublicUrlArgs, DeleteAssetArgs, MediaAsset, } from "./MediaStorage.js";
|
|
23
|
+
export type { EmailSender, EmailSendArgs, } from "./EmailSender.js";
|
|
24
|
+
export type { LifecycleHookRunner, RunLifecycleHookRequest, } from "./LifecycleHookRunner.js";
|
|
25
|
+
export type { DeferredHookDispatcher, DeferredHookEnvelope, CtxSnapshot, } from "./DeferredHookDispatcher.js";
|
|
26
|
+
export { ctxSnapshotFrom } from "./DeferredHookDispatcher.js";
|
|
27
|
+
export { type Clock, SystemClock } from "./Clock.js";
|
|
28
|
+
export { type IdGenerator, RandomUuidGenerator } from "./IdGenerator.js";
|
|
29
|
+
export { type HandlerRegistry, InMemoryHandlerRegistry, buildHandlerRegistry, } from "./HandlerRegistry.js";
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/port/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,KAAK,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,KAAK,eAAe,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ctxSnapshotFrom } from "./DeferredHookDispatcher.js";
|
|
2
|
+
export { SystemClock } from "./Clock.js";
|
|
3
|
+
export { RandomUuidGenerator } from "./IdGenerator.js";
|
|
4
|
+
export { InMemoryHandlerRegistry, buildHandlerRegistry, } from "./HandlerRegistry.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/port/index.ts"],"names":[],"mappings":"AAiEA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAEL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function absoluteUrl(origin: string, path: string): string;
|
|
2
|
+
/** Append `.md` before any query string / hash. Used by the SEO
|
|
3
|
+
* composer + sitemap to derive markdown-mirror URLs without
|
|
4
|
+
* mangling query params. */
|
|
5
|
+
export declare function appendMarkdownExt(absoluteOrPath: string): string;
|
|
6
|
+
//# sourceMappingURL=AbsoluteUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbsoluteUrl.d.ts","sourceRoot":"","sources":["../../../src/domain/service/AbsoluteUrl.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhE;AAED;;6BAE6B;AAC7B,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAIhE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absolutize a path against a `SiteConfig.origin`. Single chokepoint
|
|
3
|
+
* so trailing-slash handling is consistent across every URL the SDK
|
|
4
|
+
* emits — sitemap, llms.txt mirrors, SEO canonical, hreflang siblings.
|
|
5
|
+
*
|
|
6
|
+
* Two divergent strip behaviors used to live across the codebase
|
|
7
|
+
* (`/\/$/` vs `/\/+$/`); both flow through here now.
|
|
8
|
+
*
|
|
9
|
+
* Empty `origin` returns the path unchanged — useful for tests and
|
|
10
|
+
* for templates that intentionally emit relative URLs. Already-
|
|
11
|
+
* absolute `path` (http(s)://...) returns unchanged.
|
|
12
|
+
*/
|
|
13
|
+
const TRAILING_SLASHES = /\/+$/;
|
|
14
|
+
export function absoluteUrl(origin, path) {
|
|
15
|
+
if (!origin)
|
|
16
|
+
return path;
|
|
17
|
+
if (path.startsWith("http://") || path.startsWith("https://"))
|
|
18
|
+
return path;
|
|
19
|
+
const cleanOrigin = origin.replace(TRAILING_SLASHES, "");
|
|
20
|
+
if (!path)
|
|
21
|
+
return cleanOrigin;
|
|
22
|
+
return `${cleanOrigin}${path.startsWith("/") ? "" : "/"}${path}`;
|
|
23
|
+
}
|
|
24
|
+
/** Append `.md` before any query string / hash. Used by the SEO
|
|
25
|
+
* composer + sitemap to derive markdown-mirror URLs without
|
|
26
|
+
* mangling query params. */
|
|
27
|
+
export function appendMarkdownExt(absoluteOrPath) {
|
|
28
|
+
const match = /^([^?#]*)(.*)$/.exec(absoluteOrPath);
|
|
29
|
+
if (!match)
|
|
30
|
+
return `${absoluteOrPath}.md`;
|
|
31
|
+
return `${match[1]}.md${match[2]}`;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=AbsoluteUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbsoluteUrl.js","sourceRoot":"","sources":["../../../src/domain/service/AbsoluteUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAY;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC;IAC9B,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;AACnE,CAAC;AAED;;6BAE6B;AAC7B,MAAM,UAAU,iBAAiB,CAAC,cAAsB;IACtD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,cAAc,KAAK,CAAC;IAC1C,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type AuthPredicate, type Diagnostic, type Phase } from "@aotter/mantle-spec";
|
|
2
|
+
import type { HandlerContext } from "../model/HandlerContext.js";
|
|
3
|
+
/**
|
|
4
|
+
* Pure auth-predicate evaluator. Shared by `InvokeProcedureUseCase`
|
|
5
|
+
* and `ExecuteViewUseCase` so the `requires.auth.all` semantics in the
|
|
6
|
+
* manifest grammar produce identical runtime behavior across atoms.
|
|
7
|
+
*
|
|
8
|
+
* The closed predicate vocabulary (`ctx.user`, `{ ctx.staff: [<role>] }`)
|
|
9
|
+
* is enforced at parse time; this evaluator trusts the shape and only
|
|
10
|
+
* checks against the live `HandlerContext`.
|
|
11
|
+
*
|
|
12
|
+
* Domain-pure: no IO, no port deps. Lives in `domain/service/` because
|
|
13
|
+
* both the procedure and view use cases need it; placing it in either
|
|
14
|
+
* use case would create a usecase→usecase coupling.
|
|
15
|
+
*/
|
|
16
|
+
export interface AuthRequires {
|
|
17
|
+
readonly auth?: {
|
|
18
|
+
readonly all: readonly AuthPredicate[];
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Evaluate `requires.auth.all` against `ctx`. Returns `null` when
|
|
23
|
+
* authorization passes (or no `requires.auth.all` is declared), or an
|
|
24
|
+
* `AUTH_DENIED` Diagnostic naming the first failing predicate.
|
|
25
|
+
*/
|
|
26
|
+
export declare function evaluateAuthAll(requires: AuthRequires | undefined, ctx: HandlerContext, path: string, phase: Phase): Diagnostic | null;
|
|
27
|
+
export declare function evaluatePredicate(pred: AuthPredicate, ctx: HandlerContext): boolean;
|
|
28
|
+
export declare function describePredicate(pred: AuthPredicate): string;
|
|
29
|
+
//# sourceMappingURL=AuthPredicateEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthPredicateEvaluator.d.ts","sourceRoot":"","sources":["../../../src/domain/service/AuthPredicateEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,KAAK,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,aAAa,EAAE,CAAA;KAAE,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,GACX,UAAU,GAAG,IAAI,CAiBnB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAOnF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAU7D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { makeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluate `requires.auth.all` against `ctx`. Returns `null` when
|
|
4
|
+
* authorization passes (or no `requires.auth.all` is declared), or an
|
|
5
|
+
* `AUTH_DENIED` Diagnostic naming the first failing predicate.
|
|
6
|
+
*/
|
|
7
|
+
export function evaluateAuthAll(requires, ctx, path, phase) {
|
|
8
|
+
const all = requires?.auth?.all;
|
|
9
|
+
if (!all || all.length === 0)
|
|
10
|
+
return null;
|
|
11
|
+
for (let i = 0; i < all.length; i++) {
|
|
12
|
+
const pred = all[i];
|
|
13
|
+
if (!evaluatePredicate(pred, ctx)) {
|
|
14
|
+
return makeDiagnostic({
|
|
15
|
+
code: "AUTH_DENIED",
|
|
16
|
+
phase,
|
|
17
|
+
severity: "error",
|
|
18
|
+
path: `${path}#/requires/auth/all/${i}`,
|
|
19
|
+
expected: describePredicate(pred),
|
|
20
|
+
message: `Authorization predicate not satisfied: ${describePredicate(pred)}.`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
export function evaluatePredicate(pred, ctx) {
|
|
27
|
+
if (pred === "ctx.user")
|
|
28
|
+
return ctx.user !== null;
|
|
29
|
+
if (typeof pred === "object" && pred !== null && "ctx.staff" in pred) {
|
|
30
|
+
if (!ctx.staff)
|
|
31
|
+
return false;
|
|
32
|
+
return pred["ctx.staff"].includes(ctx.staff.role);
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
export function describePredicate(pred) {
|
|
37
|
+
if (pred === "ctx.user")
|
|
38
|
+
return "caller is signed in (ctx.user)";
|
|
39
|
+
if (typeof pred === "object" && pred !== null && "ctx.staff" in pred) {
|
|
40
|
+
return `caller is staff with role in [${pred["ctx.staff"].join(", ")}]`;
|
|
41
|
+
}
|
|
42
|
+
// Exhaustive: if AuthPredicate gains a variant the parser admits but
|
|
43
|
+
// this function doesn't yet recognise, fail loud rather than throw
|
|
44
|
+
// on a downstream key access.
|
|
45
|
+
const _exhaustive = pred;
|
|
46
|
+
throw new Error(`describePredicate: unrecognised AuthPredicate ${JSON.stringify(_exhaustive)}`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=AuthPredicateEvaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthPredicateEvaluator.js","sourceRoot":"","sources":["../../../src/domain/service/AuthPredicateEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAqB7B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAkC,EAClC,GAAmB,EACnB,IAAY,EACZ,KAAY;IAEZ,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,cAAc,CAAC;gBACpB,IAAI,EAAE,aAAa;gBACnB,KAAK;gBACL,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,GAAG,IAAI,uBAAuB,CAAC,EAAE;gBACvC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC;gBACjC,OAAO,EAAE,0CAA0C,iBAAiB,CAAC,IAAI,CAAC,GAAG;aAC9E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,GAAmB;IACxE,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB;IACnD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,gCAAgC,CAAC;IACjE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACrE,OAAO,iCAAiC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1E,CAAC;IACD,qEAAqE;IACrE,mEAAmE;IACnE,8BAA8B;IAC9B,MAAM,WAAW,GAAU,IAAI,CAAC;IAChC,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type SchemaManifest } from "@aotter/mantle-spec";
|
|
2
|
+
import type { HandlerContext } from "../model/HandlerContext.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builtin op input projection + `x-clam-bind` stamping (POC ADR-0014).
|
|
5
|
+
*
|
|
6
|
+
* Two transforms applied to `Procedure.input` before it lands in
|
|
7
|
+
* `EntryRepository`:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Projection**: copy only the keys declared on the target
|
|
10
|
+
* Schema's `spec.schema.properties`. Side-channel fields (CAPTCHA
|
|
11
|
+
* tokens, hCaptcha challenges, etc.) declared in the Procedure's
|
|
12
|
+
* input but not in the Schema's properties are silently dropped
|
|
13
|
+
* from the row. They remain available to lifecycle hooks via
|
|
14
|
+
* `ctx.event.originalInput`.
|
|
15
|
+
*
|
|
16
|
+
* 2. **Stamping**: any Schema property carrying `x-clam-bind: <value>`
|
|
17
|
+
* gets its value computed at write time:
|
|
18
|
+
* - `ctx.user` → `ctx.user?.id ?? null`
|
|
19
|
+
* - `ctx.staff` → `ctx.staff?.id ?? null`
|
|
20
|
+
* - `now` → `clockNow` (caller-supplied; lets the use case
|
|
21
|
+
* share its `Clock` so created/updated stamps line up)
|
|
22
|
+
*
|
|
23
|
+
* Stamping overrides whatever the caller passed for that key —
|
|
24
|
+
* declarative server-stamping is the contract.
|
|
25
|
+
*
|
|
26
|
+
* Pure stateless service — no I/O. Lives in `domain/service/`.
|
|
27
|
+
*/
|
|
28
|
+
export interface ProjectAndStampArgs {
|
|
29
|
+
readonly schema: SchemaManifest;
|
|
30
|
+
readonly input: Record<string, unknown>;
|
|
31
|
+
readonly ctx: HandlerContext;
|
|
32
|
+
readonly clockNow: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function projectAndStamp(args: ProjectAndStampArgs): Record<string, unknown>;
|
|
35
|
+
export interface ProjectUpdateAndStampArgs {
|
|
36
|
+
readonly schema: SchemaManifest;
|
|
37
|
+
readonly existing: Record<string, unknown>;
|
|
38
|
+
readonly patch: Record<string, unknown>;
|
|
39
|
+
readonly ctx: HandlerContext;
|
|
40
|
+
readonly clockNow: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Project update data through the same Schema-declared field allowlist
|
|
44
|
+
* while preserving existing server-stamped values. This keeps direct
|
|
45
|
+
* authoring paths (MCP/admin) from accepting arbitrary blob keys, but
|
|
46
|
+
* avoids turning `x-clam-bind: now` fields into "update timestamp"
|
|
47
|
+
* fields on every draft edit.
|
|
48
|
+
*/
|
|
49
|
+
export declare function projectUpdateAndStamp(args: ProjectUpdateAndStampArgs): Record<string, unknown>;
|
|
50
|
+
//# sourceMappingURL=BuiltinProjector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiltinProjector.d.ts","sourceRoot":"","sources":["../../../src/domain/service/BuiltinProjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAelF;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB9F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { CLAM_BIND_KEYWORD, CLAM_BIND_VALUES, } from "@aotter/mantle-spec";
|
|
2
|
+
export function projectAndStamp(args) {
|
|
3
|
+
const properties = args.schema.spec.schema.properties ?? {};
|
|
4
|
+
const out = {};
|
|
5
|
+
for (const [key, propDef] of Object.entries(properties)) {
|
|
6
|
+
const bind = bindValueOf(propDef);
|
|
7
|
+
if (bind) {
|
|
8
|
+
out[key] = computeBind(bind, args.ctx, args.clockNow);
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
if (key in args.input) {
|
|
12
|
+
out[key] = args.input[key];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Project update data through the same Schema-declared field allowlist
|
|
19
|
+
* while preserving existing server-stamped values. This keeps direct
|
|
20
|
+
* authoring paths (MCP/admin) from accepting arbitrary blob keys, but
|
|
21
|
+
* avoids turning `x-clam-bind: now` fields into "update timestamp"
|
|
22
|
+
* fields on every draft edit.
|
|
23
|
+
*/
|
|
24
|
+
export function projectUpdateAndStamp(args) {
|
|
25
|
+
const properties = args.schema.spec.schema.properties ?? {};
|
|
26
|
+
const merged = { ...args.existing, ...args.patch };
|
|
27
|
+
const out = {};
|
|
28
|
+
for (const [key, propDef] of Object.entries(properties)) {
|
|
29
|
+
const bind = bindValueOf(propDef);
|
|
30
|
+
if (bind) {
|
|
31
|
+
out[key] = key in args.existing
|
|
32
|
+
? args.existing[key]
|
|
33
|
+
: computeBind(bind, args.ctx, args.clockNow);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (key in merged) {
|
|
37
|
+
out[key] = merged[key];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
function bindValueOf(propDef) {
|
|
43
|
+
if (typeof propDef !== "object" || propDef === null)
|
|
44
|
+
return undefined;
|
|
45
|
+
const v = propDef[CLAM_BIND_KEYWORD];
|
|
46
|
+
if (typeof v === "string" && CLAM_BIND_VALUES.includes(v)) {
|
|
47
|
+
return v;
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
function computeBind(bind, ctx, clockNow) {
|
|
52
|
+
switch (bind) {
|
|
53
|
+
case "ctx.user":
|
|
54
|
+
return ctx.user?.id ?? null;
|
|
55
|
+
case "ctx.staff":
|
|
56
|
+
return ctx.staff?.id ?? null;
|
|
57
|
+
case "now":
|
|
58
|
+
return clockNow;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=BuiltinProjector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiltinProjector.js","sourceRoot":"","sources":["../../../src/domain/service/BuiltinProjector.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAmC7B,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,MAAM,UAAU,GACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAmD,CAAC,UAAU,IAAI,EAAE,CAAC;IACzF,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACnE,MAAM,UAAU,GACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAmD,CAAC,UAAU,IAAI,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACnD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ;gBAC7B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACpB,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,CAAC,GAAI,OAAmC,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,gBAAsC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,CAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,GAAmB,EAAE,QAAgB;IAC7E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;QAC9B,KAAK,WAAW;YACd,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;QAC/B,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
2
|
+
import type { SeoMeta } from "../model/SeoMeta.js";
|
|
3
|
+
import type { PublicPathResolver } from "./PublicPathResolver.js";
|
|
4
|
+
/**
|
|
5
|
+
* Structural shape of the SEO-meta composer the render pipeline
|
|
6
|
+
* accepts. Lives in `domain/service/` (not `usecase/render/`) so
|
|
7
|
+
* infrastructure code — notably `HtmlPublishOrchestrator` — can
|
|
8
|
+
* import this helper without crossing the `infrastructure→usecase`
|
|
9
|
+
* boundary that CLAUDE.md forbids.
|
|
10
|
+
*
|
|
11
|
+
* The runtime assembly root wires in `ComposeEntrySeoMetaUseCase`
|
|
12
|
+
* which satisfies this shape; tests may pass a hand-rolled stub.
|
|
13
|
+
*/
|
|
14
|
+
export interface SeoComposer {
|
|
15
|
+
execute(args: {
|
|
16
|
+
readonly entry: Entry;
|
|
17
|
+
readonly site: SiteConfig;
|
|
18
|
+
readonly paths: PublicPathResolver;
|
|
19
|
+
}): Promise<SeoMeta>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Shared "compose if the entry has a public URL" predicate. Keeps the
|
|
23
|
+
* three callers (`RenderEntryLiveUseCase`, `PreviewEntryUseCase`,
|
|
24
|
+
* `HtmlPublishOrchestrator`) from re-inlining the same null-check.
|
|
25
|
+
*/
|
|
26
|
+
export declare function composeSeoIfPathed(composer: SeoComposer, paths: PublicPathResolver | null, entry: Entry, site: SiteConfig): Promise<SeoMeta | undefined>;
|
|
27
|
+
//# sourceMappingURL=EntrySeoSupport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntrySeoSupport.d.ts","sourceRoot":"","sources":["../../../src/domain/service/EntrySeoSupport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,IAAI,EAAE;QACZ,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;KACpC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAI9B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared "compose if the entry has a public URL" predicate. Keeps the
|
|
3
|
+
* three callers (`RenderEntryLiveUseCase`, `PreviewEntryUseCase`,
|
|
4
|
+
* `HtmlPublishOrchestrator`) from re-inlining the same null-check.
|
|
5
|
+
*/
|
|
6
|
+
export async function composeSeoIfPathed(composer, paths, entry, site) {
|
|
7
|
+
if (!paths)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (!paths.forEntry(entry))
|
|
10
|
+
return undefined;
|
|
11
|
+
return composer.execute({ entry, site, paths });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=EntrySeoSupport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntrySeoSupport.js","sourceRoot":"","sources":["../../../src/domain/service/EntrySeoSupport.ts"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAqB,EACrB,KAAgC,EAChC,KAAY,EACZ,IAAgB;IAEhB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
2
|
+
import type { TemplateRegistry } from "../model/TemplateRegistry.js";
|
|
3
|
+
import type { SeoMeta } from "../model/SeoMeta.js";
|
|
4
|
+
export interface RenderEntryArgs {
|
|
5
|
+
readonly entry: Entry;
|
|
6
|
+
readonly site: SiteConfig;
|
|
7
|
+
readonly templates: TemplateRegistry;
|
|
8
|
+
/** Defaults to `<!doctype html>`. Pipelines that want the
|
|
9
|
+
* upper-case `<!DOCTYPE html>\n` shape pass it explicitly. */
|
|
10
|
+
readonly doctype?: string;
|
|
11
|
+
/** Optional pre-composed SEO/AEO block. Threaded into the
|
|
12
|
+
* `EntryContext.seo` field so templates can emit `<SeoTags
|
|
13
|
+
* seo={seo}/>` inside `<head>`. Renderers that skip composition
|
|
14
|
+
* leave it undefined — opt-out templates keep working. */
|
|
15
|
+
readonly seo?: SeoMeta;
|
|
16
|
+
}
|
|
17
|
+
/** Returns the full HTML doc (doctype + body) or `null` if no entry
|
|
18
|
+
* template is registered for `entry.collection`. */
|
|
19
|
+
export declare function renderEntryHtml(args: RenderEntryArgs): string | null;
|
|
20
|
+
export interface RenderListArgs {
|
|
21
|
+
readonly collection: string;
|
|
22
|
+
readonly locale: string;
|
|
23
|
+
readonly entries: ReadonlyArray<Entry>;
|
|
24
|
+
readonly site: SiteConfig;
|
|
25
|
+
readonly templates: TemplateRegistry;
|
|
26
|
+
readonly doctype?: string;
|
|
27
|
+
readonly seo?: SeoMeta;
|
|
28
|
+
}
|
|
29
|
+
/** Returns the full HTML doc or `null` if no list template is
|
|
30
|
+
* registered for `collection`. */
|
|
31
|
+
export declare function renderListHtml(args: RenderListArgs): string | null;
|
|
32
|
+
//# sourceMappingURL=HtmlRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlRenderer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/HtmlRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAgBnD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC;mEAC+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;+DAG2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;qDACqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CASpE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;mCACmC;AACnC,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAalE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure render functions over the consumer-supplied template registry.
|
|
3
|
+
* Used by:
|
|
4
|
+
* - `HtmlPublishOrchestrator` (publish-time → write KV)
|
|
5
|
+
* - request-time route handlers in adapters (live-render bypass,
|
|
6
|
+
* preview surface)
|
|
7
|
+
*
|
|
8
|
+
* Both call sites previously inlined the template-lookup + doctype
|
|
9
|
+
* concatenation. Extracting here keeps the contract single-sourced
|
|
10
|
+
* — adding a doctype mode, an OG-meta wrapper, or a per-collection
|
|
11
|
+
* pre/post hook is one edit. No I/O; no DB; no env access.
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_DOCTYPE = "<!doctype html>";
|
|
14
|
+
/** Returns the full HTML doc (doctype + body) or `null` if no entry
|
|
15
|
+
* template is registered for `entry.collection`. */
|
|
16
|
+
export function renderEntryHtml(args) {
|
|
17
|
+
const tpl = args.templates.getEntryTemplate(args.entry.collection);
|
|
18
|
+
if (!tpl)
|
|
19
|
+
return null;
|
|
20
|
+
return ((args.doctype ?? DEFAULT_DOCTYPE) +
|
|
21
|
+
tpl({ entry: args.entry, site: args.site, seo: args.seo }));
|
|
22
|
+
}
|
|
23
|
+
/** Returns the full HTML doc or `null` if no list template is
|
|
24
|
+
* registered for `collection`. */
|
|
25
|
+
export function renderListHtml(args) {
|
|
26
|
+
const tpl = args.templates.getListTemplate(args.collection);
|
|
27
|
+
if (!tpl)
|
|
28
|
+
return null;
|
|
29
|
+
return ((args.doctype ?? DEFAULT_DOCTYPE) +
|
|
30
|
+
tpl({
|
|
31
|
+
collection: args.collection,
|
|
32
|
+
locale: args.locale,
|
|
33
|
+
entries: args.entries,
|
|
34
|
+
site: args.site,
|
|
35
|
+
seo: args.seo,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=HtmlRenderer.js.map
|