@proseql/core 0.1.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 (342) hide show
  1. package/LICENSE +21 -0
  2. package/dist/errors/crud-errors.d.ts +98 -0
  3. package/dist/errors/crud-errors.d.ts.map +1 -0
  4. package/dist/errors/crud-errors.js +23 -0
  5. package/dist/errors/crud-errors.js.map +1 -0
  6. package/dist/errors/index.d.ts +16 -0
  7. package/dist/errors/index.d.ts.map +1 -0
  8. package/dist/errors/index.js +12 -0
  9. package/dist/errors/index.js.map +1 -0
  10. package/dist/errors/migration-errors.d.ts +22 -0
  11. package/dist/errors/migration-errors.d.ts.map +1 -0
  12. package/dist/errors/migration-errors.js +14 -0
  13. package/dist/errors/migration-errors.js.map +1 -0
  14. package/dist/errors/plugin-errors.d.ts +15 -0
  15. package/dist/errors/plugin-errors.d.ts.map +1 -0
  16. package/dist/errors/plugin-errors.js +11 -0
  17. package/dist/errors/plugin-errors.js.map +1 -0
  18. package/dist/errors/query-errors.d.ts +31 -0
  19. package/dist/errors/query-errors.d.ts.map +1 -0
  20. package/dist/errors/query-errors.js +11 -0
  21. package/dist/errors/query-errors.js.map +1 -0
  22. package/dist/errors/storage-errors.d.ts +30 -0
  23. package/dist/errors/storage-errors.d.ts.map +1 -0
  24. package/dist/errors/storage-errors.js +11 -0
  25. package/dist/errors/storage-errors.js.map +1 -0
  26. package/dist/factories/crud-factory-with-relationships.d.ts +28 -0
  27. package/dist/factories/crud-factory-with-relationships.d.ts.map +1 -0
  28. package/dist/factories/crud-factory-with-relationships.js +8 -0
  29. package/dist/factories/crud-factory-with-relationships.js.map +1 -0
  30. package/dist/factories/crud-factory.d.ts +25 -0
  31. package/dist/factories/crud-factory.d.ts.map +1 -0
  32. package/dist/factories/crud-factory.js +8 -0
  33. package/dist/factories/crud-factory.js.map +1 -0
  34. package/dist/factories/database-effect.d.ts +241 -0
  35. package/dist/factories/database-effect.d.ts.map +1 -0
  36. package/dist/factories/database-effect.js +859 -0
  37. package/dist/factories/database-effect.js.map +1 -0
  38. package/dist/hooks/hook-runner.d.ts +60 -0
  39. package/dist/hooks/hook-runner.d.ts.map +1 -0
  40. package/dist/hooks/hook-runner.js +107 -0
  41. package/dist/hooks/hook-runner.js.map +1 -0
  42. package/dist/index.d.ts +84 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +110 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/indexes/index-lookup.d.ts +33 -0
  47. package/dist/indexes/index-lookup.d.ts.map +1 -0
  48. package/dist/indexes/index-lookup.js +180 -0
  49. package/dist/indexes/index-lookup.js.map +1 -0
  50. package/dist/indexes/index-manager.d.ts +118 -0
  51. package/dist/indexes/index-manager.d.ts.map +1 -0
  52. package/dist/indexes/index-manager.js +345 -0
  53. package/dist/indexes/index-manager.js.map +1 -0
  54. package/dist/indexes/search-index.d.ts +179 -0
  55. package/dist/indexes/search-index.d.ts.map +1 -0
  56. package/dist/indexes/search-index.js +405 -0
  57. package/dist/indexes/search-index.js.map +1 -0
  58. package/dist/migrations/migration-runner.d.ts +70 -0
  59. package/dist/migrations/migration-runner.d.ts.map +1 -0
  60. package/dist/migrations/migration-runner.js +271 -0
  61. package/dist/migrations/migration-runner.js.map +1 -0
  62. package/dist/migrations/migration-types.d.ts +63 -0
  63. package/dist/migrations/migration-types.d.ts.map +1 -0
  64. package/dist/migrations/migration-types.js +5 -0
  65. package/dist/migrations/migration-types.js.map +1 -0
  66. package/dist/operations/crud/create-with-relationships.d.ts +44 -0
  67. package/dist/operations/crud/create-with-relationships.d.ts.map +1 -0
  68. package/dist/operations/crud/create-with-relationships.js +483 -0
  69. package/dist/operations/crud/create-with-relationships.js.map +1 -0
  70. package/dist/operations/crud/create.d.ts +48 -0
  71. package/dist/operations/crud/create.d.ts.map +1 -0
  72. package/dist/operations/crud/create.js +333 -0
  73. package/dist/operations/crud/create.js.map +1 -0
  74. package/dist/operations/crud/delete-with-relationships.d.ts +63 -0
  75. package/dist/operations/crud/delete-with-relationships.d.ts.map +1 -0
  76. package/dist/operations/crud/delete-with-relationships.js +395 -0
  77. package/dist/operations/crud/delete-with-relationships.js.map +1 -0
  78. package/dist/operations/crud/delete.d.ts +58 -0
  79. package/dist/operations/crud/delete.d.ts.map +1 -0
  80. package/dist/operations/crud/delete.js +267 -0
  81. package/dist/operations/crud/delete.js.map +1 -0
  82. package/dist/operations/crud/unique-check.d.ts +114 -0
  83. package/dist/operations/crud/unique-check.d.ts.map +1 -0
  84. package/dist/operations/crud/unique-check.js +383 -0
  85. package/dist/operations/crud/unique-check.js.map +1 -0
  86. package/dist/operations/crud/update-with-relationships.d.ts +45 -0
  87. package/dist/operations/crud/update-with-relationships.d.ts.map +1 -0
  88. package/dist/operations/crud/update-with-relationships.js +516 -0
  89. package/dist/operations/crud/update-with-relationships.js.map +1 -0
  90. package/dist/operations/crud/update.d.ts +91 -0
  91. package/dist/operations/crud/update.d.ts.map +1 -0
  92. package/dist/operations/crud/update.js +505 -0
  93. package/dist/operations/crud/update.js.map +1 -0
  94. package/dist/operations/crud/upsert.d.ts +52 -0
  95. package/dist/operations/crud/upsert.d.ts.map +1 -0
  96. package/dist/operations/crud/upsert.js +386 -0
  97. package/dist/operations/crud/upsert.js.map +1 -0
  98. package/dist/operations/query/aggregate.d.ts +30 -0
  99. package/dist/operations/query/aggregate.d.ts.map +1 -0
  100. package/dist/operations/query/aggregate.js +227 -0
  101. package/dist/operations/query/aggregate.js.map +1 -0
  102. package/dist/operations/query/cursor-stream.d.ts +18 -0
  103. package/dist/operations/query/cursor-stream.d.ts.map +1 -0
  104. package/dist/operations/query/cursor-stream.js +199 -0
  105. package/dist/operations/query/cursor-stream.js.map +1 -0
  106. package/dist/operations/query/filter-stream.d.ts +12 -0
  107. package/dist/operations/query/filter-stream.d.ts.map +1 -0
  108. package/dist/operations/query/filter-stream.js +167 -0
  109. package/dist/operations/query/filter-stream.js.map +1 -0
  110. package/dist/operations/query/filter.d.ts +13 -0
  111. package/dist/operations/query/filter.d.ts.map +1 -0
  112. package/dist/operations/query/filter.js +267 -0
  113. package/dist/operations/query/filter.js.map +1 -0
  114. package/dist/operations/query/paginate-stream.d.ts +11 -0
  115. package/dist/operations/query/paginate-stream.d.ts.map +1 -0
  116. package/dist/operations/query/paginate-stream.js +22 -0
  117. package/dist/operations/query/paginate-stream.js.map +1 -0
  118. package/dist/operations/query/query-helpers.d.ts +14 -0
  119. package/dist/operations/query/query-helpers.d.ts.map +1 -0
  120. package/dist/operations/query/query-helpers.js +22 -0
  121. package/dist/operations/query/query-helpers.js.map +1 -0
  122. package/dist/operations/query/resolve-computed.d.ts +142 -0
  123. package/dist/operations/query/resolve-computed.d.ts.map +1 -0
  124. package/dist/operations/query/resolve-computed.js +197 -0
  125. package/dist/operations/query/resolve-computed.js.map +1 -0
  126. package/dist/operations/query/search.d.ts +110 -0
  127. package/dist/operations/query/search.d.ts.map +1 -0
  128. package/dist/operations/query/search.js +188 -0
  129. package/dist/operations/query/search.js.map +1 -0
  130. package/dist/operations/query/select-stream.d.ts +27 -0
  131. package/dist/operations/query/select-stream.d.ts.map +1 -0
  132. package/dist/operations/query/select-stream.js +88 -0
  133. package/dist/operations/query/select-stream.js.map +1 -0
  134. package/dist/operations/query/select.d.ts +54 -0
  135. package/dist/operations/query/select.d.ts.map +1 -0
  136. package/dist/operations/query/select.js +159 -0
  137. package/dist/operations/query/select.js.map +1 -0
  138. package/dist/operations/query/sort-stream.d.ts +46 -0
  139. package/dist/operations/query/sort-stream.d.ts.map +1 -0
  140. package/dist/operations/query/sort-stream.js +158 -0
  141. package/dist/operations/query/sort-stream.js.map +1 -0
  142. package/dist/operations/query/sort.d.ts +9 -0
  143. package/dist/operations/query/sort.d.ts.map +1 -0
  144. package/dist/operations/query/sort.js +58 -0
  145. package/dist/operations/query/sort.js.map +1 -0
  146. package/dist/operations/relationships/populate-stream.d.ts +29 -0
  147. package/dist/operations/relationships/populate-stream.d.ts.map +1 -0
  148. package/dist/operations/relationships/populate-stream.js +159 -0
  149. package/dist/operations/relationships/populate-stream.js.map +1 -0
  150. package/dist/operations/relationships/populate.d.ts +15 -0
  151. package/dist/operations/relationships/populate.d.ts.map +1 -0
  152. package/dist/operations/relationships/populate.js +228 -0
  153. package/dist/operations/relationships/populate.js.map +1 -0
  154. package/dist/plugins/plugin-hooks.d.ts +25 -0
  155. package/dist/plugins/plugin-hooks.d.ts.map +1 -0
  156. package/dist/plugins/plugin-hooks.js +64 -0
  157. package/dist/plugins/plugin-hooks.js.map +1 -0
  158. package/dist/plugins/plugin-registry.d.ts +26 -0
  159. package/dist/plugins/plugin-registry.d.ts.map +1 -0
  160. package/dist/plugins/plugin-registry.js +150 -0
  161. package/dist/plugins/plugin-registry.js.map +1 -0
  162. package/dist/plugins/plugin-types.d.ts +95 -0
  163. package/dist/plugins/plugin-types.d.ts.map +1 -0
  164. package/dist/plugins/plugin-types.js +6 -0
  165. package/dist/plugins/plugin-types.js.map +1 -0
  166. package/dist/plugins/plugin-validation.d.ts +49 -0
  167. package/dist/plugins/plugin-validation.d.ts.map +1 -0
  168. package/dist/plugins/plugin-validation.js +295 -0
  169. package/dist/plugins/plugin-validation.js.map +1 -0
  170. package/dist/reactive/change-event.d.ts +44 -0
  171. package/dist/reactive/change-event.d.ts.map +1 -0
  172. package/dist/reactive/change-event.js +49 -0
  173. package/dist/reactive/change-event.js.map +1 -0
  174. package/dist/reactive/change-pubsub.d.ts +32 -0
  175. package/dist/reactive/change-pubsub.d.ts.map +1 -0
  176. package/dist/reactive/change-pubsub.js +31 -0
  177. package/dist/reactive/change-pubsub.js.map +1 -0
  178. package/dist/reactive/evaluate-query.d.ts +62 -0
  179. package/dist/reactive/evaluate-query.d.ts.map +1 -0
  180. package/dist/reactive/evaluate-query.js +57 -0
  181. package/dist/reactive/evaluate-query.js.map +1 -0
  182. package/dist/reactive/watch-by-id.d.ts +53 -0
  183. package/dist/reactive/watch-by-id.d.ts.map +1 -0
  184. package/dist/reactive/watch-by-id.js +55 -0
  185. package/dist/reactive/watch-by-id.js.map +1 -0
  186. package/dist/reactive/watch.d.ts +78 -0
  187. package/dist/reactive/watch.d.ts.map +1 -0
  188. package/dist/reactive/watch.js +133 -0
  189. package/dist/reactive/watch.js.map +1 -0
  190. package/dist/serializers/codecs/hjson.d.ts +33 -0
  191. package/dist/serializers/codecs/hjson.d.ts.map +1 -0
  192. package/dist/serializers/codecs/hjson.js +40 -0
  193. package/dist/serializers/codecs/hjson.js.map +1 -0
  194. package/dist/serializers/codecs/json.d.ts +22 -0
  195. package/dist/serializers/codecs/json.d.ts.map +1 -0
  196. package/dist/serializers/codecs/json.js +28 -0
  197. package/dist/serializers/codecs/json.js.map +1 -0
  198. package/dist/serializers/codecs/json5.d.ts +26 -0
  199. package/dist/serializers/codecs/json5.d.ts.map +1 -0
  200. package/dist/serializers/codecs/json5.js +33 -0
  201. package/dist/serializers/codecs/json5.js.map +1 -0
  202. package/dist/serializers/codecs/jsonc.d.ts +29 -0
  203. package/dist/serializers/codecs/jsonc.d.ts.map +1 -0
  204. package/dist/serializers/codecs/jsonc.js +38 -0
  205. package/dist/serializers/codecs/jsonc.js.map +1 -0
  206. package/dist/serializers/codecs/jsonl.d.ts +17 -0
  207. package/dist/serializers/codecs/jsonl.d.ts.map +1 -0
  208. package/dist/serializers/codecs/jsonl.js +31 -0
  209. package/dist/serializers/codecs/jsonl.js.map +1 -0
  210. package/dist/serializers/codecs/prose.d.ts +419 -0
  211. package/dist/serializers/codecs/prose.d.ts.map +1 -0
  212. package/dist/serializers/codecs/prose.js +1060 -0
  213. package/dist/serializers/codecs/prose.js.map +1 -0
  214. package/dist/serializers/codecs/toml.d.ts +23 -0
  215. package/dist/serializers/codecs/toml.d.ts.map +1 -0
  216. package/dist/serializers/codecs/toml.js +66 -0
  217. package/dist/serializers/codecs/toml.js.map +1 -0
  218. package/dist/serializers/codecs/toon.d.ts +20 -0
  219. package/dist/serializers/codecs/toon.d.ts.map +1 -0
  220. package/dist/serializers/codecs/toon.js +33 -0
  221. package/dist/serializers/codecs/toon.js.map +1 -0
  222. package/dist/serializers/codecs/yaml.d.ts +24 -0
  223. package/dist/serializers/codecs/yaml.d.ts.map +1 -0
  224. package/dist/serializers/codecs/yaml.js +31 -0
  225. package/dist/serializers/codecs/yaml.js.map +1 -0
  226. package/dist/serializers/format-codec.d.ts +53 -0
  227. package/dist/serializers/format-codec.d.ts.map +1 -0
  228. package/dist/serializers/format-codec.js +148 -0
  229. package/dist/serializers/format-codec.js.map +1 -0
  230. package/dist/serializers/presets.d.ts +48 -0
  231. package/dist/serializers/presets.d.ts.map +1 -0
  232. package/dist/serializers/presets.js +72 -0
  233. package/dist/serializers/presets.js.map +1 -0
  234. package/dist/serializers/serializer-service.d.ts +11 -0
  235. package/dist/serializers/serializer-service.d.ts.map +1 -0
  236. package/dist/serializers/serializer-service.js +4 -0
  237. package/dist/serializers/serializer-service.js.map +1 -0
  238. package/dist/state/collection-state.d.ts +19 -0
  239. package/dist/state/collection-state.d.ts.map +1 -0
  240. package/dist/state/collection-state.js +15 -0
  241. package/dist/state/collection-state.js.map +1 -0
  242. package/dist/state/state-operations.d.ts +38 -0
  243. package/dist/state/state-operations.d.ts.map +1 -0
  244. package/dist/state/state-operations.js +65 -0
  245. package/dist/state/state-operations.js.map +1 -0
  246. package/dist/storage/in-memory-adapter-layer.d.ts +16 -0
  247. package/dist/storage/in-memory-adapter-layer.d.ts.map +1 -0
  248. package/dist/storage/in-memory-adapter-layer.js +81 -0
  249. package/dist/storage/in-memory-adapter-layer.js.map +1 -0
  250. package/dist/storage/persistence-effect.d.ts +244 -0
  251. package/dist/storage/persistence-effect.d.ts.map +1 -0
  252. package/dist/storage/persistence-effect.js +551 -0
  253. package/dist/storage/persistence-effect.js.map +1 -0
  254. package/dist/storage/storage-service.d.ts +22 -0
  255. package/dist/storage/storage-service.d.ts.map +1 -0
  256. package/dist/storage/storage-service.js +4 -0
  257. package/dist/storage/storage-service.js.map +1 -0
  258. package/dist/storage/transforms.d.ts +183 -0
  259. package/dist/storage/transforms.d.ts.map +1 -0
  260. package/dist/storage/transforms.js +263 -0
  261. package/dist/storage/transforms.js.map +1 -0
  262. package/dist/transactions/transaction.d.ts +87 -0
  263. package/dist/transactions/transaction.d.ts.map +1 -0
  264. package/dist/transactions/transaction.js +240 -0
  265. package/dist/transactions/transaction.js.map +1 -0
  266. package/dist/types/aggregate-types.d.ts +73 -0
  267. package/dist/types/aggregate-types.d.ts.map +1 -0
  268. package/dist/types/aggregate-types.js +14 -0
  269. package/dist/types/aggregate-types.js.map +1 -0
  270. package/dist/types/computed-types.d.ts +71 -0
  271. package/dist/types/computed-types.d.ts.map +1 -0
  272. package/dist/types/computed-types.js +8 -0
  273. package/dist/types/computed-types.js.map +1 -0
  274. package/dist/types/crud-relationship-types.d.ts +180 -0
  275. package/dist/types/crud-relationship-types.d.ts.map +1 -0
  276. package/dist/types/crud-relationship-types.js +17 -0
  277. package/dist/types/crud-relationship-types.js.map +1 -0
  278. package/dist/types/crud-types.d.ts +343 -0
  279. package/dist/types/crud-types.d.ts.map +1 -0
  280. package/dist/types/crud-types.js +43 -0
  281. package/dist/types/crud-types.js.map +1 -0
  282. package/dist/types/cursor-types.d.ts +52 -0
  283. package/dist/types/cursor-types.d.ts.map +1 -0
  284. package/dist/types/cursor-types.js +2 -0
  285. package/dist/types/cursor-types.js.map +1 -0
  286. package/dist/types/database-config-types.d.ts +196 -0
  287. package/dist/types/database-config-types.d.ts.map +1 -0
  288. package/dist/types/database-config-types.js +11 -0
  289. package/dist/types/database-config-types.js.map +1 -0
  290. package/dist/types/hook-types.d.ts +158 -0
  291. package/dist/types/hook-types.d.ts.map +1 -0
  292. package/dist/types/hook-types.js +6 -0
  293. package/dist/types/hook-types.js.map +1 -0
  294. package/dist/types/index-types.d.ts +42 -0
  295. package/dist/types/index-types.d.ts.map +1 -0
  296. package/dist/types/index-types.js +8 -0
  297. package/dist/types/index-types.js.map +1 -0
  298. package/dist/types/operators.d.ts +5 -0
  299. package/dist/types/operators.d.ts.map +1 -0
  300. package/dist/types/operators.js +297 -0
  301. package/dist/types/operators.js.map +1 -0
  302. package/dist/types/query-overloads.d.ts +54 -0
  303. package/dist/types/query-overloads.d.ts.map +1 -0
  304. package/dist/types/query-overloads.js +3 -0
  305. package/dist/types/query-overloads.js.map +1 -0
  306. package/dist/types/reactive-types.d.ts +75 -0
  307. package/dist/types/reactive-types.d.ts.map +1 -0
  308. package/dist/types/reactive-types.js +7 -0
  309. package/dist/types/reactive-types.js.map +1 -0
  310. package/dist/types/schema-types.d.ts +56 -0
  311. package/dist/types/schema-types.d.ts.map +1 -0
  312. package/dist/types/schema-types.js +8 -0
  313. package/dist/types/schema-types.js.map +1 -0
  314. package/dist/types/search-types.d.ts +82 -0
  315. package/dist/types/search-types.d.ts.map +1 -0
  316. package/dist/types/search-types.js +110 -0
  317. package/dist/types/search-types.js.map +1 -0
  318. package/dist/types/types.d.ts +286 -0
  319. package/dist/types/types.d.ts.map +1 -0
  320. package/dist/types/types.js +2 -0
  321. package/dist/types/types.js.map +1 -0
  322. package/dist/utils/id-generator.d.ts +97 -0
  323. package/dist/utils/id-generator.d.ts.map +1 -0
  324. package/dist/utils/id-generator.js +247 -0
  325. package/dist/utils/id-generator.js.map +1 -0
  326. package/dist/utils/nested-path.d.ts +56 -0
  327. package/dist/utils/nested-path.d.ts.map +1 -0
  328. package/dist/utils/nested-path.js +119 -0
  329. package/dist/utils/nested-path.js.map +1 -0
  330. package/dist/utils/path.d.ts +16 -0
  331. package/dist/utils/path.d.ts.map +1 -0
  332. package/dist/utils/path.js +24 -0
  333. package/dist/utils/path.js.map +1 -0
  334. package/dist/validators/foreign-key.d.ts +49 -0
  335. package/dist/validators/foreign-key.d.ts.map +1 -0
  336. package/dist/validators/foreign-key.js +153 -0
  337. package/dist/validators/foreign-key.js.map +1 -0
  338. package/dist/validators/schema-validator.d.ts +19 -0
  339. package/dist/validators/schema-validator.d.ts.map +1 -0
  340. package/dist/validators/schema-validator.js +34 -0
  341. package/dist/validators/schema-validator.js.map +1 -0
  342. package/package.json +57 -0
@@ -0,0 +1,267 @@
1
+ import { matchesFilter } from "../../types/operators.js";
2
+ import { tokenize } from "./search.js";
3
+ // Type guard to check if where clause is a valid object
4
+ export function isValidWhereClause(where) {
5
+ return where !== null && typeof where === "object" && !Array.isArray(where);
6
+ }
7
+ // Helper function to filter data based on where clause
8
+ export function filterData(data, where, allData, relationships, collectionName, config) {
9
+ if (!where || !isValidWhereClause(where))
10
+ return data;
11
+ return data.filter((item) => {
12
+ let shouldInclude = true;
13
+ for (const [key, value] of Object.entries(where)) {
14
+ // Handle conditional logic operators
15
+ if (key === "$or") {
16
+ if (!Array.isArray(value)) {
17
+ shouldInclude = false;
18
+ break;
19
+ }
20
+ // OR: at least one condition must be true
21
+ // Empty array means no conditions to match, so it's false
22
+ if (value.length === 0) {
23
+ shouldInclude = false;
24
+ break;
25
+ }
26
+ const orResults = value.map((condition) => {
27
+ if (!isValidWhereClause(condition))
28
+ return false;
29
+ const filtered = filterData([item], condition, allData, relationships, collectionName, config);
30
+ return filtered.length > 0;
31
+ });
32
+ if (!orResults.some((result) => result === true)) {
33
+ shouldInclude = false;
34
+ break;
35
+ }
36
+ }
37
+ else if (key === "$and") {
38
+ if (!Array.isArray(value)) {
39
+ shouldInclude = false;
40
+ break;
41
+ }
42
+ // AND: all conditions must be true
43
+ // Empty array means all conditions are true (vacuous truth)
44
+ if (value.length === 0) {
45
+ continue;
46
+ }
47
+ const andResults = value.map((condition) => {
48
+ if (!isValidWhereClause(condition))
49
+ return false;
50
+ const filtered = filterData([item], condition, allData, relationships, collectionName, config);
51
+ return filtered.length > 0;
52
+ });
53
+ if (!andResults.every((result) => result === true)) {
54
+ shouldInclude = false;
55
+ break;
56
+ }
57
+ }
58
+ else if (key === "$not") {
59
+ if (!isValidWhereClause(value)) {
60
+ shouldInclude = false;
61
+ break;
62
+ }
63
+ // NOT: condition must be false
64
+ const filtered = filterData([item], value, allData, relationships, collectionName, config);
65
+ if (filtered.length > 0) {
66
+ shouldInclude = false;
67
+ break;
68
+ }
69
+ }
70
+ else if (key === "$search") {
71
+ // Top-level multi-field search: check if entity matches across specified fields
72
+ // If $search is present, extract the query and fields from SearchConfig
73
+ if (value === null || typeof value !== "object") {
74
+ // Invalid search config
75
+ shouldInclude = false;
76
+ break;
77
+ }
78
+ const searchConfig = value;
79
+ const query = searchConfig.query;
80
+ // Empty query matches everything
81
+ if (!query || query.trim() === "") {
82
+ continue;
83
+ }
84
+ const queryTokens = tokenize(query);
85
+ if (queryTokens.length === 0) {
86
+ // After tokenization, no tokens means match all
87
+ continue;
88
+ }
89
+ // Determine target fields: explicit or all string fields on the entity
90
+ let targetFields;
91
+ if (searchConfig.fields && searchConfig.fields.length > 0) {
92
+ targetFields = searchConfig.fields;
93
+ }
94
+ else {
95
+ // Find all string fields on the entity
96
+ targetFields = Object.keys(item).filter((k) => typeof item[k] === "string");
97
+ }
98
+ // Check if all query tokens are found across the target fields
99
+ // Each query token must match in at least one field (exact or prefix)
100
+ const allTokensMatch = queryTokens.every((qt) => {
101
+ // Check if this query token matches in any of the target fields
102
+ return targetFields.some((field) => {
103
+ const fieldValue = item[field];
104
+ if (typeof fieldValue !== "string") {
105
+ return false;
106
+ }
107
+ const fieldTokens = tokenize(fieldValue);
108
+ // Check if any field token matches (exact or prefix)
109
+ return fieldTokens.some((ft) => ft === qt || ft.startsWith(qt));
110
+ });
111
+ });
112
+ if (!allTokensMatch) {
113
+ shouldInclude = false;
114
+ break;
115
+ }
116
+ }
117
+ else if (relationships?.[key] && allData && collectionName && config) {
118
+ // Handle relationship filtering
119
+ const relationship = relationships[key];
120
+ const targetData = allData[relationship.target];
121
+ if (relationship.type === "ref") {
122
+ // For ref relationships, find the related item
123
+ const foreignKeyField = relationship.foreignKey || `${key}Id`;
124
+ const relatedItem = targetData?.find((target) => {
125
+ if (!isValidWhereClause(target))
126
+ return false;
127
+ return target.id === item[foreignKeyField];
128
+ });
129
+ if (!relatedItem) {
130
+ // If no related item and we have a filter, it doesn't match
131
+ if (value &&
132
+ typeof value === "object" &&
133
+ Object.keys(value).length > 0) {
134
+ shouldInclude = false;
135
+ break;
136
+ }
137
+ continue;
138
+ }
139
+ // Recursively filter the related item
140
+ const targetConfig = config[relationship.target];
141
+ if (targetConfig && isValidWhereClause(relatedItem)) {
142
+ const filtered = filterData([relatedItem], value, allData, targetConfig.relationships, relationship.target, config);
143
+ if (filtered.length === 0) {
144
+ shouldInclude = false;
145
+ break;
146
+ }
147
+ }
148
+ }
149
+ else if (relationship.type === "inverse") {
150
+ // For inverse relationships, find all related items
151
+ // Find multiple related items where they reference this item
152
+ // The foreign key is based on the collection name (e.g., 'userId' for 'users' collection)
153
+ const foreignKeyField = relationship.foreignKey ||
154
+ (collectionName ? `${collectionName.replace(/s$/, "")}Id` : "id");
155
+ const relatedItems = targetData?.filter((target) => {
156
+ if (!isValidWhereClause(target))
157
+ return false;
158
+ return target[foreignKeyField] === item.id;
159
+ }) || [];
160
+ // Handle array operators
161
+ if (value && typeof value === "object") {
162
+ const operators = value;
163
+ const targetConfig = config[relationship.target];
164
+ if ("$some" in operators && targetConfig) {
165
+ // At least one related item must match
166
+ const someMatch = relatedItems.some((relItem) => {
167
+ if (!isValidWhereClause(relItem))
168
+ return false;
169
+ const filtered = filterData([relItem], operators.$some, allData, targetConfig.relationships, relationship.target, config);
170
+ return filtered.length > 0;
171
+ });
172
+ if (!someMatch) {
173
+ shouldInclude = false;
174
+ break;
175
+ }
176
+ }
177
+ if ("$every" in operators && targetConfig) {
178
+ // All related items must match (or no related items)
179
+ if (relatedItems.length === 0)
180
+ continue;
181
+ const everyMatch = relatedItems.every((relItem) => {
182
+ if (!isValidWhereClause(relItem))
183
+ return false;
184
+ const filtered = filterData([relItem], operators.$every, allData, targetConfig.relationships, relationship.target, config);
185
+ return filtered.length > 0;
186
+ });
187
+ if (!everyMatch) {
188
+ shouldInclude = false;
189
+ break;
190
+ }
191
+ }
192
+ if ("$none" in operators && targetConfig) {
193
+ // No related items should match
194
+ const noneMatch = relatedItems.some((relItem) => {
195
+ if (!isValidWhereClause(relItem))
196
+ return false;
197
+ const filtered = filterData([relItem], operators.$none, allData, targetConfig.relationships, relationship.target, config);
198
+ return filtered.length > 0;
199
+ });
200
+ if (noneMatch) {
201
+ shouldInclude = false;
202
+ break;
203
+ }
204
+ }
205
+ }
206
+ }
207
+ }
208
+ else if (key in item) {
209
+ // Handle regular field filtering
210
+ if (!matchesFilter(item[key], value)) {
211
+ shouldInclude = false;
212
+ break;
213
+ }
214
+ }
215
+ else {
216
+ // If the field doesn't exist in the item
217
+ if (isValidWhereClause(value)) {
218
+ const ops = value;
219
+ if ("$eq" in ops && ops.$eq === undefined) {
220
+ // Looking for items where field equals undefined (doesn't exist)
221
+ continue;
222
+ }
223
+ else if ("$ne" in ops && ops.$ne === undefined) {
224
+ // Looking for items where field doesn't equal undefined (doesn't exist)
225
+ shouldInclude = false;
226
+ break;
227
+ }
228
+ // For operator-based filters on non-existent fields, it doesn't match
229
+ const operatorKeys = [
230
+ "$eq",
231
+ "$ne",
232
+ "$in",
233
+ "$nin",
234
+ "$gt",
235
+ "$gte",
236
+ "$lt",
237
+ "$lte",
238
+ "$startsWith",
239
+ "$endsWith",
240
+ "$contains",
241
+ "$all",
242
+ "$size",
243
+ "$search",
244
+ ];
245
+ const logicalOperatorKeys = ["$or", "$and", "$not"];
246
+ const hasOperators = Object.keys(ops).some((key) => operatorKeys.includes(key));
247
+ const hasLogicalOperators = Object.keys(ops).some((key) => logicalOperatorKeys.includes(key));
248
+ if (hasOperators || hasLogicalOperators) {
249
+ shouldInclude = false;
250
+ break;
251
+ }
252
+ }
253
+ // For direct equality on a non-existent field:
254
+ // If looking for undefined, it matches (field doesn't exist = undefined)
255
+ // Otherwise, it doesn't match
256
+ if (value !== undefined) {
257
+ shouldInclude = false;
258
+ break;
259
+ }
260
+ }
261
+ if (!shouldInclude)
262
+ break;
263
+ }
264
+ return shouldInclude;
265
+ });
266
+ }
267
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../src/operations/query/filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Stream } from "effect";
2
+ /**
3
+ * Apply pagination as a Stream combinator using Stream.drop for offset and Stream.take for limit.
4
+ * Returns a function that transforms Stream<T> → Stream<T>, skipping `offset` items
5
+ * and emitting at most `limit` items.
6
+ *
7
+ * Normalizes inputs: negative values are clamped to 0, fractional values are floored.
8
+ * A limit of 0 returns an empty stream. Undefined limit means no limit (all remaining items).
9
+ */
10
+ export declare const applyPagination: (offset: number | undefined, limit: number | undefined) => <T, E, R>(stream: Stream.Stream<T, E, R>) => Stream.Stream<T, E, R>;
11
+ //# sourceMappingURL=paginate-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate-stream.d.ts","sourceRoot":"","sources":["../../../src/operations/query/paginate-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,GAAG,SAAS,EAAE,OAAO,MAAM,GAAG,SAAS,MACrD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAiB/D,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Stream } from "effect";
2
+ /**
3
+ * Apply pagination as a Stream combinator using Stream.drop for offset and Stream.take for limit.
4
+ * Returns a function that transforms Stream<T> → Stream<T>, skipping `offset` items
5
+ * and emitting at most `limit` items.
6
+ *
7
+ * Normalizes inputs: negative values are clamped to 0, fractional values are floored.
8
+ * A limit of 0 returns an empty stream. Undefined limit means no limit (all remaining items).
9
+ */
10
+ export const applyPagination = (offset, limit) => (stream) => {
11
+ const normalizedOffset = offset !== undefined ? Math.max(0, Math.floor(offset)) : 0;
12
+ const normalizedLimit = limit !== undefined ? Math.max(0, Math.floor(limit)) : undefined;
13
+ let result = stream;
14
+ if (normalizedOffset > 0) {
15
+ result = Stream.drop(result, normalizedOffset);
16
+ }
17
+ if (normalizedLimit !== undefined) {
18
+ result = Stream.take(result, normalizedLimit);
19
+ }
20
+ return result;
21
+ };
22
+ //# sourceMappingURL=paginate-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate-stream.js","sourceRoot":"","sources":["../../../src/operations/query/paginate-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAC3B,CAAC,MAA0B,EAAE,KAAyB,EAAE,EAAE,CAC1D,CAAU,MAA8B,EAA0B,EAAE;IACnE,MAAM,gBAAgB,GACrB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,eAAe,GACpB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElE,IAAI,MAAM,GAAG,MAAM,CAAC;IAEpB,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Helper functions for working with query results
3
+ */
4
+ /**
5
+ * Collect all results from an AsyncIterable into an array
6
+ */
7
+ export declare function toArray<T>(iterable: AsyncIterable<T>): Promise<T[]>;
8
+ /**
9
+ * Add toArray method to an AsyncIterable
10
+ */
11
+ export declare function withToArray<T>(iterable: AsyncIterable<T>): AsyncIterable<T> & {
12
+ toArray: () => Promise<T[]>;
13
+ };
14
+ //# sourceMappingURL=query-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-helpers.d.ts","sourceRoot":"","sources":["../../../src/operations/query/query-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAMzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC5B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,aAAa,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;CAAE,CAIpD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Helper functions for working with query results
3
+ */
4
+ /**
5
+ * Collect all results from an AsyncIterable into an array
6
+ */
7
+ export async function toArray(iterable) {
8
+ const results = [];
9
+ for await (const item of iterable) {
10
+ results.push(item);
11
+ }
12
+ return results;
13
+ }
14
+ /**
15
+ * Add toArray method to an AsyncIterable
16
+ */
17
+ export function withToArray(iterable) {
18
+ return Object.assign(iterable, {
19
+ toArray: () => toArray(iterable),
20
+ });
21
+ }
22
+ //# sourceMappingURL=query-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-helpers.js","sourceRoot":"","sources":["../../../src/operations/query/query-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,QAA0B;IAC1D,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAC1B,QAA0B;IAE1B,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;KAChC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,142 @@
1
+ import { Stream } from "effect";
2
+ import type { ComputedFieldsConfig, WithComputed } from "../../types/computed-types.js";
3
+ /**
4
+ * Resolve computed fields for a single entity.
5
+ *
6
+ * Iterates over the computed config, calling each derivation function with the entity,
7
+ * and returns a new object with the original entity fields plus computed field values.
8
+ *
9
+ * @template T - The entity type (stored fields, possibly with populated relationships)
10
+ * @template C - The computed fields config type
11
+ *
12
+ * @param entity - The entity to resolve computed fields for
13
+ * @param config - The computed fields configuration (field name → derivation function)
14
+ * @returns A new object with entity fields plus computed fields attached
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const book = { id: "1", title: "Dune", year: 1965 }
19
+ * const config = {
20
+ * displayName: (b) => `${b.title} (${b.year})`,
21
+ * isClassic: (b) => b.year < 1980,
22
+ * }
23
+ * const result = resolveComputedFields(book, config)
24
+ * // { id: "1", title: "Dune", year: 1965, displayName: "Dune (1965)", isClassic: true }
25
+ * ```
26
+ */
27
+ export declare const resolveComputedFields: <T extends Record<string, unknown>, C extends ComputedFieldsConfig<T>>(entity: T, config: C) => WithComputed<T, C>;
28
+ /**
29
+ * Apply computed field resolution as a Stream combinator.
30
+ * Returns a function that transforms Stream<T> → Stream<WithComputed<T, C>>,
31
+ * mapping the resolution function over each entity.
32
+ *
33
+ * When the config is undefined or has no keys, returns the stream unchanged
34
+ * (no resolution overhead).
35
+ *
36
+ * @template T - The entity type (stored fields, possibly with populated relationships)
37
+ * @template C - The computed fields config type
38
+ *
39
+ * @param config - The computed fields configuration (field name → derivation function), or undefined
40
+ * @returns A stream combinator function
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const config = {
45
+ * displayName: (b) => `${b.title} (${b.year})`,
46
+ * isClassic: (b) => b.year < 1980,
47
+ * }
48
+ * const enrichedStream = stream.pipe(resolveComputedStream(config))
49
+ * // Each entity in the resulting stream has displayName and isClassic attached
50
+ * ```
51
+ */
52
+ export declare const resolveComputedStream: <T extends Record<string, unknown>, C extends ComputedFieldsConfig<T>>(config: C | undefined) => <E, R>(stream: Stream.Stream<T, E, R>) => Stream.Stream<WithComputed<T, C>, E, R>;
53
+ /**
54
+ * Strip computed field keys from an entity object.
55
+ * Used as a safety net before persistence to ensure computed fields
56
+ * are never written to storage.
57
+ *
58
+ * @template T - The original entity type (stored fields only)
59
+ * @template C - The computed fields config type
60
+ *
61
+ * @param entity - The entity (possibly with computed fields attached)
62
+ * @param config - The computed fields configuration that defines which keys to strip
63
+ * @returns A new object with only stored fields (computed fields removed)
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const entityWithComputed = {
68
+ * id: "1",
69
+ * title: "Dune",
70
+ * year: 1965,
71
+ * displayName: "Dune (1965)", // computed
72
+ * isClassic: true, // computed
73
+ * }
74
+ * const config = {
75
+ * displayName: (b) => `${b.title} (${b.year})`,
76
+ * isClassic: (b) => b.year < 1980,
77
+ * }
78
+ * const stored = stripComputedFields(entityWithComputed, config)
79
+ * // { id: "1", title: "Dune", year: 1965 }
80
+ * ```
81
+ */
82
+ export declare const stripComputedFields: <T extends Record<string, unknown>, C extends ComputedFieldsConfig<T>>(entity: Record<string, unknown>, config: C | undefined) => T;
83
+ /**
84
+ * Check if any computed fields are selected based on the select configuration.
85
+ *
86
+ * @param computedConfig - The computed fields configuration
87
+ * @param select - The select configuration (object with true values for selected fields)
88
+ * @returns true if any computed field is selected (or select is undefined meaning all fields)
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const computedConfig = {
93
+ * displayName: (b) => `${b.title} (${b.year})`,
94
+ * isClassic: (b) => b.year < 1980,
95
+ * }
96
+ *
97
+ * // No select = all fields including computed
98
+ * hasSelectedComputedFields(computedConfig, undefined) // true
99
+ *
100
+ * // Select includes computed field
101
+ * hasSelectedComputedFields(computedConfig, { title: true, displayName: true }) // true
102
+ *
103
+ * // Select excludes all computed fields
104
+ * hasSelectedComputedFields(computedConfig, { title: true, year: true }) // false
105
+ * ```
106
+ */
107
+ export declare const hasSelectedComputedFields: (computedConfig: ComputedFieldsConfig<Record<string, unknown>> | undefined, select: Record<string, unknown> | undefined) => boolean;
108
+ /**
109
+ * Apply computed field resolution with lazy skip optimization.
110
+ *
111
+ * When `select` is provided and has no intersection with computed field keys,
112
+ * bypasses resolution entirely by returning the stream unchanged. This avoids
113
+ * unnecessary computation when only stored fields are needed.
114
+ *
115
+ * @template T - The entity type (stored fields, possibly with populated relationships)
116
+ * @template C - The computed fields config type
117
+ *
118
+ * @param config - The computed fields configuration (field name → derivation function), or undefined
119
+ * @param select - The select configuration (object with true values for selected fields), or undefined
120
+ * @returns A stream combinator function
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * const config = {
125
+ * displayName: (b) => `${b.title} (${b.year})`,
126
+ * isClassic: (b) => b.year < 1980,
127
+ * }
128
+ *
129
+ * // When select includes computed fields, resolution is applied
130
+ * const enrichedStream = stream.pipe(
131
+ * resolveComputedStreamWithLazySkip(config, { title: true, displayName: true })
132
+ * )
133
+ *
134
+ * // When select excludes all computed fields, resolution is skipped
135
+ * const storedOnlyStream = stream.pipe(
136
+ * resolveComputedStreamWithLazySkip(config, { title: true, year: true })
137
+ * )
138
+ * // → stream returned unchanged, no resolution overhead
139
+ * ```
140
+ */
141
+ export declare const resolveComputedStreamWithLazySkip: <T extends Record<string, unknown>, C extends ComputedFieldsConfig<T>>(config: C | undefined, select: Record<string, unknown> | undefined) => <E, R>(stream: Stream.Stream<T, E, R>) => Stream.Stream<WithComputed<T, C>, E, R>;
142
+ //# sourceMappingURL=resolve-computed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-computed.d.ts","sourceRoot":"","sources":["../../../src/operations/query/resolve-computed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EACX,oBAAoB,EACpB,YAAY,EACZ,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,qBAAqB,GACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAEjC,QAAQ,CAAC,EACT,QAAQ,CAAC,KACP,YAAY,CAAC,CAAC,EAAE,CAAC,CAWnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,qBAAqB,GAChC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EACpE,QAAQ,CAAC,GAAG,SAAS,MAErB,CAAC,EAAE,CAAC,EACJ,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CASxC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,mBAAmB,GAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAEjC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,CAAC,GAAG,SAAS,KACnB,CAgBF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,yBAAyB,GACrC,gBAAgB,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,EACzE,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KACzC,OAyBF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,iCAAiC,GAC5C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EACpE,QAAQ,CAAC,GAAG,SAAS,EACrB,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,MAE3C,CAAC,EAAE,CAAC,EACJ,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAmBxC,CAAC"}