@byline/core 0.9.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 (283) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +17 -0
  3. package/dist/@types/admin-types.d.ts +275 -0
  4. package/dist/@types/admin-types.d.ts.map +1 -0
  5. package/dist/@types/admin-types.js +18 -0
  6. package/dist/@types/admin-types.js.map +1 -0
  7. package/dist/@types/collection-types.d.ts +816 -0
  8. package/dist/@types/collection-types.d.ts.map +1 -0
  9. package/dist/@types/collection-types.js +217 -0
  10. package/dist/@types/collection-types.js.map +1 -0
  11. package/dist/@types/db-types.d.ts +463 -0
  12. package/dist/@types/db-types.d.ts.map +1 -0
  13. package/dist/@types/db-types.js +2 -0
  14. package/dist/@types/db-types.js.map +1 -0
  15. package/dist/@types/field-data-types.d.ts +147 -0
  16. package/dist/@types/field-data-types.d.ts.map +1 -0
  17. package/dist/@types/field-data-types.js +38 -0
  18. package/dist/@types/field-data-types.js.map +1 -0
  19. package/dist/@types/field-types.d.ts +579 -0
  20. package/dist/@types/field-types.d.ts.map +1 -0
  21. package/dist/@types/field-types.js +32 -0
  22. package/dist/@types/field-types.js.map +1 -0
  23. package/dist/@types/index.d.ts +18 -0
  24. package/dist/@types/index.d.ts.map +1 -0
  25. package/dist/@types/index.js +18 -0
  26. package/dist/@types/index.js.map +1 -0
  27. package/dist/@types/populate-types.d.ts +54 -0
  28. package/dist/@types/populate-types.d.ts.map +1 -0
  29. package/dist/@types/populate-types.js +9 -0
  30. package/dist/@types/populate-types.js.map +1 -0
  31. package/dist/@types/query-predicate.d.ts +74 -0
  32. package/dist/@types/query-predicate.d.ts.map +1 -0
  33. package/dist/@types/query-predicate.js +9 -0
  34. package/dist/@types/query-predicate.js.map +1 -0
  35. package/dist/@types/site-config.d.ts +212 -0
  36. package/dist/@types/site-config.d.ts.map +1 -0
  37. package/dist/@types/site-config.js +9 -0
  38. package/dist/@types/site-config.js.map +1 -0
  39. package/dist/@types/storage-types.d.ts +86 -0
  40. package/dist/@types/storage-types.d.ts.map +1 -0
  41. package/dist/@types/storage-types.js +9 -0
  42. package/dist/@types/storage-types.js.map +1 -0
  43. package/dist/@types/store-types.d.ts +134 -0
  44. package/dist/@types/store-types.d.ts.map +1 -0
  45. package/dist/@types/store-types.js +24 -0
  46. package/dist/@types/store-types.js.map +1 -0
  47. package/dist/@types/type-utils.d.ts +17 -0
  48. package/dist/@types/type-utils.d.ts.map +1 -0
  49. package/dist/@types/type-utils.js +9 -0
  50. package/dist/@types/type-utils.js.map +1 -0
  51. package/dist/auth/apply-before-read.d.ts +36 -0
  52. package/dist/auth/apply-before-read.d.ts.map +1 -0
  53. package/dist/auth/apply-before-read.js +68 -0
  54. package/dist/auth/apply-before-read.js.map +1 -0
  55. package/dist/auth/apply-before-read.test.node.d.ts +9 -0
  56. package/dist/auth/apply-before-read.test.node.d.ts.map +1 -0
  57. package/dist/auth/apply-before-read.test.node.js +144 -0
  58. package/dist/auth/apply-before-read.test.node.js.map +1 -0
  59. package/dist/auth/assert-actor-can-perform.d.ts +39 -0
  60. package/dist/auth/assert-actor-can-perform.d.ts.map +1 -0
  61. package/dist/auth/assert-actor-can-perform.js +64 -0
  62. package/dist/auth/assert-actor-can-perform.js.map +1 -0
  63. package/dist/auth/assert-actor-can-perform.test.node.d.ts +9 -0
  64. package/dist/auth/assert-actor-can-perform.test.node.d.ts.map +1 -0
  65. package/dist/auth/assert-actor-can-perform.test.node.js +119 -0
  66. package/dist/auth/assert-actor-can-perform.test.node.js.map +1 -0
  67. package/dist/auth/index.d.ts +11 -0
  68. package/dist/auth/index.d.ts.map +1 -0
  69. package/dist/auth/index.js +11 -0
  70. package/dist/auth/index.js.map +1 -0
  71. package/dist/auth/register-collection-abilities.d.ts +40 -0
  72. package/dist/auth/register-collection-abilities.d.ts.map +1 -0
  73. package/dist/auth/register-collection-abilities.js +87 -0
  74. package/dist/auth/register-collection-abilities.js.map +1 -0
  75. package/dist/auth/register-collection-abilities.test.node.d.ts +9 -0
  76. package/dist/auth/register-collection-abilities.test.node.d.ts.map +1 -0
  77. package/dist/auth/register-collection-abilities.test.node.js +124 -0
  78. package/dist/auth/register-collection-abilities.test.node.js.map +1 -0
  79. package/dist/config/config.d.ts +10 -0
  80. package/dist/config/config.d.ts.map +1 -0
  81. package/dist/config/config.js +108 -0
  82. package/dist/config/config.js.map +1 -0
  83. package/dist/config/routes.d.ts +16 -0
  84. package/dist/config/routes.d.ts.map +1 -0
  85. package/dist/config/routes.js +26 -0
  86. package/dist/config/routes.js.map +1 -0
  87. package/dist/config/validate-admin-configs.d.ts +33 -0
  88. package/dist/config/validate-admin-configs.d.ts.map +1 -0
  89. package/dist/config/validate-admin-configs.js +250 -0
  90. package/dist/config/validate-admin-configs.js.map +1 -0
  91. package/dist/config/validate-admin-configs.test.node.d.ts +9 -0
  92. package/dist/config/validate-admin-configs.test.node.d.ts.map +1 -0
  93. package/dist/config/validate-admin-configs.test.node.js +224 -0
  94. package/dist/config/validate-admin-configs.test.node.js.map +1 -0
  95. package/dist/config/validate-collections.d.ts +33 -0
  96. package/dist/config/validate-collections.d.ts.map +1 -0
  97. package/dist/config/validate-collections.js +70 -0
  98. package/dist/config/validate-collections.js.map +1 -0
  99. package/dist/config/validate-collections.test.node.d.ts +9 -0
  100. package/dist/config/validate-collections.test.node.d.ts.map +1 -0
  101. package/dist/config/validate-collections.test.node.js +149 -0
  102. package/dist/config/validate-collections.test.node.js.map +1 -0
  103. package/dist/core.d.ts +89 -0
  104. package/dist/core.d.ts.map +1 -0
  105. package/dist/core.js +99 -0
  106. package/dist/core.js.map +1 -0
  107. package/dist/defaults/default-values.d.ts +13 -0
  108. package/dist/defaults/default-values.d.ts.map +1 -0
  109. package/dist/defaults/default-values.js +60 -0
  110. package/dist/defaults/default-values.js.map +1 -0
  111. package/dist/index.d.ts +20 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +36 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/lib/errors.d.ts +98 -0
  116. package/dist/lib/errors.d.ts.map +1 -0
  117. package/dist/lib/errors.js +134 -0
  118. package/dist/lib/errors.js.map +1 -0
  119. package/dist/lib/logger.d.ts +62 -0
  120. package/dist/lib/logger.d.ts.map +1 -0
  121. package/dist/lib/logger.js +120 -0
  122. package/dist/lib/logger.js.map +1 -0
  123. package/dist/lib/registry.d.ts +65 -0
  124. package/dist/lib/registry.d.ts.map +1 -0
  125. package/dist/lib/registry.js +133 -0
  126. package/dist/lib/registry.js.map +1 -0
  127. package/dist/logger/index.d.ts +3 -0
  128. package/dist/logger/index.d.ts.map +1 -0
  129. package/dist/logger/index.js +3 -0
  130. package/dist/logger/index.js.map +1 -0
  131. package/dist/patches/apply-patches.d.ts +21 -0
  132. package/dist/patches/apply-patches.d.ts.map +1 -0
  133. package/dist/patches/apply-patches.js +357 -0
  134. package/dist/patches/apply-patches.js.map +1 -0
  135. package/dist/patches/index.d.ts +3 -0
  136. package/dist/patches/index.d.ts.map +1 -0
  137. package/dist/patches/index.js +4 -0
  138. package/dist/patches/index.js.map +1 -0
  139. package/dist/patches/patch-types.d.ts +82 -0
  140. package/dist/patches/patch-types.d.ts.map +1 -0
  141. package/dist/patches/patch-types.js +3 -0
  142. package/dist/patches/patch-types.js.map +1 -0
  143. package/dist/patches/patch.test.node.d.ts +2 -0
  144. package/dist/patches/patch.test.node.d.ts.map +1 -0
  145. package/dist/patches/patch.test.node.js +193 -0
  146. package/dist/patches/patch.test.node.js.map +1 -0
  147. package/dist/query/parse-where.d.ts +100 -0
  148. package/dist/query/parse-where.d.ts.map +1 -0
  149. package/dist/query/parse-where.js +352 -0
  150. package/dist/query/parse-where.js.map +1 -0
  151. package/dist/query/parse-where.test.node.d.ts +9 -0
  152. package/dist/query/parse-where.test.node.d.ts.map +1 -0
  153. package/dist/query/parse-where.test.node.js +581 -0
  154. package/dist/query/parse-where.test.node.js.map +1 -0
  155. package/dist/schemas/zod/builder.d.ts +466 -0
  156. package/dist/schemas/zod/builder.d.ts.map +1 -0
  157. package/dist/schemas/zod/builder.js +276 -0
  158. package/dist/schemas/zod/builder.js.map +1 -0
  159. package/dist/schemas/zod/cache.d.ts +14 -0
  160. package/dist/schemas/zod/cache.d.ts.map +1 -0
  161. package/dist/schemas/zod/cache.js +40 -0
  162. package/dist/schemas/zod/cache.js.map +1 -0
  163. package/dist/schemas/zod/index.d.ts +4 -0
  164. package/dist/schemas/zod/index.d.ts.map +1 -0
  165. package/dist/schemas/zod/index.js +4 -0
  166. package/dist/schemas/zod/index.js.map +1 -0
  167. package/dist/schemas/zod/types.d.ts +13 -0
  168. package/dist/schemas/zod/types.d.ts.map +1 -0
  169. package/dist/schemas/zod/types.js +2 -0
  170. package/dist/schemas/zod/types.js.map +1 -0
  171. package/dist/services/collection-bootstrap.d.ts +46 -0
  172. package/dist/services/collection-bootstrap.d.ts.map +1 -0
  173. package/dist/services/collection-bootstrap.js +108 -0
  174. package/dist/services/collection-bootstrap.js.map +1 -0
  175. package/dist/services/collection-bootstrap.test.node.d.ts +9 -0
  176. package/dist/services/collection-bootstrap.test.node.d.ts.map +1 -0
  177. package/dist/services/collection-bootstrap.test.node.js +208 -0
  178. package/dist/services/collection-bootstrap.test.node.js.map +1 -0
  179. package/dist/services/document-lifecycle.d.ts +245 -0
  180. package/dist/services/document-lifecycle.d.ts.map +1 -0
  181. package/dist/services/document-lifecycle.js +481 -0
  182. package/dist/services/document-lifecycle.js.map +1 -0
  183. package/dist/services/document-lifecycle.test.node.d.ts +9 -0
  184. package/dist/services/document-lifecycle.test.node.d.ts.map +1 -0
  185. package/dist/services/document-lifecycle.test.node.js +781 -0
  186. package/dist/services/document-lifecycle.test.node.js.map +1 -0
  187. package/dist/services/document-read.d.ts +26 -0
  188. package/dist/services/document-read.d.ts.map +1 -0
  189. package/dist/services/document-read.js +60 -0
  190. package/dist/services/document-read.js.map +1 -0
  191. package/dist/services/field-upload.d.ts +100 -0
  192. package/dist/services/field-upload.d.ts.map +1 -0
  193. package/dist/services/field-upload.js +328 -0
  194. package/dist/services/field-upload.js.map +1 -0
  195. package/dist/services/field-upload.test.node.d.ts +9 -0
  196. package/dist/services/field-upload.test.node.d.ts.map +1 -0
  197. package/dist/services/field-upload.test.node.js +337 -0
  198. package/dist/services/field-upload.test.node.js.map +1 -0
  199. package/dist/services/index.d.ts +10 -0
  200. package/dist/services/index.d.ts.map +1 -0
  201. package/dist/services/index.js +11 -0
  202. package/dist/services/index.js.map +1 -0
  203. package/dist/services/populate.d.ts +299 -0
  204. package/dist/services/populate.d.ts.map +1 -0
  205. package/dist/services/populate.js +484 -0
  206. package/dist/services/populate.js.map +1 -0
  207. package/dist/services/populate.test.node.d.ts +9 -0
  208. package/dist/services/populate.test.node.d.ts.map +1 -0
  209. package/dist/services/populate.test.node.js +910 -0
  210. package/dist/services/populate.test.node.js.map +1 -0
  211. package/dist/services/relation-projection.d.ts +52 -0
  212. package/dist/services/relation-projection.d.ts.map +1 -0
  213. package/dist/services/relation-projection.js +81 -0
  214. package/dist/services/relation-projection.js.map +1 -0
  215. package/dist/services/richtext-populate.d.ts +87 -0
  216. package/dist/services/richtext-populate.d.ts.map +1 -0
  217. package/dist/services/richtext-populate.js +189 -0
  218. package/dist/services/richtext-populate.js.map +1 -0
  219. package/dist/services/richtext-populate.test.node.d.ts +9 -0
  220. package/dist/services/richtext-populate.test.node.d.ts.map +1 -0
  221. package/dist/services/richtext-populate.test.node.js +197 -0
  222. package/dist/services/richtext-populate.test.node.js.map +1 -0
  223. package/dist/storage/collection-fingerprint.d.ts +21 -0
  224. package/dist/storage/collection-fingerprint.d.ts.map +1 -0
  225. package/dist/storage/collection-fingerprint.js +172 -0
  226. package/dist/storage/collection-fingerprint.js.map +1 -0
  227. package/dist/storage/collection-fingerprint.test.node.d.ts +9 -0
  228. package/dist/storage/collection-fingerprint.test.node.d.ts.map +1 -0
  229. package/dist/storage/collection-fingerprint.test.node.js +256 -0
  230. package/dist/storage/collection-fingerprint.test.node.js.map +1 -0
  231. package/dist/storage/field-store-map.d.ts +59 -0
  232. package/dist/storage/field-store-map.d.ts.map +1 -0
  233. package/dist/storage/field-store-map.js +75 -0
  234. package/dist/storage/field-store-map.js.map +1 -0
  235. package/dist/storage/field-store-map.test.node.d.ts +9 -0
  236. package/dist/storage/field-store-map.test.node.d.ts.map +1 -0
  237. package/dist/storage/field-store-map.test.node.js +117 -0
  238. package/dist/storage/field-store-map.test.node.js.map +1 -0
  239. package/dist/storage/index.d.ts +10 -0
  240. package/dist/storage/index.d.ts.map +1 -0
  241. package/dist/storage/index.js +10 -0
  242. package/dist/storage/index.js.map +1 -0
  243. package/dist/utils/normalise-dates.d.ts +15 -0
  244. package/dist/utils/normalise-dates.d.ts.map +1 -0
  245. package/dist/utils/normalise-dates.js +22 -0
  246. package/dist/utils/normalise-dates.js.map +1 -0
  247. package/dist/utils/slugify.d.ts +56 -0
  248. package/dist/utils/slugify.d.ts.map +1 -0
  249. package/dist/utils/slugify.js +91 -0
  250. package/dist/utils/slugify.js.map +1 -0
  251. package/dist/utils/slugify.test.node.d.ts +9 -0
  252. package/dist/utils/slugify.test.node.d.ts.map +1 -0
  253. package/dist/utils/slugify.test.node.js +86 -0
  254. package/dist/utils/slugify.test.node.js.map +1 -0
  255. package/dist/utils/storage-utils.d.ts +36 -0
  256. package/dist/utils/storage-utils.d.ts.map +1 -0
  257. package/dist/utils/storage-utils.js +38 -0
  258. package/dist/utils/storage-utils.js.map +1 -0
  259. package/dist/utils/utils.general.d.ts +64 -0
  260. package/dist/utils/utils.general.d.ts.map +1 -0
  261. package/dist/utils/utils.general.js +219 -0
  262. package/dist/utils/utils.general.js.map +1 -0
  263. package/dist/validation/index.d.ts +9 -0
  264. package/dist/validation/index.d.ts.map +1 -0
  265. package/dist/validation/index.js +9 -0
  266. package/dist/validation/index.js.map +1 -0
  267. package/dist/validation/shared.d.ts +36 -0
  268. package/dist/validation/shared.d.ts.map +1 -0
  269. package/dist/validation/shared.js +42 -0
  270. package/dist/validation/shared.js.map +1 -0
  271. package/dist/workflow/index.d.ts +2 -0
  272. package/dist/workflow/index.d.ts.map +1 -0
  273. package/dist/workflow/index.js +3 -0
  274. package/dist/workflow/index.js.map +1 -0
  275. package/dist/workflow/workflow.d.ts +40 -0
  276. package/dist/workflow/workflow.d.ts.map +1 -0
  277. package/dist/workflow/workflow.js +96 -0
  278. package/dist/workflow/workflow.js.map +1 -0
  279. package/dist/workflow/workflow.test.node.d.ts +2 -0
  280. package/dist/workflow/workflow.test.node.d.ts.map +1 -0
  281. package/dist/workflow/workflow.test.node.js +198 -0
  282. package/dist/workflow/workflow.test.node.js.map +1 -0
  283. package/package.json +88 -0
@@ -0,0 +1,484 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ import { applyBeforeRead } from '../auth/apply-before-read.js';
9
+ import { ERR_READ_BUDGET_EXCEEDED } from '../lib/errors.js';
10
+ import { parseWhere } from '../query/parse-where.js';
11
+ import { applyAfterRead } from './document-read.js';
12
+ import { populateRichTextFields } from './richtext-populate.js';
13
+ // ---------------------------------------------------------------------------
14
+ // ReadContext — recursion guard
15
+ // ---------------------------------------------------------------------------
16
+ const DEFAULT_MAX_READS = 500;
17
+ const DEFAULT_MAX_DEPTH = 8;
18
+ /** Build a fresh ReadContext. */
19
+ export function createReadContext(overrides) {
20
+ return {
21
+ visited: overrides?.visited ?? new Set(),
22
+ afterReadFired: overrides?.afterReadFired ?? new Set(),
23
+ beforeReadCache: overrides?.beforeReadCache ?? new Map(),
24
+ readCount: overrides?.readCount ?? 0,
25
+ maxReads: overrides?.maxReads ?? DEFAULT_MAX_READS,
26
+ maxDepth: overrides?.maxDepth ?? DEFAULT_MAX_DEPTH,
27
+ };
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Main entry
31
+ // ---------------------------------------------------------------------------
32
+ /**
33
+ * Populate relation leaves in `opts.documents` in place, one DB
34
+ * round-trip per depth level per target collection.
35
+ */
36
+ export async function populateDocuments(opts) {
37
+ const ctx = opts.readContext ?? createReadContext();
38
+ const populate = opts.populate;
39
+ const requestedDepth = opts.depth ?? (populate !== undefined ? 1 : 0);
40
+ const maxDepth = Math.max(0, Math.min(requestedDepth, ctx.maxDepth));
41
+ // Mark the input documents as visited regardless of whether we populate —
42
+ // a future read-side hook that triggers further reads will then skip
43
+ // re-materialising documents it has already seen.
44
+ for (const doc of opts.documents) {
45
+ const id = doc?.document_id;
46
+ if (typeof id === 'string') {
47
+ ctx.visited.add(visitedKey(opts.collectionId, id));
48
+ }
49
+ }
50
+ if (populate === undefined || maxDepth === 0 || opts.documents.length === 0) {
51
+ return;
52
+ }
53
+ // Per-call cache: collection lookup key → resolved CollectionDefinition.
54
+ // Populated on first hit via synthetic match, path match, or a one-time
55
+ // `db.queries.collections.getCollectionById` fallback. Negative results
56
+ // are cached too (null) so we never double-query a missing target.
57
+ const defCache = new Map();
58
+ const sourceDef = await resolveCollectionDef(opts.db, opts.collections, opts.collectionId, defCache);
59
+ if (!sourceDef) {
60
+ // Cannot walk without field definitions; leave documents untouched.
61
+ return;
62
+ }
63
+ let current = opts.documents.map((doc) => ({
64
+ doc,
65
+ fieldDefs: sourceDef.fields,
66
+ populate,
67
+ }));
68
+ for (let level = 0; level < maxDepth; level++) {
69
+ const allLeaves = [];
70
+ for (const entry of current) {
71
+ if (entry.doc?.fields && typeof entry.doc.fields === 'object') {
72
+ collectRelationLeaves(entry.doc.fields, entry.fieldDefs, entry.populate, allLeaves);
73
+ }
74
+ }
75
+ if (allLeaves.length === 0)
76
+ break;
77
+ // Group by target collection so we batch one query per target.
78
+ const byTarget = new Map();
79
+ for (const leaf of allLeaves) {
80
+ const tid = leaf.value.targetCollectionId;
81
+ const arr = byTarget.get(tid);
82
+ if (arr)
83
+ arr.push(leaf);
84
+ else
85
+ byTarget.set(tid, [leaf]);
86
+ }
87
+ const nextLevel = [];
88
+ const queuedForNext = new Set();
89
+ for (const [targetCollectionId, leaves] of byTarget) {
90
+ const targetDef = await resolveCollectionDef(opts.db, opts.collections, targetCollectionId, defCache);
91
+ const selectList = buildBatchSelect(leaves, targetDef);
92
+ // Only fetch IDs we haven't materialised earlier in this request.
93
+ const idsToFetch = Array.from(new Set(leaves
94
+ .filter((l) => !ctx.visited.has(visitedKey(targetCollectionId, l.value.targetDocumentId)))
95
+ .map((l) => l.value.targetDocumentId)));
96
+ // Resolve the target collection's `beforeRead` predicate, if any.
97
+ // The cache on `ctx.beforeReadCache` ensures each (collectionPath,
98
+ // actor) tuple only runs through the hook once per request, even
99
+ // across populate fanout where the same target collection may be
100
+ // visited from multiple sources.
101
+ const targetFilters = await resolveBeforeReadFiltersForTarget({
102
+ targetDef,
103
+ collections: opts.collections,
104
+ requestContext: opts.requestContext,
105
+ readContext: ctx,
106
+ bypassBeforeRead: opts.bypassBeforeRead,
107
+ db: opts.db,
108
+ });
109
+ let fetched = [];
110
+ if (idsToFetch.length > 0) {
111
+ fetched = await opts.db.queries.documents.getDocumentsByDocumentIds({
112
+ collection_id: targetCollectionId,
113
+ document_ids: idsToFetch,
114
+ locale: opts.locale,
115
+ fields: selectList,
116
+ readMode: opts.readMode,
117
+ filters: targetFilters,
118
+ });
119
+ }
120
+ const byId = new Map();
121
+ for (const d of fetched) {
122
+ if (typeof d?.document_id === 'string')
123
+ byId.set(d.document_id, d);
124
+ }
125
+ // First pass: replace leaves with envelopes (reading visited state
126
+ // before we update it). Each envelope preserves the original link
127
+ // metadata (`targetDocumentId`, `targetCollectionId`, and any
128
+ // `relationshipType` / `cascadeDelete`) so consumers can
129
+ // round-trip or inspect the relationship regardless of outcome.
130
+ for (const leaf of leaves) {
131
+ const { targetDocumentId, targetCollectionId } = leaf.value;
132
+ const key = visitedKey(targetCollectionId, targetDocumentId);
133
+ if (ctx.visited.has(key)) {
134
+ leaf.parent[leaf.key] = {
135
+ ...leaf.value,
136
+ _resolved: true,
137
+ _cycle: true,
138
+ };
139
+ continue;
140
+ }
141
+ const fetchedDoc = byId.get(targetDocumentId);
142
+ if (fetchedDoc === undefined) {
143
+ leaf.parent[leaf.key] = {
144
+ ...leaf.value,
145
+ _resolved: false,
146
+ };
147
+ continue;
148
+ }
149
+ leaf.parent[leaf.key] = {
150
+ ...leaf.value,
151
+ _resolved: true,
152
+ document: fetchedDoc,
153
+ };
154
+ }
155
+ // Second pass: mark freshly fetched docs visited, update readCount,
156
+ // fire `afterRead`, enforce the budget, and queue them for the next
157
+ // level (dedup by id).
158
+ //
159
+ // `afterRead` fires here rather than after the full walk so the hook
160
+ // can mutate targets before their envelopes land in the source tree.
161
+ // A target's own direct relations may still be raw refs at this point
162
+ // (they populate on the next depth level); a hook that wants to
163
+ // observe populated grandchildren should run at the outer / source
164
+ // level where populate has fully returned.
165
+ for (const d of fetched) {
166
+ const id = d.document_id;
167
+ const key = visitedKey(targetCollectionId, id);
168
+ if (ctx.visited.has(key))
169
+ continue;
170
+ ctx.visited.add(key);
171
+ ctx.readCount += 1;
172
+ if (ctx.readCount > ctx.maxReads) {
173
+ throw ERR_READ_BUDGET_EXCEEDED({
174
+ message: `populate exceeded read budget (maxReads=${ctx.maxReads})`,
175
+ details: {
176
+ readCount: ctx.readCount,
177
+ maxReads: ctx.maxReads,
178
+ targetCollectionId,
179
+ targetDocumentId: id,
180
+ },
181
+ });
182
+ }
183
+ if (targetDef) {
184
+ // Rich-text populate runs *before* the user-land afterRead hook
185
+ // so hook authors observe fully-populated rich-text content. The
186
+ // gate (per-field `populateRelationsOnRead`) lives inside the
187
+ // service; passing the function unconditionally is correct.
188
+ if (opts.richTextPopulate) {
189
+ await populateRichTextFields({
190
+ fields: targetDef.fields,
191
+ collectionPath: targetDef.path,
192
+ documents: [d],
193
+ populate: opts.richTextPopulate,
194
+ readContext: ctx,
195
+ });
196
+ }
197
+ await applyAfterRead({ doc: d, definition: targetDef, readContext: ctx });
198
+ }
199
+ if (!targetDef || queuedForNext.has(key))
200
+ continue;
201
+ const childPopulate = reduceChildPopulate(leaves, id);
202
+ if (childPopulate === undefined)
203
+ continue;
204
+ queuedForNext.add(key);
205
+ nextLevel.push({
206
+ doc: d,
207
+ fieldDefs: targetDef.fields,
208
+ populate: childPopulate,
209
+ });
210
+ }
211
+ }
212
+ current = nextLevel;
213
+ if (current.length === 0)
214
+ break;
215
+ }
216
+ }
217
+ // ---------------------------------------------------------------------------
218
+ // Internals
219
+ // ---------------------------------------------------------------------------
220
+ function visitedKey(collectionId, documentId) {
221
+ return `${collectionId}:${documentId}`;
222
+ }
223
+ /**
224
+ * Resolve a collection reference (DB UUID *or* path) to its
225
+ * `CollectionDefinition`. Tries in order:
226
+ *
227
+ * 1. Synthetic `.id` match on the collections array — supports unit
228
+ * tests that attach a synthetic id, and is a cheap win when the
229
+ * caller has pre-decorated collections with DB UUIDs.
230
+ * 2. Direct `.path` match — the public API of CollectionDefinition.
231
+ * 3. DB fallback via `getCollectionById(id)` — resolves a real DB
232
+ * UUID to its path, then matches on the path. This is the
233
+ * production path for the admin server fn and `@byline/client`,
234
+ * which both pass DB UUIDs as `collectionId` / `target_collection_id`.
235
+ *
236
+ * Results (including misses) are cached in `cache` for the duration of
237
+ * the current populate call.
238
+ */
239
+ async function resolveCollectionDef(db, collections, id, cache) {
240
+ if (cache.has(id)) {
241
+ return cache.get(id) ?? undefined;
242
+ }
243
+ // 1. Synthetic `.id` (tests, pre-decorated arrays)
244
+ let def = collections.find((c) => c.id === id) ??
245
+ // 2. Path match
246
+ collections.find((c) => c.path === id);
247
+ // 3. DB fallback
248
+ if (!def) {
249
+ try {
250
+ const row = await db.queries.collections.getCollectionById(id);
251
+ if (row && typeof row.path === 'string') {
252
+ def = collections.find((c) => c.path === row.path);
253
+ }
254
+ }
255
+ catch {
256
+ // Missing target collection is handled by the caller via the
257
+ // unresolved-stub path — swallow lookup errors here.
258
+ }
259
+ }
260
+ cache.set(id, def ?? null);
261
+ return def;
262
+ }
263
+ /**
264
+ * Resolve the per-target-collection `beforeRead` predicate for a populate
265
+ * batch fetch and compile it to `DocumentFilter[]`. Skipped when:
266
+ * - the target collection definition could not be resolved (in which
267
+ * case populate emits an unresolved stub anyway),
268
+ * - no `requestContext` was threaded in (synthetic / test call paths
269
+ * that don't go through `CollectionHandle`),
270
+ * - `bypassBeforeRead` is set (admin tooling, seeds, migrations).
271
+ *
272
+ * Returns `undefined` when no scoping applies, so the adapter can skip
273
+ * the EXISTS-loop entirely.
274
+ */
275
+ async function resolveBeforeReadFiltersForTarget(params) {
276
+ const { targetDef, collections, requestContext, readContext, bypassBeforeRead, db } = params;
277
+ if (!targetDef || !requestContext || bypassBeforeRead)
278
+ return undefined;
279
+ const predicate = await applyBeforeRead({
280
+ definition: targetDef,
281
+ requestContext,
282
+ readContext,
283
+ });
284
+ if (predicate == null)
285
+ return undefined;
286
+ const parsed = await parseWhere(predicate, targetDef, {
287
+ collections,
288
+ resolveCollectionId: async (path) => {
289
+ // Match the target collection by path against the loaded collection
290
+ // list first (cheap, in-memory); fall back to a DB lookup for cases
291
+ // where a hook references a collection not loaded into the same
292
+ // populate context. This mirrors `CollectionHandle`'s parser ctx.
293
+ const local = collections.find((c) => c.path === path);
294
+ if (local?.id)
295
+ return local.id;
296
+ const row = await db.queries.collections.getCollectionByPath(path);
297
+ return row?.id ?? '';
298
+ },
299
+ });
300
+ return parsed.filters.length > 0 ? parsed.filters : undefined;
301
+ }
302
+ /**
303
+ * Walk `fields` against `fieldDefs` and collect every relation leaf whose
304
+ * name matches `populate`. Recurses through `group` / `array` / `blocks`
305
+ * using the same populate spec (structure field names do not scope the
306
+ * match — if `populate: { author: true }` is given, every `author`
307
+ * relation found in the tree matches).
308
+ */
309
+ function collectRelationLeaves(fields, fieldDefs, populate, acc) {
310
+ for (const def of fieldDefs) {
311
+ const rawValue = fields[def.name];
312
+ if (rawValue == null)
313
+ continue;
314
+ if (def.type === 'relation') {
315
+ const sub = matchesPopulate(def.name, populate);
316
+ if (sub === undefined)
317
+ continue;
318
+ if (!isRelatedDocumentValue(rawValue))
319
+ continue;
320
+ // Skip leaves that have already been replaced (e.g. via shared-ref
321
+ // duplication at the previous level); only raw RelatedDocumentValues
322
+ // are candidates for population.
323
+ if ('_resolved' in rawValue)
324
+ continue;
325
+ acc.push({
326
+ parent: fields,
327
+ key: def.name,
328
+ field: def,
329
+ value: rawValue,
330
+ sub,
331
+ });
332
+ continue;
333
+ }
334
+ if (def.type === 'group') {
335
+ if (typeof rawValue === 'object' && !Array.isArray(rawValue)) {
336
+ collectRelationLeaves(rawValue, def.fields, populate, acc);
337
+ }
338
+ continue;
339
+ }
340
+ if (def.type === 'array') {
341
+ if (Array.isArray(rawValue)) {
342
+ for (const item of rawValue) {
343
+ if (item && typeof item === 'object' && !Array.isArray(item)) {
344
+ collectRelationLeaves(item, def.fields, populate, acc);
345
+ }
346
+ }
347
+ }
348
+ continue;
349
+ }
350
+ if (def.type === 'blocks') {
351
+ if (Array.isArray(rawValue)) {
352
+ for (const item of rawValue) {
353
+ if (item && typeof item === 'object' && !Array.isArray(item)) {
354
+ // Reconstructed block items carry `_type` set to the variant's `blockType`.
355
+ const blockType = item._type;
356
+ if (typeof blockType !== 'string')
357
+ continue;
358
+ const block = def.blocks.find((b) => b.blockType === blockType);
359
+ if (!block)
360
+ continue;
361
+ collectRelationLeaves(item, block.fields, populate, acc);
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
367
+ }
368
+ function matchesPopulate(fieldName, populate) {
369
+ if (populate === true)
370
+ return true;
371
+ if (populate === '*')
372
+ return '*';
373
+ const spec = populate[fieldName];
374
+ return spec;
375
+ }
376
+ function isRelatedDocumentValue(v) {
377
+ return (typeof v === 'object' &&
378
+ v !== null &&
379
+ typeof v.targetDocumentId === 'string' &&
380
+ typeof v.targetCollectionId === 'string');
381
+ }
382
+ /**
383
+ * Build the `fields` array for a batch fetch against a single target
384
+ * collection.
385
+ *
386
+ * - Any leaf with `sub === '*'` → `undefined` (fetch all fields).
387
+ * - Otherwise → union of explicit `select` lists from each leaf,
388
+ * merged with the target's identity field (`useAsTitle`, falling
389
+ * back to the first text field). `sub === true` contributes no
390
+ * selects, so a batch of only-`true` leaves collapses to the
391
+ * identity field alone — the default projection.
392
+ *
393
+ * Document metadata (`document_id`, `collection_id`, `path`, `status`,
394
+ * timestamps) lives on the row itself and is always returned — it does
395
+ * not need to appear in the `fields` list.
396
+ */
397
+ function buildBatchSelect(leaves, targetDef) {
398
+ const union = new Set();
399
+ for (const leaf of leaves) {
400
+ if (leaf.sub === '*')
401
+ return undefined;
402
+ if (leaf.sub === true)
403
+ continue;
404
+ const select = leaf.sub.select;
405
+ if (select) {
406
+ for (const name of select)
407
+ union.add(name);
408
+ }
409
+ }
410
+ if (targetDef) {
411
+ const identity = resolveIdentityField(targetDef);
412
+ if (identity)
413
+ union.add(identity);
414
+ }
415
+ return Array.from(union);
416
+ }
417
+ /**
418
+ * The field that represents a target document's identity for populate's
419
+ * default projection. Prefers `useAsTitle` (server-safe schema-level
420
+ * config), falling back to the first declared text field.
421
+ */
422
+ function resolveIdentityField(def) {
423
+ if (def.useAsTitle)
424
+ return def.useAsTitle;
425
+ const firstText = def.fields.find((f) => f.type === 'text');
426
+ return firstText?.name;
427
+ }
428
+ /**
429
+ * Merge the per-leaf sub-populate specs for all leaves pointing at a
430
+ * single (now-populated) target document into a single PopulateSpec for
431
+ * the next level's walk of that document. Returns `undefined` if the
432
+ * leaves don't request any nested population (in which case the populated
433
+ * document's own relations stay as raw refs).
434
+ *
435
+ * Sub-spec semantics at the next level:
436
+ * - `'*'` → propagate `'*'` (scope=all, full projection, recursive).
437
+ * `'*'` wins over `true` when both appear in the same batch
438
+ * so the caller's "full document" intent is preserved.
439
+ * - `true` → recurse into every relation of the target (scope=all,
440
+ * default projection).
441
+ * - object → forward any nested `populate` map; ignore `select`.
442
+ */
443
+ function reduceChildPopulate(leaves, targetDocumentId) {
444
+ let anyStar = false;
445
+ let anyTrue = false;
446
+ const merged = {};
447
+ let hasMerged = false;
448
+ for (const l of leaves) {
449
+ if (l.value.targetDocumentId !== targetDocumentId)
450
+ continue;
451
+ if (l.sub === '*') {
452
+ anyStar = true;
453
+ break;
454
+ }
455
+ if (l.sub === true) {
456
+ anyTrue = true;
457
+ continue;
458
+ }
459
+ if (l.sub.populate !== undefined) {
460
+ for (const [k, v] of Object.entries(l.sub.populate)) {
461
+ merged[k] = v;
462
+ hasMerged = true;
463
+ }
464
+ }
465
+ }
466
+ if (anyStar)
467
+ return '*';
468
+ if (anyTrue)
469
+ return true;
470
+ if (hasMerged)
471
+ return merged;
472
+ return undefined;
473
+ }
474
+ // ---------------------------------------------------------------------------
475
+ // Internal re-exports for tests
476
+ // ---------------------------------------------------------------------------
477
+ export const __internal = {
478
+ collectRelationLeaves,
479
+ matchesPopulate,
480
+ buildBatchSelect,
481
+ reduceChildPopulate,
482
+ visitedKey,
483
+ };
484
+ //# sourceMappingURL=populate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/services/populate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=populate.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate.test.node.d.ts","sourceRoot":"","sources":["../../src/services/populate.test.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}