remult 0.21.1 → 0.22.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.
Files changed (451) hide show
  1. package/README.md +47 -46
  2. package/SseSubscriptionServer.js +9 -9
  3. package/ably.js +1 -1
  4. package/esm/SseSubscriptionServer.js +11 -11
  5. package/esm/ably.js +2 -2
  6. package/esm/angular/interfaces/index.d.ts +1 -0
  7. package/esm/angular/interfaces/index.js +1 -0
  8. package/esm/angular/interfaces/src/column-collection.d.ts +70 -0
  9. package/esm/angular/interfaces/src/column-collection.js +341 -0
  10. package/esm/angular/interfaces/src/data-area-settings.d.ts +15 -0
  11. package/esm/angular/interfaces/src/data-area-settings.js +35 -0
  12. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +36 -0
  13. package/esm/angular/interfaces/src/data-control-interfaces.js +57 -0
  14. package/esm/angular/interfaces/src/dataList.d.ts +13 -0
  15. package/esm/angular/interfaces/src/dataList.js +42 -0
  16. package/esm/angular/interfaces/src/filter-helper.d.ts +13 -0
  17. package/esm/angular/interfaces/src/filter-helper.js +59 -0
  18. package/esm/angular/interfaces/src/grid-settings.d.ts +145 -0
  19. package/esm/angular/interfaces/src/grid-settings.js +387 -0
  20. package/esm/angular/interfaces/src/public_api.d.ts +4 -0
  21. package/esm/angular/interfaces/src/public_api.js +4 -0
  22. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +4 -0
  23. package/esm/angular/src/angular/RemultAngularPluginsService.js +3 -0
  24. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +49 -0
  25. package/esm/angular/src/angular/data-control/data-control2.component.js +138 -0
  26. package/esm/core/SseSubscriptionServer.d.ts +33 -0
  27. package/esm/core/SseSubscriptionServer.js +107 -0
  28. package/esm/core/assign.d.ts +1 -0
  29. package/esm/core/assign.js +5 -0
  30. package/esm/core/classType.d.ts +3 -0
  31. package/esm/core/classType.js +1 -0
  32. package/esm/core/index.d.ts +27 -0
  33. package/esm/core/index.js +25 -0
  34. package/esm/core/inputTypes.d.ts +9 -0
  35. package/esm/core/inputTypes.js +9 -0
  36. package/esm/core/live-query/data-provider-live-query-storage.d.ts +22 -0
  37. package/esm/core/live-query/data-provider-live-query-storage.js +71 -0
  38. package/esm/core/postgres/index.d.ts +2 -0
  39. package/esm/core/postgres/index.js +2 -0
  40. package/esm/core/postgres/postgres-data-provider.d.ts +36 -0
  41. package/esm/core/postgres/postgres-data-provider.js +120 -0
  42. package/esm/core/postgres/schema-builder.d.ts +17 -0
  43. package/esm/core/postgres/schema-builder.js +153 -0
  44. package/esm/core/remult-fresh.d.ts +17 -0
  45. package/esm/core/remult-fresh.js +29 -0
  46. package/esm/core/remult-knex/index.d.ts +30 -0
  47. package/esm/core/remult-knex/index.js +446 -0
  48. package/esm/core/remult-mongo.d.ts +24 -0
  49. package/esm/core/remult-mongo.js +254 -0
  50. package/esm/core/server/JsonEntityFileStorage.d.ts +10 -0
  51. package/esm/core/server/JsonEntityFileStorage.js +25 -0
  52. package/esm/core/server/core.d.ts +4 -0
  53. package/esm/core/server/core.js +4 -0
  54. package/esm/core/server/expressBridge.d.ts +182 -0
  55. package/esm/core/server/expressBridge.js +938 -0
  56. package/esm/core/server/index.d.ts +6 -0
  57. package/esm/core/server/index.js +9 -0
  58. package/esm/core/server/initAsyncHooks.d.ts +1 -0
  59. package/esm/core/server/initAsyncHooks.js +9 -0
  60. package/esm/core/server/initDataProvider.d.ts +2 -0
  61. package/esm/core/server/initDataProvider.js +14 -0
  62. package/esm/core/src/__EntityValueProvider.d.ts +11 -0
  63. package/esm/core/src/__EntityValueProvider.js +1 -0
  64. package/esm/core/src/__RowsOfDataForTesting.d.ts +3 -0
  65. package/esm/core/src/__RowsOfDataForTesting.js +1 -0
  66. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +6 -0
  67. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +147 -0
  68. package/esm/core/src/backend-tests/my-test.backend-spec.d.ts +1 -0
  69. package/esm/core/src/backend-tests/my-test.backend-spec.js +197 -0
  70. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +1 -0
  71. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +167 -0
  72. package/esm/core/src/buildRestDataProvider.d.ts +31 -0
  73. package/esm/core/src/buildRestDataProvider.js +113 -0
  74. package/esm/core/src/column-interfaces.d.ts +154 -0
  75. package/esm/core/src/column-interfaces.js +7 -0
  76. package/esm/core/src/column.d.ts +58 -0
  77. package/esm/core/src/column.js +174 -0
  78. package/esm/core/src/context.d.ts +134 -0
  79. package/esm/core/src/context.js +286 -0
  80. package/esm/core/src/data-api.d.ts +39 -0
  81. package/esm/core/src/data-api.js +279 -0
  82. package/esm/core/src/data-interfaces.d.ts +41 -0
  83. package/esm/core/src/data-interfaces.js +12 -0
  84. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +22 -0
  85. package/esm/core/src/data-providers/array-entity-data-provider.js +252 -0
  86. package/esm/core/src/data-providers/in-memory-database.d.ts +9 -0
  87. package/esm/core/src/data-providers/in-memory-database.js +14 -0
  88. package/esm/core/src/data-providers/json-data-provider.d.ts +12 -0
  89. package/esm/core/src/data-providers/json-data-provider.js +55 -0
  90. package/esm/core/src/data-providers/rest-data-provider.d.ts +49 -0
  91. package/esm/core/src/data-providers/rest-data-provider.js +256 -0
  92. package/esm/core/src/data-providers/sql-database.d.ts +33 -0
  93. package/esm/core/src/data-providers/sql-database.js +384 -0
  94. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +24 -0
  95. package/esm/core/src/data-providers/web-sql-data-provider.js +143 -0
  96. package/esm/core/src/entity.d.ts +91 -0
  97. package/esm/core/src/entity.js +1 -0
  98. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
  99. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +150 -0
  100. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
  101. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
  102. package/esm/core/src/filter/filter-interfaces.d.ts +85 -0
  103. package/esm/core/src/filter/filter-interfaces.js +477 -0
  104. package/esm/core/src/live-query/LiveQueryClient.d.ts +20 -0
  105. package/esm/core/src/live-query/LiveQueryClient.js +188 -0
  106. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +5 -0
  107. package/esm/core/src/live-query/SseSubscriptionClient.js +86 -0
  108. package/esm/core/src/live-query/SubscriptionChannel.d.ts +72 -0
  109. package/esm/core/src/live-query/SubscriptionChannel.js +123 -0
  110. package/esm/core/src/live-query/SubscriptionServer.d.ts +53 -0
  111. package/esm/core/src/live-query/SubscriptionServer.js +111 -0
  112. package/esm/core/src/live-query/live-query-tests.spec.d.ts +6 -0
  113. package/esm/core/src/live-query/live-query-tests.spec.js +952 -0
  114. package/esm/core/src/remult-proxy.d.ts +35 -0
  115. package/esm/core/src/remult-proxy.js +113 -0
  116. package/esm/core/src/remult3/DecoratorReplacer.d.ts +10 -0
  117. package/esm/core/src/remult3/DecoratorReplacer.js +20 -0
  118. package/esm/core/src/remult3/RepositoryImplementation.d.ts +355 -0
  119. package/esm/core/src/remult3/RepositoryImplementation.js +2109 -0
  120. package/esm/core/src/remult3/index.d.ts +2 -0
  121. package/esm/core/src/remult3/index.js +2 -0
  122. package/esm/core/src/remult3/remult3.d.ts +395 -0
  123. package/esm/core/src/remult3/remult3.js +2 -0
  124. package/esm/core/src/server-action.d.ts +81 -0
  125. package/esm/core/src/server-action.js +394 -0
  126. package/esm/core/src/shared-tests/db-tests-setup.d.ts +32 -0
  127. package/esm/core/src/shared-tests/db-tests-setup.js +78 -0
  128. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +25 -0
  129. package/esm/core/src/shared-tests/db-tests.db-tests.js +810 -0
  130. package/esm/core/src/shared-tests/deleteAll.d.ts +2 -0
  131. package/esm/core/src/shared-tests/deleteAll.js +4 -0
  132. package/esm/core/src/shared-tests/entityWithValidations.d.ts +14 -0
  133. package/esm/core/src/shared-tests/entityWithValidations.js +43 -0
  134. package/esm/core/src/shared-tests/index.d.ts +4 -0
  135. package/esm/core/src/shared-tests/index.js +4 -0
  136. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
  137. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +67 -0
  138. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +10 -0
  139. package/esm/core/src/shared-tests/test-special-value.spec.js +73 -0
  140. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
  141. package/esm/core/src/shared-tests/test-update-with-null.spec.js +31 -0
  142. package/esm/core/src/sort.d.ts +16 -0
  143. package/esm/core/src/sort.js +103 -0
  144. package/esm/core/src/sql-command.d.ts +19 -0
  145. package/esm/core/src/sql-command.js +1 -0
  146. package/esm/core/src/test.d.ts +3 -0
  147. package/esm/core/src/test.js +12 -0
  148. package/esm/core/src/tests/Done.d.ts +5 -0
  149. package/esm/core/src/tests/Done.js +9 -0
  150. package/esm/core/src/tests/RowProvider.spec.d.ts +16 -0
  151. package/esm/core/src/tests/RowProvider.spec.js +631 -0
  152. package/esm/core/src/tests/TestDataApiResponse.d.ts +10 -0
  153. package/esm/core/src/tests/TestDataApiResponse.js +22 -0
  154. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +8 -0
  155. package/esm/core/src/tests/basicRowFunctionality.spec.js +2103 -0
  156. package/esm/core/src/tests/c.d.ts +8 -0
  157. package/esm/core/src/tests/c.js +13 -0
  158. package/esm/core/src/tests/createData.d.ts +7 -0
  159. package/esm/core/src/tests/createData.js +22 -0
  160. package/esm/core/src/tests/d.d.ts +6 -0
  161. package/esm/core/src/tests/d.js +11 -0
  162. package/esm/core/src/tests/dWithPrefilter.d.ts +7 -0
  163. package/esm/core/src/tests/dWithPrefilter.js +18 -0
  164. package/esm/core/src/tests/entityForCustomFilter.d.ts +16 -0
  165. package/esm/core/src/tests/entityForCustomFilter.js +33 -0
  166. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
  167. package/esm/core/src/tests/entityWithValidationsOnColumn.js +13 -0
  168. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
  169. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +37 -0
  170. package/esm/core/src/tests/h.d.ts +6 -0
  171. package/esm/core/src/tests/h.js +24 -0
  172. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +1 -0
  173. package/esm/core/src/tests/remult-3-basic-tests.spec.js +236 -0
  174. package/esm/core/src/tests/remult-3-entities.d.ts +23 -0
  175. package/esm/core/src/tests/remult-3-entities.js +39 -0
  176. package/esm/core/src/tests/tasks.d.ts +6 -0
  177. package/esm/core/src/tests/tasks.js +10 -0
  178. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  179. package/esm/core/src/tests/test-context-as-storage.spec.js +1 -0
  180. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +1 -0
  181. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +389 -0
  182. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +5 -0
  183. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +152 -0
  184. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +1 -0
  185. package/esm/core/src/tests/test-decorator-precedence.spec.js +38 -0
  186. package/esm/core/src/tests/test-default-value.spec.d.ts +1 -0
  187. package/esm/core/src/tests/test-default-value.spec.js +33 -0
  188. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +14 -0
  189. package/esm/core/src/tests/test-entity-inheritance.spec.js +82 -0
  190. package/esm/core/src/tests/test-exceptions.spec.d.ts +1 -0
  191. package/esm/core/src/tests/test-exceptions.spec.js +375 -0
  192. package/esm/core/src/tests/test-json.spec.d.ts +1 -0
  193. package/esm/core/src/tests/test-json.spec.js +115 -0
  194. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +9 -0
  195. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +809 -0
  196. package/esm/core/src/tests/test-non-active-record.spec.d.ts +1 -0
  197. package/esm/core/src/tests/test-non-active-record.spec.js +66 -0
  198. package/esm/core/src/tests/test-object-column.spec.d.ts +1 -0
  199. package/esm/core/src/tests/test-object-column.spec.js +189 -0
  200. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +1 -0
  201. package/esm/core/src/tests/test-paged-foreach.spec.js +328 -0
  202. package/esm/core/src/tests/test-remult-angular.spec.d.ts +1 -0
  203. package/esm/core/src/tests/test-remult-angular.spec.js +23 -0
  204. package/esm/core/src/tests/test-server-controller.spec.d.ts +7 -0
  205. package/esm/core/src/tests/test-server-controller.spec.js +489 -0
  206. package/esm/core/src/tests/test-server-expressions.spec.d.ts +1 -0
  207. package/esm/core/src/tests/test-server-expressions.spec.js +178 -0
  208. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +1 -0
  209. package/esm/core/src/tests/test-server-method-on-entity.spec.js +306 -0
  210. package/esm/core/src/tests/test-sql-expression.spec.d.ts +5 -0
  211. package/esm/core/src/tests/test-sql-expression.spec.js +205 -0
  212. package/esm/core/src/tests/test-sql.spec.d.ts +1 -0
  213. package/esm/core/src/tests/test-sql.spec.js +170 -0
  214. package/esm/core/src/tests/test-subscribe.spec.d.ts +1 -0
  215. package/esm/core/src/tests/test-subscribe.spec.js +135 -0
  216. package/esm/core/src/tests/test-type-recovery.spec.d.ts +1 -0
  217. package/esm/core/src/tests/test-type-recovery.spec.js +49 -0
  218. package/esm/core/src/tests/test-where-api.spec.d.ts +1 -0
  219. package/esm/core/src/tests/test-where-api.spec.js +434 -0
  220. package/esm/core/src/tests/testHelper.spec.d.ts +36 -0
  221. package/esm/core/src/tests/testHelper.spec.js +226 -0
  222. package/esm/core/src/tests/testModel/models.d.ts +16 -0
  223. package/esm/core/src/tests/testModel/models.js +25 -0
  224. package/esm/core/src/validators.d.ts +14 -0
  225. package/esm/core/src/validators.js +33 -0
  226. package/esm/core/src/valueConverters.d.ts +13 -0
  227. package/esm/core/src/valueConverters.js +197 -0
  228. package/esm/core/urlBuilder.d.ts +6 -0
  229. package/esm/core/urlBuilder.js +20 -0
  230. package/esm/graphql.js +194 -73
  231. package/esm/index.d.ts +10 -10
  232. package/esm/index.js +8 -8
  233. package/esm/inputTypes.js +1 -1
  234. package/esm/live-query/data-provider-live-query-storage.d.ts +3 -3
  235. package/esm/live-query/data-provider-live-query-storage.js +12 -9
  236. package/esm/myLog.js +2 -2
  237. package/esm/postgres/postgres-data-provider.d.ts +2 -2
  238. package/esm/postgres/postgres-data-provider.js +20 -14
  239. package/esm/postgres/schema-builder.d.ts +1 -1
  240. package/esm/postgres/schema-builder.js +28 -21
  241. package/esm/remult-express.js +2 -2
  242. package/esm/remult-fastify.js +9 -7
  243. package/esm/remult-fresh.d.ts +1 -1
  244. package/esm/remult-fresh.js +5 -8
  245. package/esm/remult-knex/index.d.ts +4 -4
  246. package/esm/remult-knex/index.js +75 -59
  247. package/esm/remult-mongo.js +36 -27
  248. package/esm/remult-next.d.ts +3 -3
  249. package/esm/remult-next.js +17 -11
  250. package/esm/remult-sveltekit.js +10 -10
  251. package/esm/server/JsonEntityFileStorage.js +3 -1
  252. package/esm/server/core.d.ts +2 -2
  253. package/esm/server/core.js +2 -2
  254. package/esm/server/expressBridge.d.ts +3 -12
  255. package/esm/server/expressBridge.js +265 -278
  256. package/esm/server/index.d.ts +2 -2
  257. package/esm/server/index.js +5 -2
  258. package/esm/server/initAsyncHooks.js +1 -1
  259. package/esm/server/initDataProvider.js +1 -1
  260. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +1 -1
  261. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +47 -38
  262. package/esm/src/buildRestDataProvider.d.ts +1 -1
  263. package/esm/src/buildRestDataProvider.js +21 -13
  264. package/esm/src/column-interfaces.d.ts +9 -9
  265. package/esm/src/column.d.ts +4 -0
  266. package/esm/src/column.js +23 -11
  267. package/esm/src/context.d.ts +20 -8
  268. package/esm/src/context.js +65 -24
  269. package/esm/src/data-api.d.ts +0 -1
  270. package/esm/src/data-api.js +38 -37
  271. package/esm/src/data-interfaces.d.ts +1 -1
  272. package/esm/src/data-interfaces.js +1 -1
  273. package/esm/src/data-providers/array-entity-data-provider.js +9 -9
  274. package/esm/src/data-providers/in-memory-database.d.ts +1 -1
  275. package/esm/src/data-providers/in-memory-database.js +3 -1
  276. package/esm/src/data-providers/json-data-provider.js +8 -8
  277. package/esm/src/data-providers/rest-data-provider.d.ts +1 -1
  278. package/esm/src/data-providers/rest-data-provider.js +52 -36
  279. package/esm/src/data-providers/sql-database.d.ts +5 -5
  280. package/esm/src/data-providers/sql-database.js +53 -36
  281. package/esm/src/data-providers/web-sql-data-provider.d.ts +4 -4
  282. package/esm/src/data-providers/web-sql-data-provider.js +15 -13
  283. package/esm/src/entity.d.ts +24 -24
  284. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +4 -4
  285. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +35 -20
  286. package/esm/src/filter/filter-interfaces.d.ts +7 -7
  287. package/esm/src/filter/filter-interfaces.js +108 -88
  288. package/esm/src/live-query/LiveQueryClient.js +37 -29
  289. package/esm/src/live-query/SseSubscriptionClient.d.ts +1 -1
  290. package/esm/src/live-query/SseSubscriptionClient.js +14 -14
  291. package/esm/src/live-query/SubscriptionChannel.d.ts +3 -3
  292. package/esm/src/live-query/SubscriptionChannel.js +27 -25
  293. package/esm/src/live-query/SubscriptionServer.js +24 -20
  294. package/esm/src/remult-proxy.d.ts +1 -1
  295. package/esm/src/remult-proxy.js +87 -29
  296. package/esm/src/remult3/DecoratorReplacer.d.ts +2 -2
  297. package/esm/src/remult3/RepositoryImplementation.d.ts +51 -41
  298. package/esm/src/remult3/RepositoryImplementation.js +336 -206
  299. package/esm/src/remult3/remult3.d.ts +56 -51
  300. package/esm/src/remult3/remult3.js +0 -1
  301. package/esm/src/server-action.d.ts +12 -5
  302. package/esm/src/server-action.js +79 -53
  303. package/esm/src/shared-tests/db-tests-setup.d.ts +8 -8
  304. package/esm/src/shared-tests/db-tests-setup.js +10 -10
  305. package/esm/src/shared-tests/db-tests.db-tests.d.ts +1 -1
  306. package/esm/src/shared-tests/db-tests.db-tests.js +279 -177
  307. package/esm/src/shared-tests/deleteAll.d.ts +1 -1
  308. package/esm/src/shared-tests/deleteAll.js +1 -1
  309. package/esm/src/shared-tests/entityWithValidations.js +1 -1
  310. package/esm/src/shared-tests/test-custom-id-column.spec.js +4 -4
  311. package/esm/src/shared-tests/test-special-value.spec.js +12 -12
  312. package/esm/src/shared-tests/test-update-with-null.spec.js +10 -6
  313. package/esm/src/sort.d.ts +2 -2
  314. package/esm/src/sort.js +12 -10
  315. package/esm/src/tests/TestDataApiResponse.d.ts +1 -1
  316. package/esm/src/tests/TestDataApiResponse.js +3 -4
  317. package/esm/src/tests/createData.js +2 -2
  318. package/esm/src/tests/d.js +1 -1
  319. package/esm/src/tests/dWithPrefilter.js +1 -1
  320. package/esm/src/tests/entityForCustomFilter.d.ts +4 -4
  321. package/esm/src/tests/entityForCustomFilter.js +12 -4
  322. package/esm/src/tests/entityWithValidationsOnColumn.js +1 -1
  323. package/esm/src/tests/frontend-database-tests-setup.spec.d.ts +1 -1
  324. package/esm/src/tests/frontend-database-tests-setup.spec.js +14 -14
  325. package/esm/src/tests/h.js +4 -4
  326. package/esm/src/tests/remult-3-entities.d.ts +2 -2
  327. package/esm/src/tests/remult-3-entities.js +6 -6
  328. package/esm/src/tests/testHelper.spec.d.ts +7 -7
  329. package/esm/src/tests/testHelper.spec.js +50 -39
  330. package/esm/src/tests/testModel/models.js +4 -4
  331. package/esm/src/validators.d.ts +1 -1
  332. package/esm/src/validators.js +10 -7
  333. package/esm/src/valueConverters.d.ts +1 -1
  334. package/esm/src/valueConverters.js +68 -55
  335. package/esm/test-servers/shared/Task.d.ts +9 -0
  336. package/esm/test-servers/shared/Task.js +32 -0
  337. package/esm/test.d.ts +5 -0
  338. package/esm/test.js +6 -0
  339. package/graphql.js +157 -45
  340. package/index.d.ts +10 -10
  341. package/inputTypes.js +1 -1
  342. package/live-query/data-provider-live-query-storage.d.ts +3 -3
  343. package/live-query/data-provider-live-query-storage.js +7 -4
  344. package/myLog.js +2 -2
  345. package/package.json +2 -2
  346. package/postgres/postgres-data-provider.d.ts +2 -2
  347. package/postgres/postgres-data-provider.js +21 -16
  348. package/postgres/schema-builder.d.ts +1 -1
  349. package/postgres/schema-builder.js +22 -15
  350. package/remult-express.js +1 -1
  351. package/remult-fastify.js +7 -7
  352. package/remult-fresh.d.ts +1 -1
  353. package/remult-fresh.js +1 -4
  354. package/remult-knex/index.d.ts +4 -4
  355. package/remult-knex/index.js +50 -35
  356. package/remult-mongo.js +33 -23
  357. package/remult-next.d.ts +3 -3
  358. package/remult-next.js +15 -11
  359. package/remult-sveltekit.js +14 -15
  360. package/server/core.d.ts +2 -2
  361. package/server/expressBridge.d.ts +3 -12
  362. package/server/expressBridge.js +278 -279
  363. package/server/index.d.ts +2 -2
  364. package/server/index.js +5 -2
  365. package/server/initAsyncHooks.js +2 -2
  366. package/server/initDataProvider.js +1 -1
  367. package/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +1 -1
  368. package/src/backend-tests/backend-database-test-setup.backend-spec.js +40 -31
  369. package/src/buildRestDataProvider.d.ts +1 -1
  370. package/src/buildRestDataProvider.js +18 -10
  371. package/src/column-interfaces.d.ts +9 -9
  372. package/src/column.d.ts +4 -0
  373. package/src/column.js +20 -8
  374. package/src/context.d.ts +20 -8
  375. package/src/context.js +61 -18
  376. package/src/data-api.d.ts +0 -1
  377. package/src/data-api.js +40 -43
  378. package/src/data-interfaces.d.ts +1 -1
  379. package/src/data-providers/array-entity-data-provider.js +2 -2
  380. package/src/data-providers/in-memory-database.d.ts +1 -1
  381. package/src/data-providers/in-memory-database.js +3 -1
  382. package/src/data-providers/json-data-provider.js +33 -15
  383. package/src/data-providers/rest-data-provider.d.ts +1 -1
  384. package/src/data-providers/rest-data-provider.js +47 -32
  385. package/src/data-providers/sql-database.d.ts +5 -5
  386. package/src/data-providers/sql-database.js +41 -24
  387. package/src/data-providers/web-sql-data-provider.d.ts +4 -4
  388. package/src/data-providers/web-sql-data-provider.js +10 -8
  389. package/src/entity.d.ts +24 -24
  390. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +4 -4
  391. package/src/filter/filter-consumer-bridge-to-sql-request.js +34 -17
  392. package/src/filter/filter-interfaces.d.ts +7 -7
  393. package/src/filter/filter-interfaces.js +73 -47
  394. package/src/live-query/LiveQueryClient.js +35 -25
  395. package/src/live-query/SseSubscriptionClient.d.ts +1 -1
  396. package/src/live-query/SseSubscriptionClient.js +80 -76
  397. package/src/live-query/SubscriptionChannel.d.ts +3 -3
  398. package/src/live-query/SubscriptionChannel.js +26 -18
  399. package/src/live-query/SubscriptionServer.js +23 -17
  400. package/src/remult-proxy.d.ts +1 -1
  401. package/src/remult-proxy.js +84 -35
  402. package/src/remult3/DecoratorReplacer.d.ts +2 -2
  403. package/src/remult3/RepositoryImplementation.d.ts +51 -41
  404. package/src/remult3/RepositoryImplementation.js +402 -257
  405. package/src/remult3/remult3.d.ts +56 -51
  406. package/src/remult3/remult3.js +0 -1
  407. package/src/server-action.d.ts +12 -5
  408. package/src/server-action.js +78 -48
  409. package/src/shared-tests/db-tests-setup.d.ts +8 -8
  410. package/src/shared-tests/db-tests-setup.js +6 -6
  411. package/src/shared-tests/db-tests.db-tests.d.ts +1 -1
  412. package/src/shared-tests/db-tests.db-tests.js +350 -153
  413. package/src/shared-tests/deleteAll.d.ts +1 -1
  414. package/src/shared-tests/entityWithValidations.js +1 -1
  415. package/src/shared-tests/test-custom-id-column.spec.js +4 -4
  416. package/src/shared-tests/test-special-value.spec.js +9 -9
  417. package/src/shared-tests/test-update-with-null.spec.js +8 -4
  418. package/src/sort.d.ts +2 -2
  419. package/src/sort.js +9 -7
  420. package/src/tests/TestDataApiResponse.d.ts +1 -1
  421. package/src/tests/TestDataApiResponse.js +3 -4
  422. package/src/tests/createData.js +1 -1
  423. package/src/tests/d.js +1 -1
  424. package/src/tests/dWithPrefilter.js +1 -1
  425. package/src/tests/entityForCustomFilter.d.ts +4 -4
  426. package/src/tests/entityForCustomFilter.js +16 -6
  427. package/src/tests/entityWithValidationsOnColumn.js +1 -1
  428. package/src/tests/frontend-database-tests-setup.spec.d.ts +1 -1
  429. package/src/tests/frontend-database-tests-setup.spec.js +8 -8
  430. package/src/tests/h.js +3 -3
  431. package/src/tests/remult-3-entities.d.ts +2 -2
  432. package/src/tests/remult-3-entities.js +8 -4
  433. package/src/tests/testHelper.spec.d.ts +7 -7
  434. package/src/tests/testHelper.spec.js +38 -27
  435. package/src/tests/testModel/models.js +3 -3
  436. package/src/validators.d.ts +1 -1
  437. package/src/validators.js +18 -9
  438. package/src/valueConverters.d.ts +1 -1
  439. package/src/valueConverters.js +38 -21
  440. package/esm/remult-svletekit.d.ts +0 -3
  441. package/esm/remult-svletekit.js +0 -83
  442. package/esm/src/id-entity.d.ts +0 -4
  443. package/esm/src/id-entity.js +0 -8
  444. package/esm/src/remult3/getId.d.ts +0 -2
  445. package/esm/src/remult3/getId.js +0 -7
  446. package/postgres/getEntityTypescriptPostgres.d.ts +0 -1
  447. package/postgres/getEntityTypescriptPostgres.js +0 -125
  448. package/src/id-entity.d.ts +0 -4
  449. package/src/id-entity.js +0 -17
  450. package/src/remult3/getId.d.ts +0 -2
  451. package/src/remult3/getId.js +0 -11
@@ -1,10 +1,10 @@
1
- import { getEntityMetadata } from "../remult3";
2
- import { SqlDatabase } from "../data-providers/sql-database";
1
+ import { getEntityMetadata, } from '../remult3';
2
+ import { SqlDatabase } from '../data-providers/sql-database';
3
3
  export class FilterConsumerBridgeToSqlRequest {
4
4
  constructor(r, nameProvider) {
5
5
  this.r = r;
6
6
  this.nameProvider = nameProvider;
7
- this.where = "";
7
+ this.where = '';
8
8
  this._addWhere = true;
9
9
  this.promises = [];
10
10
  }
@@ -19,7 +19,7 @@ export class FilterConsumerBridgeToSqlRequest {
19
19
  return this.where;
20
20
  }
21
21
  custom(key, customItem) {
22
- throw new Error("Custom filter should be translated before it gets here");
22
+ throw new Error('Custom filter should be translated before it gets here');
23
23
  }
24
24
  or(orElements) {
25
25
  let statement = '';
@@ -33,16 +33,16 @@ export class FilterConsumerBridgeToSqlRequest {
33
33
  return; //since if any member of or is empty, then the entire or is irrelevant
34
34
  if (where.length > 0) {
35
35
  if (statement.length > 0) {
36
- statement += " or ";
36
+ statement += ' or ';
37
37
  }
38
38
  if (orElements.length > 1) {
39
- statement += "(" + where + ")";
39
+ statement += '(' + where + ')';
40
40
  }
41
41
  else
42
42
  statement += where;
43
43
  }
44
44
  }
45
- this.addToWhere("(" + statement + ")");
45
+ this.addToWhere('(' + statement + ')');
46
46
  })());
47
47
  }
48
48
  isNull(col) {
@@ -54,37 +54,50 @@ export class FilterConsumerBridgeToSqlRequest {
54
54
  isIn(col, val) {
55
55
  this.promises.push((async () => {
56
56
  if (val && val.length > 0)
57
- this.addToWhere(this.nameProvider.$dbNameOf(col) + " in (" + val.map(x => this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x))).join(",") + ")");
57
+ this.addToWhere(this.nameProvider.$dbNameOf(col) +
58
+ ' in (' +
59
+ val
60
+ .map((x) => this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x)))
61
+ .join(',') +
62
+ ')');
58
63
  else
59
64
  this.addToWhere('1 = 0 /*isIn with no values*/');
60
65
  })());
61
66
  }
62
67
  isEqualTo(col, val) {
63
- this.add(col, val, "=");
68
+ this.add(col, val, '=');
64
69
  }
65
70
  isDifferentFrom(col, val) {
66
- this.add(col, val, "<>");
71
+ this.add(col, val, '<>');
67
72
  }
68
73
  isGreaterOrEqualTo(col, val) {
69
- this.add(col, val, ">=");
74
+ this.add(col, val, '>=');
70
75
  }
71
76
  isGreaterThan(col, val) {
72
- this.add(col, val, ">");
77
+ this.add(col, val, '>');
73
78
  }
74
79
  isLessOrEqualTo(col, val) {
75
- this.add(col, val, "<=");
80
+ this.add(col, val, '<=');
76
81
  }
77
82
  isLessThan(col, val) {
78
- this.add(col, val, "<");
83
+ this.add(col, val, '<');
79
84
  }
80
85
  containsCaseInsensitive(col, val) {
81
86
  this.promises.push((async () => {
82
- this.addToWhere('lower (' + this.nameProvider.$dbNameOf(col) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')");
87
+ this.addToWhere('lower (' +
88
+ this.nameProvider.$dbNameOf(col) +
89
+ ") like lower ('%" +
90
+ val.replace(/'/g, "''") +
91
+ "%')");
83
92
  })());
84
93
  }
85
94
  add(col, val, operator) {
86
95
  this.promises.push((async () => {
87
- let x = this.nameProvider.$dbNameOf(col) + ' ' + operator + ' ' + this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
96
+ let x = this.nameProvider.$dbNameOf(col) +
97
+ ' ' +
98
+ operator +
99
+ ' ' +
100
+ this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
88
101
  this.addToWhere(x);
89
102
  })());
90
103
  }
@@ -103,7 +116,7 @@ export class FilterConsumerBridgeToSqlRequest {
103
116
  let item = new CustomSqlFilterBuilder(this.r);
104
117
  await databaseCustom.buildSql(item);
105
118
  if (item.sql) {
106
- this.addToWhere("(" + item.sql + ")");
119
+ this.addToWhere('(' + item.sql + ')');
107
120
  }
108
121
  }
109
122
  })());
@@ -124,7 +137,9 @@ export class CustomSqlFilterBuilder {
124
137
  }
125
138
  }
126
139
  export function isDbReadonly(field, dbNames) {
127
- return (field.dbReadOnly || field.isServerExpression || dbNames.$dbNameOf(field) != field.options.dbName);
140
+ return (field.dbReadOnly ||
141
+ field.isServerExpression ||
142
+ dbNames.$dbNameOf(field) != field.options.dbName);
128
143
  }
129
144
  export async function dbNamesOf(repo) {
130
145
  var meta = getEntityMetadata(repo);
@@ -133,12 +148,12 @@ export async function dbNamesOf(repo) {
133
148
  toString: () => result.$entityName,
134
149
  $dbNameOf: (field) => {
135
150
  var key;
136
- if (typeof field === "string")
151
+ if (typeof field === 'string')
137
152
  key = field;
138
153
  else
139
154
  key = field.key;
140
155
  return result[key];
141
- }
156
+ },
142
157
  };
143
158
  for (const field of meta.fields) {
144
159
  result[field.key] = await field.getDbName();
@@ -1,13 +1,13 @@
1
- import { FieldMetadata } from "../column-interfaces";
2
- import { Remult } from "../context";
3
- import { EntityMetadata, EntityFilter } from "../remult3";
1
+ import { FieldMetadata } from '../column-interfaces';
2
+ import { Remult } from '../context';
3
+ import { EntityMetadata, EntityFilter } from '../remult3';
4
4
  export declare class Filter {
5
5
  private apply?;
6
6
  constructor(apply?: (add: FilterConsumer) => void);
7
7
  __applyToConsumer(add: FilterConsumer): void;
8
8
  static resolve<entityType>(filter: EntityFilter<entityType> | (() => EntityFilter<entityType> | Promise<EntityFilter<entityType>>)): Promise<EntityFilter<entityType>>;
9
- static createCustom<entityType>(rawFilterTranslator: (unused: never, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) & rawFilterInfo<entityType>;
10
- static createCustom<entityType, argsType>(rawFilterTranslator: (args: argsType, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) & rawFilterInfo<entityType>;
9
+ static createCustom<entityType>(rawFilterTranslator: (unused: never, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) & customFilterInfo<entityType>;
10
+ static createCustom<entityType, argsType>(rawFilterTranslator: (args: argsType, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) & customFilterInfo<entityType>;
11
11
  static fromEntityFilter<T>(entity: EntityMetadata<T>, whereItem: EntityFilter<T>): Filter;
12
12
  toJson(): any;
13
13
  static entityFilterToJson<T>(entityDefs: EntityMetadata<T>, where: EntityFilter<T>): any;
@@ -77,9 +77,9 @@ export declare function entityFilterToJson<T>(entityDefs: EntityMetadata<T>, whe
77
77
  export declare function buildFilterFromRequestParameters(entity: EntityMetadata, filterInfo: {
78
78
  get: (key: string) => any;
79
79
  }): EntityFilter<any>;
80
- export interface rawFilterInfo<entityType> {
80
+ export interface customFilterInfo<entityType> {
81
81
  rawFilterInfo: {
82
82
  key: string;
83
- rawFilterTranslator: (args: any, r: Remult) => (EntityFilter<entityType> | Promise<EntityFilter<entityType>>);
83
+ rawFilterTranslator: (args: any, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>;
84
84
  };
85
85
  }
@@ -1,4 +1,4 @@
1
- import { getEntityRef, getEntitySettings } from "../remult3";
1
+ import { getEntityRef, getEntitySettings, } from '../remult3';
2
2
  export class Filter {
3
3
  constructor(apply) {
4
4
  this.apply = apply;
@@ -10,7 +10,7 @@ export class Filter {
10
10
  this.apply(add);
11
11
  }
12
12
  static async resolve(filter) {
13
- if (typeof filter === "function")
13
+ if (typeof filter === 'function')
14
14
  return await filter();
15
15
  return filter;
16
16
  }
@@ -21,9 +21,9 @@ export class Filter {
21
21
  if (x == undefined)
22
22
  x = {};
23
23
  if (!rawFilterInfo.key)
24
- throw "Usage of custom filter before a key was assigned to it";
24
+ throw 'Usage of custom filter before a key was assigned to it';
25
25
  return {
26
- [customUrlToken + rawFilterInfo.key]: x
26
+ [customUrlToken + rawFilterInfo.key]: x,
27
27
  };
28
28
  }, { rawFilterInfo });
29
29
  }
@@ -33,19 +33,19 @@ export class Filter {
33
33
  if (Object.prototype.hasOwnProperty.call(whereItem, key)) {
34
34
  let fieldToFilter = whereItem[key];
35
35
  {
36
- if (key == "$or") {
37
- result.push(new OrFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
36
+ if (key == '$or') {
37
+ result.push(new OrFilter(...fieldToFilter.map((x) => Filter.fromEntityFilter(entity, x))));
38
38
  }
39
- else if (key == "$and") {
40
- result.push(new AndFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
39
+ else if (key == '$and') {
40
+ result.push(new AndFilter(...fieldToFilter.map((x) => Filter.fromEntityFilter(entity, x))));
41
41
  }
42
42
  else if (key.startsWith(customUrlToken)) {
43
- result.push(new Filter(x => {
43
+ result.push(new Filter((x) => {
44
44
  x.custom(key.substring(customUrlToken.length), fieldToFilter);
45
45
  }));
46
46
  }
47
47
  else if (key == customDatabaseFilterToken) {
48
- result.push(new Filter(x => x.databaseCustom(fieldToFilter)));
48
+ result.push(new Filter((x) => x.databaseCustom(fieldToFilter)));
49
49
  }
50
50
  else {
51
51
  let fh = new filterHelper(entity.fields[key]);
@@ -57,29 +57,29 @@ export class Filter {
57
57
  if (Object.prototype.hasOwnProperty.call(fieldToFilter, key)) {
58
58
  const element = fieldToFilter[key];
59
59
  switch (key) {
60
- case "$gte":
61
- case ">=":
60
+ case '$gte':
61
+ case '>=':
62
62
  result.push(fh.isGreaterOrEqualTo(element));
63
63
  found = true;
64
64
  break;
65
- case "$gt":
66
- case ">":
65
+ case '$gt':
66
+ case '>':
67
67
  result.push(fh.isGreaterThan(element));
68
68
  found = true;
69
69
  break;
70
- case "$lte":
71
- case "<=":
70
+ case '$lte':
71
+ case '<=':
72
72
  result.push(fh.isLessOrEqualTo(element));
73
73
  found = true;
74
74
  break;
75
- case "$lt":
76
- case "<":
75
+ case '$lt':
76
+ case '<':
77
77
  result.push(fh.isLessThan(element));
78
78
  found = true;
79
79
  break;
80
- case "$ne":
81
- case "!=":
82
- case "$nin":
80
+ case '$ne':
81
+ case '!=':
82
+ case '$nin':
83
83
  found = true;
84
84
  if (Array.isArray(element)) {
85
85
  result.push(fh.isNotIn(element));
@@ -87,11 +87,11 @@ export class Filter {
87
87
  else
88
88
  result.push(fh.isDifferentFrom(element));
89
89
  break;
90
- case "$in":
90
+ case '$in':
91
91
  found = true;
92
92
  result.push(fh.isIn(element));
93
93
  break;
94
- case "$contains":
94
+ case '$contains':
95
95
  found = true;
96
96
  result.push(fh.contains(element));
97
97
  break;
@@ -121,14 +121,18 @@ export class Filter {
121
121
  return Filter.fromEntityFilter(entityDefs, where).toJson();
122
122
  }
123
123
  static entityFilterFromJson(entityDefs, packed) {
124
- return buildFilterFromRequestParameters(entityDefs, { get: (key) => packed[key] });
124
+ return buildFilterFromRequestParameters(entityDefs, {
125
+ get: (key) => packed[key],
126
+ });
125
127
  }
126
128
  static async translateCustomWhere(r, entity, remult) {
127
129
  let f = new customTranslator(async (filterKey, custom) => {
128
130
  let r = [];
129
131
  for (const key in entity.entityType) {
130
132
  const element = entity.entityType[key];
131
- if (element && element.rawFilterInfo && element.rawFilterInfo.rawFilterTranslator) {
133
+ if (element &&
134
+ element.rawFilterInfo &&
135
+ element.rawFilterInfo.rawFilterTranslator) {
132
136
  if (element.rawFilterInfo.key == filterKey) {
133
137
  r.push(await Filter.fromEntityFilter(entity, await element.rawFilterInfo.rawFilterTranslator(custom, remult)));
134
138
  }
@@ -138,7 +142,7 @@ export class Filter {
138
142
  });
139
143
  r.__applyToConsumer(f);
140
144
  await f.resolve();
141
- r = new Filter(x => f.applyTo(x));
145
+ r = new Filter((x) => f.applyTo(x));
142
146
  return r;
143
147
  }
144
148
  }
@@ -151,25 +155,25 @@ export class filterHelper {
151
155
  if (ei) {
152
156
  if (!val)
153
157
  return null;
154
- if (typeof val === "string" || typeof val === "number")
158
+ if (typeof val === 'string' || typeof val === 'number')
155
159
  return val;
156
160
  return getEntityRef(val).getId();
157
161
  }
158
162
  return val;
159
163
  }
160
164
  contains(val) {
161
- return new Filter(add => add.containsCaseInsensitive(this.metadata, val));
165
+ return new Filter((add) => add.containsCaseInsensitive(this.metadata, val));
162
166
  }
163
167
  isLessThan(val) {
164
168
  val = this.processVal(val);
165
- return new Filter(add => add.isLessThan(this.metadata, val));
169
+ return new Filter((add) => add.isLessThan(this.metadata, val));
166
170
  }
167
171
  isGreaterOrEqualTo(val) {
168
172
  val = this.processVal(val);
169
- return new Filter(add => add.isGreaterOrEqualTo(this.metadata, val));
173
+ return new Filter((add) => add.isGreaterOrEqualTo(this.metadata, val));
170
174
  }
171
175
  isNotIn(values) {
172
- return new Filter(add => {
176
+ return new Filter((add) => {
173
177
  for (const v of values) {
174
178
  add.isDifferentFrom(this.metadata, this.processVal(v));
175
179
  }
@@ -178,31 +182,31 @@ export class filterHelper {
178
182
  isDifferentFrom(val) {
179
183
  val = this.processVal(val);
180
184
  if ((val === null || val === undefined) && this.metadata.allowNull)
181
- return new Filter(add => add.isNotNull(this.metadata));
182
- return new Filter(add => add.isDifferentFrom(this.metadata, val));
185
+ return new Filter((add) => add.isNotNull(this.metadata));
186
+ return new Filter((add) => add.isDifferentFrom(this.metadata, val));
183
187
  }
184
188
  isLessOrEqualTo(val) {
185
189
  val = this.processVal(val);
186
- return new Filter(add => add.isLessOrEqualTo(this.metadata, val));
190
+ return new Filter((add) => add.isLessOrEqualTo(this.metadata, val));
187
191
  }
188
192
  isGreaterThan(val) {
189
193
  val = this.processVal(val);
190
- return new Filter(add => add.isGreaterThan(this.metadata, val));
194
+ return new Filter((add) => add.isGreaterThan(this.metadata, val));
191
195
  }
192
196
  isEqualTo(val) {
193
197
  val = this.processVal(val);
194
198
  if ((val === null || val === undefined) && this.metadata.allowNull)
195
- return new Filter(add => add.isNull(this.metadata));
196
- return new Filter(add => add.isEqualTo(this.metadata, val));
199
+ return new Filter((add) => add.isNull(this.metadata));
200
+ return new Filter((add) => add.isEqualTo(this.metadata, val));
197
201
  }
198
202
  isIn(val) {
199
- val = val.map(x => this.processVal(x));
200
- return new Filter(add => add.isIn(this.metadata, val));
203
+ val = val.map((x) => this.processVal(x));
204
+ return new Filter((add) => add.isIn(this.metadata, val));
201
205
  }
202
206
  }
203
207
  export class AndFilter extends Filter {
204
208
  constructor(...filters) {
205
- super(add => {
209
+ super((add) => {
206
210
  for (const iterator of this.filters) {
207
211
  if (iterator)
208
212
  iterator.__applyToConsumer(add);
@@ -216,8 +220,8 @@ export class AndFilter extends Filter {
216
220
  }
217
221
  export class OrFilter extends Filter {
218
222
  constructor(...filters) {
219
- super(add => {
220
- let f = this.filters.filter(x => x !== undefined);
223
+ super((add) => {
224
+ let f = this.filters.filter((x) => x !== undefined);
221
225
  if (f.length > 1) {
222
226
  add.or(f);
223
227
  }
@@ -227,17 +231,20 @@ export class OrFilter extends Filter {
227
231
  this.filters = filters;
228
232
  }
229
233
  }
230
- export const customUrlToken = "$custom$";
231
- export const customDatabaseFilterToken = "$db$";
234
+ export const customUrlToken = '$custom$';
235
+ export const customDatabaseFilterToken = '$db$';
236
+ const customArrayToken = '$an array';
232
237
  export class FilterSerializer {
233
238
  constructor() {
234
239
  this.result = {};
235
240
  this.hasUndefined = false;
236
241
  }
237
242
  databaseCustom(databaseCustom) {
238
- throw new Error("database custom is not allowed with api calls.");
243
+ throw new Error('database custom is not allowed with api calls.');
239
244
  }
240
245
  custom(key, customItem) {
246
+ if (Array.isArray(customItem))
247
+ customItem = { [customArrayToken]: customItem };
241
248
  this.add(customUrlToken + key, customItem);
242
249
  }
243
250
  add(key, val) {
@@ -257,20 +264,20 @@ export class FilterSerializer {
257
264
  r[key] = v;
258
265
  }
259
266
  or(orElements) {
260
- this.add("OR", orElements.map(x => {
267
+ this.add('OR', orElements.map((x) => {
261
268
  let f = new FilterSerializer();
262
269
  x.__applyToConsumer(f);
263
270
  return f.result;
264
271
  }));
265
272
  }
266
273
  isNull(col) {
267
- this.add(col.key + ".null", true);
274
+ this.add(col.key + '.null', true);
268
275
  }
269
276
  isNotNull(col) {
270
- this.add(col.key + ".null", false);
277
+ this.add(col.key + '.null', false);
271
278
  }
272
279
  isIn(col, val) {
273
- this.add(col.key + ".in", val.map(x => col.valueConverter.toJson(x)));
280
+ this.add(col.key + '.in', val.map((x) => col.valueConverter.toJson(x)));
274
281
  }
275
282
  isEqualTo(col, val) {
276
283
  this.add(col.key, col.valueConverter.toJson(val));
@@ -291,17 +298,17 @@ export class FilterSerializer {
291
298
  this.add(col.key + '.lt', col.valueConverter.toJson(val));
292
299
  }
293
300
  containsCaseInsensitive(col, val) {
294
- this.add(col.key + ".contains", val);
301
+ this.add(col.key + '.contains', val);
295
302
  }
296
303
  }
297
304
  export function entityFilterToJson(entityDefs, where) {
298
305
  if (!where)
299
306
  return {};
300
- return (Filter.fromEntityFilter(entityDefs, where)).toJson();
307
+ return Filter.fromEntityFilter(entityDefs, where).toJson();
301
308
  }
302
309
  export function buildFilterFromRequestParameters(entity, filterInfo) {
303
310
  let where = [];
304
- [...entity.fields].forEach(col => {
311
+ [...entity.fields].forEach((col) => {
305
312
  function addFilter(operation, theFilter, jsonArray = false, asString = false) {
306
313
  let val = filterInfo.get(col.key + operation);
307
314
  if (val !== undefined) {
@@ -313,7 +320,7 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
313
320
  arr = JSON.parse(val);
314
321
  else
315
322
  arr = val;
316
- theVal = arr.map(x => asString ? x : col.valueConverter.fromJson(x));
323
+ theVal = arr.map((x) => asString ? x : col.valueConverter.fromJson(x));
317
324
  }
318
325
  else {
319
326
  theVal = asString ? theVal : col.valueConverter.fromJson(theVal);
@@ -324,7 +331,7 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
324
331
  }
325
332
  };
326
333
  if (!jsonArray && val instanceof Array) {
327
- val.forEach(v => {
334
+ val.forEach((v) => {
328
335
  addFilter(v);
329
336
  });
330
337
  }
@@ -341,44 +348,57 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
341
348
  }
342
349
  }
343
350
  let c = new filterHelper(col);
344
- addFilter('', val => val);
345
- addFilter('.gt', val => ({ "$gt": val }));
346
- addFilter('.gte', val => ({ "$gte": val }));
347
- addFilter('.lt', val => ({ "$lt": val }));
348
- addFilter('.lte', val => ({ "$lte": val }));
349
- addFilter('.ne', val => ({ "$ne": val }));
350
- addFilter('.in', val => val, true);
351
- var nullFilter = filterInfo.get(col.key + ".null");
351
+ addFilter('', (val) => val);
352
+ addFilter('.gt', (val) => ({ $gt: val }));
353
+ addFilter('.gte', (val) => ({ $gte: val }));
354
+ addFilter('.lt', (val) => ({ $lt: val }));
355
+ addFilter('.lte', (val) => ({ $lte: val }));
356
+ addFilter('.ne', (val) => ({ $ne: val }));
357
+ addFilter('.in', (val) => val, true);
358
+ var nullFilter = filterInfo.get(col.key + '.null');
352
359
  if (nullFilter) {
353
360
  nullFilter = nullFilter.toString().trim().toLowerCase();
354
361
  switch (nullFilter) {
355
- case "y":
356
- case "true":
357
- case "yes":
362
+ case 'y':
363
+ case 'true':
364
+ case 'yes':
358
365
  where.push({ [col.key]: null });
359
366
  break;
360
367
  default:
361
- where.push({ [col.key]: { "$ne": null } });
368
+ where.push({ [col.key]: { $ne: null } });
362
369
  break;
363
370
  }
364
371
  }
365
- addFilter('.contains', val => ({ $contains: val }), false, true);
372
+ addFilter('.contains', (val) => ({ $contains: val }), false, true);
366
373
  });
367
374
  let val = filterInfo.get('OR');
368
375
  if (val) {
369
376
  const array = separateArrayFromInnerArray(val);
370
377
  where.push({
371
- $and: array.map(v => ({
372
- $or: v.map(x => buildFilterFromRequestParameters(entity, { get: (key) => x[key] }))
373
- }))
378
+ $and: array.map((v) => ({
379
+ $or: v.map((x) => buildFilterFromRequestParameters(entity, {
380
+ get: (key) => x[key],
381
+ })),
382
+ })),
374
383
  });
375
384
  }
376
385
  for (const key in entity.entityType) {
377
386
  const element = entity.entityType[key];
378
- if (element && element.rawFilterInfo && element.rawFilterInfo.rawFilterTranslator) {
387
+ if (element &&
388
+ element.rawFilterInfo &&
389
+ element.rawFilterInfo.rawFilterTranslator) {
379
390
  let custom = filterInfo.get(customUrlToken + key);
380
391
  if (custom !== undefined) {
381
- where.push({ [customUrlToken + key]: custom });
392
+ const addItem = (item) => {
393
+ if (item[customArrayToken] != undefined)
394
+ item = item[customArrayToken];
395
+ where.push({ [customUrlToken + key]: item });
396
+ };
397
+ if (Array.isArray(custom)) {
398
+ custom.forEach((item) => addItem(item));
399
+ }
400
+ else
401
+ addItem(custom);
382
402
  }
383
403
  }
384
404
  }
@@ -405,7 +425,7 @@ class customTranslator {
405
425
  this.promises = [];
406
426
  }
407
427
  applyTo(x) {
408
- this.commands.forEach(y => y(x));
428
+ this.commands.forEach((y) => y(x));
409
429
  }
410
430
  or(orElements) {
411
431
  let newOrElements;
@@ -413,54 +433,54 @@ class customTranslator {
413
433
  let c = new customTranslator(this.translateCustom);
414
434
  element.__applyToConsumer(c);
415
435
  await c.resolve();
416
- return new Filter(x => c.applyTo(x));
417
- })).then(x => {
436
+ return new Filter((x) => c.applyTo(x));
437
+ })).then((x) => {
418
438
  newOrElements = x;
419
439
  }));
420
- this.commands.push(x => x.or(newOrElements));
440
+ this.commands.push((x) => x.or(newOrElements));
421
441
  }
422
442
  isEqualTo(col, val) {
423
- this.commands.push(x => x.isEqualTo(col, val));
443
+ this.commands.push((x) => x.isEqualTo(col, val));
424
444
  }
425
445
  isDifferentFrom(col, val) {
426
- this.commands.push(x => x.isDifferentFrom(col, val));
446
+ this.commands.push((x) => x.isDifferentFrom(col, val));
427
447
  }
428
448
  isNull(col) {
429
- this.commands.push(x => x.isNull(col));
449
+ this.commands.push((x) => x.isNull(col));
430
450
  }
431
451
  isNotNull(col) {
432
- this.commands.push(x => x.isNotNull(col));
452
+ this.commands.push((x) => x.isNotNull(col));
433
453
  }
434
454
  isGreaterOrEqualTo(col, val) {
435
- this.commands.push(x => x.isGreaterOrEqualTo(col, val));
455
+ this.commands.push((x) => x.isGreaterOrEqualTo(col, val));
436
456
  }
437
457
  isGreaterThan(col, val) {
438
- this.commands.push(x => x.isGreaterThan(col, val));
458
+ this.commands.push((x) => x.isGreaterThan(col, val));
439
459
  }
440
460
  isLessOrEqualTo(col, val) {
441
- this.commands.push(x => x.isLessOrEqualTo(col, val));
461
+ this.commands.push((x) => x.isLessOrEqualTo(col, val));
442
462
  }
443
463
  isLessThan(col, val) {
444
- this.commands.push(x => x.isLessThan(col, val));
464
+ this.commands.push((x) => x.isLessThan(col, val));
445
465
  }
446
466
  containsCaseInsensitive(col, val) {
447
- this.commands.push(x => x.containsCaseInsensitive(col, val));
467
+ this.commands.push((x) => x.containsCaseInsensitive(col, val));
448
468
  }
449
469
  isIn(col, val) {
450
- this.commands.push(x => x.isIn(col, val));
470
+ this.commands.push((x) => x.isIn(col, val));
451
471
  }
452
472
  custom(key, customItem) {
453
473
  this.promises.push((async () => {
454
474
  let r = await this.translateCustom(key, customItem);
455
475
  if (r)
456
476
  if (Array.isArray(r))
457
- r.forEach(x => x.__applyToConsumer(this));
477
+ r.forEach((x) => x.__applyToConsumer(this));
458
478
  else
459
479
  r.__applyToConsumer(this);
460
480
  })());
461
481
  }
462
482
  databaseCustom(custom) {
463
- this.commands.push(x => x.databaseCustom(custom));
483
+ this.commands.push((x) => x.databaseCustom(custom));
464
484
  }
465
485
  async resolve() {
466
486
  while (this.promises.length > 0) {