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,631 @@
1
+ import { InMemoryDataProvider } from '../data-providers/in-memory-database';
2
+ import { ArrayEntityDataProvider } from "../data-providers/array-entity-data-provider";
3
+ import { Allow, Remult } from '../context';
4
+ import { OneToMany } from '../column';
5
+ import { FilterConsumerBridgeToSqlRequest } from '../filter/filter-consumer-bridge-to-sql-request';
6
+ import { Validators } from '../validators';
7
+ import { Categories, Categories as newCategories } from './remult-3-entities';
8
+ import { Entity as EntityDecorator, getEntityRef, decorateColumnSettings, Entity, Field, ValueListFieldType, Fields, getValueList, ValueListInfo } from '../remult3/RepositoryImplementation';
9
+ import { describeClass, Sort } from '../..';
10
+ import { EntityBase } from '../remult3';
11
+ import { ValueConverters } from '../valueConverters';
12
+ import { entityFilterToJson, Filter } from '../filter/filter-interfaces';
13
+ import { createData } from './createData';
14
+ @ValueListFieldType({
15
+ getValues: () => [
16
+ Language.Hebrew,
17
+ Language.Russian,
18
+ new Language(20, 'אמהרית')
19
+ ]
20
+ })
21
+ export class Language {
22
+ id;
23
+ caption;
24
+ static Hebrew = new Language(0, 'עברית');
25
+ static Russian = new Language(10, 'רוסית');
26
+ constructor(id, caption) {
27
+ this.id = id;
28
+ this.caption = caption;
29
+ }
30
+ }
31
+ export async function insertFourRows() {
32
+ return createData(async (i) => {
33
+ await i(1, 'noam', 'x');
34
+ await i(4, 'yael', 'x');
35
+ await i(2, 'yoni', 'y');
36
+ await i(3, 'maayan', 'y');
37
+ });
38
+ }
39
+ ;
40
+ describe("grid filter stuff", () => {
41
+ it("filter with contains", async () => {
42
+ let x = new FilterConsumerBridgeToSqlRequest({
43
+ addParameterAndReturnSqlToken: () => ""
44
+ }, {
45
+ $entityName: '',
46
+ $dbNameOf: () => 'col'
47
+ });
48
+ x.containsCaseInsensitive(new mockColumnDefs("col"), "no'am");
49
+ expect(await x.resolveWhere()).toBe(" where lower (col) like lower ('%no''am%')");
50
+ });
51
+ it("filter with contains", async () => {
52
+ let x = new FilterConsumerBridgeToSqlRequest({
53
+ addParameterAndReturnSqlToken: () => ""
54
+ }, {
55
+ $entityName: '',
56
+ $dbNameOf: () => 'col'
57
+ });
58
+ x.containsCaseInsensitive(new mockColumnDefs("col"), "no'a'm");
59
+ expect(await x.resolveWhere()).toBe(" where lower (col) like lower ('%no''a''m%')");
60
+ });
61
+ it("test in statement", async () => {
62
+ let [c] = await insertFourRows();
63
+ expect(await c.count({ id: [1, 3] })).toBe(2);
64
+ });
65
+ });
66
+ describe("Closed List column", () => {
67
+ it("Basic Operations", () => {
68
+ let x = ValueListInfo.get(Language);
69
+ expect(x.fromJson(0)).toBe(Language.Hebrew);
70
+ expect(x.toJson(Language.Russian)).toBe(10);
71
+ expect(ValueListInfo.get(Language).getValues().length).toBe(3);
72
+ });
73
+ it("test auto caption", () => {
74
+ let val = ValueListInfo.get(valueList);
75
+ expect(valueList.firstName.caption).toBe('First Name');
76
+ });
77
+ it("test with entity", async () => {
78
+ let c = new Remult()
79
+ .repo(entityWithValueList, new InMemoryDataProvider());
80
+ let e = c.create();
81
+ e.id = 1;
82
+ expect(e.l).toBe(Language.Hebrew);
83
+ e.l = Language.Russian;
84
+ await e._.save();
85
+ e = await c.findFirst();
86
+ expect(e.l).toBe(Language.Russian);
87
+ expect(e._.toApiJson().l).toBe(10);
88
+ });
89
+ it("test with entity and data defined on type", async () => {
90
+ let c = new Remult()
91
+ .repo(entityWithValueList, new InMemoryDataProvider());
92
+ let e = c.create();
93
+ e.id = 1;
94
+ expect(c.metadata.fields.v.valueType).toBe(valueList);
95
+ expect(c.metadata.fields.v.valueConverter.fromJson('listName'))
96
+ .toBe(valueList.listName);
97
+ expect(c.metadata.fields.id.valueType).toBe(Number);
98
+ expect(e.v).toBe(valueList.firstName);
99
+ e.v = valueList.listName;
100
+ await e._.save();
101
+ e = await c.findFirst();
102
+ expect(e.v).toBe(valueList.listName);
103
+ expect(e._.toApiJson().v).toBe('listName');
104
+ });
105
+ it("test entity with value list get values", () => {
106
+ var x = new Remult().repo(entityWithValueList);
107
+ expect(getValueList(x.metadata.fields.l).length).toBe(3);
108
+ expect(getValueList(x.create().$.l).length).toBe(3);
109
+ });
110
+ });
111
+ @ValueListFieldType()
112
+ class valueList {
113
+ id;
114
+ caption;
115
+ static firstName = new valueList();
116
+ static listName = new valueList();
117
+ constructor(id, caption) {
118
+ this.id = id;
119
+ this.caption = caption;
120
+ }
121
+ }
122
+ @Entity('entity with value list')
123
+ class entityWithValueList extends EntityBase {
124
+ @Fields.integer()
125
+ id = 0;
126
+ @Field(() => Language)
127
+ l = Language.Hebrew;
128
+ @Field(() => valueList)
129
+ v = valueList.firstName;
130
+ }
131
+ describe("test row provider", () => {
132
+ it("auto name", () => {
133
+ var cat = new Remult().repo(newCategories).create();
134
+ expect(cat._.repository.metadata.key).toBe('Categories');
135
+ });
136
+ it("test update", async () => {
137
+ let [c] = await createData(async (insert) => await insert(5, 'noam'));
138
+ let r = await c.find();
139
+ expect(r[0].categoryName).toBe('noam');
140
+ r[0].categoryName = 'yael';
141
+ await r[0]._.save();
142
+ r = await c.find();
143
+ expect(r[0].categoryName).toBe('yael');
144
+ });
145
+ it("test filter", async () => {
146
+ let [c] = await insertFourRows();
147
+ let rows = await c.find();
148
+ expect(rows.length).toBe(4);
149
+ rows = await c.find({ where: { description: 'x' } });
150
+ expect(rows.length).toBe(2);
151
+ rows = await c.find({ where: { id: 4 } });
152
+ expect(rows.length).toBe(1);
153
+ expect(rows[0].categoryName).toBe('yael');
154
+ rows = await c.find({ where: { description: 'y', categoryName: 'yoni' } });
155
+ expect(rows.length).toBe(1);
156
+ expect(rows[0].id).toBe(2);
157
+ rows = await c.find({
158
+ where: { description: 'y', categoryName: 'yoni' }
159
+ });
160
+ expect(rows.length).toBe(1);
161
+ expect(rows[0].id).toBe(2);
162
+ rows = await c.find({
163
+ where: { description: 'y', categoryName: 'yoni' }
164
+ });
165
+ expect(rows.length).toBe(1);
166
+ expect(rows[0].id).toBe(2);
167
+ });
168
+ it("test in filter packer", async () => {
169
+ let [r] = await insertFourRows();
170
+ let rows = await r.find();
171
+ expect(rows.length).toBe(4);
172
+ rows = await r.find({
173
+ where: Filter.entityFilterFromJson(r.metadata, entityFilterToJson(r.metadata, { description: 'x' }))
174
+ });
175
+ rows = await r.find({ where: Filter.entityFilterFromJson(r.metadata, entityFilterToJson(r.metadata, { id: [1, 3] })) });
176
+ expect(rows.length).toBe(2);
177
+ rows = await r.find({ where: Filter.entityFilterFromJson(r.metadata, entityFilterToJson(r.metadata, { id: { $ne: [1, 2, 3] } })) });
178
+ expect(rows.length).toBe(1);
179
+ });
180
+ it("sort", async () => {
181
+ let [c] = await insertFourRows();
182
+ let rows = await c.find({ orderBy: { id: "asc" } });
183
+ expect(rows[0].id).toBe(1);
184
+ expect(rows[1].id).toBe(2);
185
+ expect(rows[2].id).toBe(3);
186
+ expect(rows[3].id).toBe(4);
187
+ rows = await c.find({
188
+ orderBy: { categoryName: "desc" }
189
+ });
190
+ expect(rows[0].id).toBe(2);
191
+ expect(rows[1].id).toBe(4);
192
+ expect(rows[2].id).toBe(1);
193
+ expect(rows[3].id).toBe(3);
194
+ });
195
+ it("counts", async () => {
196
+ let [c] = await insertFourRows();
197
+ let count = await c.count();
198
+ expect(count).toBe(4);
199
+ });
200
+ it("counts with filter", async () => {
201
+ let [c] = await insertFourRows();
202
+ let count = await c.count({ id: { "<=": 2 } });
203
+ expect(count).toBe(2);
204
+ });
205
+ it("Test Validation 2", async () => {
206
+ var remult = new Remult();
207
+ remult.dataProvider = (new InMemoryDataProvider());
208
+ let type = class extends newCategories {
209
+ a;
210
+ };
211
+ EntityDecorator('')(type);
212
+ Fields.string({
213
+ validate: (entity, col) => Validators.required(entity, col, "m")
214
+ })(type.prototype, "a");
215
+ var c = remult.repo(type);
216
+ var cat = c.create();
217
+ cat.a = '';
218
+ var saved = false;
219
+ try {
220
+ await cat._.save();
221
+ saved = true;
222
+ }
223
+ catch (err) {
224
+ expect(cat._.fields.a.error).toEqual("m");
225
+ expect(cat._.error).toBe("A: m");
226
+ }
227
+ expect(saved).toBe(false);
228
+ });
229
+ it("Test Validation 2_1", async () => {
230
+ var remult = new Remult();
231
+ remult.dataProvider = (new InMemoryDataProvider());
232
+ let type = class extends newCategories {
233
+ a;
234
+ };
235
+ EntityDecorator('')(type);
236
+ Fields.string({
237
+ validate: (entity, col) => {
238
+ if (!entity.a || entity.a.length == 0)
239
+ col.error = "m";
240
+ }
241
+ })(type.prototype, "a");
242
+ var c = remult.repo(type);
243
+ var cat = c.create();
244
+ cat.a = '';
245
+ var saved = false;
246
+ try {
247
+ await cat._.save();
248
+ saved = true;
249
+ }
250
+ catch (err) {
251
+ expect(cat._.fields.a.error).toEqual("m");
252
+ }
253
+ expect(saved).toBe(false);
254
+ });
255
+ it("Test Validation 3", async () => {
256
+ var remult = new Remult();
257
+ remult.dataProvider = (new InMemoryDataProvider());
258
+ let type = class extends newCategories {
259
+ a;
260
+ };
261
+ EntityDecorator('')(type);
262
+ Fields.string({
263
+ validate: Validators.required.withMessage("m")
264
+ })(type.prototype, "a");
265
+ var c = remult.repo(type);
266
+ var cat = c.create();
267
+ cat.a = '';
268
+ var saved = false;
269
+ try {
270
+ await cat._.save();
271
+ saved = true;
272
+ }
273
+ catch (err) {
274
+ expect(cat._.fields.a.error).toEqual("m");
275
+ expect(err.message).toBe("A: m");
276
+ }
277
+ expect(saved).toBe(false);
278
+ });
279
+ it("Test unique Validation and is not empty", async () => {
280
+ var remult = new Remult();
281
+ remult.dataProvider = (new InMemoryDataProvider());
282
+ let type = class extends newCategories {
283
+ a;
284
+ };
285
+ EntityDecorator('asdfa')(type);
286
+ Fields.string({
287
+ validate: [Validators.required, Validators.unique]
288
+ })(type.prototype, "a");
289
+ var c = remult.repo(type);
290
+ var cat = c.create();
291
+ var saved = false;
292
+ cat.a = '';
293
+ try {
294
+ await cat._.save();
295
+ saved = true;
296
+ }
297
+ catch {
298
+ expect(cat._.fields.a.error).toEqual("Should not be empty");
299
+ cat.a = '12';
300
+ await cat._.save();
301
+ }
302
+ expect(saved).toBe(false);
303
+ cat = c.create();
304
+ cat.a = '12';
305
+ try {
306
+ await cat._.save();
307
+ saved = true;
308
+ }
309
+ catch (err) {
310
+ expect(cat._.fields.a.error).toEqual("already exists");
311
+ }
312
+ expect(saved).toBe(false);
313
+ });
314
+ it("test that it fails nicely", async () => {
315
+ let c = (await insertFourRows())[0].create();
316
+ c.id = 1;
317
+ c.categoryName = 'bla bla';
318
+ try {
319
+ await c._.save();
320
+ fail("Shouldnt have reached this");
321
+ }
322
+ catch (err) {
323
+ }
324
+ expect(c.categoryName).toBe('bla bla');
325
+ });
326
+ it("update should fail nicely", async () => {
327
+ let cont = new Remult();
328
+ cont.dataProvider = ({ getEntityDataProvider: (x) => new myDp(x), transaction: undefined });
329
+ let c = cont.repo(newCategories).create();
330
+ c.id = 1;
331
+ c.categoryName = 'noam';
332
+ await cont.repo(newCategories).save(c);
333
+ c.categoryName = 'yael';
334
+ try {
335
+ await cont.repo(newCategories).save(c);
336
+ fail("shouldnt be here");
337
+ }
338
+ catch (err) {
339
+ expect(c.categoryName).toBe('yael');
340
+ }
341
+ });
342
+ it("filter should return none", async () => {
343
+ let [c] = await insertFourRows();
344
+ let r = await c.findFirst({ categoryName: [] }, { createIfNotFound: true });
345
+ expect(r.categoryName).toBe(undefined);
346
+ expect(r.isNew()).toBe(true);
347
+ });
348
+ it("filter ignore works return none", async () => {
349
+ let [c] = await insertFourRows();
350
+ let r = await c.findFirst({ categoryName: undefined }, { createIfNotFound: true });
351
+ expect(r.categoryName).toBe("noam");
352
+ expect(r.isNew()).toBe(false);
353
+ });
354
+ it("lookup survives row that doesn't exist", async () => {
355
+ let [c] = await createData(async (insert) => await insert(1, 'noam'));
356
+ let r = await c.findId(5);
357
+ expect(r).toBeUndefined();
358
+ r = await c.findId(5);
359
+ expect(r).toBeUndefined();
360
+ });
361
+ });
362
+ @Entity('typeA', { dbName: 'dbnameA' })
363
+ class typeA extends EntityBase {
364
+ }
365
+ @Entity('typeB')
366
+ class typeB extends typeA {
367
+ }
368
+ describe("decorator inheritance", () => {
369
+ it("entity extends", async () => {
370
+ let c = new Remult();
371
+ let defsA = c.repo(typeA).metadata;
372
+ expect(defsA.key).toBe('typeA');
373
+ expect((await defsA.getDbName())).toBe('dbnameA');
374
+ let defsB = c.repo(typeB).metadata;
375
+ expect(defsB.key).toBe("typeB");
376
+ expect((await defsB.getDbName())).toBe("dbnameA");
377
+ ;
378
+ });
379
+ });
380
+ describe("order by api", () => {
381
+ it("works with sort", () => {
382
+ let c = new Remult().repo(Categories);
383
+ let opt = { orderBy: { id: "asc" } };
384
+ let s = Sort.translateOrderByToSort(c.metadata, opt.orderBy);
385
+ expect(s.Segments.length).toBe(1);
386
+ expect(s.Segments[0].field.key).toBe(c.metadata.fields.id.key);
387
+ });
388
+ it("works with columns array", () => {
389
+ let c = new Remult().repo(Categories);
390
+ let opt = {
391
+ orderBy: {
392
+ id: "asc",
393
+ categoryName: "asc"
394
+ }
395
+ };
396
+ let s = Sort.translateOrderByToSort(c.metadata, opt.orderBy);
397
+ expect(s.Segments.length).toBe(2);
398
+ expect(s.Segments[0].field).toBe(c.metadata.fields.id);
399
+ expect(s.Segments[1].field).toBe(c.metadata.fields.categoryName);
400
+ });
401
+ it("test several sort options", async () => {
402
+ let [c] = await createData(async (i) => {
403
+ await i(1, 'z');
404
+ await i(2, 'y');
405
+ });
406
+ let r = await c.find({ orderBy: { categoryName: "asc" } });
407
+ expect(r.length).toBe(2);
408
+ expect(r[0].id).toBe(2);
409
+ r = await c.find({ orderBy: { categoryName: "asc" } });
410
+ expect(r.length).toBe(2);
411
+ expect(r[0].id).toBe(2);
412
+ r = await c.find({ orderBy: { categoryName: "desc" } });
413
+ expect(r.length).toBe(2);
414
+ expect(r[0].id).toBe(1);
415
+ });
416
+ });
417
+ describe("test datetime column", () => {
418
+ it("stores well", () => {
419
+ let col = decorateColumnSettings({ valueType: Date }, new Remult());
420
+ let val = col.valueConverter.fromJson(col.valueConverter.toJson(new Date(1976, 11, 16, 8, 55, 31, 65)));
421
+ expect(val.toISOString()).toBe(new Date(1976, 11, 16, 8, 55, 31, 65).toISOString());
422
+ });
423
+ it("stores well undefined", () => {
424
+ let col = decorateColumnSettings({ valueType: Date }, new Remult());
425
+ expect(col.valueConverter.toJson(undefined)).toBe('');
426
+ });
427
+ it("displays empty date well", () => {
428
+ expect(ValueConverters.DateOnly.displayValue(ValueConverters.DateOnly.fromJson(''))).toBe('');
429
+ });
430
+ it("displays null date well 1", () => {
431
+ expect(ValueConverters.DateOnly.toJson(null)).toBe(null);
432
+ expect(ValueConverters.DateOnly.toJson(null)).toBe(null);
433
+ expect(ValueConverters.DateOnly.displayValue(null)).toBe('');
434
+ });
435
+ it("displays empty date well empty", () => {
436
+ expect(ValueConverters.DateOnly.displayValue(ValueConverters.DateOnly.fromJson('0000-00-00'))).toBe('');
437
+ });
438
+ it("Date only stuff", () => {
439
+ function test(d, expected) {
440
+ expect(ValueConverters.DateOnly.toJson(d)).toBe(expected);
441
+ const ed = ValueConverters.DateOnly.fromJson(expected);
442
+ expect(ed.getFullYear()).toEqual(d.getFullYear(), "year");
443
+ expect(ed.getMonth()).toEqual(d.getMonth(), "month");
444
+ expect(ed.getDate()).toEqual(d.getDate(), "day");
445
+ }
446
+ test(new Date(2021, 2, 26), '2021-03-26');
447
+ test(new Date(2021, 9, 31), '2021-10-31');
448
+ //test(new Date('1976-06-16'), '1976-06-16');
449
+ //test(new Date('1976-6-16'), '1976-06-16');
450
+ test(new Date(1976, 5, 16), '1976-06-16');
451
+ test(new Date(2021, 9, 30), '2021-10-30');
452
+ test(new Date(2021, 2, 26), '2021-03-26');
453
+ "".toString();
454
+ });
455
+ it("test display value, from and to input", () => {
456
+ let x = class {
457
+ name = 'noam';
458
+ myDate = new Date(1976, 5, 16);
459
+ };
460
+ describeClass(x, Entity("myEntity"), {
461
+ name: Fields.string(),
462
+ myDate: Fields.dateOnly({
463
+ displayValue: z => z.name + z.myDate.getFullYear()
464
+ })
465
+ });
466
+ var repo = new Remult().repo(x);
467
+ let y = {
468
+ name: 'noam',
469
+ myDate: new Date(1976, 5, 16)
470
+ };
471
+ expect(repo.fields.myDate.displayValue(y)).toBe('noam1976');
472
+ expect(repo.fields.myDate.toInput(new Date(1976, 5, 16))).toBe("1976-06-16");
473
+ expect(repo.fields.myDate.fromInput("1976-06-16")).toEqual(new Date(1976, 5, 16));
474
+ });
475
+ it("date Storage works 1", () => {
476
+ let col = decorateColumnSettings({
477
+ valueType: Date,
478
+ valueConverter: ValueConverters.DateOnly
479
+ }, new Remult());
480
+ expect(col.valueConverter.toDb(col.valueConverter.fromJson('1976-06-16')).toLocaleDateString()).toBe(new Date(1976, 5, 16, 0, 0, 0).toLocaleDateString());
481
+ expect(col.valueConverter.toDb(col.valueConverter.fromJson('1976-06-16')).getDate()).toBe(16);
482
+ });
483
+ });
484
+ describe("Test char date storage", () => {
485
+ let x = ValueConverters.DateOnlyString;
486
+ it("from db", () => {
487
+ expect(x.toJson(x.fromDb('19760616'))).toBe('1976-06-16');
488
+ });
489
+ it("to db", () => {
490
+ expect(x.toDb(x.fromJson('1976-06-16'))).toBe('19760616');
491
+ });
492
+ });
493
+ describe("value list column without id and caption", () => {
494
+ it("getValueList", () => {
495
+ expect(getValueList(Language).length).toBe(3);
496
+ });
497
+ });
498
+ describe("relation", () => {
499
+ it("should get values", async () => {
500
+ let [c] = await insertFourRows();
501
+ let r = new OneToMany(c, {
502
+ where: { description: "x" }
503
+ });
504
+ let rows = await r.load();
505
+ expect(rows.length).toBe(2);
506
+ let n = await r.create();
507
+ expect(n.description).toBe("x");
508
+ });
509
+ it("should have an array and lazy load it", async () => {
510
+ let [c] = await insertFourRows();
511
+ let r = new OneToMany(c, {
512
+ where: { description: 'x' }
513
+ });
514
+ let arr = r.lazyItems;
515
+ expect(arr.length).toBe(0);
516
+ await r.load();
517
+ expect(arr.length).toBe(2);
518
+ });
519
+ });
520
+ describe("context", () => {
521
+ it("what", () => {
522
+ var c = new Remult();
523
+ expect(c.authenticated()).toBe(false);
524
+ c.user = ({
525
+ id: '1',
526
+ name: 'name',
527
+ roles: ["a"]
528
+ });
529
+ expect(c.authenticated()).toBe(true);
530
+ c.user = (undefined);
531
+ expect(c.authenticated()).toBe(false);
532
+ });
533
+ it("is allowed for instance works with array", () => {
534
+ var remult = new Remult();
535
+ remult.user = ({ roles: ["a"], id: '', name: '' });
536
+ expect(remult.isAllowedForInstance({}, ["b", "a"])).toBe(true);
537
+ });
538
+ it("test no user is not allowed", () => {
539
+ var remult = new Remult();
540
+ remult.user = (undefined);
541
+ expect(remult.user).toBeUndefined();
542
+ });
543
+ });
544
+ it("test http provider for remult", async () => {
545
+ var remult = new Remult({
546
+ get: async (url) => {
547
+ return { count: 7 };
548
+ },
549
+ delete: async () => { },
550
+ put: async () => { },
551
+ post: async () => { }
552
+ });
553
+ // expect(await toPromise(Promise.resolve(7))).toBe(7);
554
+ expect(await remult.repo(TestCategories1).count()).toBe(7);
555
+ });
556
+ describe("allow", () => {
557
+ it("should work", () => {
558
+ expect(Allow.everyone()).toBe(true);
559
+ var remult = new Remult();
560
+ expect(Allow.authenticated(remult)).toBe(false);
561
+ remult.user = ({ id: '', name: '', roles: [] });
562
+ expect(Allow.authenticated(remult)).toBe(true);
563
+ });
564
+ });
565
+ @EntityDecorator('123')
566
+ class TestCategories1 extends newCategories {
567
+ @Fields.string({
568
+ validate: Validators.required
569
+ })
570
+ a;
571
+ }
572
+ describe("test ", () => {
573
+ it("Test Validation,", async () => {
574
+ var remult = new Remult();
575
+ remult.dataProvider = (new InMemoryDataProvider());
576
+ var c = remult.repo(TestCategories1);
577
+ var cat = c.create();
578
+ cat.a = '';
579
+ var saved = false;
580
+ try {
581
+ await c.save(cat);
582
+ saved = true;
583
+ }
584
+ catch (err) {
585
+ expect(getEntityRef(cat).fields.a.error).toEqual("Should not be empty");
586
+ }
587
+ expect(saved).toBe(false);
588
+ });
589
+ });
590
+ export class myDp extends ArrayEntityDataProvider {
591
+ constructor(entity) {
592
+ super(entity, []);
593
+ }
594
+ update(id, data) {
595
+ throw new Error("what");
596
+ }
597
+ }
598
+ class mockColumnDefs {
599
+ dbName;
600
+ constructor(dbName) {
601
+ this.dbName = dbName;
602
+ }
603
+ apiUpdateAllowed(item) {
604
+ throw new Error('Method not implemented.');
605
+ }
606
+ displayValue(item) {
607
+ throw new Error('Method not implemented.');
608
+ }
609
+ includedInApi;
610
+ toInput(value, inputType) {
611
+ throw new Error('Method not implemented.');
612
+ }
613
+ fromInput(inputValue, inputType) {
614
+ throw new Error('Method not implemented.');
615
+ }
616
+ async getDbName() {
617
+ return this.dbName;
618
+ }
619
+ options;
620
+ valueConverter = ValueConverters.Default;
621
+ target;
622
+ readonly;
623
+ dbReadOnly;
624
+ isServerExpression;
625
+ key;
626
+ caption;
627
+ inputType;
628
+ valueType;
629
+ allowNull;
630
+ dbType;
631
+ }
@@ -0,0 +1,10 @@
1
+ import { DataApiResponse } from "../data-api";
2
+ export declare class TestDataApiResponse implements DataApiResponse {
3
+ progress(progress: number): void;
4
+ success(data: any): void;
5
+ forbidden(): void;
6
+ created(data: any): void;
7
+ deleted(): void;
8
+ notFound(): void;
9
+ error(data: any): void;
10
+ }
@@ -0,0 +1,22 @@
1
+ export class TestDataApiResponse {
2
+ progress(progress) {
3
+ }
4
+ success(data) {
5
+ throw new Error(('didnt expect success: ' + JSON.stringify(data)));
6
+ }
7
+ forbidden() {
8
+ throw new Error('didnt expect forbidden:');
9
+ }
10
+ created(data) {
11
+ throw new Error('didnt expect created: ' + JSON.stringify(data));
12
+ }
13
+ deleted() {
14
+ throw new Error('didnt expect deleted:');
15
+ }
16
+ notFound() {
17
+ throw new Error('not found');
18
+ }
19
+ error(data) {
20
+ throw new Error('error: ' + data + " " + JSON.stringify(data));
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ import { EntityBase } from '../remult3';
2
+ export declare class entityWithValidationsOnEntityEvent extends EntityBase {
3
+ myId: number;
4
+ name: string;
5
+ }
6
+ export declare class EntityWithLateBoundDbName extends EntityBase {
7
+ id: number;
8
+ }