@lupinum/ginko-content 0.1.2 → 0.1.3

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 (189) hide show
  1. package/README.md +18 -4
  2. package/compatibility.json +1 -1
  3. package/dist/cli.mjs +317 -294
  4. package/dist/cms-import/index.js +5 -1
  5. package/dist/config.d.mts +1 -1
  6. package/dist/config.mjs +1 -1
  7. package/dist/core/cache-hints.d.ts +9 -1
  8. package/dist/core/content/collection.js +1 -1
  9. package/dist/core/content/path.js +1 -1
  10. package/dist/core/errors.js +5 -1
  11. package/dist/core/provider-errors +1 -0
  12. package/dist/core/provider-errors.d.ts +10 -0
  13. package/dist/core/provider-errors.js +27 -0
  14. package/dist/core/query/execute.js +12 -3
  15. package/dist/core/query/filter.js +2 -2
  16. package/dist/core/query/lower.js +5 -4
  17. package/dist/features/navigation/build.js +14 -6
  18. package/dist/features/navigation/canonical.js +1 -1
  19. package/dist/features/sitemap/query.js +2 -2
  20. package/dist/integrations/nitro/ingest.d.ts +3 -3
  21. package/dist/integrations/nitro/ingest.js +3 -3
  22. package/dist/integrations/nitro/storage.js +3 -1
  23. package/dist/module.d.mts +151 -526
  24. package/dist/module.json +1 -1
  25. package/dist/module.mjs +1091 -722
  26. package/dist/parsers/csv.js +4 -3
  27. package/dist/parsers/index.d.ts +2 -5
  28. package/dist/parsers/index.js +2 -2
  29. package/dist/parsers/markdown-plugins.d.ts +1 -0
  30. package/dist/parsers/markdown-plugins.js +83 -1
  31. package/dist/parsers/markdown.js +1 -1
  32. package/dist/public/client.d.ts +3 -2
  33. package/dist/public/client.js +2 -2
  34. package/dist/public/provider-errors.d.ts +2 -1
  35. package/dist/public/provider-errors.js +1 -18
  36. package/dist/public/provider.d.ts +3 -10
  37. package/dist/public/server.d.ts +6 -1
  38. package/dist/public/server.js +33 -0
  39. package/dist/runtime/agent-paths +1 -0
  40. package/dist/runtime/agent-paths.d.ts +6 -0
  41. package/dist/runtime/agent-paths.js +41 -0
  42. package/dist/runtime/app/components/internal/MarkdownRenderer.d.ts +1 -1
  43. package/dist/runtime/app/composables/head.d.ts +3 -0
  44. package/dist/runtime/app/composables/head.js +2 -1
  45. package/dist/runtime/app/composables/hot-reload +1 -0
  46. package/dist/runtime/app/composables/hot-reload.d.ts +5 -0
  47. package/dist/runtime/app/composables/hot-reload.js +15 -0
  48. package/dist/runtime/app/composables/locale-context.d.ts +1 -1
  49. package/dist/runtime/app/composables/locale-context.js +2 -1
  50. package/dist/runtime/app/composables/locale.js +2 -2
  51. package/dist/runtime/app/composables/search.js +10 -6
  52. package/dist/runtime/app/composables/use-content-document +1 -0
  53. package/dist/runtime/app/composables/use-content-document.d.ts +29 -0
  54. package/dist/runtime/app/composables/use-content-document.js +44 -0
  55. package/dist/runtime/app/composables/use-content-list +1 -0
  56. package/dist/runtime/app/composables/use-content-list.d.ts +43 -0
  57. package/dist/runtime/app/composables/use-content-list.js +98 -0
  58. package/dist/runtime/app/composables/use-content-navigation +1 -0
  59. package/dist/runtime/app/composables/use-content-navigation.d.ts +40 -0
  60. package/dist/runtime/app/composables/use-content-navigation.js +102 -0
  61. package/dist/runtime/app/composables/use-content-page +1 -0
  62. package/dist/runtime/app/composables/use-content-page.d.ts +47 -0
  63. package/dist/runtime/app/composables/use-content-page.js +142 -0
  64. package/dist/runtime/app/composables/use-content-shared +1 -0
  65. package/dist/runtime/app/composables/use-content-shared.d.ts +13 -0
  66. package/dist/runtime/app/composables/use-content-shared.js +29 -0
  67. package/dist/runtime/app/composables/use-content.d.ts +11 -206
  68. package/dist/runtime/app/composables/use-content.js +4 -377
  69. package/dist/runtime/app/plugins/hot-reload +1 -0
  70. package/dist/runtime/app/plugins/hot-reload.js +6 -0
  71. package/dist/runtime/query/backlinks +1 -0
  72. package/dist/runtime/query/backlinks.d.ts +8 -0
  73. package/dist/runtime/query/backlinks.js +90 -0
  74. package/dist/runtime/query/context +1 -0
  75. package/dist/runtime/query/context.d.ts +20 -0
  76. package/dist/runtime/query/context.js +0 -0
  77. package/dist/runtime/query/documents +1 -0
  78. package/dist/runtime/query/documents.d.ts +6 -0
  79. package/dist/runtime/query/documents.js +98 -0
  80. package/dist/runtime/query/errors +1 -0
  81. package/dist/runtime/query/errors.d.ts +1 -0
  82. package/dist/runtime/query/errors.js +4 -0
  83. package/dist/runtime/query/handles +1 -0
  84. package/dist/runtime/query/handles.d.ts +2 -0
  85. package/dist/runtime/query/handles.js +7 -0
  86. package/dist/runtime/query/locale-options +1 -0
  87. package/dist/runtime/query/locale-options.d.ts +5 -0
  88. package/dist/runtime/query/locale-options.js +14 -0
  89. package/dist/runtime/query/localized-docs +1 -0
  90. package/dist/runtime/query/localized-docs.d.ts +17 -0
  91. package/dist/runtime/query/localized-docs.js +44 -0
  92. package/dist/runtime/query/navigation +1 -0
  93. package/dist/runtime/query/navigation.d.ts +22 -0
  94. package/dist/runtime/query/navigation.js +73 -0
  95. package/dist/runtime/query/pagination +1 -0
  96. package/dist/runtime/query/pagination.d.ts +7 -0
  97. package/dist/runtime/query/pagination.js +78 -0
  98. package/dist/runtime/query/populate +1 -0
  99. package/dist/runtime/query/populate.d.ts +9 -0
  100. package/dist/runtime/query/populate.js +106 -0
  101. package/dist/runtime/query/responses +1 -0
  102. package/dist/runtime/query/responses.d.ts +10 -0
  103. package/dist/runtime/query/responses.js +47 -0
  104. package/dist/runtime/query/unified.d.ts +4 -20
  105. package/dist/runtime/query/unified.js +14 -544
  106. package/dist/runtime/query/variants +1 -0
  107. package/dist/runtime/query/variants.d.ts +11 -0
  108. package/dist/runtime/query/variants.js +36 -0
  109. package/dist/runtime/server/agent-http +1 -0
  110. package/dist/runtime/server/agent-http.d.ts +7 -0
  111. package/dist/runtime/server/agent-http.js +36 -0
  112. package/dist/runtime/server/agent-markdown +1 -0
  113. package/dist/runtime/server/agent-markdown.d.ts +83 -0
  114. package/dist/runtime/server/agent-markdown.js +449 -0
  115. package/dist/runtime/server/agent-site +1 -0
  116. package/dist/runtime/server/agent-site.d.ts +38 -0
  117. package/dist/runtime/server/agent-site.js +273 -0
  118. package/dist/runtime/server/api/agent-llms +1 -0
  119. package/dist/runtime/server/api/agent-llms-full +1 -0
  120. package/dist/runtime/server/api/agent-llms-full.d.ts +2 -0
  121. package/dist/runtime/server/api/agent-llms-full.js +13 -0
  122. package/dist/runtime/server/api/agent-llms.d.ts +2 -0
  123. package/dist/runtime/server/api/agent-llms.js +14 -0
  124. package/dist/runtime/server/api/agent-raw +1 -0
  125. package/dist/runtime/server/api/agent-raw.d.ts +2 -0
  126. package/dist/runtime/server/api/agent-raw.js +17 -0
  127. package/dist/runtime/server/api/locales.d.ts +2 -2
  128. package/dist/runtime/server/api/locales.js +4 -2
  129. package/dist/runtime/server/api/navigation.d.ts +1 -1
  130. package/dist/runtime/server/api/query.d.ts +1 -1
  131. package/dist/runtime/server/api/query.js +4 -1
  132. package/dist/runtime/server/api/revalidate.js +2 -2
  133. package/dist/runtime/server/api/site-data.d.ts +1 -1
  134. package/dist/runtime/server/collection-helpers.js +2 -1
  135. package/dist/runtime/server/middleware/agent-link-headers +1 -0
  136. package/dist/runtime/server/middleware/agent-link-headers.d.ts +2 -0
  137. package/dist/runtime/server/middleware/agent-link-headers.js +42 -0
  138. package/dist/runtime/server/middleware/agent-markdown +1 -0
  139. package/dist/runtime/server/middleware/agent-markdown.d.ts +2 -0
  140. package/dist/runtime/server/middleware/agent-markdown.js +43 -0
  141. package/dist/runtime/server/plugins/sitemap.js +1 -0
  142. package/dist/runtime/server/provider-query.d.ts +8 -5
  143. package/dist/runtime/server/provider-query.js +50 -8
  144. package/dist/runtime/server/provider-result.d.ts +19 -2
  145. package/dist/runtime/server/providers/filesystem.js +4 -1
  146. package/dist/runtime/server/providers/index.d.ts +3 -1
  147. package/dist/runtime/server/providers/index.js +2 -2
  148. package/dist/runtime/server/query-api.js +2 -1
  149. package/dist/runtime/server/query-executor.d.ts +3 -2
  150. package/dist/runtime/server/query-executor.js +13 -5
  151. package/dist/runtime/server/search.js +1 -1
  152. package/dist/runtime/server/sitemap-provider.js +40 -1
  153. package/dist/runtime/server/sitemap.js +3 -2
  154. package/dist/runtime/transformers/component-resolver.js +2 -1
  155. package/dist/runtime/utils/content-components.d.ts +0 -5
  156. package/dist/storage/content.d.ts +2 -9
  157. package/dist/storage/references.d.ts +1 -8
  158. package/dist/storage/references.js +9 -4
  159. package/dist/testing/provider-contract.js +3 -4
  160. package/dist/testing/provider-fixture.d.ts +3 -1
  161. package/dist/testing/provider-fixture.js +27 -14
  162. package/dist/types/config.d.ts +77 -0
  163. package/dist/types/config.js +23 -0
  164. package/dist/types/module.d.ts +15 -5
  165. package/dist/types/query-parts/collections +1 -0
  166. package/dist/types/query-parts/collections.d.ts +15 -0
  167. package/dist/types/query-parts/collections.js +0 -0
  168. package/dist/types/query-parts/public +1 -0
  169. package/dist/types/query-parts/public.d.ts +202 -0
  170. package/dist/types/query-parts/public.js +0 -0
  171. package/dist/types/query-parts/results +1 -0
  172. package/dist/types/query-parts/results.d.ts +95 -0
  173. package/dist/types/query-parts/results.js +0 -0
  174. package/dist/types/query-parts/transport +1 -0
  175. package/dist/types/query-parts/transport.d.ts +103 -0
  176. package/dist/types/query-parts/transport.js +0 -0
  177. package/dist/types/query.d.ts +4 -870
  178. package/dist/types/query.js +4 -0
  179. package/dist/types/runtime.d.ts +2 -2
  180. package/dist/types/virtual.d.ts +54 -0
  181. package/dist/types.d.mts +2 -2
  182. package/dist/web-types.json +1 -1
  183. package/package.json +5 -5
  184. package/dist/runtime/app/composables/web-socket +0 -1
  185. package/dist/runtime/app/composables/web-socket.d.ts +0 -3
  186. package/dist/runtime/app/composables/web-socket.js +0 -65
  187. package/dist/runtime/app/plugins/ws +0 -1
  188. package/dist/runtime/app/plugins/ws.js +0 -7
  189. /package/dist/runtime/app/plugins/{ws.d.ts → hot-reload.d.ts} +0 -0
@@ -0,0 +1,106 @@
1
+ import { collectTopLevelReferenceFieldsByTarget } from "../../core/references/schema";
2
+ import { ensureCollectionName } from "./handles.js";
3
+ const LOCALIZED_DOC_INTERNAL_FIELDS = [
4
+ "_id",
5
+ "_path",
6
+ "_file",
7
+ "_canonicalKey",
8
+ "_locale",
9
+ "_resolvedLocale",
10
+ "_requestedLocale",
11
+ "_fallback",
12
+ "_availableLocales",
13
+ "_variantPaths",
14
+ "_requestedPath",
15
+ "_requestedRoute",
16
+ "_requestedRef",
17
+ "_extension"
18
+ ];
19
+ const wildcardReferenceTarget = "*";
20
+ const isRecord = (value) => {
21
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
22
+ };
23
+ const collectReferenceFieldsByTarget = (source, sourceCollection, runtime) => {
24
+ if (typeof source !== "string") {
25
+ return collectTopLevelReferenceFieldsByTarget(source.schema);
26
+ }
27
+ return runtime?.collections?.[sourceCollection]?.references || {};
28
+ };
29
+ const invertReferenceFields = (references) => {
30
+ const fields = /* @__PURE__ */ new Map();
31
+ for (const [target, targetFields] of Object.entries(references)) {
32
+ for (const field of targetFields) {
33
+ const targets = fields.get(field) || [];
34
+ targets.push(target);
35
+ fields.set(field, targets);
36
+ }
37
+ }
38
+ return fields;
39
+ };
40
+ const createPopulateTargetMismatchError = (sourceCollection, field, expectedTargets, actualTarget) => new Error([
41
+ `Cannot populate "${sourceCollection}.${field}" from "${actualTarget}".`,
42
+ `Reference metadata declares "${sourceCollection}.${field}" points to ${expectedTargets.map((target) => `"${target}"`).join(" or ")}.`,
43
+ `Change populate.${field} to the declared target collection, or update ${sourceCollection}.schema relation metadata.`
44
+ ].join(" "));
45
+ export const validatePopulateSpec = (source, sourceCollection, runtime, populate) => {
46
+ if (!populate || !isRecord(populate)) {
47
+ return;
48
+ }
49
+ const references = collectReferenceFieldsByTarget(source, sourceCollection, runtime);
50
+ const fieldTargets = invertReferenceFields(references);
51
+ if (!fieldTargets.size) {
52
+ return;
53
+ }
54
+ for (const [field, target] of Object.entries(populate)) {
55
+ const declaredTargets = fieldTargets.get(field);
56
+ if (!declaredTargets?.length) {
57
+ continue;
58
+ }
59
+ const actualTarget = ensureCollectionName(target);
60
+ if (declaredTargets.includes(actualTarget) || declaredTargets.includes(wildcardReferenceTarget)) {
61
+ continue;
62
+ }
63
+ throw createPopulateTargetMismatchError(
64
+ sourceCollection,
65
+ field,
66
+ declaredTargets.filter((target2) => target2 !== wildcardReferenceTarget),
67
+ actualTarget
68
+ );
69
+ }
70
+ };
71
+ const populateReferenceValue = async (context, resolveReference, target, value, locale, fallback) => {
72
+ if (typeof value !== "string" || !value) {
73
+ return null;
74
+ }
75
+ return resolveReference(context, target, {
76
+ by: { ref: value },
77
+ ...locale ? { locale } : {},
78
+ ...fallback !== void 0 ? { fallback } : {}
79
+ });
80
+ };
81
+ export const populateDocument = async (context, resolveReference, doc, populate, locale, fallback) => {
82
+ if (!populate || !isRecord(populate)) {
83
+ return doc;
84
+ }
85
+ const populated = { ...doc };
86
+ await Promise.all(Object.entries(populate).map(async ([field, target]) => {
87
+ const value = doc[field];
88
+ if (Array.isArray(value)) {
89
+ const resolved = await Promise.all(value.map((item) => populateReferenceValue(context, resolveReference, target, item, locale, fallback)));
90
+ populated[field] = resolved.filter(Boolean);
91
+ return;
92
+ }
93
+ populated[field] = await populateReferenceValue(context, resolveReference, target, value, locale, fallback);
94
+ }));
95
+ return populated;
96
+ };
97
+ export const selectWithPopulate = (select, populate) => {
98
+ if (!select) {
99
+ return void 0;
100
+ }
101
+ return [.../* @__PURE__ */ new Set([
102
+ ...select,
103
+ ...LOCALIZED_DOC_INTERNAL_FIELDS,
104
+ ...populate && isRecord(populate) ? Object.keys(populate) : []
105
+ ])];
106
+ };
@@ -0,0 +1 @@
1
+ export * from './responses.js'
@@ -0,0 +1,10 @@
1
+ export declare const unwrapOneResponse: <T>(response: unknown) => T | T[] | null;
2
+ export declare const unwrapListResponse: <T>(response: unknown) => T[];
3
+ export declare const unwrapFindResponse: <T>(response: unknown) => {
4
+ result: T[];
5
+ total: number;
6
+ skip: number;
7
+ limit: number;
8
+ hasTotal: boolean;
9
+ };
10
+ export declare const unwrapCountResponse: (response: unknown) => number | null;
@@ -0,0 +1,47 @@
1
+ const isObject = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2
+ const isFindResponseEnvelope = (response) => isObject(response) && Array.isArray(response.result) && typeof response.total === "number" && (typeof response.skip === "undefined" || typeof response.skip === "number") && (typeof response.limit === "undefined" || typeof response.limit === "number");
3
+ const isResultOnlyEnvelope = (response) => isObject(response) && "result" in response && Object.keys(response).length === 1;
4
+ const isSingleQueryEnvelope = (response) => isFindResponseEnvelope(response) || isResultOnlyEnvelope(response);
5
+ const isListQueryEnvelope = (response) => isFindResponseEnvelope(response);
6
+ export const unwrapOneResponse = (response) => {
7
+ if (!response) return null;
8
+ if (isSingleQueryEnvelope(response)) {
9
+ const result = response.result;
10
+ return result ?? null;
11
+ }
12
+ return response;
13
+ };
14
+ export const unwrapListResponse = (response) => {
15
+ if (!response) return [];
16
+ if (isListQueryEnvelope(response)) {
17
+ return response.result;
18
+ }
19
+ return Array.isArray(response) ? response : [response];
20
+ };
21
+ export const unwrapFindResponse = (response) => {
22
+ if (!response) {
23
+ return { result: [], total: 0, skip: 0, limit: 0, hasTotal: false };
24
+ }
25
+ if (isListQueryEnvelope(response)) {
26
+ const result2 = Array.isArray(response.result) ? response.result : response.result ? [response.result] : [];
27
+ const hasTotal = typeof response.total === "number";
28
+ return {
29
+ result: result2,
30
+ total: hasTotal ? response.total : result2.length,
31
+ skip: typeof response.skip === "number" ? response.skip : 0,
32
+ limit: typeof response.limit === "number" ? response.limit : result2.length,
33
+ hasTotal
34
+ };
35
+ }
36
+ const result = Array.isArray(response) ? response : [response];
37
+ return { result, total: result.length, skip: 0, limit: result.length, hasTotal: false };
38
+ };
39
+ export const unwrapCountResponse = (response) => {
40
+ if (typeof response === "number") {
41
+ return response;
42
+ }
43
+ if (isSingleQueryEnvelope(response) && typeof response.result === "number") {
44
+ return response.result;
45
+ }
46
+ return null;
47
+ };
@@ -16,26 +16,10 @@
16
16
  */
17
17
  import type { ParsedContent } from '../../types/content';
18
18
  import type { ContentCollectionHandle } from '../../types/config';
19
- import type { BacklinkSource, BacklinksOptions, BacklinksResult, ContentTreeItem, DocumentFromHandle, ManyOptions, LocalizedDoc, NeighborsOptions, NeighborsResult, OneOptions, PopulateSpec, PopulateFromOptions, PopulatedDocument, PaginationOptions, PaginationResult, ResolveOneOptions, ResolveOneResult, TreeOptions, ContentVariant, ContentQueryBuilderParams, VariantsOptions } from '../../types/query';
20
- import type { ContentQueryResponse } from '../../types/api';
21
- export interface RuntimeContentConfig {
22
- locales?: string[];
23
- defaultLocale?: string;
24
- collections?: Record<string, {
25
- i18n?: boolean | {
26
- locales?: string[];
27
- defaultLocale?: string;
28
- };
29
- route?: string | Record<string, string>;
30
- references?: Record<string, string[]>;
31
- }>;
32
- }
33
- export type ContentQueryEndpoint = 'query' | 'navigation';
34
- export interface ContentQueryContext {
35
- runtime: RuntimeContentConfig;
36
- transport: <T>(endpoint: ContentQueryEndpoint, params: ContentQueryBuilderParams) => Promise<ContentQueryResponse<T> | T | T[] | null>;
37
- }
38
- export declare const navigationSelectFields: (fields?: ReadonlyArray<string> | undefined) => string[];
19
+ import type { BacklinkSource, BacklinksOptions, BacklinksResult, ContentTreeItem, DocumentFromHandle, ManyOptions, LocalizedDoc, NeighborsOptions, NeighborsResult, OneOptions, PopulateSpec, PopulateFromOptions, PopulatedDocument, PaginationOptions, PaginationResult, ResolveOneOptions, ResolveOneResult, TreeOptions, ContentVariant, VariantsOptions } from '../../types/query';
20
+ import type { ContentQueryContext } from './context';
21
+ export type { ContentQueryContext, ContentQueryEndpoint, RuntimeContentConfig } from './context';
22
+ export { navigationSelectFields } from './navigation';
39
23
  /**
40
24
  * Resolve exactly one document and return an explanation of how it matched.
41
25
  */