@forestadmin/agent-client 1.4.21 → 1.4.22
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/dist/query-serializer.d.ts +21 -0
- package/dist/query-serializer.js +45 -3
- package/package.json +1 -1
|
@@ -2,7 +2,28 @@ import type { SelectOptions } from './types';
|
|
|
2
2
|
export default class QuerySerializer {
|
|
3
3
|
static serialize(query: SelectOptions, collectionName: string): Record<string, unknown>;
|
|
4
4
|
private static formatSort;
|
|
5
|
+
/**
|
|
6
|
+
* Serialize filters to JSON with snake_case operators and aggregators.
|
|
7
|
+
*
|
|
8
|
+
* Internally, operators use PascalCase (e.g. `Equal`, `GreaterThan`) to match
|
|
9
|
+
* the datasource-toolkit convention. However, HTTP backends expect snake_case:
|
|
10
|
+
* - Ruby (forest_liana): requires `equal`, `greater_than`, etc.
|
|
11
|
+
* - Node (@forestadmin/agent): accepts snake_case via ConditionTreeParser.toPascalCase()
|
|
12
|
+
*
|
|
13
|
+
* Converting to snake_case here ensures compatibility with both backends.
|
|
14
|
+
*/
|
|
5
15
|
private static formatFilters;
|
|
16
|
+
/**
|
|
17
|
+
* Recursively walk the condition tree and convert operators/aggregators to snake_case.
|
|
18
|
+
*/
|
|
19
|
+
private static toSnakeCaseOperators;
|
|
20
|
+
/**
|
|
21
|
+
* Convert PascalCase to snake_case.
|
|
22
|
+
* Two passes handle different patterns:
|
|
23
|
+
* - Pass 1: lowercase→uppercase boundaries (e.g. `greaterThan` → `greater_Than`)
|
|
24
|
+
* - Pass 2: uppercase sequences (e.g. `IContains` → `I_Contains`, `PreviousXDays` → `PreviousX_Days`)
|
|
25
|
+
*/
|
|
26
|
+
private static toSnakeCase;
|
|
6
27
|
private static formatFields;
|
|
7
28
|
}
|
|
8
29
|
//# sourceMappingURL=query-serializer.d.ts.map
|
package/dist/query-serializer.js
CHANGED
|
@@ -10,7 +10,6 @@ class QuerySerializer {
|
|
|
10
10
|
return {};
|
|
11
11
|
return {
|
|
12
12
|
...query,
|
|
13
|
-
...query.filters,
|
|
14
13
|
sort: QuerySerializer.formatSort(query.sort),
|
|
15
14
|
filters: QuerySerializer.formatFilters(query.filters),
|
|
16
15
|
searchExtended: !!query.shouldSearchInRelation,
|
|
@@ -24,10 +23,53 @@ class QuerySerializer {
|
|
|
24
23
|
return undefined;
|
|
25
24
|
return sort.ascending ? sort.field : `-${sort.field}`;
|
|
26
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Serialize filters to JSON with snake_case operators and aggregators.
|
|
28
|
+
*
|
|
29
|
+
* Internally, operators use PascalCase (e.g. `Equal`, `GreaterThan`) to match
|
|
30
|
+
* the datasource-toolkit convention. However, HTTP backends expect snake_case:
|
|
31
|
+
* - Ruby (forest_liana): requires `equal`, `greater_than`, etc.
|
|
32
|
+
* - Node (@forestadmin/agent): accepts snake_case via ConditionTreeParser.toPascalCase()
|
|
33
|
+
*
|
|
34
|
+
* Converting to snake_case here ensures compatibility with both backends.
|
|
35
|
+
*/
|
|
27
36
|
static formatFilters(filters) {
|
|
28
37
|
if (!filters)
|
|
29
38
|
return undefined;
|
|
30
|
-
return JSON.stringify(filters);
|
|
39
|
+
return JSON.stringify(QuerySerializer.toSnakeCaseOperators(filters));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Recursively walk the condition tree and convert operators/aggregators to snake_case.
|
|
43
|
+
*/
|
|
44
|
+
static toSnakeCaseOperators(node) {
|
|
45
|
+
if (!node || typeof node !== 'object')
|
|
46
|
+
return node;
|
|
47
|
+
const obj = node;
|
|
48
|
+
if ('operator' in obj) {
|
|
49
|
+
return {
|
|
50
|
+
...obj,
|
|
51
|
+
operator: QuerySerializer.toSnakeCase(obj.operator),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if ('aggregator' in obj && Array.isArray(obj.conditions)) {
|
|
55
|
+
return {
|
|
56
|
+
aggregator: obj.aggregator.toLowerCase(),
|
|
57
|
+
conditions: obj.conditions.map(c => QuerySerializer.toSnakeCaseOperators(c)),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return obj;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convert PascalCase to snake_case.
|
|
64
|
+
* Two passes handle different patterns:
|
|
65
|
+
* - Pass 1: lowercase→uppercase boundaries (e.g. `greaterThan` → `greater_Than`)
|
|
66
|
+
* - Pass 2: uppercase sequences (e.g. `IContains` → `I_Contains`, `PreviousXDays` → `PreviousX_Days`)
|
|
67
|
+
*/
|
|
68
|
+
static toSnakeCase(value) {
|
|
69
|
+
return value
|
|
70
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
71
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')
|
|
72
|
+
.toLowerCase();
|
|
31
73
|
}
|
|
32
74
|
static formatFields(collectionName, fields) {
|
|
33
75
|
if (!fields)
|
|
@@ -74,4 +116,4 @@ class QuerySerializer {
|
|
|
74
116
|
}
|
|
75
117
|
}
|
|
76
118
|
exports.default = QuerySerializer;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWVyeS1zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esc0VBQTZDO0FBRTdDLE1BQXFCLGVBQWU7SUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFvQixFQUFFLGNBQXNCO1FBQzNELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdEIsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLElBQUksRUFBRSxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDNUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNyRCxjQUFjLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7WUFDOUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSTtZQUNwQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNO1lBQ3hDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDNUYsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQXFCO1FBQzdDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFxQztRQUNoRSxJQUFJLENB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
|