@cloudbase/database 1.2.3 → 1.4.1-alpha.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/README.md +32 -10
- package/dist/commonjs/ObjectId/index.d.ts +11 -0
- package/dist/commonjs/ObjectId/index.js +21 -0
- package/dist/commonjs/aggregate.d.ts +29 -29
- package/dist/commonjs/aggregate.js +124 -116
- package/dist/commonjs/collection.d.ts +17 -17
- package/dist/commonjs/collection.js +72 -72
- package/dist/commonjs/command.d.ts +175 -175
- package/dist/commonjs/command.js +285 -281
- package/dist/commonjs/commands/logic.d.ts +24 -24
- package/dist/commonjs/commands/logic.js +79 -79
- package/dist/commonjs/commands/query.d.ts +73 -73
- package/dist/commonjs/commands/query.js +147 -147
- package/dist/commonjs/commands/update.d.ts +29 -29
- package/dist/commonjs/commands/update.js +49 -49
- package/dist/commonjs/config/app.config.d.ts +6 -6
- package/dist/commonjs/config/app.config.js +7 -7
- package/dist/commonjs/config/error.config.d.ts +3 -3
- package/dist/commonjs/config/error.config.js +15 -15
- package/dist/commonjs/const/code.d.ts +34 -34
- package/dist/commonjs/const/code.js +36 -36
- package/dist/commonjs/constant.d.ts +54 -54
- package/dist/commonjs/constant.js +76 -76
- package/dist/commonjs/document.d.ts +14 -14
- package/dist/commonjs/document.js +219 -219
- package/dist/commonjs/geo/index.d.ts +6 -6
- package/dist/commonjs/geo/index.js +11 -11
- package/dist/commonjs/geo/interface.d.ts +24 -24
- package/dist/commonjs/geo/interface.js +2 -2
- package/dist/commonjs/geo/lineString.d.ts +19 -19
- package/dist/commonjs/geo/lineString.js +57 -57
- package/dist/commonjs/geo/multiLineString.d.ts +18 -18
- package/dist/commonjs/geo/multiLineString.js +56 -56
- package/dist/commonjs/geo/multiPoint.d.ts +18 -18
- package/dist/commonjs/geo/multiPoint.js +50 -50
- package/dist/commonjs/geo/multiPolygon.d.ts +18 -18
- package/dist/commonjs/geo/multiPolygon.js +62 -62
- package/dist/commonjs/geo/point.d.ts +19 -19
- package/dist/commonjs/geo/point.js +43 -43
- package/dist/commonjs/geo/polygon.d.ts +19 -19
- package/dist/commonjs/geo/polygon.js +70 -70
- package/dist/commonjs/helper/symbol.d.ts +15 -14
- package/dist/commonjs/helper/symbol.js +20 -19
- package/dist/commonjs/index.d.ts +50 -49
- package/dist/commonjs/index.js +41 -39
- package/dist/commonjs/operator-map.d.ts +4 -4
- package/dist/commonjs/operator-map.js +23 -23
- package/dist/commonjs/query.d.ts +38 -37
- package/dist/commonjs/query.js +247 -247
- package/dist/commonjs/realtime/error.d.ts +7 -7
- package/dist/commonjs/realtime/error.js +11 -11
- package/dist/commonjs/realtime/listener.d.ts +14 -14
- package/dist/commonjs/realtime/listener.js +17 -17
- package/dist/commonjs/realtime/message.d.ts +3 -3
- package/dist/commonjs/realtime/message.js +10 -10
- package/dist/commonjs/realtime/snapshot.d.ts +16 -16
- package/dist/commonjs/realtime/snapshot.js +42 -42
- package/dist/commonjs/realtime/virtual-websocket-client.d.ts +63 -63
- package/dist/commonjs/realtime/virtual-websocket-client.js +736 -736
- package/dist/commonjs/realtime/websocket-client.d.ts +78 -78
- package/dist/commonjs/realtime/websocket-client.js +567 -567
- package/dist/commonjs/realtime/ws-event.d.ts +126 -126
- package/dist/commonjs/realtime/ws-event.js +139 -139
- package/dist/commonjs/regexp/index.d.ts +18 -18
- package/dist/commonjs/regexp/index.js +30 -30
- package/dist/commonjs/serializer/common.d.ts +11 -11
- package/dist/commonjs/serializer/common.js +90 -90
- package/dist/commonjs/serializer/datatype.d.ts +7 -7
- package/dist/commonjs/serializer/datatype.js +99 -96
- package/dist/commonjs/serializer/query.d.ts +8 -8
- package/dist/commonjs/serializer/query.js +254 -254
- package/dist/commonjs/serializer/update.d.ts +16 -16
- package/dist/commonjs/serializer/update.js +142 -142
- package/dist/commonjs/serverDate/index.d.ts +13 -13
- package/dist/commonjs/serverDate/index.js +23 -23
- package/dist/commonjs/transaction/index.d.ts +30 -30
- package/dist/commonjs/transaction/index.js +105 -105
- package/dist/commonjs/transaction.d.ts +42 -42
- package/dist/commonjs/transaction.js +126 -126
- package/dist/commonjs/typings/index.d.ts +45 -45
- package/dist/commonjs/typings/index.js +2 -2
- package/dist/commonjs/typings/realtime.d.ts +219 -219
- package/dist/commonjs/typings/realtime.js +2 -2
- package/dist/commonjs/util.d.ts +9 -9
- package/dist/commonjs/util.js +101 -101
- package/dist/commonjs/utils/error.d.ts +37 -37
- package/dist/commonjs/utils/error.js +55 -55
- package/dist/commonjs/utils/symbol.d.ts +8 -8
- package/dist/commonjs/utils/symbol.js +39 -39
- package/dist/commonjs/utils/type.d.ts +13 -13
- package/dist/commonjs/utils/type.js +22 -22
- package/dist/commonjs/utils/utils.d.ts +19 -19
- package/dist/commonjs/utils/utils.js +59 -59
- package/dist/commonjs/validate.d.ts +1 -1
- package/dist/commonjs/validate.js +155 -149
- package/dist/esm/ObjectId/index.d.ts +11 -0
- package/dist/esm/ObjectId/index.js +17 -0
- package/dist/esm/aggregate.d.ts +29 -29
- package/dist/esm/aggregate.js +121 -113
- package/dist/esm/collection.d.ts +17 -17
- package/dist/esm/collection.js +69 -69
- package/dist/esm/command.d.ts +175 -175
- package/dist/esm/command.js +281 -277
- package/dist/esm/commands/logic.d.ts +24 -24
- package/dist/esm/commands/logic.js +74 -74
- package/dist/esm/commands/query.d.ts +73 -73
- package/dist/esm/commands/query.js +141 -141
- package/dist/esm/commands/update.d.ts +29 -29
- package/dist/esm/commands/update.js +44 -44
- package/dist/esm/config/app.config.d.ts +6 -6
- package/dist/esm/config/app.config.js +5 -5
- package/dist/esm/config/error.config.d.ts +3 -3
- package/dist/esm/config/error.config.js +13 -13
- package/dist/esm/const/code.d.ts +34 -34
- package/dist/esm/const/code.js +34 -34
- package/dist/esm/constant.d.ts +54 -54
- package/dist/esm/constant.js +67 -67
- package/dist/esm/document.d.ts +14 -14
- package/dist/esm/document.js +216 -216
- package/dist/esm/geo/index.d.ts +6 -6
- package/dist/esm/geo/index.js +6 -6
- package/dist/esm/geo/interface.d.ts +24 -24
- package/dist/esm/geo/lineString.d.ts +19 -19
- package/dist/esm/geo/lineString.js +54 -54
- package/dist/esm/geo/multiLineString.d.ts +18 -18
- package/dist/esm/geo/multiLineString.js +53 -53
- package/dist/esm/geo/multiPoint.d.ts +18 -18
- package/dist/esm/geo/multiPoint.js +47 -47
- package/dist/esm/geo/multiPolygon.d.ts +18 -18
- package/dist/esm/geo/multiPolygon.js +59 -59
- package/dist/esm/geo/point.d.ts +19 -19
- package/dist/esm/geo/point.js +40 -40
- package/dist/esm/geo/polygon.d.ts +19 -19
- package/dist/esm/geo/polygon.js +67 -67
- package/dist/esm/helper/symbol.d.ts +15 -14
- package/dist/esm/helper/symbol.js +15 -14
- package/dist/esm/index.d.ts +50 -49
- package/dist/esm/index.js +35 -33
- package/dist/esm/operator-map.d.ts +4 -4
- package/dist/esm/operator-map.js +20 -20
- package/dist/esm/query.d.ts +38 -37
- package/dist/esm/query.js +244 -244
- package/dist/esm/realtime/error.d.ts +7 -7
- package/dist/esm/realtime/error.js +8 -8
- package/dist/esm/realtime/listener.d.ts +14 -14
- package/dist/esm/realtime/listener.js +14 -14
- package/dist/esm/realtime/message.d.ts +3 -3
- package/dist/esm/realtime/message.js +6 -6
- package/dist/esm/realtime/snapshot.d.ts +16 -16
- package/dist/esm/realtime/snapshot.js +39 -39
- package/dist/esm/realtime/virtual-websocket-client.d.ts +63 -63
- package/dist/esm/realtime/virtual-websocket-client.js +733 -733
- package/dist/esm/realtime/websocket-client.d.ts +78 -78
- package/dist/esm/realtime/websocket-client.js +564 -564
- package/dist/esm/realtime/ws-event.d.ts +126 -126
- package/dist/esm/realtime/ws-event.js +137 -137
- package/dist/esm/regexp/index.d.ts +18 -18
- package/dist/esm/regexp/index.js +26 -26
- package/dist/esm/serializer/common.d.ts +11 -11
- package/dist/esm/serializer/common.js +82 -82
- package/dist/esm/serializer/datatype.d.ts +7 -7
- package/dist/esm/serializer/datatype.js +95 -92
- package/dist/esm/serializer/query.d.ts +8 -8
- package/dist/esm/serializer/query.js +251 -251
- package/dist/esm/serializer/update.d.ts +16 -16
- package/dist/esm/serializer/update.js +139 -139
- package/dist/esm/serverDate/index.d.ts +13 -13
- package/dist/esm/serverDate/index.js +19 -19
- package/dist/esm/transaction/index.d.ts +30 -30
- package/dist/esm/transaction/index.js +100 -100
- package/dist/esm/transaction.d.ts +42 -42
- package/dist/esm/transaction.js +121 -121
- package/dist/esm/typings/index.d.ts +45 -45
- package/dist/esm/typings/realtime.d.ts +219 -219
- package/dist/esm/util.d.ts +9 -9
- package/dist/esm/util.js +98 -98
- package/dist/esm/utils/error.d.ts +37 -37
- package/dist/esm/utils/error.js +49 -49
- package/dist/esm/utils/symbol.d.ts +8 -8
- package/dist/esm/utils/symbol.js +36 -36
- package/dist/esm/utils/type.d.ts +13 -13
- package/dist/esm/utils/type.js +20 -20
- package/dist/esm/utils/utils.d.ts +19 -19
- package/dist/esm/utils/utils.js +55 -55
- package/dist/esm/validate.d.ts +1 -1
- package/dist/esm/validate.js +152 -146
- package/package.json +1 -1
- package/src/ObjectId/index.ts +23 -0
- package/src/aggregate.ts +20 -8
- package/src/collection.ts +2 -2
- package/src/command.ts +11 -7
- package/src/document.ts +1 -1
- package/src/helper/symbol.ts +2 -0
- package/src/index.ts +4 -0
- package/src/query.ts +5 -4
- package/src/serializer/datatype.ts +5 -1
- package/src/serializer/query.ts +3 -3
- package/src/serializer/update.ts +3 -3
- package/src/validate.ts +15 -1
- package/.DS_Store +0 -0
- package/dist/commonjs/decimal128/index.d.ts +0 -8
- package/dist/commonjs/decimal128/index.js +0 -26
- package/dist/commonjs/lib/util.d.ts +0 -1
- package/dist/commonjs/lib/util.js +0 -25
- package/dist/commonjs/transaction/collection.d.ts +0 -7
- package/dist/commonjs/transaction/collection.js +0 -46
- package/dist/commonjs/transaction/document.d.ts +0 -27
- package/dist/commonjs/transaction/document.js +0 -205
- package/dist/commonjs/transaction/query.d.ts +0 -5
- package/dist/commonjs/transaction/query.js +0 -10
- package/dist/esm/lib/util.d.ts +0 -1
- package/dist/esm/lib/util.js +0 -23
- package/dist/esm/transaction/collection.d.ts +0 -7
- package/dist/esm/transaction/collection.js +0 -44
- package/dist/esm/transaction/document.d.ts +0 -27
- package/dist/esm/transaction/document.js +0 -203
- package/dist/esm/transaction/query.d.ts +0 -5
- package/dist/esm/transaction/query.js +0 -8
- package/src/.DS_Store +0 -0
- package/src/regexp/.DS_Store +0 -0
package/dist/esm/validate.js
CHANGED
|
@@ -1,146 +1,152 @@
|
|
|
1
|
-
import { ErrorCode, WhereFilterOpList, OrderDirectionList, FieldType } from './constant';
|
|
2
|
-
import { Util } from './util';
|
|
3
|
-
import { ERRORS } from './const/code';
|
|
4
|
-
import { E } from './utils/utils';
|
|
5
|
-
import { getType } from './utils/type';
|
|
6
|
-
import { SYMBOL_GEO_POINT } from './helper/symbol';
|
|
7
|
-
const validOptionsKeys = ['limit', 'offset', 'projection', 'order', 'multiple', 'timeout'];
|
|
8
|
-
export class Validate {
|
|
9
|
-
static isGeopoint(point, degree) {
|
|
10
|
-
if (Util.whichType(degree) !== FieldType.Number) {
|
|
11
|
-
throw new Error('Geo Point must be number type');
|
|
12
|
-
}
|
|
13
|
-
const degreeAbs = Math.abs(degree);
|
|
14
|
-
if (point === 'latitude' && degreeAbs > 90) {
|
|
15
|
-
throw new Error('latitude should be a number ranges from -90 to 90');
|
|
16
|
-
}
|
|
17
|
-
else if (point === 'longitude' && degreeAbs > 180) {
|
|
18
|
-
throw new Error('longitude should be a number ranges from -180 to 180');
|
|
19
|
-
}
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
static isInteger(param, num) {
|
|
23
|
-
if (!Number.isInteger(num)) {
|
|
24
|
-
throw new Error(param + ErrorCode.IntergerError);
|
|
25
|
-
}
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
static mustBeBoolean(param, bool) {
|
|
29
|
-
if (typeof bool !== 'boolean') {
|
|
30
|
-
throw new Error(param + ErrorCode.BooleanError);
|
|
31
|
-
}
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
static isProjection(param, value) {
|
|
35
|
-
if (getType(value) !== 'object') {
|
|
36
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `${param} projection must be an object` }));
|
|
37
|
-
}
|
|
38
|
-
for (const key in value) {
|
|
39
|
-
const subValue = value[key];
|
|
40
|
-
if (getType(subValue) === 'number') {
|
|
41
|
-
if (subValue !== 0 && subValue !== 1) {
|
|
42
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `if the value in projection is of number, it must be 0 or 1` }));
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
else if (getType(subValue) === 'object') {
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: 'invalid projection' }));
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
static isOrder(param, value) {
|
|
54
|
-
if (getType(value) !== 'object') {
|
|
55
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `${param} order must be an object` }));
|
|
56
|
-
}
|
|
57
|
-
for (let key in value) {
|
|
58
|
-
const subValue = value[key];
|
|
59
|
-
if (subValue !== 1 && subValue !== -1) {
|
|
60
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `order value must be 1 or -1` }));
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
static isFieldOrder(direction) {
|
|
66
|
-
if (OrderDirectionList.indexOf(direction) === -1) {
|
|
67
|
-
throw new Error(ErrorCode.DirectionError);
|
|
68
|
-
}
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
static isFieldPath(path) {
|
|
72
|
-
if (!/^[a-zA-Z0-9-_\.]/.test(path)) {
|
|
73
|
-
throw new Error();
|
|
74
|
-
}
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
static isOperator(op) {
|
|
78
|
-
if (WhereFilterOpList.indexOf(op) === -1) {
|
|
79
|
-
throw new Error(ErrorCode.OpStrError);
|
|
80
|
-
}
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
static isCollName(name) {
|
|
84
|
-
if (!/^[a-zA-Z0-9]([a-zA-Z0-9-_]){1,32}$/.test(name)) {
|
|
85
|
-
throw new Error(ErrorCode.CollNameError);
|
|
86
|
-
}
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
static isDocID(docId) {
|
|
90
|
-
if (!/^([a-fA-F0-9]){24}$/.test(docId)) {
|
|
91
|
-
throw new Error(ErrorCode.DocIDError);
|
|
92
|
-
}
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
static isValidOptions(options = {}) {
|
|
96
|
-
if (getType(options) !== 'object') {
|
|
97
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `options must be an object` }));
|
|
98
|
-
}
|
|
99
|
-
const keys = Object.keys(options);
|
|
100
|
-
for (const index in keys) {
|
|
101
|
-
if (validOptionsKeys.indexOf(keys[index]) < 0) {
|
|
102
|
-
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `${keys[index]} is invalid options key` }));
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
const { limit, offset, projection, order } = options;
|
|
106
|
-
const { multiple } = options;
|
|
107
|
-
if (limit !== undefined) {
|
|
108
|
-
Validate.isInteger('limit', limit);
|
|
109
|
-
}
|
|
110
|
-
if (offset !== undefined) {
|
|
111
|
-
Validate.isInteger('offset', offset);
|
|
112
|
-
}
|
|
113
|
-
if (projection !== undefined) {
|
|
114
|
-
Validate.isProjection('projection', projection);
|
|
115
|
-
}
|
|
116
|
-
if (order !== undefined) {
|
|
117
|
-
Validate.isOrder('order', order);
|
|
118
|
-
}
|
|
119
|
-
if (multiple !== undefined) {
|
|
120
|
-
Validate.mustBeBoolean('multiple', multiple);
|
|
121
|
-
}
|
|
122
|
-
if (options.timeout !== undefined) {
|
|
123
|
-
Validate.isInteger('timeout', options.timeout);
|
|
124
|
-
}
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
static
|
|
128
|
-
if (
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
1
|
+
import { ErrorCode, WhereFilterOpList, OrderDirectionList, FieldType } from './constant';
|
|
2
|
+
import { Util } from './util';
|
|
3
|
+
import { ERRORS } from './const/code';
|
|
4
|
+
import { E } from './utils/utils';
|
|
5
|
+
import { getType } from './utils/type';
|
|
6
|
+
import { SYMBOL_GEO_POINT } from './helper/symbol';
|
|
7
|
+
const validOptionsKeys = ['limit', 'offset', 'projection', 'order', 'multiple', 'timeout', 'raw'];
|
|
8
|
+
export class Validate {
|
|
9
|
+
static isGeopoint(point, degree) {
|
|
10
|
+
if (Util.whichType(degree) !== FieldType.Number) {
|
|
11
|
+
throw new Error('Geo Point must be number type');
|
|
12
|
+
}
|
|
13
|
+
const degreeAbs = Math.abs(degree);
|
|
14
|
+
if (point === 'latitude' && degreeAbs > 90) {
|
|
15
|
+
throw new Error('latitude should be a number ranges from -90 to 90');
|
|
16
|
+
}
|
|
17
|
+
else if (point === 'longitude' && degreeAbs > 180) {
|
|
18
|
+
throw new Error('longitude should be a number ranges from -180 to 180');
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
static isInteger(param, num) {
|
|
23
|
+
if (!Number.isInteger(num)) {
|
|
24
|
+
throw new Error(param + ErrorCode.IntergerError);
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
static mustBeBoolean(param, bool) {
|
|
29
|
+
if (typeof bool !== 'boolean') {
|
|
30
|
+
throw new Error(param + ErrorCode.BooleanError);
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
static isProjection(param, value) {
|
|
35
|
+
if (getType(value) !== 'object') {
|
|
36
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `${param} projection must be an object` }));
|
|
37
|
+
}
|
|
38
|
+
for (const key in value) {
|
|
39
|
+
const subValue = value[key];
|
|
40
|
+
if (getType(subValue) === 'number') {
|
|
41
|
+
if (subValue !== 0 && subValue !== 1) {
|
|
42
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `if the value in projection is of number, it must be 0 or 1` }));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (getType(subValue) === 'object') {
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: 'invalid projection' }));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
static isOrder(param, value) {
|
|
54
|
+
if (getType(value) !== 'object') {
|
|
55
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `${param} order must be an object` }));
|
|
56
|
+
}
|
|
57
|
+
for (let key in value) {
|
|
58
|
+
const subValue = value[key];
|
|
59
|
+
if (subValue !== 1 && subValue !== -1) {
|
|
60
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `order value must be 1 or -1` }));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
static isFieldOrder(direction) {
|
|
66
|
+
if (OrderDirectionList.indexOf(direction) === -1) {
|
|
67
|
+
throw new Error(ErrorCode.DirectionError);
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
static isFieldPath(path) {
|
|
72
|
+
if (!/^[a-zA-Z0-9-_\.]/.test(path)) {
|
|
73
|
+
throw new Error();
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
static isOperator(op) {
|
|
78
|
+
if (WhereFilterOpList.indexOf(op) === -1) {
|
|
79
|
+
throw new Error(ErrorCode.OpStrError);
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
static isCollName(name) {
|
|
84
|
+
if (!/^[a-zA-Z0-9]([a-zA-Z0-9-_]){1,32}$/.test(name)) {
|
|
85
|
+
throw new Error(ErrorCode.CollNameError);
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
static isDocID(docId) {
|
|
90
|
+
if (!/^([a-fA-F0-9]){24}$/.test(docId)) {
|
|
91
|
+
throw new Error(ErrorCode.DocIDError);
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
static isValidOptions(options = {}) {
|
|
96
|
+
if (getType(options) !== 'object') {
|
|
97
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `options must be an object` }));
|
|
98
|
+
}
|
|
99
|
+
const keys = Object.keys(options);
|
|
100
|
+
for (const index in keys) {
|
|
101
|
+
if (validOptionsKeys.indexOf(keys[index]) < 0) {
|
|
102
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `${keys[index]} is invalid options key` }));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const { limit, offset, projection, order } = options;
|
|
106
|
+
const { multiple } = options;
|
|
107
|
+
if (limit !== undefined) {
|
|
108
|
+
Validate.isInteger('limit', limit);
|
|
109
|
+
}
|
|
110
|
+
if (offset !== undefined) {
|
|
111
|
+
Validate.isInteger('offset', offset);
|
|
112
|
+
}
|
|
113
|
+
if (projection !== undefined) {
|
|
114
|
+
Validate.isProjection('projection', projection);
|
|
115
|
+
}
|
|
116
|
+
if (order !== undefined) {
|
|
117
|
+
Validate.isOrder('order', order);
|
|
118
|
+
}
|
|
119
|
+
if (multiple !== undefined) {
|
|
120
|
+
Validate.mustBeBoolean('multiple', multiple);
|
|
121
|
+
}
|
|
122
|
+
if (options.timeout !== undefined) {
|
|
123
|
+
Validate.isInteger('timeout', options.timeout);
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
static isValidAggregation(stage) {
|
|
128
|
+
if (Object.keys(stage).length !== 1) {
|
|
129
|
+
throw E(Object.assign(Object.assign({}, ERRORS.INVALID_PARAM), { message: `aggregation stage must have one key` }));
|
|
130
|
+
}
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
static isCentersPhere(param) {
|
|
134
|
+
if (Array.isArray(param) && param.length === 2) {
|
|
135
|
+
if (getType(param[0]) === 'object' &&
|
|
136
|
+
param[0]._internalType === SYMBOL_GEO_POINT &&
|
|
137
|
+
typeof param[1] === 'number') {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
if (Array.isArray(param[0]) && param[0].length === 2) {
|
|
141
|
+
const longitude = param[0][0];
|
|
142
|
+
const latitude = param[0][1];
|
|
143
|
+
Validate.isGeopoint('longitude', longitude);
|
|
144
|
+
Validate.isGeopoint('latitude', latitude);
|
|
145
|
+
if (typeof param[1] === 'number') {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
throw new Error(`${ErrorCode.CentersPhereError}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SYMBOL_OBJECTID } from '../helper/symbol'
|
|
2
|
+
|
|
3
|
+
export class ObjectId {
|
|
4
|
+
id: string
|
|
5
|
+
|
|
6
|
+
constructor({ id = '' } = {}) {
|
|
7
|
+
this.id = id
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
get _internalType() {
|
|
11
|
+
return SYMBOL_OBJECTID
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
parse() {
|
|
15
|
+
return {
|
|
16
|
+
$oid: this.id
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function ObjectIdConstructor(opt) {
|
|
22
|
+
return new ObjectId(opt)
|
|
23
|
+
}
|
package/src/aggregate.ts
CHANGED
|
@@ -3,21 +3,31 @@ import { EJSON } from 'bson'
|
|
|
3
3
|
import { QuerySerializer } from './serializer/query'
|
|
4
4
|
import { stringifyByEJSON } from './utils/utils'
|
|
5
5
|
import { getType } from './utils/type'
|
|
6
|
+
import { Validate } from './validate'
|
|
7
|
+
import { Point } from './geo/point'
|
|
6
8
|
|
|
7
|
-
const EARTH_RADIUS = 6378100
|
|
9
|
+
// const EARTH_RADIUS = 6378100
|
|
8
10
|
|
|
9
11
|
export default class Aggregation {
|
|
10
12
|
_db: any
|
|
11
13
|
_request: any
|
|
12
14
|
_stages: any[]
|
|
13
15
|
_collectionName: string
|
|
14
|
-
constructor(db?, collectionName?) {
|
|
16
|
+
constructor(db?, collectionName?, rawPipeline?) {
|
|
15
17
|
this._stages = []
|
|
16
18
|
|
|
17
19
|
if (db && collectionName) {
|
|
18
20
|
this._db = db
|
|
19
21
|
this._request = new Db.reqClass(this._db.config)
|
|
20
22
|
this._collectionName = collectionName
|
|
23
|
+
|
|
24
|
+
if (rawPipeline && rawPipeline.length > 0) {
|
|
25
|
+
rawPipeline.forEach((stage) => {
|
|
26
|
+
Validate.isValidAggregation(stage)
|
|
27
|
+
const stageName = Object.keys(stage)[0]
|
|
28
|
+
this._pipe(stageName, stage[stageName], true)
|
|
29
|
+
})
|
|
30
|
+
}
|
|
21
31
|
}
|
|
22
32
|
}
|
|
23
33
|
|
|
@@ -52,7 +62,7 @@ export default class Aggregation {
|
|
|
52
62
|
})
|
|
53
63
|
}
|
|
54
64
|
|
|
55
|
-
_pipe(stage, param) {
|
|
65
|
+
_pipe(stage, param, raw = false) {
|
|
56
66
|
// 区分param是否为字符串
|
|
57
67
|
let transformParam = ''
|
|
58
68
|
if (getType(param) === 'object') {
|
|
@@ -62,7 +72,7 @@ export default class Aggregation {
|
|
|
62
72
|
}
|
|
63
73
|
|
|
64
74
|
this._stages.push({
|
|
65
|
-
stageKey: `$${stage}`,
|
|
75
|
+
stageKey: raw ? stage : `$${stage}`,
|
|
66
76
|
stageValue: transformParam
|
|
67
77
|
})
|
|
68
78
|
return this
|
|
@@ -88,12 +98,14 @@ export default class Aggregation {
|
|
|
88
98
|
if (param.query) {
|
|
89
99
|
param.query = QuerySerializer.encode(param.query)
|
|
90
100
|
}
|
|
91
|
-
|
|
101
|
+
|
|
92
102
|
// 判断是否有 distanceMultiplier 参数
|
|
93
103
|
if (param.distanceMultiplier && typeof (param.distanceMultiplier) === 'number') {
|
|
94
|
-
param.distanceMultiplier = param.distanceMultiplier
|
|
95
|
-
}
|
|
96
|
-
|
|
104
|
+
param.distanceMultiplier = param.distanceMultiplier
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if(param.near) {
|
|
108
|
+
param.near = new Point(param.near.longitude, param.near.latitude).toJSON()
|
|
97
109
|
}
|
|
98
110
|
return this._pipe('geoNear', param)
|
|
99
111
|
}
|
package/src/collection.ts
CHANGED
|
@@ -127,8 +127,8 @@ export class CollectionReference extends Query {
|
|
|
127
127
|
// }
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
aggregate() {
|
|
131
|
-
return new Aggregation(this._db, this._coll)
|
|
130
|
+
aggregate(rawPipeline : object[] = []) {
|
|
131
|
+
return new Aggregation(this._db, this._coll, (this._apiOptions.raw || false) ? rawPipeline : [])
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
/**
|
package/src/command.ts
CHANGED
|
@@ -55,8 +55,12 @@ export const Command = {
|
|
|
55
55
|
return new QueryCommand(QUERY_COMMANDS_LITERAL.SIZE, [val])
|
|
56
56
|
},
|
|
57
57
|
|
|
58
|
-
mod(
|
|
59
|
-
|
|
58
|
+
mod() {
|
|
59
|
+
if (arguments.length == 1)
|
|
60
|
+
return new QueryCommand(QUERY_COMMANDS_LITERAL.MOD, [arguments[0]])
|
|
61
|
+
if (arguments.length == 2)
|
|
62
|
+
return new QueryCommand(QUERY_COMMANDS_LITERAL.MOD, [[arguments[0], arguments[1]]])
|
|
63
|
+
return new QueryCommand(QUERY_COMMANDS_LITERAL.MOD, arguments)
|
|
60
64
|
},
|
|
61
65
|
|
|
62
66
|
geoNear(val: any) {
|
|
@@ -190,11 +194,11 @@ export const Command = {
|
|
|
190
194
|
values:
|
|
191
195
|
| string
|
|
192
196
|
| {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
197
|
+
search: string
|
|
198
|
+
language?: string
|
|
199
|
+
caseSensitive?: boolean
|
|
200
|
+
diacriticSensitive: boolean
|
|
201
|
+
}
|
|
198
202
|
) {
|
|
199
203
|
if (isString(values)) {
|
|
200
204
|
return {
|
package/src/document.ts
CHANGED
|
@@ -245,7 +245,7 @@ export class DocumentReference {
|
|
|
245
245
|
const param = {
|
|
246
246
|
collectionName: this._coll,
|
|
247
247
|
transactionId: this._transactionId,
|
|
248
|
-
data: UpdateSerializer.encodeEJSON(data),
|
|
248
|
+
data: UpdateSerializer.encodeEJSON(data, this._apiOptions.raw || false),
|
|
249
249
|
query,
|
|
250
250
|
queryType: QueryType.DOC,
|
|
251
251
|
multi: false,
|
package/src/helper/symbol.ts
CHANGED
|
@@ -17,3 +17,5 @@ export const SYMBOL_GEO_MULTI_POLYGON = InternalSymbol.for('SYMBOL_GEO_MULTI_POL
|
|
|
17
17
|
export const SYMBOL_SERVER_DATE = InternalSymbol.for('SERVER_DATE')
|
|
18
18
|
|
|
19
19
|
export const SYMBOL_REGEXP = InternalSymbol.for('REGEXP')
|
|
20
|
+
|
|
21
|
+
export const SYMBOL_OBJECTID = InternalSymbol.for('OBJECTID')
|
package/src/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { Command } from './command'
|
|
|
5
5
|
import { ServerDateConstructor } from './serverDate/index'
|
|
6
6
|
import { RegExpConstructor } from './regexp/index'
|
|
7
7
|
import { startTransaction, runTransaction } from './transaction/index'
|
|
8
|
+
import { ObjectIdConstructor } from './ObjectId/index'
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* 地理位置类型
|
|
@@ -59,6 +60,8 @@ export class Db {
|
|
|
59
60
|
|
|
60
61
|
serverDate: any
|
|
61
62
|
|
|
63
|
+
ObjectId: any
|
|
64
|
+
|
|
62
65
|
startTransaction: any
|
|
63
66
|
|
|
64
67
|
runTransaction: any
|
|
@@ -95,6 +98,7 @@ export class Db {
|
|
|
95
98
|
this.serverDate = ServerDateConstructor
|
|
96
99
|
this.command = Command
|
|
97
100
|
this.RegExp = RegExpConstructor
|
|
101
|
+
this.ObjectId = ObjectIdConstructor
|
|
98
102
|
this.startTransaction = startTransaction
|
|
99
103
|
this.runTransaction = runTransaction
|
|
100
104
|
}
|
package/src/query.ts
CHANGED
|
@@ -25,6 +25,7 @@ interface GetRes {
|
|
|
25
25
|
|
|
26
26
|
interface BaseOption {
|
|
27
27
|
timeout?: number // 接口调用超时设置
|
|
28
|
+
raw?: boolean // 原生语句查询
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
export interface QueryOption extends BaseOption {
|
|
@@ -303,11 +304,11 @@ export class Query {
|
|
|
303
304
|
if (keys.length && !checkFlag) {
|
|
304
305
|
throw Error(ErrorCode.QueryParamValueError)
|
|
305
306
|
}
|
|
306
|
-
|
|
307
|
+
|
|
307
308
|
return new Query(
|
|
308
309
|
this._db,
|
|
309
310
|
this._coll,
|
|
310
|
-
QuerySerializer.encodeEJSON(query),
|
|
311
|
+
QuerySerializer.encodeEJSON(query, this._apiOptions.raw || false),
|
|
311
312
|
this._apiOptions,
|
|
312
313
|
this._transactionId
|
|
313
314
|
// this._fieldOrders,
|
|
@@ -414,7 +415,7 @@ export class Query {
|
|
|
414
415
|
multi,
|
|
415
416
|
merge: true,
|
|
416
417
|
upsert: false,
|
|
417
|
-
data: UpdateSerializer.encodeEJSON(data)
|
|
418
|
+
data: UpdateSerializer.encodeEJSON(data, this._apiOptions.raw || false)
|
|
418
419
|
}
|
|
419
420
|
|
|
420
421
|
if (this._fieldFilters) {
|
|
@@ -545,7 +546,7 @@ export class Query {
|
|
|
545
546
|
let param: any = {
|
|
546
547
|
collectionName: this._coll,
|
|
547
548
|
queryType: QueryType.WHERE,
|
|
548
|
-
data: UpdateSerializer.encodeEJSON(data)
|
|
549
|
+
data: UpdateSerializer.encodeEJSON(data, false)
|
|
549
550
|
}
|
|
550
551
|
|
|
551
552
|
if (this._transactionId) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// transpile internal data type
|
|
2
|
-
import { SYMBOL_GEO_POINT, SYMBOL_SERVER_DATE, SYMBOL_REGEXP } from '../helper/symbol'
|
|
2
|
+
import { SYMBOL_GEO_POINT, SYMBOL_SERVER_DATE, SYMBOL_OBJECTID, SYMBOL_REGEXP } from '../helper/symbol'
|
|
3
3
|
import {
|
|
4
4
|
getType,
|
|
5
5
|
isObject,
|
|
@@ -13,6 +13,7 @@ import { Point } from '../geo/index'
|
|
|
13
13
|
import { ServerDate } from '../serverDate/index'
|
|
14
14
|
import { RegExp } from '../regexp/index'
|
|
15
15
|
import { LogicCommand } from '../commands/logic'
|
|
16
|
+
import { ObjectId } from '../ObjectId/index'
|
|
16
17
|
|
|
17
18
|
export type IQueryCondition = Record<string, any> | LogicCommand
|
|
18
19
|
|
|
@@ -36,6 +37,9 @@ function serializeHelper(val: any, visited: object[]): Record<string, any> {
|
|
|
36
37
|
case SYMBOL_REGEXP: {
|
|
37
38
|
return (val as RegExp).parse()
|
|
38
39
|
}
|
|
40
|
+
case SYMBOL_OBJECTID: {
|
|
41
|
+
return (val as ObjectId).parse()
|
|
42
|
+
}
|
|
39
43
|
default: {
|
|
40
44
|
return val.toJSON ? val.toJSON() : val
|
|
41
45
|
}
|
package/src/serializer/query.ts
CHANGED
|
@@ -24,10 +24,10 @@ export class QuerySerializer {
|
|
|
24
24
|
return encoder.encodeQuery(query)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
static encodeEJSON(query: IQueryCondition | QueryCommand | LogicCommand): string {
|
|
27
|
+
static encodeEJSON(query: IQueryCondition | QueryCommand | LogicCommand, raw: boolean): string {
|
|
28
28
|
const encoder = new QueryEncoder()
|
|
29
|
-
|
|
30
|
-
return stringifyByEJSON(encoder.encodeQuery(query))
|
|
29
|
+
|
|
30
|
+
return stringifyByEJSON(raw ? query : encoder.encodeQuery(query))
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
package/src/serializer/update.ts
CHANGED
|
@@ -25,10 +25,10 @@ export class UpdateSerializer {
|
|
|
25
25
|
return stringifier.encodeUpdate(query)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
static encodeEJSON(query: IQueryCondition | UpdateCommand): string {
|
|
28
|
+
static encodeEJSON(query: IQueryCondition | UpdateCommand, raw: boolean): string {
|
|
29
29
|
const stringifier = new UpdateSerializer()
|
|
30
|
-
|
|
31
|
-
return stringifyByEJSON(stringifier.encodeUpdate(query))
|
|
30
|
+
|
|
31
|
+
return stringifyByEJSON(raw ? query : stringifier.encodeUpdate(query))
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
encodeUpdate(query: IQueryCondition | UpdateCommand): IUpdateCondition {
|
package/src/validate.ts
CHANGED
|
@@ -16,7 +16,7 @@ import { CenterSphere } from './typings'
|
|
|
16
16
|
|
|
17
17
|
import { SYMBOL_GEO_POINT } from './helper/symbol'
|
|
18
18
|
|
|
19
|
-
const validOptionsKeys = ['limit', 'offset', 'projection', 'order', 'multiple', 'timeout']
|
|
19
|
+
const validOptionsKeys = ['limit', 'offset', 'projection', 'order', 'multiple', 'timeout', 'raw']
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* 校验模块
|
|
@@ -228,6 +228,20 @@ export class Validate {
|
|
|
228
228
|
return true
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
+
/**
|
|
232
|
+
*
|
|
233
|
+
* @static
|
|
234
|
+
* @param {StageName:{}|string} stage
|
|
235
|
+
* @returns {Boolean}
|
|
236
|
+
* @memberof Validate
|
|
237
|
+
*/
|
|
238
|
+
static isValidAggregation(stage: object): Boolean {
|
|
239
|
+
if (Object.keys(stage).length !== 1) {
|
|
240
|
+
throw E({ ...ERRORS.INVALID_PARAM, message: `aggregation stage must have one key` })
|
|
241
|
+
}
|
|
242
|
+
return true
|
|
243
|
+
}
|
|
244
|
+
|
|
231
245
|
/**
|
|
232
246
|
*
|
|
233
247
|
* @static
|
package/.DS_Store
DELETED
|
Binary file
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export declare class Decimal128Type {
|
|
2
|
-
readonly decimalStr: string;
|
|
3
|
-
constructor(decimalStr?: string);
|
|
4
|
-
readonly _internalType: import("../utils/symbol").InternalSymbol;
|
|
5
|
-
parse(): any;
|
|
6
|
-
toJSON(): any;
|
|
7
|
-
}
|
|
8
|
-
export declare function Decimal128TypeConstructor(decimalStr: any): Decimal128Type;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const bson_1 = require("bson");
|
|
4
|
-
const symbol_1 = require("../helper/symbol");
|
|
5
|
-
class Decimal128Type {
|
|
6
|
-
constructor(decimalStr = '') {
|
|
7
|
-
if (typeof decimalStr !== 'string') {
|
|
8
|
-
throw new TypeError(`Decimal128Type 入参必须为 string!`);
|
|
9
|
-
}
|
|
10
|
-
this.decimalStr = decimalStr;
|
|
11
|
-
}
|
|
12
|
-
get _internalType() {
|
|
13
|
-
return symbol_1.SYMBOL_DECIMAL128;
|
|
14
|
-
}
|
|
15
|
-
parse() {
|
|
16
|
-
return bson_1.Decimal128.fromString(this.decimalStr);
|
|
17
|
-
}
|
|
18
|
-
toJSON() {
|
|
19
|
-
return bson_1.Decimal128.fromString(this.decimalStr);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
exports.Decimal128Type = Decimal128Type;
|
|
23
|
-
function Decimal128TypeConstructor(decimalStr) {
|
|
24
|
-
return new Decimal128Type(decimalStr);
|
|
25
|
-
}
|
|
26
|
-
exports.Decimal128TypeConstructor = Decimal128TypeConstructor;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const createPromiseCallback: () => any;
|