@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,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"}
|