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.
Files changed (228) hide show
  1. package/README.md +86 -9
  2. package/cli/VERSION +1 -1
  3. package/cli/cmd/auth_management.go +68 -0
  4. package/cli/cmd/document.go +33 -0
  5. package/cli/cmd/health.go +19 -0
  6. package/cli/cmd/transaction.go +191 -0
  7. package/cli/cmd/version.go +1 -1
  8. package/cli/pkg/commands/document.go +19 -0
  9. package/cli/pkg/commands/health.go +18 -0
  10. package/cli/pkg/commands/transaction.go +84 -0
  11. package/cli/pkg/httpclient/client.go +76 -0
  12. package/lib/Helper/Console.helper.js.map +1 -1
  13. package/lib/Helper/Converter.helper.d.ts +1 -1
  14. package/lib/Helper/Converter.helper.js +0 -1
  15. package/lib/Helper/Converter.helper.js.map +1 -1
  16. package/lib/Helper/DocumentLoader.helper.js +2 -1
  17. package/lib/Helper/DocumentLoader.helper.js.map +1 -1
  18. package/lib/Helper/Logger.helper.d.ts +5 -0
  19. package/lib/Helper/Logger.helper.js +45 -0
  20. package/lib/Helper/Logger.helper.js.map +1 -0
  21. package/lib/Helper/PathSanitizer.helper.js.map +1 -1
  22. package/lib/Helper/SortedIndexValues.helper.js.map +1 -1
  23. package/lib/Helper/UniqueGenerator.helper.js.map +1 -1
  24. package/lib/Helper/response.helper.d.ts +2 -2
  25. package/lib/Helper/response.helper.js +6 -3
  26. package/lib/Helper/response.helper.js.map +1 -1
  27. package/lib/Memory/memory.operation.d.ts +9 -4
  28. package/lib/Memory/memory.operation.js +3 -3
  29. package/lib/Memory/memory.operation.js.map +1 -1
  30. package/lib/Services/Aggregation/Aggregation.Operation.d.ts +1 -1
  31. package/lib/Services/Aggregation/Aggregation.Operation.js +0 -1
  32. package/lib/Services/Aggregation/Aggregation.Operation.js.map +1 -1
  33. package/lib/Services/Aggregation/OperatorRegistry.js.map +1 -1
  34. package/lib/Services/Aggregation/operators/accumulatorOperators.d.ts +12 -12
  35. package/lib/Services/Aggregation/operators/accumulatorOperators.js +2 -3
  36. package/lib/Services/Aggregation/operators/accumulatorOperators.js.map +1 -1
  37. package/lib/Services/Aggregation/operators/expressionOperators.d.ts +3 -3
  38. package/lib/Services/Aggregation/operators/expressionOperators.js +111 -108
  39. package/lib/Services/Aggregation/operators/expressionOperators.js.map +1 -1
  40. package/lib/Services/Aggregation/operators/stageOperators.d.ts +20 -37
  41. package/lib/Services/Aggregation/operators/stageOperators.js +11 -11
  42. package/lib/Services/Aggregation/operators/stageOperators.js.map +1 -1
  43. package/lib/Services/Auth/AuthEvents.service.js.map +1 -1
  44. package/lib/Services/Auth/AuthSeeder.service.js +2 -2
  45. package/lib/Services/Auth/AuthSeeder.service.js.map +1 -1
  46. package/lib/Services/Auth/AuthService.service.js +5 -8
  47. package/lib/Services/Auth/AuthService.service.js.map +1 -1
  48. package/lib/Services/Auth/ConfigDatabase.service.js.map +1 -1
  49. package/lib/Services/Auth/CookieCodec.helper.js.map +1 -1
  50. package/lib/Services/Auth/LoginRateLimiter.service.js.map +1 -1
  51. package/lib/Services/Auth/PasswordHasher.helper.js.map +1 -1
  52. package/lib/Services/Auth/PermissionChecker.helper.js.map +1 -1
  53. package/lib/Services/Auth/SessionStore.service.js.map +1 -1
  54. package/lib/Services/CRUD Operation/Create.operation.js +0 -1
  55. package/lib/Services/CRUD Operation/Create.operation.js.map +1 -1
  56. package/lib/Services/CRUD Operation/Delete.operation.d.ts +2 -2
  57. package/lib/Services/CRUD Operation/Delete.operation.js +2 -3
  58. package/lib/Services/CRUD Operation/Delete.operation.js.map +1 -1
  59. package/lib/Services/CRUD Operation/Reader.operation.d.ts +11 -3
  60. package/lib/Services/CRUD Operation/Reader.operation.js +76 -40
  61. package/lib/Services/CRUD Operation/Reader.operation.js.map +1 -1
  62. package/lib/Services/CRUD Operation/Update.operation.d.ts +4 -4
  63. package/lib/Services/CRUD Operation/Update.operation.js +2 -2
  64. package/lib/Services/CRUD Operation/Update.operation.js.map +1 -1
  65. package/lib/Services/Collection/collection.operation.d.ts +10 -3
  66. package/lib/Services/Collection/collection.operation.js +32 -7
  67. package/lib/Services/Collection/collection.operation.js.map +1 -1
  68. package/lib/Services/Database/database.operation.js +13 -9
  69. package/lib/Services/Database/database.operation.js.map +1 -1
  70. package/lib/Services/Index/Index.service.d.ts +1 -1
  71. package/lib/Services/Index/Index.service.js +1 -1
  72. package/lib/Services/Index/Index.service.js.map +1 -1
  73. package/lib/Services/Index/IndexCache.service.js +4 -5
  74. package/lib/Services/Index/IndexCache.service.js.map +1 -1
  75. package/lib/Services/Index/ReadIndex.service.d.ts +4 -4
  76. package/lib/Services/Index/ReadIndex.service.js +10 -9
  77. package/lib/Services/Index/ReadIndex.service.js.map +1 -1
  78. package/lib/Services/Indexation.operation.d.ts +1 -1
  79. package/lib/Services/Indexation.operation.js +7 -6
  80. package/lib/Services/Indexation.operation.js.map +1 -1
  81. package/lib/Services/Transaction/LockManager.service.js +3 -4
  82. package/lib/Services/Transaction/LockManager.service.js.map +1 -1
  83. package/lib/Services/Transaction/Session.service.js +9 -7
  84. package/lib/Services/Transaction/Session.service.js.map +1 -1
  85. package/lib/Services/Transaction/Transaction.service.d.ts +4 -2
  86. package/lib/Services/Transaction/Transaction.service.js +7 -2
  87. package/lib/Services/Transaction/Transaction.service.js.map +1 -1
  88. package/lib/Services/Transaction/TransactionIndexManager.service.d.ts +1 -1
  89. package/lib/Services/Transaction/TransactionIndexManager.service.js +11 -6
  90. package/lib/Services/Transaction/TransactionIndexManager.service.js.map +1 -1
  91. package/lib/Services/Transaction/TransactionRegistry.service.js.map +1 -1
  92. package/lib/Services/Transaction/WriteAheadLog.service.js +0 -1
  93. package/lib/Services/Transaction/WriteAheadLog.service.js.map +1 -1
  94. package/lib/client/AggregationProxy.js.map +1 -1
  95. package/lib/client/AxioDBCloud.client.d.ts +15 -2
  96. package/lib/client/AxioDBCloud.client.js +24 -2
  97. package/lib/client/AxioDBCloud.client.js.map +1 -1
  98. package/lib/client/CollectionProxy.d.ts +8 -0
  99. package/lib/client/CollectionProxy.js +26 -0
  100. package/lib/client/CollectionProxy.js.map +1 -1
  101. package/lib/client/DatabaseProxy.js.map +1 -1
  102. package/lib/client/DeleteOperationProxy.js.map +1 -1
  103. package/lib/client/PooledConnection.d.ts +1 -1
  104. package/lib/client/PooledConnection.js +6 -3
  105. package/lib/client/PooledConnection.js.map +1 -1
  106. package/lib/client/ReaderProxy.d.ts +3 -1
  107. package/lib/client/ReaderProxy.js +7 -0
  108. package/lib/client/ReaderProxy.js.map +1 -1
  109. package/lib/client/TransactionProxy.d.ts +37 -0
  110. package/lib/client/TransactionProxy.js +101 -0
  111. package/lib/client/TransactionProxy.js.map +1 -0
  112. package/lib/client/UpdateOperationProxy.js.map +1 -1
  113. package/lib/client/types/client.types.js.map +1 -1
  114. package/lib/config/DB.js.map +1 -1
  115. package/lib/config/Interfaces/Helper/response.helper.interface.d.ts +2 -2
  116. package/lib/config/Interfaces/Helper/response.helper.interface.js +0 -1
  117. package/lib/config/Interfaces/Helper/response.helper.interface.js.map +1 -1
  118. package/lib/config/Interfaces/Operation/aggregation.interface.d.ts +4 -4
  119. package/lib/config/Interfaces/Operation/aggregation.interface.js +0 -1
  120. package/lib/config/Interfaces/Operation/aggregation.interface.js.map +1 -1
  121. package/lib/config/Interfaces/Operation/database.operation.interface.d.ts +4 -1
  122. package/lib/config/Interfaces/Operation/database.operation.interface.js +0 -1
  123. package/lib/config/Interfaces/Operation/database.operation.interface.js.map +1 -1
  124. package/lib/config/Interfaces/Transaction/transaction.interface.d.ts +3 -3
  125. package/lib/config/Interfaces/shared.types.d.ts +36 -0
  126. package/lib/config/Interfaces/shared.types.js +7 -0
  127. package/lib/config/Interfaces/shared.types.js.map +1 -0
  128. package/lib/config/Keys/Keys.js.map +1 -1
  129. package/lib/config/Keys/Permissions.js.map +1 -1
  130. package/lib/config/Keys/StatusCode.js.map +1 -1
  131. package/lib/engine/Filesystem/FileManager.js +3 -4
  132. package/lib/engine/Filesystem/FileManager.js.map +1 -1
  133. package/lib/engine/Filesystem/FolderManager.js +11 -11
  134. package/lib/engine/Filesystem/FolderManager.js.map +1 -1
  135. package/lib/engine/cli/worker_process.js.map +1 -1
  136. package/lib/engine/node/WorkerForDataLoad.engine.js +7 -6
  137. package/lib/engine/node/WorkerForDataLoad.engine.js.map +1 -1
  138. package/lib/engine/node/WorkerForSearch.engine.js +0 -1
  139. package/lib/engine/node/WorkerForSearch.engine.js.map +1 -1
  140. package/lib/server/config/PortFreeChecker.js +0 -1
  141. package/lib/server/config/PortFreeChecker.js.map +1 -1
  142. package/lib/server/config/keys.js +0 -1
  143. package/lib/server/config/keys.js.map +1 -1
  144. package/lib/server/config/server.js +2 -2
  145. package/lib/server/config/server.js.map +1 -1
  146. package/lib/server/controller/Auth/Auth.controller.js.map +1 -1
  147. package/lib/server/controller/Auth/RoleManagement.controller.js.map +1 -1
  148. package/lib/server/controller/Auth/UserManagement.controller.js.map +1 -1
  149. package/lib/server/controller/Collections/Collection.controller.js +9 -7
  150. package/lib/server/controller/Collections/Collection.controller.js.map +1 -1
  151. package/lib/server/controller/Database/Databse.controller.js +12 -13
  152. package/lib/server/controller/Database/Databse.controller.js.map +1 -1
  153. package/lib/server/controller/Index/Index.controller.js +4 -3
  154. package/lib/server/controller/Index/Index.controller.js.map +1 -1
  155. package/lib/server/controller/Operation/CRUD.controller.d.ts +1 -0
  156. package/lib/server/controller/Operation/CRUD.controller.js +42 -18
  157. package/lib/server/controller/Operation/CRUD.controller.js.map +1 -1
  158. package/lib/server/controller/Stats.controller.js +21 -15
  159. package/lib/server/controller/Stats.controller.js.map +1 -1
  160. package/lib/server/helper/databaseImport.helper.js.map +1 -1
  161. package/lib/server/helper/documentCounterInFolder.helper.js.map +1 -1
  162. package/lib/server/helper/responseBuilder.helper.d.ts +2 -2
  163. package/lib/server/helper/responseBuilder.helper.js.map +1 -1
  164. package/lib/server/middleware/auth.middleware.js.map +1 -1
  165. package/lib/server/middleware/permission.middleware.js.map +1 -1
  166. package/lib/server/router/Router.js +8 -7
  167. package/lib/server/router/Router.js.map +1 -1
  168. package/lib/server/router/Routers/Auth.routes.js.map +1 -1
  169. package/lib/server/router/Routers/Collection.routes.js +3 -3
  170. package/lib/server/router/Routers/Collection.routes.js.map +1 -1
  171. package/lib/server/router/Routers/DB.routes.js +1 -1
  172. package/lib/server/router/Routers/DB.routes.js.map +1 -1
  173. package/lib/server/router/Routers/Index.routes.js.map +1 -1
  174. package/lib/server/router/Routers/Operation.routes.js +25 -10
  175. package/lib/server/router/Routers/Operation.routes.js.map +1 -1
  176. package/lib/server/router/Routers/RoleManagement.routes.js.map +1 -1
  177. package/lib/server/router/Routers/UserManagement.routes.js.map +1 -1
  178. package/lib/tcp/config/keys.d.ts +32 -32
  179. package/lib/tcp/config/keys.js.map +1 -1
  180. package/lib/tcp/config/permissions.d.ts +1 -4
  181. package/lib/tcp/config/permissions.js +8 -4
  182. package/lib/tcp/config/permissions.js.map +1 -1
  183. package/lib/tcp/config/protocol.d.ts +3 -3
  184. package/lib/tcp/config/protocol.js +31 -9
  185. package/lib/tcp/config/protocol.js.map +1 -1
  186. package/lib/tcp/config/server.js +17 -12
  187. package/lib/tcp/config/server.js.map +1 -1
  188. package/lib/tcp/connection/ConnectionManager.js.map +1 -1
  189. package/lib/tcp/connection/ConnectionRateLimiter.js.map +1 -1
  190. package/lib/tcp/connection/RequestContext.d.ts +2 -2
  191. package/lib/tcp/connection/RequestContext.js.map +1 -1
  192. package/lib/tcp/connection/TransactionManager.d.ts +26 -0
  193. package/lib/tcp/connection/TransactionManager.js +114 -0
  194. package/lib/tcp/connection/TransactionManager.js.map +1 -0
  195. package/lib/tcp/handler/CommandHandler.d.ts +3 -0
  196. package/lib/tcp/handler/CommandHandler.js +32 -8
  197. package/lib/tcp/handler/CommandHandler.js.map +1 -1
  198. package/lib/tcp/handler/handlers/Auth.handler.d.ts +4 -2
  199. package/lib/tcp/handler/handlers/Auth.handler.js.map +1 -1
  200. package/lib/tcp/handler/handlers/Collection.handler.d.ts +7 -5
  201. package/lib/tcp/handler/handlers/Collection.handler.js +1 -3
  202. package/lib/tcp/handler/handlers/Collection.handler.js.map +1 -1
  203. package/lib/tcp/handler/handlers/DB.handler.d.ts +6 -4
  204. package/lib/tcp/handler/handlers/DB.handler.js +1 -2
  205. package/lib/tcp/handler/handlers/DB.handler.js.map +1 -1
  206. package/lib/tcp/handler/handlers/Operation.handler.d.ts +19 -57
  207. package/lib/tcp/handler/handlers/Operation.handler.js +138 -167
  208. package/lib/tcp/handler/handlers/Operation.handler.js.map +1 -1
  209. package/lib/tcp/handler/handlers/Transaction.handler.d.ts +18 -0
  210. package/lib/tcp/handler/handlers/Transaction.handler.js +199 -0
  211. package/lib/tcp/handler/handlers/Transaction.handler.js.map +1 -0
  212. package/lib/tcp/types/command.types.d.ts +6 -1
  213. package/lib/tcp/types/command.types.js +11 -1
  214. package/lib/tcp/types/command.types.js.map +1 -1
  215. package/lib/tcp/types/protocol.types.d.ts +10 -7
  216. package/lib/tcp/types/protocol.types.js.map +1 -1
  217. package/lib/utility/BufferLoaderWithWorker.utils.js +6 -5
  218. package/lib/utility/BufferLoaderWithWorker.utils.js.map +1 -1
  219. package/lib/utility/Searcher.utils.d.ts +3 -7
  220. package/lib/utility/Searcher.utils.js +49 -49
  221. package/lib/utility/Searcher.utils.js.map +1 -1
  222. package/lib/utility/SortData.utils.d.ts +3 -2
  223. package/lib/utility/SortData.utils.js +3 -19
  224. package/lib/utility/SortData.utils.js.map +1 -1
  225. package/lib/utility/ZipUnzip.utils.d.ts +2 -2
  226. package/lib/utility/ZipUnzip.utils.js +2 -2
  227. package/lib/utility/ZipUnzip.utils.js.map +1 -1
  228. 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, expr.$add, (a, b) => a + b);
49
- case "$subtract": return evaluateArithmetic(doc, expr.$subtract, (a, b) => a - b);
50
- case "$multiply": return evaluateArithmetic(doc, expr.$multiply, (a, b) => a * b);
51
- case "$divide": return evaluateArithmetic(doc, expr.$divide, (a, b) => a / b);
52
- case "$mod": return evaluateArithmetic(doc, expr.$mod, (a, b) => a % b);
53
- case "$abs": return Math.abs(evaluateExpression(doc, expr.$abs));
54
- case "$ceil": return Math.ceil(evaluateExpression(doc, expr.$ceil));
55
- case "$floor": return Math.floor(evaluateExpression(doc, expr.$floor));
56
- case "$sqrt": return Math.sqrt(evaluateExpression(doc, expr.$sqrt));
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] = expr.$pow.map((e) => evaluateExpression(doc, e));
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, expr.$log));
62
- case "$log10": return Math.log10(evaluateExpression(doc, expr.$log10));
63
- case "$exp": return Math.exp(evaluateExpression(doc, expr.$exp));
64
- case "$trunc": return Math.trunc(evaluateExpression(doc, expr.$trunc));
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 = expr.$round;
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 expr.$concat.map(e => {
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] = expr.$substr.map((e) => evaluateExpression(doc, e));
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] = expr.$substrBytes.map((e) => evaluateExpression(doc, e));
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, expr.$strLen)).length;
89
- case "$strLenBytes": return Buffer.byteLength(String(evaluateExpression(doc, expr.$strLenBytes)));
90
- case "$toLower": return String(evaluateExpression(doc, expr.$toLower)).toLowerCase();
91
- case "$toUpper": return String(evaluateExpression(doc, expr.$toUpper)).toUpperCase();
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 = expr.$trim;
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 = expr.$ltrim;
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 = expr.$rtrim;
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 = expr.$indexOfBytes;
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] = expr.$split.map((e) => evaluateExpression(doc, e));
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 = expr.$replaceOne;
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 = expr.$replaceAll;
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 = expr.$regexMatch;
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] = expr.$cmp.map((e) => evaluateExpression(doc, e));
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] = expr.$eq.map((e) => evaluateExpression(doc, e));
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] = expr.$gt.map((e) => evaluateExpression(doc, e));
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] = expr.$gte.map((e) => evaluateExpression(doc, e));
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] = expr.$lt.map((e) => evaluateExpression(doc, e));
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] = expr.$lte.map((e) => evaluateExpression(doc, e));
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] = expr.$ne.map((e) => evaluateExpression(doc, e));
184
+ const [a, b] = exprObj.$ne.map((e) => evaluateExpression(doc, e));
185
185
  return a !== b;
186
186
  }
187
- case "$and": return expr.$and.every(e => evaluateExpression(doc, e));
188
- case "$or": return expr.$or.some(e => evaluateExpression(doc, e));
189
- case "$not": return !evaluateExpression(doc, expr.$not[0]);
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
- if (Array.isArray(expr.$cond)) {
192
- const [condition, thenVal, elseVal] = expr.$cond;
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 } = expr.$cond;
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] = expr.$ifNull;
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 branches = expr.$switch.branches;
205
- const defaultVal = expr.$switch.default;
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] = expr.$arrayElemAt.map((e) => evaluateExpression(doc, e));
215
+ const [arr, idx] = exprObj.$arrayElemAt.map((e) => evaluateExpression(doc, e));
214
216
  if (!Array.isArray(arr))
215
217
  return undefined;
216
- return arr[idx < 0 ? arr.length + idx : idx];
218
+ const idxNum = idx;
219
+ return arr[idxNum < 0 ? arr.length + idxNum : idxNum];
217
220
  }
218
221
  case "$arrayToObject": {
219
- const arr = evaluateExpression(doc, expr.$arrayToObject);
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 = expr.$concatArrays.map((e) => evaluateExpression(doc, e));
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 } = expr.$filter;
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, expr.$first);
244
- case "$last": return evaluateExpression(doc, expr.$last);
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, expr.$size);
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 = expr.$slice;
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 } = expr.$map;
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 } = expr.$reduce;
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 = expr.$reduce.as || "this";
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 = expr.$range.map((e) => evaluateExpression(doc, e));
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 } = expr.$zip;
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] = expr.$in.map((e) => evaluateExpression(doc, e));
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] = expr.$indexOfArray.map((e) => evaluateExpression(doc, e));
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, expr.$reverseArray);
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 } = expr.$sortArray;
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, expr.$year)).getFullYear();
329
- case "$month": return new Date(evaluateExpression(doc, expr.$month)).getMonth() + 1;
330
- case "$dayOfMonth": return new Date(evaluateExpression(doc, expr.$dayOfMonth)).getDate();
331
- case "$hour": return new Date(evaluateExpression(doc, expr.$hour)).getHours();
332
- case "$minute": return new Date(evaluateExpression(doc, expr.$minute)).getMinutes();
333
- case "$second": return new Date(evaluateExpression(doc, expr.$second)).getSeconds();
334
- case "$millisecond": return new Date(evaluateExpression(doc, expr.$millisecond)).getMilliseconds();
335
- case "$dayOfWeek": return new Date(evaluateExpression(doc, expr.$dayOfWeek)).getDay() + 1;
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, expr.$dayOfYear));
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, expr.$week)));
344
+ case "$week": return getISOWeek(new Date(evaluateExpression(doc, exprObj.$week)));
342
345
  case "$isoDayOfWeek": {
343
- const day = new Date(evaluateExpression(doc, expr.$isoDayOfWeek)).getDay();
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, expr.$isoWeekYear)));
349
+ case "$isoWeekYear": return getISOWeekYear(new Date(evaluateExpression(doc, exprObj.$isoWeekYear)));
347
350
  case "$dateToString": {
348
- const { format, date, onNull } = expr.$dateToString;
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 } = expr.$dateFromString;
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 } = expr.$dateDiff;
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 } = expr.$dateAdd;
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 } = expr.$dateSubtract;
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, expr.$toDate));
381
+ case "$toDate": return new Date(evaluateExpression(doc, exprObj.$toDate));
379
382
  case "$type": {
380
- const val = evaluateExpression(doc, expr.$type);
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 } = expr.$convert;
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, expr.$toString);
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, expr.$toInt);
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, expr.$toLong);
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, expr.$toDouble);
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, expr.$toBool);
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, expr.$toObjectId);
426
- case "$toDecimal": return evaluateExpression(doc, expr.$toDecimal);
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, expr.$isNumber);
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, expr.$isArray));
434
+ case "$isArray": return Array.isArray(evaluateExpression(doc, exprObj.$isArray));
432
435
  case "$setEquals": {
433
- const sets = expr.$setEquals.map((e) => evaluateExpression(doc, e));
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 = expr.$setIntersection.map((e) => evaluateExpression(doc, e));
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 = expr.$setUnion.map((e) => evaluateExpression(doc, e));
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] = expr.$setDifference.map((e) => evaluateExpression(doc, e));
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] = expr.$setIsSubset.map((e) => evaluateExpression(doc, e));
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, expr.$anyElementTrue);
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, expr.$allElementsTrue);
465
+ const arr = evaluateExpression(doc, exprObj.$allElementsTrue);
463
466
  return Array.isArray(arr) && arr.every(v => Boolean(v));
464
467
  }
465
- case "$literal": return expr.$literal;
468
+ case "$literal": return exprObj.$literal;
466
469
  case "$getField": {
467
- const { field, input } = expr.$getField;
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(expr.$mergeObjects)
473
- ? expr.$mergeObjects.map((e) => evaluateExpression(doc, e))
474
- : [evaluateExpression(doc, expr.$mergeObjects)];
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 } = expr.$let;
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, expr[op]);
492
+ return registered.fn(doc, exprObj[op]);
490
493
  }
491
494
  return expr;
492
495
  }