@lupinum/ginko-content 0.1.6 → 0.2.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 (230) hide show
  1. package/compatibility.json +1 -1
  2. package/dist/cli.mjs +2 -2
  3. package/dist/cms-contract/build.js +15 -20
  4. package/dist/cms-contract/types.d.ts +12 -7
  5. package/dist/core/content/document +1 -0
  6. package/dist/core/content/document.d.ts +16 -0
  7. package/dist/core/content/document.js +2 -0
  8. package/dist/core/content/graph.d.ts +3 -1
  9. package/dist/core/content/graph.js +21 -20
  10. package/dist/core/content/locale.d.ts +6 -1
  11. package/dist/core/content/locale.js +17 -6
  12. package/dist/core/content/path.d.ts +5 -5
  13. package/dist/core/content/path.js +8 -8
  14. package/dist/core/content/snapshot +1 -0
  15. package/dist/core/content/snapshot.d.ts +25 -0
  16. package/dist/core/content/snapshot.js +99 -0
  17. package/dist/core/provider-errors.d.ts +1 -1
  18. package/dist/core/provider-errors.js +1 -0
  19. package/dist/core/query/builder.js +3 -3
  20. package/dist/core/query/execute.js +75 -36
  21. package/dist/core/query/filter.js +2 -2
  22. package/dist/core/query/lower.js +79 -3
  23. package/dist/core/query/params.js +7 -7
  24. package/dist/core/query/plan.d.ts +18 -0
  25. package/dist/core/query/plan.js +7 -0
  26. package/dist/core/references/resolve.js +6 -9
  27. package/dist/features/agent/agent-markdown +1 -0
  28. package/dist/features/agent/agent-markdown.d.ts +116 -0
  29. package/dist/features/agent/agent-markdown.js +138 -0
  30. package/dist/features/agent/walker +1 -0
  31. package/dist/features/agent/walker.d.ts +10 -0
  32. package/dist/features/agent/walker.js +174 -0
  33. package/dist/features/collections/resolve.d.ts +2 -2
  34. package/dist/features/collections/resolve.js +19 -16
  35. package/dist/features/localization/links.js +1 -1
  36. package/dist/features/localization/results.d.ts +3 -3
  37. package/dist/features/localization/results.js +46 -41
  38. package/dist/features/localization/translated-slugs.js +5 -5
  39. package/dist/features/navigation/build.d.ts +2 -2
  40. package/dist/features/navigation/build.js +23 -26
  41. package/dist/features/navigation/canonical.d.ts +10 -11
  42. package/dist/features/navigation/canonical.js +26 -21
  43. package/dist/features/navigation/resolve.js +4 -4
  44. package/dist/features/navigation/tree.js +3 -3
  45. package/dist/{runtime → features}/query/backlinks.js +3 -5
  46. package/dist/{runtime → features}/query/documents.js +1 -1
  47. package/dist/{runtime → features}/query/localized-docs.d.ts +1 -1
  48. package/dist/{runtime → features}/query/localized-docs.js +3 -6
  49. package/dist/{runtime → features}/query/navigation.d.ts +1 -1
  50. package/dist/{runtime → features}/query/navigation.js +8 -8
  51. package/dist/{runtime → features}/query/populate.js +6 -14
  52. package/dist/{runtime → features}/query/unified.d.ts +4 -4
  53. package/dist/{runtime → features}/query/unified.js +4 -2
  54. package/dist/{runtime → features}/query/variants.js +4 -4
  55. package/dist/features/search/navigation.js +2 -2
  56. package/dist/features/search/sections.d.ts +1 -1
  57. package/dist/features/search/sections.js +1 -1
  58. package/dist/features/sitemap/query.d.ts +5 -5
  59. package/dist/features/sitemap/query.js +6 -6
  60. package/dist/integrations/nitro/ingest.js +9 -20
  61. package/dist/integrations/nitro/storage.d.ts +1 -0
  62. package/dist/integrations/nitro/storage.js +22 -8
  63. package/dist/module.d.mts +135 -812
  64. package/dist/module.json +1 -1
  65. package/dist/module.mjs +70 -27
  66. package/dist/parsers/csv.js +3 -3
  67. package/dist/parsers/index.js +3 -3
  68. package/dist/parsers/json.js +8 -6
  69. package/dist/parsers/markdown-plugins.js +9 -5
  70. package/dist/parsers/markdown.js +7 -6
  71. package/dist/parsers/path-meta.js +21 -19
  72. package/dist/parsers/reserved +1 -0
  73. package/dist/parsers/reserved.d.ts +15 -0
  74. package/dist/parsers/reserved.js +35 -0
  75. package/dist/parsers/yaml.js +6 -4
  76. package/dist/public/agent +1 -0
  77. package/dist/public/agent.d.ts +17 -0
  78. package/dist/public/agent.js +34 -0
  79. package/dist/public/client.d.ts +2 -3
  80. package/dist/public/client.js +1 -2
  81. package/dist/public/provider-query +1 -0
  82. package/dist/public/provider-query.d.ts +58 -0
  83. package/dist/public/provider-query.js +5 -0
  84. package/dist/public/provider.d.ts +8 -3
  85. package/dist/public/provider.js +2 -0
  86. package/dist/public/server.d.ts +7 -12
  87. package/dist/public/server.js +5 -36
  88. package/dist/runtime/app/components/ContentRenderer.d.vue.ts +3 -3
  89. package/dist/runtime/app/components/ContentRenderer.vue +2 -2
  90. package/dist/runtime/app/components/ContentRenderer.vue.d.ts +3 -3
  91. package/dist/runtime/app/components/ContentRendererInline.d.vue.ts +1 -1
  92. package/dist/runtime/app/components/ContentRendererInline.vue.d.ts +1 -1
  93. package/dist/runtime/app/components/Prose/ProseImg.d.vue.ts +4 -4
  94. package/dist/runtime/app/components/Prose/ProseImg.vue.d.ts +4 -4
  95. package/dist/runtime/app/components/Prose/ProsePre.d.vue.ts +1 -1
  96. package/dist/runtime/app/components/Prose/ProsePre.vue.d.ts +1 -1
  97. package/dist/runtime/app/components/internal/ContentRendererMarkdown.d.vue.ts +1 -1
  98. package/dist/runtime/app/components/internal/ContentRendererMarkdown.vue +4 -4
  99. package/dist/runtime/app/components/internal/ContentRendererMarkdown.vue.d.ts +1 -1
  100. package/dist/runtime/app/components/internal/MarkdownRenderer.d.ts +3 -3
  101. package/dist/runtime/app/composables/preview.d.ts +1 -1
  102. package/dist/runtime/app/composables/query-api.d.ts +5 -5
  103. package/dist/runtime/app/composables/query-api.js +5 -3
  104. package/dist/runtime/app/composables/route.d.ts +1 -1
  105. package/dist/runtime/app/composables/route.js +4 -4
  106. package/dist/runtime/app/composables/search.js +1 -1
  107. package/dist/runtime/app/composables/use-content-document.js +1 -1
  108. package/dist/runtime/app/composables/use-content-list.js +1 -1
  109. package/dist/runtime/app/composables/use-content-navigation.js +2 -2
  110. package/dist/runtime/app/composables/use-content-page.js +4 -4
  111. package/dist/runtime/app/pages/content.vue +2 -1
  112. package/dist/runtime/markdown/plugins.js +6 -8
  113. package/dist/runtime/server/agent-markdown.d.ts +5 -65
  114. package/dist/runtime/server/agent-markdown.js +40 -315
  115. package/dist/runtime/server/agent-site.js +1 -1
  116. package/dist/runtime/server/api/agent-raw.js +1 -1
  117. package/dist/runtime/server/api/cache.d.ts +1 -1
  118. package/dist/runtime/server/api/cache.js +43 -4
  119. package/dist/runtime/server/api/locales.js +3 -3
  120. package/dist/runtime/server/api/navigation.d.ts +1 -1
  121. package/dist/runtime/server/api/navigation.js +3 -1
  122. package/dist/runtime/server/api/query.js +2 -2
  123. package/dist/runtime/server/api/search-index.d.ts +1 -1
  124. package/dist/runtime/server/api/sitemap.d.ts +1 -1
  125. package/dist/runtime/server/cache-adapters.d.ts +18 -0
  126. package/dist/runtime/server/cache-adapters.js +12 -0
  127. package/dist/runtime/server/collection-helpers.d.ts +2 -2
  128. package/dist/runtime/server/collection-helpers.js +15 -11
  129. package/dist/runtime/server/index.d.ts +6 -4
  130. package/dist/runtime/server/index.js +10 -3
  131. package/dist/runtime/server/middleware/agent-link-headers.js +1 -1
  132. package/dist/runtime/server/middleware/agent-markdown.js +1 -1
  133. package/dist/runtime/server/navigation-query.d.ts +2 -2
  134. package/dist/runtime/server/navigation-query.js +52 -7
  135. package/dist/runtime/server/navigation.d.ts +1 -1
  136. package/dist/runtime/server/provider-document +1 -0
  137. package/dist/runtime/server/provider-document.d.ts +59 -0
  138. package/dist/runtime/server/provider-document.js +48 -0
  139. package/dist/runtime/server/provider-query-wire +1 -0
  140. package/dist/runtime/server/provider-query-wire.d.ts +32 -0
  141. package/dist/runtime/server/provider-query-wire.js +27 -0
  142. package/dist/runtime/server/provider-query.d.ts +18 -9
  143. package/dist/runtime/server/provider-query.js +62 -28
  144. package/dist/runtime/server/provider-result.d.ts +4 -4
  145. package/dist/runtime/server/providers/filesystem.js +3 -11
  146. package/dist/runtime/server/providers/index.d.ts +18 -1
  147. package/dist/runtime/server/providers/index.js +72 -20
  148. package/dist/runtime/server/query-api.d.ts +5 -5
  149. package/dist/runtime/server/query-api.js +9 -6
  150. package/dist/runtime/server/query-executor.d.ts +3 -3
  151. package/dist/runtime/server/query-executor.js +43 -59
  152. package/dist/runtime/server/search.d.ts +1 -1
  153. package/dist/runtime/server/search.js +4 -4
  154. package/dist/runtime/server/sitemap.js +5 -5
  155. package/dist/runtime/server/storage-access.d.ts +4 -1
  156. package/dist/runtime/server/storage-access.js +27 -2
  157. package/dist/runtime/transformers/component-resolver.d.ts +1 -1
  158. package/dist/storage/content.d.ts +2 -6
  159. package/dist/storage/content.js +19 -8
  160. package/dist/storage/contents.d.ts +9 -1
  161. package/dist/storage/contents.js +26 -19
  162. package/dist/storage/driver.d.ts +2 -2
  163. package/dist/storage/driver.js +2 -1
  164. package/dist/storage/graph.js +4 -0
  165. package/dist/storage/manifest.js +3 -1
  166. package/dist/storage/references.js +9 -5
  167. package/dist/storage/snapshot-runtime +1 -0
  168. package/dist/storage/snapshot-runtime.d.ts +11 -0
  169. package/dist/storage/snapshot-runtime.js +46 -0
  170. package/dist/storage/validation.d.ts +1 -1
  171. package/dist/storage/validation.js +47 -102
  172. package/dist/testing/provider-contract.d.ts +14 -4
  173. package/dist/testing/provider-contract.js +121 -68
  174. package/dist/testing/provider-fixture.d.ts +1 -1
  175. package/dist/testing/provider-fixture.js +124 -120
  176. package/dist/types/config.d.ts +8 -4
  177. package/dist/types/content.d.ts +104 -70
  178. package/dist/types/fields.js +1 -1
  179. package/dist/types/module.d.ts +1 -1
  180. package/dist/types/query-parts/public.d.ts +14 -5
  181. package/dist/types/query-parts/results.d.ts +6 -2
  182. package/dist/types/query-parts/transport.d.ts +19 -0
  183. package/dist/types/virtual.d.ts +6 -0
  184. package/dist/types.d.mts +2 -2
  185. package/dist/web-types.json +1 -1
  186. package/package.json +39 -9
  187. package/dist/runtime/app/plugins/markdown-components +0 -1
  188. package/dist/runtime/app/plugins/markdown-components.d.ts +0 -2
  189. package/dist/runtime/app/plugins/markdown-components.js +0 -19
  190. /package/dist/{runtime → features/agent}/agent-paths +0 -0
  191. /package/dist/{runtime → features/agent}/agent-paths.d.ts +0 -0
  192. /package/dist/{runtime → features/agent}/agent-paths.js +0 -0
  193. /package/dist/{runtime → features}/query/backlinks +0 -0
  194. /package/dist/{runtime → features}/query/backlinks.d.ts +0 -0
  195. /package/dist/{runtime → features}/query/context +0 -0
  196. /package/dist/{runtime → features}/query/context.d.ts +0 -0
  197. /package/dist/{runtime → features}/query/context.js +0 -0
  198. /package/dist/{runtime → features}/query/documents +0 -0
  199. /package/dist/{runtime → features}/query/documents.d.ts +0 -0
  200. /package/dist/{runtime → features}/query/errors +0 -0
  201. /package/dist/{runtime → features}/query/errors.d.ts +0 -0
  202. /package/dist/{runtime → features}/query/errors.js +0 -0
  203. /package/dist/{runtime → features}/query/handles +0 -0
  204. /package/dist/{runtime → features}/query/handles.d.ts +0 -0
  205. /package/dist/{runtime → features}/query/handles.js +0 -0
  206. /package/dist/{runtime → features}/query/locale-options +0 -0
  207. /package/dist/{runtime → features}/query/locale-options.d.ts +0 -0
  208. /package/dist/{runtime → features}/query/locale-options.js +0 -0
  209. /package/dist/{runtime → features}/query/localized-docs +0 -0
  210. /package/dist/{runtime → features}/query/navigation +0 -0
  211. /package/dist/{runtime → features}/query/pagination +0 -0
  212. /package/dist/{runtime → features}/query/pagination.d.ts +0 -0
  213. /package/dist/{runtime → features}/query/pagination.js +0 -0
  214. /package/dist/{runtime → features}/query/populate +0 -0
  215. /package/dist/{runtime → features}/query/populate.d.ts +0 -0
  216. /package/dist/{runtime → features}/query/public-limits +0 -0
  217. /package/dist/{runtime → features}/query/public-limits.d.ts +0 -0
  218. /package/dist/{runtime → features}/query/public-limits.js +0 -0
  219. /package/dist/{runtime → features}/query/resolve +0 -0
  220. /package/dist/{runtime → features}/query/resolve.d.ts +0 -0
  221. /package/dist/{runtime → features}/query/resolve.js +0 -0
  222. /package/dist/{runtime → features}/query/responses +0 -0
  223. /package/dist/{runtime → features}/query/responses.d.ts +0 -0
  224. /package/dist/{runtime → features}/query/responses.js +0 -0
  225. /package/dist/{runtime → features}/query/routes +0 -0
  226. /package/dist/{runtime → features}/query/routes.d.ts +0 -0
  227. /package/dist/{runtime → features}/query/routes.js +0 -0
  228. /package/dist/{runtime → features}/query/unified +0 -0
  229. /package/dist/{runtime → features}/query/variants +0 -0
  230. /package/dist/{runtime → features}/query/variants.d.ts +0 -0
package/dist/module.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lupinum/ginko-content",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "configKey": "content",
5
5
  "compatibility": {
6
6
  "nuxt": ">=4.0.0"
package/dist/module.mjs CHANGED
@@ -22,15 +22,16 @@ import { transformContent } from '../dist/parsers/index';
22
22
  import { resolveCollectionI18n, prefixPathWithLocale } from '../dist/features/localization/path';
23
23
  import { resolveContentSitemapSource, GINKO_SITEMAP_SOURCE_NAME } from '../dist/runtime/utils/sitemap-source';
24
24
  import { normalizeRouteMounts, normalizeContentPath } from '../dist/core/content/path';
25
- import { mkdirSync, writeFileSync } from 'node:fs';
25
+ import { mkdirSync, writeFileSync, readFileSync } from 'node:fs';
26
26
  import { pathToFileURL } from 'node:url';
27
+ import { isContentSnapshot } from '../dist/core/content/snapshot';
27
28
  import { withTrailingSlash } from 'ufo';
28
29
  import { normalizeContentConfigCollectionNames } from '../dist/types/config';
29
30
  export { agentMetadataFields, defineAgentAppPage, defineAgentMarkdownPolicy, defineAgentMetadataFields, defineAgentSection, defineCollection, defineContentConfig, reference } from '../dist/types/config';
30
31
  import { collectTopLevelReferenceFieldsByTarget } from '../dist/core/references/schema';
31
32
 
32
33
  const name = "@lupinum/ginko-content";
33
- const version = "0.1.6";
34
+ const version = "0.2.0";
34
35
 
35
36
  const CONFIG_FILES = [
36
37
  "content.config.ts",
@@ -52,13 +53,13 @@ async function loadContentConfig(nuxt) {
52
53
  return loaded?.default || loaded || {};
53
54
  }
54
55
 
55
- const createVirtualContentTemplates = (contentContext, nuxt, _contentConfigPath, addTemplateImpl) => {
56
+ const createVirtualContentTemplates = (contentContext, nuxt, contentConfigPath, addTemplateImpl) => {
56
57
  const transformersTemplate = addTemplateImpl({
57
58
  filename: "content/virtual-transformers.mjs",
58
59
  write: true,
59
60
  getContents: () => {
60
61
  const transformers = contentContext.transformers.map((transformer) => {
61
- const name = genSafeVariableName(relative(nuxt.options.rootDir, transformer)).replace(/_(45|46|47)/g, "_") + "_" + hash(transformer);
62
+ const name = genSafeVariableName(relative(nuxt.options.rootDir, transformer)).replace(/_(45|46|47)/g, "_") + "_" + hash(transformer).replace(/[^a-z0-9_$]/gi, "_");
62
63
  return { name, import: genImport(transformer, name) };
63
64
  });
64
65
  return [
@@ -73,7 +74,15 @@ const createVirtualContentTemplates = (contentContext, nuxt, _contentConfigPath,
73
74
  const virtualConfigTemplate = addTemplateImpl({
74
75
  filename: "content/virtual-config.mjs",
75
76
  write: true,
76
- getContents: () => "export default {}"
77
+ getContents: () => {
78
+ if (!contentConfigPath) {
79
+ return "export default {}";
80
+ }
81
+ return [
82
+ `import config from ${JSON.stringify(contentConfigPath)}`,
83
+ "export default config"
84
+ ].join("\n");
85
+ }
77
86
  }).dst;
78
87
  const virtualProvidersTemplate = addTemplateImpl({
79
88
  filename: "content/virtual-providers.mjs",
@@ -257,10 +266,14 @@ const generatedContentServerValueNames = [
257
266
  "contentCacheHeaders",
258
267
  "noopContentCache",
259
268
  "vercelContentCache",
269
+ "headersContentCache",
260
270
  "clearContentCacheHint",
261
271
  "collectContentCacheHint",
262
272
  "getContentCacheHint",
263
273
  "withContentCache",
274
+ "PROVIDER_QUERY_VERSION",
275
+ "toContentProviderQuery",
276
+ "toContentProviderNavigationQuery",
264
277
  "createContentProviderError"
265
278
  ];
266
279
  const generatedContentServerTypeSpecs = [
@@ -270,6 +283,8 @@ const generatedContentServerTypeSpecs = [
270
283
  { local: "ContentCacheInvalidateInput", exported: "ContentCacheInvalidateInput" },
271
284
  { local: "ContentProvider", exported: "ContentProvider" },
272
285
  { local: "ContentProviderCapabilities", exported: "ContentProviderCapabilities" },
286
+ { local: "ContentProviderQuery", exported: "ContentProviderQuery" },
287
+ { local: "ContentProviderNavigationOptions", exported: "ContentProviderNavigationOptions" },
273
288
  { local: "ContentProviderResult<T>", exported: "ContentProviderResult<T>" },
274
289
  { local: "MaybeContentProviderResult<T>", exported: "MaybeContentProviderResult<T>" },
275
290
  { local: "ContentProviderErrorCode", exported: "ContentProviderErrorCode" },
@@ -390,11 +405,12 @@ const registerGeneratedTypes = (contentConfigPath, resolveRuntimeModuleRoot, col
390
405
  const key = JSON.stringify(name);
391
406
  return ` ${key}: StrictParsedContent & __GeneratedCollectionSchema<__ContentCollectionExport<${key}>>`;
392
407
  });
408
+ const serverModuleLiteral = JSON.stringify(resolveRuntimeModuleRoot("./server"));
393
409
  const contentServerValueDeclarations = generatedContentServerValueNames.map(
394
- (name) => ` const ${name}: typeof import('${resolveRuntimeModuleRoot("./server")}').${name}`
410
+ (name) => ` const ${name}: typeof import(${serverModuleLiteral}).${name}`
395
411
  );
396
412
  const contentServerTypeDeclarations = generatedContentServerTypeSpecs.map(
397
- (spec) => ` type ${spec.local} = import('${resolveRuntimeModuleRoot("./server")}').${spec.exported}`
413
+ (spec) => ` type ${spec.local} = import(${serverModuleLiteral}).${spec.exported}`
398
414
  );
399
415
  return addTypeTemplate({
400
416
  filename: "types/content.d.ts",
@@ -632,7 +648,7 @@ const registerContentComponentsTemplate = (addTemplateImpl) => {
632
648
  const pathLiteral = JSON.stringify(path);
633
649
  const exportLiteral = JSON.stringify(exp);
634
650
  const nameLiteral = JSON.stringify(pascalName);
635
- return ` ${pascalName}: () => import(${pathLiteral}).then(mod => pickExport(mod, ${exportLiteral}, ${nameLiteral}, ${pathLiteral})),`;
651
+ return ` ${nameLiteral}: () => import(${pathLiteral}).then(mod => pickExport(mod, ${exportLiteral}, ${nameLiteral}, ${pathLiteral})),`;
636
652
  }),
637
653
  "}",
638
654
  `export const globalComponents = ${JSON.stringify(globalComponents)}`,
@@ -888,7 +904,7 @@ const parseDerivedCollectionFiles = async (rootDir, collections, collectionNames
888
904
  collectionResolver: (filePath) => resolveCollection(filePath, collections, contentContext.locales || [])
889
905
  }
890
906
  });
891
- const collection = typeof parsed._collection === "string" ? collections[parsed._collection] : void 0;
907
+ const collection = typeof parsed.collection === "string" ? collections[parsed.collection] : void 0;
892
908
  documents.push(...expandDataLocaleVariants(parsed, collection?.i18n === true ? void 0 : collection?.i18n));
893
909
  }
894
910
  return documents;
@@ -921,17 +937,17 @@ const collectDerivedPrerenderRoutes = async (rootDir, contentContext) => {
921
937
  const seenCanonicalKeys = /* @__PURE__ */ new Set();
922
938
  for (const contentId of graph.byCollection[collection] || []) {
923
939
  const document = graph.byId[contentId];
924
- if (!document || !document._canonicalKey || document._partial || document._navigation) {
940
+ if (!document || !document.canonicalKey || document.partial || document.navigationFile) {
925
941
  continue;
926
942
  }
927
- if (document._draft && !includeDrafts) {
943
+ if (document.draft && !includeDrafts) {
928
944
  continue;
929
945
  }
930
- if (seenCanonicalKeys.has(document._canonicalKey)) {
946
+ if (seenCanonicalKeys.has(document.canonicalKey)) {
931
947
  continue;
932
948
  }
933
- seenCanonicalKeys.add(document._canonicalKey);
934
- const variants = graph.byCanonical[document._canonicalKey] || {};
949
+ seenCanonicalKeys.add(document.canonicalKey);
950
+ const variants = graph.byCanonical[document.canonicalKey] || {};
935
951
  for (const [locale, variant] of Object.entries(variants)) {
936
952
  if (!variant.path) {
937
953
  continue;
@@ -954,20 +970,20 @@ const collectSitemapCollectionRouteCounts = async (rootDir, contentContext) => {
954
970
  const seenCanonicalKeys = /* @__PURE__ */ new Set();
955
971
  for (const contentId of graph.byCollection[collection] || []) {
956
972
  const document = graph.byId[contentId];
957
- if (!document || !document._canonicalKey || document._partial || document._navigation) {
973
+ if (!document || !document.canonicalKey || document.partial || document.navigationFile) {
958
974
  continue;
959
975
  }
960
- if (document._draft && !includeDrafts) {
976
+ if (document.draft && !includeDrafts) {
961
977
  continue;
962
978
  }
963
- if (seenCanonicalKeys.has(document._canonicalKey)) {
979
+ if (seenCanonicalKeys.has(document.canonicalKey)) {
964
980
  continue;
965
981
  }
966
- const variants = Object.values(graph.byCanonical[document._canonicalKey] || {});
982
+ const variants = Object.values(graph.byCanonical[document.canonicalKey] || {});
967
983
  if (!variants.some((variant) => variant.path)) {
968
984
  continue;
969
985
  }
970
- seenCanonicalKeys.add(document._canonicalKey);
986
+ seenCanonicalKeys.add(document.canonicalKey);
971
987
  counts[collection] += 1;
972
988
  }
973
989
  }
@@ -1132,13 +1148,23 @@ function normalizeSearchOptions(options) {
1132
1148
  return {
1133
1149
  engine: options.search?.engine || "minisearch",
1134
1150
  ignoredTags: options.search?.ignoredTags || ["script", "style", "pre"],
1135
- filterQuery: options.search?.filterQuery || { _draft: false, _partial: false },
1151
+ filterQuery: options.search?.filterQuery || { draft: false, partial: false },
1136
1152
  collections: options.search?.collections,
1137
1153
  extraFields: options.search?.extraFields || [],
1138
1154
  apiBaseURL: options.search?.apiBaseURL,
1139
1155
  minisearch: normalizeMiniSearchOptions(options.search?.minisearch)
1140
1156
  };
1141
1157
  }
1158
+ async function assertPagefindAvailable(search, importPagefind = () => import('pagefind')) {
1159
+ if (search === false || search.engine !== "pagefind") {
1160
+ return;
1161
+ }
1162
+ try {
1163
+ await importPagefind();
1164
+ } catch {
1165
+ throw new Error('Content search engine "pagefind" is enabled but the optional "pagefind" package is not installed. Install it: pnpm add -D pagefind');
1166
+ }
1167
+ }
1142
1168
  const defaultMiniSearchOptions = {
1143
1169
  fields: ["title", "content", "headings"],
1144
1170
  storeFields: ["path", "title", "excerpt", "anchor", "locale", "collection"],
@@ -1328,6 +1354,19 @@ const collectRawMarkdownRoutesFromGeneratedFrontmatter = (markdown) => {
1328
1354
  };
1329
1355
  const publicOutputPath = (publicDir, route) => join(publicDir, normalizeStaticRoutePath(route).replace(/^\//, ""));
1330
1356
 
1357
+ const assertPrerenderedContentSnapshot = (buildDir) => {
1358
+ const snapshotPath = resolve$1(buildDir, "content-cache/snapshot.json");
1359
+ let raw;
1360
+ try {
1361
+ raw = readFileSync(snapshotPath, "utf8");
1362
+ } catch {
1363
+ throw new Error("[content] production snapshot missing from prerendered content cache. Ensure the content cache route is prerendered.");
1364
+ }
1365
+ const snapshot = JSON.parse(raw);
1366
+ if (!isContentSnapshot(snapshot)) {
1367
+ throw new Error("[content] production snapshot is invalid in prerendered content cache.");
1368
+ }
1369
+ };
1331
1370
  const hookNuxtBoundary$2 = (nuxt, name, callback) => {
1332
1371
  const hook = nuxt.hook;
1333
1372
  hook(name, callback);
@@ -1343,6 +1382,12 @@ const registerStaticOutputGeneration = ({
1343
1382
  }) => {
1344
1383
  if (nuxt.options.dev) return;
1345
1384
  hookNuxtBoundary$2(nuxt, "nitro:build:before", (nitro) => {
1385
+ const usesFilesystemProvider = !contentContext.provider || contentContext.provider === "filesystem";
1386
+ if (usesFilesystemProvider) {
1387
+ nitro.hooks.hook("prerender:done", () => {
1388
+ assertPrerenderedContentSnapshot(nuxt.options.buildDir);
1389
+ });
1390
+ }
1346
1391
  nitro.hooks.hook("prerender:init", (prerenderer) => {
1347
1392
  prerenderer.hooks.hook("compiled", async () => {
1348
1393
  const searchRuntime = getSearchRuntime();
@@ -1350,7 +1395,7 @@ const registerStaticOutputGeneration = ({
1350
1395
  const serverFilename = typeof prerenderer.options.rollupConfig?.output?.entryFileNames === "string" ? prerenderer.options.rollupConfig.output.entryFileNames : "index.mjs";
1351
1396
  const serverEntrypoint = resolve$1(prerenderer.options.output.serverDir, serverFilename);
1352
1397
  const { localFetch } = await import(pathToFileURL(serverEntrypoint).href);
1353
- if (searchRuntime !== false && searchRuntime.engine !== "cms" && (!contentContext.provider || contentContext.provider === "filesystem")) {
1398
+ if (searchRuntime !== false && searchRuntime.engine !== "cms" && usesFilesystemProvider) {
1354
1399
  const response = await localFetch(searchRuntime.indexURL);
1355
1400
  if (!response.ok) {
1356
1401
  throw new Error(`Failed to generate search index: [${response.status}] ${response.statusText}`);
@@ -1553,7 +1598,7 @@ const contentModuleDefaults = {
1553
1598
  search: {
1554
1599
  engine: "minisearch",
1555
1600
  ignoredTags: ["script", "style", "pre"],
1556
- filterQuery: { _draft: false, _partial: false },
1601
+ filterQuery: { draft: false, partial: false },
1557
1602
  extraFields: [],
1558
1603
  minisearch: {
1559
1604
  fields: [...defaultMiniSearchOptions.fields],
@@ -1808,12 +1853,9 @@ const registerContentContextFinalization = ({
1808
1853
  return [name, runtimeCollection, collection];
1809
1854
  });
1810
1855
  const runtimeCollections = Object.fromEntries(collectionEntries.map(([name, runtimeCollection]) => [name, runtimeCollection]));
1811
- const privateRuntimeCollections = Object.fromEntries(collectionEntries.map(([name, runtimeCollection, collection]) => [
1856
+ const privateRuntimeCollections = Object.fromEntries(collectionEntries.map(([name, runtimeCollection]) => [
1812
1857
  name,
1813
- {
1814
- ...runtimeCollection,
1815
- ...nuxt.options.dev && collection.schema ? { schema: collection.schema } : {}
1816
- }
1858
+ runtimeCollection
1817
1859
  ]));
1818
1860
  const cacheIntegrity = hash({
1819
1861
  locales: resolvedContentContext.locales,
@@ -1883,6 +1925,7 @@ const module$1 = defineNuxtModule({
1883
1925
  const resolvedI18n = resolveModuleI18nOptions(options, nuxt);
1884
1926
  const resolvedSitemap = normalizeSitemapOptions(options);
1885
1927
  const resolvedSearch = normalizeSearchOptions(options);
1928
+ await assertPagefindAvailable(resolvedSearch);
1886
1929
  validateCollectionNames(appContentConfig.collections);
1887
1930
  if (!hasAgentSurface(appContentConfig)) {
1888
1931
  options.agent = false;
@@ -22,7 +22,7 @@ function toJsonArray(tree) {
22
22
  export default defineTransformer({
23
23
  name: "csv",
24
24
  extensions: [".csv"],
25
- parse: async (_id, content, options = {}) => {
25
+ parse: async (id, content, options = {}) => {
26
26
  const csvOptions = typeof options === "object" && options !== null ? options : {};
27
27
  const tree = fromCSV(String(content ?? ""), {
28
28
  delimiter: ",",
@@ -31,8 +31,8 @@ export default defineTransformer({
31
31
  });
32
32
  const result = csvOptions.json === false ? toJsonArray(tree) : toJsonObject(tree);
33
33
  return {
34
- _id,
35
- _type: "csv",
34
+ id,
35
+ type: "csv",
36
36
  body: result
37
37
  };
38
38
  }
@@ -27,15 +27,15 @@ function getTransformers(ext, additionalTransformers = []) {
27
27
  }
28
28
  export async function transformContent(id, content, options = {}) {
29
29
  const { transformers = [] } = options;
30
- const file = { _id: id, body: content };
30
+ const file = { id, body: content };
31
31
  const ext = extname(id);
32
32
  const parser = getParser(ext, transformers);
33
33
  if (!parser) {
34
34
  console.warn(`${ext} files are not supported, "${id}" storing body as null`);
35
- return { _id: file._id, body: null };
35
+ return { id: file.id, body: null, missing: true };
36
36
  }
37
37
  const parserOptions = options[camelCase(parser.name)] || {};
38
- const parsed = await parser.parse(file._id, file.body, parserOptions);
38
+ const parsed = await parser.parse(file.id, file.body, parserOptions);
39
39
  const matchedTransformers = getTransformers(ext, transformers);
40
40
  const result = await matchedTransformers.reduce(async (prev, cur) => {
41
41
  const next = await prev || parsed;
@@ -1,29 +1,31 @@
1
1
  import { destr } from "destr";
2
2
  import { defineTransformer } from "./utils.js";
3
+ import { stripReservedContentKeys } from "./reserved.js";
3
4
  export default defineTransformer({
4
5
  name: "Json",
5
6
  extensions: [".json", ".json5"],
6
- parse: async (_id, content) => {
7
+ parse: async (id, content) => {
7
8
  let parsed;
8
9
  if (typeof content === "string") {
9
- if (_id.endsWith("json5")) {
10
+ if (id.endsWith("json5")) {
10
11
  parsed = (await import("json5").then((m) => m.default || m)).parse(content);
11
- } else if (_id.endsWith("json")) {
12
+ } else if (id.endsWith("json")) {
12
13
  parsed = destr(content);
13
14
  }
14
15
  } else {
15
16
  parsed = content;
16
17
  }
17
18
  if (Array.isArray(parsed)) {
18
- console.warn(`JSON array is not supported in ${_id}, moving the array into the \`body\` key`);
19
+ console.warn(`JSON array is not supported in ${id}, moving the array into the \`body\` key`);
19
20
  parsed = {
20
21
  body: parsed
21
22
  };
22
23
  }
24
+ parsed = stripReservedContentKeys(parsed, id);
23
25
  return {
24
26
  ...parsed,
25
- _id,
26
- _type: "json"
27
+ id,
28
+ type: "json"
27
29
  };
28
30
  }
29
31
  });
@@ -82,10 +82,10 @@ const resolveMarkdownPluginOptions = async (plugin) => {
82
82
  };
83
83
  const builtinMarkdownPlugins = {
84
84
  breaks: {
85
- load: () => loadModule("comark/plugins/breaks")
85
+ load: () => loadBuiltinModule(() => import("comark/plugins/breaks"))
86
86
  },
87
87
  emoji: {
88
- load: () => loadModule("comark/plugins/emoji")
88
+ load: () => loadBuiltinModule(() => import("comark/plugins/emoji"))
89
89
  },
90
90
  footnotes: {
91
91
  load: async () => footnotesPlugin
@@ -94,7 +94,7 @@ const builtinMarkdownPlugins = {
94
94
  load: async () => highlightPlugin
95
95
  },
96
96
  "json-render": {
97
- load: () => loadModule("comark/plugins/json-render")
97
+ load: () => loadBuiltinModule(() => import("comark/plugins/json-render"))
98
98
  },
99
99
  math: {
100
100
  load: () => loadModule("comark/plugins/math")
@@ -103,10 +103,10 @@ const builtinMarkdownPlugins = {
103
103
  load: () => loadModule("comark/plugins/mermaid")
104
104
  },
105
105
  punctuation: {
106
- load: () => loadModule("comark/plugins/punctuation")
106
+ load: () => loadBuiltinModule(() => import("comark/plugins/punctuation"))
107
107
  },
108
108
  security: {
109
- load: () => loadModule("comark/plugins/security")
109
+ load: () => loadBuiltinModule(() => import("comark/plugins/security"))
110
110
  },
111
111
  summary: {
112
112
  load: async () => summaryPlugin
@@ -135,6 +135,10 @@ async function loadModule(specifier) {
135
135
  );
136
136
  return resolveModule(imported);
137
137
  }
138
+ async function loadBuiltinModule(loader) {
139
+ const imported = await loader();
140
+ return resolveModule(imported);
141
+ }
138
142
  function resolveModule(imported) {
139
143
  return imported.default || imported;
140
144
  }
@@ -3,16 +3,18 @@ import { isRelative } from "ufo";
3
3
  import { defineTransformer } from "./utils.js";
4
4
  import { generatePath } from "./path-meta.js";
5
5
  import { resolveMarkdownPlugins } from "./markdown-plugins.js";
6
+ import { stripReservedContentKeys } from "./reserved.js";
6
7
  import { mapMarkdownNodes, toMarkdownRoot } from "../core/markdown/tree";
7
8
  export default defineTransformer({
8
9
  name: "markdown",
9
10
  extensions: [".md"],
10
- parse: async (_id, content, options = {}) => {
11
+ parse: async (id, content, options = {}) => {
11
12
  const config = { ...typeof options === "object" && options !== null ? options : {} };
12
13
  const plugins = await resolveMarkdownPlugins(config.plugins || []);
13
14
  const tree = await parse(content, {
14
15
  plugins
15
16
  });
17
+ const frontmatter = stripReservedContentKeys(tree.frontmatter, id);
16
18
  const body = normalizeMarkdownBody({
17
19
  ...toMarkdownRoot(tree.nodes),
18
20
  toc: tree.meta?.toc
@@ -21,13 +23,12 @@ export default defineTransformer({
21
23
  ...toMarkdownRoot(tree.meta.summary)
22
24
  }) : void 0;
23
25
  return {
24
- ...tree.frontmatter,
25
- _empty: body.children.length === 0,
26
- description: typeof tree.frontmatter.description === "string" ? tree.frontmatter.description : "",
26
+ ...frontmatter,
27
+ description: typeof frontmatter.description === "string" ? frontmatter.description : "",
27
28
  excerpt,
28
29
  body,
29
- _type: "markdown",
30
- _id
30
+ type: "markdown",
31
+ id
31
32
  };
32
33
  }
33
34
  });
@@ -5,32 +5,34 @@ export default defineTransformer({
5
5
  extensions: [".*"],
6
6
  transform(content, options = {}) {
7
7
  const { locales = [], defaultLocale = "en", respectPathCase = false, translatedSlugs = false } = options;
8
- const { _source, _file, _path, _extension, _basename } = describeId(content._id);
9
- const parts = _path.split("/");
10
- const _locale = locales.includes(parts[0]) ? parts.shift() : defaultLocale;
11
- const isNavigation = _basename === ".navigation";
8
+ const { source, file, path, extension, basename } = describeId(content.id);
9
+ const parts = path.split("/");
10
+ const locale = locales.includes(parts[0]) ? parts.shift() : defaultLocale;
11
+ const isNavigation = basename === ".navigation";
12
12
  const rawPath = isNavigation ? parts.slice(0, -1).join("/") : parts.join("/");
13
13
  const filePath = generatePath(rawPath, { respectPathCase });
14
- const _canonicalKey = generateCanonicalKey(isNavigation ? parts.slice(0, -1) : parts, { translatedSlugs, respectPathCase });
15
- const _collection = options.collectionResolver?.(_file);
14
+ const canonicalKey = generateCanonicalKey(isNavigation ? parts.slice(0, -1) : parts, { translatedSlugs, respectPathCase });
15
+ const collection = options.collectionResolver?.(file);
16
16
  return {
17
17
  ...content,
18
18
  // Fallback title synthesis lives here (not in the markdown parser) so it
19
19
  // applies uniformly to every parser output. Moving it into the markdown
20
20
  // parser would duplicate the logic in the yaml / json / csv parsers.
21
- title: content.title || (isNavigation ? void 0 : generateTitle(refineUrlPart(_basename))),
22
- _path: filePath,
23
- _dir: filePath.split("/").slice(-2)[0],
24
- _draft: content.draft || isDraftPath(_path),
25
- _partial: isNavigation || isPartialPath(_path),
26
- _locale,
27
- _canonicalKey,
28
- _collection,
29
- _navigation: isNavigation,
30
- _source,
31
- _file,
32
- _stem: _path,
33
- _extension
21
+ title: content.title || (isNavigation ? void 0 : generateTitle(refineUrlPart(basename))),
22
+ path: filePath,
23
+ draft: content.draft || isDraftPath(path),
24
+ partial: isNavigation || isPartialPath(path),
25
+ locale,
26
+ canonicalKey,
27
+ collection,
28
+ navigationFile: isNavigation,
29
+ file: {
30
+ source,
31
+ path: file,
32
+ stem: path,
33
+ dir: filePath.split("/").slice(-2)[0],
34
+ extension
35
+ }
34
36
  };
35
37
  }
36
38
  });
@@ -0,0 +1 @@
1
+ export * from './reserved.js'
@@ -0,0 +1,15 @@
1
+ /**
2
+ * System-computed identity keys on the content envelope. User frontmatter may
3
+ * not define these: the system value always wins and a dev/build warning is
4
+ * emitted so authors notice the shadowed key.
5
+ *
6
+ * The former user-facing "explicit id" alias has been retired — authors who
7
+ * want a stable, rename-proof alias for internal links should use `ref`.
8
+ */
9
+ export declare const RESERVED_CONTENT_KEYS: readonly ["id", "collection", "locale", "path", "canonicalKey", "type", "file", "resolved", "variants", "localePaths", "unprefixedPath", "dir"];
10
+ /**
11
+ * Strip reserved system keys from raw user frontmatter/data. Identity keys are
12
+ * stamped later by path-meta; derived localization keys would otherwise be
13
+ * trusted as system state.
14
+ */
15
+ export declare const stripReservedContentKeys: <T extends Record<string, unknown>>(source: Record<string, unknown> | null | undefined, fileId: string) => Partial<T>;
@@ -0,0 +1,35 @@
1
+ export const RESERVED_CONTENT_KEYS = [
2
+ "id",
3
+ "collection",
4
+ "locale",
5
+ "path",
6
+ "canonicalKey",
7
+ "type",
8
+ "file",
9
+ "resolved",
10
+ "variants",
11
+ "localePaths",
12
+ "unprefixedPath",
13
+ // Query-time only: `execute.ts`'s `withDirConfig` stamps the directory
14
+ // `.navigation` config onto variant-resolution (`resolveVariant`) results
15
+ // as a top-level `dir`, so an authored `dir:` frontmatter key would be
16
+ // silently clobbered there. It is not stamped at parse time (path-meta
17
+ // writes the directory name to `file.dir`, not top-level `dir`), so we
18
+ // reserve it here to strip+warn like the other system keys.
19
+ "dir"
20
+ ];
21
+ export const stripReservedContentKeys = (source, fileId) => {
22
+ if (!source || typeof source !== "object") {
23
+ return {};
24
+ }
25
+ const reserved = new Set(RESERVED_CONTENT_KEYS);
26
+ for (const key of RESERVED_CONTENT_KEYS) {
27
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
28
+ const hint = key === "id" ? " Use `ref` for a stable authored alias." : "";
29
+ console.warn(
30
+ `[content] Ignoring reserved frontmatter key "${key}" in "${fileId}"; the system value wins.${hint}`
31
+ );
32
+ }
33
+ }
34
+ return Object.fromEntries(Object.entries(source).filter(([key]) => !reserved.has(key)));
35
+ };
@@ -1,19 +1,21 @@
1
1
  import { load } from "js-yaml";
2
2
  import { defineTransformer } from "./utils.js";
3
+ import { stripReservedContentKeys } from "./reserved.js";
3
4
  export default defineTransformer({
4
5
  name: "Yaml",
5
6
  extensions: [".yml", ".yaml"],
6
- parse: (_id, content) => {
7
+ parse: (id, content) => {
7
8
  const data = load(String(content));
8
9
  let parsed = data;
9
10
  if (Array.isArray(data)) {
10
- console.warn(`YAML array is not supported in ${_id}, moving the array into the \`body\` key`);
11
+ console.warn(`YAML array is not supported in ${id}, moving the array into the \`body\` key`);
11
12
  parsed = { body: data };
12
13
  }
14
+ parsed = stripReservedContentKeys(parsed, id);
13
15
  return {
14
16
  ...parsed,
15
- _id,
16
- _type: "yaml"
17
+ id,
18
+ type: "yaml"
17
19
  };
18
20
  }
19
21
  });
@@ -0,0 +1 @@
1
+ export * from './agent.js'
@@ -0,0 +1,17 @@
1
+ /**
2
+ * LLM markdown output public API surface (Nitro / H3 contexts).
3
+ *
4
+ * The "agent" feature serves agent-readable content output — `/raw/*.md`,
5
+ * `/llms.txt`, `/llms-full.txt`, and the component→markdown serializers /
6
+ * registration primitives. It lives on its own subpath (`@lupinum/ginko-content/agent`)
7
+ * so it does not share the `./server` query facade. The `agent` code identifiers
8
+ * match the shipped module option name (`agent: {...}`).
9
+ *
10
+ * This is a PURE re-export: the registration API was reshaped once (per-app
11
+ * registry) in T4.2b — the moved names keep their call signatures.
12
+ */
13
+ export { agentMarkdownPathForRoute, agentRawPathForRoute, normalizeAgentRoutePath } from '../features/agent/agent-paths.js';
14
+ export { clearAgentMarkdownSerializers, blockquoteMarkdown, createAgentMarkdownRegistry, defineAgentMarkdownComponent, getMarkdownProp, jsonFenceMarkdown, linkMarkdown, queryMarkdownEnabledContent, registerAgentMarkdownComponent, registerAgentMarkdownComponents, registerAgentMarkdownSerializer, registerAgentMarkdownSerializers, renderMarkdownChildren, resolveAgentMarkdownOptions, resolveContentMarkdown, resolveContentMarkdownByRoute, xmlComponentMarkdown } from '../runtime/server/agent-markdown.js';
15
+ export { buildAgentPageIndex, collectAgentMarkdownPrerenderRoutes, getAgentLocales, isSupportedAgentLocale, localeFromAgentPath, renderAgentMarkdownFrontmatter, renderAgentMarkdownPage, renderLlmsFullTxt, renderLlmsTxt, resolveMarkdownForPublicRoute, routePathFromIndexSlug, routePathFromRawSlug } from '../runtime/server/agent-site.js';
16
+ export type { AgentMarkdown, AgentMarkdownComponent, AgentMarkdownComponentMap, AgentMarkdownContext, AgentMarkdownMeta, AgentMarkdownPublicSignals, AgentMarkdownRegistry, AgentMarkdownSerializer, AgentMarkdownSerializerMap, ResolvedAgentMarkdownOptions } from '../runtime/server/agent-markdown.js';
17
+ export type { AgentPage, AgentPageSource } from '../runtime/server/agent-site.js';
@@ -0,0 +1,34 @@
1
+ export { agentMarkdownPathForRoute, agentRawPathForRoute, normalizeAgentRoutePath } from "../features/agent/agent-paths.js";
2
+ export {
3
+ clearAgentMarkdownSerializers,
4
+ blockquoteMarkdown,
5
+ createAgentMarkdownRegistry,
6
+ defineAgentMarkdownComponent,
7
+ getMarkdownProp,
8
+ jsonFenceMarkdown,
9
+ linkMarkdown,
10
+ queryMarkdownEnabledContent,
11
+ registerAgentMarkdownComponent,
12
+ registerAgentMarkdownComponents,
13
+ registerAgentMarkdownSerializer,
14
+ registerAgentMarkdownSerializers,
15
+ renderMarkdownChildren,
16
+ resolveAgentMarkdownOptions,
17
+ resolveContentMarkdown,
18
+ resolveContentMarkdownByRoute,
19
+ xmlComponentMarkdown
20
+ } from "../runtime/server/agent-markdown.js";
21
+ export {
22
+ buildAgentPageIndex,
23
+ collectAgentMarkdownPrerenderRoutes,
24
+ getAgentLocales,
25
+ isSupportedAgentLocale,
26
+ localeFromAgentPath,
27
+ renderAgentMarkdownFrontmatter,
28
+ renderAgentMarkdownPage,
29
+ renderLlmsFullTxt,
30
+ renderLlmsTxt,
31
+ resolveMarkdownForPublicRoute,
32
+ routePathFromIndexSlug,
33
+ routePathFromRawSlug
34
+ } from "../runtime/server/agent-site.js";
@@ -5,9 +5,8 @@
5
5
  * pages use the thin `useContentPage` convenience helper built on top of it.
6
6
  */
7
7
  export { one, many, paginate, backlinks, resolveOne, variants, tree, neighbors } from '../runtime/app/composables/query-api.js';
8
- export { getCollectionPath } from '../runtime/query/routes.js';
9
- export type { CollectionPathOptions } from '../runtime/query/routes.js';
10
- export { agentMarkdownPathForRoute, agentRawPathForRoute, normalizeAgentRoutePath } from '../runtime/agent-paths.js';
8
+ export { getCollectionPath } from '../features/query/routes.js';
9
+ export type { CollectionPathOptions } from '../features/query/routes.js';
11
10
  export { useContentHead } from '../runtime/app/composables/head.js';
12
11
  export { useContentPage, useContentOne, useContentMany, useContentPagination, useContentBacklinks, useContentResolveOne, useContentVariants, useContentTree, useContentNavigation, useContentNeighbors } from '../runtime/app/composables/use-content.js';
13
12
  export type { UseContentPageOptions } from '../runtime/app/composables/use-content.js';
@@ -8,8 +8,7 @@ export {
8
8
  tree,
9
9
  neighbors
10
10
  } from "../runtime/app/composables/query-api.js";
11
- export { getCollectionPath } from "../runtime/query/routes.js";
12
- export { agentMarkdownPathForRoute, agentRawPathForRoute, normalizeAgentRoutePath } from "../runtime/agent-paths.js";
11
+ export { getCollectionPath } from "../features/query/routes.js";
13
12
  export { useContentHead } from "../runtime/app/composables/head.js";
14
13
  export {
15
14
  useContentPage,
@@ -0,0 +1 @@
1
+ export * from './provider-query.js'