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
@@ -0,0 +1,489 @@
1
+ import { ActionTestConfig, testAsIfOnBackend } from './testHelper.spec';
2
+ import { Remult, isBackend } from '../context';
3
+ import { prepareArgsToSend, Controller, BackendMethod } from '../server-action';
4
+ import { Field, Entity, getFields, ValueListFieldType, Fields, IdEntity } from '../remult3';
5
+ import { remult, RemultProxy } from '../remult-proxy';
6
+ import { describeClass } from '../remult3/DecoratorReplacer';
7
+ import { InMemoryDataProvider } from '../data-providers/in-memory-database';
8
+ @ValueListFieldType()
9
+ export class myType {
10
+ what;
11
+ static x = new myType((n) => 'x' + n);
12
+ static y = new myType((n) => 'y' + n);
13
+ id;
14
+ constructor(what) {
15
+ this.what = what;
16
+ }
17
+ }
18
+ @Entity('testEntity')
19
+ class testEntity extends IdEntity {
20
+ @Fields.string()
21
+ name;
22
+ @BackendMethod({ allowed: false })
23
+ async forbidden() {
24
+ }
25
+ }
26
+ @Controller('1')
27
+ class testBasics {
28
+ remult;
29
+ constructor(remult) {
30
+ this.remult = remult;
31
+ }
32
+ @Fields.date()
33
+ theDate;
34
+ @Field(() => myType)
35
+ myType;
36
+ @Field(() => testEntity)
37
+ myEntity;
38
+ @BackendMethod({ allowed: true })
39
+ async testDate() {
40
+ return this.theDate.getFullYear();
41
+ }
42
+ @BackendMethod({ allowed: true })
43
+ async testDataType(n) {
44
+ return this.myType.what(n);
45
+ }
46
+ @BackendMethod({ allowed: false })
47
+ async forbidden() {
48
+ }
49
+ @BackendMethod({ allowed: true })
50
+ async sendEntityAsParamter() {
51
+ return this.myEntity.name;
52
+ }
53
+ static test;
54
+ @Fields.string({
55
+ validate: (y, x) => {
56
+ if (y.a == "errorc") {
57
+ x.error = "error on client";
58
+ }
59
+ else if (y.a == "error on server" && isBackend()) {
60
+ x.error = "error on server";
61
+ }
62
+ }
63
+ })
64
+ a;
65
+ @BackendMethod({ allowed: true })
66
+ async doIt() {
67
+ let result = 'hello ' + this.a;
68
+ this.a = 'yael';
69
+ return {
70
+ onServer: isBackend(),
71
+ result
72
+ };
73
+ }
74
+ @BackendMethod({ allowed: true })
75
+ static async sf(name, remult) {
76
+ return {
77
+ onServer: isBackend(),
78
+ result: 'hello ' + name
79
+ };
80
+ }
81
+ @BackendMethod({ allowed: true })
82
+ static async testDate(d) {
83
+ return d.getFullYear();
84
+ }
85
+ @BackendMethod({ allowed: false })
86
+ static async testForbidden2() {
87
+ }
88
+ @BackendMethod({ allowed: true })
89
+ static async testDataType(d, n) {
90
+ return d.what(n);
91
+ }
92
+ @BackendMethod({ allowed: true })
93
+ static async getValFromServer(remult) {
94
+ return (await remult.repo(testEntity).findFirst()).name;
95
+ }
96
+ static async staticBackendMethodWithoutDecorator() {
97
+ return isBackend();
98
+ }
99
+ static async staticBackendMethodWithoutDecoratorWithRemult(remult) {
100
+ return (await remult.repo(testEntity).findFirst()).name;
101
+ }
102
+ async backendMethodWithoutDecorator() {
103
+ return isBackend();
104
+ }
105
+ async backendMethodWithoutDecoratorWithRemult(remult) {
106
+ return (await remult.repo(testEntity).findFirst()).name + this.a;
107
+ }
108
+ @BackendMethod({ allowed: true })
109
+ static async sendEntityAsParamter(entity) {
110
+ if (entity === null)
111
+ return "null";
112
+ return entity.name;
113
+ }
114
+ @BackendMethod({ allowed: true })
115
+ static async syntaxError() {
116
+ let z = undefined;
117
+ return z.toString();
118
+ }
119
+ @BackendMethod({ allowed: true })
120
+ async syntaxError() {
121
+ let z = undefined;
122
+ return z.toString();
123
+ }
124
+ }
125
+ describeClass(testBasics, undefined, undefined, {
126
+ staticBackendMethodWithoutDecorator: BackendMethod({ allowed: true })
127
+ });
128
+ describeClass(testBasics, undefined, undefined, {
129
+ staticBackendMethodWithoutDecoratorWithRemult: BackendMethod({ allowed: true, paramTypes: [Remult] })
130
+ });
131
+ describeClass(testBasics, undefined, {
132
+ backendMethodWithoutDecorator: BackendMethod({ allowed: true })
133
+ });
134
+ describeClass(testBasics, undefined, {
135
+ backendMethodWithoutDecoratorWithRemult: BackendMethod({ allowed: true, paramTypes: [Remult] })
136
+ });
137
+ class Stam {
138
+ @BackendMethod({ allowed: false })
139
+ static async testForbidden1() {
140
+ console.log("I am in forbidden");
141
+ }
142
+ }
143
+ describe("test Server Controller basics", () => {
144
+ let c = new Remult();
145
+ c.dataProvider = (ActionTestConfig.db);
146
+ beforeEach(async (done) => {
147
+ await Promise.all((await c.repo(testEntity).find()).map(x => x.delete()));
148
+ done();
149
+ });
150
+ it("forbidden static backend", async () => {
151
+ let ok = true;
152
+ try {
153
+ await Stam.testForbidden1();
154
+ ok = false;
155
+ }
156
+ catch (err) {
157
+ expect(err.httpStatusCode).toBe(403);
158
+ }
159
+ expect(ok).toBe(true);
160
+ });
161
+ it("forbidden static backend", async () => {
162
+ let ok = true;
163
+ try {
164
+ await testBasics.testForbidden2();
165
+ ok = false;
166
+ }
167
+ catch (err) {
168
+ expect(err.httpStatusCode).toBe(403);
169
+ }
170
+ expect(ok).toBe(true);
171
+ });
172
+ it("forbidden static backend", async () => {
173
+ let ok = true;
174
+ try {
175
+ await testBasics.testForbidden2();
176
+ ok = false;
177
+ }
178
+ catch (err) {
179
+ expect(err.httpStatusCode).toBe(403);
180
+ }
181
+ expect(ok).toBe(true);
182
+ });
183
+ it("forbidden backend", async () => {
184
+ let ok = true;
185
+ try {
186
+ await new testBasics(c).forbidden();
187
+ ok = false;
188
+ }
189
+ catch (err) {
190
+ expect(err.httpStatusCode).toBe(403);
191
+ }
192
+ expect(ok).toBe(true);
193
+ });
194
+ it("forbidden entity", async () => {
195
+ let ok = true;
196
+ try {
197
+ await remult.repo(testEntity).create().forbidden();
198
+ ok = false;
199
+ }
200
+ catch (err) {
201
+ expect(err.httpStatusCode).toBe(403);
202
+ }
203
+ expect(ok).toBe(true);
204
+ });
205
+ it("test error", async () => {
206
+ try {
207
+ await testBasics.syntaxError();
208
+ }
209
+ catch (err) {
210
+ expect(err.message).toContain("Cannot read prop");
211
+ }
212
+ });
213
+ it("test error server method", async () => {
214
+ try {
215
+ await new testBasics(c).syntaxError();
216
+ }
217
+ catch (err) {
218
+ expect(err.message).toContain("Cannot read prop");
219
+ }
220
+ });
221
+ it("send entity to server ", async () => {
222
+ let e = await c.repo(testEntity).create({ name: 'test' }).save();
223
+ expect(await testBasics.sendEntityAsParamter(e)).toBe('test');
224
+ });
225
+ it("send entity to server ", async () => {
226
+ expect(await testBasics.sendEntityAsParamter(null)).toBe('null');
227
+ });
228
+ it("send entity to server prepare args to send ", async () => {
229
+ let e = await c.repo(testEntity).create({ name: 'test' }).save();
230
+ expect(prepareArgsToSend([testEntity], [e])[0]).toBe(e.id);
231
+ });
232
+ it("data is saved on server", async () => {
233
+ await c.repo(testEntity).create({ name: 'test' }).save();
234
+ expect(await testBasics.getValFromServer()).toBe('test');
235
+ });
236
+ it("new backend method syntax static method with remult", async () => {
237
+ await c.repo(testEntity).create({ name: 'test' }).save();
238
+ expect(await testBasics.staticBackendMethodWithoutDecoratorWithRemult()).toBe('test');
239
+ });
240
+ it("new backend method syntax static method", async () => {
241
+ expect(await testBasics.staticBackendMethodWithoutDecorator()).toBe(true);
242
+ });
243
+ it("new backend method syntax 1", async () => {
244
+ expect(await new testBasics(undefined).backendMethodWithoutDecorator()).toBe(true);
245
+ });
246
+ it("new backend method syntax 2", async () => {
247
+ await c.repo(testEntity).create({ name: 'test' }).save();
248
+ const z = new testBasics(undefined);
249
+ z.a = 'x';
250
+ expect(await z.backendMethodWithoutDecoratorWithRemult()).toBe('testx');
251
+ });
252
+ it("test backend method caller", async () => {
253
+ const c = new Remult({
254
+ url: "xx", httpClient: {
255
+ delete: () => undefined,
256
+ get: () => undefined,
257
+ post: async (url, data) => {
258
+ expect(url).toBe("xx/sf");
259
+ expect(data.args[0]).toEqual("noam");
260
+ return { data: { result: "hello noam" } };
261
+ },
262
+ put: () => undefined
263
+ }
264
+ });
265
+ const r = (await c.call(testBasics.sf, undefined, "noam"));
266
+ expect(r.result).toBe("hello noam");
267
+ });
268
+ it("test backend method caller with proxy", async () => {
269
+ const p = new RemultProxy();
270
+ {
271
+ const c = new Remult({
272
+ url: "xx", httpClient: {
273
+ delete: () => undefined,
274
+ get: () => undefined,
275
+ post: async (url, data) => {
276
+ expect(url).toBe("xx/sf");
277
+ expect(data.args[0]).toEqual("noam");
278
+ return { data: { result: "hello noam" } };
279
+ },
280
+ put: () => undefined
281
+ }
282
+ });
283
+ p.remultFactory = () => c;
284
+ }
285
+ const r = (await p.call(testBasics.sf, undefined, "noam"));
286
+ expect(r.result).toBe("hello noam");
287
+ });
288
+ it("test backend method instance method", async () => {
289
+ const c = new Remult({
290
+ url: "xx", httpClient: {
291
+ delete: () => undefined,
292
+ get: () => undefined,
293
+ post: async (url, data) => {
294
+ expect(url).toBe("xx/1/doIt");
295
+ return { result: { result: "hello noam" }, fields: {} };
296
+ },
297
+ put: () => undefined
298
+ }
299
+ });
300
+ const b = new testBasics(remult);
301
+ const r = (await c.call(b.doIt, b));
302
+ expect(r.result).toBe("hello noam");
303
+ });
304
+ it("test backend method instance method with proxy", async () => {
305
+ const c = new Remult({
306
+ url: "xx", httpClient: {
307
+ delete: () => undefined,
308
+ get: () => undefined,
309
+ post: async (url, data) => {
310
+ expect(url).toBe("xx/1/doIt");
311
+ return { result: { result: "hello noam" }, fields: {} };
312
+ },
313
+ put: () => undefined
314
+ }
315
+ });
316
+ const p = new RemultProxy();
317
+ p.remultFactory = () => c;
318
+ const b = new testBasics(remult);
319
+ const r = (await p.call(b.doIt, b));
320
+ expect(r.result).toBe("hello noam");
321
+ });
322
+ it("test server function", async () => {
323
+ let r = await testBasics.sf("noam");
324
+ expect(r.onServer).toBe(true);
325
+ expect(r.result).toBe('hello noam');
326
+ });
327
+ it("test server function on server", async () => {
328
+ await testAsIfOnBackend(async () => {
329
+ let r = await testBasics.sf("noam");
330
+ expect(r.onServer).toBe(true);
331
+ expect(r.result).toBe('hello noam');
332
+ });
333
+ });
334
+ it("test server Method Date", async () => {
335
+ let tb = new testBasics(c);
336
+ tb.theDate = new Date(1976, 6, 16);
337
+ expect(await tb.testDate()).toBe(1976);
338
+ });
339
+ it("test server Method Date on server", async () => {
340
+ let tb = new testBasics(c);
341
+ tb.theDate = new Date(1976, 6, 16);
342
+ await testAsIfOnBackend(async () => {
343
+ expect(await tb.testDate()).toBe(1976);
344
+ });
345
+ });
346
+ it("test server Method myType", async () => {
347
+ let tb = new testBasics(c);
348
+ tb.myType = myType.y;
349
+ expect(await tb.testDataType(7)).toBe('y7');
350
+ });
351
+ it("test server method entity", async () => {
352
+ let e = await c.repo(testEntity).create({ name: 'test3' }).save();
353
+ let tb = new testBasics(c);
354
+ tb.myEntity = e;
355
+ expect(await tb.sendEntityAsParamter()).toBe('test3');
356
+ });
357
+ it("test server function Date", async () => {
358
+ let r = await testBasics.testDate(new Date(1976, 6, 16));
359
+ expect(r).toBe(1976);
360
+ });
361
+ it("test server function custom type", async () => {
362
+ let r = await testBasics.testDataType(myType.y, 2);
363
+ expect(r).toBe('y2');
364
+ });
365
+ it("test server method", async () => {
366
+ let x = new testBasics(new Remult());
367
+ x.a = 'Noam';
368
+ let r = await x.doIt();
369
+ expect(r.onServer).toBe(true);
370
+ expect(r.result).toBe('hello Noam');
371
+ expect(x.a).toBe("yael");
372
+ });
373
+ it("test validation method", async () => {
374
+ let x = new testBasics(new Remult());
375
+ x.a = 'errorc';
376
+ let happened = false;
377
+ try {
378
+ let r = await x.doIt();
379
+ happened = true;
380
+ }
381
+ catch (err) {
382
+ expect(err.modelState.a).toBe("error on client");
383
+ expect(getFields(x).a.error).toBe("error on client");
384
+ }
385
+ expect(happened).toBe(false);
386
+ });
387
+ it("test validation on server", async () => {
388
+ let x = new testBasics(new Remult());
389
+ x.a = "error on server";
390
+ let happened = false;
391
+ try {
392
+ let r = await x.doIt();
393
+ happened = true;
394
+ }
395
+ catch (err) {
396
+ expect(err.modelState.a).toBe("error on server");
397
+ expect(getFields(x).a.error).toBe("error on server");
398
+ }
399
+ expect(happened).toBe(false);
400
+ });
401
+ it("test static backend method ", async () => {
402
+ const myClass = class {
403
+ static async doSomething2222() {
404
+ return isBackend().toString();
405
+ }
406
+ };
407
+ describeClass(myClass, undefined, undefined, {
408
+ doSomething2222: BackendMethod({ allowed: true, apiPrefix: 'myPrefix' }),
409
+ });
410
+ expect(await myClass.doSomething2222()).toBe("true");
411
+ });
412
+ it("test backend method with adhoc entity", async () => {
413
+ const myClass = class {
414
+ id = 0;
415
+ name = '';
416
+ async doSomething() {
417
+ return this.name + isBackend();
418
+ }
419
+ };
420
+ describeClass(myClass, Controller('addHocController'), {
421
+ id: Fields.autoIncrement(),
422
+ name: Fields.string(),
423
+ doSomething: BackendMethod({ allowed: true }),
424
+ });
425
+ const x = new myClass();
426
+ x.name = "123";
427
+ expect(await x.doSomething()).toBe("123true");
428
+ });
429
+ it("test static backend method with adhoc controller", async () => {
430
+ const myClass = class {
431
+ id = 0;
432
+ name = '';
433
+ static async adHockDoSomething() {
434
+ return isBackend();
435
+ }
436
+ };
437
+ describeClass(myClass, Controller('addHocController1'), {
438
+ id: Fields.autoIncrement(),
439
+ name: Fields.string()
440
+ }, {
441
+ adHockDoSomething: BackendMethod({ allowed: true }),
442
+ });
443
+ expect(await myClass.adHockDoSomething()).toBe(true);
444
+ });
445
+ it("test remult proxy for repository", async () => {
446
+ let remult1 = new Remult(new InMemoryDataProvider());
447
+ await remult1.repo(testEntity).insert({ name: "a" });
448
+ let remult2 = new Remult(new InMemoryDataProvider());
449
+ let remultProxy = new RemultProxy();
450
+ let repo = remultProxy.repo(testEntity);
451
+ remultProxy.remultFactory = () => remult1;
452
+ expect(await repo.count()).toBe(1);
453
+ remultProxy.remultFactory = () => remult2;
454
+ expect(await repo.count()).toBe(0);
455
+ let z = await repo.save({ name: "b" });
456
+ expect(z.name).toBe("b");
457
+ expect(await repo.count()).toBe(1);
458
+ remultProxy.remultFactory = () => remult1;
459
+ expect(await repo.find({
460
+ where: {
461
+ name: "b"
462
+ }
463
+ })).toEqual([]);
464
+ });
465
+ });
466
+ describe("controller with extends ", () => {
467
+ it("test inheritance in controllers", async () => {
468
+ let c = new child();
469
+ c.childField = 'c';
470
+ c.parentField = 'p';
471
+ let r = await c.run();
472
+ expect(r.c).toBe('c');
473
+ expect(r.p).toBe('p');
474
+ });
475
+ });
476
+ @Controller("parent")
477
+ class parent {
478
+ @Fields.string()
479
+ parentField;
480
+ }
481
+ @Controller("child")
482
+ class child extends parent {
483
+ @Fields.string()
484
+ childField;
485
+ @BackendMethod({ allowed: true })
486
+ run() {
487
+ return { p: this.parentField, c: this.childField };
488
+ }
489
+ }
@@ -0,0 +1,178 @@
1
+ import { Remult } from '../context';
2
+ import { InMemoryDataProvider } from '../data-providers/in-memory-database';
3
+ import { dbNamesOf } from '../filter/filter-consumer-bridge-to-sql-request';
4
+ import { remult } from '../remult-proxy';
5
+ import { Entity, EntityBase, Fields } from '../remult3';
6
+ import { describeClass } from '../remult3/DecoratorReplacer';
7
+ import { actionInfo } from '../server-action';
8
+ describe("test server expression value", () => {
9
+ beforeEach(() => actionInfo.runningOnServer = true);
10
+ afterEach(() => actionInfo.runningOnServer = false);
11
+ it("test basics create", async () => {
12
+ let c = new Remult();
13
+ c.dataProvider = (new InMemoryDataProvider());
14
+ testServerExpression.testVal = 1;
15
+ testServerExpression.testVal2 = 11;
16
+ let r = c.repo(testServerExpression).create();
17
+ r.code = 5;
18
+ await r._.save();
19
+ expect(r.test).toBe(1);
20
+ expect(r.testPromise).toBe(11);
21
+ expect(testServerExpression.testVal).toBe(2);
22
+ expect(testServerExpression.testVal2).toBe(12);
23
+ });
24
+ it("test basics find", async () => {
25
+ let c = new Remult();
26
+ c.dataProvider = (new InMemoryDataProvider());
27
+ testServerExpression.testVal = 1;
28
+ testServerExpression.testVal2 = 11;
29
+ let r = c.repo(testServerExpression).create();
30
+ r.code = 5;
31
+ await r._.save();
32
+ testServerExpression.testVal = 1;
33
+ testServerExpression.testVal2 = 11;
34
+ r = (await c.repo(testServerExpression).find({}))[0];
35
+ expect(r.test).toBe(1);
36
+ expect(r.testPromise).toBe(11);
37
+ expect(testServerExpression.testVal).toBe(2);
38
+ expect(testServerExpression.testVal2).toBe(12);
39
+ });
40
+ it("test doesnt calc on client", async () => {
41
+ actionInfo.runningOnServer = false;
42
+ let c = new Remult();
43
+ c.dataProvider = (new InMemoryDataProvider());
44
+ testServerExpression.testVal = 1;
45
+ testServerExpression.testVal2 = 11;
46
+ let r = c.repo(testServerExpression).create();
47
+ r.code = 5;
48
+ await r._.save();
49
+ expect(r.test).toBe(undefined);
50
+ expect(r.testPromise).toBe(undefined);
51
+ expect(testServerExpression.testVal).toBe(1);
52
+ expect(testServerExpression.testVal2).toBe(11);
53
+ });
54
+ it("test basics find doesnt calc on client", async () => {
55
+ actionInfo.runningOnServer = false;
56
+ let c = new Remult();
57
+ c.dataProvider = (new InMemoryDataProvider());
58
+ let r = c.repo(testServerExpression).create();
59
+ r.code = 5;
60
+ await r._.save();
61
+ testServerExpression.testVal = 1;
62
+ testServerExpression.testVal2 = 11;
63
+ r = (await c.repo(testServerExpression).find({}))[0];
64
+ expect(r.test).toBe(undefined);
65
+ expect(r.testPromise).toBe(undefined);
66
+ expect(testServerExpression.testVal).toBe(1);
67
+ expect(testServerExpression.testVal2).toBe(11);
68
+ });
69
+ it("test uuid", async () => {
70
+ const e = class {
71
+ id = '';
72
+ num = 0;
73
+ };
74
+ describeClass(e, Entity("x"), {
75
+ id: Fields.uuid(),
76
+ num: Fields.number()
77
+ });
78
+ const repo = new Remult(new InMemoryDataProvider()).repo(e);
79
+ let item = await repo.insert({ num: 1 });
80
+ expect(item.id.length).toBe(36, item.id);
81
+ item = await repo.insert({ id: '123', num: 2 });
82
+ expect(item.id).toBe('123');
83
+ });
84
+ it("test cuid", async () => {
85
+ const e = class {
86
+ id = '';
87
+ num = 0;
88
+ };
89
+ describeClass(e, Entity("x"), {
90
+ id: Fields.cuid(),
91
+ num: Fields.number()
92
+ });
93
+ const repo = new Remult(new InMemoryDataProvider()).repo(e);
94
+ let item = await repo.insert({ num: 1 });
95
+ expect(item.id.length).toBe(24, item.id);
96
+ item = await repo.insert({ id: '123', num: 2 });
97
+ expect(item.id).toBe('123');
98
+ });
99
+ it("test createdAt", async () => {
100
+ const e = class {
101
+ id = 1;
102
+ createdAt;
103
+ updatedAt;
104
+ val = 0;
105
+ };
106
+ describeClass(e, Entity("x"), {
107
+ id: Fields.autoIncrement(),
108
+ createdAt: Fields.createdAt(),
109
+ updatedAt: Fields.updatedAt(),
110
+ val: Fields.number()
111
+ });
112
+ const repo = new Remult(new InMemoryDataProvider()).repo(e);
113
+ let item = await repo.insert({});
114
+ expect(item.createdAt.toDateString()).toBe(new Date().toDateString());
115
+ expect(Math.abs((item.updatedAt.valueOf() - item.createdAt.valueOf()))).toBeLessThan(5);
116
+ let c = item.createdAt;
117
+ await new Promise(res => setTimeout(() => {
118
+ res({});
119
+ }, 10));
120
+ item = await repo.save({ ...item, val: 3 });
121
+ expect(item.val).toBe(3);
122
+ expect(item.createdAt).toEqual(c);
123
+ expect(item.createdAt).not.toEqual(item.updatedAt);
124
+ });
125
+ if (false)
126
+ it("test recursive db names", async () => {
127
+ const myClass = class {
128
+ a;
129
+ b;
130
+ c;
131
+ d;
132
+ e;
133
+ f;
134
+ };
135
+ describeClass(myClass, Entity("test-recursive-db-names"), {
136
+ a: Fields.string(),
137
+ b: Fields.string({ dbName: 'bb' }),
138
+ c: Fields.string({ sqlExpression: () => "cc" }),
139
+ d: Fields.string({ sqlExpression: async (e) => await e.fields.c.getDbName() + "dd" }),
140
+ e: Fields.string({
141
+ sqlExpression: async (e) => {
142
+ const n = await dbNamesOf(e);
143
+ return n.c + "ee";
144
+ }
145
+ }),
146
+ f: Fields.string({
147
+ sqlExpression: async (e) => {
148
+ const n = await dbNamesOf(e);
149
+ return n.f + "ff";
150
+ }
151
+ })
152
+ });
153
+ const r = await dbNamesOf(remult.repo(myClass));
154
+ expect(r.a).toBe('a');
155
+ expect(r.b).toBe('bb');
156
+ expect(r.c).toBe('cc');
157
+ expect(r.d).toBe('ccdd');
158
+ expect(r.e).toBe("ccee");
159
+ expect(r.f).toBe("Recursive getDbName call for field 'f'. ff");
160
+ const z = await dbNamesOf(remult.repo(myClass).metadata);
161
+ expect(z.a).toBe('a');
162
+ const zz = await dbNamesOf(myClass);
163
+ expect(zz.a).toBe('a');
164
+ const zzz = await dbNamesOf(testServerExpression);
165
+ expect(zzz.code).toBe('code');
166
+ });
167
+ });
168
+ @Entity('testServerExpression')
169
+ class testServerExpression extends EntityBase {
170
+ static testVal = 1;
171
+ static testVal2 = 10;
172
+ @Fields.integer()
173
+ code;
174
+ @Fields.integer({ serverExpression: () => testServerExpression.testVal++ })
175
+ test;
176
+ @Fields.integer({ serverExpression: () => Promise.resolve(testServerExpression.testVal2++) })
177
+ testPromise;
178
+ }