@nicia-ai/typegraph 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +31 -0
  2. package/dist/backend/postgres/index.cjs +31 -18
  3. package/dist/backend/postgres/index.d.cts +6 -6
  4. package/dist/backend/postgres/index.d.ts +6 -6
  5. package/dist/backend/postgres/index.js +9 -8
  6. package/dist/backend/postgres/pglite.cjs +13 -12
  7. package/dist/backend/postgres/pglite.cjs.map +1 -1
  8. package/dist/backend/postgres/pglite.d.cts +3 -3
  9. package/dist/backend/postgres/pglite.d.ts +3 -3
  10. package/dist/backend/postgres/pglite.js +9 -8
  11. package/dist/backend/postgres/pglite.js.map +1 -1
  12. package/dist/backend/sqlite/index.cjs +29 -16
  13. package/dist/backend/sqlite/index.d.cts +7 -7
  14. package/dist/backend/sqlite/index.d.ts +7 -7
  15. package/dist/backend/sqlite/index.js +8 -7
  16. package/dist/backend/sqlite/libsql.cjs +13 -12
  17. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  18. package/dist/backend/sqlite/libsql.d.cts +3 -3
  19. package/dist/backend/sqlite/libsql.d.ts +3 -3
  20. package/dist/backend/sqlite/libsql.js +9 -8
  21. package/dist/backend/sqlite/libsql.js.map +1 -1
  22. package/dist/backend/sqlite/local.cjs +14 -13
  23. package/dist/backend/sqlite/local.cjs.map +1 -1
  24. package/dist/backend/sqlite/local.d.cts +3 -3
  25. package/dist/backend/sqlite/local.d.ts +3 -3
  26. package/dist/backend/sqlite/local.js +9 -8
  27. package/dist/backend/sqlite/local.js.map +1 -1
  28. package/dist/{chunk-SFFJ2IKN.cjs → chunk-3642VBVC.cjs} +70 -68
  29. package/dist/chunk-3642VBVC.cjs.map +1 -0
  30. package/dist/chunk-3E7SNSIA.cjs +55 -0
  31. package/dist/chunk-3E7SNSIA.cjs.map +1 -0
  32. package/dist/{chunk-6RMLO5O4.cjs → chunk-3IR2GEMJ.cjs} +8 -7
  33. package/dist/chunk-3IR2GEMJ.cjs.map +1 -0
  34. package/dist/{chunk-6SA7UIQJ.cjs → chunk-3QRBXYT5.cjs} +6 -6
  35. package/dist/{chunk-6SA7UIQJ.cjs.map → chunk-3QRBXYT5.cjs.map} +1 -1
  36. package/dist/{chunk-54JVNOAQ.cjs → chunk-4RBAJVEC.cjs} +128 -6
  37. package/dist/chunk-4RBAJVEC.cjs.map +1 -0
  38. package/dist/{chunk-IJORSAC3.js → chunk-6NRFUHMS.js} +4 -3
  39. package/dist/chunk-6NRFUHMS.js.map +1 -0
  40. package/dist/{chunk-FLOI7QOT.cjs → chunk-BF3ZDEUE.cjs} +104 -72
  41. package/dist/chunk-BF3ZDEUE.cjs.map +1 -0
  42. package/dist/{chunk-2HZGWCB4.js → chunk-C4C4Q7A6.js} +3 -3
  43. package/dist/chunk-C4C4Q7A6.js.map +1 -0
  44. package/dist/{chunk-O4VUR6SI.js → chunk-CEF2QOTO.js} +3 -3
  45. package/dist/{chunk-O4VUR6SI.js.map → chunk-CEF2QOTO.js.map} +1 -1
  46. package/dist/{chunk-V4IQYOQ4.cjs → chunk-CFNT3ITG.cjs} +3 -3
  47. package/dist/chunk-CFNT3ITG.cjs.map +1 -0
  48. package/dist/{chunk-LJLMDDCW.js → chunk-CWFPJ3RC.js} +3 -3
  49. package/dist/{chunk-LJLMDDCW.js.map → chunk-CWFPJ3RC.js.map} +1 -1
  50. package/dist/{chunk-RZ4DH4E7.cjs → chunk-D3EWZ67S.cjs} +3348 -2030
  51. package/dist/chunk-D3EWZ67S.cjs.map +1 -0
  52. package/dist/{chunk-GKFWM3DS.js → chunk-DJYRRDHA.js} +124 -5
  53. package/dist/chunk-DJYRRDHA.js.map +1 -0
  54. package/dist/{chunk-YQGLVWB2.cjs → chunk-EF3Z645U.cjs} +2 -52
  55. package/dist/chunk-EF3Z645U.cjs.map +1 -0
  56. package/dist/{chunk-ASYQDPPU.cjs → chunk-FDN43KXV.cjs} +19 -19
  57. package/dist/{chunk-ASYQDPPU.cjs.map → chunk-FDN43KXV.cjs.map} +1 -1
  58. package/dist/chunk-GYVBEZAO.js +120 -0
  59. package/dist/chunk-GYVBEZAO.js.map +1 -0
  60. package/dist/chunk-I4W7MKVG.cjs +1526 -0
  61. package/dist/chunk-I4W7MKVG.cjs.map +1 -0
  62. package/dist/{chunk-MXE2U3EX.js → chunk-IZ4PCL47.js} +3 -52
  63. package/dist/chunk-IZ4PCL47.js.map +1 -0
  64. package/dist/{chunk-4A4GUZTQ.js → chunk-JHOBXD7O.js} +10 -8
  65. package/dist/chunk-JHOBXD7O.js.map +1 -0
  66. package/dist/{chunk-CIINW6PS.cjs → chunk-KY5SDVA7.cjs} +676 -635
  67. package/dist/chunk-KY5SDVA7.cjs.map +1 -0
  68. package/dist/{chunk-N2MBPTAF.cjs → chunk-LM2IC4ZJ.cjs} +14 -14
  69. package/dist/{chunk-N2MBPTAF.cjs.map → chunk-LM2IC4ZJ.cjs.map} +1 -1
  70. package/dist/{chunk-7JGLPAFV.cjs → chunk-MBLXCV2Y.cjs} +16 -16
  71. package/dist/chunk-MBLXCV2Y.cjs.map +1 -0
  72. package/dist/{chunk-5DTPBFX5.cjs → chunk-NG5N7R45.cjs} +28 -28
  73. package/dist/{chunk-5DTPBFX5.cjs.map → chunk-NG5N7R45.cjs.map} +1 -1
  74. package/dist/chunk-OIE2UPVG.cjs +126 -0
  75. package/dist/chunk-OIE2UPVG.cjs.map +1 -0
  76. package/dist/{chunk-STP7QVUB.js → chunk-OS6KS3HV.js} +43 -11
  77. package/dist/chunk-OS6KS3HV.js.map +1 -0
  78. package/dist/{chunk-2ZY4K43M.js → chunk-PIHXFF73.js} +3 -3
  79. package/dist/{chunk-2ZY4K43M.js.map → chunk-PIHXFF73.js.map} +1 -1
  80. package/dist/{chunk-ATTXBMAX.js → chunk-PRMKPFN5.js} +3 -3
  81. package/dist/{chunk-ATTXBMAX.js.map → chunk-PRMKPFN5.js.map} +1 -1
  82. package/dist/chunk-PYD3UCDU.js +1480 -0
  83. package/dist/chunk-PYD3UCDU.js.map +1 -0
  84. package/dist/{chunk-MAQJYNJR.js → chunk-QBYTJSAY.js} +14 -16
  85. package/dist/chunk-QBYTJSAY.js.map +1 -0
  86. package/dist/{chunk-THX25XW6.js → chunk-SPT5JMME.js} +27 -7
  87. package/dist/chunk-SPT5JMME.js.map +1 -0
  88. package/dist/{chunk-3JBJEYWE.cjs → chunk-SST7XDY6.cjs} +32 -12
  89. package/dist/chunk-SST7XDY6.cjs.map +1 -0
  90. package/dist/{chunk-VZX2KSY3.js → chunk-UPDMJEW6.js} +608 -563
  91. package/dist/chunk-UPDMJEW6.js.map +1 -0
  92. package/dist/{chunk-UIFEEPME.js → chunk-WLP6TKFB.js} +3141 -1823
  93. package/dist/chunk-WLP6TKFB.js.map +1 -0
  94. package/dist/{chunk-VMEWZU2N.cjs → chunk-WWVV44DY.cjs} +11 -11
  95. package/dist/{chunk-VMEWZU2N.cjs.map → chunk-WWVV44DY.cjs.map} +1 -1
  96. package/dist/{chunk-UJ4V3YUQ.js → chunk-XKNAK27R.js} +3 -3
  97. package/dist/{chunk-UJ4V3YUQ.js.map → chunk-XKNAK27R.js.map} +1 -1
  98. package/dist/chunk-XLUNB2TZ.js +53 -0
  99. package/dist/chunk-XLUNB2TZ.js.map +1 -0
  100. package/dist/{chunk-XKJQQQVR.js → chunk-XVUJY72M.js} +6 -6
  101. package/dist/{chunk-XKJQQQVR.js.map → chunk-XVUJY72M.js.map} +1 -1
  102. package/dist/{chunk-5CN7B4CZ.cjs → chunk-YW7GHMF4.cjs} +17 -17
  103. package/dist/{chunk-5CN7B4CZ.cjs.map → chunk-YW7GHMF4.cjs.map} +1 -1
  104. package/dist/{ddl-BJcPrB4L.d.ts → ddl-CVnHJcar.d.ts} +3 -3
  105. package/dist/{ddl-CPZ7mB7X.d.cts → ddl-Dxt_fBHr.d.cts} +3 -3
  106. package/dist/{extension-types-D1k0inWU.d.cts → extension-types-YGFJPrzK.d.cts} +1 -1
  107. package/dist/{extension-types-D1k0inWU.d.ts → extension-types-YGFJPrzK.d.ts} +1 -1
  108. package/dist/graph-extension/index.d.cts +4 -4
  109. package/dist/graph-extension/index.d.ts +4 -4
  110. package/dist/graph-merge/index.cjs +200 -55
  111. package/dist/graph-merge/index.cjs.map +1 -1
  112. package/dist/graph-merge/index.d.cts +6 -6
  113. package/dist/graph-merge/index.d.ts +6 -6
  114. package/dist/graph-merge/index.js +185 -40
  115. package/dist/graph-merge/index.js.map +1 -1
  116. package/dist/{index-BEK0VtNB.d.ts → index-DGX6D9j1.d.ts} +2 -2
  117. package/dist/{index-C8sSTErx.d.cts → index-SEvUHDA6.d.cts} +2 -2
  118. package/dist/index.cjs +145 -116
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.cts +25 -55
  121. package/dist/index.d.ts +25 -55
  122. package/dist/index.js +19 -17
  123. package/dist/index.js.map +1 -1
  124. package/dist/indexes/index.cjs +15 -14
  125. package/dist/indexes/index.d.cts +5 -5
  126. package/dist/indexes/index.d.ts +5 -5
  127. package/dist/indexes/index.js +6 -5
  128. package/dist/interchange/index.cjs +15 -15
  129. package/dist/interchange/index.d.cts +9 -9
  130. package/dist/interchange/index.d.ts +9 -9
  131. package/dist/interchange/index.js +2 -2
  132. package/dist/{manager-Np7VVSlE.d.cts → manager-BYl_zyZR.d.cts} +2 -2
  133. package/dist/{manager-By-WEd8M.d.ts → manager-C0_r0ALf.d.ts} +2 -2
  134. package/dist/{materialize-indexes-CAGhqPHQ.d.ts → materialize-indexes-CAkIYFV-.d.ts} +1 -1
  135. package/dist/{materialize-indexes-DEYkU-wr.d.cts → materialize-indexes-D20xNluI.d.cts} +1 -1
  136. package/dist/{postgres-4J2tmauh.d.cts → postgres-MzBPkYzq.d.ts} +2651 -596
  137. package/dist/{postgres-BdIb7tS_.d.ts → postgres-_9psmVGm.d.cts} +2651 -596
  138. package/dist/profiler/index.cjs +4 -3
  139. package/dist/profiler/index.cjs.map +1 -1
  140. package/dist/profiler/index.d.cts +7 -7
  141. package/dist/profiler/index.d.ts +7 -7
  142. package/dist/profiler/index.js +2 -1
  143. package/dist/profiler/index.js.map +1 -1
  144. package/dist/schema/index.cjs +30 -29
  145. package/dist/schema/index.cjs.map +1 -1
  146. package/dist/schema/index.d.cts +7 -7
  147. package/dist/schema/index.d.ts +7 -7
  148. package/dist/schema/index.js +7 -6
  149. package/dist/schema/index.js.map +1 -1
  150. package/dist/{sqlite-aM_PAz-O.d.ts → sqlite-BfksSb45.d.cts} +2726 -455
  151. package/dist/{sqlite-Gatk_iw_.d.cts → sqlite-gm44dShb.d.ts} +2726 -455
  152. package/dist/{store-DuCbdqsh.d.cts → store-view-9jQ2rPum.d.cts} +1101 -465
  153. package/dist/{store-MloRPwb9.d.ts → store-view-FfE5_7eo.d.ts} +1101 -465
  154. package/dist/{types-DoByHGyU.d.cts → types-B6mhrcLv.d.cts} +2 -2
  155. package/dist/{types-C1CYxWrL.d.cts → types-C_UnQOQp.d.cts} +154 -23
  156. package/dist/{types-K3vpaJAL.d.ts → types-CdWxK-nD.d.ts} +2 -2
  157. package/dist/{types-BKQljXom.d.ts → types-DGylBhWo.d.ts} +154 -23
  158. package/dist/{where-DydZjGOb.d.cts → where-Bpp2ul_z.d.cts} +2 -2
  159. package/dist/{where-Dt49bvo6.d.ts → where-BsEXraKW.d.ts} +2 -2
  160. package/package.json +2 -2
  161. package/dist/chunk-2HZGWCB4.js.map +0 -1
  162. package/dist/chunk-3JBJEYWE.cjs.map +0 -1
  163. package/dist/chunk-4A4GUZTQ.js.map +0 -1
  164. package/dist/chunk-54JVNOAQ.cjs.map +0 -1
  165. package/dist/chunk-6G35I3VW.cjs +0 -40
  166. package/dist/chunk-6G35I3VW.cjs.map +0 -1
  167. package/dist/chunk-6RMLO5O4.cjs.map +0 -1
  168. package/dist/chunk-7JGLPAFV.cjs.map +0 -1
  169. package/dist/chunk-CIINW6PS.cjs.map +0 -1
  170. package/dist/chunk-FLOI7QOT.cjs.map +0 -1
  171. package/dist/chunk-GKFWM3DS.js.map +0 -1
  172. package/dist/chunk-IJORSAC3.js.map +0 -1
  173. package/dist/chunk-M6OC455F.js +0 -65
  174. package/dist/chunk-M6OC455F.js.map +0 -1
  175. package/dist/chunk-MAQJYNJR.js.map +0 -1
  176. package/dist/chunk-MXE2U3EX.js.map +0 -1
  177. package/dist/chunk-RP7YITHX.cjs +0 -70
  178. package/dist/chunk-RP7YITHX.cjs.map +0 -1
  179. package/dist/chunk-RZ4DH4E7.cjs.map +0 -1
  180. package/dist/chunk-SAJSMR2B.js +0 -35
  181. package/dist/chunk-SAJSMR2B.js.map +0 -1
  182. package/dist/chunk-SFFJ2IKN.cjs.map +0 -1
  183. package/dist/chunk-STP7QVUB.js.map +0 -1
  184. package/dist/chunk-THX25XW6.js.map +0 -1
  185. package/dist/chunk-UIFEEPME.js.map +0 -1
  186. package/dist/chunk-V4IQYOQ4.cjs.map +0 -1
  187. package/dist/chunk-VZX2KSY3.js.map +0 -1
  188. package/dist/chunk-YQGLVWB2.cjs.map +0 -1
@@ -0,0 +1,1480 @@
1
+ import { resolveFieldTypeInfoAtJsonPointer } from './chunk-XLUNB2TZ.js';
2
+ import { UnsupportedPredicateError, CompilerInvariantError, DatabaseOperationError } from './chunk-TQOYM4LN.js';
3
+ import { normalizeJsonPointer, joinJsonPointers, jsonPointer } from './chunk-K5P5OZXS.js';
4
+ import { sql } from 'drizzle-orm';
5
+
6
+ // src/query/subquery-utils.ts
7
+ function normalizeValueType(valueType) {
8
+ if (valueType === void 0 || valueType === "unknown") {
9
+ return void 0;
10
+ }
11
+ return valueType;
12
+ }
13
+ function isUnsupportedInSubqueryValueType(valueType) {
14
+ const normalized = normalizeValueType(valueType);
15
+ return normalized === "array" || normalized === "object" || normalized === "embedding";
16
+ }
17
+ function isInSubqueryTypeCompatible(left, right) {
18
+ const normalizedLeft = normalizeValueType(left);
19
+ const normalizedRight = normalizeValueType(right);
20
+ if (normalizedLeft === void 0 || normalizedRight === void 0) {
21
+ return true;
22
+ }
23
+ return normalizedLeft === normalizedRight;
24
+ }
25
+ function getAggregateValueType(aggregate) {
26
+ switch (aggregate.function) {
27
+ case "count":
28
+ case "countDistinct":
29
+ case "sum":
30
+ case "avg": {
31
+ return "number";
32
+ }
33
+ case "min":
34
+ case "max": {
35
+ return normalizeValueType(aggregate.field.valueType);
36
+ }
37
+ }
38
+ }
39
+ function getProjectedValueTypes(subquery) {
40
+ if (subquery.selectiveFields && subquery.selectiveFields.length > 0) {
41
+ return subquery.selectiveFields.map(
42
+ (field) => normalizeValueType(field.valueType)
43
+ );
44
+ }
45
+ return subquery.projection.fields.map((field) => {
46
+ if (field.source.__type === "aggregate") {
47
+ return getAggregateValueType(field.source);
48
+ }
49
+ return normalizeValueType(field.source.valueType);
50
+ });
51
+ }
52
+ function getSubqueryColumnCount(subquery) {
53
+ return getProjectedValueTypes(subquery).length;
54
+ }
55
+ function getSingleSubqueryColumnValueType(subquery) {
56
+ const valueTypes = getProjectedValueTypes(subquery);
57
+ if (valueTypes.length !== 1) {
58
+ return void 0;
59
+ }
60
+ return valueTypes[0];
61
+ }
62
+
63
+ // src/query/predicates.ts
64
+ function predicate(expr) {
65
+ return {
66
+ __expr: expr,
67
+ and: (other) => predicate({
68
+ __type: "and",
69
+ predicates: [expr, other.__expr]
70
+ }),
71
+ or: (other) => predicate({
72
+ __type: "or",
73
+ predicates: [expr, other.__expr]
74
+ }),
75
+ not: () => predicate({
76
+ __type: "not",
77
+ predicate: expr
78
+ })
79
+ };
80
+ }
81
+ function param(name) {
82
+ return { __type: "parameter", name };
83
+ }
84
+ function isParameterRef(value) {
85
+ if (typeof value !== "object" || value === null) return false;
86
+ return value.__type === "parameter";
87
+ }
88
+ function fieldRef(alias, path, options) {
89
+ return {
90
+ __type: "field_ref",
91
+ alias,
92
+ path,
93
+ ...options?.jsonPointer !== void 0 && {
94
+ jsonPointer: options.jsonPointer
95
+ },
96
+ ...options?.valueType !== void 0 && { valueType: options.valueType },
97
+ ...options?.elementType !== void 0 && {
98
+ elementType: options.elementType
99
+ }
100
+ };
101
+ }
102
+ function coerceLiteralValue(value) {
103
+ if (value instanceof Date) {
104
+ return value;
105
+ }
106
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
107
+ return value;
108
+ }
109
+ throw new Error(`Unsupported literal value type: ${typeof value}`);
110
+ }
111
+ function inferLiteralValueType(value) {
112
+ if (typeof value === "string") {
113
+ return "string";
114
+ }
115
+ if (typeof value === "number") {
116
+ return "number";
117
+ }
118
+ return "boolean";
119
+ }
120
+ function literal(value) {
121
+ if (value instanceof Date) {
122
+ return { __type: "literal", value: value.toISOString(), valueType: "date" };
123
+ }
124
+ const valueType = inferLiteralValueType(value);
125
+ return {
126
+ __type: "literal",
127
+ value,
128
+ valueType
129
+ };
130
+ }
131
+ function comparison(op, field, value) {
132
+ if (isParameterRef(value)) {
133
+ const expr2 = {
134
+ __type: "comparison",
135
+ op,
136
+ left: field,
137
+ right: value
138
+ };
139
+ return predicate(expr2);
140
+ }
141
+ const coercedValue = coerceLiteralValue(value);
142
+ const expr = {
143
+ __type: "comparison",
144
+ op,
145
+ left: field,
146
+ right: literal(coercedValue)
147
+ };
148
+ return predicate(expr);
149
+ }
150
+ function inComparison(op, field, values) {
151
+ const literals = values.map((value) => literal(coerceLiteralValue(value)));
152
+ const expr = {
153
+ __type: "comparison",
154
+ op,
155
+ left: field,
156
+ right: literals
157
+ };
158
+ return predicate(expr);
159
+ }
160
+ function stringOp(op, field, pattern) {
161
+ if (isParameterRef(pattern)) {
162
+ const expr2 = {
163
+ __type: "string_op",
164
+ op,
165
+ field,
166
+ pattern
167
+ };
168
+ return predicate(expr2);
169
+ }
170
+ const expr = {
171
+ __type: "string_op",
172
+ op,
173
+ field,
174
+ pattern
175
+ };
176
+ return predicate(expr);
177
+ }
178
+ function nullCheck(op, field) {
179
+ const expr = {
180
+ __type: "null_check",
181
+ op,
182
+ field
183
+ };
184
+ return predicate(expr);
185
+ }
186
+ function between(field, lower, upper) {
187
+ const expr = {
188
+ __type: "between",
189
+ field,
190
+ lower: isParameterRef(lower) ? lower : literal(lower),
191
+ upper: isParameterRef(upper) ? upper : literal(upper)
192
+ };
193
+ return predicate(expr);
194
+ }
195
+ function baseFieldBuilder(field) {
196
+ return {
197
+ eq: (value) => comparison("eq", field, value),
198
+ neq: (value) => comparison("neq", field, value),
199
+ isNull: () => nullCheck("isNull", field),
200
+ isNotNull: () => nullCheck("isNotNull", field),
201
+ in: (values) => inComparison("in", field, values),
202
+ notIn: (values) => inComparison("notIn", field, values)
203
+ };
204
+ }
205
+ function stringField(field) {
206
+ return {
207
+ ...baseFieldBuilder(field),
208
+ gt: (value) => comparison("gt", field, value),
209
+ gte: (value) => comparison("gte", field, value),
210
+ lt: (value) => comparison("lt", field, value),
211
+ lte: (value) => comparison("lte", field, value),
212
+ contains: (pattern) => stringOp("contains", field, pattern),
213
+ startsWith: (pattern) => stringOp("startsWith", field, pattern),
214
+ endsWith: (pattern) => stringOp("endsWith", field, pattern),
215
+ like: (pattern) => stringOp("like", field, pattern),
216
+ ilike: (pattern) => stringOp("ilike", field, pattern)
217
+ };
218
+ }
219
+ var DEFAULT_FULLTEXT_MATCH_K = 50;
220
+ function createFulltextAccessor(alias, hasSearchableField) {
221
+ return {
222
+ matches: (query, k, options) => {
223
+ if (!hasSearchableField()) {
224
+ throw new UnsupportedPredicateError(
225
+ `Cannot call .$fulltext.matches() on alias "${alias}" \u2014 its node kind has no fields declared with searchable(). Add at least one: \`title: searchable({ language: "english" })\`.`
226
+ );
227
+ }
228
+ return fulltextMatch(
229
+ fieldRef(alias, ["$fulltext"]),
230
+ query,
231
+ k ?? DEFAULT_FULLTEXT_MATCH_K,
232
+ options
233
+ );
234
+ }
235
+ };
236
+ }
237
+ function fulltextMatch(field, query, limit, options) {
238
+ if (!Number.isFinite(limit) || limit <= 0) {
239
+ throw new UnsupportedPredicateError(
240
+ `matches() limit must be a positive finite number, got ${String(limit)}`
241
+ );
242
+ }
243
+ const expr = {
244
+ __type: "fulltext_match",
245
+ field,
246
+ query,
247
+ mode: options?.mode ?? "websearch",
248
+ limit,
249
+ ...options?.language === void 0 ? {} : { language: options.language },
250
+ ...options?.minScore === void 0 ? {} : { minScore: options.minScore }
251
+ };
252
+ return predicate(expr);
253
+ }
254
+ function numberField(field) {
255
+ return {
256
+ ...baseFieldBuilder(field),
257
+ gt: (value) => comparison("gt", field, value),
258
+ gte: (value) => comparison("gte", field, value),
259
+ lt: (value) => comparison("lt", field, value),
260
+ lte: (value) => comparison("lte", field, value),
261
+ between: (lower, upper) => between(field, lower, upper)
262
+ };
263
+ }
264
+ function dateField(field) {
265
+ return {
266
+ ...baseFieldBuilder(field),
267
+ gt: (value) => comparison("gt", field, value),
268
+ gte: (value) => comparison("gte", field, value),
269
+ lt: (value) => comparison("lt", field, value),
270
+ lte: (value) => comparison("lte", field, value),
271
+ between: (lower, upper) => between(field, lower, upper)
272
+ };
273
+ }
274
+ function baseField(field) {
275
+ return baseFieldBuilder(field);
276
+ }
277
+ function arrayOp(op, field, values, length) {
278
+ const expr = {
279
+ __type: "array_op",
280
+ op,
281
+ field,
282
+ ...values !== void 0 && {
283
+ values: values.map((value) => literal(coerceLiteralValue(value)))
284
+ },
285
+ ...length !== void 0 && { length }
286
+ };
287
+ return predicate(expr);
288
+ }
289
+ function arrayField(field) {
290
+ return {
291
+ ...baseFieldBuilder(field),
292
+ contains: (value) => arrayOp("contains", field, [value]),
293
+ containsAll: (values) => arrayOp("containsAll", field, values),
294
+ containsAny: (values) => arrayOp("containsAny", field, values),
295
+ isEmpty: () => arrayOp("isEmpty", field),
296
+ isNotEmpty: () => arrayOp("isNotEmpty", field),
297
+ lengthEq: (length) => arrayOp("lengthEq", field, void 0, length),
298
+ lengthGt: (length) => arrayOp("lengthGt", field, void 0, length),
299
+ lengthGte: (length) => arrayOp("lengthGte", field, void 0, length),
300
+ lengthLt: (length) => arrayOp("lengthLt", field, void 0, length),
301
+ lengthLte: (length) => arrayOp("lengthLte", field, void 0, length)
302
+ };
303
+ }
304
+ function vectorSimilarity(field, queryEmbedding, limit, options) {
305
+ const expr = {
306
+ __type: "vector_similarity",
307
+ field,
308
+ queryEmbedding,
309
+ // Leave metric unset when the caller didn't specify one, so the compiler
310
+ // resolves the field's declared metric per kind. Defaulting to "cosine"
311
+ // here would mis-rank l2/inner_product fields and bypass their ANN index.
312
+ ...options?.metric !== void 0 && { metric: options.metric },
313
+ limit,
314
+ ...options?.minScore !== void 0 && { minScore: options.minScore }
315
+ };
316
+ return predicate(expr);
317
+ }
318
+ function embeddingField(field) {
319
+ return {
320
+ ...baseFieldBuilder(field),
321
+ similarTo: (queryEmbedding, k, options) => vectorSimilarity(field, queryEmbedding, k, options)
322
+ };
323
+ }
324
+ function buildFieldBuilderForTypeInfo(field, typeInfo) {
325
+ if (!typeInfo) {
326
+ return baseField(field);
327
+ }
328
+ switch (typeInfo.valueType) {
329
+ case "string": {
330
+ return stringField(field);
331
+ }
332
+ case "number": {
333
+ return numberField(field);
334
+ }
335
+ case "boolean": {
336
+ return baseField(field);
337
+ }
338
+ case "date": {
339
+ return dateField(field);
340
+ }
341
+ case "array": {
342
+ return arrayField(field);
343
+ }
344
+ case "object": {
345
+ return objectField(field, { typeInfo });
346
+ }
347
+ case "embedding": {
348
+ return embeddingField(field);
349
+ }
350
+ case "unknown": {
351
+ return baseField(field);
352
+ }
353
+ }
354
+ }
355
+ function resolvePointerTypeInfo(typeInfo, pointer) {
356
+ return resolveFieldTypeInfoAtJsonPointer(typeInfo, pointer);
357
+ }
358
+ function objectOp(op, field, pointer, value, options) {
359
+ const expr = {
360
+ __type: "object_op",
361
+ op,
362
+ field,
363
+ pointer,
364
+ ...value !== void 0 && {
365
+ value: literal(coerceLiteralValue(value))
366
+ },
367
+ ...options?.valueType !== void 0 && { valueType: options.valueType },
368
+ ...options?.elementType !== void 0 && {
369
+ elementType: options.elementType
370
+ }
371
+ };
372
+ return predicate(expr);
373
+ }
374
+ function objectField(field, options) {
375
+ const basePointer = field.jsonPointer;
376
+ return {
377
+ ...baseFieldBuilder(field),
378
+ get: (key) => {
379
+ const pointer = jsonPointer([key]);
380
+ const nestedPointer = joinJsonPointers(basePointer, pointer);
381
+ const resolved = resolvePointerTypeInfo(options?.typeInfo, pointer);
382
+ const nestedRef = fieldRef(field.alias, field.path, {
383
+ jsonPointer: nestedPointer,
384
+ ...resolved?.valueType !== void 0 && {
385
+ valueType: resolved.valueType
386
+ },
387
+ ...resolved?.elementType !== void 0 && {
388
+ elementType: resolved.elementType
389
+ }
390
+ });
391
+ return buildFieldBuilderForTypeInfo(nestedRef, resolved);
392
+ },
393
+ hasKey: (key) => {
394
+ const pointer = jsonPointer([key]);
395
+ resolvePointerTypeInfo(options?.typeInfo, pointer);
396
+ return objectOp("hasKey", field, pointer);
397
+ },
398
+ hasPath: (pointer) => {
399
+ const normalized = normalizeJsonPointer(pointer);
400
+ resolvePointerTypeInfo(options?.typeInfo, normalized);
401
+ return objectOp("hasPath", field, normalized);
402
+ },
403
+ pathEquals: (pointer, value) => {
404
+ const normalized = normalizeJsonPointer(pointer);
405
+ const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
406
+ if (resolved && (resolved.valueType === "array" || resolved.valueType === "object")) {
407
+ throw new Error("pathEquals is only supported for scalar JSON values");
408
+ }
409
+ const predicateOptions = resolved?.valueType === void 0 ? void 0 : { valueType: resolved.valueType };
410
+ return objectOp("pathEquals", field, normalized, value, predicateOptions);
411
+ },
412
+ pathContains: (pointer, value) => {
413
+ const normalized = normalizeJsonPointer(pointer);
414
+ const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
415
+ if (resolved && resolved.valueType !== "array") {
416
+ throw new Error("pathContains is only supported for JSON array values");
417
+ }
418
+ const predicateOptions = resolved?.elementType === void 0 ? void 0 : { elementType: resolved.elementType };
419
+ return objectOp(
420
+ "pathContains",
421
+ field,
422
+ normalized,
423
+ value,
424
+ predicateOptions
425
+ );
426
+ },
427
+ pathIsNull: (pointer) => {
428
+ const normalized = normalizeJsonPointer(pointer);
429
+ const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
430
+ const predicateOptions = resolved?.valueType === void 0 ? void 0 : { valueType: resolved.valueType };
431
+ return objectOp(
432
+ "pathIsNull",
433
+ field,
434
+ normalized,
435
+ void 0,
436
+ predicateOptions
437
+ );
438
+ },
439
+ pathIsNotNull: (pointer) => {
440
+ const normalized = normalizeJsonPointer(pointer);
441
+ const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
442
+ const predicateOptions = resolved?.valueType === void 0 ? void 0 : { valueType: resolved.valueType };
443
+ return objectOp(
444
+ "pathIsNotNull",
445
+ field,
446
+ normalized,
447
+ void 0,
448
+ predicateOptions
449
+ );
450
+ },
451
+ field: (pointer) => {
452
+ const normalized = normalizeJsonPointer(pointer);
453
+ const nestedPointer = joinJsonPointers(basePointer, normalized);
454
+ const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
455
+ const nestedRef = fieldRef(field.alias, field.path, {
456
+ jsonPointer: nestedPointer,
457
+ ...resolved?.valueType !== void 0 && {
458
+ valueType: resolved.valueType
459
+ },
460
+ ...resolved?.elementType !== void 0 && {
461
+ elementType: resolved.elementType
462
+ }
463
+ });
464
+ return buildFieldBuilderForTypeInfo(nestedRef, resolved);
465
+ }
466
+ };
467
+ }
468
+ function exists(subquery) {
469
+ const expr = {
470
+ __type: "exists",
471
+ subquery,
472
+ negated: false
473
+ };
474
+ return predicate(expr);
475
+ }
476
+ function notExists(subquery) {
477
+ const expr = {
478
+ __type: "exists",
479
+ subquery,
480
+ negated: true
481
+ };
482
+ return predicate(expr);
483
+ }
484
+ function inSubquery(field, subquery) {
485
+ assertSingleColumnSubquery(subquery);
486
+ assertCompatibleSubqueryValueTypes(field, subquery);
487
+ const expr = {
488
+ __type: "in_subquery",
489
+ field,
490
+ subquery,
491
+ negated: false
492
+ };
493
+ return predicate(expr);
494
+ }
495
+ function notInSubquery(field, subquery) {
496
+ assertSingleColumnSubquery(subquery);
497
+ assertCompatibleSubqueryValueTypes(field, subquery);
498
+ const expr = {
499
+ __type: "in_subquery",
500
+ field,
501
+ subquery,
502
+ negated: true
503
+ };
504
+ return predicate(expr);
505
+ }
506
+ function assertSingleColumnSubquery(subquery) {
507
+ const columnCount = getSubqueryColumnCount(subquery);
508
+ if (columnCount === 1) return;
509
+ throw new UnsupportedPredicateError(
510
+ `IN/NOT IN subquery must project exactly 1 column, but got ${columnCount}`,
511
+ { subqueryColumnCount: columnCount },
512
+ {
513
+ suggestion: "Use aggregate() with exactly one projected field for scalar IN/NOT IN subqueries."
514
+ }
515
+ );
516
+ }
517
+ function assertCompatibleSubqueryValueTypes(field, subquery) {
518
+ const fieldValueType = field.valueType;
519
+ const subqueryValueType = getSingleSubqueryColumnValueType(subquery);
520
+ const resolvedValueType = fieldValueType ?? subqueryValueType;
521
+ if (isUnsupportedInSubqueryValueType(resolvedValueType)) {
522
+ throw new UnsupportedPredicateError(
523
+ `IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,
524
+ { valueType: resolvedValueType },
525
+ {
526
+ suggestion: "Use scalar fields (string/number/boolean/date) in IN/NOT IN predicates."
527
+ }
528
+ );
529
+ }
530
+ if (isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {
531
+ return;
532
+ }
533
+ throw new UnsupportedPredicateError(
534
+ `IN/NOT IN type mismatch: field type "${String(fieldValueType)}" does not match subquery column type "${String(subqueryValueType)}"`,
535
+ {
536
+ fieldValueType,
537
+ subqueryValueType
538
+ }
539
+ );
540
+ }
541
+
542
+ // src/backend/types.ts
543
+ function createBackendOverlay(target, overlay) {
544
+ const boundTargetMethods = /* @__PURE__ */ new Map();
545
+ function hasOverlayProperty(property) {
546
+ return Object.hasOwn(overlay, property);
547
+ }
548
+ function targetValue(targetObject, property) {
549
+ const value = Reflect.get(targetObject, property, targetObject);
550
+ if (typeof value !== "function") return value;
551
+ const cached = boundTargetMethods.get(property);
552
+ if (cached !== void 0) return cached;
553
+ const method = value;
554
+ const bound = method.bind(targetObject);
555
+ boundTargetMethods.set(property, bound);
556
+ return bound;
557
+ }
558
+ return new Proxy(target, {
559
+ get(targetObject, property) {
560
+ if (hasOverlayProperty(property)) {
561
+ return Reflect.get(overlay, property, overlay);
562
+ }
563
+ return targetValue(targetObject, property);
564
+ },
565
+ has(targetObject, property) {
566
+ return hasOverlayProperty(property) || Reflect.has(targetObject, property);
567
+ },
568
+ ownKeys(targetObject) {
569
+ return [
570
+ .../* @__PURE__ */ new Set([
571
+ ...Reflect.ownKeys(targetObject),
572
+ ...Reflect.ownKeys(overlay)
573
+ ])
574
+ ];
575
+ },
576
+ getOwnPropertyDescriptor(targetObject, property) {
577
+ if (hasOverlayProperty(property)) {
578
+ const descriptor = Reflect.getOwnPropertyDescriptor(overlay, property);
579
+ if (descriptor === void 0) return;
580
+ return { ...descriptor, configurable: true };
581
+ }
582
+ return Reflect.getOwnPropertyDescriptor(targetObject, property);
583
+ },
584
+ set(targetObject, property, value) {
585
+ if (hasOverlayProperty(property)) {
586
+ return Reflect.set(overlay, property, value, overlay);
587
+ }
588
+ return Reflect.set(targetObject, property, value, targetObject);
589
+ },
590
+ defineProperty(targetObject, property, attributes) {
591
+ if (hasOverlayProperty(property)) {
592
+ return Reflect.defineProperty(overlay, property, attributes);
593
+ }
594
+ return Reflect.defineProperty(targetObject, property, attributes);
595
+ },
596
+ deleteProperty(targetObject, property) {
597
+ if (hasOverlayProperty(property)) {
598
+ return Reflect.deleteProperty(overlay, property);
599
+ }
600
+ return Reflect.deleteProperty(targetObject, property);
601
+ }
602
+ });
603
+ }
604
+ function wrapWithManagedClose(backend, teardown) {
605
+ let isClosed = false;
606
+ return createBackendOverlay(backend, {
607
+ async close() {
608
+ if (isClosed) return;
609
+ isClosed = true;
610
+ await backend.close();
611
+ await teardown();
612
+ }
613
+ });
614
+ }
615
+ async function runOptionallyInTransaction(backend, fn, fallback) {
616
+ if ("transaction" in backend && backend.capabilities.transactions) {
617
+ return backend.transaction((tx) => fn(tx));
618
+ }
619
+ return fn(fallback ?? backend);
620
+ }
621
+ var SQLITE_MAX_BIND_PARAMETERS = 999;
622
+ var POSTGRES_MAX_BIND_PARAMETERS = 65535;
623
+ var SQLITE_CAPABILITIES = {
624
+ transactions: true,
625
+ // SQLite supports transactions
626
+ windowFunctions: true,
627
+ // SQLite has supported window functions since 3.25.0
628
+ returning: true,
629
+ // SQLite has supported RETURNING since 3.35.0
630
+ maxBindParameters: SQLITE_MAX_BIND_PARAMETERS
631
+ };
632
+ var POSTGRES_CAPABILITIES = {
633
+ transactions: true,
634
+ // PostgreSQL supports transactions
635
+ windowFunctions: true,
636
+ // PostgreSQL supports ROW_NUMBER() and related windows
637
+ returning: true,
638
+ // PostgreSQL has supported RETURNING since 8.2
639
+ maxBindParameters: POSTGRES_MAX_BIND_PARAMETERS
640
+ };
641
+ var COMPARISON_OP_SQL = {
642
+ eq: "=",
643
+ neq: "!=",
644
+ gt: ">",
645
+ gte: ">=",
646
+ lt: "<",
647
+ lte: "<="
648
+ };
649
+ function compileFieldColumn(field, cteAlias, cteColumnPrefix) {
650
+ if (cteColumnPrefix !== void 0) {
651
+ const qualifier2 = cteColumnPrefix === "" ? "" : `${cteColumnPrefix}.`;
652
+ if (field.path.length === 1 && field.path[0] === "id") {
653
+ return sql.raw(`${qualifier2}id`);
654
+ }
655
+ if (field.path.length === 1 && field.path[0] === "kind") {
656
+ return sql.raw(`${qualifier2}kind`);
657
+ }
658
+ if (field.path.length > 0 && field.path[0] === "props") {
659
+ return sql.raw(`${qualifier2}props`);
660
+ }
661
+ return sql.raw(`${qualifier2}${field.path.join("_")}`);
662
+ }
663
+ const prefix = field.alias;
664
+ const qualifier = cteAlias ? `${cteAlias}.` : "";
665
+ if (field.path.length === 1 && field.path[0] === "id") {
666
+ return sql.raw(`${qualifier}${prefix}_id`);
667
+ }
668
+ if (field.path.length === 1 && field.path[0] === "kind") {
669
+ return sql.raw(`${qualifier}${prefix}_kind`);
670
+ }
671
+ if (field.path.length > 0 && field.path[0] === "props") {
672
+ return sql.raw(`${qualifier}${prefix}_props`);
673
+ }
674
+ return sql.raw(`${qualifier}${prefix}_${field.path.join("_")}`);
675
+ }
676
+ function getFieldPointer(field) {
677
+ if (field.jsonPointer !== void 0) {
678
+ return field.jsonPointer;
679
+ }
680
+ if (field.path.length > 1 && field.path[0] === "props") {
681
+ return jsonPointer(field.path.slice(1));
682
+ }
683
+ return void 0;
684
+ }
685
+ function isJsonField(field) {
686
+ return field.path.length > 0 && field.path[0] === "props";
687
+ }
688
+ function normalizeValueType2(valueType) {
689
+ if (!valueType || valueType === "unknown") {
690
+ return void 0;
691
+ }
692
+ return valueType;
693
+ }
694
+ function compileFieldValue(field, dialect, valueType, cteAlias, pointerOverride, cteColumnPrefix) {
695
+ const resolved = normalizeValueType2(valueType);
696
+ const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);
697
+ if (!isJsonField(field)) {
698
+ return column;
699
+ }
700
+ const pointer = pointerOverride ?? getFieldPointer(field);
701
+ if (!pointer || pointer === "") {
702
+ return column;
703
+ }
704
+ switch (resolved) {
705
+ case "number": {
706
+ return dialect.jsonExtractNumber(column, pointer);
707
+ }
708
+ case "boolean": {
709
+ return dialect.jsonExtractBoolean(column, pointer);
710
+ }
711
+ case "date": {
712
+ return dialect.jsonExtractDate(column, pointer);
713
+ }
714
+ case "array":
715
+ case "object":
716
+ case "embedding": {
717
+ return dialect.jsonExtract(column, pointer);
718
+ }
719
+ case "string":
720
+ case "unknown":
721
+ case void 0: {
722
+ return dialect.jsonExtractText(column, pointer);
723
+ }
724
+ }
725
+ }
726
+ function compileFieldTextValue(field, dialect, cteAlias, pointerOverride, cteColumnPrefix) {
727
+ const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);
728
+ if (!isJsonField(field)) {
729
+ return column;
730
+ }
731
+ const pointer = getFieldPointer(field);
732
+ if (!pointer || pointer === "") {
733
+ return column;
734
+ }
735
+ return dialect.jsonExtractText(column, pointer);
736
+ }
737
+ function compileFieldJsonValue(field, dialect, cteAlias, pointerOverride, cteColumnPrefix) {
738
+ const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);
739
+ if (!isJsonField(field)) {
740
+ return column;
741
+ }
742
+ const pointer = pointerOverride ?? getFieldPointer(field);
743
+ if (!pointer || pointer === "") {
744
+ return column;
745
+ }
746
+ return dialect.jsonExtract(column, pointer);
747
+ }
748
+ function resolveLiteralValueTypes(literals) {
749
+ const resolved = /* @__PURE__ */ new Set();
750
+ for (const literal2 of literals) {
751
+ const valueType = normalizeValueType2(literal2.valueType);
752
+ if (valueType) {
753
+ resolved.add(valueType);
754
+ }
755
+ }
756
+ if (resolved.size > 1) {
757
+ throw new UnsupportedPredicateError(
758
+ "Mixed literal value types are not supported in predicates",
759
+ { valueTypes: [...resolved] }
760
+ );
761
+ }
762
+ return resolved.values().next().value;
763
+ }
764
+ function resolveComparisonValueType(field, right) {
765
+ if (isParameterRef(right)) {
766
+ return normalizeValueType2(right.valueType) ?? normalizeValueType2(field.valueType);
767
+ }
768
+ const literals = Array.isArray(right) ? right : [right];
769
+ const literalType = resolveLiteralValueTypes(literals);
770
+ const fieldType = normalizeValueType2(field.valueType);
771
+ if (fieldType === "date" && literalType === "string") {
772
+ return fieldType;
773
+ }
774
+ if (literalType) {
775
+ return literalType;
776
+ }
777
+ return fieldType;
778
+ }
779
+ function resolvePredicateValueType(preferred, literal2) {
780
+ const normalizedPreferred = normalizeValueType2(preferred);
781
+ if (normalizedPreferred) {
782
+ return normalizedPreferred;
783
+ }
784
+ return literal2 ? normalizeValueType2(literal2.valueType) : void 0;
785
+ }
786
+ function convertValueForSql(value, dialect) {
787
+ return dialect.bindValue(value);
788
+ }
789
+ function compileStringPattern(op, pattern) {
790
+ const escaped = pattern.replaceAll("%", String.raw`\%`).replaceAll("_", String.raw`\_`);
791
+ switch (op) {
792
+ case "contains": {
793
+ return `%${escaped}%`;
794
+ }
795
+ case "startsWith": {
796
+ return `${escaped}%`;
797
+ }
798
+ case "endsWith": {
799
+ return `%${escaped}`;
800
+ }
801
+ case "like":
802
+ case "ilike": {
803
+ return pattern;
804
+ }
805
+ default: {
806
+ return escaped;
807
+ }
808
+ }
809
+ }
810
+ function escapeLikePatternParameter(parameter) {
811
+ return sql`REPLACE(REPLACE(REPLACE(${parameter}, '\\', '\\\\'), '%', '\\%'), '_', '\\_')`;
812
+ }
813
+ function compileParameterizedStringPattern(op, parameter) {
814
+ switch (op) {
815
+ case "contains": {
816
+ const escaped = escapeLikePatternParameter(parameter);
817
+ return sql`'%' || ${escaped} || '%'`;
818
+ }
819
+ case "startsWith": {
820
+ const escaped = escapeLikePatternParameter(parameter);
821
+ return sql`${escaped} || '%'`;
822
+ }
823
+ case "endsWith": {
824
+ const escaped = escapeLikePatternParameter(parameter);
825
+ return sql`'%' || ${escaped}`;
826
+ }
827
+ case "like":
828
+ case "ilike": {
829
+ return parameter;
830
+ }
831
+ default: {
832
+ return escapeLikePatternParameter(parameter);
833
+ }
834
+ }
835
+ }
836
+ function compilePredicateExpression(expr, ctx) {
837
+ const { dialect } = ctx;
838
+ const cteColumnPrefix = ctx.cteColumnPrefix;
839
+ switch (expr.__type) {
840
+ case "comparison": {
841
+ return compileComparisonPredicate(expr, dialect, cteColumnPrefix);
842
+ }
843
+ case "string_op": {
844
+ const field = compileFieldTextValue(
845
+ expr.field,
846
+ dialect,
847
+ void 0,
848
+ void 0,
849
+ cteColumnPrefix
850
+ );
851
+ if (isParameterRef(expr.pattern)) {
852
+ const placeholder = sql`${sql.placeholder(expr.pattern.name)}`;
853
+ const pattern2 = compileParameterizedStringPattern(expr.op, placeholder);
854
+ if (expr.op === "ilike" || expr.op === "contains" || expr.op === "startsWith" || expr.op === "endsWith") {
855
+ return dialect.ilike(field, pattern2);
856
+ }
857
+ return sql`${field} LIKE ${pattern2}`;
858
+ }
859
+ const pattern = compileStringPattern(expr.op, expr.pattern);
860
+ if (expr.op === "ilike" || expr.op === "contains" || expr.op === "startsWith" || expr.op === "endsWith") {
861
+ return dialect.ilike(field, pattern);
862
+ }
863
+ return sql`${field} LIKE ${pattern}`;
864
+ }
865
+ case "null_check": {
866
+ const field = compileFieldTextValue(
867
+ expr.field,
868
+ dialect,
869
+ void 0,
870
+ void 0,
871
+ cteColumnPrefix
872
+ );
873
+ return expr.op === "isNull" ? sql`${field} IS NULL` : sql`${field} IS NOT NULL`;
874
+ }
875
+ case "between": {
876
+ const lowerIsParam = isParameterRef(expr.lower);
877
+ const upperIsParam = isParameterRef(expr.upper);
878
+ const boundsForType = [];
879
+ if (!lowerIsParam) boundsForType.push(expr.lower);
880
+ if (!upperIsParam) boundsForType.push(expr.upper);
881
+ const valueType = boundsForType.length > 0 ? resolveComparisonValueType(expr.field, boundsForType) : normalizeValueType2(expr.field.valueType);
882
+ if (valueType === "array" || valueType === "object") {
883
+ throw new UnsupportedPredicateError(
884
+ "Between comparisons are not supported for JSON arrays or objects"
885
+ );
886
+ }
887
+ const field = compileFieldValue(
888
+ expr.field,
889
+ dialect,
890
+ valueType,
891
+ void 0,
892
+ void 0,
893
+ cteColumnPrefix
894
+ );
895
+ const lower = lowerIsParam ? sql.placeholder(expr.lower.name) : convertValueForSql(expr.lower.value, dialect);
896
+ const upper = upperIsParam ? sql.placeholder(expr.upper.name) : convertValueForSql(expr.upper.value, dialect);
897
+ return sql`${field} BETWEEN ${lower} AND ${upper}`;
898
+ }
899
+ case "and": {
900
+ const parts = expr.predicates.map(
901
+ (p) => compilePredicateExpression(p, ctx)
902
+ );
903
+ return sql`(${sql.join(parts, sql` AND `)})`;
904
+ }
905
+ case "or": {
906
+ const parts = expr.predicates.map(
907
+ (p) => compilePredicateExpression(p, ctx)
908
+ );
909
+ return sql`(${sql.join(parts, sql` OR `)})`;
910
+ }
911
+ case "not": {
912
+ const inner = compilePredicateExpression(expr.predicate, ctx);
913
+ return sql`NOT (${inner})`;
914
+ }
915
+ case "array_op": {
916
+ return compileArrayPredicate(expr, dialect, cteColumnPrefix);
917
+ }
918
+ case "object_op": {
919
+ return compileObjectPredicate(expr, dialect, cteColumnPrefix);
920
+ }
921
+ case "aggregate_comparison": {
922
+ return compileAggregatePredicate(expr, dialect);
923
+ }
924
+ case "exists": {
925
+ return compileExistsSubquery(expr, ctx);
926
+ }
927
+ case "in_subquery": {
928
+ return compileInSubquery(expr, ctx);
929
+ }
930
+ case "vector_similarity":
931
+ case "fulltext_match": {
932
+ return STRUCTURAL_PREDICATE_NOOP;
933
+ }
934
+ }
935
+ }
936
+ var STRUCTURAL_PREDICATE_NOOP = sql.raw("1=1");
937
+ function compileComparisonPredicate(expr, dialect, cteColumnPrefix) {
938
+ if (isParameterRef(expr.right)) {
939
+ const parameterValueType = normalizeValueType2(expr.right.valueType) ?? normalizeValueType2(expr.left.valueType);
940
+ const left2 = compileFieldValue(
941
+ expr.left,
942
+ dialect,
943
+ parameterValueType,
944
+ void 0,
945
+ void 0,
946
+ cteColumnPrefix
947
+ );
948
+ const opSql2 = COMPARISON_OP_SQL[expr.op];
949
+ if (!opSql2) {
950
+ throw new UnsupportedPredicateError(
951
+ `Comparison operation "${expr.op}" is not supported for parameterized predicates`
952
+ );
953
+ }
954
+ return sql`${left2} ${sql.raw(opSql2)} ${sql.placeholder(expr.right.name)}`;
955
+ }
956
+ const valueType = resolveComparisonValueType(expr.left, expr.right);
957
+ if (valueType === "array" || valueType === "object") {
958
+ throw new UnsupportedPredicateError(
959
+ `Comparison operation "${expr.op}" is not supported for ${valueType} values`
960
+ );
961
+ }
962
+ const left = compileFieldValue(
963
+ expr.left,
964
+ dialect,
965
+ valueType,
966
+ void 0,
967
+ void 0,
968
+ cteColumnPrefix
969
+ );
970
+ if (expr.op === "in" || expr.op === "notIn") {
971
+ const values = Array.isArray(expr.right) ? expr.right : [expr.right];
972
+ if (values.length === 0) {
973
+ return expr.op === "in" ? sql.raw("1=0") : sql.raw("1=1");
974
+ }
975
+ const placeholders = values.map(
976
+ (v) => sql`${convertValueForSql(v.value, dialect)}`
977
+ );
978
+ const op = expr.op === "in" ? sql.raw("IN") : sql.raw("NOT IN");
979
+ return sql`${left} ${op} (${sql.join(placeholders, sql`, `)})`;
980
+ }
981
+ const right = expr.right;
982
+ const rightValue = Array.isArray(right) ? right[0] : right;
983
+ const convertedRight = convertValueForSql(rightValue.value, dialect);
984
+ const opSql = COMPARISON_OP_SQL[expr.op];
985
+ if (!opSql) {
986
+ throw new UnsupportedPredicateError(
987
+ `Comparison operation "${expr.op}" is not supported`
988
+ );
989
+ }
990
+ return sql`${left} ${sql.raw(opSql)} ${convertedRight}`;
991
+ }
992
+ function compileArrayPredicate(expr, dialect, cteColumnPrefix) {
993
+ const field = compileFieldJsonValue(
994
+ expr.field,
995
+ dialect,
996
+ void 0,
997
+ void 0,
998
+ cteColumnPrefix
999
+ );
1000
+ const values = expr.values?.map((v) => convertValueForSql(v.value, dialect)) ?? [];
1001
+ switch (expr.op) {
1002
+ case "isEmpty": {
1003
+ return sql`(${field} IS NULL OR ${dialect.jsonArrayLength(field)} = 0)`;
1004
+ }
1005
+ case "isNotEmpty": {
1006
+ return sql`(${field} IS NOT NULL AND ${dialect.jsonArrayLength(field)} > 0)`;
1007
+ }
1008
+ case "lengthEq": {
1009
+ return sql`${dialect.jsonArrayLength(field)} = ${expr.length}`;
1010
+ }
1011
+ case "lengthGt": {
1012
+ return sql`${dialect.jsonArrayLength(field)} > ${expr.length}`;
1013
+ }
1014
+ case "lengthGte": {
1015
+ return sql`${dialect.jsonArrayLength(field)} >= ${expr.length}`;
1016
+ }
1017
+ case "lengthLt": {
1018
+ return sql`${dialect.jsonArrayLength(field)} < ${expr.length}`;
1019
+ }
1020
+ case "lengthLte": {
1021
+ return sql`${dialect.jsonArrayLength(field)} <= ${expr.length}`;
1022
+ }
1023
+ case "contains": {
1024
+ const value = values[0];
1025
+ if (value === void 0) {
1026
+ return sql.raw("1=0");
1027
+ }
1028
+ return dialect.jsonArrayContains(field, value);
1029
+ }
1030
+ case "containsAll": {
1031
+ return dialect.jsonArrayContainsAll(field, values);
1032
+ }
1033
+ case "containsAny": {
1034
+ return dialect.jsonArrayContainsAny(field, values);
1035
+ }
1036
+ }
1037
+ }
1038
+ function compileObjectPredicate(expr, dialect, cteColumnPrefix) {
1039
+ const basePointer = getFieldPointer(expr.field);
1040
+ const pointer = joinJsonPointers(basePointer, expr.pointer);
1041
+ const column = compileFieldColumn(expr.field, void 0, cteColumnPrefix);
1042
+ switch (expr.op) {
1043
+ case "hasKey":
1044
+ case "hasPath": {
1045
+ return dialect.jsonHasPath(column, pointer);
1046
+ }
1047
+ case "pathEquals": {
1048
+ if (!expr.value) {
1049
+ throw new UnsupportedPredicateError(
1050
+ "pathEquals requires a comparison value"
1051
+ );
1052
+ }
1053
+ const valueType = resolvePredicateValueType(expr.valueType, expr.value);
1054
+ if (valueType === "array" || valueType === "object") {
1055
+ throw new UnsupportedPredicateError(
1056
+ "pathEquals is not supported for JSON arrays or objects"
1057
+ );
1058
+ }
1059
+ const left = compileFieldValue(
1060
+ expr.field,
1061
+ dialect,
1062
+ valueType,
1063
+ void 0,
1064
+ pointer,
1065
+ cteColumnPrefix
1066
+ );
1067
+ return sql`${left} = ${convertValueForSql(expr.value.value, dialect)}`;
1068
+ }
1069
+ case "pathContains": {
1070
+ if (!expr.value) {
1071
+ throw new UnsupportedPredicateError(
1072
+ "pathContains requires a comparison value"
1073
+ );
1074
+ }
1075
+ const arrayField2 = compileFieldJsonValue(
1076
+ expr.field,
1077
+ dialect,
1078
+ void 0,
1079
+ pointer,
1080
+ cteColumnPrefix
1081
+ );
1082
+ return dialect.jsonArrayContains(
1083
+ arrayField2,
1084
+ convertValueForSql(expr.value.value, dialect)
1085
+ );
1086
+ }
1087
+ case "pathIsNull": {
1088
+ return dialect.jsonPathIsNull(column, pointer);
1089
+ }
1090
+ case "pathIsNotNull": {
1091
+ return dialect.jsonPathIsNotNull(column, pointer);
1092
+ }
1093
+ }
1094
+ }
1095
+ function compileAggregatePredicate(expr, dialect) {
1096
+ const aggregate = compileAggregateExpr(expr.aggregate, dialect);
1097
+ const op = COMPARISON_OP_SQL[expr.op];
1098
+ if (!op) {
1099
+ throw new UnsupportedPredicateError(
1100
+ `Comparison operation "${expr.op}" is not supported for aggregate predicates`
1101
+ );
1102
+ }
1103
+ const convertedValue = convertValueForSql(expr.value.value, dialect);
1104
+ return sql`${aggregate} ${sql.raw(op)} ${convertedValue}`;
1105
+ }
1106
+ function compileAggregateExpr(expr, dialect) {
1107
+ const cteAlias = `cte_${expr.field.alias}`;
1108
+ const field = compileFieldValue(
1109
+ expr.field,
1110
+ dialect,
1111
+ expr.field.valueType,
1112
+ cteAlias
1113
+ );
1114
+ switch (expr.function) {
1115
+ case "count": {
1116
+ return sql`COUNT(${field})`;
1117
+ }
1118
+ case "countDistinct": {
1119
+ return sql`COUNT(DISTINCT ${field})`;
1120
+ }
1121
+ case "sum": {
1122
+ return sql`SUM(${field})`;
1123
+ }
1124
+ case "avg": {
1125
+ return sql`AVG(${field})`;
1126
+ }
1127
+ case "min": {
1128
+ return sql`MIN(${field})`;
1129
+ }
1130
+ case "max": {
1131
+ return sql`MAX(${field})`;
1132
+ }
1133
+ default: {
1134
+ throw new UnsupportedPredicateError(
1135
+ `Unknown aggregate function: ${expr.function}`
1136
+ );
1137
+ }
1138
+ }
1139
+ }
1140
+ function compileExistsSubquery(expr, ctx) {
1141
+ if (expr.subquery.graphId === void 0) {
1142
+ throw new UnsupportedPredicateError("EXISTS subquery must have a graphId");
1143
+ }
1144
+ const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);
1145
+ return expr.negated ? sql`NOT EXISTS (${subSql})` : sql`EXISTS (${subSql})`;
1146
+ }
1147
+ function compileInSubquery(expr, ctx) {
1148
+ const subqueryColumnCount = getSubqueryColumnCount(expr.subquery);
1149
+ if (subqueryColumnCount !== 1) {
1150
+ throw new UnsupportedPredicateError(
1151
+ `IN/NOT IN subquery must project exactly 1 column, but got ${subqueryColumnCount}`,
1152
+ { subqueryColumnCount }
1153
+ );
1154
+ }
1155
+ const fieldValueType = normalizeValueType2(expr.field.valueType);
1156
+ const subqueryValueType = getSingleSubqueryColumnValueType(expr.subquery);
1157
+ const resolvedValueType = fieldValueType ?? subqueryValueType;
1158
+ if (isUnsupportedInSubqueryValueType(resolvedValueType)) {
1159
+ throw new UnsupportedPredicateError(
1160
+ `IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,
1161
+ { valueType: resolvedValueType }
1162
+ );
1163
+ }
1164
+ if (!isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {
1165
+ throw new UnsupportedPredicateError(
1166
+ `IN/NOT IN type mismatch: field type "${String(fieldValueType)}" does not match subquery column type "${String(subqueryValueType)}"`,
1167
+ {
1168
+ fieldValueType,
1169
+ subqueryValueType
1170
+ }
1171
+ );
1172
+ }
1173
+ const valueType = fieldValueType ?? subqueryValueType;
1174
+ if (expr.subquery.graphId === void 0) {
1175
+ throw new UnsupportedPredicateError(
1176
+ "IN/NOT IN subquery must have a graphId"
1177
+ );
1178
+ }
1179
+ const fieldSql = compileFieldValue(
1180
+ expr.field,
1181
+ ctx.dialect,
1182
+ valueType,
1183
+ void 0,
1184
+ void 0,
1185
+ ctx.cteColumnPrefix
1186
+ );
1187
+ const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);
1188
+ return expr.negated ? sql`${fieldSql} NOT IN (${subSql})` : sql`${fieldSql} IN (${subSql})`;
1189
+ }
1190
+ function extractStructuralPredicates(predicates, isMatch, rejectionMessage) {
1191
+ const results = [];
1192
+ function visit(expr, inDisallowedBranch) {
1193
+ if (isMatch(expr)) {
1194
+ if (inDisallowedBranch) {
1195
+ throw new UnsupportedPredicateError(rejectionMessage);
1196
+ }
1197
+ results.push(expr);
1198
+ return;
1199
+ }
1200
+ switch (expr.__type) {
1201
+ case "and": {
1202
+ for (const child of expr.predicates) visit(child, inDisallowedBranch);
1203
+ return;
1204
+ }
1205
+ case "or": {
1206
+ for (const child of expr.predicates) visit(child, true);
1207
+ return;
1208
+ }
1209
+ case "not": {
1210
+ visit(expr.predicate, true);
1211
+ return;
1212
+ }
1213
+ case "comparison":
1214
+ case "string_op":
1215
+ case "null_check":
1216
+ case "between":
1217
+ case "array_op":
1218
+ case "object_op":
1219
+ case "aggregate_comparison":
1220
+ case "exists":
1221
+ case "in_subquery":
1222
+ case "vector_similarity":
1223
+ case "fulltext_match": {
1224
+ return;
1225
+ }
1226
+ }
1227
+ }
1228
+ for (const pred of predicates) visit(pred.expression, false);
1229
+ return results;
1230
+ }
1231
+ function extractVectorSimilarityPredicates(predicates) {
1232
+ return extractStructuralPredicates(
1233
+ predicates,
1234
+ (expr) => expr.__type === "vector_similarity",
1235
+ "Vector similarity predicates cannot be nested under OR or NOT. Use top-level AND combinations instead."
1236
+ );
1237
+ }
1238
+ function extractFulltextMatchPredicates(predicates) {
1239
+ return extractStructuralPredicates(
1240
+ predicates,
1241
+ (expr) => expr.__type === "fulltext_match",
1242
+ "Fulltext match predicates cannot be nested under OR or NOT. Use top-level AND combinations instead."
1243
+ );
1244
+ }
1245
+ var EMPTY_PREDICATES = [];
1246
+ function sqlValueList(values) {
1247
+ return sql.join(
1248
+ values.map((value) => sql`${value}`),
1249
+ sql`, `
1250
+ );
1251
+ }
1252
+ function buildPredicateIndexKey(alias, targetType) {
1253
+ return `${alias}\0${targetType}`;
1254
+ }
1255
+ function resolvePredicateTargetType(predicate2) {
1256
+ return predicate2.targetType === "edge" ? "edge" : "node";
1257
+ }
1258
+ function buildPredicateIndex(ast) {
1259
+ const byAliasAndType = /* @__PURE__ */ new Map();
1260
+ for (const predicate2 of ast.predicates) {
1261
+ const key = buildPredicateIndexKey(
1262
+ predicate2.targetAlias,
1263
+ resolvePredicateTargetType(predicate2)
1264
+ );
1265
+ const existing = byAliasAndType.get(key);
1266
+ if (existing === void 0) {
1267
+ byAliasAndType.set(key, [predicate2]);
1268
+ } else {
1269
+ existing.push(predicate2);
1270
+ }
1271
+ }
1272
+ return { byAliasAndType };
1273
+ }
1274
+ function getPredicatesForAlias(predicateIndex, alias, targetType) {
1275
+ return predicateIndex.byAliasAndType.get(
1276
+ buildPredicateIndexKey(alias, targetType)
1277
+ ) ?? EMPTY_PREDICATES;
1278
+ }
1279
+ function compilePredicateClauses(predicates, predicateContext) {
1280
+ return predicates.map(
1281
+ (predicate2) => compilePredicateExpression(predicate2.expression, predicateContext)
1282
+ );
1283
+ }
1284
+ function compileKindFilter(column, kinds) {
1285
+ if (kinds.length === 0) {
1286
+ return sql`1 = 0`;
1287
+ }
1288
+ if (kinds.length === 1) {
1289
+ return sql`${column} = ${kinds[0]}`;
1290
+ }
1291
+ return sql`${column} IN (${sqlValueList(kinds)})`;
1292
+ }
1293
+ function getNodeKindsForAlias(ast, alias) {
1294
+ if (alias === ast.start.alias) {
1295
+ return ast.start.kinds;
1296
+ }
1297
+ for (const traversal of ast.traversals) {
1298
+ if (traversal.nodeAlias === alias) {
1299
+ return traversal.nodeKinds;
1300
+ }
1301
+ }
1302
+ throw new CompilerInvariantError(`Unknown traversal source alias: ${alias}`);
1303
+ }
1304
+ function getHybridTargetAlias(vectorPredicate, fulltextPredicate) {
1305
+ if (!vectorPredicate || !fulltextPredicate) return void 0;
1306
+ return vectorPredicate.field.alias === fulltextPredicate.field.alias ? vectorPredicate.field.alias : void 0;
1307
+ }
1308
+
1309
+ // src/backend/drizzle/row-mappers.ts
1310
+ function requireTimestamp(value, field) {
1311
+ if (value === void 0) {
1312
+ throw new DatabaseOperationError(
1313
+ `Expected non-null ${field} timestamp`,
1314
+ { operation: "select", entity: "row" }
1315
+ );
1316
+ }
1317
+ return value;
1318
+ }
1319
+ function asString(value, field) {
1320
+ if (typeof value !== "string") {
1321
+ throw new DatabaseOperationError(
1322
+ `Expected ${field} to be string, got ${typeof value}`,
1323
+ { operation: "select", entity: "row" }
1324
+ );
1325
+ }
1326
+ return value;
1327
+ }
1328
+ function asNumber(value, field) {
1329
+ if (typeof value !== "number") {
1330
+ throw new DatabaseOperationError(
1331
+ `Expected ${field} to be number, got ${typeof value}`,
1332
+ { operation: "select", entity: "row" }
1333
+ );
1334
+ }
1335
+ return value;
1336
+ }
1337
+ function nowIso() {
1338
+ return (/* @__PURE__ */ new Date()).toISOString();
1339
+ }
1340
+ function nullToUndefined(value) {
1341
+ return value ?? void 0;
1342
+ }
1343
+ function formatPostgresTimestamp(value) {
1344
+ if (value === null || value === void 0) return void 0;
1345
+ if (value instanceof Date) return value.toISOString();
1346
+ if (typeof value === "string") {
1347
+ if (value.includes("T")) return value;
1348
+ const date = new Date(value);
1349
+ if (!Number.isNaN(date.getTime())) return date.toISOString();
1350
+ return value;
1351
+ }
1352
+ return void 0;
1353
+ }
1354
+ function coerceNumericScore(value) {
1355
+ if (typeof value === "number") return value;
1356
+ const parsed = Number.parseFloat(value);
1357
+ if (Number.isNaN(parsed)) {
1358
+ throw new TypeError(
1359
+ `Backend returned non-numeric fulltext score: ${JSON.stringify(value)}`
1360
+ );
1361
+ }
1362
+ return parsed;
1363
+ }
1364
+ function normalizeJsonColumn(value) {
1365
+ return typeof value === "string" ? value : JSON.stringify(value ?? {});
1366
+ }
1367
+ var SQLITE_ROW_MAPPER_CONFIG = {
1368
+ formatTimestamp: (value) => {
1369
+ if (value === null || value === void 0) return;
1370
+ if (typeof value !== "string") {
1371
+ throw new DatabaseOperationError(
1372
+ `Expected timestamp to be string, got ${typeof value}`,
1373
+ { operation: "select", entity: "row" }
1374
+ );
1375
+ }
1376
+ return value;
1377
+ },
1378
+ normalizeJson: (value) => {
1379
+ if (typeof value !== "string") {
1380
+ throw new DatabaseOperationError(
1381
+ `Expected JSON column to be string, got ${typeof value}`,
1382
+ { operation: "select", entity: "row" }
1383
+ );
1384
+ }
1385
+ return value;
1386
+ }
1387
+ };
1388
+ var POSTGRES_ROW_MAPPER_CONFIG = {
1389
+ formatTimestamp: formatPostgresTimestamp,
1390
+ normalizeJson: normalizeJsonColumn
1391
+ };
1392
+ function createNodeRowMapper(config) {
1393
+ return (row) => ({
1394
+ graph_id: asString(row.graph_id, "graph_id"),
1395
+ kind: asString(row.kind, "kind"),
1396
+ id: asString(row.id, "id"),
1397
+ props: config.normalizeJson(row.props),
1398
+ version: asNumber(row.version, "version"),
1399
+ valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),
1400
+ valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),
1401
+ created_at: requireTimestamp(config.formatTimestamp(row.created_at), "created_at"),
1402
+ updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), "updated_at"),
1403
+ deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at))
1404
+ });
1405
+ }
1406
+ function createEdgeRowMapper(config) {
1407
+ return (row) => ({
1408
+ graph_id: asString(row.graph_id, "graph_id"),
1409
+ id: asString(row.id, "id"),
1410
+ kind: asString(row.kind, "kind"),
1411
+ from_kind: asString(row.from_kind, "from_kind"),
1412
+ from_id: asString(row.from_id, "from_id"),
1413
+ to_kind: asString(row.to_kind, "to_kind"),
1414
+ to_id: asString(row.to_id, "to_id"),
1415
+ props: config.normalizeJson(row.props),
1416
+ valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),
1417
+ valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),
1418
+ created_at: requireTimestamp(config.formatTimestamp(row.created_at), "created_at"),
1419
+ updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), "updated_at"),
1420
+ deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at))
1421
+ });
1422
+ }
1423
+ function createUniqueRowMapper(config) {
1424
+ return (row) => ({
1425
+ graph_id: asString(row.graph_id, "graph_id"),
1426
+ node_kind: asString(row.node_kind, "node_kind"),
1427
+ constraint_name: asString(row.constraint_name, "constraint_name"),
1428
+ key: asString(row.key, "key"),
1429
+ node_id: asString(row.node_id, "node_id"),
1430
+ concrete_kind: asString(row.concrete_kind, "concrete_kind"),
1431
+ deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at))
1432
+ });
1433
+ }
1434
+ function createSchemaVersionRowMapper(config) {
1435
+ return (row) => {
1436
+ const isActiveValue = row.is_active;
1437
+ const isActive = isActiveValue === true || isActiveValue === 1 || isActiveValue === "1";
1438
+ return {
1439
+ graph_id: asString(row.graph_id, "graph_id"),
1440
+ version: asNumber(row.version, "version"),
1441
+ schema_hash: asString(row.schema_hash, "schema_hash"),
1442
+ schema_doc: config.normalizeJson(row.schema_doc),
1443
+ created_at: requireTimestamp(config.formatTimestamp(row.created_at), "created_at"),
1444
+ is_active: isActive
1445
+ };
1446
+ };
1447
+ }
1448
+
1449
+ // src/utils/array.ts
1450
+ function chunk(items, size) {
1451
+ if (!Number.isSafeInteger(size) || size < 1) {
1452
+ throw new RangeError(`chunk size must be a positive integer, got: ${size}`);
1453
+ }
1454
+ if (items.length === 0) return [];
1455
+ if (items.length <= size) return [items];
1456
+ const chunks = [];
1457
+ for (let start = 0; start < items.length; start += size) {
1458
+ chunks.push(items.slice(start, start + size));
1459
+ }
1460
+ return chunks;
1461
+ }
1462
+ function groupBy(items, keyFor) {
1463
+ const groups = /* @__PURE__ */ new Map();
1464
+ for (const item of items) {
1465
+ const key = keyFor(item);
1466
+ const group = groups.get(key) ?? [];
1467
+ group.push(item);
1468
+ groups.set(key, group);
1469
+ }
1470
+ return groups;
1471
+ }
1472
+
1473
+ // src/utils/presence.ts
1474
+ function isPresent(value) {
1475
+ return value !== null && value !== void 0;
1476
+ }
1477
+
1478
+ export { POSTGRES_CAPABILITIES, POSTGRES_MAX_BIND_PARAMETERS, POSTGRES_ROW_MAPPER_CONFIG, SQLITE_CAPABILITIES, SQLITE_MAX_BIND_PARAMETERS, SQLITE_ROW_MAPPER_CONFIG, arrayField, baseField, buildFieldBuilderForTypeInfo, buildPredicateIndex, chunk, coerceNumericScore, compileFieldValue, compileKindFilter, compilePredicateClauses, compilePredicateExpression, createBackendOverlay, createEdgeRowMapper, createFulltextAccessor, createNodeRowMapper, createSchemaVersionRowMapper, createUniqueRowMapper, dateField, exists, extractFulltextMatchPredicates, extractVectorSimilarityPredicates, fieldRef, formatPostgresTimestamp, getHybridTargetAlias, getNodeKindsForAlias, getPredicatesForAlias, groupBy, inSubquery, isParameterRef, isPresent, notExists, notInSubquery, nowIso, numberField, objectField, param, runOptionallyInTransaction, sqlValueList, stringField, wrapWithManagedClose };
1479
+ //# sourceMappingURL=chunk-PYD3UCDU.js.map
1480
+ //# sourceMappingURL=chunk-PYD3UCDU.js.map