@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.
Files changed (439) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +14 -0
  3. package/dist/domain/index.d.ts +4 -0
  4. package/dist/domain/index.d.ts.map +1 -0
  5. package/dist/domain/index.js +4 -0
  6. package/dist/domain/index.js.map +1 -0
  7. package/dist/domain/model/EntryRow.d.ts +59 -0
  8. package/dist/domain/model/EntryRow.d.ts.map +1 -0
  9. package/dist/domain/model/EntryRow.js +42 -0
  10. package/dist/domain/model/EntryRow.js.map +1 -0
  11. package/dist/domain/model/HandlerContext.d.ts +65 -0
  12. package/dist/domain/model/HandlerContext.d.ts.map +1 -0
  13. package/dist/domain/model/HandlerContext.js +2 -0
  14. package/dist/domain/model/HandlerContext.js.map +1 -0
  15. package/dist/domain/model/SeoMeta.d.ts +49 -0
  16. package/dist/domain/model/SeoMeta.d.ts.map +1 -0
  17. package/dist/domain/model/SeoMeta.js +2 -0
  18. package/dist/domain/model/SeoMeta.js.map +1 -0
  19. package/dist/domain/model/TemplateRegistry.d.ts +47 -0
  20. package/dist/domain/model/TemplateRegistry.d.ts.map +1 -0
  21. package/dist/domain/model/TemplateRegistry.js +17 -0
  22. package/dist/domain/model/TemplateRegistry.js.map +1 -0
  23. package/dist/domain/model/index.d.ts +7 -0
  24. package/dist/domain/model/index.d.ts.map +1 -0
  25. package/dist/domain/model/index.js +6 -0
  26. package/dist/domain/model/index.js.map +1 -0
  27. package/dist/domain/port/AssetServer.d.ts +21 -0
  28. package/dist/domain/port/AssetServer.d.ts.map +1 -0
  29. package/dist/domain/port/AssetServer.js +2 -0
  30. package/dist/domain/port/AssetServer.js.map +1 -0
  31. package/dist/domain/port/Clock.d.ts +13 -0
  32. package/dist/domain/port/Clock.d.ts.map +1 -0
  33. package/dist/domain/port/Clock.js +2 -0
  34. package/dist/domain/port/Clock.js.map +1 -0
  35. package/dist/domain/port/DatabaseDriver.d.ts +91 -0
  36. package/dist/domain/port/DatabaseDriver.d.ts.map +1 -0
  37. package/dist/domain/port/DatabaseDriver.js +2 -0
  38. package/dist/domain/port/DatabaseDriver.js.map +1 -0
  39. package/dist/domain/port/DeferredHookDispatcher.d.ts +55 -0
  40. package/dist/domain/port/DeferredHookDispatcher.d.ts.map +1 -0
  41. package/dist/domain/port/DeferredHookDispatcher.js +16 -0
  42. package/dist/domain/port/DeferredHookDispatcher.js.map +1 -0
  43. package/dist/domain/port/EmailSender.d.ts +31 -0
  44. package/dist/domain/port/EmailSender.d.ts.map +1 -0
  45. package/dist/domain/port/EmailSender.js +2 -0
  46. package/dist/domain/port/EmailSender.js.map +1 -0
  47. package/dist/domain/port/EntryRepository.d.ts +132 -0
  48. package/dist/domain/port/EntryRepository.d.ts.map +1 -0
  49. package/dist/domain/port/EntryRepository.js +2 -0
  50. package/dist/domain/port/EntryRepository.js.map +1 -0
  51. package/dist/domain/port/HandlerRegistry.d.ts +38 -0
  52. package/dist/domain/port/HandlerRegistry.d.ts.map +1 -0
  53. package/dist/domain/port/HandlerRegistry.js +27 -0
  54. package/dist/domain/port/HandlerRegistry.js.map +1 -0
  55. package/dist/domain/port/IdGenerator.d.ts +28 -0
  56. package/dist/domain/port/IdGenerator.d.ts.map +1 -0
  57. package/dist/domain/port/IdGenerator.js +5 -0
  58. package/dist/domain/port/IdGenerator.js.map +1 -0
  59. package/dist/domain/port/KvCache.d.ts +34 -0
  60. package/dist/domain/port/KvCache.d.ts.map +1 -0
  61. package/dist/domain/port/KvCache.js +2 -0
  62. package/dist/domain/port/KvCache.js.map +1 -0
  63. package/dist/domain/port/LifecycleHookRunner.d.ts +41 -0
  64. package/dist/domain/port/LifecycleHookRunner.d.ts.map +1 -0
  65. package/dist/domain/port/LifecycleHookRunner.js +2 -0
  66. package/dist/domain/port/LifecycleHookRunner.js.map +1 -0
  67. package/dist/domain/port/MediaStorage.d.ts +102 -0
  68. package/dist/domain/port/MediaStorage.d.ts.map +1 -0
  69. package/dist/domain/port/MediaStorage.js +2 -0
  70. package/dist/domain/port/MediaStorage.js.map +1 -0
  71. package/dist/domain/port/PublishOrchestrator.d.ts +25 -0
  72. package/dist/domain/port/PublishOrchestrator.d.ts.map +1 -0
  73. package/dist/domain/port/PublishOrchestrator.js +2 -0
  74. package/dist/domain/port/PublishOrchestrator.js.map +1 -0
  75. package/dist/domain/port/SiteConfigRepository.d.ts +27 -0
  76. package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -0
  77. package/dist/domain/port/SiteConfigRepository.js +2 -0
  78. package/dist/domain/port/SiteConfigRepository.js.map +1 -0
  79. package/dist/domain/port/index.d.ts +30 -0
  80. package/dist/domain/port/index.d.ts.map +1 -0
  81. package/dist/domain/port/index.js +5 -0
  82. package/dist/domain/port/index.js.map +1 -0
  83. package/dist/domain/service/AbsoluteUrl.d.ts +6 -0
  84. package/dist/domain/service/AbsoluteUrl.d.ts.map +1 -0
  85. package/dist/domain/service/AbsoluteUrl.js +33 -0
  86. package/dist/domain/service/AbsoluteUrl.js.map +1 -0
  87. package/dist/domain/service/AuthPredicateEvaluator.d.ts +29 -0
  88. package/dist/domain/service/AuthPredicateEvaluator.d.ts.map +1 -0
  89. package/dist/domain/service/AuthPredicateEvaluator.js +48 -0
  90. package/dist/domain/service/AuthPredicateEvaluator.js.map +1 -0
  91. package/dist/domain/service/BuiltinProjector.d.ts +50 -0
  92. package/dist/domain/service/BuiltinProjector.d.ts.map +1 -0
  93. package/dist/domain/service/BuiltinProjector.js +61 -0
  94. package/dist/domain/service/BuiltinProjector.js.map +1 -0
  95. package/dist/domain/service/EntrySeoSupport.d.ts +27 -0
  96. package/dist/domain/service/EntrySeoSupport.d.ts.map +1 -0
  97. package/dist/domain/service/EntrySeoSupport.js +13 -0
  98. package/dist/domain/service/EntrySeoSupport.js.map +1 -0
  99. package/dist/domain/service/HtmlRenderer.d.ts +32 -0
  100. package/dist/domain/service/HtmlRenderer.d.ts.map +1 -0
  101. package/dist/domain/service/HtmlRenderer.js +38 -0
  102. package/dist/domain/service/HtmlRenderer.js.map +1 -0
  103. package/dist/domain/service/LocaleNegotiator.d.ts +29 -0
  104. package/dist/domain/service/LocaleNegotiator.d.ts.map +1 -0
  105. package/dist/domain/service/LocaleNegotiator.js +62 -0
  106. package/dist/domain/service/LocaleNegotiator.js.map +1 -0
  107. package/dist/domain/service/MarkdownSerializer.d.ts +48 -0
  108. package/dist/domain/service/MarkdownSerializer.d.ts.map +1 -0
  109. package/dist/domain/service/MarkdownSerializer.js +109 -0
  110. package/dist/domain/service/MarkdownSerializer.js.map +1 -0
  111. package/dist/domain/service/McpToolNaming.d.ts +12 -0
  112. package/dist/domain/service/McpToolNaming.d.ts.map +1 -0
  113. package/dist/domain/service/McpToolNaming.js +14 -0
  114. package/dist/domain/service/McpToolNaming.js.map +1 -0
  115. package/dist/domain/service/Pagination.d.ts +15 -0
  116. package/dist/domain/service/Pagination.d.ts.map +1 -0
  117. package/dist/domain/service/Pagination.js +29 -0
  118. package/dist/domain/service/Pagination.js.map +1 -0
  119. package/dist/domain/service/PathMatcher.d.ts +15 -0
  120. package/dist/domain/service/PathMatcher.d.ts.map +1 -0
  121. package/dist/domain/service/PathMatcher.js +54 -0
  122. package/dist/domain/service/PathMatcher.js.map +1 -0
  123. package/dist/domain/service/PreviewBanner.d.ts +10 -0
  124. package/dist/domain/service/PreviewBanner.d.ts.map +1 -0
  125. package/dist/domain/service/PreviewBanner.js +37 -0
  126. package/dist/domain/service/PreviewBanner.js.map +1 -0
  127. package/dist/domain/service/PublicPathResolver.d.ts +41 -0
  128. package/dist/domain/service/PublicPathResolver.d.ts.map +1 -0
  129. package/dist/domain/service/PublicPathResolver.js +24 -0
  130. package/dist/domain/service/PublicPathResolver.js.map +1 -0
  131. package/dist/domain/service/PublishKeys.d.ts +42 -0
  132. package/dist/domain/service/PublishKeys.d.ts.map +1 -0
  133. package/dist/domain/service/PublishKeys.js +69 -0
  134. package/dist/domain/service/PublishKeys.js.map +1 -0
  135. package/dist/domain/service/SeoMetaComposer.d.ts +47 -0
  136. package/dist/domain/service/SeoMetaComposer.d.ts.map +1 -0
  137. package/dist/domain/service/SeoMetaComposer.js +174 -0
  138. package/dist/domain/service/SeoMetaComposer.js.map +1 -0
  139. package/dist/domain/service/SitemapSerializer.d.ts +19 -0
  140. package/dist/domain/service/SitemapSerializer.d.ts.map +1 -0
  141. package/dist/domain/service/SitemapSerializer.js +27 -0
  142. package/dist/domain/service/SitemapSerializer.js.map +1 -0
  143. package/dist/domain/service/TriggerIndex.d.ts +27 -0
  144. package/dist/domain/service/TriggerIndex.d.ts.map +1 -0
  145. package/dist/domain/service/TriggerIndex.js +52 -0
  146. package/dist/domain/service/TriggerIndex.js.map +1 -0
  147. package/dist/domain/service/ViewParamCoercer.d.ts +20 -0
  148. package/dist/domain/service/ViewParamCoercer.d.ts.map +1 -0
  149. package/dist/domain/service/ViewParamCoercer.js +82 -0
  150. package/dist/domain/service/ViewParamCoercer.js.map +1 -0
  151. package/dist/domain/service/ViewSqlCompiler.d.ts +29 -0
  152. package/dist/domain/service/ViewSqlCompiler.d.ts.map +1 -0
  153. package/dist/domain/service/ViewSqlCompiler.js +147 -0
  154. package/dist/domain/service/ViewSqlCompiler.js.map +1 -0
  155. package/dist/domain/service/index.d.ts +28 -0
  156. package/dist/domain/service/index.d.ts.map +1 -0
  157. package/dist/domain/service/index.js +28 -0
  158. package/dist/domain/service/index.js.map +1 -0
  159. package/dist/domain/service/io/EntryWriteGuard.d.ts +19 -0
  160. package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -0
  161. package/dist/domain/service/io/EntryWriteGuard.js +109 -0
  162. package/dist/domain/service/io/EntryWriteGuard.js.map +1 -0
  163. package/dist/domain/service/io/JoinedEntryReader.d.ts +33 -0
  164. package/dist/domain/service/io/JoinedEntryReader.d.ts.map +1 -0
  165. package/dist/domain/service/io/JoinedEntryReader.js +95 -0
  166. package/dist/domain/service/io/JoinedEntryReader.js.map +1 -0
  167. package/dist/domain/service/io/PublishedEntries.d.ts +69 -0
  168. package/dist/domain/service/io/PublishedEntries.d.ts.map +1 -0
  169. package/dist/domain/service/io/PublishedEntries.js +116 -0
  170. package/dist/domain/service/io/PublishedEntries.js.map +1 -0
  171. package/dist/domain/service/io/index.d.ts +9 -0
  172. package/dist/domain/service/io/index.d.ts.map +1 -0
  173. package/dist/domain/service/io/index.js +9 -0
  174. package/dist/domain/service/io/index.js.map +1 -0
  175. package/dist/index.d.ts +41 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/index.js +45 -0
  178. package/dist/index.js.map +1 -0
  179. package/dist/infrastructure/boot/canonicalMigrations.d.ts +9 -0
  180. package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -0
  181. package/dist/infrastructure/boot/canonicalMigrations.js +162 -0
  182. package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -0
  183. package/dist/infrastructure/boot/index.d.ts +2 -0
  184. package/dist/infrastructure/boot/index.d.ts.map +1 -0
  185. package/dist/infrastructure/boot/index.js +2 -0
  186. package/dist/infrastructure/boot/index.js.map +1 -0
  187. package/dist/infrastructure/http/DiagnosticResponse.d.ts +12 -0
  188. package/dist/infrastructure/http/DiagnosticResponse.d.ts.map +1 -0
  189. package/dist/infrastructure/http/DiagnosticResponse.js +14 -0
  190. package/dist/infrastructure/http/DiagnosticResponse.js.map +1 -0
  191. package/dist/infrastructure/http/index.d.ts +2 -0
  192. package/dist/infrastructure/http/index.d.ts.map +1 -0
  193. package/dist/infrastructure/http/index.js +2 -0
  194. package/dist/infrastructure/http/index.js.map +1 -0
  195. package/dist/infrastructure/index.d.ts +12 -0
  196. package/dist/infrastructure/index.d.ts.map +1 -0
  197. package/dist/infrastructure/index.js +12 -0
  198. package/dist/infrastructure/index.js.map +1 -0
  199. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +60 -0
  200. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -0
  201. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +281 -0
  202. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -0
  203. package/dist/infrastructure/mcp/McpResponses.d.ts +14 -0
  204. package/dist/infrastructure/mcp/McpResponses.d.ts.map +1 -0
  205. package/dist/infrastructure/mcp/McpResponses.js +49 -0
  206. package/dist/infrastructure/mcp/McpResponses.js.map +1 -0
  207. package/dist/infrastructure/mcp/McpToolCatalog.d.ts +68 -0
  208. package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -0
  209. package/dist/infrastructure/mcp/McpToolCatalog.js +231 -0
  210. package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -0
  211. package/dist/infrastructure/mcp/index.d.ts +4 -0
  212. package/dist/infrastructure/mcp/index.d.ts.map +1 -0
  213. package/dist/infrastructure/mcp/index.js +4 -0
  214. package/dist/infrastructure/mcp/index.js.map +1 -0
  215. package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +35 -0
  216. package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -0
  217. package/dist/infrastructure/persistence/DatabaseEntryRepository.js +228 -0
  218. package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -0
  219. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +12 -0
  220. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -0
  221. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +101 -0
  222. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -0
  223. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +74 -0
  224. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -0
  225. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +208 -0
  226. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -0
  227. package/dist/infrastructure/persistence/index.d.ts +4 -0
  228. package/dist/infrastructure/persistence/index.d.ts.map +1 -0
  229. package/dist/infrastructure/persistence/index.js +4 -0
  230. package/dist/infrastructure/persistence/index.js.map +1 -0
  231. package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +34 -0
  232. package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -0
  233. package/dist/infrastructure/render/HtmlPublishOrchestrator.js +116 -0
  234. package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -0
  235. package/dist/infrastructure/render/index.d.ts +2 -0
  236. package/dist/infrastructure/render/index.d.ts.map +1 -0
  237. package/dist/infrastructure/render/index.js +2 -0
  238. package/dist/infrastructure/render/index.js.map +1 -0
  239. package/dist/runtime.d.ts +132 -0
  240. package/dist/runtime.d.ts.map +1 -0
  241. package/dist/runtime.js +142 -0
  242. package/dist/runtime.js.map +1 -0
  243. package/dist/usecase/boot/ValidateBootUseCase.d.ts +57 -0
  244. package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -0
  245. package/dist/usecase/boot/ValidateBootUseCase.js +181 -0
  246. package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -0
  247. package/dist/usecase/boot/index.d.ts +2 -0
  248. package/dist/usecase/boot/index.d.ts.map +1 -0
  249. package/dist/usecase/boot/index.js +2 -0
  250. package/dist/usecase/boot/index.js.map +1 -0
  251. package/dist/usecase/content/ArchiveUseCase.d.ts +20 -0
  252. package/dist/usecase/content/ArchiveUseCase.d.ts.map +1 -0
  253. package/dist/usecase/content/ArchiveUseCase.js +47 -0
  254. package/dist/usecase/content/ArchiveUseCase.js.map +1 -0
  255. package/dist/usecase/content/ContentPublishEffects.d.ts +11 -0
  256. package/dist/usecase/content/ContentPublishEffects.d.ts.map +1 -0
  257. package/dist/usecase/content/ContentPublishEffects.js +21 -0
  258. package/dist/usecase/content/ContentPublishEffects.js.map +1 -0
  259. package/dist/usecase/content/CreateDraftUseCase.d.ts +22 -0
  260. package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -0
  261. package/dist/usecase/content/CreateDraftUseCase.js +61 -0
  262. package/dist/usecase/content/CreateDraftUseCase.js.map +1 -0
  263. package/dist/usecase/content/DeleteEntryUseCase.d.ts +20 -0
  264. package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -0
  265. package/dist/usecase/content/DeleteEntryUseCase.js +34 -0
  266. package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -0
  267. package/dist/usecase/content/GetEntryUseCase.d.ts +13 -0
  268. package/dist/usecase/content/GetEntryUseCase.d.ts.map +1 -0
  269. package/dist/usecase/content/GetEntryUseCase.js +24 -0
  270. package/dist/usecase/content/GetEntryUseCase.js.map +1 -0
  271. package/dist/usecase/content/ListEntriesUseCase.d.ts +39 -0
  272. package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -0
  273. package/dist/usecase/content/ListEntriesUseCase.js +58 -0
  274. package/dist/usecase/content/ListEntriesUseCase.js.map +1 -0
  275. package/dist/usecase/content/RequestPublishUseCase.d.ts +30 -0
  276. package/dist/usecase/content/RequestPublishUseCase.d.ts.map +1 -0
  277. package/dist/usecase/content/RequestPublishUseCase.js +111 -0
  278. package/dist/usecase/content/RequestPublishUseCase.js.map +1 -0
  279. package/dist/usecase/content/UnpublishUseCase.d.ts +19 -0
  280. package/dist/usecase/content/UnpublishUseCase.d.ts.map +1 -0
  281. package/dist/usecase/content/UnpublishUseCase.js +46 -0
  282. package/dist/usecase/content/UnpublishUseCase.js.map +1 -0
  283. package/dist/usecase/content/UpdateDraftUseCase.d.ts +20 -0
  284. package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -0
  285. package/dist/usecase/content/UpdateDraftUseCase.js +86 -0
  286. package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -0
  287. package/dist/usecase/content/diagnostics.d.ts +26 -0
  288. package/dist/usecase/content/diagnostics.d.ts.map +1 -0
  289. package/dist/usecase/content/diagnostics.js +100 -0
  290. package/dist/usecase/content/diagnostics.js.map +1 -0
  291. package/dist/usecase/content/index.d.ts +15 -0
  292. package/dist/usecase/content/index.d.ts.map +1 -0
  293. package/dist/usecase/content/index.js +15 -0
  294. package/dist/usecase/content/index.js.map +1 -0
  295. package/dist/usecase/dto/content/index.d.ts +73 -0
  296. package/dist/usecase/dto/content/index.d.ts.map +1 -0
  297. package/dist/usecase/dto/content/index.js +2 -0
  298. package/dist/usecase/dto/content/index.js.map +1 -0
  299. package/dist/usecase/dto/index.d.ts +13 -0
  300. package/dist/usecase/dto/index.d.ts.map +1 -0
  301. package/dist/usecase/dto/index.js +13 -0
  302. package/dist/usecase/dto/index.js.map +1 -0
  303. package/dist/usecase/dto/lifecycle/index.d.ts +15 -0
  304. package/dist/usecase/dto/lifecycle/index.d.ts.map +1 -0
  305. package/dist/usecase/dto/lifecycle/index.js +2 -0
  306. package/dist/usecase/dto/lifecycle/index.js.map +1 -0
  307. package/dist/usecase/dto/media/index.d.ts +32 -0
  308. package/dist/usecase/dto/media/index.d.ts.map +1 -0
  309. package/dist/usecase/dto/media/index.js +8 -0
  310. package/dist/usecase/dto/media/index.js.map +1 -0
  311. package/dist/usecase/dto/procedure/index.d.ts +37 -0
  312. package/dist/usecase/dto/procedure/index.d.ts.map +1 -0
  313. package/dist/usecase/dto/procedure/index.js +2 -0
  314. package/dist/usecase/dto/procedure/index.js.map +1 -0
  315. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts +14 -0
  316. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts.map +1 -0
  317. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js +2 -0
  318. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js.map +1 -0
  319. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts +8 -0
  320. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts.map +1 -0
  321. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js +2 -0
  322. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js.map +1 -0
  323. package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts +11 -0
  324. package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts.map +1 -0
  325. package/dist/usecase/dto/render/ComposeSitemapRequest.js +2 -0
  326. package/dist/usecase/dto/render/ComposeSitemapRequest.js.map +1 -0
  327. package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +27 -0
  328. package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +1 -0
  329. package/dist/usecase/dto/render/PreviewEntryRequest.js +2 -0
  330. package/dist/usecase/dto/render/PreviewEntryRequest.js.map +1 -0
  331. package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +17 -0
  332. package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +1 -0
  333. package/dist/usecase/dto/render/RenderEntryLiveRequest.js +2 -0
  334. package/dist/usecase/dto/render/RenderEntryLiveRequest.js.map +1 -0
  335. package/dist/usecase/dto/render/RenderListLiveRequest.d.ts +11 -0
  336. package/dist/usecase/dto/render/RenderListLiveRequest.d.ts.map +1 -0
  337. package/dist/usecase/dto/render/RenderListLiveRequest.js +2 -0
  338. package/dist/usecase/dto/render/RenderListLiveRequest.js.map +1 -0
  339. package/dist/usecase/dto/render/index.d.ts +7 -0
  340. package/dist/usecase/dto/render/index.d.ts.map +1 -0
  341. package/dist/usecase/dto/render/index.js +7 -0
  342. package/dist/usecase/dto/render/index.js.map +1 -0
  343. package/dist/usecase/dto/view/ExecuteViewRequest.d.ts +16 -0
  344. package/dist/usecase/dto/view/ExecuteViewRequest.d.ts.map +1 -0
  345. package/dist/usecase/dto/view/ExecuteViewRequest.js +2 -0
  346. package/dist/usecase/dto/view/ExecuteViewRequest.js.map +1 -0
  347. package/dist/usecase/dto/view/index.d.ts +2 -0
  348. package/dist/usecase/dto/view/index.d.ts.map +1 -0
  349. package/dist/usecase/dto/view/index.js +2 -0
  350. package/dist/usecase/dto/view/index.js.map +1 -0
  351. package/dist/usecase/index.d.ts +16 -0
  352. package/dist/usecase/index.d.ts.map +1 -0
  353. package/dist/usecase/index.js +16 -0
  354. package/dist/usecase/index.js.map +1 -0
  355. package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts +26 -0
  356. package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts.map +1 -0
  357. package/dist/usecase/lifecycle/RunDeferredHookUseCase.js +44 -0
  358. package/dist/usecase/lifecycle/RunDeferredHookUseCase.js.map +1 -0
  359. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts +38 -0
  360. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts.map +1 -0
  361. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js +67 -0
  362. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js.map +1 -0
  363. package/dist/usecase/lifecycle/index.d.ts +3 -0
  364. package/dist/usecase/lifecycle/index.d.ts.map +1 -0
  365. package/dist/usecase/lifecycle/index.js +3 -0
  366. package/dist/usecase/lifecycle/index.js.map +1 -0
  367. package/dist/usecase/media/CommitMediaUploadUseCase.d.ts +15 -0
  368. package/dist/usecase/media/CommitMediaUploadUseCase.d.ts.map +1 -0
  369. package/dist/usecase/media/CommitMediaUploadUseCase.js +43 -0
  370. package/dist/usecase/media/CommitMediaUploadUseCase.js.map +1 -0
  371. package/dist/usecase/media/CreateMediaUploadUseCase.d.ts +18 -0
  372. package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -0
  373. package/dist/usecase/media/CreateMediaUploadUseCase.js +71 -0
  374. package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -0
  375. package/dist/usecase/media/PendingUploadRecord.d.ts +17 -0
  376. package/dist/usecase/media/PendingUploadRecord.d.ts.map +1 -0
  377. package/dist/usecase/media/PendingUploadRecord.js +2 -0
  378. package/dist/usecase/media/PendingUploadRecord.js.map +1 -0
  379. package/dist/usecase/media/diagnostics.d.ts +15 -0
  380. package/dist/usecase/media/diagnostics.d.ts.map +1 -0
  381. package/dist/usecase/media/diagnostics.js +88 -0
  382. package/dist/usecase/media/diagnostics.js.map +1 -0
  383. package/dist/usecase/media/index.d.ts +4 -0
  384. package/dist/usecase/media/index.d.ts.map +1 -0
  385. package/dist/usecase/media/index.js +4 -0
  386. package/dist/usecase/media/index.js.map +1 -0
  387. package/dist/usecase/media/mediaAllowlist.d.ts +30 -0
  388. package/dist/usecase/media/mediaAllowlist.d.ts.map +1 -0
  389. package/dist/usecase/media/mediaAllowlist.js +53 -0
  390. package/dist/usecase/media/mediaAllowlist.js.map +1 -0
  391. package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts +43 -0
  392. package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -0
  393. package/dist/usecase/procedure/InvokeBuiltinUseCase.js +202 -0
  394. package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -0
  395. package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +50 -0
  396. package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -0
  397. package/dist/usecase/procedure/InvokeProcedureUseCase.js +191 -0
  398. package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -0
  399. package/dist/usecase/procedure/index.d.ts +3 -0
  400. package/dist/usecase/procedure/index.d.ts.map +1 -0
  401. package/dist/usecase/procedure/index.js +3 -0
  402. package/dist/usecase/procedure/index.js.map +1 -0
  403. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +25 -0
  404. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -0
  405. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +55 -0
  406. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -0
  407. package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +19 -0
  408. package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +1 -0
  409. package/dist/usecase/render/ComposeLlmsTxtUseCase.js +40 -0
  410. package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +1 -0
  411. package/dist/usecase/render/ComposeSitemapUseCase.d.ts +15 -0
  412. package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +1 -0
  413. package/dist/usecase/render/ComposeSitemapUseCase.js +29 -0
  414. package/dist/usecase/render/ComposeSitemapUseCase.js.map +1 -0
  415. package/dist/usecase/render/PreviewEntryUseCase.d.ts +26 -0
  416. package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -0
  417. package/dist/usecase/render/PreviewEntryUseCase.js +69 -0
  418. package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -0
  419. package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +35 -0
  420. package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -0
  421. package/dist/usecase/render/RenderEntryLiveUseCase.js +59 -0
  422. package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -0
  423. package/dist/usecase/render/RenderListLiveUseCase.d.ts +23 -0
  424. package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -0
  425. package/dist/usecase/render/RenderListLiveUseCase.js +41 -0
  426. package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -0
  427. package/dist/usecase/render/index.d.ts +7 -0
  428. package/dist/usecase/render/index.d.ts.map +1 -0
  429. package/dist/usecase/render/index.js +10 -0
  430. package/dist/usecase/render/index.js.map +1 -0
  431. package/dist/usecase/view/ExecuteViewUseCase.d.ts +31 -0
  432. package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -0
  433. package/dist/usecase/view/ExecuteViewUseCase.js +78 -0
  434. package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -0
  435. package/dist/usecase/view/index.d.ts +2 -0
  436. package/dist/usecase/view/index.d.ts.map +1 -0
  437. package/dist/usecase/view/index.js +2 -0
  438. package/dist/usecase/view/index.js.map +1 -0
  439. package/package.json +49 -0
@@ -0,0 +1,69 @@
1
+ import { toUrlLocale } 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 function entrySlug(entry) {
22
+ const fromData = entry.data["slug"];
23
+ if (typeof fromData === "string" && /^[a-z0-9][a-z0-9-]*$/.test(fromData)) {
24
+ return fromData;
25
+ }
26
+ return entry.id;
27
+ }
28
+ export function entryHtmlKey(entry) {
29
+ const slug = entrySlug(entry);
30
+ const locale = entry.locale ? toUrlLocale(entry.locale) : "";
31
+ return `entry:html:${locale}/${entry.collection}/${slug}`;
32
+ }
33
+ export function entryMarkdownKey(entry) {
34
+ const slug = entrySlug(entry);
35
+ const locale = entry.locale ? toUrlLocale(entry.locale) : "";
36
+ return `entry:md:${locale}/${entry.collection}/${slug}`;
37
+ }
38
+ export function listHtmlKey(collection, locale) {
39
+ const urlLocale = locale ? locale.toLowerCase() : "";
40
+ return `list:html:${urlLocale}/${collection}`;
41
+ }
42
+ export function llmsTxtKey(locale) {
43
+ return `llms:${locale ? locale.toLowerCase() : "root"}`;
44
+ }
45
+ export function entryPublicPath(entry) {
46
+ const slug = entrySlug(entry);
47
+ if (entry.locale)
48
+ return `/${toUrlLocale(entry.locale)}/${entry.collection}/${slug}`;
49
+ return `/${entry.collection}/${slug}`;
50
+ }
51
+ /**
52
+ * Build the entry HTML key from URL-side parts. The router has the
53
+ * (collection, locale, slug) tuple from path params; reconstructing
54
+ * a partial `Entry` just to call `entryHtmlKey` is bug-bait. Use
55
+ * this helper instead.
56
+ *
57
+ * Pass `locale = ""` for non-localized entries (matches publish
58
+ * pipeline semantic where non-localized entries write to
59
+ * `entry:html:/{collection}/{slug}`).
60
+ */
61
+ export function entryHtmlKeyFromParts(collection, locale, slug) {
62
+ const urlLocale = locale ? locale.toLowerCase() : "";
63
+ return `entry:html:${urlLocale}/${collection}/${slug}`;
64
+ }
65
+ export function entryMarkdownKeyFromParts(collection, locale, slug) {
66
+ const urlLocale = locale ? locale.toLowerCase() : "";
67
+ return `entry:md:${urlLocale}/${collection}/${slug}`;
68
+ }
69
+ //# sourceMappingURL=PublishKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishKeys.js","sourceRoot":"","sources":["../../../src/domain/service/PublishKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,SAAS,CAAC,KAAoD;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,cAAc,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAY;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,YAAY,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,MAAc;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,OAAO,aAAa,SAAS,IAAI,UAAU,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,QAAQ,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;IACrF,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,MAAc,EACd,IAAY;IAEZ,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,OAAO,cAAc,SAAS,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,MAAc,EACd,IAAY;IAEZ,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,OAAO,YAAY,SAAS,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type Entry, type SiteConfig } from "@aotter/mantle-spec";
2
+ import type { SeoMeta } from "../model/SeoMeta.js";
3
+ /**
4
+ * Pure composer for SEO + AEO meta blocks emitted on every public
5
+ * entry page. Carries the conventions a consumer otherwise re-invents
6
+ * — canonical, hreflang siblings, the `.md` mirror alternate that
7
+ * lets LLM crawlers grab clean markdown, og: + twitter card, JSON-LD
8
+ * structured data.
9
+ *
10
+ * The composer is pure — no I/O, no DB. The caller resolves the
11
+ * sibling translations (for hreflang) and passes them in. See
12
+ * `ComposeEntrySeoMetaUseCase` for the wired version that does the
13
+ * sibling-read.
14
+ *
15
+ * The shape of the result lives in `domain/model/SeoMeta` so
16
+ * `TemplateRegistry`'s `EntryContext.seo` can reference it without
17
+ * pulling service code into model.
18
+ */
19
+ export type { SeoMeta } from "../model/SeoMeta.js";
20
+ export interface SiblingTranslation {
21
+ readonly locale: string;
22
+ readonly publicPath: string;
23
+ }
24
+ export interface ComposeEntrySeoMetaArgs {
25
+ readonly entry: Entry;
26
+ readonly site: SiteConfig;
27
+ /** The current entry's public path (already includes locale prefix).
28
+ * Composer prepends `site.origin` to absolutize. */
29
+ readonly publicPath: string;
30
+ /** Optional sibling translations for hreflang. The current entry's
31
+ * locale entry is added by the composer if not already present. */
32
+ readonly siblings?: ReadonlyArray<SiblingTranslation>;
33
+ /** og:type. Defaults to `article` when the entry has a `publishedAt`
34
+ * (or `updatedAt`) field, `website` otherwise. */
35
+ readonly type?: "article" | "website";
36
+ }
37
+ export declare function composeEntrySeoMeta(args: ComposeEntrySeoMetaArgs): SeoMeta;
38
+ /**
39
+ * Render the SEO meta block as an HTML fragment. Templates embed this
40
+ * verbatim inside `<head>` via `raw(renderSeoTagsHtml(seo))`.
41
+ *
42
+ * Order matters slightly for crawlers — canonical first, alternates
43
+ * (markdown then hreflang) before og:/twitter so the discoverability
44
+ * bones land before the rich-preview block.
45
+ */
46
+ export declare function renderSeoTagsHtml(meta: SeoMeta): string;
47
+ //# sourceMappingURL=SeoMetaComposer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeoMetaComposer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B;yDACqD;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;wEACoE;IACpE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACtD;uDACmD;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAkD1E;AAmFD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAiDvD"}
@@ -0,0 +1,174 @@
1
+ import { toUrlLocale } from "@aotter/mantle-spec";
2
+ import { absoluteUrl, appendMarkdownExt } from "./AbsoluteUrl.js";
3
+ import { hasMarkdownBody } from "./MarkdownSerializer.js";
4
+ export function composeEntrySeoMeta(args) {
5
+ const { entry, site, publicPath, siblings = [], type } = args;
6
+ const data = entry.data;
7
+ const canonical = absoluteUrl(site.origin, publicPath);
8
+ const alternateMarkdown = appendMarkdownExt(canonical);
9
+ const title = stringField(data, "title") ?? site.title;
10
+ const description = stringField(data, "description") ?? site.description ?? null;
11
+ const image = stringField(data, "coverUrl") ?? stringField(data, "ogImage") ?? null;
12
+ const ogType = type ?? (hasArticleSignal(entry) ? "article" : "website");
13
+ const entryLocale = entry.locale ?? site.canonicalLocale ?? "en";
14
+ const hreflangs = buildHreflangs({
15
+ site,
16
+ currentLocale: entryLocale,
17
+ currentPublicPath: publicPath,
18
+ siblings,
19
+ });
20
+ return {
21
+ canonical,
22
+ alternateMarkdown,
23
+ hreflangs,
24
+ description: description ?? null,
25
+ robots: null,
26
+ og: {
27
+ type: ogType,
28
+ url: canonical,
29
+ title,
30
+ siteName: site.title || site.brand,
31
+ description: description ?? null,
32
+ image,
33
+ locale: entryLocale,
34
+ },
35
+ twitter: {
36
+ card: image ? "summary_large_image" : "summary",
37
+ title,
38
+ description: description ?? null,
39
+ image,
40
+ },
41
+ jsonLd: buildJsonLd({
42
+ ogType,
43
+ title,
44
+ description,
45
+ canonical,
46
+ image,
47
+ data,
48
+ site,
49
+ }),
50
+ };
51
+ }
52
+ function buildHreflangs(args) {
53
+ const { site, currentLocale, currentPublicPath, siblings } = args;
54
+ if (site.locales.length <= 1)
55
+ return [];
56
+ const out = [];
57
+ const seen = new Set();
58
+ const push = (locale, path) => {
59
+ const key = locale.toLowerCase();
60
+ if (seen.has(key))
61
+ return;
62
+ seen.add(key);
63
+ out.push({ locale, href: absoluteUrl(site.origin, path) });
64
+ };
65
+ push(currentLocale, currentPublicPath);
66
+ for (const s of siblings)
67
+ push(s.locale, s.publicPath);
68
+ // x-default points at the canonical-locale variant when known,
69
+ // falling back to the current entry's URL otherwise. Search engines
70
+ // expect this row alongside the per-locale ones.
71
+ const canonicalSibling = siblings.find((s) => site.canonicalLocale && s.locale.toLowerCase() === site.canonicalLocale.toLowerCase());
72
+ out.push({
73
+ locale: "x-default",
74
+ href: absoluteUrl(site.origin, canonicalSibling?.publicPath ?? currentPublicPath),
75
+ });
76
+ return out;
77
+ }
78
+ function buildJsonLd(args) {
79
+ const { ogType, title, description, canonical, image, data, site } = args;
80
+ const publishedAtMs = numericField(data, "publishedAt");
81
+ const updatedAtMs = numericField(data, "updatedAt");
82
+ const base = {
83
+ "@context": "https://schema.org",
84
+ "@type": ogType === "article" ? "Article" : "WebPage",
85
+ headline: title,
86
+ name: title,
87
+ url: canonical,
88
+ description: description ?? undefined,
89
+ image: image ?? undefined,
90
+ inLanguage: site.canonicalLocale ?? undefined,
91
+ publisher: site.title || site.brand
92
+ ? {
93
+ "@type": "Organization",
94
+ name: site.title || site.brand,
95
+ }
96
+ : undefined,
97
+ datePublished: publishedAtMs ? new Date(publishedAtMs).toISOString() : undefined,
98
+ dateModified: updatedAtMs ? new Date(updatedAtMs).toISOString() : undefined,
99
+ };
100
+ // Drop undefined keys so JSON.stringify produces a clean object.
101
+ return Object.fromEntries(Object.entries(base).filter(([, v]) => v !== undefined));
102
+ }
103
+ function stringField(data, key) {
104
+ const v = data[key];
105
+ return typeof v === "string" && v.length > 0 ? v : null;
106
+ }
107
+ function numericField(data, key) {
108
+ const v = data[key];
109
+ return typeof v === "number" && Number.isFinite(v) ? v : null;
110
+ }
111
+ function hasArticleSignal(entry) {
112
+ return typeof entry.data["publishedAt"] === "number" || hasMarkdownBody(entry);
113
+ }
114
+ /**
115
+ * Render the SEO meta block as an HTML fragment. Templates embed this
116
+ * verbatim inside `<head>` via `raw(renderSeoTagsHtml(seo))`.
117
+ *
118
+ * Order matters slightly for crawlers — canonical first, alternates
119
+ * (markdown then hreflang) before og:/twitter so the discoverability
120
+ * bones land before the rich-preview block.
121
+ */
122
+ export function renderSeoTagsHtml(meta) {
123
+ const parts = [];
124
+ parts.push(`<link rel="canonical" href="${escapeAttr(meta.canonical)}">`);
125
+ parts.push(`<link rel="alternate" type="text/markdown" href="${escapeAttr(meta.alternateMarkdown)}">`);
126
+ for (const h of meta.hreflangs) {
127
+ parts.push(`<link rel="alternate" hreflang="${escapeAttr(h.locale)}" href="${escapeAttr(h.href)}">`);
128
+ }
129
+ if (meta.description) {
130
+ parts.push(`<meta name="description" content="${escapeAttr(meta.description)}">`);
131
+ }
132
+ if (meta.robots) {
133
+ parts.push(`<meta name="robots" content="${escapeAttr(meta.robots)}">`);
134
+ }
135
+ parts.push(`<meta name="generator" content="mantle">`);
136
+ parts.push(`<meta property="og:type" content="${escapeAttr(meta.og.type)}">`);
137
+ parts.push(`<meta property="og:url" content="${escapeAttr(meta.og.url)}">`);
138
+ parts.push(`<meta property="og:title" content="${escapeAttr(meta.og.title)}">`);
139
+ if (meta.og.siteName) {
140
+ parts.push(`<meta property="og:site_name" content="${escapeAttr(meta.og.siteName)}">`);
141
+ }
142
+ if (meta.og.description) {
143
+ parts.push(`<meta property="og:description" content="${escapeAttr(meta.og.description)}">`);
144
+ }
145
+ if (meta.og.image) {
146
+ parts.push(`<meta property="og:image" content="${escapeAttr(meta.og.image)}">`);
147
+ }
148
+ parts.push(`<meta property="og:locale" content="${escapeAttr(toUrlLocale(meta.og.locale))}">`);
149
+ parts.push(`<meta name="twitter:card" content="${escapeAttr(meta.twitter.card)}">`);
150
+ parts.push(`<meta name="twitter:title" content="${escapeAttr(meta.twitter.title)}">`);
151
+ if (meta.twitter.description) {
152
+ parts.push(`<meta name="twitter:description" content="${escapeAttr(meta.twitter.description)}">`);
153
+ }
154
+ if (meta.twitter.image) {
155
+ parts.push(`<meta name="twitter:image" content="${escapeAttr(meta.twitter.image)}">`);
156
+ }
157
+ if (meta.jsonLd) {
158
+ parts.push(`<script type="application/ld+json">${escapeJsonLd(meta.jsonLd)}</script>`);
159
+ }
160
+ return parts.join("\n");
161
+ }
162
+ function escapeAttr(s) {
163
+ return s
164
+ .replace(/&/g, "&amp;")
165
+ .replace(/"/g, "&quot;")
166
+ .replace(/</g, "&lt;")
167
+ .replace(/>/g, "&gt;");
168
+ }
169
+ function escapeJsonLd(obj) {
170
+ // `</script>` inside JSON-LD is the only nested-script pitfall;
171
+ // escaping the closing `</` keeps the embedded JSON strict-parseable.
172
+ return JSON.stringify(obj).replace(/<\//g, "<\\/");
173
+ }
174
+ //# sourceMappingURL=SeoMetaComposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeoMetaComposer.js","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Entry, SiteConfig } from "@aotter/mantle-spec";
2
+ /**
3
+ * Hreflang alternates are deferred to v0.1.x (need cross-locale entry
4
+ * pairing first); only minimal `loc + lastmod` shipped.
5
+ *
6
+ * Entries arrive pre-mapped from storage row to public path — the
7
+ * caller (`ComposeSitemapUseCase`) decides how a (collection, slug,
8
+ * locale) row surfaces under the consumer's routing.
9
+ */
10
+ export interface SitemapEntry {
11
+ readonly entry: Entry;
12
+ readonly path: string;
13
+ }
14
+ export interface SitemapInput {
15
+ readonly site: SiteConfig;
16
+ readonly entries: readonly SitemapEntry[];
17
+ }
18
+ export declare function serializeSitemap(input: SitemapInput): string;
19
+ //# sourceMappingURL=SitemapSerializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SitemapSerializer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/SitemapSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAgB5D"}
@@ -0,0 +1,27 @@
1
+ import { absoluteUrl } from "./AbsoluteUrl.js";
2
+ export function serializeSitemap(input) {
3
+ const { site, entries } = input;
4
+ const out = [];
5
+ out.push(`<?xml version="1.0" encoding="UTF-8"?>`);
6
+ out.push(`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`);
7
+ for (const { entry, path } of entries) {
8
+ const loc = absoluteUrl(site.origin ?? "", path);
9
+ out.push(" <url>");
10
+ out.push(` <loc>${escapeXml(loc)}</loc>`);
11
+ if (entry.updatedAt) {
12
+ out.push(` <lastmod>${new Date(entry.updatedAt).toISOString()}</lastmod>`);
13
+ }
14
+ out.push(" </url>");
15
+ }
16
+ out.push("</urlset>");
17
+ return out.join("\n") + "\n";
18
+ }
19
+ function escapeXml(s) {
20
+ return s
21
+ .replace(/&/g, "&amp;")
22
+ .replace(/</g, "&lt;")
23
+ .replace(/>/g, "&gt;")
24
+ .replace(/"/g, "&quot;")
25
+ .replace(/'/g, "&apos;");
26
+ }
27
+ //# sourceMappingURL=SitemapSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SitemapSerializer.js","sourceRoot":"","sources":["../../../src/domain/service/SitemapSerializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAoB/C,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACnD,GAAG,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IACzE,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,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,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { LifecycleHook, TriggerManifest } from "@aotter/mantle-spec";
2
+ /**
3
+ * Pre-built `(schema, hook) → Trigger[]` index for the lifecycle hook
4
+ * runner. Built once at boot from the parsed manifest set; the
5
+ * `LifecycleHookingEntryRepository` decorator queries it on every
6
+ * mutation.
7
+ *
8
+ * Within a `(schema, hook)` group, Triggers fire in **alphabetical
9
+ * order by `Trigger.metadata.name`** — a `priority: number` key is
10
+ * reserved for v0.2 (POC ADR-0014). Authors choose names that sort
11
+ * correctly today (`010-bot-check`, `020-rate-limit`).
12
+ *
13
+ * Pure data-structure — no I/O, no manifest validation. Lives in
14
+ * `domain/service/`.
15
+ */
16
+ export declare class TriggerIndex {
17
+ private readonly bySchemaAndHook;
18
+ constructor(triggers: readonly TriggerManifest[]);
19
+ /** Triggers bound to (schema, hook), in firing order. Empty array
20
+ * when nothing matches — callers don't need a null check. */
21
+ forHook(schema: string, hook: LifecycleHook): readonly TriggerManifest[];
22
+ /** True when at least one lifecycle Trigger bound to this Schema
23
+ * exists (any hook). Used by the entry-writer decorator to short-
24
+ * circuit when no hooks could fire. */
25
+ hasAny(schema: string): boolean;
26
+ }
27
+ //# sourceMappingURL=TriggerIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerIndex.d.ts","sourceRoot":"","sources":["../../../src/domain/service/TriggerIndex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqD;gBAEzE,QAAQ,EAAE,SAAS,eAAe,EAAE;IAuBhD;kEAC8D;IAC9D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,SAAS,eAAe,EAAE;IAIxE;;4CAEwC;IACxC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGhC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Pre-built `(schema, hook) → Trigger[]` index for the lifecycle hook
3
+ * runner. Built once at boot from the parsed manifest set; the
4
+ * `LifecycleHookingEntryRepository` decorator queries it on every
5
+ * mutation.
6
+ *
7
+ * Within a `(schema, hook)` group, Triggers fire in **alphabetical
8
+ * order by `Trigger.metadata.name`** — a `priority: number` key is
9
+ * reserved for v0.2 (POC ADR-0014). Authors choose names that sort
10
+ * correctly today (`010-bot-check`, `020-rate-limit`).
11
+ *
12
+ * Pure data-structure — no I/O, no manifest validation. Lives in
13
+ * `domain/service/`.
14
+ */
15
+ export class TriggerIndex {
16
+ bySchemaAndHook;
17
+ constructor(triggers) {
18
+ this.bySchemaAndHook = new Map();
19
+ for (const t of triggers) {
20
+ if (t.spec.source.kind !== "lifecycle")
21
+ continue;
22
+ const schema = t.spec.source.schema;
23
+ let inner = this.bySchemaAndHook.get(schema);
24
+ if (!inner) {
25
+ inner = new Map();
26
+ this.bySchemaAndHook.set(schema, inner);
27
+ }
28
+ for (const hook of t.spec.source.on) {
29
+ const list = inner.get(hook) ?? [];
30
+ list.push(t);
31
+ inner.set(hook, list);
32
+ }
33
+ }
34
+ for (const inner of this.bySchemaAndHook.values()) {
35
+ for (const list of inner.values()) {
36
+ list.sort((a, b) => a.metadata.name.localeCompare(b.metadata.name));
37
+ }
38
+ }
39
+ }
40
+ /** Triggers bound to (schema, hook), in firing order. Empty array
41
+ * when nothing matches — callers don't need a null check. */
42
+ forHook(schema, hook) {
43
+ return this.bySchemaAndHook.get(schema)?.get(hook) ?? [];
44
+ }
45
+ /** True when at least one lifecycle Trigger bound to this Schema
46
+ * exists (any hook). Used by the entry-writer decorator to short-
47
+ * circuit when no hooks could fire. */
48
+ hasAny(schema) {
49
+ return this.bySchemaAndHook.has(schema);
50
+ }
51
+ }
52
+ //# sourceMappingURL=TriggerIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerIndex.js","sourceRoot":"","sources":["../../../src/domain/service/TriggerIndex.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,YAAY;IACN,eAAe,CAAqD;IAErF,YAAY,QAAoC;QAC9C,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YACjD,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACpC,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACb,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED;kEAC8D;IAC9D,OAAO,CAAC,MAAc,EAAE,IAAmB;QACzC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED;;4CAEwC;IACxC,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { ViewManifest } from "@aotter/mantle-spec";
2
+ /**
3
+ * Coerce a public REST query string into the typed param map declared
4
+ * by `View.spec.params`. v0.1 grammar covers scalar leaves only —
5
+ * string / integer / number / boolean / enum. `required` is enforced;
6
+ * unknown query keys are silently ignored (lenient v0.1.0).
7
+ *
8
+ * Lives in `mantle-runtime` (not the CF adapter) so future adapters
9
+ * — Netlify, Bun, Deno — share one coercion path. Throws a
10
+ * `ViewParamCoercionError` so the adapter can map the message into its
11
+ * own diagnostic envelope without parsing prose.
12
+ */
13
+ export declare class ViewParamCoercionError extends Error {
14
+ constructor(message: string);
15
+ }
16
+ export interface ViewParamLookup {
17
+ get(name: string): string | null;
18
+ }
19
+ export declare function coerceViewParams(view: ViewManifest, query: ViewParamLookup): Record<string, unknown>;
20
+ //# sourceMappingURL=ViewParamCoercer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewParamCoercer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/ViewParamCoercer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Coerce a public REST query string into the typed param map declared
3
+ * by `View.spec.params`. v0.1 grammar covers scalar leaves only —
4
+ * string / integer / number / boolean / enum. `required` is enforced;
5
+ * unknown query keys are silently ignored (lenient v0.1.0).
6
+ *
7
+ * Lives in `mantle-runtime` (not the CF adapter) so future adapters
8
+ * — Netlify, Bun, Deno — share one coercion path. Throws a
9
+ * `ViewParamCoercionError` so the adapter can map the message into its
10
+ * own diagnostic envelope without parsing prose.
11
+ */
12
+ export class ViewParamCoercionError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ this.name = "ViewParamCoercionError";
16
+ }
17
+ }
18
+ export function coerceViewParams(view, query) {
19
+ const declared = view.spec.params;
20
+ if (!declared)
21
+ return {};
22
+ const props = declared.properties ?? {};
23
+ const required = declared.required ?? [];
24
+ const out = {};
25
+ for (const [name, schema] of Object.entries(props)) {
26
+ const raw = query.get(name);
27
+ if (raw == null) {
28
+ if (required.includes(name)) {
29
+ throw new ViewParamCoercionError(`View '${view.metadata.name}' requires query param '${name}' (declared in View.spec.params.required).`);
30
+ }
31
+ continue;
32
+ }
33
+ out[name] = coerceScalar(raw, schema, name);
34
+ }
35
+ return out;
36
+ }
37
+ function coerceScalar(raw, schema, name) {
38
+ // Coerce by `type` first so a co-declared `enum` checks membership
39
+ // against typed values — `["1","2"].includes(1)` and `[1,2].includes("1")`
40
+ // are both false, so an enum-first check would throw spuriously (or
41
+ // worse, return a string value when an integer was declared).
42
+ const coerced = coerceByType(raw, schema.type, name);
43
+ if (Array.isArray(schema.enum) && schema.enum.length > 0) {
44
+ if (!schema.enum.includes(coerced)) {
45
+ throw new ViewParamCoercionError(`query param '${name}' must be one of ${schema.enum.join(", ")}; got ${JSON.stringify(raw)}.`);
46
+ }
47
+ }
48
+ return coerced;
49
+ }
50
+ function coerceByType(raw, type, name) {
51
+ switch (type) {
52
+ case "integer": {
53
+ const n = Number.parseInt(raw, 10);
54
+ // Reject partial parses ("1.5", "1abc") and non-numeric ("abc")
55
+ // — `parseInt` would silently stop at the first non-digit. The
56
+ // trim() pair allows whitespace-padded canonicals.
57
+ if (!Number.isFinite(n) || String(n) !== raw.trim()) {
58
+ throw new ViewParamCoercionError(`query param '${name}' expected integer; got ${JSON.stringify(raw)}.`);
59
+ }
60
+ return n;
61
+ }
62
+ case "number": {
63
+ const n = Number(raw);
64
+ if (!Number.isFinite(n)) {
65
+ throw new ViewParamCoercionError(`query param '${name}' expected number; got ${JSON.stringify(raw)}.`);
66
+ }
67
+ return n;
68
+ }
69
+ case "boolean":
70
+ if (raw === "true")
71
+ return true;
72
+ if (raw === "false")
73
+ return false;
74
+ throw new ViewParamCoercionError(`query param '${name}' expected boolean (true|false); got ${JSON.stringify(raw)}.`);
75
+ case "string":
76
+ case undefined:
77
+ return raw;
78
+ default:
79
+ throw new ViewParamCoercionError(`View param '${name}' declares unsupported type '${String(type)}' for the public REST surface (v0.1 covers string / integer / number / boolean / enum).`);
80
+ }
81
+ }
82
+ //# sourceMappingURL=ViewParamCoercer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewParamCoercer.js","sourceRoot":"","sources":["../../../src/domain/service/ViewParamCoercer.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAMD,MAAM,UAAU,gBAAgB,CAC9B,IAAkB,EAClB,KAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAgC,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,sBAAsB,CAC9B,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,2BAA2B,IAAI,4CAA4C,CACvG,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,MAAkB,EAAE,IAAY;IACjE,mEAAmE;IACnE,2EAA2E;IAC3E,oEAAoE;IACpE,8DAA8D;IAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,sBAAsB,CAC9B,gBAAgB,IAAI,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAC9F,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,IAAwB,EAAE,IAAY;IACvE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,gEAAgE;YAChE,+DAA+D;YAC/D,mDAAmD;YACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpD,MAAM,IAAI,sBAAsB,CAC9B,gBAAgB,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CACtE,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,sBAAsB,CAC9B,gBAAgB,IAAI,0BAA0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CACrE,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,SAAS;YACZ,IAAI,GAAG,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YAChC,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAC;YAClC,MAAM,IAAI,sBAAsB,CAC9B,gBAAgB,IAAI,wCAAwC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CACnF,CAAC;QACJ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb;YACE,MAAM,IAAI,sBAAsB,CAC9B,eAAe,IAAI,gCAAgC,MAAM,CAAC,IAAI,CAAC,yFAAyF,CACzJ,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type ViewManifest } from "@aotter/mantle-spec";
2
+ /**
3
+ * View → SQL compilation. Targets SQLite + JSON1 (D1's dialect).
4
+ * Reserved metadata fields project as native columns; everything else
5
+ * goes through `json_extract(data, '$.<field>')`. SQL uses positional
6
+ * `?` parameters; field-name escapes are defense-in-depth on top of
7
+ * the Schema validator gate.
8
+ *
9
+ * v0.1 filter AST is `eq | and | or`; `eq.value` may be a literal or a
10
+ * `{ $param: <name> }` sentinel substituted from `options.params` at
11
+ * compile time. Pagination knobs `page` / `show` come in via
12
+ * `options`; the runtime owns the LIMIT/OFFSET emission.
13
+ */
14
+ export interface CompiledView {
15
+ readonly sql: string;
16
+ readonly params: readonly unknown[];
17
+ readonly effectivePage: number;
18
+ readonly effectiveShow: number;
19
+ }
20
+ export interface CompileViewOptions {
21
+ /** Resolved query-string params, post-coercion. */
22
+ readonly params?: Record<string, unknown>;
23
+ /** 1-indexed; non-positive / non-finite falls back to 1. */
24
+ readonly page?: number;
25
+ /** Caller's requested page size; clamped to View.spec.limit. */
26
+ readonly show?: number;
27
+ }
28
+ export declare function compileView(view: ViewManifest, options?: CompileViewOptions): CompiledView;
29
+ //# sourceMappingURL=ViewSqlCompiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewSqlCompiler.d.ts","sourceRoot":"","sources":["../../../src/domain/service/ViewSqlCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAG7B;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAsBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,GAAE,kBAAuB,GAAG,YAAY,CAkB9F"}