@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,581 @@
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 { describe, expect, it } from 'vitest';
9
+ import { defineCollection, defineWorkflow } from '../@types/collection-types.js';
10
+ import { mergePredicates, parseSort, parseWhere } from './parse-where.js';
11
+ const testCollection = defineCollection({
12
+ path: 'test-articles',
13
+ labels: { singular: 'Article', plural: 'Articles' },
14
+ workflow: defineWorkflow({
15
+ draft: { label: 'Draft', verb: 'Revert to Draft' },
16
+ published: { label: 'Published', verb: 'Publish' },
17
+ }),
18
+ fields: [
19
+ { name: 'title', type: 'text', label: 'Title', localized: true },
20
+ { name: 'summary', type: 'textArea', label: 'Summary', localized: true },
21
+ { name: 'views', type: 'integer', label: 'Views', optional: true },
22
+ { name: 'rating', type: 'float', label: 'Rating', optional: true },
23
+ { name: 'featured', type: 'checkbox', label: 'Featured', optional: true },
24
+ { name: 'published_at', type: 'datetime', label: 'Published At', optional: true },
25
+ {
26
+ name: 'category',
27
+ type: 'relation',
28
+ label: 'Category',
29
+ targetCollection: 'test-categories',
30
+ optional: true,
31
+ },
32
+ ],
33
+ });
34
+ const categoriesCollection = defineCollection({
35
+ path: 'test-categories',
36
+ labels: { singular: 'Category', plural: 'Categories' },
37
+ workflow: defineWorkflow({
38
+ draft: { label: 'Draft', verb: 'Revert to Draft' },
39
+ published: { label: 'Published', verb: 'Publish' },
40
+ }),
41
+ fields: [
42
+ { name: 'name', type: 'text', label: 'Name', localized: true },
43
+ { name: 'path', type: 'text', label: 'Path' },
44
+ {
45
+ name: 'parent',
46
+ type: 'relation',
47
+ label: 'Parent',
48
+ targetCollection: 'test-categories',
49
+ optional: true,
50
+ },
51
+ ],
52
+ });
53
+ const collections = [testCollection, categoriesCollection];
54
+ /** Stub resolver keyed to deterministic string ids for assertions. */
55
+ const resolveCollectionId = async (path) => `id-${path}`;
56
+ const ctx = { collections, resolveCollectionId };
57
+ // ---------------------------------------------------------------------------
58
+ // parseWhere
59
+ // ---------------------------------------------------------------------------
60
+ describe('parseWhere', () => {
61
+ it('should return empty result for undefined where', async () => {
62
+ const result = await parseWhere(undefined, testCollection);
63
+ expect(result.filters).toEqual([]);
64
+ expect(result.status).toBeUndefined();
65
+ expect(result.query).toBeUndefined();
66
+ expect(result.pathFilter).toBeUndefined();
67
+ });
68
+ it('should extract status as a document-level condition', async () => {
69
+ const result = await parseWhere({ status: 'published' }, testCollection);
70
+ expect(result.status).toBe('published');
71
+ expect(result.filters).toEqual([]);
72
+ });
73
+ it('should extract query as a document-level condition', async () => {
74
+ const result = await parseWhere({ query: 'search term' }, testCollection);
75
+ expect(result.query).toBe('search term');
76
+ expect(result.filters).toEqual([]);
77
+ });
78
+ it('should extract path with bare value as a document-level $eq filter', async () => {
79
+ const result = await parseWhere({ path: 'hello-world' }, testCollection);
80
+ expect(result.pathFilter).toEqual({ operator: '$eq', value: 'hello-world' });
81
+ expect(result.filters).toEqual([]);
82
+ });
83
+ it('should extract path with $contains operator', async () => {
84
+ const result = await parseWhere({ path: { $contains: 'news' } }, testCollection);
85
+ expect(result.pathFilter).toEqual({ operator: '$contains', value: 'news' });
86
+ });
87
+ it('should normalise bare value to $eq for text fields', async () => {
88
+ const result = await parseWhere({ title: 'Hello' }, testCollection);
89
+ expect(result.filters).toHaveLength(1);
90
+ expect(result.filters[0]).toEqual({
91
+ kind: 'field',
92
+ fieldName: 'title',
93
+ storeType: 'text',
94
+ valueColumn: 'value',
95
+ operator: '$eq',
96
+ value: 'Hello',
97
+ });
98
+ });
99
+ it('should resolve $contains on a text field', async () => {
100
+ const result = await parseWhere({ title: { $contains: 'launch' } }, testCollection);
101
+ expect(result.filters).toHaveLength(1);
102
+ expect(result.filters[0]).toEqual({
103
+ kind: 'field',
104
+ fieldName: 'title',
105
+ storeType: 'text',
106
+ valueColumn: 'value',
107
+ operator: '$contains',
108
+ value: 'launch',
109
+ });
110
+ });
111
+ it('should resolve integer fields to numeric store with value_integer column', async () => {
112
+ const result = await parseWhere({ views: { $gte: 100 } }, testCollection);
113
+ expect(result.filters).toHaveLength(1);
114
+ expect(result.filters[0]).toEqual({
115
+ kind: 'field',
116
+ fieldName: 'views',
117
+ storeType: 'numeric',
118
+ valueColumn: 'value_integer',
119
+ operator: '$gte',
120
+ value: 100,
121
+ });
122
+ });
123
+ it('should resolve float fields to numeric store with value_float column', async () => {
124
+ const result = await parseWhere({ rating: { $gt: 4.5 } }, testCollection);
125
+ expect(result.filters).toHaveLength(1);
126
+ expect(result.filters[0]).toEqual({
127
+ kind: 'field',
128
+ fieldName: 'rating',
129
+ storeType: 'numeric',
130
+ valueColumn: 'value_float',
131
+ operator: '$gt',
132
+ value: 4.5,
133
+ });
134
+ });
135
+ it('should resolve checkbox fields to boolean store', async () => {
136
+ const result = await parseWhere({ featured: true }, testCollection);
137
+ expect(result.filters).toHaveLength(1);
138
+ expect(result.filters[0]).toEqual({
139
+ kind: 'field',
140
+ fieldName: 'featured',
141
+ storeType: 'boolean',
142
+ valueColumn: 'value',
143
+ operator: '$eq',
144
+ value: true,
145
+ });
146
+ });
147
+ it('should resolve datetime fields to datetime store', async () => {
148
+ const result = await parseWhere({ published_at: { $gte: '2026-01-01T00:00:00Z' } }, testCollection);
149
+ expect(result.filters).toHaveLength(1);
150
+ expect(result.filters[0]).toEqual({
151
+ kind: 'field',
152
+ fieldName: 'published_at',
153
+ storeType: 'datetime',
154
+ valueColumn: 'value_timestamp_tz',
155
+ operator: '$gte',
156
+ value: '2026-01-01T00:00:00Z',
157
+ });
158
+ });
159
+ it('should handle $in operator', async () => {
160
+ const result = await parseWhere({ title: { $in: ['Hello', 'World'] } }, testCollection);
161
+ expect(result.filters[0]).toEqual({
162
+ kind: 'field',
163
+ fieldName: 'title',
164
+ storeType: 'text',
165
+ valueColumn: 'value',
166
+ operator: '$in',
167
+ value: ['Hello', 'World'],
168
+ });
169
+ });
170
+ it('should handle mixed document-level and field-level conditions', async () => {
171
+ const result = await parseWhere({
172
+ status: 'published',
173
+ query: 'search',
174
+ title: { $contains: 'launch' },
175
+ views: { $gte: 50 },
176
+ }, testCollection);
177
+ expect(result.status).toBe('published');
178
+ expect(result.query).toBe('search');
179
+ expect(result.filters).toHaveLength(2);
180
+ const fieldNames = result.filters.flatMap((f) => (f.kind === 'field' ? [f.fieldName] : []));
181
+ expect(fieldNames.sort()).toEqual(['title', 'views']);
182
+ });
183
+ it('should skip unknown field names silently', async () => {
184
+ const result = await parseWhere({ nonexistent: 'value' }, testCollection);
185
+ expect(result.filters).toEqual([]);
186
+ });
187
+ it('should handle null values', async () => {
188
+ const result = await parseWhere({ title: null }, testCollection);
189
+ expect(result.filters).toHaveLength(1);
190
+ const f = result.filters[0];
191
+ if (f.kind !== 'field')
192
+ throw new Error('expected field filter');
193
+ expect(f.operator).toBe('$eq');
194
+ expect(f.value).toBeNull();
195
+ });
196
+ // -------------------------------------------------------------------------
197
+ // Relation sub-where
198
+ // -------------------------------------------------------------------------
199
+ it('should treat bare string on a relation field as $eq on targetDocumentId', async () => {
200
+ const result = await parseWhere({ category: 'some-category-doc-id' }, testCollection, ctx);
201
+ expect(result.filters).toHaveLength(1);
202
+ expect(result.filters[0]).toEqual({
203
+ kind: 'field',
204
+ fieldName: 'category',
205
+ storeType: 'relation',
206
+ valueColumn: 'target_document_id',
207
+ operator: '$eq',
208
+ value: 'some-category-doc-id',
209
+ });
210
+ });
211
+ it('should treat an operator-object on a relation field as a scalar filter', async () => {
212
+ const result = await parseWhere({ category: { $in: ['cat-a', 'cat-b'] } }, testCollection, ctx);
213
+ expect(result.filters).toHaveLength(1);
214
+ expect(result.filters[0]).toEqual({
215
+ kind: 'field',
216
+ fieldName: 'category',
217
+ storeType: 'relation',
218
+ valueColumn: 'target_document_id',
219
+ operator: '$in',
220
+ value: ['cat-a', 'cat-b'],
221
+ });
222
+ });
223
+ it('should emit a RelationFilter for a nested plain-object sub-where', async () => {
224
+ const result = await parseWhere({ category: { path: 'news' } }, testCollection, ctx);
225
+ expect(result.filters).toHaveLength(1);
226
+ expect(result.filters[0]).toEqual({
227
+ kind: 'relation',
228
+ fieldName: 'category',
229
+ targetCollectionId: 'id-test-categories',
230
+ nested: [
231
+ {
232
+ kind: 'field',
233
+ fieldName: 'path',
234
+ storeType: 'text',
235
+ valueColumn: 'value',
236
+ operator: '$eq',
237
+ value: 'news',
238
+ },
239
+ ],
240
+ });
241
+ });
242
+ it('should support operator objects inside a nested sub-where', async () => {
243
+ const result = await parseWhere({ category: { name: { $contains: 'news' } } }, testCollection, ctx);
244
+ const relation = result.filters[0];
245
+ expect(relation?.kind).toBe('relation');
246
+ if (relation?.kind !== 'relation')
247
+ return;
248
+ expect(relation.nested).toEqual([
249
+ {
250
+ kind: 'field',
251
+ fieldName: 'name',
252
+ storeType: 'text',
253
+ valueColumn: 'value',
254
+ operator: '$contains',
255
+ value: 'news',
256
+ },
257
+ ]);
258
+ });
259
+ it('should recurse into multi-hop relation sub-wheres', async () => {
260
+ const result = await parseWhere({ category: { parent: { path: 'news' } } }, testCollection, ctx);
261
+ const top = result.filters[0];
262
+ expect(top?.kind).toBe('relation');
263
+ if (top?.kind !== 'relation')
264
+ return;
265
+ expect(top.fieldName).toBe('category');
266
+ expect(top.targetCollectionId).toBe('id-test-categories');
267
+ expect(top.nested).toHaveLength(1);
268
+ const inner = top.nested[0];
269
+ expect(inner?.kind).toBe('relation');
270
+ if (inner?.kind !== 'relation')
271
+ return;
272
+ expect(inner.fieldName).toBe('parent');
273
+ expect(inner.targetCollectionId).toBe('id-test-categories');
274
+ expect(inner.nested).toEqual([
275
+ {
276
+ kind: 'field',
277
+ fieldName: 'path',
278
+ storeType: 'text',
279
+ valueColumn: 'value',
280
+ operator: '$eq',
281
+ value: 'news',
282
+ },
283
+ ]);
284
+ });
285
+ it('should skip nested sub-where when ctx is not provided', async () => {
286
+ const result = await parseWhere({ category: { path: 'news' } }, testCollection);
287
+ expect(result.filters).toEqual([]);
288
+ });
289
+ it('should skip nested sub-where when target collection is not registered', async () => {
290
+ const lonelyCollection = defineCollection({
291
+ path: 'lonely',
292
+ labels: { singular: 'Lonely', plural: 'Lonelies' },
293
+ workflow: defineWorkflow({
294
+ draft: { label: 'Draft', verb: 'Revert to Draft' },
295
+ published: { label: 'Published', verb: 'Publish' },
296
+ }),
297
+ fields: [
298
+ {
299
+ name: 'ghost',
300
+ type: 'relation',
301
+ label: 'Ghost',
302
+ targetCollection: 'not-registered',
303
+ optional: true,
304
+ },
305
+ ],
306
+ });
307
+ const result = await parseWhere({ ghost: { path: 'x' } }, lonelyCollection, {
308
+ collections: [lonelyCollection],
309
+ resolveCollectionId,
310
+ });
311
+ expect(result.filters).toEqual([]);
312
+ });
313
+ it('should compose ordinary filters alongside a relation sub-where', async () => {
314
+ const result = await parseWhere({
315
+ title: { $contains: 'launch' },
316
+ category: { path: 'news' },
317
+ }, testCollection, ctx);
318
+ expect(result.filters).toHaveLength(2);
319
+ const kinds = result.filters.map((f) => f.kind).sort();
320
+ expect(kinds).toEqual(['field', 'relation']);
321
+ });
322
+ });
323
+ // ---------------------------------------------------------------------------
324
+ // parseSort
325
+ // ---------------------------------------------------------------------------
326
+ describe('parseSort', () => {
327
+ it('should default to created_at desc when no sort provided', () => {
328
+ const result = parseSort(undefined, testCollection);
329
+ expect(result.orderBy).toBe('created_at');
330
+ expect(result.orderDirection).toBe('desc');
331
+ expect(result.fieldSort).toBeUndefined();
332
+ });
333
+ it('should default to created_at desc for empty object', () => {
334
+ const result = parseSort({}, testCollection);
335
+ expect(result.orderBy).toBe('created_at');
336
+ expect(result.orderDirection).toBe('desc');
337
+ });
338
+ it('should map camelCase createdAt to document-level column', () => {
339
+ const result = parseSort({ createdAt: 'asc' }, testCollection);
340
+ expect(result.orderBy).toBe('created_at');
341
+ expect(result.orderDirection).toBe('asc');
342
+ expect(result.fieldSort).toBeUndefined();
343
+ });
344
+ it('should return field sort for a text field', () => {
345
+ const result = parseSort({ title: 'asc' }, testCollection);
346
+ expect(result.fieldSort).toEqual({
347
+ fieldName: 'title',
348
+ storeType: 'text',
349
+ valueColumn: 'value',
350
+ direction: 'asc',
351
+ });
352
+ expect(result.orderBy).toBeUndefined();
353
+ });
354
+ it('should return field sort for a numeric field', () => {
355
+ const result = parseSort({ views: 'desc' }, testCollection);
356
+ expect(result.fieldSort).toEqual({
357
+ fieldName: 'views',
358
+ storeType: 'numeric',
359
+ valueColumn: 'value_integer',
360
+ direction: 'desc',
361
+ });
362
+ });
363
+ it('should fall back to created_at for unknown field name', () => {
364
+ const result = parseSort({ nonexistent: 'asc' }, testCollection);
365
+ expect(result.orderBy).toBe('created_at');
366
+ expect(result.orderDirection).toBe('desc');
367
+ expect(result.fieldSort).toBeUndefined();
368
+ });
369
+ });
370
+ // ---------------------------------------------------------------------------
371
+ // $and / $or combinators
372
+ // ---------------------------------------------------------------------------
373
+ describe('parseWhere — combinators', () => {
374
+ it('flattens a top-level $and into the implicit-AND filter list', async () => {
375
+ const result = await parseWhere({ $and: [{ title: 'Hello' }, { views: { $gte: 100 } }] }, testCollection);
376
+ expect(result.filters).toHaveLength(2);
377
+ expect(result.filters[0]).toMatchObject({ kind: 'field', fieldName: 'title' });
378
+ expect(result.filters[1]).toMatchObject({ kind: 'field', fieldName: 'views' });
379
+ });
380
+ it('wraps a top-level $or in a single combinator node', async () => {
381
+ const result = await parseWhere({ $or: [{ title: 'Hello' }, { views: { $gte: 100 } }] }, testCollection);
382
+ expect(result.filters).toHaveLength(1);
383
+ expect(result.filters[0]).toMatchObject({
384
+ kind: 'or',
385
+ children: [
386
+ { kind: 'field', fieldName: 'title' },
387
+ { kind: 'field', fieldName: 'views' },
388
+ ],
389
+ });
390
+ });
391
+ it('wraps multi-key $or branches in a nested AND combinator', async () => {
392
+ const result = await parseWhere({
393
+ $or: [{ title: 'Hello', featured: true }, { views: { $gte: 100 } }],
394
+ }, testCollection);
395
+ expect(result.filters).toHaveLength(1);
396
+ const top = result.filters[0];
397
+ expect(top.kind).toBe('or');
398
+ if (top.kind !== 'or')
399
+ return;
400
+ expect(top.children).toHaveLength(2);
401
+ expect(top.children[0]).toMatchObject({
402
+ kind: 'and',
403
+ children: [
404
+ { kind: 'field', fieldName: 'title' },
405
+ { kind: 'field', fieldName: 'featured' },
406
+ ],
407
+ });
408
+ expect(top.children[1]).toMatchObject({ kind: 'field', fieldName: 'views' });
409
+ });
410
+ it('combines field predicates and combinators at the same level', async () => {
411
+ const result = await parseWhere({
412
+ featured: true,
413
+ $or: [{ title: 'Hello' }, { title: 'World' }],
414
+ }, testCollection);
415
+ expect(result.filters).toHaveLength(2);
416
+ expect(result.filters[0]).toMatchObject({ kind: 'field', fieldName: 'featured' });
417
+ expect(result.filters[1]).toMatchObject({ kind: 'or' });
418
+ });
419
+ it('skips empty $or branches that parse to no filters', async () => {
420
+ const result = await parseWhere({
421
+ $or: [
422
+ { title: 'Hello' },
423
+ // unknown-field branch — parser drops it, leaving an empty group
424
+ { nonexistent: 'value' },
425
+ ],
426
+ }, testCollection);
427
+ expect(result.filters).toHaveLength(1);
428
+ const top = result.filters[0];
429
+ expect(top.kind).toBe('or');
430
+ if (top.kind !== 'or')
431
+ return;
432
+ // Only the title branch survives.
433
+ expect(top.children).toHaveLength(1);
434
+ expect(top.children[0]).toMatchObject({ kind: 'field', fieldName: 'title' });
435
+ });
436
+ it('drops a $or whose every branch is empty', async () => {
437
+ const result = await parseWhere({
438
+ $or: [{ nonexistent: 'a' }, { alsoNonexistent: 'b' }],
439
+ }, testCollection);
440
+ // No combinator emitted — would have meant "OR of nothing", a semantic
441
+ // landmine if compiled to SQL.
442
+ expect(result.filters).toEqual([]);
443
+ });
444
+ it('drops a non-array combinator value (defensive)', async () => {
445
+ const result = await parseWhere({
446
+ // biome-ignore lint/suspicious/noExplicitAny: deliberately malformed input
447
+ $or: { title: 'Hello' },
448
+ }, testCollection);
449
+ expect(result.filters).toEqual([]);
450
+ });
451
+ it('nests $or inside $and correctly', async () => {
452
+ const result = await parseWhere({
453
+ $and: [{ featured: true }, { $or: [{ title: 'a' }, { title: 'b' }] }],
454
+ }, testCollection);
455
+ // $and flattens to two top-level filters.
456
+ expect(result.filters).toHaveLength(2);
457
+ expect(result.filters[0]).toMatchObject({ kind: 'field', fieldName: 'featured' });
458
+ expect(result.filters[1]).toMatchObject({
459
+ kind: 'or',
460
+ children: [
461
+ { kind: 'field', fieldName: 'title' },
462
+ { kind: 'field', fieldName: 'title' },
463
+ ],
464
+ });
465
+ });
466
+ it('emits a docColumn filter when status appears inside an $or', async () => {
467
+ const result = await parseWhere({
468
+ $or: [{ status: 'published' }, { status: 'draft', title: 'Hello' }],
469
+ }, testCollection);
470
+ // Top-level $or stays as a single combinator wrapping each branch.
471
+ expect(result.filters).toHaveLength(1);
472
+ const top = result.filters[0];
473
+ expect(top.kind).toBe('or');
474
+ if (top.kind !== 'or')
475
+ return;
476
+ expect(top.children).toHaveLength(2);
477
+ // First branch: just a status check, downshifted from reserved key.
478
+ expect(top.children[0]).toMatchObject({
479
+ kind: 'docColumn',
480
+ column: 'status',
481
+ operator: '$eq',
482
+ value: 'published',
483
+ });
484
+ // Second branch has both a status check and a title filter — wrapped
485
+ // in an inner `and` so the outer `or` sees one node per branch.
486
+ expect(top.children[1]).toMatchObject({ kind: 'and' });
487
+ if (top.children[1]?.kind !== 'and')
488
+ return;
489
+ expect(top.children[1].children).toHaveLength(2);
490
+ expect(top.children[1].children[0]).toMatchObject({
491
+ kind: 'docColumn',
492
+ column: 'status',
493
+ value: 'draft',
494
+ });
495
+ expect(top.children[1].children[1]).toMatchObject({ kind: 'field', fieldName: 'title' });
496
+ // None of the combinator-internal status writes should leak into
497
+ // `result.status` — that's reserved for top-level scalar filters.
498
+ expect(result.status).toBeUndefined();
499
+ });
500
+ it('emits a docColumn filter when path appears inside an $or', async () => {
501
+ const result = await parseWhere({ $or: [{ path: 'a' }, { path: { $contains: 'b' } }] }, testCollection);
502
+ expect(result.pathFilter).toBeUndefined(); // not the top-level reserved form
503
+ const top = result.filters[0];
504
+ expect(top.kind).toBe('or');
505
+ if (top.kind !== 'or')
506
+ return;
507
+ expect(top.children[0]).toMatchObject({
508
+ kind: 'docColumn',
509
+ column: 'path',
510
+ operator: '$eq',
511
+ value: 'a',
512
+ });
513
+ expect(top.children[1]).toMatchObject({
514
+ kind: 'docColumn',
515
+ column: 'path',
516
+ operator: '$contains',
517
+ value: 'b',
518
+ });
519
+ });
520
+ it('still treats top-level status / path as the reserved scalar form', async () => {
521
+ // Sanity: outside a combinator, status and path go on the ParsedWhere
522
+ // top-level slots and emit no DocumentFilter.
523
+ const result = await parseWhere({ status: 'published', path: 'foo' }, testCollection);
524
+ expect(result.status).toBe('published');
525
+ expect(result.pathFilter).toEqual({ operator: '$eq', value: 'foo' });
526
+ expect(result.filters).toEqual([]);
527
+ });
528
+ it('parses combinators inside a nested relation sub-where', async () => {
529
+ const result = await parseWhere({
530
+ category: {
531
+ $or: [{ name: 'News' }, { path: 'announcements' }],
532
+ },
533
+ }, testCollection, ctx);
534
+ expect(result.filters).toHaveLength(1);
535
+ const rel = result.filters[0];
536
+ expect(rel.kind).toBe('relation');
537
+ if (rel.kind !== 'relation')
538
+ return;
539
+ expect(rel.nested).toHaveLength(1);
540
+ expect(rel.nested[0]).toMatchObject({
541
+ kind: 'or',
542
+ children: [
543
+ { kind: 'field', fieldName: 'name' },
544
+ { kind: 'field', fieldName: 'path' },
545
+ ],
546
+ });
547
+ });
548
+ });
549
+ // ---------------------------------------------------------------------------
550
+ // mergePredicates
551
+ // ---------------------------------------------------------------------------
552
+ describe('mergePredicates', () => {
553
+ it('returns undefined when both sides are absent', () => {
554
+ expect(mergePredicates(undefined, undefined)).toBeUndefined();
555
+ expect(mergePredicates(null, undefined)).toBeUndefined();
556
+ });
557
+ it('returns the user where when no hook predicate', () => {
558
+ const userWhere = { title: 'Hello' };
559
+ expect(mergePredicates(undefined, userWhere)).toBe(userWhere);
560
+ expect(mergePredicates(null, userWhere)).toBe(userWhere);
561
+ });
562
+ it('returns the hook predicate when no user where', () => {
563
+ const hookPredicate = { tenantId: 't-1' };
564
+ expect(mergePredicates(hookPredicate, undefined)).toBe(hookPredicate);
565
+ });
566
+ it('wraps both sides in $and when both present', () => {
567
+ const hookPredicate = { tenantId: 't-1' };
568
+ const userWhere = { status: 'published' };
569
+ const merged = mergePredicates(hookPredicate, userWhere);
570
+ expect(merged).toEqual({ $and: [hookPredicate, userWhere] });
571
+ });
572
+ it('round-trips a merged predicate through parseWhere as implicit AND', async () => {
573
+ const merged = mergePredicates({ featured: true }, { title: 'Hello' });
574
+ const parsed = await parseWhere(merged, testCollection);
575
+ // Top-level $and is flattened by the parser, so we get two field filters.
576
+ expect(parsed.filters).toHaveLength(2);
577
+ expect(parsed.filters[0]).toMatchObject({ kind: 'field', fieldName: 'featured' });
578
+ expect(parsed.filters[1]).toMatchObject({ kind: 'field', fieldName: 'title' });
579
+ });
580
+ });
581
+ //# sourceMappingURL=parse-where.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-where.test.node.js","sourceRoot":"","sources":["../../src/query/parse-where.test.node.ts"],"names":[],"mappings":"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"}