@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,463 @@
1
+ import type { RequestContext } from '@byline/auth';
2
+ import type { CollectionDefinition } from '@byline/core';
3
+ import type { QueryPredicate } from './query-predicate.js';
4
+ /**
5
+ * Read mode for document queries.
6
+ *
7
+ * - `'any'` — return the latest version of each document regardless
8
+ * of its workflow status (the standard `current_documents`
9
+ * view semantics). Default when omitted; used by admin
10
+ * UIs that need to surface in-progress drafts.
11
+ * - `'published'` — return the latest *published* version of each
12
+ * document, falling back past newer drafts to the
13
+ * previously-published content. A document with no
14
+ * published version is invisible in this mode.
15
+ * Used by public read consumers (`@byline/client`
16
+ * defaults to this).
17
+ */
18
+ export type ReadMode = 'any' | 'published';
19
+ /**
20
+ * Request-scoped context shared across every read and populate walk in one
21
+ * logical request. Threaded through populate, `afterRead` hooks, and any
22
+ * nested reads the hook itself performs — the visited set and read budget
23
+ * survive across these calls to prevent A→B→A infinite loops.
24
+ *
25
+ * Lives in `@types` (not `services/`) so collection-hook type definitions
26
+ * can reference it without a layer violation. The `createReadContext()`
27
+ * factory stays in `services/populate.ts`.
28
+ */
29
+ export interface ReadContext {
30
+ /**
31
+ * Composite keys (`${target_collection_id}:${document_id}`) for every
32
+ * document populate has materialised during this request. Used by the
33
+ * populate walk to skip re-fetching a target it has already expanded
34
+ * (the cycle-stub path).
35
+ */
36
+ visited: Set<string>;
37
+ /**
38
+ * Composite keys (`${collection_path}:${document_id}`) for every
39
+ * document whose `afterRead` hook has fired during this request. Used
40
+ * to enforce "each document runs through `afterRead` at most once per
41
+ * logical request" — the rule that forecloses the A→B→A loop when a
42
+ * hook performs its own reads.
43
+ */
44
+ afterReadFired: Set<string>;
45
+ /**
46
+ * Per-request memoisation of `beforeRead` hook results, keyed by
47
+ * `collectionPath`. Populate fans out across many source documents and
48
+ * many target-collection batches; without a cache, an async hook
49
+ * (e.g. resolving the actor's tenant id) would re-run on every batch.
50
+ * Keyed by collection path because the actor is invariant for the
51
+ * lifetime of one `ReadContext`. `null` records "hook ran and returned
52
+ * void" (i.e. no scoping applies); absence records "hook has not been
53
+ * run yet for this collection".
54
+ */
55
+ beforeReadCache: Map<string, QueryPredicate | null>;
56
+ /** Monotonic count of document materialisations; compared against `maxReads`. */
57
+ readCount: number;
58
+ /** Hard ceiling on materialisations per request. Default 500. */
59
+ maxReads: number;
60
+ /** Hard ceiling on populate depth per request. Default 8. */
61
+ maxDepth: number;
62
+ }
63
+ /** Operators supported by field-level WHERE clauses. */
64
+ export type FieldFilterOperator = '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$contains' | '$in' | '$nin';
65
+ /**
66
+ * A single field-level filter, pre-resolved to the correct EAV store table
67
+ * and value column. The client API's `parse-where` module produces these;
68
+ * the DB adapter consumes them to build EXISTS subqueries.
69
+ */
70
+ export interface FieldFilter {
71
+ kind: 'field';
72
+ /** The field name as declared in CollectionDefinition (e.g. 'title'). */
73
+ fieldName: string;
74
+ /** Which EAV store table holds this field's data (e.g. 'text', 'numeric'). */
75
+ storeType: string;
76
+ /** The column within the store table that holds the value (e.g. 'value', 'value_integer'). */
77
+ valueColumn: string;
78
+ /** The comparison operator. */
79
+ operator: FieldFilterOperator;
80
+ /** The value(s) to compare against. */
81
+ value: string | number | boolean | null | Array<string | number>;
82
+ }
83
+ /**
84
+ * A cross-collection relation filter. Matches documents whose relation
85
+ * field `fieldName` points at a target document that itself satisfies
86
+ * `nested` filters. Produced by `parse-where` when a where value under
87
+ * a relation field is a plain object of target-field predicates, e.g.
88
+ * `{ category: { path: 'news' } }`. The adapter compiles this into a
89
+ * nested EXISTS joining `store_relation` to the target collection's
90
+ * current-documents view and recursing into `nested` against the
91
+ * target's own EAV stores.
92
+ *
93
+ * The nesting is finite — user-written `where` clauses cannot cycle
94
+ * because the structure itself is finite — so no cycle guard is needed
95
+ * on this path (unlike populate, which traverses implicitly).
96
+ */
97
+ export interface RelationFilter {
98
+ kind: 'relation';
99
+ /** The relation field name on the source collection (e.g. 'category'). */
100
+ fieldName: string;
101
+ /** The target collection's id (resolved at parse time). */
102
+ targetCollectionId: string;
103
+ /** Filters applied to the target document. Recursive. */
104
+ nested: DocumentFilter[];
105
+ }
106
+ /**
107
+ * A boolean combinator group. Wraps a list of child filters with explicit
108
+ * AND or OR semantics; nests freely. Produced by `parse-where` from
109
+ * `$and` / `$or` keys in the source `QueryPredicate`. The adapter compiles
110
+ * each child into its existing SQL form (field EXISTS, relation EXISTS,
111
+ * or another combinator group) and joins them with the matching SQL
112
+ * operator inside parentheses.
113
+ *
114
+ * Top-level `$and` is structurally redundant with the implicit AND across
115
+ * `DocumentFilter[]` and the parser flattens it for simplicity; the
116
+ * combinator only earns its keep when nested inside `$or` (or vice versa).
117
+ */
118
+ export interface CombinatorFilter {
119
+ kind: 'and' | 'or';
120
+ children: DocumentFilter[];
121
+ }
122
+ /**
123
+ * A predicate over a document-version column (`status`, `path`). Distinct
124
+ * from `FieldFilter` — these columns live on `document_versions` itself,
125
+ * not on the EAV stores, so they compile to a direct outer-scope column
126
+ * comparison rather than an `EXISTS` subquery.
127
+ *
128
+ * Produced by `parse-where` when `status` / `path` appear *inside* a
129
+ * combinator (`$or` / `$and` child). At the top level the same keys are
130
+ * intercepted as reserved keys on `ParsedWhere.status` / `ParsedWhere.pathFilter`
131
+ * because they map to direct adapter parameters there; inside a
132
+ * combinator that mapping no longer makes sense (you can't OR-combine
133
+ * with the outer scalar parameter), so they downshift to this filter.
134
+ */
135
+ export interface DocumentColumnFilter {
136
+ kind: 'docColumn';
137
+ column: 'status' | 'path';
138
+ operator: FieldFilterOperator;
139
+ value: string | null;
140
+ }
141
+ /**
142
+ * Any filter that can appear in a `findDocuments` call — a direct field
143
+ * predicate (`FieldFilter`), a cross-collection hop through a relation
144
+ * (`RelationFilter`), a nested boolean combinator (`CombinatorFilter`),
145
+ * or a document-version column comparison (`DocumentColumnFilter`).
146
+ */
147
+ export type DocumentFilter = FieldFilter | RelationFilter | CombinatorFilter | DocumentColumnFilter;
148
+ /**
149
+ * A field-level sort descriptor, pre-resolved to the correct EAV store
150
+ * table and value column. Used for sorting by field values (as opposed to
151
+ * document-level columns like created_at).
152
+ */
153
+ export interface FieldSort {
154
+ /** The field name as declared in CollectionDefinition. */
155
+ fieldName: string;
156
+ /** Which EAV store table holds this field's data. */
157
+ storeType: string;
158
+ /** The column within the store table that holds the sortable value. */
159
+ valueColumn: string;
160
+ /** Sort direction. */
161
+ direction: 'asc' | 'desc';
162
+ }
163
+ export interface IDbAdapter {
164
+ commands: {
165
+ collections: ICollectionCommands;
166
+ documents: IDocumentCommands;
167
+ };
168
+ queries: {
169
+ collections: ICollectionQueries;
170
+ documents: IDocumentQueries;
171
+ };
172
+ }
173
+ export interface ICollectionCommands {
174
+ /**
175
+ * Insert a new collection row. `opts.version` and `opts.schemaHash` are
176
+ * used by the startup bootstrap to anchor initial values; omitted by
177
+ * legacy seed scripts that rely on the DB-level `version` default.
178
+ */
179
+ create(path: string, config: CollectionDefinition, opts?: {
180
+ version?: number;
181
+ schemaHash?: string;
182
+ }): Promise<any>;
183
+ /**
184
+ * Partial update for the collection row. Only fields supplied in `patch`
185
+ * are written — other columns are left untouched. Used by the startup
186
+ * bootstrap to record schema version bumps alongside a refreshed
187
+ * config/hash.
188
+ */
189
+ update(id: string, patch: {
190
+ config?: CollectionDefinition;
191
+ version?: number;
192
+ schemaHash?: string;
193
+ }): Promise<any>;
194
+ delete(id: string): Promise<any>;
195
+ }
196
+ export interface IDocumentCommands {
197
+ createDocumentVersion(params: {
198
+ documentId?: string;
199
+ collectionId: string;
200
+ /**
201
+ * The collection's schema version at the time of this write. Stamped
202
+ * onto the `documentVersions` row so that Phase-2 in-memory migration
203
+ * can later resolve each document against the shape it was authored
204
+ * under. Resolved by the caller from the core registry.
205
+ */
206
+ collectionVersion: number;
207
+ collectionConfig: CollectionDefinition;
208
+ action: string;
209
+ documentData: any;
210
+ path: string;
211
+ locale?: string;
212
+ status?: string;
213
+ createdBy?: string;
214
+ /**
215
+ * When updating an existing document, the version ID of the version being
216
+ * replaced. If provided and `locale` is a specific locale (not 'all'),
217
+ * field-value rows for other locales are copied forward from this version
218
+ * into the new one so that per-locale content is not lost.
219
+ */
220
+ previousVersionId?: string;
221
+ }): Promise<{
222
+ document: any;
223
+ fieldCount: number;
224
+ }>;
225
+ /**
226
+ * Mutate the status on an existing document version row.
227
+ *
228
+ * This is the one case where we UPDATE a version in-place rather than
229
+ * creating a new version — status is lifecycle metadata, not content.
230
+ */
231
+ setDocumentStatus(params: {
232
+ document_version_id: string;
233
+ status: string;
234
+ }): Promise<void>;
235
+ /**
236
+ * Archive ALL versions of a document that currently have a given status.
237
+ *
238
+ * Optionally exclude a specific version (e.g. the one being published right
239
+ * now) so we don't accidentally archive it.
240
+ *
241
+ * Returns the number of rows updated.
242
+ */
243
+ archivePublishedVersions(params: {
244
+ document_id: string;
245
+ currentStatus?: string;
246
+ excludeVersionId?: string;
247
+ }): Promise<number>;
248
+ /**
249
+ * Soft-delete a document by setting `is_deleted = true` on ALL of its
250
+ * versions. The `current_documents` view automatically filters these out,
251
+ * so the document disappears from listings without physically removing data.
252
+ *
253
+ * Returns the number of version rows marked as deleted.
254
+ */
255
+ softDeleteDocument(params: {
256
+ document_id: string;
257
+ }): Promise<number>;
258
+ }
259
+ export interface ICollectionQueries {
260
+ getAllCollections(): Promise<any[]>;
261
+ getCollectionByPath(path: string): Promise<any>;
262
+ getCollectionById(id: string): Promise<any>;
263
+ }
264
+ export interface IDocumentQueries {
265
+ getDocumentById(params: {
266
+ collection_id: string;
267
+ document_id: string;
268
+ locale?: string;
269
+ reconstruct?: boolean;
270
+ /** See `ReadMode`. Defaults to `'any'`. */
271
+ readMode?: ReadMode;
272
+ /**
273
+ * Additional WHERE-clause predicates ANDed onto the query. Used by
274
+ * `CollectionHandle` to apply `beforeRead`-hook scoping; when the
275
+ * predicate excludes the row, the method returns `null` (the same
276
+ * shape as "document does not exist").
277
+ */
278
+ filters?: DocumentFilter[];
279
+ /**
280
+ * Request-scoped auth context. Plumbing only in Phase 0 — adapters
281
+ * currently ignore it. Phase 4 uses it for `collections.<path>.read`
282
+ * ability assertion and for `beforeRead`-hook query scoping.
283
+ * See docs/analysis/AUTHN-AUTHZ-ANALYSIS.md.
284
+ */
285
+ requestContext?: RequestContext;
286
+ }): Promise<any | null>;
287
+ /**
288
+ * Fetch only the current version's metadata row (no field reconstruction).
289
+ *
290
+ * Use this when the caller only needs `{document_version_id, status,
291
+ * path, ...}` — for example, workflow transitions that read the current
292
+ * status and version ID before mutating. Skipping reconstruction avoids
293
+ * the full 7-way UNION ALL and the meta-row fetch.
294
+ *
295
+ * Returns `null` when the document does not exist (or has been soft-deleted).
296
+ */
297
+ getCurrentVersionMetadata(params: {
298
+ collection_id: string;
299
+ document_id: string;
300
+ }): Promise<{
301
+ document_version_id: string;
302
+ document_id: string;
303
+ collection_id: string;
304
+ path: string;
305
+ status: string;
306
+ created_at: Date;
307
+ updated_at: Date;
308
+ } | null>;
309
+ getDocumentByPath(params: {
310
+ collection_id: string;
311
+ path: string;
312
+ locale?: string;
313
+ reconstruct: boolean;
314
+ /** See `ReadMode`. Defaults to `'any'`. */
315
+ readMode?: ReadMode;
316
+ /** See `getDocumentById.filters`. */
317
+ filters?: DocumentFilter[];
318
+ /** See `getDocumentById.requestContext`. */
319
+ requestContext?: RequestContext;
320
+ }): Promise<any | null>;
321
+ getDocumentByVersion(params: {
322
+ document_version_id: string;
323
+ locale?: string;
324
+ }): Promise<any>;
325
+ getDocumentsByVersionIds(params: {
326
+ document_version_ids: string[];
327
+ locale?: string;
328
+ }): Promise<any[]>;
329
+ /**
330
+ * Batch-fetch current versions for a list of logical document IDs.
331
+ *
332
+ * Used by the client API's relationship populate pass: `store_relation`
333
+ * rows carry `target_document_id` values (not version IDs), so populate
334
+ * collects those IDs and resolves them to fully reconstructed documents
335
+ * in a single round trip. Supports selective field loading via `fields`.
336
+ *
337
+ * Only returns current (non-soft-deleted) versions. Missing IDs are
338
+ * silently omitted from the result.
339
+ */
340
+ getDocumentsByDocumentIds(params: {
341
+ collection_id: string;
342
+ document_ids: string[];
343
+ locale?: string;
344
+ fields?: string[];
345
+ /** See `ReadMode`. Defaults to `'any'`. */
346
+ readMode?: ReadMode;
347
+ /** See `getDocumentById.filters`. Used by populate to apply each target
348
+ * collection's `beforeRead` predicate to its batch fetch. */
349
+ filters?: DocumentFilter[];
350
+ /** See `getDocumentById.requestContext`. */
351
+ requestContext?: RequestContext;
352
+ }): Promise<any[]>;
353
+ getDocumentHistory(params: {
354
+ collection_id: string;
355
+ document_id: string;
356
+ locale?: string;
357
+ page?: number;
358
+ page_size?: number;
359
+ order?: string;
360
+ desc?: boolean;
361
+ query?: string;
362
+ }): Promise<{
363
+ documents: any[];
364
+ meta: {
365
+ total: number;
366
+ page: number;
367
+ page_size: number;
368
+ total_pages: number;
369
+ order: string;
370
+ desc: boolean;
371
+ };
372
+ }>;
373
+ /**
374
+ * Find the latest version of a document that has a specific status.
375
+ *
376
+ * This queries `document_versions` directly (not the current_documents view)
377
+ * so it can find a published version even when a newer draft exists.
378
+ *
379
+ * Returns minimal version metadata (not reconstructed content).
380
+ */
381
+ getPublishedVersion(params: {
382
+ collection_id: string;
383
+ document_id: string;
384
+ status?: string;
385
+ }): Promise<{
386
+ document_version_id: string;
387
+ document_id: string;
388
+ status: string;
389
+ created_at: Date;
390
+ updated_at: Date;
391
+ } | null>;
392
+ /**
393
+ * Return the set of document IDs (from the provided list) that have at
394
+ * least one version with the given status. Used to efficiently annotate
395
+ * list views with a "published version exists" flag.
396
+ */
397
+ getPublishedDocumentIds(params: {
398
+ collection_id: string;
399
+ document_ids: string[];
400
+ status?: string;
401
+ }): Promise<Set<string>>;
402
+ /**
403
+ * Return a count of current documents grouped by status for a given
404
+ * collection. Uses the `current_documents` view so each logical document
405
+ * is counted once at its latest version.
406
+ */
407
+ getDocumentCountsByStatus(params: {
408
+ collection_id: string;
409
+ /** See `getDocumentById.filters`. Used by `CollectionHandle.countByStatus`
410
+ * to apply `beforeRead`-hook scoping so per-status counts reflect only
411
+ * the rows the actor can see. */
412
+ filters?: DocumentFilter[];
413
+ /** See `getDocumentById.requestContext`. */
414
+ requestContext?: RequestContext;
415
+ }): Promise<Array<{
416
+ status: string;
417
+ count: number;
418
+ }>>;
419
+ /**
420
+ * Execute a filtered, sorted, paginated query against current documents
421
+ * using field-level EAV filters and optional field-level sorting.
422
+ *
423
+ * Used by the client API's query builder (Phase 2). Each FieldFilter
424
+ * becomes an EXISTS subquery against the appropriate store table; a
425
+ * RelationFilter becomes a nested EXISTS that joins through
426
+ * `store_relation` to the target collection's current-documents view
427
+ * and recurses into its own filters. A FieldSort becomes a LATERAL
428
+ * JOIN to pull the sort value into the outer query.
429
+ */
430
+ findDocuments(params: {
431
+ collection_id: string;
432
+ filters?: DocumentFilter[];
433
+ /**
434
+ * Exact-match filter on the current version's `status` column. Used by
435
+ * admin UIs that filter the list view by a specific status ("show me
436
+ * all drafts"). Distinct from `readMode`, which selects the *source
437
+ * view* — see `ReadMode`.
438
+ */
439
+ status?: string;
440
+ pathFilter?: {
441
+ operator: FieldFilterOperator;
442
+ value: string;
443
+ };
444
+ /** Text search across the collection's configured search fields. */
445
+ query?: string;
446
+ sort?: FieldSort;
447
+ /** Document-level sort column (created_at, updated_at, path). Used when sort is not a field-level sort. */
448
+ orderBy?: string;
449
+ orderDirection?: 'asc' | 'desc';
450
+ locale?: string;
451
+ page?: number;
452
+ pageSize?: number;
453
+ fields?: string[];
454
+ /** See `ReadMode`. Defaults to `'any'`. */
455
+ readMode?: ReadMode;
456
+ /** See `getDocumentById.requestContext`. */
457
+ requestContext?: RequestContext;
458
+ }): Promise<{
459
+ documents: any[];
460
+ total: number;
461
+ }>;
462
+ }
463
+ //# sourceMappingURL=db-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-types.d.ts","sourceRoot":"","sources":["../../src/@types/db-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-types.js","sourceRoot":"","sources":["../../src/@types/db-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,147 @@
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 type { ArrayField, BlocksField, Field, FieldSet, GroupField, LocalizedField, OptionalField, SelectField } from './field-types.js';
9
+ import type { Prettify, ValueUnion } from './type-utils.js';
10
+ type BaseFieldDataTypes = {
11
+ array: never;
12
+ blocks: never;
13
+ boolean: boolean;
14
+ checkbox: boolean;
15
+ date: Date;
16
+ datetime: Date;
17
+ decimal: string;
18
+ float: number;
19
+ group: never;
20
+ integer: number;
21
+ json: unknown;
22
+ object: unknown;
23
+ richText: unknown;
24
+ select: never;
25
+ textArea: string;
26
+ text: string;
27
+ time: string;
28
+ relation: RelatedDocumentValue;
29
+ file: StoredFileValue;
30
+ image: StoredFileValue;
31
+ };
32
+ type BlocksFieldData<T extends BlocksField> = Array<Prettify<ValueUnion<{
33
+ [K in T['blocks'][number] as K['blockType']]: Prettify<{
34
+ _id: string;
35
+ _type: K['blockType'];
36
+ } & FieldSetData<K['fields']>>;
37
+ }>>>;
38
+ type BaseFieldData<T extends Field> = T extends ArrayField ? Array<Prettify<{
39
+ _id: string;
40
+ } & FieldSetData<T['fields']>>> : T extends BlocksField ? Prettify<BlocksFieldData<T>> : T extends GroupField ? FieldSetData<T['fields']> : T extends SelectField ? T['options'][number]['value'] : BaseFieldDataTypes[T['type']];
41
+ export type FieldData<T extends Field = Field> = T extends OptionalField ? BaseFieldData<T> | undefined : BaseFieldData<T>;
42
+ export type FieldSetData<T extends FieldSet = FieldSet> = Prettify<{
43
+ -readonly [F in T[number] as F extends OptionalField ? never : F['name']]: FieldData<F>;
44
+ } & {
45
+ -readonly [F in T[number] as F extends OptionalField ? F['name'] : never]?: FieldData<F>;
46
+ }>;
47
+ export type PerLocale<T> = {
48
+ [locale: string]: T;
49
+ };
50
+ type BlocksFieldDataAllLocales<T extends BlocksField> = Array<Prettify<ValueUnion<{
51
+ [K in T['blocks'][number] as K['blockType']]: {
52
+ _id: string;
53
+ _type: K['blockType'];
54
+ } & FieldSetDataAllLocales<K['fields']>;
55
+ }>>>;
56
+ type BaseFieldDataAllLocales<T extends Field> = T extends ArrayField ? Array<Prettify<{
57
+ _id: string;
58
+ } & FieldSetDataAllLocales<T['fields']>>> : T extends BlocksField ? Prettify<BlocksFieldDataAllLocales<T>> : T extends GroupField ? FieldSetDataAllLocales<T['fields']> : T extends SelectField ? T['options'][number]['value'] : BaseFieldDataTypes[T['type']];
59
+ type LocalizedFieldDataAllLocales<T extends Field> = T extends LocalizedField ? PerLocale<BaseFieldDataAllLocales<T>> : BaseFieldDataAllLocales<T>;
60
+ export type FieldDataAllLocales<T extends Field = Field> = T extends OptionalField ? LocalizedFieldDataAllLocales<T> | undefined : LocalizedFieldDataAllLocales<T>;
61
+ export type FieldSetDataAllLocales<T extends FieldSet = FieldSet> = Prettify<{
62
+ -readonly [F in T[number] as F extends OptionalField ? never : F['name']]: FieldDataAllLocales<F>;
63
+ } & {
64
+ -readonly [F in T[number] as F extends OptionalField ? F['name'] : never]?: FieldDataAllLocales<F>;
65
+ }>;
66
+ /**
67
+ * One generated image variant persisted alongside the original file.
68
+ *
69
+ * Populated by the upload service after Sharp produces a derivative —
70
+ * the storage path is always present, the URL is captured at the
71
+ * upload moment via `storage.getUrl()`, and the resolved dimensions /
72
+ * output format are recorded so the read side can build a
73
+ * `<picture>` / `srcset` without a second round-trip.
74
+ */
75
+ export interface PersistedVariant {
76
+ /** Variant name from `UploadConfig.sizes[].name`, e.g. `'thumbnail'`, `'card'`. */
77
+ name: string;
78
+ storagePath: string;
79
+ storageUrl?: string;
80
+ width?: number;
81
+ height?: number;
82
+ /** Output format the variant was written as — `'webp'`, `'avif'`, etc. */
83
+ format?: string;
84
+ }
85
+ export interface StoredFileValue {
86
+ fileId: string;
87
+ filename: string;
88
+ originalFilename: string;
89
+ mimeType: string;
90
+ fileSize: number;
91
+ storageProvider: string;
92
+ storagePath: string;
93
+ storageUrl?: string;
94
+ fileHash?: string;
95
+ imageWidth?: number;
96
+ imageHeight?: number;
97
+ imageFormat?: string;
98
+ processingStatus: 'pending' | 'processing' | 'complete' | 'failed';
99
+ thumbnailGenerated?: boolean;
100
+ /**
101
+ * Image variants generated by the upload pipeline. Empty / absent for
102
+ * non-image uploads, for image fields with no `sizes` declared, or
103
+ * for bypass MIME types (SVG, GIF). The read side reads this directly
104
+ * — no special-casing in the EAV restore path.
105
+ */
106
+ variants?: PersistedVariant[];
107
+ }
108
+ /**
109
+ * A placeholder StoredFileValue used when an image/file is selected but not yet
110
+ * uploaded. This allows the form to hold the file's preview URL while deferring
111
+ * the actual upload until Save.
112
+ */
113
+ export interface PendingStoredFileValue {
114
+ fileId: string;
115
+ filename: string;
116
+ originalFilename: string;
117
+ mimeType: string;
118
+ fileSize: string;
119
+ storageProvider: 'pending';
120
+ storagePath: '';
121
+ storageUrl: string;
122
+ fileHash: null;
123
+ imageWidth: number | null;
124
+ imageHeight: number | null;
125
+ imageFormat: null;
126
+ processingStatus: 'pending';
127
+ thumbnailGenerated: false;
128
+ }
129
+ /**
130
+ * Type guard to check if a StoredFileValue represents a pending (not yet uploaded) file.
131
+ */
132
+ export declare function isPendingStoredFileValue(value: unknown): value is PendingStoredFileValue;
133
+ /**
134
+ * Create a pending placeholder value for a file that is selected but not yet uploaded.
135
+ */
136
+ export declare function createPendingStoredFileValue(file: File, previewUrl: string, dimensions?: {
137
+ width: number;
138
+ height: number;
139
+ }): PendingStoredFileValue;
140
+ export interface RelatedDocumentValue {
141
+ targetDocumentId: string;
142
+ targetCollectionId: string;
143
+ relationshipType?: string;
144
+ cascadeDelete?: boolean;
145
+ }
146
+ export {};
147
+ //# sourceMappingURL=field-data-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-data-types.d.ts","sourceRoot":"","sources":["../../src/@types/field-data-types.ts"],"names":[],"mappings":"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"}