@aotter/mantle-runtime 0.0.11-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +14 -0
- package/dist/domain/index.d.ts +4 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +4 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/model/EntryRow.d.ts +59 -0
- package/dist/domain/model/EntryRow.d.ts.map +1 -0
- package/dist/domain/model/EntryRow.js +42 -0
- package/dist/domain/model/EntryRow.js.map +1 -0
- package/dist/domain/model/HandlerContext.d.ts +65 -0
- package/dist/domain/model/HandlerContext.d.ts.map +1 -0
- package/dist/domain/model/HandlerContext.js +2 -0
- package/dist/domain/model/HandlerContext.js.map +1 -0
- package/dist/domain/model/SeoMeta.d.ts +49 -0
- package/dist/domain/model/SeoMeta.d.ts.map +1 -0
- package/dist/domain/model/SeoMeta.js +2 -0
- package/dist/domain/model/SeoMeta.js.map +1 -0
- package/dist/domain/model/TemplateRegistry.d.ts +47 -0
- package/dist/domain/model/TemplateRegistry.d.ts.map +1 -0
- package/dist/domain/model/TemplateRegistry.js +17 -0
- package/dist/domain/model/TemplateRegistry.js.map +1 -0
- package/dist/domain/model/index.d.ts +7 -0
- package/dist/domain/model/index.d.ts.map +1 -0
- package/dist/domain/model/index.js +6 -0
- package/dist/domain/model/index.js.map +1 -0
- package/dist/domain/port/AssetServer.d.ts +21 -0
- package/dist/domain/port/AssetServer.d.ts.map +1 -0
- package/dist/domain/port/AssetServer.js +2 -0
- package/dist/domain/port/AssetServer.js.map +1 -0
- package/dist/domain/port/Clock.d.ts +13 -0
- package/dist/domain/port/Clock.d.ts.map +1 -0
- package/dist/domain/port/Clock.js +2 -0
- package/dist/domain/port/Clock.js.map +1 -0
- package/dist/domain/port/DatabaseDriver.d.ts +91 -0
- package/dist/domain/port/DatabaseDriver.d.ts.map +1 -0
- package/dist/domain/port/DatabaseDriver.js +2 -0
- package/dist/domain/port/DatabaseDriver.js.map +1 -0
- package/dist/domain/port/DeferredHookDispatcher.d.ts +55 -0
- package/dist/domain/port/DeferredHookDispatcher.d.ts.map +1 -0
- package/dist/domain/port/DeferredHookDispatcher.js +16 -0
- package/dist/domain/port/DeferredHookDispatcher.js.map +1 -0
- package/dist/domain/port/EmailSender.d.ts +31 -0
- package/dist/domain/port/EmailSender.d.ts.map +1 -0
- package/dist/domain/port/EmailSender.js +2 -0
- package/dist/domain/port/EmailSender.js.map +1 -0
- package/dist/domain/port/EntryRepository.d.ts +132 -0
- package/dist/domain/port/EntryRepository.d.ts.map +1 -0
- package/dist/domain/port/EntryRepository.js +2 -0
- package/dist/domain/port/EntryRepository.js.map +1 -0
- package/dist/domain/port/HandlerRegistry.d.ts +38 -0
- package/dist/domain/port/HandlerRegistry.d.ts.map +1 -0
- package/dist/domain/port/HandlerRegistry.js +27 -0
- package/dist/domain/port/HandlerRegistry.js.map +1 -0
- package/dist/domain/port/IdGenerator.d.ts +28 -0
- package/dist/domain/port/IdGenerator.d.ts.map +1 -0
- package/dist/domain/port/IdGenerator.js +5 -0
- package/dist/domain/port/IdGenerator.js.map +1 -0
- package/dist/domain/port/KvCache.d.ts +34 -0
- package/dist/domain/port/KvCache.d.ts.map +1 -0
- package/dist/domain/port/KvCache.js +2 -0
- package/dist/domain/port/KvCache.js.map +1 -0
- package/dist/domain/port/LifecycleHookRunner.d.ts +41 -0
- package/dist/domain/port/LifecycleHookRunner.d.ts.map +1 -0
- package/dist/domain/port/LifecycleHookRunner.js +2 -0
- package/dist/domain/port/LifecycleHookRunner.js.map +1 -0
- package/dist/domain/port/MediaStorage.d.ts +102 -0
- package/dist/domain/port/MediaStorage.d.ts.map +1 -0
- package/dist/domain/port/MediaStorage.js +2 -0
- package/dist/domain/port/MediaStorage.js.map +1 -0
- package/dist/domain/port/PublishOrchestrator.d.ts +25 -0
- package/dist/domain/port/PublishOrchestrator.d.ts.map +1 -0
- package/dist/domain/port/PublishOrchestrator.js +2 -0
- package/dist/domain/port/PublishOrchestrator.js.map +1 -0
- package/dist/domain/port/SiteConfigRepository.d.ts +27 -0
- package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -0
- package/dist/domain/port/SiteConfigRepository.js +2 -0
- package/dist/domain/port/SiteConfigRepository.js.map +1 -0
- package/dist/domain/port/index.d.ts +30 -0
- package/dist/domain/port/index.d.ts.map +1 -0
- package/dist/domain/port/index.js +5 -0
- package/dist/domain/port/index.js.map +1 -0
- package/dist/domain/service/AbsoluteUrl.d.ts +6 -0
- package/dist/domain/service/AbsoluteUrl.d.ts.map +1 -0
- package/dist/domain/service/AbsoluteUrl.js +33 -0
- package/dist/domain/service/AbsoluteUrl.js.map +1 -0
- package/dist/domain/service/AuthPredicateEvaluator.d.ts +29 -0
- package/dist/domain/service/AuthPredicateEvaluator.d.ts.map +1 -0
- package/dist/domain/service/AuthPredicateEvaluator.js +48 -0
- package/dist/domain/service/AuthPredicateEvaluator.js.map +1 -0
- package/dist/domain/service/BuiltinProjector.d.ts +50 -0
- package/dist/domain/service/BuiltinProjector.d.ts.map +1 -0
- package/dist/domain/service/BuiltinProjector.js +61 -0
- package/dist/domain/service/BuiltinProjector.js.map +1 -0
- package/dist/domain/service/EntrySeoSupport.d.ts +27 -0
- package/dist/domain/service/EntrySeoSupport.d.ts.map +1 -0
- package/dist/domain/service/EntrySeoSupport.js +13 -0
- package/dist/domain/service/EntrySeoSupport.js.map +1 -0
- package/dist/domain/service/HtmlRenderer.d.ts +32 -0
- package/dist/domain/service/HtmlRenderer.d.ts.map +1 -0
- package/dist/domain/service/HtmlRenderer.js +38 -0
- package/dist/domain/service/HtmlRenderer.js.map +1 -0
- package/dist/domain/service/LocaleNegotiator.d.ts +29 -0
- package/dist/domain/service/LocaleNegotiator.d.ts.map +1 -0
- package/dist/domain/service/LocaleNegotiator.js +62 -0
- package/dist/domain/service/LocaleNegotiator.js.map +1 -0
- package/dist/domain/service/MarkdownSerializer.d.ts +48 -0
- package/dist/domain/service/MarkdownSerializer.d.ts.map +1 -0
- package/dist/domain/service/MarkdownSerializer.js +109 -0
- package/dist/domain/service/MarkdownSerializer.js.map +1 -0
- package/dist/domain/service/McpToolNaming.d.ts +12 -0
- package/dist/domain/service/McpToolNaming.d.ts.map +1 -0
- package/dist/domain/service/McpToolNaming.js +14 -0
- package/dist/domain/service/McpToolNaming.js.map +1 -0
- package/dist/domain/service/Pagination.d.ts +15 -0
- package/dist/domain/service/Pagination.d.ts.map +1 -0
- package/dist/domain/service/Pagination.js +29 -0
- package/dist/domain/service/Pagination.js.map +1 -0
- package/dist/domain/service/PathMatcher.d.ts +15 -0
- package/dist/domain/service/PathMatcher.d.ts.map +1 -0
- package/dist/domain/service/PathMatcher.js +54 -0
- package/dist/domain/service/PathMatcher.js.map +1 -0
- package/dist/domain/service/PreviewBanner.d.ts +10 -0
- package/dist/domain/service/PreviewBanner.d.ts.map +1 -0
- package/dist/domain/service/PreviewBanner.js +37 -0
- package/dist/domain/service/PreviewBanner.js.map +1 -0
- package/dist/domain/service/PublicPathResolver.d.ts +41 -0
- package/dist/domain/service/PublicPathResolver.d.ts.map +1 -0
- package/dist/domain/service/PublicPathResolver.js +24 -0
- package/dist/domain/service/PublicPathResolver.js.map +1 -0
- package/dist/domain/service/PublishKeys.d.ts +42 -0
- package/dist/domain/service/PublishKeys.d.ts.map +1 -0
- package/dist/domain/service/PublishKeys.js +69 -0
- package/dist/domain/service/PublishKeys.js.map +1 -0
- package/dist/domain/service/SeoMetaComposer.d.ts +47 -0
- package/dist/domain/service/SeoMetaComposer.d.ts.map +1 -0
- package/dist/domain/service/SeoMetaComposer.js +174 -0
- package/dist/domain/service/SeoMetaComposer.js.map +1 -0
- package/dist/domain/service/SitemapSerializer.d.ts +19 -0
- package/dist/domain/service/SitemapSerializer.d.ts.map +1 -0
- package/dist/domain/service/SitemapSerializer.js +27 -0
- package/dist/domain/service/SitemapSerializer.js.map +1 -0
- package/dist/domain/service/TriggerIndex.d.ts +27 -0
- package/dist/domain/service/TriggerIndex.d.ts.map +1 -0
- package/dist/domain/service/TriggerIndex.js +52 -0
- package/dist/domain/service/TriggerIndex.js.map +1 -0
- package/dist/domain/service/ViewParamCoercer.d.ts +20 -0
- package/dist/domain/service/ViewParamCoercer.d.ts.map +1 -0
- package/dist/domain/service/ViewParamCoercer.js +82 -0
- package/dist/domain/service/ViewParamCoercer.js.map +1 -0
- package/dist/domain/service/ViewSqlCompiler.d.ts +29 -0
- package/dist/domain/service/ViewSqlCompiler.d.ts.map +1 -0
- package/dist/domain/service/ViewSqlCompiler.js +147 -0
- package/dist/domain/service/ViewSqlCompiler.js.map +1 -0
- package/dist/domain/service/index.d.ts +28 -0
- package/dist/domain/service/index.d.ts.map +1 -0
- package/dist/domain/service/index.js +28 -0
- package/dist/domain/service/index.js.map +1 -0
- package/dist/domain/service/io/EntryWriteGuard.d.ts +19 -0
- package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -0
- package/dist/domain/service/io/EntryWriteGuard.js +109 -0
- package/dist/domain/service/io/EntryWriteGuard.js.map +1 -0
- package/dist/domain/service/io/JoinedEntryReader.d.ts +33 -0
- package/dist/domain/service/io/JoinedEntryReader.d.ts.map +1 -0
- package/dist/domain/service/io/JoinedEntryReader.js +95 -0
- package/dist/domain/service/io/JoinedEntryReader.js.map +1 -0
- package/dist/domain/service/io/PublishedEntries.d.ts +69 -0
- package/dist/domain/service/io/PublishedEntries.d.ts.map +1 -0
- package/dist/domain/service/io/PublishedEntries.js +116 -0
- package/dist/domain/service/io/PublishedEntries.js.map +1 -0
- package/dist/domain/service/io/index.d.ts +9 -0
- package/dist/domain/service/io/index.d.ts.map +1 -0
- package/dist/domain/service/io/index.js +9 -0
- package/dist/domain/service/io/index.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/boot/canonicalMigrations.d.ts +9 -0
- package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -0
- package/dist/infrastructure/boot/canonicalMigrations.js +162 -0
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -0
- package/dist/infrastructure/boot/index.d.ts +2 -0
- package/dist/infrastructure/boot/index.d.ts.map +1 -0
- package/dist/infrastructure/boot/index.js +2 -0
- package/dist/infrastructure/boot/index.js.map +1 -0
- package/dist/infrastructure/http/DiagnosticResponse.d.ts +12 -0
- package/dist/infrastructure/http/DiagnosticResponse.d.ts.map +1 -0
- package/dist/infrastructure/http/DiagnosticResponse.js +14 -0
- package/dist/infrastructure/http/DiagnosticResponse.js.map +1 -0
- package/dist/infrastructure/http/index.d.ts +2 -0
- package/dist/infrastructure/http/index.d.ts.map +1 -0
- package/dist/infrastructure/http/index.js +2 -0
- package/dist/infrastructure/http/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +12 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +12 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +60 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +281 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -0
- package/dist/infrastructure/mcp/McpResponses.d.ts +14 -0
- package/dist/infrastructure/mcp/McpResponses.d.ts.map +1 -0
- package/dist/infrastructure/mcp/McpResponses.js +49 -0
- package/dist/infrastructure/mcp/McpResponses.js.map +1 -0
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts +68 -0
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -0
- package/dist/infrastructure/mcp/McpToolCatalog.js +231 -0
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -0
- package/dist/infrastructure/mcp/index.d.ts +4 -0
- package/dist/infrastructure/mcp/index.d.ts.map +1 -0
- package/dist/infrastructure/mcp/index.js +4 -0
- package/dist/infrastructure/mcp/index.js.map +1 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +35 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +228 -0
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +12 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +101 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +74 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +208 -0
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -0
- package/dist/infrastructure/persistence/index.d.ts +4 -0
- package/dist/infrastructure/persistence/index.d.ts.map +1 -0
- package/dist/infrastructure/persistence/index.js +4 -0
- package/dist/infrastructure/persistence/index.js.map +1 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +34 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js +116 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -0
- package/dist/infrastructure/render/index.d.ts +2 -0
- package/dist/infrastructure/render/index.d.ts.map +1 -0
- package/dist/infrastructure/render/index.js +2 -0
- package/dist/infrastructure/render/index.js.map +1 -0
- package/dist/runtime.d.ts +132 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +142 -0
- package/dist/runtime.js.map +1 -0
- package/dist/usecase/boot/ValidateBootUseCase.d.ts +57 -0
- package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -0
- package/dist/usecase/boot/ValidateBootUseCase.js +181 -0
- package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -0
- package/dist/usecase/boot/index.d.ts +2 -0
- package/dist/usecase/boot/index.d.ts.map +1 -0
- package/dist/usecase/boot/index.js +2 -0
- package/dist/usecase/boot/index.js.map +1 -0
- package/dist/usecase/content/ArchiveUseCase.d.ts +20 -0
- package/dist/usecase/content/ArchiveUseCase.d.ts.map +1 -0
- package/dist/usecase/content/ArchiveUseCase.js +47 -0
- package/dist/usecase/content/ArchiveUseCase.js.map +1 -0
- package/dist/usecase/content/ContentPublishEffects.d.ts +11 -0
- package/dist/usecase/content/ContentPublishEffects.d.ts.map +1 -0
- package/dist/usecase/content/ContentPublishEffects.js +21 -0
- package/dist/usecase/content/ContentPublishEffects.js.map +1 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts +22 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -0
- package/dist/usecase/content/CreateDraftUseCase.js +61 -0
- package/dist/usecase/content/CreateDraftUseCase.js.map +1 -0
- package/dist/usecase/content/DeleteEntryUseCase.d.ts +20 -0
- package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -0
- package/dist/usecase/content/DeleteEntryUseCase.js +34 -0
- package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -0
- package/dist/usecase/content/GetEntryUseCase.d.ts +13 -0
- package/dist/usecase/content/GetEntryUseCase.d.ts.map +1 -0
- package/dist/usecase/content/GetEntryUseCase.js +24 -0
- package/dist/usecase/content/GetEntryUseCase.js.map +1 -0
- package/dist/usecase/content/ListEntriesUseCase.d.ts +39 -0
- package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -0
- package/dist/usecase/content/ListEntriesUseCase.js +58 -0
- package/dist/usecase/content/ListEntriesUseCase.js.map +1 -0
- package/dist/usecase/content/RequestPublishUseCase.d.ts +30 -0
- package/dist/usecase/content/RequestPublishUseCase.d.ts.map +1 -0
- package/dist/usecase/content/RequestPublishUseCase.js +111 -0
- package/dist/usecase/content/RequestPublishUseCase.js.map +1 -0
- package/dist/usecase/content/UnpublishUseCase.d.ts +19 -0
- package/dist/usecase/content/UnpublishUseCase.d.ts.map +1 -0
- package/dist/usecase/content/UnpublishUseCase.js +46 -0
- package/dist/usecase/content/UnpublishUseCase.js.map +1 -0
- package/dist/usecase/content/UpdateDraftUseCase.d.ts +20 -0
- package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -0
- package/dist/usecase/content/UpdateDraftUseCase.js +86 -0
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -0
- package/dist/usecase/content/diagnostics.d.ts +26 -0
- package/dist/usecase/content/diagnostics.d.ts.map +1 -0
- package/dist/usecase/content/diagnostics.js +100 -0
- package/dist/usecase/content/diagnostics.js.map +1 -0
- package/dist/usecase/content/index.d.ts +15 -0
- package/dist/usecase/content/index.d.ts.map +1 -0
- package/dist/usecase/content/index.js +15 -0
- package/dist/usecase/content/index.js.map +1 -0
- package/dist/usecase/dto/content/index.d.ts +73 -0
- package/dist/usecase/dto/content/index.d.ts.map +1 -0
- package/dist/usecase/dto/content/index.js +2 -0
- package/dist/usecase/dto/content/index.js.map +1 -0
- package/dist/usecase/dto/index.d.ts +13 -0
- package/dist/usecase/dto/index.d.ts.map +1 -0
- package/dist/usecase/dto/index.js +13 -0
- package/dist/usecase/dto/index.js.map +1 -0
- package/dist/usecase/dto/lifecycle/index.d.ts +15 -0
- package/dist/usecase/dto/lifecycle/index.d.ts.map +1 -0
- package/dist/usecase/dto/lifecycle/index.js +2 -0
- package/dist/usecase/dto/lifecycle/index.js.map +1 -0
- package/dist/usecase/dto/media/index.d.ts +32 -0
- package/dist/usecase/dto/media/index.d.ts.map +1 -0
- package/dist/usecase/dto/media/index.js +8 -0
- package/dist/usecase/dto/media/index.js.map +1 -0
- package/dist/usecase/dto/procedure/index.d.ts +37 -0
- package/dist/usecase/dto/procedure/index.d.ts.map +1 -0
- package/dist/usecase/dto/procedure/index.js +2 -0
- package/dist/usecase/dto/procedure/index.js.map +1 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts +14 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js +2 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js.map +1 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts +8 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js +2 -0
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js.map +1 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts +11 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.js +2 -0
- package/dist/usecase/dto/render/ComposeSitemapRequest.js.map +1 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +27 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.js +2 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.js.map +1 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +17 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.js +2 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.js.map +1 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts +11 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts.map +1 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.js +2 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.js.map +1 -0
- package/dist/usecase/dto/render/index.d.ts +7 -0
- package/dist/usecase/dto/render/index.d.ts.map +1 -0
- package/dist/usecase/dto/render/index.js +7 -0
- package/dist/usecase/dto/render/index.js.map +1 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts +16 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts.map +1 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.js +2 -0
- package/dist/usecase/dto/view/ExecuteViewRequest.js.map +1 -0
- package/dist/usecase/dto/view/index.d.ts +2 -0
- package/dist/usecase/dto/view/index.d.ts.map +1 -0
- package/dist/usecase/dto/view/index.js +2 -0
- package/dist/usecase/dto/view/index.js.map +1 -0
- package/dist/usecase/index.d.ts +16 -0
- package/dist/usecase/index.d.ts.map +1 -0
- package/dist/usecase/index.js +16 -0
- package/dist/usecase/index.js.map +1 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts +26 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts.map +1 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.js +44 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.js.map +1 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts +38 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts.map +1 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js +67 -0
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js.map +1 -0
- package/dist/usecase/lifecycle/index.d.ts +3 -0
- package/dist/usecase/lifecycle/index.d.ts.map +1 -0
- package/dist/usecase/lifecycle/index.js +3 -0
- package/dist/usecase/lifecycle/index.js.map +1 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.d.ts +15 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.d.ts.map +1 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.js +43 -0
- package/dist/usecase/media/CommitMediaUploadUseCase.js.map +1 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts +18 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.js +71 -0
- package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -0
- package/dist/usecase/media/PendingUploadRecord.d.ts +17 -0
- package/dist/usecase/media/PendingUploadRecord.d.ts.map +1 -0
- package/dist/usecase/media/PendingUploadRecord.js +2 -0
- package/dist/usecase/media/PendingUploadRecord.js.map +1 -0
- package/dist/usecase/media/diagnostics.d.ts +15 -0
- package/dist/usecase/media/diagnostics.d.ts.map +1 -0
- package/dist/usecase/media/diagnostics.js +88 -0
- package/dist/usecase/media/diagnostics.js.map +1 -0
- package/dist/usecase/media/index.d.ts +4 -0
- package/dist/usecase/media/index.d.ts.map +1 -0
- package/dist/usecase/media/index.js +4 -0
- package/dist/usecase/media/index.js.map +1 -0
- package/dist/usecase/media/mediaAllowlist.d.ts +30 -0
- package/dist/usecase/media/mediaAllowlist.d.ts.map +1 -0
- package/dist/usecase/media/mediaAllowlist.js +53 -0
- package/dist/usecase/media/mediaAllowlist.js.map +1 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts +43 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js +202 -0
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +50 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.js +191 -0
- package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -0
- package/dist/usecase/procedure/index.d.ts +3 -0
- package/dist/usecase/procedure/index.d.ts.map +1 -0
- package/dist/usecase/procedure/index.js +3 -0
- package/dist/usecase/procedure/index.js.map +1 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +25 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +55 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +19 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +1 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js +40 -0
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +1 -0
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts +15 -0
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +1 -0
- package/dist/usecase/render/ComposeSitemapUseCase.js +29 -0
- package/dist/usecase/render/ComposeSitemapUseCase.js.map +1 -0
- package/dist/usecase/render/PreviewEntryUseCase.d.ts +26 -0
- package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -0
- package/dist/usecase/render/PreviewEntryUseCase.js +69 -0
- package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +35 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.js +59 -0
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -0
- package/dist/usecase/render/RenderListLiveUseCase.d.ts +23 -0
- package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -0
- package/dist/usecase/render/RenderListLiveUseCase.js +41 -0
- package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -0
- package/dist/usecase/render/index.d.ts +7 -0
- package/dist/usecase/render/index.d.ts.map +1 -0
- package/dist/usecase/render/index.js +10 -0
- package/dist/usecase/render/index.js.map +1 -0
- package/dist/usecase/view/ExecuteViewUseCase.d.ts +31 -0
- package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -0
- package/dist/usecase/view/ExecuteViewUseCase.js +78 -0
- package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -0
- package/dist/usecase/view/index.d.ts +2 -0
- package/dist/usecase/view/index.d.ts.map +1 -0
- package/dist/usecase/view/index.js +2 -0
- package/dist/usecase/view/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlRenderer.js","sourceRoot":"","sources":["../../../src/domain/service/HtmlRenderer.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAgB1C;qDACqD;AACrD,MAAM,UAAU,eAAe,CAAC,IAAqB;IACnD,MAAM,GAAG,GAA8B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CACpE,IAAI,CAAC,KAAK,CAAC,UAAU,CACtB,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CACL,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;QACjC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAC3D,CAAC;AACJ,CAAC;AAYD;mCACmC;AACnC,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,MAAM,GAAG,GAA6B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CACL,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;QACjC,GAAG,CAAC;YACF,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { toUrlLocale, type SiteConfig, type SiteDefaults } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* Locale + SiteConfig helpers used at request entry by every public
|
|
4
|
+
* router. Pure functions on existing spec types — no I/O, no env.
|
|
5
|
+
*
|
|
6
|
+
* - `siteConfigFromDefaults` materializes a runtime `SiteConfig`
|
|
7
|
+
* from a consumer's `SiteDefaults` (the author-time declaration).
|
|
8
|
+
* Fills `canonicalLocale` from `locales[0]`, defaults missing
|
|
9
|
+
* fields to empty string. Adapters that don't go through the
|
|
10
|
+
* DB-backed `SiteConfigRepository` use this.
|
|
11
|
+
*
|
|
12
|
+
* - `inferLocaleFromPath` reads the first URL path segment, matches
|
|
13
|
+
* it case-insensitively against `site.locales`, and returns the
|
|
14
|
+
* canonical locale (preserving the casing in `site.locales`) on
|
|
15
|
+
* hit. On miss, returns `site.canonicalLocale` (or `"en"` if the
|
|
16
|
+
* site has no locales configured — should never happen for a
|
|
17
|
+
* localized site).
|
|
18
|
+
*
|
|
19
|
+
* - `isKnownLocale` answers "is this URL segment a valid locale for
|
|
20
|
+
* this site?" for adapters that need to 404 vs render-locale-home.
|
|
21
|
+
*/
|
|
22
|
+
export declare function siteConfigFromDefaults(defaults: SiteDefaults): SiteConfig;
|
|
23
|
+
export declare function inferLocaleFromPath(path: string, site: SiteConfig): string;
|
|
24
|
+
export declare function isKnownLocale(locale: string, site: SiteConfig): boolean;
|
|
25
|
+
/** Canonical → URL form mirror of spec's `toUrlLocale`, re-exported
|
|
26
|
+
* here so adapters can import locale helpers from one runtime path
|
|
27
|
+
* without reaching into spec's domain. */
|
|
28
|
+
export { toUrlLocale };
|
|
29
|
+
//# sourceMappingURL=LocaleNegotiator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocaleNegotiator.d.ts","sourceRoot":"","sources":["../../../src/domain/service/LocaleNegotiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,CAYzE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAa1E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAKvE;AAED;;2CAE2C;AAC3C,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { URL_LOCALE, toUrlLocale, } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* Locale + SiteConfig helpers used at request entry by every public
|
|
4
|
+
* router. Pure functions on existing spec types — no I/O, no env.
|
|
5
|
+
*
|
|
6
|
+
* - `siteConfigFromDefaults` materializes a runtime `SiteConfig`
|
|
7
|
+
* from a consumer's `SiteDefaults` (the author-time declaration).
|
|
8
|
+
* Fills `canonicalLocale` from `locales[0]`, defaults missing
|
|
9
|
+
* fields to empty string. Adapters that don't go through the
|
|
10
|
+
* DB-backed `SiteConfigRepository` use this.
|
|
11
|
+
*
|
|
12
|
+
* - `inferLocaleFromPath` reads the first URL path segment, matches
|
|
13
|
+
* it case-insensitively against `site.locales`, and returns the
|
|
14
|
+
* canonical locale (preserving the casing in `site.locales`) on
|
|
15
|
+
* hit. On miss, returns `site.canonicalLocale` (or `"en"` if the
|
|
16
|
+
* site has no locales configured — should never happen for a
|
|
17
|
+
* localized site).
|
|
18
|
+
*
|
|
19
|
+
* - `isKnownLocale` answers "is this URL segment a valid locale for
|
|
20
|
+
* this site?" for adapters that need to 404 vs render-locale-home.
|
|
21
|
+
*/
|
|
22
|
+
export function siteConfigFromDefaults(defaults) {
|
|
23
|
+
const locales = [...(defaults.locales ?? [])];
|
|
24
|
+
return {
|
|
25
|
+
brand: defaults.brand ?? "",
|
|
26
|
+
title: defaults.title ?? defaults.brand ?? "",
|
|
27
|
+
description: defaults.description ?? "",
|
|
28
|
+
origin: defaults.origin ?? "",
|
|
29
|
+
locales,
|
|
30
|
+
canonicalLocale: locales[0] ?? null,
|
|
31
|
+
faviconUrl: defaults.faviconUrl,
|
|
32
|
+
media: { purposes: [...(defaults.media?.purposes ?? [])] },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function inferLocaleFromPath(path, site) {
|
|
36
|
+
const seg = path.split("/")[1] ?? "";
|
|
37
|
+
// URL_LOCALE rejects anything that doesn't fit `xx` / `xx-yy` (lowercase
|
|
38
|
+
// only), matching what the public router actually serves — so a
|
|
39
|
+
// request for `/llms.txt` doesn't accidentally tag itself with locale
|
|
40
|
+
// "llms.txt" even before the `site.locales` membership check.
|
|
41
|
+
if (seg && URL_LOCALE.test(seg.toLowerCase())) {
|
|
42
|
+
const segLower = seg.toLowerCase();
|
|
43
|
+
for (const l of site.locales) {
|
|
44
|
+
if (toUrlLocale(l) === segLower)
|
|
45
|
+
return l;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return site.canonicalLocale ?? site.locales[0] ?? "en";
|
|
49
|
+
}
|
|
50
|
+
export function isKnownLocale(locale, site) {
|
|
51
|
+
if (!locale)
|
|
52
|
+
return false;
|
|
53
|
+
const target = locale.toLowerCase();
|
|
54
|
+
if (!URL_LOCALE.test(target))
|
|
55
|
+
return false;
|
|
56
|
+
return site.locales.some((l) => toUrlLocale(l) === target);
|
|
57
|
+
}
|
|
58
|
+
/** Canonical → URL form mirror of spec's `toUrlLocale`, re-exported
|
|
59
|
+
* here so adapters can import locale helpers from one runtime path
|
|
60
|
+
* without reaching into spec's domain. */
|
|
61
|
+
export { toUrlLocale };
|
|
62
|
+
//# sourceMappingURL=LocaleNegotiator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocaleNegotiator.js","sourceRoot":"","sources":["../../../src/domain/service/LocaleNegotiator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,GAGZ,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;QACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;QAC7B,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;QACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAE;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAgB;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,yEAAyE;IACzE,gEAAgE;IAChE,sEAAsE;IACtE,8DAA8D;IAC9D,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAgB;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED;;2CAE2C;AAC3C,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* Built-in markdown serializer. Fixed format, applied to every entry
|
|
4
|
+
* whose Schema produces a `content` field. Intentionally not user-
|
|
5
|
+
* customizable — agents that consume `.md` mirrors and `/llms.txt`
|
|
6
|
+
* benefit from a predictable site-wide shape.
|
|
7
|
+
*
|
|
8
|
+
* ---
|
|
9
|
+
* title: ...
|
|
10
|
+
* description: ...
|
|
11
|
+
* slug: ...
|
|
12
|
+
* locale: ...
|
|
13
|
+
* publishedAt: ...
|
|
14
|
+
* ---
|
|
15
|
+
*
|
|
16
|
+
* # <title>
|
|
17
|
+
*
|
|
18
|
+
* > <description>
|
|
19
|
+
*
|
|
20
|
+
* <content>
|
|
21
|
+
*
|
|
22
|
+
* Entries without a `content` (or `body`) field skip the `.md`
|
|
23
|
+
* mirror — see `getMarkdownBody` below for the dual-field rule.
|
|
24
|
+
*
|
|
25
|
+
* Pure transformation — no I/O. Lives in `domain/service/`.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* The canonical markdown source field. Spec-preferred name is
|
|
29
|
+
* `content`; the reference starter (and likely consumers cribbing
|
|
30
|
+
* from it) declares `body`. Both are markdown text under the hood;
|
|
31
|
+
* accept either everywhere a markdown payload is read so consumers
|
|
32
|
+
* don't have to choose. Single predicate so `serializeEntryAsMarkdown`,
|
|
33
|
+
* `serializeLlmsTxt`, and the article-signal heuristic stay in sync.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getMarkdownBody(entry: Entry): string | null;
|
|
36
|
+
export declare function hasMarkdownBody(entry: Entry): boolean;
|
|
37
|
+
export declare function serializeEntryAsMarkdown(entry: Entry): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Per-locale `/llms.txt` index. One section per collection, one bullet
|
|
40
|
+
* per entry. The shape follows the llms.txt convention (Howard, 2024-11)
|
|
41
|
+
* so agent consumers can rely on a stable structure.
|
|
42
|
+
*/
|
|
43
|
+
export declare function serializeLlmsTxt(args: {
|
|
44
|
+
readonly site: SiteConfig;
|
|
45
|
+
readonly locale: string;
|
|
46
|
+
readonly entriesByCollection: ReadonlyMap<string, readonly Entry[]>;
|
|
47
|
+
}): string;
|
|
48
|
+
//# sourceMappingURL=MarkdownSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownSerializer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/MarkdownSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAK3D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAErD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAsBpE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;CACrE,GAAG,MAAM,CAsBT"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { absoluteUrl, appendMarkdownExt } from "./AbsoluteUrl.js";
|
|
2
|
+
/**
|
|
3
|
+
* Built-in markdown serializer. Fixed format, applied to every entry
|
|
4
|
+
* whose Schema produces a `content` field. Intentionally not user-
|
|
5
|
+
* customizable — agents that consume `.md` mirrors and `/llms.txt`
|
|
6
|
+
* benefit from a predictable site-wide shape.
|
|
7
|
+
*
|
|
8
|
+
* ---
|
|
9
|
+
* title: ...
|
|
10
|
+
* description: ...
|
|
11
|
+
* slug: ...
|
|
12
|
+
* locale: ...
|
|
13
|
+
* publishedAt: ...
|
|
14
|
+
* ---
|
|
15
|
+
*
|
|
16
|
+
* # <title>
|
|
17
|
+
*
|
|
18
|
+
* > <description>
|
|
19
|
+
*
|
|
20
|
+
* <content>
|
|
21
|
+
*
|
|
22
|
+
* Entries without a `content` (or `body`) field skip the `.md`
|
|
23
|
+
* mirror — see `getMarkdownBody` below for the dual-field rule.
|
|
24
|
+
*
|
|
25
|
+
* Pure transformation — no I/O. Lives in `domain/service/`.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* The canonical markdown source field. Spec-preferred name is
|
|
29
|
+
* `content`; the reference starter (and likely consumers cribbing
|
|
30
|
+
* from it) declares `body`. Both are markdown text under the hood;
|
|
31
|
+
* accept either everywhere a markdown payload is read so consumers
|
|
32
|
+
* don't have to choose. Single predicate so `serializeEntryAsMarkdown`,
|
|
33
|
+
* `serializeLlmsTxt`, and the article-signal heuristic stay in sync.
|
|
34
|
+
*/
|
|
35
|
+
export function getMarkdownBody(entry) {
|
|
36
|
+
const data = entry.data;
|
|
37
|
+
if (typeof data["content"] === "string")
|
|
38
|
+
return data["content"];
|
|
39
|
+
if (typeof data["body"] === "string")
|
|
40
|
+
return data["body"];
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
export function hasMarkdownBody(entry) {
|
|
44
|
+
return getMarkdownBody(entry) !== null;
|
|
45
|
+
}
|
|
46
|
+
export function serializeEntryAsMarkdown(entry) {
|
|
47
|
+
const data = entry.data;
|
|
48
|
+
const content = getMarkdownBody(entry);
|
|
49
|
+
if (content == null)
|
|
50
|
+
return null;
|
|
51
|
+
const fm = [];
|
|
52
|
+
for (const k of ["title", "description", "slug", "locale", "publishedAt"]) {
|
|
53
|
+
const v = k === "locale" ? entry.locale : data[k];
|
|
54
|
+
if (typeof v === "string" && v.length > 0)
|
|
55
|
+
fm.push([k, v]);
|
|
56
|
+
}
|
|
57
|
+
const title = data["title"] ?? entry.id;
|
|
58
|
+
const description = data["description"];
|
|
59
|
+
let out = "---\n";
|
|
60
|
+
for (const [k, v] of fm)
|
|
61
|
+
out += `${k}: ${yamlScalar(v)}\n`;
|
|
62
|
+
out += "---\n\n";
|
|
63
|
+
out += `# ${title}\n\n`;
|
|
64
|
+
if (description)
|
|
65
|
+
out += `> ${description}\n\n`;
|
|
66
|
+
out += content;
|
|
67
|
+
if (!content.endsWith("\n"))
|
|
68
|
+
out += "\n";
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Per-locale `/llms.txt` index. One section per collection, one bullet
|
|
73
|
+
* per entry. The shape follows the llms.txt convention (Howard, 2024-11)
|
|
74
|
+
* so agent consumers can rely on a stable structure.
|
|
75
|
+
*/
|
|
76
|
+
export function serializeLlmsTxt(args) {
|
|
77
|
+
const { site, locale, entriesByCollection } = args;
|
|
78
|
+
const urlLocale = locale.toLowerCase();
|
|
79
|
+
let out = `# ${site.title}\n\n`;
|
|
80
|
+
if (site.description)
|
|
81
|
+
out += `> ${site.description}\n\n`;
|
|
82
|
+
if (locale)
|
|
83
|
+
out += `Locale: ${locale}\n\n`;
|
|
84
|
+
for (const [collection, entries] of entriesByCollection) {
|
|
85
|
+
if (entries.length === 0)
|
|
86
|
+
continue;
|
|
87
|
+
out += `## ${collection}\n\n`;
|
|
88
|
+
for (const e of entries) {
|
|
89
|
+
if (!hasMarkdownBody(e))
|
|
90
|
+
continue;
|
|
91
|
+
const data = e.data;
|
|
92
|
+
const title = data["title"] ?? e.id;
|
|
93
|
+
const slug = data["slug"] ?? e.id;
|
|
94
|
+
const desc = data["description"] ?? "";
|
|
95
|
+
const localePrefix = urlLocale ? `/${urlLocale}` : "";
|
|
96
|
+
const url = appendMarkdownExt(absoluteUrl(site.origin, `${localePrefix}/${collection}/${slug}`));
|
|
97
|
+
out += desc ? `- [${title}](${url}): ${desc}\n` : `- [${title}](${url})\n`;
|
|
98
|
+
}
|
|
99
|
+
out += "\n";
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
function yamlScalar(s) {
|
|
104
|
+
if (/^[A-Za-z0-9._/-][\w. /:-]*$/.test(s) && !/^(true|false|null|yes|no|on|off)$/i.test(s)) {
|
|
105
|
+
return s;
|
|
106
|
+
}
|
|
107
|
+
return JSON.stringify(s);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=MarkdownSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../../src/domain/service/MarkdownSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Schema.metadata.name` → MCP per-collection tool name suffix.
|
|
3
|
+
* Lowercase + `kebab-` → `_snake`. Pure naming convention; the MCP
|
|
4
|
+
* tool catalog factory and the boot collision check both reference
|
|
5
|
+
* this so the rule lives in exactly one place.
|
|
6
|
+
*
|
|
7
|
+
* Lives in `domain/service/` (not `infrastructure/mcp/`) so the boot
|
|
8
|
+
* use case can call it without violating the usecase→infrastructure
|
|
9
|
+
* import rule.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mcpToolNameSegment(collection: string): string;
|
|
12
|
+
//# sourceMappingURL=McpToolNaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpToolNaming.d.ts","sourceRoot":"","sources":["../../../src/domain/service/McpToolNaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Schema.metadata.name` → MCP per-collection tool name suffix.
|
|
3
|
+
* Lowercase + `kebab-` → `_snake`. Pure naming convention; the MCP
|
|
4
|
+
* tool catalog factory and the boot collision check both reference
|
|
5
|
+
* this so the rule lives in exactly one place.
|
|
6
|
+
*
|
|
7
|
+
* Lives in `domain/service/` (not `infrastructure/mcp/`) so the boot
|
|
8
|
+
* use case can call it without violating the usecase→infrastructure
|
|
9
|
+
* import rule.
|
|
10
|
+
*/
|
|
11
|
+
export function mcpToolNameSegment(collection) {
|
|
12
|
+
return collection.toLowerCase().replace(/-/g, "_");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=McpToolNaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpToolNaming.js","sourceRoot":"","sources":["../../../src/domain/service/McpToolNaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination clamps shared by the View REST surface (ADR-0012) and
|
|
3
|
+
* `ListEntriesUseCase`. Pure functions; no I/O.
|
|
4
|
+
*
|
|
5
|
+
* Defaults / cap are runtime-internal — manifests don't see them.
|
|
6
|
+
* `MAX_LIMIT` is the upper bound on what any caller can ask for in a
|
|
7
|
+
* single round-trip; `View.spec.limit` may further narrow this on a
|
|
8
|
+
* per-View basis (`clampShow` honours both).
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_LIMIT = 50;
|
|
11
|
+
export declare const MAX_LIMIT = 500;
|
|
12
|
+
export declare function clampLimit(limit: number | undefined): number;
|
|
13
|
+
export declare function clampShow(show: number | undefined, viewLimit: number | undefined): number;
|
|
14
|
+
export declare function clampPage(page: number | undefined): number;
|
|
15
|
+
//# sourceMappingURL=Pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/domain/service/Pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,SAAS,MAAM,CAAC;AAE7B,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK5D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIzF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG1D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination clamps shared by the View REST surface (ADR-0012) and
|
|
3
|
+
* `ListEntriesUseCase`. Pure functions; no I/O.
|
|
4
|
+
*
|
|
5
|
+
* Defaults / cap are runtime-internal — manifests don't see them.
|
|
6
|
+
* `MAX_LIMIT` is the upper bound on what any caller can ask for in a
|
|
7
|
+
* single round-trip; `View.spec.limit` may further narrow this on a
|
|
8
|
+
* per-View basis (`clampShow` honours both).
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_LIMIT = 50;
|
|
11
|
+
export const MAX_LIMIT = 500;
|
|
12
|
+
export function clampLimit(limit) {
|
|
13
|
+
if (typeof limit !== "number" || !Number.isFinite(limit) || limit <= 0) {
|
|
14
|
+
return DEFAULT_LIMIT;
|
|
15
|
+
}
|
|
16
|
+
return Math.min(Math.floor(limit), MAX_LIMIT);
|
|
17
|
+
}
|
|
18
|
+
export function clampShow(show, viewLimit) {
|
|
19
|
+
const cap = clampLimit(viewLimit);
|
|
20
|
+
if (typeof show !== "number" || !Number.isFinite(show) || show <= 0)
|
|
21
|
+
return cap;
|
|
22
|
+
return Math.min(Math.floor(show), cap);
|
|
23
|
+
}
|
|
24
|
+
export function clampPage(page) {
|
|
25
|
+
if (typeof page !== "number" || !Number.isFinite(page) || page < 1)
|
|
26
|
+
return 1;
|
|
27
|
+
return Math.floor(page);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../src/domain/service/Pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAwB,EAAE,SAA6B;IAC/E,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAChF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAwB;IAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Match a request path against a Trigger path with OpenAPI-style
|
|
3
|
+
* `{param}` segments. Returns the extracted params on a match, or
|
|
4
|
+
* `null` if the segments don't line up.
|
|
5
|
+
*
|
|
6
|
+
* matchPath("/api/contact", "/api/contact") → {}
|
|
7
|
+
* matchPath("/api/posts/{id}", "/api/posts/abc") → { id: "abc" }
|
|
8
|
+
* matchPath("/api/posts/{id}", "/api/posts") → null
|
|
9
|
+
* matchPath("/api/posts", "/api/posts/abc") → null
|
|
10
|
+
*
|
|
11
|
+
* Pure path math — no I/O. Lives in `domain/service/` so adapters
|
|
12
|
+
* (HTTP layer) can call it without dragging an HTTP framework dep.
|
|
13
|
+
*/
|
|
14
|
+
export declare function matchPath(triggerPath: string, requestPath: string): Record<string, string> | null;
|
|
15
|
+
//# sourceMappingURL=PathMatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathMatcher.d.ts","sourceRoot":"","sources":["../../../src/domain/service/PathMatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAwB/B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Match a request path against a Trigger path with OpenAPI-style
|
|
3
|
+
* `{param}` segments. Returns the extracted params on a match, or
|
|
4
|
+
* `null` if the segments don't line up.
|
|
5
|
+
*
|
|
6
|
+
* matchPath("/api/contact", "/api/contact") → {}
|
|
7
|
+
* matchPath("/api/posts/{id}", "/api/posts/abc") → { id: "abc" }
|
|
8
|
+
* matchPath("/api/posts/{id}", "/api/posts") → null
|
|
9
|
+
* matchPath("/api/posts", "/api/posts/abc") → null
|
|
10
|
+
*
|
|
11
|
+
* Pure path math — no I/O. Lives in `domain/service/` so adapters
|
|
12
|
+
* (HTTP layer) can call it without dragging an HTTP framework dep.
|
|
13
|
+
*/
|
|
14
|
+
export function matchPath(triggerPath, requestPath) {
|
|
15
|
+
// `/api/posts` and `/api/posts/` are the same resource; without
|
|
16
|
+
// normalization the trailing-slash side gains an empty segment and
|
|
17
|
+
// segment-count alone defeats the match.
|
|
18
|
+
const tParts = stripTrailingSlash(triggerPath).split("/");
|
|
19
|
+
const rParts = stripTrailingSlash(requestPath).split("/");
|
|
20
|
+
if (tParts.length !== rParts.length)
|
|
21
|
+
return null;
|
|
22
|
+
const params = {};
|
|
23
|
+
for (let i = 0; i < tParts.length; i++) {
|
|
24
|
+
const t = tParts[i];
|
|
25
|
+
const r = rParts[i];
|
|
26
|
+
// decodeURIComponent throws URIError on malformed encoding
|
|
27
|
+
// (e.g. `%GG`); surface as a routing miss, not a 500.
|
|
28
|
+
const decoded = safeDecode(r);
|
|
29
|
+
if (decoded === null)
|
|
30
|
+
return null;
|
|
31
|
+
if (t.startsWith("{") && t.endsWith("}")) {
|
|
32
|
+
params[t.slice(1, -1)] = decoded;
|
|
33
|
+
}
|
|
34
|
+
else if (t !== decoded) {
|
|
35
|
+
// Decode literals too so `/api/by%2Dtag` matches trigger
|
|
36
|
+
// `/api/by-tag` (percent-encoded equivalent of the same byte).
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return params;
|
|
41
|
+
}
|
|
42
|
+
function safeDecode(segment) {
|
|
43
|
+
try {
|
|
44
|
+
return decodeURIComponent(segment);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Preserve root "/" — only strip when length > 1.
|
|
51
|
+
function stripTrailingSlash(p) {
|
|
52
|
+
return p.length > 1 && p.endsWith("/") ? p.slice(0, -1) : p;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=PathMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathMatcher.js","sourceRoot":"","sources":["../../../src/domain/service/PathMatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CACvB,WAAmB,EACnB,WAAmB;IAEnB,gEAAgE;IAChE,mEAAmE;IACnE,yCAAyC;IACzC,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACrB,2DAA2D;QAC3D,sDAAsD;QACtD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACnC,CAAC;aAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;YACzB,yDAAyD;YACzD,+DAA+D;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,SAAS,kBAAkB,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function injectPreviewBanner(html: string, banner: string): string;
|
|
2
|
+
/**
|
|
3
|
+
* Build the SDK's default preview banner markup. Both `status` and
|
|
4
|
+
* `slug` are HTML-escaped — `status` is a closed enum so escaping is
|
|
5
|
+
* defense-in-depth, but `slug` is caller-supplied and a slug
|
|
6
|
+
* containing `<script>` would otherwise inject script into the
|
|
7
|
+
* preview surface.
|
|
8
|
+
*/
|
|
9
|
+
export declare function defaultPreviewBanner(status: string, slug: string): string;
|
|
10
|
+
//# sourceMappingURL=PreviewBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewBanner.d.ts","sourceRoot":"","sources":["../../../src/domain/service/PreviewBanner.ts"],"names":[],"mappings":"AAgBA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inject a preview banner just inside the rendered `<body>`. Used by
|
|
3
|
+
* the request-time `?preview=1` route so authors can see in-progress
|
|
4
|
+
* drafts with a visible "this isn't published" mark.
|
|
5
|
+
*
|
|
6
|
+
* The injection looks for the first `<body...>` opening tag and
|
|
7
|
+
* appends `banner` immediately after it. Documents without a body tag
|
|
8
|
+
* (fragments, partial templates) fall through unchanged — the caller
|
|
9
|
+
* already validated the renderer produced a full HTML document, so a
|
|
10
|
+
* missing body is a contract violation, not user input.
|
|
11
|
+
*
|
|
12
|
+
* Pure string transformation. Lives in `domain/service/` so the
|
|
13
|
+
* regex (and any future DOM-safer replacement) stays in one place.
|
|
14
|
+
*/
|
|
15
|
+
const BODY_OPEN = /<body([^>]*)>/;
|
|
16
|
+
export function injectPreviewBanner(html, banner) {
|
|
17
|
+
return html.replace(BODY_OPEN, `<body$1>${banner}`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build the SDK's default preview banner markup. Both `status` and
|
|
21
|
+
* `slug` are HTML-escaped — `status` is a closed enum so escaping is
|
|
22
|
+
* defense-in-depth, but `slug` is caller-supplied and a slug
|
|
23
|
+
* containing `<script>` would otherwise inject script into the
|
|
24
|
+
* preview surface.
|
|
25
|
+
*/
|
|
26
|
+
export function defaultPreviewBanner(status, slug) {
|
|
27
|
+
return `<div class="preview-banner">Preview · ${escapeHtml(status)} · ${escapeHtml(slug)}</div>`;
|
|
28
|
+
}
|
|
29
|
+
function escapeHtml(s) {
|
|
30
|
+
return s
|
|
31
|
+
.replace(/&/g, "&")
|
|
32
|
+
.replace(/</g, "<")
|
|
33
|
+
.replace(/>/g, ">")
|
|
34
|
+
.replace(/"/g, """)
|
|
35
|
+
.replace(/'/g, "'");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PreviewBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewBanner.js","sourceRoot":"","sources":["../../../src/domain/service/PreviewBanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,MAAc;IAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,IAAY;IAC/D,OAAO,yCAAyC,UAAU,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;AACnG,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type Entry } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a public URL path for an entry, given the consumer's
|
|
4
|
+
* collection→URL configuration. One source of truth for both the
|
|
5
|
+
* router (URL → collection/slug lookup) and outbound URL emission
|
|
6
|
+
* (sitemap, hreflang siblings, SEO canonical).
|
|
7
|
+
*
|
|
8
|
+
* The resolver's `forEntry` returns `null` when:
|
|
9
|
+
* - the entry's collection has no public URL (e.g. parent `posts`
|
|
10
|
+
* surfaces only via `post-translations` children)
|
|
11
|
+
* - the entry has no slug AND no canonical id-based URL pattern is
|
|
12
|
+
* configured for the collection
|
|
13
|
+
*
|
|
14
|
+
* Pure path math — no I/O. Lives in `domain/service/`.
|
|
15
|
+
*/
|
|
16
|
+
export interface CollectionRoute {
|
|
17
|
+
/** URL segment for entries of this collection.
|
|
18
|
+
*
|
|
19
|
+
* - non-empty string: `/{locale}/{segment}/{slug}` (e.g. `posts`)
|
|
20
|
+
* - empty string: `/{locale}/{slug}` (entries directly under locale)
|
|
21
|
+
* - null: collection has no public URL
|
|
22
|
+
*/
|
|
23
|
+
readonly segment: string | null;
|
|
24
|
+
/** When the entry's slug equals this value, collapse the URL to
|
|
25
|
+
* `/{locale}` (no trailing segment + slug). Used for home pages
|
|
26
|
+
* that live in a translations collection. */
|
|
27
|
+
readonly homeSlug?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface PublicPathResolverConfig {
|
|
30
|
+
readonly collectionRoutes: Readonly<Record<string, CollectionRoute>>;
|
|
31
|
+
}
|
|
32
|
+
export interface PublicPathResolver {
|
|
33
|
+
/** Returns `/{locale}/{segment}/{slug}` style path, or `null` if the
|
|
34
|
+
* entry has no public URL under this configuration. */
|
|
35
|
+
forEntry(entry: Entry): string | null;
|
|
36
|
+
/** Returns the configured route for `collection`, or `undefined` if
|
|
37
|
+
* the collection isn't mapped. */
|
|
38
|
+
routeFor(collection: string): CollectionRoute | undefined;
|
|
39
|
+
}
|
|
40
|
+
export declare function createPublicPathResolver(config: PublicPathResolverConfig): PublicPathResolver;
|
|
41
|
+
//# sourceMappingURL=PublicPathResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicPathResolver.d.ts","sourceRoot":"","sources":["../../../src/domain/service/PublicPathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG9D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;kDAE8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,kBAAkB;IACjC;4DACwD;IACxD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC;uCACmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;CAC3D;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,kBAAkB,CAmBpB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { toUrlLocale } from "@aotter/mantle-spec";
|
|
2
|
+
import { entrySlug } from "./PublishKeys.js";
|
|
3
|
+
export function createPublicPathResolver(config) {
|
|
4
|
+
const routes = config.collectionRoutes;
|
|
5
|
+
return {
|
|
6
|
+
forEntry(entry) {
|
|
7
|
+
const route = routes[entry.collection];
|
|
8
|
+
if (!route || route.segment === null)
|
|
9
|
+
return null;
|
|
10
|
+
const slug = entrySlug({ id: entry.id, data: entry.data });
|
|
11
|
+
const locale = entry.locale ? toUrlLocale(entry.locale) : "";
|
|
12
|
+
const localePrefix = locale ? `/${locale}` : "";
|
|
13
|
+
if (route.homeSlug && slug === route.homeSlug) {
|
|
14
|
+
return localePrefix || "/";
|
|
15
|
+
}
|
|
16
|
+
const segment = route.segment;
|
|
17
|
+
return segment ? `${localePrefix}/${segment}/${slug}` : `${localePrefix}/${slug}`;
|
|
18
|
+
},
|
|
19
|
+
routeFor(collection) {
|
|
20
|
+
return routes[collection];
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=PublicPathResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicPathResolver.js","sourceRoot":"","sources":["../../../src/domain/service/PublicPathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA2C7C,MAAM,UAAU,wBAAwB,CACtC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACvC,OAAO;QACL,QAAQ,CAAC,KAAY;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9C,OAAO,YAAY,IAAI,GAAG,CAAC;YAC7B,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,IAAI,EAAE,CAAC;QACpF,CAAC;QACD,QAAQ,CAAC,UAAkB;YACzB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Entry } from "@aotter/mantle-spec";
|
|
2
|
+
/**
|
|
3
|
+
* KV key derivation. Centralised so the publish pipeline (writer) and
|
|
4
|
+
* the public router (reader) agree on one shape; changing the layout
|
|
5
|
+
* is a single-file edit.
|
|
6
|
+
*
|
|
7
|
+
* - `entry:html:{locale}/{collection}/{slug}` — pre-rendered HTML
|
|
8
|
+
* - `entry:md:{locale}/{collection}/{slug}` — markdown mirror
|
|
9
|
+
* - `list:html:{locale}/{collection}` — collection index
|
|
10
|
+
* - `llms:{locale}` — /{locale}/llms.txt
|
|
11
|
+
* - `llms:root` — /llms.txt (cross-locale aggregate)
|
|
12
|
+
*
|
|
13
|
+
* Non-localized entries use empty-string locale (`entry:html:/posts/abc`).
|
|
14
|
+
* The root /llms.txt uses the explicit `:root` suffix instead of an
|
|
15
|
+
* empty one because `wrangler kv bulk put` silently drops keys ending
|
|
16
|
+
* in `:` (caught in CI on commit 93c10ef).
|
|
17
|
+
*
|
|
18
|
+
* Pure path math — no I/O. Lives in `domain/service/` so any layer
|
|
19
|
+
* can call it without dragging an adapter dep.
|
|
20
|
+
*/
|
|
21
|
+
export declare function entrySlug(entry: {
|
|
22
|
+
id: string;
|
|
23
|
+
data: Record<string, unknown>;
|
|
24
|
+
}): string;
|
|
25
|
+
export declare function entryHtmlKey(entry: Entry): string;
|
|
26
|
+
export declare function entryMarkdownKey(entry: Entry): string;
|
|
27
|
+
export declare function listHtmlKey(collection: string, locale: string): string;
|
|
28
|
+
export declare function llmsTxtKey(locale: string): string;
|
|
29
|
+
export declare function entryPublicPath(entry: Entry): string;
|
|
30
|
+
/**
|
|
31
|
+
* Build the entry HTML key from URL-side parts. The router has the
|
|
32
|
+
* (collection, locale, slug) tuple from path params; reconstructing
|
|
33
|
+
* a partial `Entry` just to call `entryHtmlKey` is bug-bait. Use
|
|
34
|
+
* this helper instead.
|
|
35
|
+
*
|
|
36
|
+
* Pass `locale = ""` for non-localized entries (matches publish
|
|
37
|
+
* pipeline semantic where non-localized entries write to
|
|
38
|
+
* `entry:html:/{collection}/{slug}`).
|
|
39
|
+
*/
|
|
40
|
+
export declare function entryHtmlKeyFromParts(collection: string, locale: string, slug: string): string;
|
|
41
|
+
export declare function entryMarkdownKeyFromParts(collection: string, locale: string, slug: string): string;
|
|
42
|
+
//# sourceMappingURL=PublishKeys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublishKeys.d.ts","sourceRoot":"","sources":["../../../src/domain/service/PublishKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,MAAM,CAMtF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAIjD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAIrD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAIpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,MAAM,CAGR;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,MAAM,CAGR"}
|