@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.
- package/LICENSE +21 -0
- package/dist/errors/crud-errors.d.ts +98 -0
- package/dist/errors/crud-errors.d.ts.map +1 -0
- package/dist/errors/crud-errors.js +23 -0
- package/dist/errors/crud-errors.js.map +1 -0
- package/dist/errors/index.d.ts +16 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +12 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/migration-errors.d.ts +22 -0
- package/dist/errors/migration-errors.d.ts.map +1 -0
- package/dist/errors/migration-errors.js +14 -0
- package/dist/errors/migration-errors.js.map +1 -0
- package/dist/errors/plugin-errors.d.ts +15 -0
- package/dist/errors/plugin-errors.d.ts.map +1 -0
- package/dist/errors/plugin-errors.js +11 -0
- package/dist/errors/plugin-errors.js.map +1 -0
- package/dist/errors/query-errors.d.ts +31 -0
- package/dist/errors/query-errors.d.ts.map +1 -0
- package/dist/errors/query-errors.js +11 -0
- package/dist/errors/query-errors.js.map +1 -0
- package/dist/errors/storage-errors.d.ts +30 -0
- package/dist/errors/storage-errors.d.ts.map +1 -0
- package/dist/errors/storage-errors.js +11 -0
- package/dist/errors/storage-errors.js.map +1 -0
- package/dist/factories/crud-factory-with-relationships.d.ts +28 -0
- package/dist/factories/crud-factory-with-relationships.d.ts.map +1 -0
- package/dist/factories/crud-factory-with-relationships.js +8 -0
- package/dist/factories/crud-factory-with-relationships.js.map +1 -0
- package/dist/factories/crud-factory.d.ts +25 -0
- package/dist/factories/crud-factory.d.ts.map +1 -0
- package/dist/factories/crud-factory.js +8 -0
- package/dist/factories/crud-factory.js.map +1 -0
- package/dist/factories/database-effect.d.ts +241 -0
- package/dist/factories/database-effect.d.ts.map +1 -0
- package/dist/factories/database-effect.js +859 -0
- package/dist/factories/database-effect.js.map +1 -0
- package/dist/hooks/hook-runner.d.ts +60 -0
- package/dist/hooks/hook-runner.d.ts.map +1 -0
- package/dist/hooks/hook-runner.js +107 -0
- package/dist/hooks/hook-runner.js.map +1 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +110 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/index-lookup.d.ts +33 -0
- package/dist/indexes/index-lookup.d.ts.map +1 -0
- package/dist/indexes/index-lookup.js +180 -0
- package/dist/indexes/index-lookup.js.map +1 -0
- package/dist/indexes/index-manager.d.ts +118 -0
- package/dist/indexes/index-manager.d.ts.map +1 -0
- package/dist/indexes/index-manager.js +345 -0
- package/dist/indexes/index-manager.js.map +1 -0
- package/dist/indexes/search-index.d.ts +179 -0
- package/dist/indexes/search-index.d.ts.map +1 -0
- package/dist/indexes/search-index.js +405 -0
- package/dist/indexes/search-index.js.map +1 -0
- package/dist/migrations/migration-runner.d.ts +70 -0
- package/dist/migrations/migration-runner.d.ts.map +1 -0
- package/dist/migrations/migration-runner.js +271 -0
- package/dist/migrations/migration-runner.js.map +1 -0
- package/dist/migrations/migration-types.d.ts +63 -0
- package/dist/migrations/migration-types.d.ts.map +1 -0
- package/dist/migrations/migration-types.js +5 -0
- package/dist/migrations/migration-types.js.map +1 -0
- package/dist/operations/crud/create-with-relationships.d.ts +44 -0
- package/dist/operations/crud/create-with-relationships.d.ts.map +1 -0
- package/dist/operations/crud/create-with-relationships.js +483 -0
- package/dist/operations/crud/create-with-relationships.js.map +1 -0
- package/dist/operations/crud/create.d.ts +48 -0
- package/dist/operations/crud/create.d.ts.map +1 -0
- package/dist/operations/crud/create.js +333 -0
- package/dist/operations/crud/create.js.map +1 -0
- package/dist/operations/crud/delete-with-relationships.d.ts +63 -0
- package/dist/operations/crud/delete-with-relationships.d.ts.map +1 -0
- package/dist/operations/crud/delete-with-relationships.js +395 -0
- package/dist/operations/crud/delete-with-relationships.js.map +1 -0
- package/dist/operations/crud/delete.d.ts +58 -0
- package/dist/operations/crud/delete.d.ts.map +1 -0
- package/dist/operations/crud/delete.js +267 -0
- package/dist/operations/crud/delete.js.map +1 -0
- package/dist/operations/crud/unique-check.d.ts +114 -0
- package/dist/operations/crud/unique-check.d.ts.map +1 -0
- package/dist/operations/crud/unique-check.js +383 -0
- package/dist/operations/crud/unique-check.js.map +1 -0
- package/dist/operations/crud/update-with-relationships.d.ts +45 -0
- package/dist/operations/crud/update-with-relationships.d.ts.map +1 -0
- package/dist/operations/crud/update-with-relationships.js +516 -0
- package/dist/operations/crud/update-with-relationships.js.map +1 -0
- package/dist/operations/crud/update.d.ts +91 -0
- package/dist/operations/crud/update.d.ts.map +1 -0
- package/dist/operations/crud/update.js +505 -0
- package/dist/operations/crud/update.js.map +1 -0
- package/dist/operations/crud/upsert.d.ts +52 -0
- package/dist/operations/crud/upsert.d.ts.map +1 -0
- package/dist/operations/crud/upsert.js +386 -0
- package/dist/operations/crud/upsert.js.map +1 -0
- package/dist/operations/query/aggregate.d.ts +30 -0
- package/dist/operations/query/aggregate.d.ts.map +1 -0
- package/dist/operations/query/aggregate.js +227 -0
- package/dist/operations/query/aggregate.js.map +1 -0
- package/dist/operations/query/cursor-stream.d.ts +18 -0
- package/dist/operations/query/cursor-stream.d.ts.map +1 -0
- package/dist/operations/query/cursor-stream.js +199 -0
- package/dist/operations/query/cursor-stream.js.map +1 -0
- package/dist/operations/query/filter-stream.d.ts +12 -0
- package/dist/operations/query/filter-stream.d.ts.map +1 -0
- package/dist/operations/query/filter-stream.js +167 -0
- package/dist/operations/query/filter-stream.js.map +1 -0
- package/dist/operations/query/filter.d.ts +13 -0
- package/dist/operations/query/filter.d.ts.map +1 -0
- package/dist/operations/query/filter.js +267 -0
- package/dist/operations/query/filter.js.map +1 -0
- package/dist/operations/query/paginate-stream.d.ts +11 -0
- package/dist/operations/query/paginate-stream.d.ts.map +1 -0
- package/dist/operations/query/paginate-stream.js +22 -0
- package/dist/operations/query/paginate-stream.js.map +1 -0
- package/dist/operations/query/query-helpers.d.ts +14 -0
- package/dist/operations/query/query-helpers.d.ts.map +1 -0
- package/dist/operations/query/query-helpers.js +22 -0
- package/dist/operations/query/query-helpers.js.map +1 -0
- package/dist/operations/query/resolve-computed.d.ts +142 -0
- package/dist/operations/query/resolve-computed.d.ts.map +1 -0
- package/dist/operations/query/resolve-computed.js +197 -0
- package/dist/operations/query/resolve-computed.js.map +1 -0
- package/dist/operations/query/search.d.ts +110 -0
- package/dist/operations/query/search.d.ts.map +1 -0
- package/dist/operations/query/search.js +188 -0
- package/dist/operations/query/search.js.map +1 -0
- package/dist/operations/query/select-stream.d.ts +27 -0
- package/dist/operations/query/select-stream.d.ts.map +1 -0
- package/dist/operations/query/select-stream.js +88 -0
- package/dist/operations/query/select-stream.js.map +1 -0
- package/dist/operations/query/select.d.ts +54 -0
- package/dist/operations/query/select.d.ts.map +1 -0
- package/dist/operations/query/select.js +159 -0
- package/dist/operations/query/select.js.map +1 -0
- package/dist/operations/query/sort-stream.d.ts +46 -0
- package/dist/operations/query/sort-stream.d.ts.map +1 -0
- package/dist/operations/query/sort-stream.js +158 -0
- package/dist/operations/query/sort-stream.js.map +1 -0
- package/dist/operations/query/sort.d.ts +9 -0
- package/dist/operations/query/sort.d.ts.map +1 -0
- package/dist/operations/query/sort.js +58 -0
- package/dist/operations/query/sort.js.map +1 -0
- package/dist/operations/relationships/populate-stream.d.ts +29 -0
- package/dist/operations/relationships/populate-stream.d.ts.map +1 -0
- package/dist/operations/relationships/populate-stream.js +159 -0
- package/dist/operations/relationships/populate-stream.js.map +1 -0
- package/dist/operations/relationships/populate.d.ts +15 -0
- package/dist/operations/relationships/populate.d.ts.map +1 -0
- package/dist/operations/relationships/populate.js +228 -0
- package/dist/operations/relationships/populate.js.map +1 -0
- package/dist/plugins/plugin-hooks.d.ts +25 -0
- package/dist/plugins/plugin-hooks.d.ts.map +1 -0
- package/dist/plugins/plugin-hooks.js +64 -0
- package/dist/plugins/plugin-hooks.js.map +1 -0
- package/dist/plugins/plugin-registry.d.ts +26 -0
- package/dist/plugins/plugin-registry.d.ts.map +1 -0
- package/dist/plugins/plugin-registry.js +150 -0
- package/dist/plugins/plugin-registry.js.map +1 -0
- package/dist/plugins/plugin-types.d.ts +95 -0
- package/dist/plugins/plugin-types.d.ts.map +1 -0
- package/dist/plugins/plugin-types.js +6 -0
- package/dist/plugins/plugin-types.js.map +1 -0
- package/dist/plugins/plugin-validation.d.ts +49 -0
- package/dist/plugins/plugin-validation.d.ts.map +1 -0
- package/dist/plugins/plugin-validation.js +295 -0
- package/dist/plugins/plugin-validation.js.map +1 -0
- package/dist/reactive/change-event.d.ts +44 -0
- package/dist/reactive/change-event.d.ts.map +1 -0
- package/dist/reactive/change-event.js +49 -0
- package/dist/reactive/change-event.js.map +1 -0
- package/dist/reactive/change-pubsub.d.ts +32 -0
- package/dist/reactive/change-pubsub.d.ts.map +1 -0
- package/dist/reactive/change-pubsub.js +31 -0
- package/dist/reactive/change-pubsub.js.map +1 -0
- package/dist/reactive/evaluate-query.d.ts +62 -0
- package/dist/reactive/evaluate-query.d.ts.map +1 -0
- package/dist/reactive/evaluate-query.js +57 -0
- package/dist/reactive/evaluate-query.js.map +1 -0
- package/dist/reactive/watch-by-id.d.ts +53 -0
- package/dist/reactive/watch-by-id.d.ts.map +1 -0
- package/dist/reactive/watch-by-id.js +55 -0
- package/dist/reactive/watch-by-id.js.map +1 -0
- package/dist/reactive/watch.d.ts +78 -0
- package/dist/reactive/watch.d.ts.map +1 -0
- package/dist/reactive/watch.js +133 -0
- package/dist/reactive/watch.js.map +1 -0
- package/dist/serializers/codecs/hjson.d.ts +33 -0
- package/dist/serializers/codecs/hjson.d.ts.map +1 -0
- package/dist/serializers/codecs/hjson.js +40 -0
- package/dist/serializers/codecs/hjson.js.map +1 -0
- package/dist/serializers/codecs/json.d.ts +22 -0
- package/dist/serializers/codecs/json.d.ts.map +1 -0
- package/dist/serializers/codecs/json.js +28 -0
- package/dist/serializers/codecs/json.js.map +1 -0
- package/dist/serializers/codecs/json5.d.ts +26 -0
- package/dist/serializers/codecs/json5.d.ts.map +1 -0
- package/dist/serializers/codecs/json5.js +33 -0
- package/dist/serializers/codecs/json5.js.map +1 -0
- package/dist/serializers/codecs/jsonc.d.ts +29 -0
- package/dist/serializers/codecs/jsonc.d.ts.map +1 -0
- package/dist/serializers/codecs/jsonc.js +38 -0
- package/dist/serializers/codecs/jsonc.js.map +1 -0
- package/dist/serializers/codecs/jsonl.d.ts +17 -0
- package/dist/serializers/codecs/jsonl.d.ts.map +1 -0
- package/dist/serializers/codecs/jsonl.js +31 -0
- package/dist/serializers/codecs/jsonl.js.map +1 -0
- package/dist/serializers/codecs/prose.d.ts +419 -0
- package/dist/serializers/codecs/prose.d.ts.map +1 -0
- package/dist/serializers/codecs/prose.js +1060 -0
- package/dist/serializers/codecs/prose.js.map +1 -0
- package/dist/serializers/codecs/toml.d.ts +23 -0
- package/dist/serializers/codecs/toml.d.ts.map +1 -0
- package/dist/serializers/codecs/toml.js +66 -0
- package/dist/serializers/codecs/toml.js.map +1 -0
- package/dist/serializers/codecs/toon.d.ts +20 -0
- package/dist/serializers/codecs/toon.d.ts.map +1 -0
- package/dist/serializers/codecs/toon.js +33 -0
- package/dist/serializers/codecs/toon.js.map +1 -0
- package/dist/serializers/codecs/yaml.d.ts +24 -0
- package/dist/serializers/codecs/yaml.d.ts.map +1 -0
- package/dist/serializers/codecs/yaml.js +31 -0
- package/dist/serializers/codecs/yaml.js.map +1 -0
- package/dist/serializers/format-codec.d.ts +53 -0
- package/dist/serializers/format-codec.d.ts.map +1 -0
- package/dist/serializers/format-codec.js +148 -0
- package/dist/serializers/format-codec.js.map +1 -0
- package/dist/serializers/presets.d.ts +48 -0
- package/dist/serializers/presets.d.ts.map +1 -0
- package/dist/serializers/presets.js +72 -0
- package/dist/serializers/presets.js.map +1 -0
- package/dist/serializers/serializer-service.d.ts +11 -0
- package/dist/serializers/serializer-service.d.ts.map +1 -0
- package/dist/serializers/serializer-service.js +4 -0
- package/dist/serializers/serializer-service.js.map +1 -0
- package/dist/state/collection-state.d.ts +19 -0
- package/dist/state/collection-state.d.ts.map +1 -0
- package/dist/state/collection-state.js +15 -0
- package/dist/state/collection-state.js.map +1 -0
- package/dist/state/state-operations.d.ts +38 -0
- package/dist/state/state-operations.d.ts.map +1 -0
- package/dist/state/state-operations.js +65 -0
- package/dist/state/state-operations.js.map +1 -0
- package/dist/storage/in-memory-adapter-layer.d.ts +16 -0
- package/dist/storage/in-memory-adapter-layer.d.ts.map +1 -0
- package/dist/storage/in-memory-adapter-layer.js +81 -0
- package/dist/storage/in-memory-adapter-layer.js.map +1 -0
- package/dist/storage/persistence-effect.d.ts +244 -0
- package/dist/storage/persistence-effect.d.ts.map +1 -0
- package/dist/storage/persistence-effect.js +551 -0
- package/dist/storage/persistence-effect.js.map +1 -0
- package/dist/storage/storage-service.d.ts +22 -0
- package/dist/storage/storage-service.d.ts.map +1 -0
- package/dist/storage/storage-service.js +4 -0
- package/dist/storage/storage-service.js.map +1 -0
- package/dist/storage/transforms.d.ts +183 -0
- package/dist/storage/transforms.d.ts.map +1 -0
- package/dist/storage/transforms.js +263 -0
- package/dist/storage/transforms.js.map +1 -0
- package/dist/transactions/transaction.d.ts +87 -0
- package/dist/transactions/transaction.d.ts.map +1 -0
- package/dist/transactions/transaction.js +240 -0
- package/dist/transactions/transaction.js.map +1 -0
- package/dist/types/aggregate-types.d.ts +73 -0
- package/dist/types/aggregate-types.d.ts.map +1 -0
- package/dist/types/aggregate-types.js +14 -0
- package/dist/types/aggregate-types.js.map +1 -0
- package/dist/types/computed-types.d.ts +71 -0
- package/dist/types/computed-types.d.ts.map +1 -0
- package/dist/types/computed-types.js +8 -0
- package/dist/types/computed-types.js.map +1 -0
- package/dist/types/crud-relationship-types.d.ts +180 -0
- package/dist/types/crud-relationship-types.d.ts.map +1 -0
- package/dist/types/crud-relationship-types.js +17 -0
- package/dist/types/crud-relationship-types.js.map +1 -0
- package/dist/types/crud-types.d.ts +343 -0
- package/dist/types/crud-types.d.ts.map +1 -0
- package/dist/types/crud-types.js +43 -0
- package/dist/types/crud-types.js.map +1 -0
- package/dist/types/cursor-types.d.ts +52 -0
- package/dist/types/cursor-types.d.ts.map +1 -0
- package/dist/types/cursor-types.js +2 -0
- package/dist/types/cursor-types.js.map +1 -0
- package/dist/types/database-config-types.d.ts +196 -0
- package/dist/types/database-config-types.d.ts.map +1 -0
- package/dist/types/database-config-types.js +11 -0
- package/dist/types/database-config-types.js.map +1 -0
- package/dist/types/hook-types.d.ts +158 -0
- package/dist/types/hook-types.d.ts.map +1 -0
- package/dist/types/hook-types.js +6 -0
- package/dist/types/hook-types.js.map +1 -0
- package/dist/types/index-types.d.ts +42 -0
- package/dist/types/index-types.d.ts.map +1 -0
- package/dist/types/index-types.js +8 -0
- package/dist/types/index-types.js.map +1 -0
- package/dist/types/operators.d.ts +5 -0
- package/dist/types/operators.d.ts.map +1 -0
- package/dist/types/operators.js +297 -0
- package/dist/types/operators.js.map +1 -0
- package/dist/types/query-overloads.d.ts +54 -0
- package/dist/types/query-overloads.d.ts.map +1 -0
- package/dist/types/query-overloads.js +3 -0
- package/dist/types/query-overloads.js.map +1 -0
- package/dist/types/reactive-types.d.ts +75 -0
- package/dist/types/reactive-types.d.ts.map +1 -0
- package/dist/types/reactive-types.js +7 -0
- package/dist/types/reactive-types.js.map +1 -0
- package/dist/types/schema-types.d.ts +56 -0
- package/dist/types/schema-types.d.ts.map +1 -0
- package/dist/types/schema-types.js +8 -0
- package/dist/types/schema-types.js.map +1 -0
- package/dist/types/search-types.d.ts +82 -0
- package/dist/types/search-types.d.ts.map +1 -0
- package/dist/types/search-types.js +110 -0
- package/dist/types/search-types.js.map +1 -0
- package/dist/types/types.d.ts +286 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/id-generator.d.ts +97 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +247 -0
- package/dist/utils/id-generator.js.map +1 -0
- package/dist/utils/nested-path.d.ts +56 -0
- package/dist/utils/nested-path.d.ts.map +1 -0
- package/dist/utils/nested-path.js +119 -0
- package/dist/utils/nested-path.js.map +1 -0
- package/dist/utils/path.d.ts +16 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +24 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/validators/foreign-key.d.ts +49 -0
- package/dist/validators/foreign-key.d.ts.map +1 -0
- package/dist/validators/foreign-key.js +153 -0
- package/dist/validators/foreign-key.js.map +1 -0
- package/dist/validators/schema-validator.d.ts +19 -0
- package/dist/validators/schema-validator.d.ts.map +1 -0
- package/dist/validators/schema-validator.js +34 -0
- package/dist/validators/schema-validator.js.map +1 -0
- 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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"}
|