@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,395 @@
1
+ /**
2
+ * Effect-based delete operations with relationship cascade support.
3
+ *
4
+ * Uses Ref<ReadonlyMap> for atomic state mutation and typed errors.
5
+ * Supports cascade, restrict, set_null, cascade_soft, and preserve
6
+ * cascade options for relationship handling during deletion.
7
+ */
8
+ import { Effect, PubSub, Ref } from "effect";
9
+ import { NotFoundError, ValidationError, } from "../../errors/crud-errors.js";
10
+ // ============================================================================
11
+ // Helpers
12
+ // ============================================================================
13
+ const getTargetCollection = (rel) => rel.target || rel.__targetCollection;
14
+ /**
15
+ * Find the foreign key field name in the target collection that references
16
+ * back to the source collection.
17
+ */
18
+ const findForeignKey = (relationship, field, sourceCollection, targetConfig) => {
19
+ if (relationship.type === "inverse") {
20
+ if (!targetConfig)
21
+ return null;
22
+ for (const [targetField, targetRel] of Object.entries(targetConfig.relationships)) {
23
+ const target = getTargetCollection(targetRel);
24
+ if (target === sourceCollection && targetRel.type === "ref") {
25
+ return targetRel.foreignKey || `${targetField}Id`;
26
+ }
27
+ }
28
+ return null;
29
+ }
30
+ // For ref relationships
31
+ return relationship.foreignKey || `${field}Id`;
32
+ };
33
+ /**
34
+ * Find all entities in a target collection that reference the given entity ID
35
+ * via the specified foreign key.
36
+ */
37
+ const findRelatedEntities = (entityId, foreignKey, targetRef) => Ref.get(targetRef).pipe(Effect.map((targetMap) => {
38
+ const related = [];
39
+ for (const entity of targetMap.values()) {
40
+ if (entity[foreignKey] === entityId) {
41
+ related.push(entity);
42
+ }
43
+ }
44
+ return related;
45
+ }));
46
+ /**
47
+ * Cascade delete (hard or soft) related entities in a target collection.
48
+ */
49
+ const cascadeDeleteEntities = (entities, targetRef, soft) => {
50
+ const entityIds = new Set(entities.map((e) => e.id));
51
+ const now = new Date().toISOString();
52
+ if (soft) {
53
+ return Ref.update(targetRef, (map) => {
54
+ const next = new Map(map);
55
+ for (const id of entityIds) {
56
+ const entity = next.get(id);
57
+ if (entity) {
58
+ next.set(id, {
59
+ ...entity,
60
+ deletedAt: now,
61
+ updatedAt: now,
62
+ });
63
+ }
64
+ }
65
+ return next;
66
+ }).pipe(Effect.map(() => ({
67
+ count: entityIds.size,
68
+ ids: [...entityIds],
69
+ })));
70
+ }
71
+ return Ref.update(targetRef, (map) => {
72
+ const next = new Map(map);
73
+ for (const id of entityIds) {
74
+ next.delete(id);
75
+ }
76
+ return next;
77
+ }).pipe(Effect.map(() => ({
78
+ count: entityIds.size,
79
+ ids: [...entityIds],
80
+ })));
81
+ };
82
+ /**
83
+ * Set foreign keys to null for related entities in a target collection.
84
+ */
85
+ const setForeignKeysToNull = (entities, foreignKey, targetRef) => {
86
+ const entityIds = new Set(entities.map((e) => e.id));
87
+ const now = new Date().toISOString();
88
+ return Ref.update(targetRef, (map) => {
89
+ const next = new Map(map);
90
+ for (const id of entityIds) {
91
+ const entity = next.get(id);
92
+ if (entity) {
93
+ next.set(id, {
94
+ ...entity,
95
+ [foreignKey]: null,
96
+ updatedAt: now,
97
+ });
98
+ }
99
+ }
100
+ return next;
101
+ });
102
+ };
103
+ /**
104
+ * Check if entity supports soft delete (has deletedAt field or can have it added).
105
+ */
106
+ const hasSoftDelete = (entity) => typeof entity === "object" && entity !== null;
107
+ // ============================================================================
108
+ // Process Cascade Options for a Single Entity
109
+ // ============================================================================
110
+ /**
111
+ * Process all relationship cascade options for a single entity being deleted.
112
+ * Returns restrict violations and cascade results.
113
+ */
114
+ const processRelationshipCascades = (entityId, collectionName, relationships, stateRefs, dbConfig, options) => Effect.gen(function* () {
115
+ const restrictViolations = [];
116
+ const cascadeResults = {};
117
+ for (const [field, relationship] of Object.entries(relationships)) {
118
+ const targetCollection = getTargetCollection(relationship);
119
+ if (!targetCollection)
120
+ continue;
121
+ const targetConfig = dbConfig[targetCollection];
122
+ const foreignKey = findForeignKey(relationship, field, collectionName, targetConfig);
123
+ if (!foreignKey)
124
+ continue;
125
+ const targetRef = stateRefs[targetCollection];
126
+ if (!targetRef)
127
+ continue;
128
+ const cascadeOption = options?.include?.[field] || "preserve";
129
+ const relatedEntities = yield* findRelatedEntities(entityId, foreignKey, targetRef);
130
+ if (relatedEntities.length === 0)
131
+ continue;
132
+ switch (cascadeOption) {
133
+ case "restrict":
134
+ restrictViolations.push({
135
+ collection: collectionName,
136
+ relatedCollection: targetCollection,
137
+ relatedCount: relatedEntities.length,
138
+ message: `Cannot delete ${collectionName} with ID ${entityId} because it has ${relatedEntities.length} related ${targetCollection} entities`,
139
+ });
140
+ break;
141
+ case "cascade": {
142
+ const result = yield* cascadeDeleteEntities(relatedEntities, targetRef, options?.soft || false);
143
+ if (!cascadeResults[targetCollection]) {
144
+ cascadeResults[targetCollection] = { count: 0, ids: [] };
145
+ }
146
+ cascadeResults[targetCollection].count += result.count;
147
+ cascadeResults[targetCollection].ids.push(...result.ids);
148
+ break;
149
+ }
150
+ case "cascade_soft": {
151
+ const result = yield* cascadeDeleteEntities(relatedEntities, targetRef, true);
152
+ if (!cascadeResults[targetCollection]) {
153
+ cascadeResults[targetCollection] = { count: 0, ids: [] };
154
+ }
155
+ cascadeResults[targetCollection].count += result.count;
156
+ cascadeResults[targetCollection].ids.push(...result.ids);
157
+ break;
158
+ }
159
+ case "set_null":
160
+ yield* setForeignKeysToNull(relatedEntities, foreignKey, targetRef);
161
+ break;
162
+ default:
163
+ break;
164
+ }
165
+ }
166
+ return { restrictViolations, cascadeResults };
167
+ });
168
+ // ============================================================================
169
+ // Delete with Relationships (single entity)
170
+ // ============================================================================
171
+ /**
172
+ * Delete a single entity with relationship cascade support.
173
+ *
174
+ * Steps:
175
+ * 1. Look up entity by ID in Ref state (O(1))
176
+ * 2. Process relationship cascades (restrict, cascade, set_null, etc.)
177
+ * 3. Fail if any restrict violations exist
178
+ * 4. Perform the delete (soft or hard)
179
+ * 5. Return deleted entity with cascade information
180
+ */
181
+ export const deleteWithRelationships = (collectionName, relationships, ref, stateRefs, dbConfig, changePubSub) => (id, options) => Effect.gen(function* () {
182
+ // 1. Look up entity
183
+ const currentMap = yield* Ref.get(ref);
184
+ const entity = currentMap.get(id);
185
+ if (entity === undefined) {
186
+ return yield* Effect.fail(new NotFoundError({
187
+ collection: collectionName,
188
+ id,
189
+ message: `Entity '${id}' not found in collection '${collectionName}'`,
190
+ }));
191
+ }
192
+ // 2. Process relationship cascades
193
+ const { restrictViolations, cascadeResults } = yield* processRelationshipCascades(id, collectionName, relationships, stateRefs, dbConfig, options);
194
+ // 3. Check for restrict violations
195
+ if (restrictViolations.length > 0) {
196
+ return yield* Effect.fail(new ValidationError({
197
+ message: restrictViolations.map((v) => v.message).join("; "),
198
+ issues: restrictViolations.map((v) => ({
199
+ field: "relationships",
200
+ message: v.message,
201
+ })),
202
+ }));
203
+ }
204
+ // 4. Perform the delete
205
+ let deletedEntity;
206
+ if (options?.soft && hasSoftDelete(entity)) {
207
+ const now = new Date().toISOString();
208
+ const softDeleted = {
209
+ ...entity,
210
+ deletedAt: now,
211
+ updatedAt: now,
212
+ };
213
+ yield* Ref.update(ref, (map) => {
214
+ const next = new Map(map);
215
+ next.set(id, softDeleted);
216
+ return next;
217
+ });
218
+ deletedEntity = softDeleted;
219
+ }
220
+ else {
221
+ yield* Ref.update(ref, (map) => {
222
+ const next = new Map(map);
223
+ next.delete(id);
224
+ return next;
225
+ });
226
+ deletedEntity = entity;
227
+ }
228
+ // 5. Publish change event for reactive query subscribers
229
+ if (changePubSub) {
230
+ yield* PubSub.publish(changePubSub, {
231
+ collection: collectionName,
232
+ operation: "delete",
233
+ });
234
+ }
235
+ // 6. Return result
236
+ const result = {
237
+ deleted: deletedEntity,
238
+ ...(Object.keys(cascadeResults).length > 0
239
+ ? { cascaded: cascadeResults }
240
+ : {}),
241
+ };
242
+ return result;
243
+ });
244
+ // ============================================================================
245
+ // Delete Many with Relationships
246
+ // ============================================================================
247
+ /**
248
+ * Delete multiple entities matching a predicate with relationship cascade support.
249
+ *
250
+ * Steps:
251
+ * 1. Find all matching entities using predicate
252
+ * 2. Apply limit if specified
253
+ * 3. Check all restrict violations first (fail-fast)
254
+ * 4. Process cascade operations for all entities
255
+ * 5. Perform the deletes (soft or hard)
256
+ * 6. Return count, deleted entities, and cascade information
257
+ */
258
+ export const deleteManyWithRelationships = (collectionName, relationships, ref, stateRefs, dbConfig, changePubSub) => (predicate, options) => Effect.gen(function* () {
259
+ // 1. Find matching entities
260
+ const currentMap = yield* Ref.get(ref);
261
+ let matchingEntities = [];
262
+ for (const entity of currentMap.values()) {
263
+ if (predicate(entity)) {
264
+ matchingEntities.push(entity);
265
+ }
266
+ }
267
+ // 2. Apply limit
268
+ if (options?.limit !== undefined && options.limit > 0) {
269
+ matchingEntities = matchingEntities.slice(0, options.limit);
270
+ }
271
+ if (matchingEntities.length === 0) {
272
+ return { count: 0, deleted: [] };
273
+ }
274
+ // 3. Check restrict violations for ALL entities first
275
+ const allRestrictViolations = [];
276
+ for (const entity of matchingEntities) {
277
+ for (const [field, relationship] of Object.entries(relationships)) {
278
+ const targetCollection = getTargetCollection(relationship);
279
+ if (!targetCollection)
280
+ continue;
281
+ const targetConfig = dbConfig[targetCollection];
282
+ const foreignKey = findForeignKey(relationship, field, collectionName, targetConfig);
283
+ if (!foreignKey)
284
+ continue;
285
+ const targetRef = stateRefs[targetCollection];
286
+ if (!targetRef)
287
+ continue;
288
+ const cascadeOption = options?.include?.[field] || "preserve";
289
+ if (cascadeOption !== "restrict")
290
+ continue;
291
+ const relatedEntities = yield* findRelatedEntities(entity.id, foreignKey, targetRef);
292
+ if (relatedEntities.length > 0) {
293
+ allRestrictViolations.push({
294
+ collection: collectionName,
295
+ relatedCollection: targetCollection,
296
+ relatedCount: relatedEntities.length,
297
+ message: `Cannot delete ${collectionName} with ID ${entity.id} because it has ${relatedEntities.length} related ${targetCollection} entities`,
298
+ });
299
+ }
300
+ }
301
+ }
302
+ if (allRestrictViolations.length > 0) {
303
+ return yield* Effect.fail(new ValidationError({
304
+ message: allRestrictViolations.map((v) => v.message).join("; "),
305
+ issues: allRestrictViolations.map((v) => ({
306
+ field: "relationships",
307
+ message: v.message,
308
+ })),
309
+ }));
310
+ }
311
+ // 4. Process cascade operations for all entities
312
+ const allCascadeResults = {};
313
+ for (const entity of matchingEntities) {
314
+ for (const [field, relationship] of Object.entries(relationships)) {
315
+ const targetCollection = getTargetCollection(relationship);
316
+ if (!targetCollection)
317
+ continue;
318
+ const targetConfig = dbConfig[targetCollection];
319
+ const foreignKey = findForeignKey(relationship, field, collectionName, targetConfig);
320
+ if (!foreignKey)
321
+ continue;
322
+ const targetRef = stateRefs[targetCollection];
323
+ if (!targetRef)
324
+ continue;
325
+ const cascadeOption = options?.include?.[field] || "preserve";
326
+ const relatedEntities = yield* findRelatedEntities(entity.id, foreignKey, targetRef);
327
+ if (relatedEntities.length === 0)
328
+ continue;
329
+ switch (cascadeOption) {
330
+ case "cascade":
331
+ case "cascade_soft": {
332
+ const result = yield* cascadeDeleteEntities(relatedEntities, targetRef, cascadeOption === "cascade_soft" || options?.soft || false);
333
+ if (!allCascadeResults[targetCollection]) {
334
+ allCascadeResults[targetCollection] = { count: 0, ids: [] };
335
+ }
336
+ allCascadeResults[targetCollection].count += result.count;
337
+ allCascadeResults[targetCollection].ids.push(...result.ids);
338
+ break;
339
+ }
340
+ case "set_null":
341
+ yield* setForeignKeysToNull(relatedEntities, foreignKey, targetRef);
342
+ break;
343
+ }
344
+ }
345
+ }
346
+ // 5. Perform the deletes
347
+ const deletedEntities = [];
348
+ const now = new Date().toISOString();
349
+ if (options?.soft) {
350
+ const updatedMap = new Map();
351
+ for (const entity of matchingEntities) {
352
+ const softDeleted = {
353
+ ...entity,
354
+ deletedAt: now,
355
+ updatedAt: now,
356
+ };
357
+ updatedMap.set(entity.id, softDeleted);
358
+ deletedEntities.push(softDeleted);
359
+ }
360
+ yield* Ref.update(ref, (map) => {
361
+ const next = new Map(map);
362
+ for (const [id, entity] of updatedMap) {
363
+ next.set(id, entity);
364
+ }
365
+ return next;
366
+ });
367
+ }
368
+ else {
369
+ deletedEntities.push(...matchingEntities);
370
+ const deletedIds = new Set(matchingEntities.map((e) => e.id));
371
+ yield* Ref.update(ref, (map) => {
372
+ const next = new Map(map);
373
+ for (const id of deletedIds) {
374
+ next.delete(id);
375
+ }
376
+ return next;
377
+ });
378
+ }
379
+ // 6. Publish change event for reactive query subscribers
380
+ if (changePubSub && deletedEntities.length > 0) {
381
+ yield* PubSub.publish(changePubSub, {
382
+ collection: collectionName,
383
+ operation: "delete",
384
+ });
385
+ }
386
+ // 7. Return result
387
+ return {
388
+ count: deletedEntities.length,
389
+ deleted: deletedEntities,
390
+ ...(Object.keys(allCascadeResults).length > 0
391
+ ? { cascaded: allCascadeResults }
392
+ : {}),
393
+ };
394
+ });
395
+ //# sourceMappingURL=delete-with-relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-with-relationships.js","sourceRoot":"","sources":["../../../src/operations/crud/delete-with-relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Effect-based delete operations for entities.
3
+ *
4
+ * Uses Ref<ReadonlyMap> for atomic state mutation and typed errors
5
+ * (NotFoundError, OperationError, ForeignKeyError).
6
+ *
7
+ * Preserves soft delete support, foreign key constraint checking,
8
+ * and cascade handling from the legacy implementation.
9
+ */
10
+ import { Effect, PubSub, Ref } from "effect";
11
+ import { type ForeignKeyError, type HookError, NotFoundError, OperationError } from "../../errors/crud-errors.js";
12
+ import type { DeleteManyResult } from "../../types/crud-types.js";
13
+ import type { HooksConfig } from "../../types/hook-types.js";
14
+ import type { CollectionIndexes } from "../../types/index-types.js";
15
+ import type { ChangeEvent } from "../../types/reactive-types.js";
16
+ import type { SearchIndexMap } from "../../types/search-types.js";
17
+ type HasId = {
18
+ readonly id: string;
19
+ };
20
+ type RelationshipConfig = {
21
+ readonly type: "ref" | "inverse";
22
+ readonly target: string;
23
+ readonly foreignKey?: string;
24
+ };
25
+ type DeleteOptions = {
26
+ readonly soft?: boolean;
27
+ };
28
+ type DeleteManyOptions = {
29
+ readonly soft?: boolean;
30
+ readonly limit?: number;
31
+ };
32
+ /**
33
+ * Delete a single entity by ID with optional soft delete.
34
+ *
35
+ * Steps:
36
+ * 1. Look up entity by ID in Ref state (O(1))
37
+ * 2. Run beforeDelete hooks (can reject)
38
+ * 3. If soft delete requested, verify entity has deletedAt field
39
+ * 4. Check foreign key constraints across all collections
40
+ * 5. Soft delete: update entity with deletedAt timestamp
41
+ * Hard delete: remove entity from Ref state
42
+ */
43
+ export declare const del: <T extends HasId>(collectionName: string, allRelationships: Record<string, Record<string, RelationshipConfig>>, ref: Ref.Ref<ReadonlyMap<string, T>>, stateRefs: Record<string, Ref.Ref<ReadonlyMap<string, HasId>>>, supportsSoftDelete?: boolean, indexes?: CollectionIndexes, hooks?: HooksConfig<T>, searchIndexRef?: Ref.Ref<SearchIndexMap>, searchIndexFields?: ReadonlyArray<string>, changePubSub?: PubSub.PubSub<ChangeEvent>) => (id: string, options?: DeleteOptions) => Effect.Effect<T, NotFoundError | OperationError | ForeignKeyError | HookError>;
44
+ /**
45
+ * Delete multiple entities matching a predicate with optional soft delete.
46
+ *
47
+ * Uses a predicate function to select which entities to delete.
48
+ * The caller (database factory) can use the Stream-based filter pipeline
49
+ * to build the predicate from a WhereClause.
50
+ *
51
+ * Runs hooks per entity: beforeDelete can reject deletion,
52
+ * afterDelete and onChange run after state mutation.
53
+ *
54
+ * All matching entities are deleted atomically in a single Ref.update call.
55
+ */
56
+ export declare const deleteMany: <T extends HasId>(collectionName: string, allRelationships: Record<string, Record<string, RelationshipConfig>>, ref: Ref.Ref<ReadonlyMap<string, T>>, stateRefs: Record<string, Ref.Ref<ReadonlyMap<string, HasId>>>, supportsSoftDelete?: boolean, indexes?: CollectionIndexes, hooks?: HooksConfig<T>, searchIndexRef?: Ref.Ref<SearchIndexMap>, searchIndexFields?: ReadonlyArray<string>, changePubSub?: PubSub.PubSub<ChangeEvent>) => (predicate: (entity: T) => boolean, options?: DeleteManyOptions) => Effect.Effect<DeleteManyResult<T>, OperationError | ForeignKeyError | HookError>;
57
+ export {};
58
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/operations/crud/delete.ts"],"names":[],"mappings":"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"}