@cloudbase/database 0.9.20 → 0.9.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/esm/aggregate.d.ts +29 -0
- package/dist/esm/aggregate.js +154 -0
- package/dist/esm/collection.d.ts +9 -0
- package/dist/esm/collection.js +44 -0
- package/dist/esm/command.d.ts +175 -0
- package/dist/esm/command.js +296 -0
- package/dist/esm/commands/logic.d.ts +24 -0
- package/dist/esm/commands/logic.js +84 -0
- package/dist/esm/commands/query.d.ts +68 -0
- package/dist/esm/commands/query.js +152 -0
- package/dist/esm/commands/update.d.ts +29 -0
- package/dist/esm/commands/update.js +46 -0
- package/dist/esm/config/app.config.d.ts +6 -0
- package/dist/esm/config/app.config.js +5 -0
- package/dist/esm/config/error.config.d.ts +3 -0
- package/dist/esm/config/error.config.js +13 -0
- package/dist/esm/const/code.d.ts +30 -0
- package/dist/esm/const/code.js +30 -0
- package/dist/esm/constant.d.ts +51 -0
- package/dist/esm/constant.js +65 -0
- package/dist/esm/document.d.ts +11 -0
- package/dist/esm/document.js +247 -0
- package/dist/esm/geo/index.d.ts +6 -0
- package/dist/esm/geo/index.js +6 -0
- package/dist/esm/geo/interface.d.ts +24 -0
- package/dist/esm/geo/interface.js +0 -0
- package/dist/esm/geo/lineString.d.ts +19 -0
- package/dist/esm/geo/lineString.js +83 -0
- package/dist/esm/geo/multiLineString.d.ts +18 -0
- package/dist/esm/geo/multiLineString.js +92 -0
- package/dist/esm/geo/multiPoint.d.ts +18 -0
- package/dist/esm/geo/multiPoint.js +76 -0
- package/dist/esm/geo/multiPolygon.d.ts +18 -0
- package/dist/esm/geo/multiPolygon.js +119 -0
- package/dist/esm/geo/point.d.ts +19 -0
- package/dist/esm/geo/point.js +47 -0
- package/dist/esm/geo/polygon.d.ts +19 -0
- package/dist/esm/geo/polygon.js +106 -0
- package/dist/esm/helper/symbol.d.ts +14 -0
- package/dist/esm/helper/symbol.js +14 -0
- package/dist/esm/index.d.ts +33 -0
- package/dist/esm/index.js +41 -0
- package/dist/esm/lib/util.d.ts +1 -0
- package/dist/esm/lib/util.js +23 -0
- package/dist/esm/operator-map.d.ts +4 -0
- package/dist/esm/operator-map.js +20 -0
- package/dist/esm/query.d.ts +22 -0
- package/dist/esm/query.js +249 -0
- package/dist/esm/regexp/index.d.ts +14 -0
- package/dist/esm/regexp/index.js +29 -0
- package/dist/esm/serializer/common.d.ts +11 -0
- package/dist/esm/serializer/common.js +113 -0
- package/dist/esm/serializer/datatype.d.ts +7 -0
- package/dist/esm/serializer/datatype.js +122 -0
- package/dist/esm/serializer/query.d.ts +7 -0
- package/dist/esm/serializer/query.js +229 -0
- package/dist/esm/serializer/update.d.ts +15 -0
- package/dist/esm/serializer/update.js +139 -0
- package/dist/esm/serverDate/index.d.ts +13 -0
- package/dist/esm/serverDate/index.js +26 -0
- package/dist/esm/transaction/collection.d.ts +7 -0
- package/dist/esm/transaction/collection.js +44 -0
- package/dist/esm/transaction/document.d.ts +27 -0
- package/dist/esm/transaction/document.js +203 -0
- package/dist/esm/transaction/index.d.ts +30 -0
- package/dist/esm/transaction/index.js +210 -0
- package/dist/esm/transaction/query.d.ts +5 -0
- package/dist/esm/transaction/query.js +8 -0
- package/dist/esm/typings/index.d.ts +40 -0
- package/dist/esm/typings/index.js +0 -0
- package/dist/esm/typings/realtime.d.ts +219 -0
- package/dist/esm/typings/realtime.js +0 -0
- package/dist/esm/util.d.ts +9 -0
- package/dist/esm/util.js +142 -0
- package/dist/esm/utils/error.d.ts +37 -0
- package/dist/esm/utils/error.js +82 -0
- package/dist/esm/utils/msg.d.ts +0 -0
- package/dist/esm/utils/msg.js +0 -0
- package/dist/esm/utils/symbol.d.ts +8 -0
- package/dist/esm/utils/symbol.js +55 -0
- package/dist/esm/utils/type.d.ts +13 -0
- package/dist/esm/utils/type.js +20 -0
- package/dist/esm/utils/utils.d.ts +4 -0
- package/dist/esm/utils/utils.js +33 -0
- package/dist/esm/validate.d.ts +1 -0
- package/dist/esm/validate.js +57 -0
- package/package.json +4 -6
- package/src/transaction/document.ts +2 -2
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { QUERY_COMMANDS_LITERAL } from './commands/query';
|
|
2
|
+
import { LOGIC_COMMANDS_LITERAL } from './commands/logic';
|
|
3
|
+
import { UPDATE_COMMANDS_LITERAL } from './commands/update';
|
|
4
|
+
export var OperatorMap = {};
|
|
5
|
+
for (var key in QUERY_COMMANDS_LITERAL) {
|
|
6
|
+
OperatorMap[key] = '$' + key;
|
|
7
|
+
}
|
|
8
|
+
for (var key in LOGIC_COMMANDS_LITERAL) {
|
|
9
|
+
OperatorMap[key] = '$' + key;
|
|
10
|
+
}
|
|
11
|
+
for (var key in UPDATE_COMMANDS_LITERAL) {
|
|
12
|
+
OperatorMap[key] = '$' + key;
|
|
13
|
+
}
|
|
14
|
+
OperatorMap[QUERY_COMMANDS_LITERAL.NEQ] = '$ne';
|
|
15
|
+
OperatorMap[UPDATE_COMMANDS_LITERAL.REMOVE] = '$unset';
|
|
16
|
+
OperatorMap[UPDATE_COMMANDS_LITERAL.SHIFT] = '$pop';
|
|
17
|
+
OperatorMap[UPDATE_COMMANDS_LITERAL.UNSHIFT] = '$push';
|
|
18
|
+
export function operatorToString(operator) {
|
|
19
|
+
return OperatorMap[operator] || '$' + operator;
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { OrderByDirection } from './constant';
|
|
2
|
+
import { IWatchOptions, DBRealtimeListener } from './typings/index';
|
|
3
|
+
interface GetRes {
|
|
4
|
+
data: any[];
|
|
5
|
+
requestId: string;
|
|
6
|
+
total: number;
|
|
7
|
+
limit: number;
|
|
8
|
+
offset: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class Query {
|
|
11
|
+
get(callback?: any): Promise<GetRes>;
|
|
12
|
+
count(callback?: any): any;
|
|
13
|
+
where(query: object): Query;
|
|
14
|
+
orderBy(fieldPath: string, directionStr: OrderByDirection): Query;
|
|
15
|
+
limit(limit: number): Query;
|
|
16
|
+
skip(offset: number): Query;
|
|
17
|
+
update(data: Object, callback?: any): Promise<any>;
|
|
18
|
+
field(projection: any): Query;
|
|
19
|
+
remove(callback?: any): any;
|
|
20
|
+
watch: (options: IWatchOptions) => DBRealtimeListener;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import { createPromiseCallback } from './lib/util';
|
|
13
|
+
import { QueryType } from './constant';
|
|
14
|
+
import { Db } from './index';
|
|
15
|
+
import { Validate } from './validate';
|
|
16
|
+
import { Util } from './util';
|
|
17
|
+
import { QuerySerializer } from './serializer/query';
|
|
18
|
+
import { UpdateSerializer } from './serializer/update';
|
|
19
|
+
import { ErrorCode } from './constant';
|
|
20
|
+
import { getWsInstance } from './utils/utils';
|
|
21
|
+
var Query = (function () {
|
|
22
|
+
function Query(db, coll, fieldFilters, fieldOrders, queryOptions) {
|
|
23
|
+
var _this = this;
|
|
24
|
+
this.watch = function (options) {
|
|
25
|
+
var ws = getWsInstance(_this._db);
|
|
26
|
+
return ws.watch(__assign(__assign({}, options), { envId: _this._db.config.env, collectionName: _this._coll, query: JSON.stringify(_this._fieldFilters || {}), limit: _this._queryOptions.limit, orderBy: _this._fieldOrders
|
|
27
|
+
? _this._fieldOrders.reduce(function (acc, cur) {
|
|
28
|
+
acc[cur.field] = cur.direction;
|
|
29
|
+
return acc;
|
|
30
|
+
}, {})
|
|
31
|
+
: undefined }));
|
|
32
|
+
};
|
|
33
|
+
this._db = db;
|
|
34
|
+
this._coll = coll;
|
|
35
|
+
this._fieldFilters = fieldFilters;
|
|
36
|
+
this._fieldOrders = fieldOrders || [];
|
|
37
|
+
this._queryOptions = queryOptions || {};
|
|
38
|
+
this._request = new Db.reqClass(this._db.config);
|
|
39
|
+
}
|
|
40
|
+
Query.prototype.get = function (callback) {
|
|
41
|
+
callback = callback || createPromiseCallback();
|
|
42
|
+
var newOder = [];
|
|
43
|
+
if (this._fieldOrders) {
|
|
44
|
+
this._fieldOrders.forEach(function (order) {
|
|
45
|
+
newOder.push(order);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
var param = {
|
|
49
|
+
collectionName: this._coll,
|
|
50
|
+
queryType: QueryType.WHERE
|
|
51
|
+
};
|
|
52
|
+
if (this._fieldFilters) {
|
|
53
|
+
param.query = this._fieldFilters;
|
|
54
|
+
}
|
|
55
|
+
if (newOder.length > 0) {
|
|
56
|
+
param.order = newOder;
|
|
57
|
+
}
|
|
58
|
+
if (this._queryOptions.offset) {
|
|
59
|
+
param.offset = this._queryOptions.offset;
|
|
60
|
+
}
|
|
61
|
+
if (this._queryOptions.limit) {
|
|
62
|
+
param.limit = this._queryOptions.limit < 1000 ? this._queryOptions.limit : 1000;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
param.limit = 100;
|
|
66
|
+
}
|
|
67
|
+
if (this._queryOptions.projection) {
|
|
68
|
+
param.projection = this._queryOptions.projection;
|
|
69
|
+
}
|
|
70
|
+
this._request
|
|
71
|
+
.send('database.queryDocument', param)
|
|
72
|
+
.then(function (res) {
|
|
73
|
+
if (res.code) {
|
|
74
|
+
callback(0, res);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
var documents = Util.formatResDocumentData(res.data.list);
|
|
78
|
+
var result = {
|
|
79
|
+
data: documents,
|
|
80
|
+
requestId: res.requestId
|
|
81
|
+
};
|
|
82
|
+
if (res.total)
|
|
83
|
+
result.total = res.total;
|
|
84
|
+
if (res.limit)
|
|
85
|
+
result.limit = res.limit;
|
|
86
|
+
if (res.offset)
|
|
87
|
+
result.offset = res.offset;
|
|
88
|
+
callback(0, result);
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
.catch(function (err) {
|
|
92
|
+
callback(err);
|
|
93
|
+
});
|
|
94
|
+
return callback.promise;
|
|
95
|
+
};
|
|
96
|
+
Query.prototype.count = function (callback) {
|
|
97
|
+
callback = callback || createPromiseCallback();
|
|
98
|
+
var param = {
|
|
99
|
+
collectionName: this._coll,
|
|
100
|
+
queryType: QueryType.WHERE
|
|
101
|
+
};
|
|
102
|
+
if (this._fieldFilters) {
|
|
103
|
+
param.query = this._fieldFilters;
|
|
104
|
+
}
|
|
105
|
+
this._request
|
|
106
|
+
.send('database.countDocument', param)
|
|
107
|
+
.then(function (res) {
|
|
108
|
+
if (res.code) {
|
|
109
|
+
callback(0, res);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
callback(0, {
|
|
113
|
+
requestId: res.requestId,
|
|
114
|
+
total: res.data.total
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
.catch(function (e) {
|
|
119
|
+
callback(e);
|
|
120
|
+
});
|
|
121
|
+
return callback.promise;
|
|
122
|
+
};
|
|
123
|
+
Query.prototype.where = function (query) {
|
|
124
|
+
if (Object.prototype.toString.call(query).slice(8, -1) !== 'Object') {
|
|
125
|
+
throw Error(ErrorCode.QueryParamTypeError);
|
|
126
|
+
}
|
|
127
|
+
var keys = Object.keys(query);
|
|
128
|
+
var checkFlag = keys.some(function (item) {
|
|
129
|
+
return query[item] !== undefined;
|
|
130
|
+
});
|
|
131
|
+
if (keys.length && !checkFlag) {
|
|
132
|
+
throw Error(ErrorCode.QueryParamValueError);
|
|
133
|
+
}
|
|
134
|
+
return new Query(this._db, this._coll, QuerySerializer.encode(query), this._fieldOrders, this._queryOptions);
|
|
135
|
+
};
|
|
136
|
+
Query.prototype.orderBy = function (fieldPath, directionStr) {
|
|
137
|
+
Validate.isFieldPath(fieldPath);
|
|
138
|
+
Validate.isFieldOrder(directionStr);
|
|
139
|
+
var newOrder = {
|
|
140
|
+
field: fieldPath,
|
|
141
|
+
direction: directionStr
|
|
142
|
+
};
|
|
143
|
+
var combinedOrders = this._fieldOrders.concat(newOrder);
|
|
144
|
+
return new Query(this._db, this._coll, this._fieldFilters, combinedOrders, this._queryOptions);
|
|
145
|
+
};
|
|
146
|
+
Query.prototype.limit = function (limit) {
|
|
147
|
+
Validate.isInteger('limit', limit);
|
|
148
|
+
var option = __assign({}, this._queryOptions);
|
|
149
|
+
option.limit = limit;
|
|
150
|
+
return new Query(this._db, this._coll, this._fieldFilters, this._fieldOrders, option);
|
|
151
|
+
};
|
|
152
|
+
Query.prototype.skip = function (offset) {
|
|
153
|
+
Validate.isInteger('offset', offset);
|
|
154
|
+
var option = __assign({}, this._queryOptions);
|
|
155
|
+
option.offset = offset;
|
|
156
|
+
return new Query(this._db, this._coll, this._fieldFilters, this._fieldOrders, option);
|
|
157
|
+
};
|
|
158
|
+
Query.prototype.update = function (data, callback) {
|
|
159
|
+
callback = callback || createPromiseCallback();
|
|
160
|
+
if (!data || typeof data !== 'object') {
|
|
161
|
+
return Promise.resolve({
|
|
162
|
+
code: 'INVALID_PARAM',
|
|
163
|
+
message: '参数必需是非空对象'
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (data.hasOwnProperty('_id')) {
|
|
167
|
+
return Promise.resolve({
|
|
168
|
+
code: 'INVALID_PARAM',
|
|
169
|
+
message: '不能更新_id的值'
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
var param = {
|
|
173
|
+
collectionName: this._coll,
|
|
174
|
+
query: this._fieldFilters,
|
|
175
|
+
queryType: QueryType.WHERE,
|
|
176
|
+
multi: true,
|
|
177
|
+
merge: true,
|
|
178
|
+
upsert: false,
|
|
179
|
+
data: UpdateSerializer.encode(data)
|
|
180
|
+
};
|
|
181
|
+
this._request
|
|
182
|
+
.send('database.updateDocument', param)
|
|
183
|
+
.then(function (res) {
|
|
184
|
+
if (res.code) {
|
|
185
|
+
callback(0, res);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
callback(0, {
|
|
189
|
+
requestId: res.requestId,
|
|
190
|
+
updated: res.data.updated,
|
|
191
|
+
upsertId: res.data.upsert_id
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
})
|
|
195
|
+
.catch(function (e) {
|
|
196
|
+
callback(e);
|
|
197
|
+
});
|
|
198
|
+
return callback.promise;
|
|
199
|
+
};
|
|
200
|
+
Query.prototype.field = function (projection) {
|
|
201
|
+
for (var k in projection) {
|
|
202
|
+
if (projection[k]) {
|
|
203
|
+
if (typeof projection[k] !== 'object') {
|
|
204
|
+
projection[k] = 1;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
projection[k] = 0;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
var option = __assign({}, this._queryOptions);
|
|
212
|
+
option.projection = projection;
|
|
213
|
+
return new Query(this._db, this._coll, this._fieldFilters, this._fieldOrders, option);
|
|
214
|
+
};
|
|
215
|
+
Query.prototype.remove = function (callback) {
|
|
216
|
+
callback = callback || createPromiseCallback();
|
|
217
|
+
if (Object.keys(this._queryOptions).length > 0) {
|
|
218
|
+
console.warn('`offset`, `limit` and `projection` are not supported in remove() operation');
|
|
219
|
+
}
|
|
220
|
+
if (this._fieldOrders.length > 0) {
|
|
221
|
+
console.warn('`orderBy` is not supported in remove() operation');
|
|
222
|
+
}
|
|
223
|
+
var param = {
|
|
224
|
+
collectionName: this._coll,
|
|
225
|
+
query: QuerySerializer.encode(this._fieldFilters),
|
|
226
|
+
queryType: QueryType.WHERE,
|
|
227
|
+
multi: true
|
|
228
|
+
};
|
|
229
|
+
this._request
|
|
230
|
+
.send('database.deleteDocument', param)
|
|
231
|
+
.then(function (res) {
|
|
232
|
+
if (res.code) {
|
|
233
|
+
callback(0, res);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
callback(0, {
|
|
237
|
+
requestId: res.requestId,
|
|
238
|
+
deleted: res.data.deleted
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
})
|
|
242
|
+
.catch(function (e) {
|
|
243
|
+
callback(e);
|
|
244
|
+
});
|
|
245
|
+
return callback.promise;
|
|
246
|
+
};
|
|
247
|
+
return Query;
|
|
248
|
+
}());
|
|
249
|
+
export { Query };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class RegExp {
|
|
2
|
+
$regex: string;
|
|
3
|
+
$options: string;
|
|
4
|
+
constructor({ regexp, options }: {
|
|
5
|
+
regexp: any;
|
|
6
|
+
options: any;
|
|
7
|
+
});
|
|
8
|
+
parse(): {
|
|
9
|
+
$regex: string;
|
|
10
|
+
$options: string;
|
|
11
|
+
};
|
|
12
|
+
readonly _internalType: import("../utils/symbol").InternalSymbol;
|
|
13
|
+
}
|
|
14
|
+
export declare function RegExpConstructor(param: any): RegExp;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SYMBOL_REGEXP } from '../helper/symbol';
|
|
2
|
+
var RegExp = (function () {
|
|
3
|
+
function RegExp(_a) {
|
|
4
|
+
var regexp = _a.regexp, options = _a.options;
|
|
5
|
+
if (!regexp) {
|
|
6
|
+
throw new TypeError('regexp must be a string');
|
|
7
|
+
}
|
|
8
|
+
this.$regex = regexp;
|
|
9
|
+
this.$options = options;
|
|
10
|
+
}
|
|
11
|
+
RegExp.prototype.parse = function () {
|
|
12
|
+
return {
|
|
13
|
+
$regex: this.$regex,
|
|
14
|
+
$options: this.$options
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(RegExp.prototype, "_internalType", {
|
|
18
|
+
get: function () {
|
|
19
|
+
return SYMBOL_REGEXP;
|
|
20
|
+
},
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true
|
|
23
|
+
});
|
|
24
|
+
return RegExp;
|
|
25
|
+
}());
|
|
26
|
+
export { RegExp };
|
|
27
|
+
export function RegExpConstructor(param) {
|
|
28
|
+
return new RegExp(param);
|
|
29
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { LogicCommand } from '../commands/logic';
|
|
2
|
+
export declare type IQueryCondition = Record<string, any> | LogicCommand;
|
|
3
|
+
export declare type AnyObject = {
|
|
4
|
+
[x: string]: any;
|
|
5
|
+
};
|
|
6
|
+
export declare function flattenQueryObject(query: Record<string, any>): Record<string, any>;
|
|
7
|
+
export declare function flattenObject(object: AnyObject): AnyObject;
|
|
8
|
+
export declare function mergeConditionAfterEncode(query: Record<string, any>, condition: Record<string, any>, key: string): void;
|
|
9
|
+
export declare function isConversionRequired(val: any): boolean;
|
|
10
|
+
export declare function encodeInternalDataType(val: any): IQueryCondition;
|
|
11
|
+
export declare function decodeInternalDataType(object: AnyObject): any;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
13
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
|
+
if (!m) return o;
|
|
15
|
+
var i = m.call(o), r, ar = [], e;
|
|
16
|
+
try {
|
|
17
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
18
|
+
}
|
|
19
|
+
catch (error) { e = { error: error }; }
|
|
20
|
+
finally {
|
|
21
|
+
try {
|
|
22
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
23
|
+
}
|
|
24
|
+
finally { if (e) throw e.error; }
|
|
25
|
+
}
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
var __spread = (this && this.__spread) || function () {
|
|
29
|
+
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
import { getType, isObject, isArray, isDate, isRegExp, isInternalObject } from '../utils/type';
|
|
33
|
+
import { serialize as serializeInternalDataType, deserialize as deserializeInternalDataType } from './datatype';
|
|
34
|
+
function flatten(query, shouldPreserverObject, parents, visited) {
|
|
35
|
+
var cloned = __assign({}, query);
|
|
36
|
+
for (var key in query) {
|
|
37
|
+
if (/^\$/.test(key))
|
|
38
|
+
continue;
|
|
39
|
+
var value = query[key];
|
|
40
|
+
if (!value)
|
|
41
|
+
continue;
|
|
42
|
+
if (isObject(value) && !shouldPreserverObject(value)) {
|
|
43
|
+
if (visited.indexOf(value) > -1) {
|
|
44
|
+
throw new Error('Cannot convert circular structure to JSON');
|
|
45
|
+
}
|
|
46
|
+
var newParents = __spread(parents, [
|
|
47
|
+
key,
|
|
48
|
+
]);
|
|
49
|
+
var newVisited = __spread(visited, [
|
|
50
|
+
value,
|
|
51
|
+
]);
|
|
52
|
+
var flattenedChild = flatten(value, shouldPreserverObject, newParents, newVisited);
|
|
53
|
+
cloned[key] = flattenedChild;
|
|
54
|
+
var hasKeyNotCombined = false;
|
|
55
|
+
for (var childKey in flattenedChild) {
|
|
56
|
+
if (!/^\$/.test(childKey)) {
|
|
57
|
+
cloned[key + "." + childKey] = flattenedChild[childKey];
|
|
58
|
+
delete cloned[key][childKey];
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
hasKeyNotCombined = true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!hasKeyNotCombined) {
|
|
65
|
+
delete cloned[key];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return cloned;
|
|
70
|
+
}
|
|
71
|
+
export function flattenQueryObject(query) {
|
|
72
|
+
return flatten(query, isConversionRequired, [], [query]);
|
|
73
|
+
}
|
|
74
|
+
export function flattenObject(object) {
|
|
75
|
+
return flatten(object, function (_) { return false; }, [], [object]);
|
|
76
|
+
}
|
|
77
|
+
export function mergeConditionAfterEncode(query, condition, key) {
|
|
78
|
+
if (!condition[key]) {
|
|
79
|
+
delete query[key];
|
|
80
|
+
}
|
|
81
|
+
for (var conditionKey in condition) {
|
|
82
|
+
if (query[conditionKey]) {
|
|
83
|
+
if (isArray(query[conditionKey])) {
|
|
84
|
+
query[conditionKey].push(condition[conditionKey]);
|
|
85
|
+
}
|
|
86
|
+
else if (isObject(query[conditionKey])) {
|
|
87
|
+
if (isObject(condition[conditionKey])) {
|
|
88
|
+
Object.assign(query[conditionKey], condition[conditionKey]);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.warn("unmergable condition, query is object but condition is " + getType(condition) + ", can only overwrite", condition, key);
|
|
92
|
+
query[conditionKey] = condition[conditionKey];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.warn("to-merge query is of type " + getType(query) + ", can only overwrite", query, condition, key);
|
|
97
|
+
query[conditionKey] = condition[conditionKey];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
query[conditionKey] = condition[conditionKey];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function isConversionRequired(val) {
|
|
106
|
+
return isInternalObject(val) || isDate(val) || isRegExp(val);
|
|
107
|
+
}
|
|
108
|
+
export function encodeInternalDataType(val) {
|
|
109
|
+
return serializeInternalDataType(val);
|
|
110
|
+
}
|
|
111
|
+
export function decodeInternalDataType(object) {
|
|
112
|
+
return deserializeInternalDataType(object);
|
|
113
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LogicCommand } from '../commands/logic';
|
|
2
|
+
export declare type IQueryCondition = Record<string, any> | LogicCommand;
|
|
3
|
+
export declare type AnyObject = {
|
|
4
|
+
[x: string]: any;
|
|
5
|
+
};
|
|
6
|
+
export declare function serialize(val: any): IQueryCondition;
|
|
7
|
+
export declare function deserialize(object: AnyObject): any;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
13
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
|
+
if (!m) return o;
|
|
15
|
+
var i = m.call(o), r, ar = [], e;
|
|
16
|
+
try {
|
|
17
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
18
|
+
}
|
|
19
|
+
catch (error) { e = { error: error }; }
|
|
20
|
+
finally {
|
|
21
|
+
try {
|
|
22
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
23
|
+
}
|
|
24
|
+
finally { if (e) throw e.error; }
|
|
25
|
+
}
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
var __spread = (this && this.__spread) || function () {
|
|
29
|
+
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
import { SYMBOL_GEO_POINT, SYMBOL_SERVER_DATE, SYMBOL_REGEXP } from '../helper/symbol';
|
|
33
|
+
import { getType, isObject, isArray, isDate, isNumber, isInternalObject, isRegExp } from '../utils/type';
|
|
34
|
+
import { Point } from '../geo/index';
|
|
35
|
+
import { ServerDate } from '../serverDate/index';
|
|
36
|
+
export function serialize(val) {
|
|
37
|
+
return serializeHelper(val, [val]);
|
|
38
|
+
}
|
|
39
|
+
function serializeHelper(val, visited) {
|
|
40
|
+
if (isInternalObject(val)) {
|
|
41
|
+
switch (val._internalType) {
|
|
42
|
+
case SYMBOL_GEO_POINT: {
|
|
43
|
+
return val.toJSON();
|
|
44
|
+
}
|
|
45
|
+
case SYMBOL_SERVER_DATE: {
|
|
46
|
+
return val.parse();
|
|
47
|
+
}
|
|
48
|
+
case SYMBOL_REGEXP: {
|
|
49
|
+
return val.parse();
|
|
50
|
+
}
|
|
51
|
+
default: {
|
|
52
|
+
return val.toJSON ? val.toJSON() : val;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (isDate(val)) {
|
|
57
|
+
return {
|
|
58
|
+
$date: +val,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
else if (isRegExp(val)) {
|
|
62
|
+
return {
|
|
63
|
+
$regex: val.source,
|
|
64
|
+
$options: val.flags,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
else if (isArray(val)) {
|
|
68
|
+
return val.map(function (item) {
|
|
69
|
+
if (visited.indexOf(item) > -1) {
|
|
70
|
+
throw new Error('Cannot convert circular structure to JSON');
|
|
71
|
+
}
|
|
72
|
+
return serializeHelper(item, __spread(visited, [
|
|
73
|
+
item,
|
|
74
|
+
]));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else if (isObject(val)) {
|
|
78
|
+
var ret = __assign({}, val);
|
|
79
|
+
for (var key in ret) {
|
|
80
|
+
if (visited.indexOf(ret[key]) > -1) {
|
|
81
|
+
throw new Error('Cannot convert circular structure to JSON');
|
|
82
|
+
}
|
|
83
|
+
ret[key] = serializeHelper(ret[key], __spread(visited, [
|
|
84
|
+
ret[key],
|
|
85
|
+
]));
|
|
86
|
+
}
|
|
87
|
+
return ret;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
return val;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function deserialize(object) {
|
|
94
|
+
var ret = __assign({}, object);
|
|
95
|
+
for (var key in ret) {
|
|
96
|
+
switch (key) {
|
|
97
|
+
case '$date': {
|
|
98
|
+
switch (getType(ret[key])) {
|
|
99
|
+
case 'number': {
|
|
100
|
+
return new Date(ret[key]);
|
|
101
|
+
}
|
|
102
|
+
case 'object': {
|
|
103
|
+
return new ServerDate(ret[key]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case 'type': {
|
|
109
|
+
switch (ret.type) {
|
|
110
|
+
case 'Point': {
|
|
111
|
+
if (isArray(ret.coordinates) && isNumber(ret.coordinates[0]) && isNumber(ret.coordinates[1])) {
|
|
112
|
+
return new Point(ret.coordinates[0], ret.coordinates[1]);
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return object;
|
|
122
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { QueryCommand } from '../commands/query';
|
|
2
|
+
import { LogicCommand } from '../commands/logic';
|
|
3
|
+
export declare type IQueryCondition = Record<string, any> | LogicCommand;
|
|
4
|
+
export declare class QuerySerializer {
|
|
5
|
+
constructor();
|
|
6
|
+
static encode(query: IQueryCondition | QueryCommand | LogicCommand): IQueryCondition;
|
|
7
|
+
}
|