axiodb 19.1.1 → 20.3.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.
- package/README.md +86 -9
- package/cli/VERSION +1 -1
- package/cli/cmd/auth_management.go +68 -0
- package/cli/cmd/document.go +33 -0
- package/cli/cmd/health.go +19 -0
- package/cli/cmd/transaction.go +191 -0
- package/cli/cmd/version.go +1 -1
- package/cli/pkg/commands/document.go +19 -0
- package/cli/pkg/commands/health.go +18 -0
- package/cli/pkg/commands/transaction.go +84 -0
- package/cli/pkg/httpclient/client.go +76 -0
- package/lib/Helper/Console.helper.js.map +1 -1
- package/lib/Helper/Converter.helper.d.ts +1 -1
- package/lib/Helper/Converter.helper.js +0 -1
- package/lib/Helper/Converter.helper.js.map +1 -1
- package/lib/Helper/DocumentLoader.helper.js +2 -1
- package/lib/Helper/DocumentLoader.helper.js.map +1 -1
- package/lib/Helper/Logger.helper.d.ts +5 -0
- package/lib/Helper/Logger.helper.js +45 -0
- package/lib/Helper/Logger.helper.js.map +1 -0
- package/lib/Helper/PathSanitizer.helper.js.map +1 -1
- package/lib/Helper/SortedIndexValues.helper.js.map +1 -1
- package/lib/Helper/UniqueGenerator.helper.js.map +1 -1
- package/lib/Helper/response.helper.d.ts +2 -2
- package/lib/Helper/response.helper.js +6 -3
- package/lib/Helper/response.helper.js.map +1 -1
- package/lib/Memory/memory.operation.d.ts +9 -4
- package/lib/Memory/memory.operation.js +3 -3
- package/lib/Memory/memory.operation.js.map +1 -1
- package/lib/Services/Aggregation/Aggregation.Operation.d.ts +1 -1
- package/lib/Services/Aggregation/Aggregation.Operation.js +0 -1
- package/lib/Services/Aggregation/Aggregation.Operation.js.map +1 -1
- package/lib/Services/Aggregation/OperatorRegistry.js.map +1 -1
- package/lib/Services/Aggregation/operators/accumulatorOperators.d.ts +12 -12
- package/lib/Services/Aggregation/operators/accumulatorOperators.js +2 -3
- package/lib/Services/Aggregation/operators/accumulatorOperators.js.map +1 -1
- package/lib/Services/Aggregation/operators/expressionOperators.d.ts +3 -3
- package/lib/Services/Aggregation/operators/expressionOperators.js +111 -108
- package/lib/Services/Aggregation/operators/expressionOperators.js.map +1 -1
- package/lib/Services/Aggregation/operators/stageOperators.d.ts +20 -37
- package/lib/Services/Aggregation/operators/stageOperators.js +11 -11
- package/lib/Services/Aggregation/operators/stageOperators.js.map +1 -1
- package/lib/Services/Auth/AuthEvents.service.js.map +1 -1
- package/lib/Services/Auth/AuthSeeder.service.js +2 -2
- package/lib/Services/Auth/AuthSeeder.service.js.map +1 -1
- package/lib/Services/Auth/AuthService.service.js +5 -8
- package/lib/Services/Auth/AuthService.service.js.map +1 -1
- package/lib/Services/Auth/ConfigDatabase.service.js.map +1 -1
- package/lib/Services/Auth/CookieCodec.helper.js.map +1 -1
- package/lib/Services/Auth/LoginRateLimiter.service.js.map +1 -1
- package/lib/Services/Auth/PasswordHasher.helper.js.map +1 -1
- package/lib/Services/Auth/PermissionChecker.helper.js.map +1 -1
- package/lib/Services/Auth/SessionStore.service.js.map +1 -1
- package/lib/Services/CRUD Operation/Create.operation.js +0 -1
- package/lib/Services/CRUD Operation/Create.operation.js.map +1 -1
- package/lib/Services/CRUD Operation/Delete.operation.d.ts +2 -2
- package/lib/Services/CRUD Operation/Delete.operation.js +2 -3
- package/lib/Services/CRUD Operation/Delete.operation.js.map +1 -1
- package/lib/Services/CRUD Operation/Reader.operation.d.ts +11 -3
- package/lib/Services/CRUD Operation/Reader.operation.js +76 -40
- package/lib/Services/CRUD Operation/Reader.operation.js.map +1 -1
- package/lib/Services/CRUD Operation/Update.operation.d.ts +4 -4
- package/lib/Services/CRUD Operation/Update.operation.js +2 -2
- package/lib/Services/CRUD Operation/Update.operation.js.map +1 -1
- package/lib/Services/Collection/collection.operation.d.ts +10 -3
- package/lib/Services/Collection/collection.operation.js +32 -7
- package/lib/Services/Collection/collection.operation.js.map +1 -1
- package/lib/Services/Database/database.operation.js +13 -9
- package/lib/Services/Database/database.operation.js.map +1 -1
- package/lib/Services/Index/Index.service.d.ts +1 -1
- package/lib/Services/Index/Index.service.js +1 -1
- package/lib/Services/Index/Index.service.js.map +1 -1
- package/lib/Services/Index/IndexCache.service.js +4 -5
- package/lib/Services/Index/IndexCache.service.js.map +1 -1
- package/lib/Services/Index/ReadIndex.service.d.ts +4 -4
- package/lib/Services/Index/ReadIndex.service.js +10 -9
- package/lib/Services/Index/ReadIndex.service.js.map +1 -1
- package/lib/Services/Indexation.operation.d.ts +1 -1
- package/lib/Services/Indexation.operation.js +7 -6
- package/lib/Services/Indexation.operation.js.map +1 -1
- package/lib/Services/Transaction/LockManager.service.js +3 -4
- package/lib/Services/Transaction/LockManager.service.js.map +1 -1
- package/lib/Services/Transaction/Session.service.js +9 -7
- package/lib/Services/Transaction/Session.service.js.map +1 -1
- package/lib/Services/Transaction/Transaction.service.d.ts +4 -2
- package/lib/Services/Transaction/Transaction.service.js +7 -2
- package/lib/Services/Transaction/Transaction.service.js.map +1 -1
- package/lib/Services/Transaction/TransactionIndexManager.service.d.ts +1 -1
- package/lib/Services/Transaction/TransactionIndexManager.service.js +11 -6
- package/lib/Services/Transaction/TransactionIndexManager.service.js.map +1 -1
- package/lib/Services/Transaction/TransactionRegistry.service.js.map +1 -1
- package/lib/Services/Transaction/WriteAheadLog.service.js +0 -1
- package/lib/Services/Transaction/WriteAheadLog.service.js.map +1 -1
- package/lib/client/AggregationProxy.js.map +1 -1
- package/lib/client/AxioDBCloud.client.d.ts +15 -2
- package/lib/client/AxioDBCloud.client.js +24 -2
- package/lib/client/AxioDBCloud.client.js.map +1 -1
- package/lib/client/CollectionProxy.d.ts +8 -0
- package/lib/client/CollectionProxy.js +26 -0
- package/lib/client/CollectionProxy.js.map +1 -1
- package/lib/client/DatabaseProxy.js.map +1 -1
- package/lib/client/DeleteOperationProxy.js.map +1 -1
- package/lib/client/PooledConnection.d.ts +1 -1
- package/lib/client/PooledConnection.js +6 -3
- package/lib/client/PooledConnection.js.map +1 -1
- package/lib/client/ReaderProxy.d.ts +3 -1
- package/lib/client/ReaderProxy.js +7 -0
- package/lib/client/ReaderProxy.js.map +1 -1
- package/lib/client/TransactionProxy.d.ts +37 -0
- package/lib/client/TransactionProxy.js +101 -0
- package/lib/client/TransactionProxy.js.map +1 -0
- package/lib/client/UpdateOperationProxy.js.map +1 -1
- package/lib/client/types/client.types.js.map +1 -1
- package/lib/config/DB.js.map +1 -1
- package/lib/config/Interfaces/Helper/response.helper.interface.d.ts +2 -2
- package/lib/config/Interfaces/Helper/response.helper.interface.js +0 -1
- package/lib/config/Interfaces/Helper/response.helper.interface.js.map +1 -1
- package/lib/config/Interfaces/Operation/aggregation.interface.d.ts +4 -4
- package/lib/config/Interfaces/Operation/aggregation.interface.js +0 -1
- package/lib/config/Interfaces/Operation/aggregation.interface.js.map +1 -1
- package/lib/config/Interfaces/Operation/database.operation.interface.d.ts +4 -1
- package/lib/config/Interfaces/Operation/database.operation.interface.js +0 -1
- package/lib/config/Interfaces/Operation/database.operation.interface.js.map +1 -1
- package/lib/config/Interfaces/Transaction/transaction.interface.d.ts +3 -3
- package/lib/config/Interfaces/shared.types.d.ts +36 -0
- package/lib/config/Interfaces/shared.types.js +7 -0
- package/lib/config/Interfaces/shared.types.js.map +1 -0
- package/lib/config/Keys/Keys.js.map +1 -1
- package/lib/config/Keys/Permissions.js.map +1 -1
- package/lib/config/Keys/StatusCode.js.map +1 -1
- package/lib/engine/Filesystem/FileManager.js +3 -4
- package/lib/engine/Filesystem/FileManager.js.map +1 -1
- package/lib/engine/Filesystem/FolderManager.js +11 -11
- package/lib/engine/Filesystem/FolderManager.js.map +1 -1
- package/lib/engine/cli/worker_process.js.map +1 -1
- package/lib/engine/node/WorkerForDataLoad.engine.js +7 -6
- package/lib/engine/node/WorkerForDataLoad.engine.js.map +1 -1
- package/lib/engine/node/WorkerForSearch.engine.js +0 -1
- package/lib/engine/node/WorkerForSearch.engine.js.map +1 -1
- package/lib/server/config/PortFreeChecker.js +0 -1
- package/lib/server/config/PortFreeChecker.js.map +1 -1
- package/lib/server/config/keys.js +0 -1
- package/lib/server/config/keys.js.map +1 -1
- package/lib/server/config/server.js +2 -2
- package/lib/server/config/server.js.map +1 -1
- package/lib/server/controller/Auth/Auth.controller.js.map +1 -1
- package/lib/server/controller/Auth/RoleManagement.controller.js.map +1 -1
- package/lib/server/controller/Auth/UserManagement.controller.js.map +1 -1
- package/lib/server/controller/Collections/Collection.controller.js +9 -7
- package/lib/server/controller/Collections/Collection.controller.js.map +1 -1
- package/lib/server/controller/Database/Databse.controller.js +12 -13
- package/lib/server/controller/Database/Databse.controller.js.map +1 -1
- package/lib/server/controller/Index/Index.controller.js +4 -3
- package/lib/server/controller/Index/Index.controller.js.map +1 -1
- package/lib/server/controller/Operation/CRUD.controller.d.ts +1 -0
- package/lib/server/controller/Operation/CRUD.controller.js +42 -18
- package/lib/server/controller/Operation/CRUD.controller.js.map +1 -1
- package/lib/server/controller/Stats.controller.js +21 -15
- package/lib/server/controller/Stats.controller.js.map +1 -1
- package/lib/server/helper/databaseImport.helper.js.map +1 -1
- package/lib/server/helper/documentCounterInFolder.helper.js.map +1 -1
- package/lib/server/helper/responseBuilder.helper.d.ts +2 -2
- package/lib/server/helper/responseBuilder.helper.js.map +1 -1
- package/lib/server/middleware/auth.middleware.js.map +1 -1
- package/lib/server/middleware/permission.middleware.js.map +1 -1
- package/lib/server/router/Router.js +8 -7
- package/lib/server/router/Router.js.map +1 -1
- package/lib/server/router/Routers/Auth.routes.js.map +1 -1
- package/lib/server/router/Routers/Collection.routes.js +3 -3
- package/lib/server/router/Routers/Collection.routes.js.map +1 -1
- package/lib/server/router/Routers/DB.routes.js +1 -1
- package/lib/server/router/Routers/DB.routes.js.map +1 -1
- package/lib/server/router/Routers/Index.routes.js.map +1 -1
- package/lib/server/router/Routers/Operation.routes.js +25 -10
- package/lib/server/router/Routers/Operation.routes.js.map +1 -1
- package/lib/server/router/Routers/RoleManagement.routes.js.map +1 -1
- package/lib/server/router/Routers/UserManagement.routes.js.map +1 -1
- package/lib/tcp/config/keys.d.ts +32 -32
- package/lib/tcp/config/keys.js.map +1 -1
- package/lib/tcp/config/permissions.d.ts +1 -4
- package/lib/tcp/config/permissions.js +8 -4
- package/lib/tcp/config/permissions.js.map +1 -1
- package/lib/tcp/config/protocol.d.ts +3 -3
- package/lib/tcp/config/protocol.js +31 -9
- package/lib/tcp/config/protocol.js.map +1 -1
- package/lib/tcp/config/server.js +17 -12
- package/lib/tcp/config/server.js.map +1 -1
- package/lib/tcp/connection/ConnectionManager.js.map +1 -1
- package/lib/tcp/connection/ConnectionRateLimiter.js.map +1 -1
- package/lib/tcp/connection/RequestContext.d.ts +2 -2
- package/lib/tcp/connection/RequestContext.js.map +1 -1
- package/lib/tcp/connection/TransactionManager.d.ts +26 -0
- package/lib/tcp/connection/TransactionManager.js +114 -0
- package/lib/tcp/connection/TransactionManager.js.map +1 -0
- package/lib/tcp/handler/CommandHandler.d.ts +3 -0
- package/lib/tcp/handler/CommandHandler.js +32 -8
- package/lib/tcp/handler/CommandHandler.js.map +1 -1
- package/lib/tcp/handler/handlers/Auth.handler.d.ts +4 -2
- package/lib/tcp/handler/handlers/Auth.handler.js.map +1 -1
- package/lib/tcp/handler/handlers/Collection.handler.d.ts +7 -5
- package/lib/tcp/handler/handlers/Collection.handler.js +1 -3
- package/lib/tcp/handler/handlers/Collection.handler.js.map +1 -1
- package/lib/tcp/handler/handlers/DB.handler.d.ts +6 -4
- package/lib/tcp/handler/handlers/DB.handler.js +1 -2
- package/lib/tcp/handler/handlers/DB.handler.js.map +1 -1
- package/lib/tcp/handler/handlers/Operation.handler.d.ts +19 -57
- package/lib/tcp/handler/handlers/Operation.handler.js +138 -167
- package/lib/tcp/handler/handlers/Operation.handler.js.map +1 -1
- package/lib/tcp/handler/handlers/Transaction.handler.d.ts +18 -0
- package/lib/tcp/handler/handlers/Transaction.handler.js +199 -0
- package/lib/tcp/handler/handlers/Transaction.handler.js.map +1 -0
- package/lib/tcp/types/command.types.d.ts +6 -1
- package/lib/tcp/types/command.types.js +11 -1
- package/lib/tcp/types/command.types.js.map +1 -1
- package/lib/tcp/types/protocol.types.d.ts +10 -7
- package/lib/tcp/types/protocol.types.js.map +1 -1
- package/lib/utility/BufferLoaderWithWorker.utils.js +6 -5
- package/lib/utility/BufferLoaderWithWorker.utils.js.map +1 -1
- package/lib/utility/Searcher.utils.d.ts +3 -7
- package/lib/utility/Searcher.utils.js +49 -49
- package/lib/utility/Searcher.utils.js.map +1 -1
- package/lib/utility/SortData.utils.d.ts +3 -2
- package/lib/utility/SortData.utils.js +3 -19
- package/lib/utility/SortData.utils.js.map +1 -1
- package/lib/utility/ZipUnzip.utils.d.ts +2 -2
- package/lib/utility/ZipUnzip.utils.js +2 -2
- package/lib/utility/ZipUnzip.utils.js.map +1 -1
- package/package.json +10 -5
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.getNestedValue = getNestedValue;
|
|
5
4
|
exports.setNestedValue = setNestedValue;
|
|
@@ -44,26 +43,27 @@ function evaluateExpression(doc, expr) {
|
|
|
44
43
|
if (keys.length === 0)
|
|
45
44
|
return {};
|
|
46
45
|
const op = keys[0];
|
|
46
|
+
const exprObj = expr;
|
|
47
47
|
switch (op) {
|
|
48
|
-
case "$add": return evaluateArithmetic(doc,
|
|
49
|
-
case "$subtract": return evaluateArithmetic(doc,
|
|
50
|
-
case "$multiply": return evaluateArithmetic(doc,
|
|
51
|
-
case "$divide": return evaluateArithmetic(doc,
|
|
52
|
-
case "$mod": return evaluateArithmetic(doc,
|
|
53
|
-
case "$abs": return Math.abs(evaluateExpression(doc,
|
|
54
|
-
case "$ceil": return Math.ceil(evaluateExpression(doc,
|
|
55
|
-
case "$floor": return Math.floor(evaluateExpression(doc,
|
|
56
|
-
case "$sqrt": return Math.sqrt(evaluateExpression(doc,
|
|
48
|
+
case "$add": return evaluateArithmetic(doc, exprObj.$add, (a, b) => a + b);
|
|
49
|
+
case "$subtract": return evaluateArithmetic(doc, exprObj.$subtract, (a, b) => a - b);
|
|
50
|
+
case "$multiply": return evaluateArithmetic(doc, exprObj.$multiply, (a, b) => a * b);
|
|
51
|
+
case "$divide": return evaluateArithmetic(doc, exprObj.$divide, (a, b) => a / b);
|
|
52
|
+
case "$mod": return evaluateArithmetic(doc, exprObj.$mod, (a, b) => a % b);
|
|
53
|
+
case "$abs": return Math.abs(evaluateExpression(doc, exprObj.$abs));
|
|
54
|
+
case "$ceil": return Math.ceil(evaluateExpression(doc, exprObj.$ceil));
|
|
55
|
+
case "$floor": return Math.floor(evaluateExpression(doc, exprObj.$floor));
|
|
56
|
+
case "$sqrt": return Math.sqrt(evaluateExpression(doc, exprObj.$sqrt));
|
|
57
57
|
case "$pow": {
|
|
58
|
-
const [base, exp] =
|
|
58
|
+
const [base, exp] = exprObj.$pow.map((e) => evaluateExpression(doc, e));
|
|
59
59
|
return Math.pow(base, exp);
|
|
60
60
|
}
|
|
61
|
-
case "$log": return Math.log(evaluateExpression(doc,
|
|
62
|
-
case "$log10": return Math.log10(evaluateExpression(doc,
|
|
63
|
-
case "$exp": return Math.exp(evaluateExpression(doc,
|
|
64
|
-
case "$trunc": return Math.trunc(evaluateExpression(doc,
|
|
61
|
+
case "$log": return Math.log(evaluateExpression(doc, exprObj.$log));
|
|
62
|
+
case "$log10": return Math.log10(evaluateExpression(doc, exprObj.$log10));
|
|
63
|
+
case "$exp": return Math.exp(evaluateExpression(doc, exprObj.$exp));
|
|
64
|
+
case "$trunc": return Math.trunc(evaluateExpression(doc, exprObj.$trunc));
|
|
65
65
|
case "$round": {
|
|
66
|
-
const roundArgs =
|
|
66
|
+
const roundArgs = exprObj.$round;
|
|
67
67
|
if (Array.isArray(roundArgs)) {
|
|
68
68
|
const val = evaluateExpression(doc, roundArgs[0]);
|
|
69
69
|
const place = evaluateExpression(doc, roundArgs[1]) || 0;
|
|
@@ -73,24 +73,24 @@ function evaluateExpression(doc, expr) {
|
|
|
73
73
|
return Math.round(evaluateExpression(doc, roundArgs));
|
|
74
74
|
}
|
|
75
75
|
case "$concat":
|
|
76
|
-
return
|
|
76
|
+
return exprObj.$concat.map(e => {
|
|
77
77
|
const v = evaluateExpression(doc, e);
|
|
78
78
|
return v === null || v === undefined ? "" : String(v);
|
|
79
79
|
}).join("");
|
|
80
80
|
case "$substr": {
|
|
81
|
-
const [str, start, len] =
|
|
81
|
+
const [str, start, len] = exprObj.$substr.map((e) => evaluateExpression(doc, e));
|
|
82
82
|
return String(str).substr(start, len);
|
|
83
83
|
}
|
|
84
84
|
case "$substrBytes": {
|
|
85
|
-
const [str, start, len] =
|
|
85
|
+
const [str, start, len] = exprObj.$substrBytes.map((e) => evaluateExpression(doc, e));
|
|
86
86
|
return String(str).substr(start, len);
|
|
87
87
|
}
|
|
88
|
-
case "$strLen": return String(evaluateExpression(doc,
|
|
89
|
-
case "$strLenBytes": return Buffer.byteLength(String(evaluateExpression(doc,
|
|
90
|
-
case "$toLower": return String(evaluateExpression(doc,
|
|
91
|
-
case "$toUpper": return String(evaluateExpression(doc,
|
|
88
|
+
case "$strLen": return String(evaluateExpression(doc, exprObj.$strLen)).length;
|
|
89
|
+
case "$strLenBytes": return Buffer.byteLength(String(evaluateExpression(doc, exprObj.$strLenBytes)));
|
|
90
|
+
case "$toLower": return String(evaluateExpression(doc, exprObj.$toLower)).toLowerCase();
|
|
91
|
+
case "$toUpper": return String(evaluateExpression(doc, exprObj.$toUpper)).toUpperCase();
|
|
92
92
|
case "$trim": {
|
|
93
|
-
const trimInput =
|
|
93
|
+
const trimInput = exprObj.$trim;
|
|
94
94
|
if (typeof trimInput === "object" && trimInput.input) {
|
|
95
95
|
const str = String(evaluateExpression(doc, trimInput.input));
|
|
96
96
|
const chars = trimInput.chars ? evaluateExpression(doc, trimInput.chars) : undefined;
|
|
@@ -103,7 +103,7 @@ function evaluateExpression(doc, expr) {
|
|
|
103
103
|
return String(evaluateExpression(doc, trimInput)).trim();
|
|
104
104
|
}
|
|
105
105
|
case "$ltrim": {
|
|
106
|
-
const ltrimInput =
|
|
106
|
+
const ltrimInput = exprObj.$ltrim;
|
|
107
107
|
if (typeof ltrimInput === "object" && ltrimInput.input) {
|
|
108
108
|
const str = String(evaluateExpression(doc, ltrimInput.input));
|
|
109
109
|
const chars = ltrimInput.chars ? evaluateExpression(doc, ltrimInput.chars) : undefined;
|
|
@@ -114,7 +114,7 @@ function evaluateExpression(doc, expr) {
|
|
|
114
114
|
return String(evaluateExpression(doc, ltrimInput)).trimStart();
|
|
115
115
|
}
|
|
116
116
|
case "$rtrim": {
|
|
117
|
-
const rtrimInput =
|
|
117
|
+
const rtrimInput = exprObj.$rtrim;
|
|
118
118
|
if (typeof rtrimInput === "object" && rtrimInput.input) {
|
|
119
119
|
const str = String(evaluateExpression(doc, rtrimInput.input));
|
|
120
120
|
const chars = rtrimInput.chars ? evaluateExpression(doc, rtrimInput.chars) : undefined;
|
|
@@ -125,7 +125,7 @@ function evaluateExpression(doc, expr) {
|
|
|
125
125
|
return String(evaluateExpression(doc, rtrimInput)).trimEnd();
|
|
126
126
|
}
|
|
127
127
|
case "$indexOfBytes": {
|
|
128
|
-
const args =
|
|
128
|
+
const args = exprObj.$indexOfBytes;
|
|
129
129
|
const str = String(evaluateExpression(doc, args[0]));
|
|
130
130
|
const search = String(evaluateExpression(doc, args[1]));
|
|
131
131
|
const start = args[2] ? evaluateExpression(doc, args[2]) : 0;
|
|
@@ -133,76 +133,78 @@ function evaluateExpression(doc, expr) {
|
|
|
133
133
|
return str.substring(start, end).indexOf(search) + (start > 0 ? start : 0);
|
|
134
134
|
}
|
|
135
135
|
case "$split": {
|
|
136
|
-
const [str, delim] =
|
|
136
|
+
const [str, delim] = exprObj.$split.map((e) => evaluateExpression(doc, e));
|
|
137
137
|
return String(str).split(String(delim));
|
|
138
138
|
}
|
|
139
139
|
case "$replaceOne": {
|
|
140
|
-
const input =
|
|
140
|
+
const input = exprObj.$replaceOne;
|
|
141
141
|
const str = String(evaluateExpression(doc, input.input));
|
|
142
142
|
const find = String(evaluateExpression(doc, input.find));
|
|
143
143
|
const replacement = String(evaluateExpression(doc, input.replacement));
|
|
144
144
|
return str.replace(find, replacement);
|
|
145
145
|
}
|
|
146
146
|
case "$replaceAll": {
|
|
147
|
-
const input =
|
|
147
|
+
const input = exprObj.$replaceAll;
|
|
148
148
|
const str = String(evaluateExpression(doc, input.input));
|
|
149
149
|
const find = String(evaluateExpression(doc, input.find));
|
|
150
150
|
const replacement = String(evaluateExpression(doc, input.replacement));
|
|
151
151
|
return str.split(find).join(replacement);
|
|
152
152
|
}
|
|
153
153
|
case "$regexMatch": {
|
|
154
|
-
const input =
|
|
154
|
+
const input = exprObj.$regexMatch;
|
|
155
155
|
const str = String(evaluateExpression(doc, input.input));
|
|
156
156
|
const regex = new RegExp(input.regex, input.options || "");
|
|
157
157
|
return regex.test(str);
|
|
158
158
|
}
|
|
159
159
|
case "$cmp": {
|
|
160
|
-
const [a, b] =
|
|
160
|
+
const [a, b] = exprObj.$cmp.map((e) => evaluateExpression(doc, e));
|
|
161
161
|
return a === b ? 0 : a < b ? -1 : 1;
|
|
162
162
|
}
|
|
163
163
|
case "$eq": {
|
|
164
|
-
const [a, b] =
|
|
164
|
+
const [a, b] = exprObj.$eq.map((e) => evaluateExpression(doc, e));
|
|
165
165
|
return a === b;
|
|
166
166
|
}
|
|
167
167
|
case "$gt": {
|
|
168
|
-
const [a, b] =
|
|
168
|
+
const [a, b] = exprObj.$gt.map((e) => evaluateExpression(doc, e));
|
|
169
169
|
return a > b;
|
|
170
170
|
}
|
|
171
171
|
case "$gte": {
|
|
172
|
-
const [a, b] =
|
|
172
|
+
const [a, b] = exprObj.$gte.map((e) => evaluateExpression(doc, e));
|
|
173
173
|
return a >= b;
|
|
174
174
|
}
|
|
175
175
|
case "$lt": {
|
|
176
|
-
const [a, b] =
|
|
176
|
+
const [a, b] = exprObj.$lt.map((e) => evaluateExpression(doc, e));
|
|
177
177
|
return a < b;
|
|
178
178
|
}
|
|
179
179
|
case "$lte": {
|
|
180
|
-
const [a, b] =
|
|
180
|
+
const [a, b] = exprObj.$lte.map((e) => evaluateExpression(doc, e));
|
|
181
181
|
return a <= b;
|
|
182
182
|
}
|
|
183
183
|
case "$ne": {
|
|
184
|
-
const [a, b] =
|
|
184
|
+
const [a, b] = exprObj.$ne.map((e) => evaluateExpression(doc, e));
|
|
185
185
|
return a !== b;
|
|
186
186
|
}
|
|
187
|
-
case "$and": return
|
|
188
|
-
case "$or": return
|
|
189
|
-
case "$not": return !evaluateExpression(doc,
|
|
187
|
+
case "$and": return exprObj.$and.every(e => evaluateExpression(doc, e));
|
|
188
|
+
case "$or": return exprObj.$or.some(e => evaluateExpression(doc, e));
|
|
189
|
+
case "$not": return !evaluateExpression(doc, exprObj.$not[0]);
|
|
190
190
|
case "$cond": {
|
|
191
|
-
|
|
192
|
-
|
|
191
|
+
const condVal = exprObj.$cond;
|
|
192
|
+
if (Array.isArray(condVal)) {
|
|
193
|
+
const [condition, thenVal, elseVal] = condVal;
|
|
193
194
|
return evaluateExpression(doc, condition) ? evaluateExpression(doc, thenVal) : evaluateExpression(doc, elseVal);
|
|
194
195
|
}
|
|
195
|
-
const { if: ifExpr, then: thenExpr, else: elseExpr } =
|
|
196
|
+
const { if: ifExpr, then: thenExpr, else: elseExpr } = condVal;
|
|
196
197
|
return evaluateExpression(doc, ifExpr) ? evaluateExpression(doc, thenExpr) : evaluateExpression(doc, elseExpr);
|
|
197
198
|
}
|
|
198
199
|
case "$ifNull": {
|
|
199
|
-
const [inputExpr, replacementExpr] =
|
|
200
|
+
const [inputExpr, replacementExpr] = exprObj.$ifNull;
|
|
200
201
|
const val = evaluateExpression(doc, inputExpr);
|
|
201
202
|
return val === null || val === undefined ? evaluateExpression(doc, replacementExpr) : val;
|
|
202
203
|
}
|
|
203
204
|
case "$switch": {
|
|
204
|
-
const
|
|
205
|
-
const
|
|
205
|
+
const switchVal = exprObj.$switch;
|
|
206
|
+
const branches = switchVal.branches;
|
|
207
|
+
const defaultVal = switchVal.default;
|
|
206
208
|
for (const branch of branches) {
|
|
207
209
|
if (evaluateExpression(doc, branch.case))
|
|
208
210
|
return evaluateExpression(doc, branch.then);
|
|
@@ -210,13 +212,14 @@ function evaluateExpression(doc, expr) {
|
|
|
210
212
|
return defaultVal !== undefined ? evaluateExpression(doc, defaultVal) : undefined;
|
|
211
213
|
}
|
|
212
214
|
case "$arrayElemAt": {
|
|
213
|
-
const [arr, idx] =
|
|
215
|
+
const [arr, idx] = exprObj.$arrayElemAt.map((e) => evaluateExpression(doc, e));
|
|
214
216
|
if (!Array.isArray(arr))
|
|
215
217
|
return undefined;
|
|
216
|
-
|
|
218
|
+
const idxNum = idx;
|
|
219
|
+
return arr[idxNum < 0 ? arr.length + idxNum : idxNum];
|
|
217
220
|
}
|
|
218
221
|
case "$arrayToObject": {
|
|
219
|
-
const arr = evaluateExpression(doc,
|
|
222
|
+
const arr = evaluateExpression(doc, exprObj.$arrayToObject);
|
|
220
223
|
if (!Array.isArray(arr))
|
|
221
224
|
return {};
|
|
222
225
|
const result = {};
|
|
@@ -229,25 +232,25 @@ function evaluateExpression(doc, expr) {
|
|
|
229
232
|
return result;
|
|
230
233
|
}
|
|
231
234
|
case "$concatArrays": {
|
|
232
|
-
const arrays =
|
|
235
|
+
const arrays = exprObj.$concatArrays.map((e) => evaluateExpression(doc, e));
|
|
233
236
|
return arrays.flat();
|
|
234
237
|
}
|
|
235
238
|
case "$filter": {
|
|
236
|
-
const { input, as, cond } =
|
|
239
|
+
const { input, as, cond } = exprObj.$filter;
|
|
237
240
|
const arr = evaluateExpression(doc, input);
|
|
238
241
|
if (!Array.isArray(arr))
|
|
239
242
|
return [];
|
|
240
243
|
const varName = as || "this";
|
|
241
244
|
return arr.filter(item => evaluateExpression(Object.assign(Object.assign({}, doc), { [varName]: item }), cond));
|
|
242
245
|
}
|
|
243
|
-
case "$first": return evaluateExpression(doc,
|
|
244
|
-
case "$last": return evaluateExpression(doc,
|
|
246
|
+
case "$first": return evaluateExpression(doc, exprObj.$first);
|
|
247
|
+
case "$last": return evaluateExpression(doc, exprObj.$last);
|
|
245
248
|
case "$size": {
|
|
246
|
-
const arr = evaluateExpression(doc,
|
|
249
|
+
const arr = evaluateExpression(doc, exprObj.$size);
|
|
247
250
|
return Array.isArray(arr) ? arr.length : 0;
|
|
248
251
|
}
|
|
249
252
|
case "$slice": {
|
|
250
|
-
const args =
|
|
253
|
+
const args = exprObj.$slice;
|
|
251
254
|
const arr = evaluateExpression(doc, args[0]);
|
|
252
255
|
if (!Array.isArray(arr))
|
|
253
256
|
return [];
|
|
@@ -257,7 +260,7 @@ function evaluateExpression(doc, expr) {
|
|
|
257
260
|
return arr.slice(0, pos);
|
|
258
261
|
}
|
|
259
262
|
case "$map": {
|
|
260
|
-
const { input, as, in: inExpr } =
|
|
263
|
+
const { input, as, in: inExpr } = exprObj.$map;
|
|
261
264
|
const arr = evaluateExpression(doc, input);
|
|
262
265
|
if (!Array.isArray(arr))
|
|
263
266
|
return [];
|
|
@@ -265,17 +268,17 @@ function evaluateExpression(doc, expr) {
|
|
|
265
268
|
return arr.map(item => evaluateExpression(Object.assign(Object.assign({}, doc), { [varName]: item }), inExpr));
|
|
266
269
|
}
|
|
267
270
|
case "$reduce": {
|
|
268
|
-
const { input, initialValue, in: inExpr } =
|
|
271
|
+
const { input, initialValue, in: inExpr } = exprObj.$reduce;
|
|
269
272
|
const arr = evaluateExpression(doc, input);
|
|
270
273
|
if (!Array.isArray(arr))
|
|
271
274
|
return evaluateExpression(doc, initialValue);
|
|
272
|
-
const varName =
|
|
275
|
+
const varName = exprObj.$reduce.as || "this";
|
|
273
276
|
return arr.reduce((acc, item) => {
|
|
274
277
|
return evaluateExpression(Object.assign(Object.assign({}, doc), { [varName]: item, value: acc }), inExpr);
|
|
275
278
|
}, evaluateExpression(doc, initialValue));
|
|
276
279
|
}
|
|
277
280
|
case "$range": {
|
|
278
|
-
const args =
|
|
281
|
+
const args = exprObj.$range.map((e) => evaluateExpression(doc, e));
|
|
279
282
|
const [start, end, step = 1] = args;
|
|
280
283
|
const result = [];
|
|
281
284
|
for (let i = start; i < end; i += step)
|
|
@@ -283,7 +286,7 @@ function evaluateExpression(doc, expr) {
|
|
|
283
286
|
return result;
|
|
284
287
|
}
|
|
285
288
|
case "$zip": {
|
|
286
|
-
const { inputs, useLongestLength, defaults } =
|
|
289
|
+
const { inputs, useLongestLength, defaults } = exprObj.$zip;
|
|
287
290
|
const arrays = inputs.map((e) => evaluateExpression(doc, e));
|
|
288
291
|
const maxLen = useLongestLength ? Math.max(...arrays.map((a) => a.length)) : Math.min(...arrays.map((a) => a.length));
|
|
289
292
|
const result = [];
|
|
@@ -302,19 +305,19 @@ function evaluateExpression(doc, expr) {
|
|
|
302
305
|
return result;
|
|
303
306
|
}
|
|
304
307
|
case "$in": {
|
|
305
|
-
const [needle, haystack] =
|
|
308
|
+
const [needle, haystack] = exprObj.$in.map((e) => evaluateExpression(doc, e));
|
|
306
309
|
return Array.isArray(haystack) && haystack.includes(needle);
|
|
307
310
|
}
|
|
308
311
|
case "$indexOfArray": {
|
|
309
|
-
const [arr, searchValue] =
|
|
312
|
+
const [arr, searchValue] = exprObj.$indexOfArray.map((e) => evaluateExpression(doc, e));
|
|
310
313
|
return Array.isArray(arr) ? arr.indexOf(searchValue) : -1;
|
|
311
314
|
}
|
|
312
315
|
case "$reverseArray": {
|
|
313
|
-
const arr = evaluateExpression(doc,
|
|
316
|
+
const arr = evaluateExpression(doc, exprObj.$reverseArray);
|
|
314
317
|
return Array.isArray(arr) ? [...arr].reverse() : [];
|
|
315
318
|
}
|
|
316
319
|
case "$sortArray": {
|
|
317
|
-
const { input, sortBy } =
|
|
320
|
+
const { input, sortBy } = exprObj.$sortArray;
|
|
318
321
|
const arr = evaluateExpression(doc, input);
|
|
319
322
|
if (!Array.isArray(arr))
|
|
320
323
|
return [];
|
|
@@ -325,34 +328,34 @@ function evaluateExpression(doc, expr) {
|
|
|
325
328
|
sorted.sort((a, b) => (a > b ? -1 : a < b ? 1 : 0));
|
|
326
329
|
return sorted;
|
|
327
330
|
}
|
|
328
|
-
case "$year": return new Date(evaluateExpression(doc,
|
|
329
|
-
case "$month": return new Date(evaluateExpression(doc,
|
|
330
|
-
case "$dayOfMonth": return new Date(evaluateExpression(doc,
|
|
331
|
-
case "$hour": return new Date(evaluateExpression(doc,
|
|
332
|
-
case "$minute": return new Date(evaluateExpression(doc,
|
|
333
|
-
case "$second": return new Date(evaluateExpression(doc,
|
|
334
|
-
case "$millisecond": return new Date(evaluateExpression(doc,
|
|
335
|
-
case "$dayOfWeek": return new Date(evaluateExpression(doc,
|
|
331
|
+
case "$year": return new Date(evaluateExpression(doc, exprObj.$year)).getFullYear();
|
|
332
|
+
case "$month": return new Date(evaluateExpression(doc, exprObj.$month)).getMonth() + 1;
|
|
333
|
+
case "$dayOfMonth": return new Date(evaluateExpression(doc, exprObj.$dayOfMonth)).getDate();
|
|
334
|
+
case "$hour": return new Date(evaluateExpression(doc, exprObj.$hour)).getHours();
|
|
335
|
+
case "$minute": return new Date(evaluateExpression(doc, exprObj.$minute)).getMinutes();
|
|
336
|
+
case "$second": return new Date(evaluateExpression(doc, exprObj.$second)).getSeconds();
|
|
337
|
+
case "$millisecond": return new Date(evaluateExpression(doc, exprObj.$millisecond)).getMilliseconds();
|
|
338
|
+
case "$dayOfWeek": return new Date(evaluateExpression(doc, exprObj.$dayOfWeek)).getDay() + 1;
|
|
336
339
|
case "$dayOfYear": {
|
|
337
|
-
const date = new Date(evaluateExpression(doc,
|
|
340
|
+
const date = new Date(evaluateExpression(doc, exprObj.$dayOfYear));
|
|
338
341
|
const start = new Date(date.getFullYear(), 0, 0);
|
|
339
342
|
return Math.floor((date.getTime() - start.getTime()) / 86400000);
|
|
340
343
|
}
|
|
341
|
-
case "$week": return getISOWeek(new Date(evaluateExpression(doc,
|
|
344
|
+
case "$week": return getISOWeek(new Date(evaluateExpression(doc, exprObj.$week)));
|
|
342
345
|
case "$isoDayOfWeek": {
|
|
343
|
-
const day = new Date(evaluateExpression(doc,
|
|
346
|
+
const day = new Date(evaluateExpression(doc, exprObj.$isoDayOfWeek)).getDay();
|
|
344
347
|
return day === 0 ? 7 : day;
|
|
345
348
|
}
|
|
346
|
-
case "$isoWeekYear": return getISOWeekYear(new Date(evaluateExpression(doc,
|
|
349
|
+
case "$isoWeekYear": return getISOWeekYear(new Date(evaluateExpression(doc, exprObj.$isoWeekYear)));
|
|
347
350
|
case "$dateToString": {
|
|
348
|
-
const { format, date, onNull } =
|
|
351
|
+
const { format, date, onNull } = exprObj.$dateToString;
|
|
349
352
|
const d = evaluateExpression(doc, date);
|
|
350
353
|
if (d === null || d === undefined)
|
|
351
354
|
return onNull || null;
|
|
352
355
|
return formatDate(new Date(d), format || "%Y-%m-%dT%H:%M:%S.%LZ");
|
|
353
356
|
}
|
|
354
357
|
case "$dateFromString": {
|
|
355
|
-
const { dateString, onNull, onError } =
|
|
358
|
+
const { dateString, onNull, onError } = exprObj.$dateFromString;
|
|
356
359
|
const str = evaluateExpression(doc, dateString);
|
|
357
360
|
if (str === null || str === undefined)
|
|
358
361
|
return onNull || null;
|
|
@@ -364,20 +367,20 @@ function evaluateExpression(doc, expr) {
|
|
|
364
367
|
}
|
|
365
368
|
}
|
|
366
369
|
case "$dateDiff": {
|
|
367
|
-
const { startDate, endDate, unit } =
|
|
370
|
+
const { startDate, endDate, unit } = exprObj.$dateDiff;
|
|
368
371
|
return dateDiff(new Date(evaluateExpression(doc, startDate)), new Date(evaluateExpression(doc, endDate)), unit || "day");
|
|
369
372
|
}
|
|
370
373
|
case "$dateAdd": {
|
|
371
|
-
const { startDate, unit, amount } =
|
|
374
|
+
const { startDate, unit, amount } = exprObj.$dateAdd;
|
|
372
375
|
return addToDate(new Date(evaluateExpression(doc, startDate)), unit || "day", evaluateExpression(doc, amount));
|
|
373
376
|
}
|
|
374
377
|
case "$dateSubtract": {
|
|
375
|
-
const { startDate, unit, amount } =
|
|
378
|
+
const { startDate, unit, amount } = exprObj.$dateSubtract;
|
|
376
379
|
return addToDate(new Date(evaluateExpression(doc, startDate)), unit || "day", -evaluateExpression(doc, amount));
|
|
377
380
|
}
|
|
378
|
-
case "$toDate": return new Date(evaluateExpression(doc,
|
|
381
|
+
case "$toDate": return new Date(evaluateExpression(doc, exprObj.$toDate));
|
|
379
382
|
case "$type": {
|
|
380
|
-
const val = evaluateExpression(doc,
|
|
383
|
+
const val = evaluateExpression(doc, exprObj.$type);
|
|
381
384
|
if (val === null)
|
|
382
385
|
return "null";
|
|
383
386
|
if (val === undefined)
|
|
@@ -391,7 +394,7 @@ function evaluateExpression(doc, expr) {
|
|
|
391
394
|
return typeof val;
|
|
392
395
|
}
|
|
393
396
|
case "$convert": {
|
|
394
|
-
const { input, to, onError, onNull } =
|
|
397
|
+
const { input, to, onError, onNull } = exprObj.$convert;
|
|
395
398
|
const val = evaluateExpression(doc, input);
|
|
396
399
|
if (val === null || val === undefined)
|
|
397
400
|
return onNull !== undefined ? onNull : null;
|
|
@@ -403,34 +406,34 @@ function evaluateExpression(doc, expr) {
|
|
|
403
406
|
}
|
|
404
407
|
}
|
|
405
408
|
case "$toString": {
|
|
406
|
-
const val = evaluateExpression(doc,
|
|
409
|
+
const val = evaluateExpression(doc, exprObj.$toString);
|
|
407
410
|
return val !== null && val !== undefined ? String(val) : null;
|
|
408
411
|
}
|
|
409
412
|
case "$toInt": {
|
|
410
|
-
const val = evaluateExpression(doc,
|
|
413
|
+
const val = evaluateExpression(doc, exprObj.$toInt);
|
|
411
414
|
return val !== null && val !== undefined ? parseInt(val, 10) : null;
|
|
412
415
|
}
|
|
413
416
|
case "$toLong": {
|
|
414
|
-
const val = evaluateExpression(doc,
|
|
417
|
+
const val = evaluateExpression(doc, exprObj.$toLong);
|
|
415
418
|
return val !== null && val !== undefined ? parseInt(val, 10) : null;
|
|
416
419
|
}
|
|
417
420
|
case "$toDouble": {
|
|
418
|
-
const val = evaluateExpression(doc,
|
|
421
|
+
const val = evaluateExpression(doc, exprObj.$toDouble);
|
|
419
422
|
return val !== null && val !== undefined ? parseFloat(val) : null;
|
|
420
423
|
}
|
|
421
424
|
case "$toBool": {
|
|
422
|
-
const val = evaluateExpression(doc,
|
|
425
|
+
const val = evaluateExpression(doc, exprObj.$toBool);
|
|
423
426
|
return val !== null && val !== undefined ? Boolean(val) : null;
|
|
424
427
|
}
|
|
425
|
-
case "$toObjectId": return evaluateExpression(doc,
|
|
426
|
-
case "$toDecimal": return evaluateExpression(doc,
|
|
428
|
+
case "$toObjectId": return evaluateExpression(doc, exprObj.$toObjectId);
|
|
429
|
+
case "$toDecimal": return evaluateExpression(doc, exprObj.$toDecimal);
|
|
427
430
|
case "$isNumber": {
|
|
428
|
-
const val = evaluateExpression(doc,
|
|
431
|
+
const val = evaluateExpression(doc, exprObj.$isNumber);
|
|
429
432
|
return typeof val === "number" && !isNaN(val);
|
|
430
433
|
}
|
|
431
|
-
case "$isArray": return Array.isArray(evaluateExpression(doc,
|
|
434
|
+
case "$isArray": return Array.isArray(evaluateExpression(doc, exprObj.$isArray));
|
|
432
435
|
case "$setEquals": {
|
|
433
|
-
const sets =
|
|
436
|
+
const sets = exprObj.$setEquals.map((e) => evaluateExpression(doc, e));
|
|
434
437
|
const [first, ...rest] = sets;
|
|
435
438
|
const firstSet = new Set(first);
|
|
436
439
|
return rest.every((arr) => {
|
|
@@ -439,43 +442,43 @@ function evaluateExpression(doc, expr) {
|
|
|
439
442
|
});
|
|
440
443
|
}
|
|
441
444
|
case "$setIntersection": {
|
|
442
|
-
const sets =
|
|
445
|
+
const sets = exprObj.$setIntersection.map((e) => evaluateExpression(doc, e));
|
|
443
446
|
return sets.reduce((a, b) => a.filter(v => b.includes(v)));
|
|
444
447
|
}
|
|
445
448
|
case "$setUnion": {
|
|
446
|
-
const sets =
|
|
449
|
+
const sets = exprObj.$setUnion.map((e) => evaluateExpression(doc, e));
|
|
447
450
|
return [...new Set(sets.flat())];
|
|
448
451
|
}
|
|
449
452
|
case "$setDifference": {
|
|
450
|
-
const [a, b] =
|
|
453
|
+
const [a, b] = exprObj.$setDifference.map((e) => evaluateExpression(doc, e));
|
|
451
454
|
return a.filter((v) => !b.includes(v));
|
|
452
455
|
}
|
|
453
456
|
case "$setIsSubset": {
|
|
454
|
-
const [a, b] =
|
|
457
|
+
const [a, b] = exprObj.$setIsSubset.map((e) => evaluateExpression(doc, e));
|
|
455
458
|
return a.every((v) => b.includes(v));
|
|
456
459
|
}
|
|
457
460
|
case "$anyElementTrue": {
|
|
458
|
-
const arr = evaluateExpression(doc,
|
|
461
|
+
const arr = evaluateExpression(doc, exprObj.$anyElementTrue);
|
|
459
462
|
return Array.isArray(arr) && arr.some(v => Boolean(v));
|
|
460
463
|
}
|
|
461
464
|
case "$allElementsTrue": {
|
|
462
|
-
const arr = evaluateExpression(doc,
|
|
465
|
+
const arr = evaluateExpression(doc, exprObj.$allElementsTrue);
|
|
463
466
|
return Array.isArray(arr) && arr.every(v => Boolean(v));
|
|
464
467
|
}
|
|
465
|
-
case "$literal": return
|
|
468
|
+
case "$literal": return exprObj.$literal;
|
|
466
469
|
case "$getField": {
|
|
467
|
-
const { field, input } =
|
|
470
|
+
const { field, input } = exprObj.$getField;
|
|
468
471
|
const obj = input ? evaluateExpression(doc, input) : doc;
|
|
469
472
|
return obj ? obj[field] : undefined;
|
|
470
473
|
}
|
|
471
474
|
case "$mergeObjects": {
|
|
472
|
-
const sources = Array.isArray(
|
|
473
|
-
?
|
|
474
|
-
: [evaluateExpression(doc,
|
|
475
|
+
const sources = Array.isArray(exprObj.$mergeObjects)
|
|
476
|
+
? exprObj.$mergeObjects.map((e) => evaluateExpression(doc, e))
|
|
477
|
+
: [evaluateExpression(doc, exprObj.$mergeObjects)];
|
|
475
478
|
return Object.assign({}, ...sources.filter((s) => s !== null && typeof s === "object"));
|
|
476
479
|
}
|
|
477
480
|
case "$let": {
|
|
478
|
-
const { vars, in: inExpr } =
|
|
481
|
+
const { vars, in: inExpr } = exprObj.$let;
|
|
479
482
|
const context = Object.assign({}, doc);
|
|
480
483
|
for (const [varName, varExpr] of Object.entries(vars)) {
|
|
481
484
|
context[`$$${varName}`] = evaluateExpression(doc, varExpr);
|
|
@@ -486,7 +489,7 @@ function evaluateExpression(doc, expr) {
|
|
|
486
489
|
const { OperatorRegistry } = require("../OperatorRegistry");
|
|
487
490
|
const registered = OperatorRegistry.getOperator(op);
|
|
488
491
|
if (registered && registered.type === "expression") {
|
|
489
|
-
return registered.fn(doc,
|
|
492
|
+
return registered.fn(doc, exprObj[op]);
|
|
490
493
|
}
|
|
491
494
|
return expr;
|
|
492
495
|
}
|