@lupinum/ginko-content 0.1.0

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 (512) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/compatibility.json +27 -0
  4. package/dist/cli.d.mts +1 -0
  5. package/dist/cli.mjs +690 -0
  6. package/dist/cms-contract/build +1 -0
  7. package/dist/cms-contract/build.d.ts +44 -0
  8. package/dist/cms-contract/build.js +513 -0
  9. package/dist/cms-contract/index +1 -0
  10. package/dist/cms-contract/index.d.ts +25 -0
  11. package/dist/cms-contract/index.js +37 -0
  12. package/dist/cms-contract/mdc +1 -0
  13. package/dist/cms-contract/mdc.d.ts +32 -0
  14. package/dist/cms-contract/mdc.js +52 -0
  15. package/dist/cms-contract/path +1 -0
  16. package/dist/cms-contract/path.d.ts +12 -0
  17. package/dist/cms-contract/path.js +18 -0
  18. package/dist/cms-contract/schema +1 -0
  19. package/dist/cms-contract/schema.d.ts +18 -0
  20. package/dist/cms-contract/schema.js +13 -0
  21. package/dist/cms-contract/types +1 -0
  22. package/dist/cms-contract/types.d.ts +177 -0
  23. package/dist/cms-contract/types.js +0 -0
  24. package/dist/cms-import/index +1 -0
  25. package/dist/cms-import/index.d.ts +21 -0
  26. package/dist/cms-import/index.js +57 -0
  27. package/dist/config.d.mts +3 -0
  28. package/dist/config.mjs +3 -0
  29. package/dist/core/cache +1 -0
  30. package/dist/core/cache-hints +1 -0
  31. package/dist/core/cache-hints.d.ts +3 -0
  32. package/dist/core/cache-hints.js +55 -0
  33. package/dist/core/cache.d.ts +29 -0
  34. package/dist/core/cache.js +0 -0
  35. package/dist/core/content/collection +1 -0
  36. package/dist/core/content/collection.d.ts +3 -0
  37. package/dist/core/content/collection.js +52 -0
  38. package/dist/core/content/graph +1 -0
  39. package/dist/core/content/graph.d.ts +147 -0
  40. package/dist/core/content/graph.js +189 -0
  41. package/dist/core/content/ignore +1 -0
  42. package/dist/core/content/ignore.d.ts +5 -0
  43. package/dist/core/content/ignore.js +10 -0
  44. package/dist/core/content/locale +1 -0
  45. package/dist/core/content/locale.d.ts +61 -0
  46. package/dist/core/content/locale.js +77 -0
  47. package/dist/core/content/path +1 -0
  48. package/dist/core/content/path.d.ts +36 -0
  49. package/dist/core/content/path.js +143 -0
  50. package/dist/core/content/slug +1 -0
  51. package/dist/core/content/slug.d.ts +4 -0
  52. package/dist/core/content/slug.js +41 -0
  53. package/dist/core/content/sources +1 -0
  54. package/dist/core/content/sources.d.ts +2 -0
  55. package/dist/core/content/sources.js +6 -0
  56. package/dist/core/errors +1 -0
  57. package/dist/core/errors.d.ts +15 -0
  58. package/dist/core/errors.js +10 -0
  59. package/dist/core/markdown/tree +1 -0
  60. package/dist/core/markdown/tree.d.ts +9 -0
  61. package/dist/core/markdown/tree.js +47 -0
  62. package/dist/core/query/builder +1 -0
  63. package/dist/core/query/builder.d.ts +18 -0
  64. package/dist/core/query/builder.js +186 -0
  65. package/dist/core/query/execute +1 -0
  66. package/dist/core/query/execute.d.ts +52 -0
  67. package/dist/core/query/execute.js +304 -0
  68. package/dist/core/query/filter +1 -0
  69. package/dist/core/query/filter.d.ts +42 -0
  70. package/dist/core/query/filter.js +118 -0
  71. package/dist/core/query/json +1 -0
  72. package/dist/core/query/json.d.ts +2 -0
  73. package/dist/core/query/json.js +20 -0
  74. package/dist/core/query/lower +1 -0
  75. package/dist/core/query/lower.d.ts +14 -0
  76. package/dist/core/query/lower.js +121 -0
  77. package/dist/core/query/operators +1 -0
  78. package/dist/core/query/operators.d.ts +23 -0
  79. package/dist/core/query/operators.js +126 -0
  80. package/dist/core/query/params +1 -0
  81. package/dist/core/query/params.d.ts +15 -0
  82. package/dist/core/query/params.js +83 -0
  83. package/dist/core/query/plan +1 -0
  84. package/dist/core/query/plan.d.ts +110 -0
  85. package/dist/core/query/plan.js +0 -0
  86. package/dist/core/references/resolve +1 -0
  87. package/dist/core/references/resolve.d.ts +31 -0
  88. package/dist/core/references/resolve.js +121 -0
  89. package/dist/core/references/schema +1 -0
  90. package/dist/core/references/schema.d.ts +8 -0
  91. package/dist/core/references/schema.js +70 -0
  92. package/dist/core/result +1 -0
  93. package/dist/core/result.d.ts +27 -0
  94. package/dist/core/result.js +2 -0
  95. package/dist/features/collections/resolve +1 -0
  96. package/dist/features/collections/resolve.d.ts +63 -0
  97. package/dist/features/collections/resolve.js +76 -0
  98. package/dist/features/localization/config +1 -0
  99. package/dist/features/localization/config.d.ts +18 -0
  100. package/dist/features/localization/config.js +25 -0
  101. package/dist/features/localization/links +1 -0
  102. package/dist/features/localization/links.d.ts +1 -0
  103. package/dist/features/localization/links.js +69 -0
  104. package/dist/features/localization/path +1 -0
  105. package/dist/features/localization/path.d.ts +32 -0
  106. package/dist/features/localization/path.js +80 -0
  107. package/dist/features/localization/results +1 -0
  108. package/dist/features/localization/results.d.ts +42 -0
  109. package/dist/features/localization/results.js +149 -0
  110. package/dist/features/localization/translated-slugs +1 -0
  111. package/dist/features/localization/translated-slugs.d.ts +11 -0
  112. package/dist/features/localization/translated-slugs.js +80 -0
  113. package/dist/features/navigation/build +1 -0
  114. package/dist/features/navigation/build.d.ts +28 -0
  115. package/dist/features/navigation/build.js +104 -0
  116. package/dist/features/navigation/canonical +1 -0
  117. package/dist/features/navigation/canonical.d.ts +33 -0
  118. package/dist/features/navigation/canonical.js +149 -0
  119. package/dist/features/navigation/query +1 -0
  120. package/dist/features/navigation/query.d.ts +19 -0
  121. package/dist/features/navigation/query.js +51 -0
  122. package/dist/features/navigation/resolve +1 -0
  123. package/dist/features/navigation/resolve.d.ts +20 -0
  124. package/dist/features/navigation/resolve.js +79 -0
  125. package/dist/features/navigation/tree +1 -0
  126. package/dist/features/navigation/tree.d.ts +6 -0
  127. package/dist/features/navigation/tree.js +32 -0
  128. package/dist/features/search/navigation +1 -0
  129. package/dist/features/search/navigation.d.ts +6 -0
  130. package/dist/features/search/navigation.js +21 -0
  131. package/dist/features/search/sections +1 -0
  132. package/dist/features/search/sections.d.ts +21 -0
  133. package/dist/features/search/sections.js +98 -0
  134. package/dist/features/sitemap/query +1 -0
  135. package/dist/features/sitemap/query.d.ts +68 -0
  136. package/dist/features/sitemap/query.js +171 -0
  137. package/dist/integrations/nitro/context +1 -0
  138. package/dist/integrations/nitro/context.d.ts +63 -0
  139. package/dist/integrations/nitro/context.js +28 -0
  140. package/dist/integrations/nitro/ingest +1 -0
  141. package/dist/integrations/nitro/ingest.d.ts +18 -0
  142. package/dist/integrations/nitro/ingest.js +120 -0
  143. package/dist/integrations/nitro/preview +1 -0
  144. package/dist/integrations/nitro/preview.d.ts +5 -0
  145. package/dist/integrations/nitro/preview.js +21 -0
  146. package/dist/integrations/nitro/runtime-config +1 -0
  147. package/dist/integrations/nitro/runtime-config.d.ts +1 -0
  148. package/dist/integrations/nitro/runtime-config.js +4 -0
  149. package/dist/integrations/nitro/storage +1 -0
  150. package/dist/integrations/nitro/storage.d.ts +9 -0
  151. package/dist/integrations/nitro/storage.js +113 -0
  152. package/dist/integrations/vue/content-components +1 -0
  153. package/dist/integrations/vue/content-components.d.ts +24 -0
  154. package/dist/integrations/vue/content-components.js +67 -0
  155. package/dist/integrations/vue/html-tags +1 -0
  156. package/dist/integrations/vue/html-tags.d.ts +2 -0
  157. package/dist/integrations/vue/html-tags.js +119 -0
  158. package/dist/integrations/vue/markdown-refs +1 -0
  159. package/dist/integrations/vue/markdown-refs.d.ts +1 -0
  160. package/dist/integrations/vue/markdown-refs.js +1 -0
  161. package/dist/module.d.mts +2044 -0
  162. package/dist/module.json +12 -0
  163. package/dist/module.mjs +1381 -0
  164. package/dist/parsers/csv +1 -0
  165. package/dist/parsers/csv.d.ts +2 -0
  166. package/dist/parsers/csv.js +38 -0
  167. package/dist/parsers/from-csv +1 -0
  168. package/dist/parsers/from-csv.d.ts +20 -0
  169. package/dist/parsers/from-csv.js +85 -0
  170. package/dist/parsers/index +1 -0
  171. package/dist/parsers/index.d.ts +10 -0
  172. package/dist/parsers/index.js +50 -0
  173. package/dist/parsers/json +1 -0
  174. package/dist/parsers/json.d.ts +2 -0
  175. package/dist/parsers/json.js +29 -0
  176. package/dist/parsers/markdown +1 -0
  177. package/dist/parsers/markdown-plugins +1 -0
  178. package/dist/parsers/markdown-plugins.d.ts +3 -0
  179. package/dist/parsers/markdown-plugins.js +58 -0
  180. package/dist/parsers/markdown.d.ts +2 -0
  181. package/dist/parsers/markdown.js +64 -0
  182. package/dist/parsers/path-meta +1 -0
  183. package/dist/parsers/path-meta.d.ts +4 -0
  184. package/dist/parsers/path-meta.js +37 -0
  185. package/dist/parsers/utils +1 -0
  186. package/dist/parsers/utils.d.ts +2 -0
  187. package/dist/parsers/utils.js +3 -0
  188. package/dist/parsers/yaml +1 -0
  189. package/dist/parsers/yaml.d.ts +2 -0
  190. package/dist/parsers/yaml.js +19 -0
  191. package/dist/public/client +1 -0
  192. package/dist/public/client.d.ts +19 -0
  193. package/dist/public/client.js +26 -0
  194. package/dist/public/provider +1 -0
  195. package/dist/public/provider-errors +1 -0
  196. package/dist/public/provider-errors.d.ts +4 -0
  197. package/dist/public/provider-errors.js +28 -0
  198. package/dist/public/provider.d.ts +74 -0
  199. package/dist/public/provider.js +6 -0
  200. package/dist/public/server +1 -0
  201. package/dist/public/server.d.ts +19 -0
  202. package/dist/public/server.js +28 -0
  203. package/dist/runtime/app/components/ContentRenderer.d.vue.ts +62 -0
  204. package/dist/runtime/app/components/ContentRenderer.vue +84 -0
  205. package/dist/runtime/app/components/ContentRenderer.vue.d.ts +62 -0
  206. package/dist/runtime/app/components/ContentRendererInline.d.vue.ts +50 -0
  207. package/dist/runtime/app/components/ContentRendererInline.vue +97 -0
  208. package/dist/runtime/app/components/ContentRendererInline.vue.d.ts +50 -0
  209. package/dist/runtime/app/components/Prose/ProseCode.d.vue.ts +61 -0
  210. package/dist/runtime/app/components/Prose/ProseCode.vue +32 -0
  211. package/dist/runtime/app/components/Prose/ProseCode.vue.d.ts +61 -0
  212. package/dist/runtime/app/components/Prose/ProseCodeInline.d.vue.ts +13 -0
  213. package/dist/runtime/app/components/Prose/ProseCodeInline.vue +3 -0
  214. package/dist/runtime/app/components/Prose/ProseCodeInline.vue.d.ts +13 -0
  215. package/dist/runtime/app/components/Prose/ProseImg.d.vue.ts +59 -0
  216. package/dist/runtime/app/components/Prose/ProseImg.vue +59 -0
  217. package/dist/runtime/app/components/Prose/ProseImg.vue.d.ts +59 -0
  218. package/dist/runtime/app/components/Prose/ProsePre.d.vue.ts +79 -0
  219. package/dist/runtime/app/components/Prose/ProsePre.vue +42 -0
  220. package/dist/runtime/app/components/Prose/ProsePre.vue.d.ts +79 -0
  221. package/dist/runtime/app/components/internal/ContentRendererMarkdown.d.vue.ts +68 -0
  222. package/dist/runtime/app/components/internal/ContentRendererMarkdown.vue +99 -0
  223. package/dist/runtime/app/components/internal/ContentRendererMarkdown.vue.d.ts +68 -0
  224. package/dist/runtime/app/components/internal/MarkdownRenderer +1 -0
  225. package/dist/runtime/app/components/internal/MarkdownRenderer.d.ts +90 -0
  226. package/dist/runtime/app/components/internal/MarkdownRenderer.js +191 -0
  227. package/dist/runtime/app/composables/async-data +1 -0
  228. package/dist/runtime/app/composables/async-data.d.ts +2 -0
  229. package/dist/runtime/app/composables/async-data.js +4 -0
  230. package/dist/runtime/app/composables/content-i18n +1 -0
  231. package/dist/runtime/app/composables/content-i18n.d.ts +5 -0
  232. package/dist/runtime/app/composables/content-i18n.js +1 -0
  233. package/dist/runtime/app/composables/head +1 -0
  234. package/dist/runtime/app/composables/head.d.ts +11 -0
  235. package/dist/runtime/app/composables/head.js +98 -0
  236. package/dist/runtime/app/composables/locale +1 -0
  237. package/dist/runtime/app/composables/locale-context +1 -0
  238. package/dist/runtime/app/composables/locale-context.d.ts +5 -0
  239. package/dist/runtime/app/composables/locale-context.js +8 -0
  240. package/dist/runtime/app/composables/locale.d.ts +8 -0
  241. package/dist/runtime/app/composables/locale.js +15 -0
  242. package/dist/runtime/app/composables/navigation +1 -0
  243. package/dist/runtime/app/composables/navigation.d.ts +3 -0
  244. package/dist/runtime/app/composables/navigation.js +7 -0
  245. package/dist/runtime/app/composables/preview +1 -0
  246. package/dist/runtime/app/composables/preview.d.ts +5 -0
  247. package/dist/runtime/app/composables/preview.js +52 -0
  248. package/dist/runtime/app/composables/query-api +1 -0
  249. package/dist/runtime/app/composables/query-api.d.ts +27 -0
  250. package/dist/runtime/app/composables/query-api.js +46 -0
  251. package/dist/runtime/app/composables/route +1 -0
  252. package/dist/runtime/app/composables/route.d.ts +11 -0
  253. package/dist/runtime/app/composables/route.js +150 -0
  254. package/dist/runtime/app/composables/runtime +1 -0
  255. package/dist/runtime/app/composables/runtime.d.ts +2 -0
  256. package/dist/runtime/app/composables/runtime.js +7 -0
  257. package/dist/runtime/app/composables/search +1 -0
  258. package/dist/runtime/app/composables/search.d.ts +58 -0
  259. package/dist/runtime/app/composables/search.js +321 -0
  260. package/dist/runtime/app/composables/site-data +1 -0
  261. package/dist/runtime/app/composables/site-data.d.ts +12 -0
  262. package/dist/runtime/app/composables/site-data.js +12 -0
  263. package/dist/runtime/app/composables/toc +1 -0
  264. package/dist/runtime/app/composables/toc.d.ts +10 -0
  265. package/dist/runtime/app/composables/toc.js +31 -0
  266. package/dist/runtime/app/composables/use-content +1 -0
  267. package/dist/runtime/app/composables/use-content.d.ts +188 -0
  268. package/dist/runtime/app/composables/use-content.js +307 -0
  269. package/dist/runtime/app/composables/useUnwrap +1 -0
  270. package/dist/runtime/app/composables/useUnwrap.d.ts +8 -0
  271. package/dist/runtime/app/composables/useUnwrap.js +35 -0
  272. package/dist/runtime/app/composables/utils +1 -0
  273. package/dist/runtime/app/composables/utils.d.ts +22 -0
  274. package/dist/runtime/app/composables/utils.js +76 -0
  275. package/dist/runtime/app/composables/web-socket +1 -0
  276. package/dist/runtime/app/composables/web-socket.d.ts +3 -0
  277. package/dist/runtime/app/composables/web-socket.js +65 -0
  278. package/dist/runtime/app/pages/content.d.vue.ts +3 -0
  279. package/dist/runtime/app/pages/content.vue +14 -0
  280. package/dist/runtime/app/pages/content.vue.d.ts +3 -0
  281. package/dist/runtime/app/plugins/markdown-components +1 -0
  282. package/dist/runtime/app/plugins/markdown-components.d.ts +2 -0
  283. package/dist/runtime/app/plugins/markdown-components.js +19 -0
  284. package/dist/runtime/app/plugins/ws +1 -0
  285. package/dist/runtime/app/plugins/ws.d.ts +2 -0
  286. package/dist/runtime/app/plugins/ws.js +7 -0
  287. package/dist/runtime/app.d.vue.ts +3 -0
  288. package/dist/runtime/app.vue +3 -0
  289. package/dist/runtime/app.vue.d.ts +3 -0
  290. package/dist/runtime/markdown/plugins +1 -0
  291. package/dist/runtime/markdown/plugins.d.ts +3 -0
  292. package/dist/runtime/markdown/plugins.js +39 -0
  293. package/dist/runtime/query/public-limits +1 -0
  294. package/dist/runtime/query/public-limits.d.ts +2 -0
  295. package/dist/runtime/query/public-limits.js +2 -0
  296. package/dist/runtime/query/resolve +1 -0
  297. package/dist/runtime/query/resolve.d.ts +5 -0
  298. package/dist/runtime/query/resolve.js +9 -0
  299. package/dist/runtime/query/routes +1 -0
  300. package/dist/runtime/query/routes.d.ts +33 -0
  301. package/dist/runtime/query/routes.js +21 -0
  302. package/dist/runtime/query/unified +1 -0
  303. package/dist/runtime/query/unified.d.ts +94 -0
  304. package/dist/runtime/query/unified.js +473 -0
  305. package/dist/runtime/server/api/cache +1 -0
  306. package/dist/runtime/server/api/cache.d.ts +8 -0
  307. package/dist/runtime/server/api/cache.js +26 -0
  308. package/dist/runtime/server/api/locales +1 -0
  309. package/dist/runtime/server/api/locales.d.ts +6 -0
  310. package/dist/runtime/server/api/locales.js +28 -0
  311. package/dist/runtime/server/api/navigation +1 -0
  312. package/dist/runtime/server/api/navigation.d.ts +2 -0
  313. package/dist/runtime/server/api/navigation.js +21 -0
  314. package/dist/runtime/server/api/query +1 -0
  315. package/dist/runtime/server/api/query.d.ts +2 -0
  316. package/dist/runtime/server/api/query.js +6 -0
  317. package/dist/runtime/server/api/revalidate +1 -0
  318. package/dist/runtime/server/api/revalidate.d.ts +6 -0
  319. package/dist/runtime/server/api/revalidate.js +156 -0
  320. package/dist/runtime/server/api/search +1 -0
  321. package/dist/runtime/server/api/search-index +1 -0
  322. package/dist/runtime/server/api/search-index.d.ts +2 -0
  323. package/dist/runtime/server/api/search-index.js +20 -0
  324. package/dist/runtime/server/api/search.d.ts +2 -0
  325. package/dist/runtime/server/api/search.js +40 -0
  326. package/dist/runtime/server/api/site-data +1 -0
  327. package/dist/runtime/server/api/site-data.d.ts +2 -0
  328. package/dist/runtime/server/api/site-data.js +22 -0
  329. package/dist/runtime/server/api/sitemap +1 -0
  330. package/dist/runtime/server/api/sitemap.d.ts +2 -0
  331. package/dist/runtime/server/api/sitemap.js +11 -0
  332. package/dist/runtime/server/cache-adapter +1 -0
  333. package/dist/runtime/server/cache-adapter.d.ts +2 -0
  334. package/dist/runtime/server/cache-adapter.js +11 -0
  335. package/dist/runtime/server/cache-adapters +1 -0
  336. package/dist/runtime/server/cache-adapters.d.ts +9 -0
  337. package/dist/runtime/server/cache-adapters.js +50 -0
  338. package/dist/runtime/server/cache-hints +1 -0
  339. package/dist/runtime/server/cache-hints.d.ts +5 -0
  340. package/dist/runtime/server/cache-hints.js +17 -0
  341. package/dist/runtime/server/collection-helpers +1 -0
  342. package/dist/runtime/server/collection-helpers.d.ts +13 -0
  343. package/dist/runtime/server/collection-helpers.js +99 -0
  344. package/dist/runtime/server/index +1 -0
  345. package/dist/runtime/server/index.d.ts +9 -0
  346. package/dist/runtime/server/index.js +15 -0
  347. package/dist/runtime/server/manifest +1 -0
  348. package/dist/runtime/server/manifest.d.ts +1 -0
  349. package/dist/runtime/server/manifest.js +1 -0
  350. package/dist/runtime/server/navigation +1 -0
  351. package/dist/runtime/server/navigation-query +1 -0
  352. package/dist/runtime/server/navigation-query.d.ts +4 -0
  353. package/dist/runtime/server/navigation-query.js +80 -0
  354. package/dist/runtime/server/navigation.d.ts +2 -0
  355. package/dist/runtime/server/navigation.js +9 -0
  356. package/dist/runtime/server/pagefind +1 -0
  357. package/dist/runtime/server/pagefind.d.ts +2 -0
  358. package/dist/runtime/server/pagefind.js +30 -0
  359. package/dist/runtime/server/plugins/cache +1 -0
  360. package/dist/runtime/server/plugins/cache.d.ts +2 -0
  361. package/dist/runtime/server/plugins/cache.js +17 -0
  362. package/dist/runtime/server/plugins/sitemap +1 -0
  363. package/dist/runtime/server/plugins/sitemap.d.ts +2 -0
  364. package/dist/runtime/server/plugins/sitemap.js +25 -0
  365. package/dist/runtime/server/preview +1 -0
  366. package/dist/runtime/server/preview.d.ts +1 -0
  367. package/dist/runtime/server/preview.js +1 -0
  368. package/dist/runtime/server/provider-query +1 -0
  369. package/dist/runtime/server/provider-query.d.ts +27 -0
  370. package/dist/runtime/server/provider-query.js +131 -0
  371. package/dist/runtime/server/provider-result +1 -0
  372. package/dist/runtime/server/provider-result.d.ts +10 -0
  373. package/dist/runtime/server/provider-result.js +30 -0
  374. package/dist/runtime/server/providers/filesystem +1 -0
  375. package/dist/runtime/server/providers/filesystem.d.ts +2 -0
  376. package/dist/runtime/server/providers/filesystem.js +47 -0
  377. package/dist/runtime/server/providers/index +1 -0
  378. package/dist/runtime/server/providers/index.d.ts +3 -0
  379. package/dist/runtime/server/providers/index.js +190 -0
  380. package/dist/runtime/server/query-api +1 -0
  381. package/dist/runtime/server/query-api.d.ts +28 -0
  382. package/dist/runtime/server/query-api.js +54 -0
  383. package/dist/runtime/server/query-executor +1 -0
  384. package/dist/runtime/server/query-executor.d.ts +4 -0
  385. package/dist/runtime/server/query-executor.js +121 -0
  386. package/dist/runtime/server/runtime-config +1 -0
  387. package/dist/runtime/server/runtime-config.d.ts +1 -0
  388. package/dist/runtime/server/runtime-config.js +1 -0
  389. package/dist/runtime/server/search +1 -0
  390. package/dist/runtime/server/search.d.ts +18 -0
  391. package/dist/runtime/server/search.js +134 -0
  392. package/dist/runtime/server/sitemap +1 -0
  393. package/dist/runtime/server/sitemap-provider +1 -0
  394. package/dist/runtime/server/sitemap-provider.d.ts +10 -0
  395. package/dist/runtime/server/sitemap-provider.js +11 -0
  396. package/dist/runtime/server/sitemap.d.ts +6 -0
  397. package/dist/runtime/server/sitemap.js +45 -0
  398. package/dist/runtime/server/storage +1 -0
  399. package/dist/runtime/server/storage-access +1 -0
  400. package/dist/runtime/server/storage-access.d.ts +1 -0
  401. package/dist/runtime/server/storage-access.js +9 -0
  402. package/dist/runtime/server/storage.d.ts +2 -0
  403. package/dist/runtime/server/storage.js +2 -0
  404. package/dist/runtime/server/validation +1 -0
  405. package/dist/runtime/server/validation.d.ts +1 -0
  406. package/dist/runtime/server/validation.js +6 -0
  407. package/dist/runtime/shared/search +1 -0
  408. package/dist/runtime/shared/search.d.ts +2 -0
  409. package/dist/runtime/shared/search.js +89 -0
  410. package/dist/runtime/transformers/component-resolver +1 -0
  411. package/dist/runtime/transformers/component-resolver.d.ts +10 -0
  412. package/dist/runtime/transformers/component-resolver.js +30 -0
  413. package/dist/runtime/transformers/csv/from-csv +1 -0
  414. package/dist/runtime/transformers/csv/from-csv.d.ts +1 -0
  415. package/dist/runtime/transformers/csv/from-csv.js +1 -0
  416. package/dist/runtime/transformers/csv/index +1 -0
  417. package/dist/runtime/transformers/csv/index.d.ts +1 -0
  418. package/dist/runtime/transformers/csv/index.js +1 -0
  419. package/dist/runtime/transformers/define +1 -0
  420. package/dist/runtime/transformers/define.d.ts +1 -0
  421. package/dist/runtime/transformers/define.js +1 -0
  422. package/dist/runtime/transformers/index +1 -0
  423. package/dist/runtime/transformers/index.d.ts +1 -0
  424. package/dist/runtime/transformers/index.js +1 -0
  425. package/dist/runtime/transformers/json +1 -0
  426. package/dist/runtime/transformers/json.d.ts +1 -0
  427. package/dist/runtime/transformers/json.js +1 -0
  428. package/dist/runtime/transformers/markdown +1 -0
  429. package/dist/runtime/transformers/markdown.d.ts +1 -0
  430. package/dist/runtime/transformers/markdown.js +1 -0
  431. package/dist/runtime/transformers/path-meta +1 -0
  432. package/dist/runtime/transformers/path-meta.d.ts +2 -0
  433. package/dist/runtime/transformers/path-meta.js +2 -0
  434. package/dist/runtime/transformers/utils +1 -0
  435. package/dist/runtime/transformers/utils.d.ts +1 -0
  436. package/dist/runtime/transformers/utils.js +1 -0
  437. package/dist/runtime/transformers/yaml +1 -0
  438. package/dist/runtime/transformers/yaml.d.ts +1 -0
  439. package/dist/runtime/transformers/yaml.js +1 -0
  440. package/dist/runtime/utils/content-components +1 -0
  441. package/dist/runtime/utils/content-components.d.ts +9 -0
  442. package/dist/runtime/utils/content-components.js +16 -0
  443. package/dist/runtime/utils/query +1 -0
  444. package/dist/runtime/utils/query.d.ts +5 -0
  445. package/dist/runtime/utils/query.js +18 -0
  446. package/dist/runtime/virtual/transformers.d.ts +4 -0
  447. package/dist/runtime/virtual.d.ts +7 -0
  448. package/dist/storage/cache +1 -0
  449. package/dist/storage/cache.d.ts +32 -0
  450. package/dist/storage/cache.js +42 -0
  451. package/dist/storage/content +1 -0
  452. package/dist/storage/content.d.ts +41 -0
  453. package/dist/storage/content.js +86 -0
  454. package/dist/storage/contents +1 -0
  455. package/dist/storage/contents.d.ts +5 -0
  456. package/dist/storage/contents.js +116 -0
  457. package/dist/storage/driver +1 -0
  458. package/dist/storage/driver.d.ts +28 -0
  459. package/dist/storage/driver.js +22 -0
  460. package/dist/storage/graph +1 -0
  461. package/dist/storage/graph.d.ts +3 -0
  462. package/dist/storage/graph.js +14 -0
  463. package/dist/storage/manifest +1 -0
  464. package/dist/storage/manifest.d.ts +18 -0
  465. package/dist/storage/manifest.js +68 -0
  466. package/dist/storage/references +1 -0
  467. package/dist/storage/references.d.ts +13 -0
  468. package/dist/storage/references.js +78 -0
  469. package/dist/storage/validation +1 -0
  470. package/dist/storage/validation.d.ts +46 -0
  471. package/dist/storage/validation.js +341 -0
  472. package/dist/testing/provider-contract +1 -0
  473. package/dist/testing/provider-contract.d.ts +31 -0
  474. package/dist/testing/provider-contract.js +237 -0
  475. package/dist/testing/provider-fixture +1 -0
  476. package/dist/testing/provider-fixture.d.ts +65 -0
  477. package/dist/testing/provider-fixture.js +606 -0
  478. package/dist/types/api +1 -0
  479. package/dist/types/api.d.ts +47 -0
  480. package/dist/types/api.js +1 -0
  481. package/dist/types/config +1 -0
  482. package/dist/types/config.d.ts +281 -0
  483. package/dist/types/config.js +28 -0
  484. package/dist/types/content +1 -0
  485. package/dist/types/content.d.ts +311 -0
  486. package/dist/types/content.js +1 -0
  487. package/dist/types/fields +1 -0
  488. package/dist/types/fields.d.ts +81 -0
  489. package/dist/types/fields.js +146 -0
  490. package/dist/types/index +1 -0
  491. package/dist/types/index.d.ts +6 -0
  492. package/dist/types/index.js +6 -0
  493. package/dist/types/module +1 -0
  494. package/dist/types/module.d.ts +428 -0
  495. package/dist/types/module.js +0 -0
  496. package/dist/types/picomatch.d.ts +8 -0
  497. package/dist/types/query +1 -0
  498. package/dist/types/query.d.ts +862 -0
  499. package/dist/types/query.js +1 -0
  500. package/dist/types/reference +1 -0
  501. package/dist/types/reference.d.ts +1 -0
  502. package/dist/types/reference.js +1 -0
  503. package/dist/types/runtime +1 -0
  504. package/dist/types/runtime.d.ts +45 -0
  505. package/dist/types/runtime.js +1 -0
  506. package/dist/types/search +1 -0
  507. package/dist/types/search.d.ts +64 -0
  508. package/dist/types/search.js +0 -0
  509. package/dist/types/virtual.d.ts +19 -0
  510. package/dist/types.d.mts +11 -0
  511. package/dist/web-types.json +466 -0
  512. package/package.json +135 -0
@@ -0,0 +1 @@
1
+ export * from './references.js'
@@ -0,0 +1,13 @@
1
+ import type { H3Event } from 'h3';
2
+ import type { ContentQueryBuilderParams } from '../types/query';
3
+ import type { ContentQueryResponse } from '../types/api';
4
+ export declare const withResolvedRefs: <T>(event: H3Event, content: T, requestedLocale?: string) => Promise<T>;
5
+ export declare const withResolvedRefsList: <T>(event: H3Event, items: T[], requestedLocale?: string) => Promise<T[]>;
6
+ export declare const withResolvedRefsQueryResponse: <T>(event: H3Event, response: ContentQueryResponse<T>, params: ContentQueryBuilderParams) => Promise<import("../types/api").ContentQueryCountResponse | {
7
+ result: T | T[] | undefined;
8
+ } | {
9
+ result: T | T[] | undefined;
10
+ skip: number;
11
+ limit: number;
12
+ total: number;
13
+ }>;
@@ -0,0 +1,78 @@
1
+ import { collectMarkdownRefLinks, parseRefLink } from "../core/references/resolve";
2
+ import { contentConfig } from "./driver.js";
3
+ import { getContentManifest, resolveVariant } from "./manifest.js";
4
+ const prefixLocaleRoute = (path, locale) => {
5
+ const defaultLocale = contentConfig().defaultLocale;
6
+ if (!locale || locale === defaultLocale) {
7
+ return path;
8
+ }
9
+ return path === "/" ? `/${locale}` : `/${locale}${path}`;
10
+ };
11
+ const resolveDocumentRefLinks = async (event, content, requestedLocale) => {
12
+ if (!content || content._type !== "markdown" || !content.body) {
13
+ return void 0;
14
+ }
15
+ const hrefs = collectMarkdownRefLinks(content.body);
16
+ if (!hrefs.length) {
17
+ return void 0;
18
+ }
19
+ const manifest = await getContentManifest(event);
20
+ const entries = await Promise.all(hrefs.map(async (href) => {
21
+ const parsed = parseRefLink(href);
22
+ if (!parsed) {
23
+ return null;
24
+ }
25
+ const canonicalKey = manifest.byRef[parsed.ref];
26
+ if (!canonicalKey) {
27
+ if (import.meta.dev) {
28
+ console.warn(`[content] Could not resolve markdown ref "${href}" in "${content._file || content._id}"`);
29
+ }
30
+ return [href, href];
31
+ }
32
+ const variant = await resolveVariant(event, canonicalKey, requestedLocale);
33
+ if (!variant?.path) {
34
+ if (import.meta.dev) {
35
+ console.warn(`[content] Could not resolve markdown ref "${href}" in "${content._file || content._id}"`);
36
+ }
37
+ return [href, href];
38
+ }
39
+ if (import.meta.dev && requestedLocale && variant.resolvedLocale && variant.resolvedLocale !== requestedLocale) {
40
+ console.warn(`[content] Markdown ref "${href}" in "${content._file || content._id}" fell back from locale "${requestedLocale}" to "${variant.resolvedLocale}"`);
41
+ }
42
+ return [href, `${prefixLocaleRoute(variant.path, variant.resolvedLocale)}${parsed.hash}`];
43
+ }));
44
+ const resolvedRefs = Object.fromEntries(entries.filter((entry) => Boolean(entry)));
45
+ return Object.keys(resolvedRefs).length ? resolvedRefs : void 0;
46
+ };
47
+ export const withResolvedRefs = async (event, content, requestedLocale) => {
48
+ if (!content || Array.isArray(content)) {
49
+ return content;
50
+ }
51
+ const resolvedRefs = await resolveDocumentRefLinks(event, content, requestedLocale);
52
+ if (!resolvedRefs) {
53
+ return content;
54
+ }
55
+ return {
56
+ ...content,
57
+ _resolvedRefs: resolvedRefs
58
+ };
59
+ };
60
+ export const withResolvedRefsList = async (event, items, requestedLocale) => {
61
+ return await Promise.all(items.map((item) => withResolvedRefs(event, item, requestedLocale)));
62
+ };
63
+ export const withResolvedRefsQueryResponse = async (event, response, params) => {
64
+ if (typeof response.result === "number") {
65
+ return response;
66
+ }
67
+ const requestedLocale = params.resolveLocale?.locale;
68
+ if (params.first) {
69
+ return {
70
+ ...response,
71
+ result: await withResolvedRefs(event, response.result, requestedLocale)
72
+ };
73
+ }
74
+ return {
75
+ ...response,
76
+ result: Array.isArray(response.result) ? await withResolvedRefsList(event, response.result, requestedLocale) : response.result
77
+ };
78
+ };
@@ -0,0 +1 @@
1
+ export * from './validation.js'
@@ -0,0 +1,46 @@
1
+ import type { ParsedContent } from '../types/content';
2
+ import type { ContentCollectionConfig } from '../types/config';
3
+ import { ContentError, type ContentErrorCode } from '../core/errors';
4
+ import { type Result } from '../core/result';
5
+ /**
6
+ * Build a `ContentError` with a consistent "Invalid content in <file>: <reason>"
7
+ * message format.
8
+ */
9
+ export declare function createContentError(code: ContentErrorCode, file: string, reason: string, details?: string, extraContext?: Record<string, unknown>): ContentError;
10
+ export declare const getCanonicalContentId: (document: ParsedContent, locales?: string[]) => string;
11
+ /**
12
+ * Validate a single document against its collection schema.
13
+ *
14
+ * - Non-strict collections: schema errors log `console.warn(...)` and the
15
+ * original document passes through.
16
+ * - Strict collections (default): schema errors produce a `SCHEMA_VALIDATION_FAILED`
17
+ * failure.
18
+ *
19
+ * Also chains into `validateNavigationDocument` for `_navigation: true` files,
20
+ * which can fail with `INVALID_NAVIGATION_YAML`.
21
+ */
22
+ export declare const validateCollectionDocument: (document: ParsedContent, collections?: Record<string, ContentCollectionConfig>) => Result<ParsedContent, ContentError>;
23
+ /**
24
+ * Graph-level invariants across a whole content tree.
25
+ *
26
+ * Checks, in order:
27
+ * 1. Translated-slug sibling conflicts (`TRANSLATED_SLUG_CONFLICT`, errors only; warns are logged in place)
28
+ * 2. Explicit `id` alignment across locale variants (`CONFLICTING_REFS`)
29
+ * 3. Explicit `id` uniqueness across unrelated content identities (`CONFLICTING_REFS`)
30
+ * 4. Explicit `ref` alignment across locale variants (`CONFLICTING_REFS`)
31
+ * 5. Duplicate canonical id / localized path per locale (`DUPLICATE_CANONICAL_ID` / `DUPLICATE_LOCALIZED_PATH`)
32
+ * 6. Cross-document ref uniqueness (`CONFLICTING_REFS`)
33
+ * 7. Invalid `ref` value shape (`INVALID_REF_VALUE`)
34
+ * 8. Unresolved content-reference links per collection schema (`SCHEMA_VALIDATION_FAILED`; non-strict: warn+pass)
35
+ *
36
+ * Returns `ok(undefined)` when every invariant holds. On the first failing
37
+ * invariant, returns `fail(ContentError)` — graph validation is fail-fast;
38
+ * this mirrors the old throw-on-first behavior while giving callers a typed
39
+ * code to branch on.
40
+ */
41
+ export declare const validateContentGraph: (contents: ParsedContent[], config: {
42
+ collections?: Record<string, ContentCollectionConfig>;
43
+ locales?: string[];
44
+ translatedSlugs?: boolean;
45
+ strictTranslatedSlugs?: boolean;
46
+ }) => Result<void, ContentError>;
@@ -0,0 +1,341 @@
1
+ import { buildReferenceTargets, normalizeReferenceValue } from "../core/references/resolve";
2
+ import { getObjectShape, getReferenceDescriptor, getSchemaDef, getSchemaTypeName, unwrapSchema } from "../core/references/schema";
3
+ import { collectTranslatedSlugValidationIssues } from "../features/localization/translated-slugs";
4
+ import { ContentError } from "../core/errors";
5
+ import { fail, ok } from "../core/result";
6
+ const hasSafeParse = (schema) => {
7
+ return Boolean(schema) && typeof schema.safeParse === "function";
8
+ };
9
+ const getCollectionConfig = (collectionName, collections = {}) => {
10
+ if (!collectionName) {
11
+ return void 0;
12
+ }
13
+ return collections?.[collectionName];
14
+ };
15
+ export function createContentError(code, file, reason, details, extraContext) {
16
+ return new ContentError(
17
+ code,
18
+ `Invalid content in ${file}${details ? ` (${details})` : ""}: ${reason}`,
19
+ { file, reason, ...details ? { details } : {}, ...extraContext || {} }
20
+ );
21
+ }
22
+ const collectReferenceIssues = (schema, value, resolveReference, issues, path = []) => {
23
+ const current = unwrapSchema(schema);
24
+ if (!current || typeof value === "undefined" || value === null) {
25
+ return;
26
+ }
27
+ const ref = getReferenceDescriptor(current);
28
+ if (ref) {
29
+ if (typeof value !== "string") {
30
+ issues.push(`${path.join(".") || "document"}: expected a string reference`);
31
+ return;
32
+ }
33
+ if (!resolveReference(value, ref.collection)) {
34
+ issues.push(`${path.join(".") || "document"}: unresolved reference "${value}"${ref.collection ? ` in collection "${ref.collection}"` : ""}`);
35
+ }
36
+ return;
37
+ }
38
+ if (getSchemaTypeName(current) === "ZodArray" && Array.isArray(value)) {
39
+ const def = getSchemaDef(current);
40
+ value.forEach((item, index) => collectReferenceIssues(def.element || def.type, item, resolveReference, issues, [...path, index]));
41
+ return;
42
+ }
43
+ if (getSchemaTypeName(current) === "ZodObject" && typeof value === "object") {
44
+ const shape = getObjectShape(current);
45
+ for (const [key, childSchema] of Object.entries(shape)) {
46
+ collectReferenceIssues(childSchema, value[key], resolveReference, issues, [...path, key]);
47
+ }
48
+ }
49
+ };
50
+ const internalDocumentFields = /* @__PURE__ */ new Set([
51
+ "_id",
52
+ "_file",
53
+ "_path",
54
+ "_type",
55
+ "_collection",
56
+ "_dir",
57
+ "_locale",
58
+ "_canonicalKey",
59
+ "_partial",
60
+ "_navigation",
61
+ "_draft",
62
+ "_stem",
63
+ "_extension",
64
+ "_resolvedLocale",
65
+ "_requestedLocale",
66
+ "_fallback",
67
+ "_availableLocales",
68
+ "_variantPaths",
69
+ "_resolvedRefs",
70
+ "_source",
71
+ "body",
72
+ "draft"
73
+ ]);
74
+ const toUserContentDocument = (document) => {
75
+ const userDocument = {};
76
+ for (const [key, value] of Object.entries(document)) {
77
+ if (!internalDocumentFields.has(key)) {
78
+ userDocument[key] = value;
79
+ }
80
+ }
81
+ return userDocument;
82
+ };
83
+ const validateNavigationDocument = (document) => {
84
+ if (!document._navigation) {
85
+ return ok(void 0);
86
+ }
87
+ const invalidFields = [];
88
+ if (typeof document.title !== "undefined" && typeof document.title !== "string") {
89
+ invalidFields.push("title must be a string");
90
+ }
91
+ if (typeof document.order !== "undefined" && typeof document.order !== "number") {
92
+ invalidFields.push("order must be a number");
93
+ }
94
+ if (typeof document.icon !== "undefined" && typeof document.icon !== "string" && document.icon !== false) {
95
+ invalidFields.push("icon must be a string or false");
96
+ }
97
+ if (typeof document.hidden !== "undefined" && typeof document.hidden !== "boolean") {
98
+ invalidFields.push("hidden must be a boolean");
99
+ }
100
+ if (typeof document.navigation !== "undefined" && typeof document.navigation !== "boolean" && typeof document.navigation !== "object") {
101
+ invalidFields.push("navigation must be false or an object");
102
+ }
103
+ if (typeof document.badge !== "undefined" && typeof document.badge !== "string" && typeof document.badge !== "object") {
104
+ invalidFields.push("badge must be a string or an object");
105
+ }
106
+ if (invalidFields.length) {
107
+ return fail(createContentError(
108
+ "INVALID_NAVIGATION_YAML",
109
+ document._file || document._id,
110
+ "malformed .navigation.yml",
111
+ invalidFields.join("; ")
112
+ ));
113
+ }
114
+ return ok(void 0);
115
+ };
116
+ export const getCanonicalContentId = (document, locales = []) => {
117
+ if (typeof document.id === "string" && document.id.length) {
118
+ return document.id;
119
+ }
120
+ if (typeof document._canonicalKey === "string" && document._canonicalKey.length) {
121
+ return document._canonicalKey;
122
+ }
123
+ const file = (document._file || "").replace(/^\/+/, "");
124
+ const parts = file.split("/").filter(Boolean);
125
+ const normalized = parts[0] && locales.includes(parts[0]) ? parts.slice(1) : parts;
126
+ return normalized.join("/").replace(/\.[^.]+$/, "");
127
+ };
128
+ export const validateCollectionDocument = (document, collections = {}) => {
129
+ const navigationResult = validateNavigationDocument(document);
130
+ if (!navigationResult.ok) {
131
+ return navigationResult;
132
+ }
133
+ if (!document._collection) {
134
+ return ok(document);
135
+ }
136
+ const collection = getCollectionConfig(document._collection, collections);
137
+ const schema = collection?.schema;
138
+ if (!hasSafeParse(schema)) {
139
+ return ok(document);
140
+ }
141
+ const parsed = schema.safeParse(toUserContentDocument(document));
142
+ if (parsed.success) {
143
+ return ok({
144
+ ...document,
145
+ ...parsed.data
146
+ });
147
+ }
148
+ const details = parsed.error.issues?.map((issue) => {
149
+ const path = issue.path?.length ? issue.path.join(".") : "document";
150
+ return `${path}: ${issue.message}`;
151
+ }).join("; ");
152
+ const message = `Invalid content in ${document._file || document._id}${details ? ` (${details})` : ""}`;
153
+ if (collection?.strict === false) {
154
+ console.warn(message);
155
+ return ok(document);
156
+ }
157
+ return fail(new ContentError(
158
+ "SCHEMA_VALIDATION_FAILED",
159
+ message,
160
+ {
161
+ file: document._file || document._id,
162
+ collection: document._collection,
163
+ ...details ? { details } : {}
164
+ }
165
+ ));
166
+ };
167
+ export const validateContentGraph = (contents, config) => {
168
+ const locales = config.locales || [];
169
+ const docs = contents.filter((content) => content && content._path);
170
+ const routeEntries = docs.filter((content) => !content._partial && !content._navigation);
171
+ const markdownEntries = routeEntries.filter((content) => content._type === "markdown");
172
+ const idsByLocale = /* @__PURE__ */ new Map();
173
+ const pathsByLocale = /* @__PURE__ */ new Map();
174
+ const referenceTargets = buildReferenceTargets(routeEntries, locales);
175
+ const targetCollections = /* @__PURE__ */ new Map();
176
+ const variantsByCanonicalKey = /* @__PURE__ */ new Map();
177
+ const markdownVariantsByCanonicalKey = /* @__PURE__ */ new Map();
178
+ const explicitIdsByValue = /* @__PURE__ */ new Map();
179
+ const refsByValue = /* @__PURE__ */ new Map();
180
+ for (const document of routeEntries) {
181
+ const canonicalId = document._canonicalKey || getCanonicalContentId(document, locales);
182
+ if (!canonicalId || !document._collection) {
183
+ continue;
184
+ }
185
+ const collections = targetCollections.get(canonicalId) || /* @__PURE__ */ new Set();
186
+ collections.add(document._collection);
187
+ targetCollections.set(canonicalId, collections);
188
+ }
189
+ for (const issue of collectTranslatedSlugValidationIssues(markdownEntries, {
190
+ translatedSlugs: config.translatedSlugs,
191
+ locales
192
+ })) {
193
+ if (issue.level === "warn" && config.strictTranslatedSlugs) {
194
+ return fail(createContentError("TRANSLATED_SLUG_CONFLICT", issue.file, issue.reason, issue.details));
195
+ }
196
+ if (issue.level === "warn") {
197
+ console.warn(createContentError("INVALID_CONTENT", issue.file, issue.reason, issue.details).message);
198
+ continue;
199
+ }
200
+ return fail(createContentError("TRANSLATED_SLUG_CONFLICT", issue.file, issue.reason, issue.details));
201
+ }
202
+ for (const document of routeEntries) {
203
+ const variantKey = document._canonicalKey || getCanonicalContentId(document, locales);
204
+ const siblings = variantsByCanonicalKey.get(variantKey) || [];
205
+ siblings.push(document);
206
+ variantsByCanonicalKey.set(variantKey, siblings);
207
+ }
208
+ for (const document of markdownEntries) {
209
+ const variantKey = document._canonicalKey || getCanonicalContentId(document, locales);
210
+ const siblings = markdownVariantsByCanonicalKey.get(variantKey) || [];
211
+ siblings.push(document);
212
+ markdownVariantsByCanonicalKey.set(variantKey, siblings);
213
+ }
214
+ for (const [variantKey, variants] of variantsByCanonicalKey.entries()) {
215
+ const explicitIds = Array.from(new Set(variants.map((document) => typeof document.id === "string" && document.id.length ? document.id : void 0).filter((value) => Boolean(value))));
216
+ if (explicitIds.length > 1) {
217
+ return fail(createContentError(
218
+ "CONFLICTING_REFS",
219
+ variants[0]?._file || variants[0]?._id || variantKey,
220
+ `conflicting explicit ids across locale variants for canonical key "${variantKey}"`,
221
+ explicitIds.join(", ")
222
+ ));
223
+ }
224
+ if (explicitIds.length === 1 && variants.some((document) => document.id !== explicitIds[0])) {
225
+ return fail(createContentError(
226
+ "CONFLICTING_REFS",
227
+ variants[0]?._file || variants[0]?._id || variantKey,
228
+ `explicit id "${explicitIds[0]}" must be declared consistently across locale variants for canonical key "${variantKey}"`
229
+ ));
230
+ }
231
+ }
232
+ for (const document of routeEntries) {
233
+ const explicitId = typeof document.id === "string" && document.id.length ? document.id : void 0;
234
+ if (!explicitId) {
235
+ continue;
236
+ }
237
+ const variantKey = document._canonicalKey || getCanonicalContentId(document, locales);
238
+ const previous = explicitIdsByValue.get(explicitId);
239
+ if (previous && previous.variantKey !== variantKey) {
240
+ return fail(createContentError(
241
+ "CONFLICTING_REFS",
242
+ document._file || document._id,
243
+ `duplicate explicit id "${explicitId}"`,
244
+ `conflicts with ${previous.document._file || previous.document._id}`
245
+ ));
246
+ }
247
+ explicitIdsByValue.set(explicitId, { document, variantKey });
248
+ }
249
+ for (const [variantKey, variants] of markdownVariantsByCanonicalKey.entries()) {
250
+ const explicitRefs = Array.from(new Set(variants.map((document) => typeof document.ref === "string" && document.ref.length ? document.ref : void 0).filter((value) => Boolean(value))));
251
+ if (explicitRefs.length > 1) {
252
+ return fail(createContentError(
253
+ "CONFLICTING_REFS",
254
+ variants[0]?._file || variants[0]?._id || variantKey,
255
+ `conflicting refs across locale variants for canonical key "${variantKey}"`,
256
+ explicitRefs.join(", ")
257
+ ));
258
+ }
259
+ }
260
+ for (const document of routeEntries) {
261
+ const canonicalId = document._canonicalKey || getCanonicalContentId(document, locales);
262
+ const localeKey = `${canonicalId}:${document._locale || ""}`;
263
+ if (idsByLocale.has(localeKey)) {
264
+ const previous = idsByLocale.get(localeKey);
265
+ return fail(createContentError(
266
+ "DUPLICATE_CANONICAL_ID",
267
+ document._file || document._id,
268
+ `duplicate canonical id "${canonicalId}" for locale "${document._locale || "default"}"`,
269
+ `conflicts with ${previous._file || previous._id}`
270
+ ));
271
+ }
272
+ idsByLocale.set(localeKey, document);
273
+ const pathKey = `${document._locale || ""}:${document._path || ""}`;
274
+ if (pathsByLocale.has(pathKey)) {
275
+ const previous = pathsByLocale.get(pathKey);
276
+ return fail(createContentError(
277
+ "DUPLICATE_LOCALIZED_PATH",
278
+ document._file || document._id,
279
+ `duplicate localized path "${document._path}" for locale "${document._locale || "default"}"`,
280
+ `conflicts with ${previous._file || previous._id}`
281
+ ));
282
+ }
283
+ pathsByLocale.set(pathKey, document);
284
+ }
285
+ for (const document of markdownEntries) {
286
+ if (typeof document.ref !== "undefined" && (typeof document.ref !== "string" || !document.ref.length)) {
287
+ return fail(createContentError(
288
+ "INVALID_REF_VALUE",
289
+ document._file || document._id,
290
+ "ref must be a non-empty string"
291
+ ));
292
+ }
293
+ const ref = typeof document.ref === "string" && document.ref.length ? document.ref : void 0;
294
+ if (!ref) {
295
+ continue;
296
+ }
297
+ const previous = refsByValue.get(ref);
298
+ if (previous && (previous._canonicalKey || getCanonicalContentId(previous, locales)) !== (document._canonicalKey || getCanonicalContentId(document, locales))) {
299
+ return fail(createContentError(
300
+ "CONFLICTING_REFS",
301
+ document._file || document._id,
302
+ `duplicate ref "${ref}"`,
303
+ `conflicts with ${previous._file || previous._id}`
304
+ ));
305
+ }
306
+ refsByValue.set(ref, document);
307
+ }
308
+ for (const document of docs) {
309
+ if (!document._collection) {
310
+ continue;
311
+ }
312
+ const collection = getCollectionConfig(document._collection, config.collections);
313
+ const schema = collection?.schema;
314
+ if (!schema) {
315
+ continue;
316
+ }
317
+ const issues = [];
318
+ collectReferenceIssues(schema, document, (value, collection2) => {
319
+ const canonicalId = referenceTargets.get(normalizeReferenceValue(value));
320
+ if (!canonicalId) {
321
+ return false;
322
+ }
323
+ return collection2 ? targetCollections.get(canonicalId)?.has(collection2) === true : true;
324
+ }, issues);
325
+ if (!issues.length) {
326
+ continue;
327
+ }
328
+ const error = createContentError(
329
+ "SCHEMA_VALIDATION_FAILED",
330
+ document._file || document._id,
331
+ "unresolved content references",
332
+ issues.join("; ")
333
+ );
334
+ if (collection?.strict === false) {
335
+ console.warn(error.message);
336
+ continue;
337
+ }
338
+ return fail(error);
339
+ }
340
+ return ok(void 0);
341
+ };
@@ -0,0 +1 @@
1
+ export * from './provider-contract.js'
@@ -0,0 +1,31 @@
1
+ import { type ContentProvider } from '../public/provider';
2
+ export interface SaasProviderFixtureContractSuiteOptions {
3
+ name: string;
4
+ expectedProviderName: string;
5
+ loadProvider: () => Promise<ContentProvider>;
6
+ createEvent: () => any;
7
+ collectNavPaths?: (items: Array<{
8
+ _path?: string;
9
+ children?: any[];
10
+ }>) => string[];
11
+ }
12
+ export interface AuthorDependencyContractOptions {
13
+ name: string;
14
+ loadProvider: () => Promise<ContentProvider>;
15
+ createEvent: () => any;
16
+ getCacheEvents: (provider: ContentProvider) => Array<{
17
+ type: string;
18
+ key: string;
19
+ }>;
20
+ }
21
+ export declare const runSaasProviderFixtureContractSuite: ({ name, expectedProviderName, loadProvider, createEvent, collectNavPaths }: SaasProviderFixtureContractSuiteOptions) => void;
22
+ export declare const createAuthorDependencyContractProvider: () => {
23
+ fixture: import("./provider-fixture").ProviderFixture;
24
+ provider: ContentProvider & {
25
+ cache: import("./provider-fixture").ProviderFixtureCacheState;
26
+ };
27
+ createEvent: () => import("h3").H3Event<import("h3").EventHandlerRequest>;
28
+ getCacheEvents: () => import("./provider-fixture").ProviderFixtureCacheEvent[];
29
+ };
30
+ export declare const runAuthorDependencyContractTest: (options: AuthorDependencyContractOptions) => void;
31
+ export declare const runAuthorDependencyFixtureSelfTest: () => void;