@forestadmin-experimental/datasource-cosmos 1.0.0 → 1.0.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model-builder/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,WAAW;IACvB,IAAI,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAS;IAE7B;;OAEG;IACH,OAAO,CAAC,aAAa,CAAS;IAE9B;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAS;IAEjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAe;IAE7B;;OAEG;IACH,OAAO,CAAC,YAAY,CAAe;IAEnC;;OAEG;IACH,OAAO,CAAC,SAAS,CAAY;IAEtB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAE9C,WAAW,CAAC,EAAE,OAAO,CAAC;gBAG3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,YAAY,EACpB,qBAAqB,CAAC,EAAE,qBAAqB,EAC7C,WAAW,CAAC,EAAE,OAAO;IAcV,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model-builder/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,WAAW;IACvB,IAAI,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAS;IAE7B;;OAEG;IACH,OAAO,CAAC,aAAa,CAAS;IAE9B;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAS;IAEjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAe;IAE7B;;OAEG;IACH,OAAO,CAAC,YAAY,CAAe;IAEnC;;OAEG;IACH,OAAO,CAAC,SAAS,CAAY;IAEtB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAE9C,WAAW,CAAC,EAAE,OAAO,CAAC;gBAG3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,YAAY,EACpB,qBAAqB,CAAC,EAAE,qBAAqB,EAC7C,WAAW,CAAC,EAAE,OAAO;IAcV,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgCjD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAapC,KAAK,CAChB,SAAS,EAAE,YAAY,EACvB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,EAAE,CAAC;IAsBX,cAAc,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAM9D,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB7D;;OAEG;YACW,aAAa;IAgB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACI,aAAa,IAAI,YAAY;IAIpC;;OAEG;IACI,YAAY,IAAI,SAAS;IAIhC;;OAEG;IACI,mBAAmB,IAAI,MAAM;IAIpC;;OAEG;IACI,eAAe,IAAI,MAAM;IAIhC;;OAEG;IACI,gBAAgB,IAAI,MAAM;CAGlC"}
|
|
@@ -28,13 +28,16 @@ class ModelCosmos {
|
|
|
28
28
|
// In production, you might want to use stored procedures or batch operations
|
|
29
29
|
// eslint-disable-next-line no-restricted-syntax
|
|
30
30
|
for (const record of data) {
|
|
31
|
+
// Unflatten the record to restore nested structure for Cosmos DB
|
|
32
|
+
const unflattenedRecord = serializer_1.default.unflatten(record);
|
|
31
33
|
// Ensure the record has an id field (required by Cosmos DB)
|
|
32
34
|
const itemToCreate = {
|
|
33
|
-
id:
|
|
34
|
-
...
|
|
35
|
+
id: unflattenedRecord.id || this.generateId(),
|
|
36
|
+
...unflattenedRecord,
|
|
35
37
|
};
|
|
36
38
|
// eslint-disable-next-line no-await-in-loop
|
|
37
39
|
const { resource } = await this.container.items.create(itemToCreate);
|
|
40
|
+
// Flatten and serialize the response
|
|
38
41
|
createdRecords.push(serializer_1.default.serialize(resource));
|
|
39
42
|
}
|
|
40
43
|
return createdRecords;
|
|
@@ -43,13 +46,15 @@ class ModelCosmos {
|
|
|
43
46
|
// Cosmos DB requires both id and partition key for updates
|
|
44
47
|
// We need to fetch the items first to get their partition keys
|
|
45
48
|
const itemsToUpdate = await this.getItemsByIds(ids);
|
|
49
|
+
// Unflatten the patch to restore nested structure for Cosmos DB
|
|
50
|
+
const unflattenedPatch = serializer_1.default.unflatten(patch);
|
|
46
51
|
// eslint-disable-next-line no-restricted-syntax
|
|
47
52
|
for (const item of itemsToUpdate) {
|
|
48
53
|
const partitionKeyValue = this.getPartitionKeyValue(item);
|
|
49
|
-
// Merge the patch with the existing item
|
|
54
|
+
// Merge the unflattened patch with the existing item
|
|
50
55
|
const updatedItem = {
|
|
51
56
|
...item,
|
|
52
|
-
...
|
|
57
|
+
...unflattenedPatch,
|
|
53
58
|
};
|
|
54
59
|
// eslint-disable-next-line no-await-in-loop
|
|
55
60
|
await this.container.item(item.id, partitionKeyValue).replace(updatedItem);
|
|
@@ -173,4 +178,4 @@ class ModelCosmos {
|
|
|
173
178
|
}
|
|
174
179
|
}
|
|
175
180
|
exports.default = ModelCosmos;
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwtYnVpbGRlci9tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUtBLHFFQUE2QztBQVU3QyxNQUFxQixXQUFXO0lBcUM5QixZQUNFLFlBQTBCLEVBQzFCLElBQVksRUFDWixZQUFvQixFQUNwQixhQUFxQixFQUNyQixnQkFBd0IsRUFDeEIsTUFBb0IsRUFDcEIscUJBQTZDLEVBQzdDLFdBQXFCO1FBRXJCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDbkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFFL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBa0I7UUFDcEMsTUFBTSxjQUFjLEdBQWlCLEVBQUUsQ0FBQztRQUV4Qyx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3ZCLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FB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
|
|
@@ -16,7 +16,7 @@ class AggregationConverter {
|
|
|
16
16
|
// Handle simple aggregation without grouping
|
|
17
17
|
if (!aggregation.groups || aggregation.groups.length === 0) {
|
|
18
18
|
const selectClause = this.buildAggregateExpression(aggregation);
|
|
19
|
-
const query = `SELECT ${selectClause} as
|
|
19
|
+
const query = `SELECT ${selectClause} as aggregateValue FROM c ${whereFragment}`;
|
|
20
20
|
return { query, parameters };
|
|
21
21
|
}
|
|
22
22
|
// Handle aggregation with grouping
|
|
@@ -51,7 +51,7 @@ class AggregationConverter {
|
|
|
51
51
|
// For Count operation without field, we need a different approach
|
|
52
52
|
if (aggregation.operation === 'Count' && !aggregation.field) {
|
|
53
53
|
const query = `
|
|
54
|
-
SELECT ${groupField} as groupKey, COUNT(1) as
|
|
54
|
+
SELECT ${groupField} as groupKey, COUNT(1) as aggregateValue
|
|
55
55
|
FROM c
|
|
56
56
|
${whereFragment}
|
|
57
57
|
GROUP BY ${groupField}
|
|
@@ -64,7 +64,7 @@ class AggregationConverter {
|
|
|
64
64
|
}
|
|
65
65
|
// For other aggregations
|
|
66
66
|
const query = `
|
|
67
|
-
SELECT ${groupField} as groupKey, ${aggregateExpr} as
|
|
67
|
+
SELECT ${groupField} as groupKey, ${aggregateExpr} as aggregateValue
|
|
68
68
|
FROM c
|
|
69
69
|
${whereFragment}
|
|
70
70
|
GROUP BY ${groupField}
|
|
@@ -115,7 +115,7 @@ class AggregationConverter {
|
|
|
115
115
|
}
|
|
116
116
|
return [
|
|
117
117
|
{
|
|
118
|
-
value: serializer_1.default.serializeValue(rawResults[0].value),
|
|
118
|
+
value: serializer_1.default.serializeValue(rawResults[0].aggregateValue ?? rawResults[0].value),
|
|
119
119
|
group: {},
|
|
120
120
|
},
|
|
121
121
|
];
|
|
@@ -131,7 +131,7 @@ class AggregationConverter {
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
return {
|
|
134
|
-
value: serializer_1.default.serializeValue(result.value),
|
|
134
|
+
value: serializer_1.default.serializeValue(result.aggregateValue ?? result.value),
|
|
135
135
|
group,
|
|
136
136
|
};
|
|
137
137
|
});
|
|
@@ -149,15 +149,15 @@ class AggregationConverter {
|
|
|
149
149
|
if (!field) {
|
|
150
150
|
// COUNT(*) case
|
|
151
151
|
selectClause = groupByField
|
|
152
|
-
? `c.${groupByField} as groupKey, COUNT(1) as
|
|
153
|
-
: 'COUNT(1) as
|
|
152
|
+
? `c.${groupByField} as groupKey, COUNT(1) as aggregateValue`
|
|
153
|
+
: 'COUNT(1) as aggregateValue';
|
|
154
154
|
}
|
|
155
155
|
else {
|
|
156
156
|
const op = this.AGGREGATION_OPERATION[operation];
|
|
157
157
|
const fieldPath = `c.${field}`;
|
|
158
158
|
selectClause = groupByField
|
|
159
|
-
? `c.${groupByField} as groupKey, ${op}(${fieldPath}) as
|
|
160
|
-
: `${op}(${fieldPath}) as
|
|
159
|
+
? `c.${groupByField} as groupKey, ${op}(${fieldPath}) as aggregateValue`
|
|
160
|
+
: `${op}(${fieldPath}) as aggregateValue`;
|
|
161
161
|
}
|
|
162
162
|
if (groupByField) {
|
|
163
163
|
groupByClause = `GROUP BY c.${groupByField}`;
|
|
@@ -178,4 +178,4 @@ AggregationConverter.AGGREGATION_OPERATION = {
|
|
|
178
178
|
Min: 'MIN',
|
|
179
179
|
};
|
|
180
180
|
exports.default = AggregationConverter;
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FnZ3JlZ2F0aW9uLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVNBLHdFQUErQztBQUMvQyw4REFBc0M7QUFFdEMsTUFBcUIsb0JBQW9CO0lBU3ZDOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixXQUF3QixFQUN4QixhQUE2QixFQUM3QixLQUFjO1FBRWQsTUFBTSxjQUFjLEdBQUcsSUFBSSx5QkFBYyxFQUFFLENBQUM7UUFDNUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXBELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEUsTUFBTSxLQUFLLEdBQUcsVUFBVSxZQUFZLDZCQUE2QixhQUFhLEVBQUUsQ0FBQztZQUVqRixPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLHdCQUF3QixDQUFDLFdBQXdCO1FBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7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
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { RecordData } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
export default class Serializer {
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Serialize a record: convert dates and flatten nested objects if needed
|
|
5
|
+
* @param record The record to serialize
|
|
6
|
+
* @param shouldFlatten Whether to flatten nested objects (default: true)
|
|
7
|
+
*/
|
|
8
|
+
static serialize(record: RecordData, shouldFlatten?: boolean): RecordData;
|
|
9
|
+
/**
|
|
10
|
+
* Flatten nested objects into dot-notation fields and serialize values
|
|
11
|
+
* Example: {address: {city: "Paris"}} -> {"address.city": "Paris"}
|
|
12
|
+
*/
|
|
13
|
+
static flattenAndSerialize(record: RecordData): RecordData;
|
|
14
|
+
/**
|
|
15
|
+
* Serialize array values (handle dates in arrays)
|
|
16
|
+
*/
|
|
17
|
+
private static serializeArray;
|
|
18
|
+
/**
|
|
19
|
+
* Check if an object is a GeoJSON Point
|
|
20
|
+
*/
|
|
21
|
+
private static isGeoPoint;
|
|
22
|
+
/**
|
|
23
|
+
* Unflatten dot-notation fields back to nested objects
|
|
24
|
+
* Example: {"address.city": "Paris"} -> {address: {city: "Paris"}}
|
|
25
|
+
* Used when writing data back to Cosmos DB
|
|
26
|
+
*/
|
|
27
|
+
static unflatten(record: RecordData): RecordData;
|
|
4
28
|
static serializeValue(value: unknown): unknown;
|
|
5
29
|
}
|
|
6
30
|
//# sourceMappingURL=serializer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,UAAO,GAAG,UAAU;IAetE;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;IAoD1D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B;;OAEG;IAEH,OAAO,CAAC,MAAM,CAAC,UAAU;IAUzB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;IA8BhD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAY/C"}
|
package/dist/utils/serializer.js
CHANGED
|
@@ -1,24 +1,124 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
class Serializer {
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Serialize a record: convert dates and flatten nested objects if needed
|
|
6
|
+
* @param record The record to serialize
|
|
7
|
+
* @param shouldFlatten Whether to flatten nested objects (default: true)
|
|
8
|
+
*/
|
|
9
|
+
static serialize(record, shouldFlatten = true) {
|
|
10
|
+
if (shouldFlatten) {
|
|
11
|
+
return this.flattenAndSerialize(record);
|
|
12
|
+
}
|
|
13
|
+
// Legacy behavior: only serialize dates
|
|
5
14
|
Object.entries(record).forEach(([name, value]) => {
|
|
6
15
|
if (value instanceof Date)
|
|
7
16
|
record[name] = this.serializeValue(value);
|
|
8
17
|
if (Array.isArray(value))
|
|
9
18
|
this.serializeValue(value); // the change is by references
|
|
10
19
|
if (value instanceof Object)
|
|
11
|
-
return this.serialize(record[name]);
|
|
20
|
+
return this.serialize(record[name], false);
|
|
12
21
|
});
|
|
13
22
|
return record;
|
|
14
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Flatten nested objects into dot-notation fields and serialize values
|
|
26
|
+
* Example: {address: {city: "Paris"}} -> {"address.city": "Paris"}
|
|
27
|
+
*/
|
|
28
|
+
static flattenAndSerialize(record) {
|
|
29
|
+
const flattened = {};
|
|
30
|
+
const flatten = (obj, prefix = '') => {
|
|
31
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
32
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
33
|
+
// Handle null and undefined
|
|
34
|
+
if (value === null || value === undefined) {
|
|
35
|
+
flattened[fullKey] = value;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Serialize dates
|
|
39
|
+
if (value instanceof Date) {
|
|
40
|
+
flattened[fullKey] = value.toISOString();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Keep arrays as-is (Forest Admin handles arrays)
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
flattened[fullKey] = this.serializeArray(value);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Check for GeoJSON Point (special case)
|
|
49
|
+
if (this.isGeoPoint(value)) {
|
|
50
|
+
flattened[fullKey] = value;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Recursively flatten nested objects
|
|
54
|
+
if (typeof value === 'object' && value !== null) {
|
|
55
|
+
flatten(value, fullKey);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Primitive values
|
|
59
|
+
flattened[fullKey] = value;
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
flatten(record);
|
|
63
|
+
return flattened;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Serialize array values (handle dates in arrays)
|
|
67
|
+
*/
|
|
68
|
+
static serializeArray(arr) {
|
|
69
|
+
return arr.map(item => {
|
|
70
|
+
if (item instanceof Date) {
|
|
71
|
+
return item.toISOString();
|
|
72
|
+
}
|
|
73
|
+
return item;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if an object is a GeoJSON Point
|
|
78
|
+
*/
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
static isGeoPoint(value) {
|
|
81
|
+
return (value &&
|
|
82
|
+
typeof value === 'object' &&
|
|
83
|
+
value.type === 'Point' &&
|
|
84
|
+
Array.isArray(value.coordinates) &&
|
|
85
|
+
value.coordinates.length === 2);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Unflatten dot-notation fields back to nested objects
|
|
89
|
+
* Example: {"address.city": "Paris"} -> {address: {city: "Paris"}}
|
|
90
|
+
* Used when writing data back to Cosmos DB
|
|
91
|
+
*/
|
|
92
|
+
static unflatten(record) {
|
|
93
|
+
const result = {};
|
|
94
|
+
Object.entries(record).forEach(([key, value]) => {
|
|
95
|
+
const keys = key.split('.');
|
|
96
|
+
if (keys.length === 1) {
|
|
97
|
+
// No nesting, direct assignment
|
|
98
|
+
result[key] = value;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Nested field - reconstruct the object hierarchy
|
|
102
|
+
let current = result;
|
|
103
|
+
for (let i = 0; i < keys.length - 1; i += 1) {
|
|
104
|
+
const k = keys[i];
|
|
105
|
+
if (!current[k]) {
|
|
106
|
+
current[k] = {};
|
|
107
|
+
}
|
|
108
|
+
current = current[k];
|
|
109
|
+
}
|
|
110
|
+
current[keys[keys.length - 1]] = value;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
15
115
|
static serializeValue(value) {
|
|
16
116
|
if (value instanceof Date)
|
|
17
117
|
return value.toISOString();
|
|
18
118
|
if (Array.isArray(value)) {
|
|
19
119
|
value.forEach((v, i) => {
|
|
20
120
|
// serialize by reference to improve performances by avoiding the copies
|
|
21
|
-
if (
|
|
121
|
+
if (v instanceof Date)
|
|
22
122
|
value[i] = v.toISOString();
|
|
23
123
|
});
|
|
24
124
|
}
|
|
@@ -26,4 +126,4 @@ class Serializer {
|
|
|
26
126
|
}
|
|
27
127
|
}
|
|
28
128
|
exports.default = Serializer;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBcUIsVUFBVTtJQUM3Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFrQixFQUFFLGFBQWEsR0FBRyxJQUFJO1FBQ3ZELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxLQUFLLFlBQVksSUFBSTtnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7WUFDcEYsSUFBSSxLQUFLLFlBQVksTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFrQjtRQUMzQyxNQUFNLFNBQVMsR0FBZSxFQUFFLENBQUM7UUFFakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFO1lBQy9DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENB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
|