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,153 @@
1
+ import { allEntities } from '../src/context';
2
+ import { dbNamesOf, isDbReadonly } from '../src/filter/filter-consumer-bridge-to-sql-request';
3
+ import { remult as defaultRemult } from '../src/remult-proxy';
4
+ import { isAutoIncrement } from '../src/remult3';
5
+ import { ValueConverters } from '../src/valueConverters';
6
+ export function postgresColumnSyntax(x, dbName) {
7
+ let result = dbName;
8
+ if (x.valueType == Number) {
9
+ if (!x.valueConverter.fieldTypeInDb)
10
+ result += " numeric" + (x.allowNull ? "" : " default 0 not null");
11
+ else
12
+ result += " " + x.valueConverter.fieldTypeInDb + (x.allowNull ? "" : " default 0 not null");
13
+ }
14
+ else if (x.valueType == Date) {
15
+ if (!x.valueConverter.fieldTypeInDb)
16
+ if (x.valueConverter == ValueConverters.DateOnly)
17
+ result += " date";
18
+ else
19
+ result += " timestamp";
20
+ else
21
+ result += " " + x.valueConverter.fieldTypeInDb;
22
+ }
23
+ else if (x.valueType == Boolean)
24
+ result += " boolean" + (x.allowNull ? "" : " default false not null");
25
+ else if (x.valueConverter.fieldTypeInDb) {
26
+ result += " " + x.valueConverter.fieldTypeInDb;
27
+ if (!x.allowNull && x.valueConverter.fieldTypeInDb == 'integer') {
28
+ result += " default 0 not null";
29
+ }
30
+ }
31
+ else
32
+ result += " varchar" + (x.allowNull ? "" : " default '' not null");
33
+ return result;
34
+ }
35
+ export async function verifyStructureOfAllEntities(db, remult) {
36
+ return await new PostgresSchemaBuilder(db).verifyStructureOfAllEntities(remult);
37
+ }
38
+ export class PostgresSchemaBuilder {
39
+ pool;
40
+ //@internal
41
+ static logToConsole = true;
42
+ async verifyStructureOfAllEntities(remult) {
43
+ if (!remult) {
44
+ remult = defaultRemult;
45
+ }
46
+ const completed = new Set();
47
+ const entities = [];
48
+ for (const entityClass of [...allEntities].reverse()) {
49
+ let entity = remult.repo(entityClass).metadata;
50
+ let e = await dbNamesOf(entity);
51
+ if (completed.has(e.$entityName))
52
+ continue;
53
+ completed.add(e.$entityName);
54
+ entities.push(entity);
55
+ }
56
+ await this.ensureSchema(entities);
57
+ }
58
+ async ensureSchema(entities) {
59
+ for (const entity of entities) {
60
+ let e = await dbNamesOf(entity);
61
+ try {
62
+ if (!entity.options.sqlExpression) {
63
+ if (e.$entityName.toLowerCase().indexOf('from ') < 0) {
64
+ await this.createIfNotExist(entity);
65
+ await this.verifyAllColumns(entity);
66
+ }
67
+ }
68
+ }
69
+ catch (err) {
70
+ console.error("failed verify structure of " + e.$entityName + " ", err);
71
+ }
72
+ }
73
+ }
74
+ async createIfNotExist(entity) {
75
+ var c = this.pool.createCommand();
76
+ let e = await dbNamesOf(entity);
77
+ await c.execute("select 1 from information_Schema.tables where table_name=" + c.addParameterAndReturnSqlToken((e.$entityName).toLowerCase()) + this.additionalWhere).then(async (r) => {
78
+ if (r.rows.length == 0) {
79
+ let result = '';
80
+ for (const x of entity.fields) {
81
+ if (!isDbReadonly(x, e) || isAutoIncrement(x)) {
82
+ if (result.length != 0)
83
+ result += ',';
84
+ result += '\r\n ';
85
+ if (isAutoIncrement(x))
86
+ result += e.$dbNameOf(x) + ' serial';
87
+ else {
88
+ result += postgresColumnSyntax(x, e.$dbNameOf(x));
89
+ }
90
+ if (x == entity.idMetadata.field)
91
+ result += ' primary key';
92
+ }
93
+ }
94
+ let sql = 'create table ' + e.$entityName + ' (' + result + '\r\n)';
95
+ if (PostgresSchemaBuilder.logToConsole)
96
+ console.info(sql);
97
+ await this.pool.execute(sql);
98
+ }
99
+ });
100
+ }
101
+ async addColumnIfNotExist(entity, c) {
102
+ let e = await dbNamesOf(entity);
103
+ if (isDbReadonly(c(entity), e))
104
+ return;
105
+ try {
106
+ let cmd = this.pool.createCommand();
107
+ const colName = e.$dbNameOf(c(entity));
108
+ if ((await cmd.execute(`select 1
109
+ FROM information_schema.columns
110
+ WHERE table_name=${cmd.addParameterAndReturnSqlToken((e.$entityName).toLocaleLowerCase())} and column_name=${cmd.addParameterAndReturnSqlToken((colName).toLocaleLowerCase())}` + this.additionalWhere)).rows.length == 0) {
111
+ let sql = `alter table ${e.$entityName} add column ${postgresColumnSyntax(c(entity), colName)}`;
112
+ if (PostgresSchemaBuilder.logToConsole)
113
+ console.info(sql);
114
+ await this.pool.execute(sql);
115
+ }
116
+ }
117
+ catch (err) {
118
+ console.error(err);
119
+ }
120
+ }
121
+ async verifyAllColumns(entity) {
122
+ try {
123
+ let cmd = this.pool.createCommand();
124
+ let e = await dbNamesOf(entity);
125
+ let cols = (await cmd.execute(`select column_name
126
+ FROM information_schema.columns
127
+ WHERE table_name=${cmd.addParameterAndReturnSqlToken((e.$entityName).toLocaleLowerCase())} ` + this.additionalWhere)).rows.map(x => x.column_name.toLocaleLowerCase());
128
+ for (const col of entity.fields) {
129
+ if (!isDbReadonly(col, e)) {
130
+ let colName = e.$dbNameOf(col).toLocaleLowerCase();
131
+ if (colName.startsWith('"') && colName.endsWith('"'))
132
+ colName = colName.substring(1, colName.length - 1);
133
+ if (!cols.includes(colName)) {
134
+ let sql = `alter table ${e.$entityName} add column ${postgresColumnSyntax(col, e.$dbNameOf(col))}`;
135
+ if (PostgresSchemaBuilder.logToConsole)
136
+ console.info(sql);
137
+ await this.pool.execute(sql);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ catch (err) {
143
+ console.error(err);
144
+ }
145
+ }
146
+ additionalWhere = '';
147
+ constructor(pool, schema) {
148
+ this.pool = pool;
149
+ if (schema) {
150
+ this.additionalWhere = ' and table_schema=\'' + schema + '\'';
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,17 @@
1
+ import { RemultServerOptions, RemultServerCore } from "./server/expressBridge";
2
+ export declare function remultFresh(options: RemultServerOptions<FreshRequest>, response: FreshResponse): RemultFresh;
3
+ export interface RemultFresh extends RemultServerCore<FreshRequest> {
4
+ handle(req: FreshRequest, ctx: FreshContext): Promise<any>;
5
+ }
6
+ export interface FreshRequest {
7
+ url: string;
8
+ method: string;
9
+ json: () => Promise<any>;
10
+ }
11
+ export interface FreshContext {
12
+ next: () => Promise<any>;
13
+ }
14
+ export interface FreshResponse {
15
+ new (body?: any | undefined, init?: ResponseInit): any;
16
+ json(data: unknown, init?: ResponseInit): any;
17
+ }
@@ -0,0 +1,29 @@
1
+ import { createRemultServerCore } from "./server/expressBridge";
2
+ export function remultFresh(options, response) {
3
+ const server = createRemultServerCore(options, {
4
+ buildGenericRequestInfo: r => r,
5
+ getRequestBody: req => req.json()
6
+ });
7
+ return {
8
+ getRemult: r => server.getRemult(r),
9
+ openApiDoc: x => server.openApiDoc(x),
10
+ handle: async (req, ctx) => {
11
+ let init = {};
12
+ const res = await server.handle(req);
13
+ if (res) {
14
+ init.status = res.statusCode;
15
+ if (res.data) {
16
+ return response.json(res.data, init);
17
+ }
18
+ else
19
+ return new response(undefined, init);
20
+ }
21
+ else {
22
+ return ctx.next();
23
+ }
24
+ ;
25
+ },
26
+ };
27
+ }
28
+ ;
29
+ ;
@@ -0,0 +1,30 @@
1
+ import type { Knex } from 'knex';
2
+ import { Remult } from "../src/context";
3
+ import { EntityFilter, EntityMetadata, RepositoryOverloads } from "../src/remult3";
4
+ import { DataProvider, EntityDataProvider } from '../src/data-interfaces';
5
+ import { FieldMetadata } from '../src/column-interfaces';
6
+ export declare class KnexDataProvider implements DataProvider {
7
+ knex: Knex;
8
+ constructor(knex: Knex);
9
+ static getDb(remult?: Remult): Knex<any, any[]>;
10
+ getEntityDataProvider(entity: EntityMetadata<any>): EntityDataProvider;
11
+ transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
12
+ static rawFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
13
+ static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<(knex: any) => void>;
14
+ isProxy?: boolean;
15
+ ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
16
+ }
17
+ export type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
18
+ export declare class KnexSchemaBuilder {
19
+ private knex;
20
+ static logToConsole: boolean;
21
+ verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
22
+ ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
23
+ createIfNotExist(entity: EntityMetadata): Promise<void>;
24
+ addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
25
+ verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
26
+ additionalWhere: string;
27
+ constructor(knex: Knex);
28
+ }
29
+ export declare function buildColumn(x: FieldMetadata, dbName: string, b: Knex.CreateTableBuilder, supportsJson?: boolean): void;
30
+ export declare function createKnexDataProvider(config: Knex.Config): Promise<KnexDataProvider>;
@@ -0,0 +1,446 @@
1
+ import { customDatabaseFilterToken, Filter } from "../src/filter/filter-interfaces";
2
+ import { dbNamesOf, isDbReadonly } from "../src/filter/filter-consumer-bridge-to-sql-request";
3
+ import { allEntities } from "../src/context";
4
+ import { isAutoIncrement, getRepository } from "../src/remult3";
5
+ import { ValueConverters } from "../src/valueConverters";
6
+ import { CompoundIdField } from '../src/column';
7
+ import { Sort } from '../src/sort';
8
+ import { remult as remultContext } from '../src/remult-proxy';
9
+ export class KnexDataProvider {
10
+ knex;
11
+ constructor(knex) {
12
+ this.knex = knex;
13
+ }
14
+ static getDb(remult) {
15
+ const r = (remult || remultContext).dataProvider;
16
+ if (!r.knex)
17
+ throw "the data provider is not an KnexDataProvider";
18
+ return r.knex;
19
+ }
20
+ getEntityDataProvider(entity) {
21
+ if (!supportsJson(this.knex))
22
+ for (const f of entity.fields.toArray()) {
23
+ if (f.valueConverter.fieldTypeInDb === "json") {
24
+ //@ts-ignore
25
+ f.valueConverter = { ...f.valueConverter, toDb: ValueConverters.JsonString.toDb, fromDb: ValueConverters.JsonString.fromDb };
26
+ }
27
+ }
28
+ return new KnexEntityDataProvider(entity, this.knex);
29
+ }
30
+ async transaction(action) {
31
+ let t = await this.knex.transaction();
32
+ try {
33
+ await action(new KnexDataProvider(t));
34
+ await t.commit();
35
+ }
36
+ catch (err) {
37
+ await t.rollback();
38
+ throw err;
39
+ }
40
+ }
41
+ static rawFilter(build) {
42
+ return {
43
+ [customDatabaseFilterToken]: {
44
+ buildKnex: build
45
+ }
46
+ };
47
+ }
48
+ static async filterToRaw(entity, condition) {
49
+ const repo = getRepository(entity);
50
+ var b = new FilterConsumerBridgeToKnexRequest(await dbNamesOf(repo.metadata));
51
+ b._addWhere = false;
52
+ await (await (repo.translateWhereToFilter(condition))).__applyToConsumer(b);
53
+ let r = await b.resolveWhere();
54
+ return knex => r.forEach(y => y(knex));
55
+ }
56
+ isProxy;
57
+ async ensureSchema(entities) {
58
+ var sb = new KnexSchemaBuilder(this.knex);
59
+ await sb.ensureSchema(entities);
60
+ }
61
+ }
62
+ class KnexEntityDataProvider {
63
+ entity;
64
+ knex;
65
+ constructor(entity, knex) {
66
+ this.entity = entity;
67
+ this.knex = knex;
68
+ }
69
+ async count(where) {
70
+ const e = await this.init();
71
+ const br = new FilterConsumerBridgeToKnexRequest(e);
72
+ where.__applyToConsumer(br);
73
+ let r = await br.resolveWhere();
74
+ const result = (await this.knex(e.$entityName)
75
+ .count().where(b => r.forEach(w => w(b))));
76
+ var row = result[0];
77
+ for (const key in row) {
78
+ if (Object.prototype.hasOwnProperty.call(row, key)) {
79
+ const element = row[key];
80
+ return +element;
81
+ }
82
+ }
83
+ }
84
+ async find(options) {
85
+ const e = await this.init();
86
+ let cols = [];
87
+ let colKeys = [];
88
+ for (const x of this.entity.fields) {
89
+ if (x.isServerExpression) {
90
+ }
91
+ else {
92
+ cols.push(e.$dbNameOf(x));
93
+ colKeys.push(x);
94
+ }
95
+ }
96
+ let query = this.knex(e.$entityName).select(cols);
97
+ if (options?.where) {
98
+ const br = new FilterConsumerBridgeToKnexRequest(e);
99
+ options.where.__applyToConsumer(br);
100
+ let r = await br.resolveWhere();
101
+ query.where(b => r.forEach(y => y(b)));
102
+ }
103
+ if (!options.orderBy) {
104
+ options.orderBy = Sort.createUniqueSort(this.entity, new Sort());
105
+ }
106
+ if (options.orderBy) {
107
+ query = query.orderBy(options.orderBy.Segments.map(s => ({
108
+ column: e.$dbNameOf(s.field),
109
+ order: s.isDescending ? "desc" : "asc"
110
+ })));
111
+ }
112
+ if (options.limit) {
113
+ query = query.limit(options.limit);
114
+ if (options.page)
115
+ query = query.offset((options.page - 1) * options.limit);
116
+ }
117
+ const r = await query;
118
+ return r.map(y => {
119
+ let result = {};
120
+ let i = 0;
121
+ for (let m in y) {
122
+ let field = colKeys[i++];
123
+ try {
124
+ result[field.key] = field.valueConverter.fromDb(y[m]);
125
+ }
126
+ catch (err) {
127
+ throw new Error("Failed to load from db:" + field.key + "\r\n" + err);
128
+ }
129
+ }
130
+ return result;
131
+ });
132
+ }
133
+ async init() {
134
+ return await dbNamesOf(this.entity);
135
+ }
136
+ async update(id, data) {
137
+ const e = await this.init();
138
+ let f = new FilterConsumerBridgeToKnexRequest(e);
139
+ Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
140
+ let resultFilter = this.entity.idMetadata.getIdFilter(id);
141
+ if (data.id != undefined)
142
+ resultFilter = this.entity.idMetadata.getIdFilter(data.id);
143
+ let updateObject = {};
144
+ for (const x of this.entity.fields) {
145
+ if (isDbReadonly(x, e)) { }
146
+ else if (data[x.key] !== undefined) {
147
+ let v = translateValueAndHandleArrayAndHandleArray(x, data[x.key]);
148
+ if (v !== undefined) {
149
+ let key = await e.$dbNameOf(x);
150
+ updateObject[key] = v;
151
+ }
152
+ }
153
+ }
154
+ let where = await f.resolveWhere();
155
+ await this.knex(e.$entityName).update(updateObject).where(b => where.forEach(w => w(b)));
156
+ return this.find({ where: Filter.fromEntityFilter(this.entity, resultFilter) }).then(y => y[0]);
157
+ }
158
+ async delete(id) {
159
+ const e = await this.init();
160
+ let f = new FilterConsumerBridgeToKnexRequest(e);
161
+ Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
162
+ let where = await f.resolveWhere();
163
+ await this.knex(e.$entityName).delete().where(b => where.forEach(w => w(b)));
164
+ }
165
+ async insert(data) {
166
+ const e = await this.init();
167
+ let resultFilter;
168
+ if (this.entity.idMetadata.field instanceof CompoundIdField)
169
+ resultFilter = this.entity.idMetadata.field.resultIdFilter(undefined, data);
170
+ else
171
+ resultFilter = Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(data[this.entity.idMetadata.field.key]));
172
+ let insertObject = {};
173
+ for (const x of this.entity.fields) {
174
+ if (isDbReadonly(x, e)) { }
175
+ else {
176
+ let v = translateValueAndHandleArrayAndHandleArray(x, data[x.key]);
177
+ if (v != undefined) {
178
+ let key = await e.$dbNameOf(x);
179
+ insertObject[key] = v;
180
+ }
181
+ }
182
+ }
183
+ let insert = this.knex(e.$entityName).insert(insertObject);
184
+ if (isAutoIncrement(this.entity.idMetadata.field)) {
185
+ let newId;
186
+ if (this.knex.client.config.client === 'mysql2') {
187
+ let result = await insert;
188
+ newId = result[0];
189
+ }
190
+ else {
191
+ let result = await insert.returning(this.entity.idMetadata.field.key);
192
+ newId = result[0].id;
193
+ }
194
+ resultFilter = new Filter(x => x.isEqualTo(this.entity.idMetadata.field, newId));
195
+ }
196
+ else
197
+ await insert;
198
+ return this.find({ where: resultFilter }).then(y => {
199
+ return y[0];
200
+ });
201
+ }
202
+ }
203
+ class FilterConsumerBridgeToKnexRequest {
204
+ nameProvider;
205
+ _addWhere = true;
206
+ promises = [];
207
+ result = [];
208
+ async resolveWhere() {
209
+ while (this.promises.length > 0) {
210
+ let p = this.promises;
211
+ this.promises = [];
212
+ for (const pr of p) {
213
+ await pr;
214
+ }
215
+ }
216
+ return this.result;
217
+ }
218
+ constructor(nameProvider) {
219
+ this.nameProvider = nameProvider;
220
+ }
221
+ custom(key, customItem) {
222
+ throw new Error("Custom filter should be translated before it gets here");
223
+ }
224
+ or(orElements) {
225
+ this.promises.push((async () => {
226
+ const result = [];
227
+ for (const element of orElements) {
228
+ let f = new FilterConsumerBridgeToKnexRequest(this.nameProvider);
229
+ f._addWhere = false;
230
+ element.__applyToConsumer(f);
231
+ let where = await f.resolveWhere();
232
+ if (where.length > 0) {
233
+ result.push(b => {
234
+ b.orWhere(b => {
235
+ where.forEach(x => x(b));
236
+ });
237
+ });
238
+ }
239
+ else
240
+ return; //empty or means all rows
241
+ }
242
+ if (result.length > 0) {
243
+ this.result.push(b => b.where(x => result.find(y => y(x))));
244
+ }
245
+ })());
246
+ }
247
+ isNull(col) {
248
+ this.result.push(b => b.whereNull(this.nameProvider.$dbNameOf(col)));
249
+ }
250
+ isNotNull(col) {
251
+ this.result.push(b => b.whereNotNull(this.nameProvider.$dbNameOf(col)));
252
+ }
253
+ isIn(col, val) {
254
+ this.result.push(knex => knex.whereIn(this.nameProvider.$dbNameOf(col), val.map(x => translateValueAndHandleArrayAndHandleArray(col, x))));
255
+ }
256
+ isEqualTo(col, val) {
257
+ this.add(col, val, "=");
258
+ }
259
+ isDifferentFrom(col, val) {
260
+ this.add(col, val, "<>");
261
+ }
262
+ isGreaterOrEqualTo(col, val) {
263
+ this.add(col, val, ">=");
264
+ }
265
+ isGreaterThan(col, val) {
266
+ this.add(col, val, ">");
267
+ }
268
+ isLessOrEqualTo(col, val) {
269
+ this.add(col, val, "<=");
270
+ }
271
+ isLessThan(col, val) {
272
+ this.add(col, val, "<");
273
+ }
274
+ containsCaseInsensitive(col, val) {
275
+ this.result.push(b => b.whereRaw('lower (' + b.client.ref(this.nameProvider.$dbNameOf(col)) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')"));
276
+ this.promises.push((async () => {
277
+ })());
278
+ }
279
+ add(col, val, operator) {
280
+ this.result.push(b => b.where(this.nameProvider.$dbNameOf(col), operator, translateValueAndHandleArrayAndHandleArray(col, val)));
281
+ }
282
+ databaseCustom(databaseCustom) {
283
+ this.promises.push((async () => {
284
+ if (databaseCustom?.buildKnex) {
285
+ this.result.push(await databaseCustom.buildKnex());
286
+ }
287
+ })());
288
+ }
289
+ }
290
+ export class KnexSchemaBuilder {
291
+ knex;
292
+ //@internal
293
+ static logToConsole = true;
294
+ async verifyStructureOfAllEntities(remult) {
295
+ if (!remult)
296
+ remult = remultContext;
297
+ const entities = allEntities.map(x => remult.repo(x).metadata);
298
+ this.ensureSchema(entities);
299
+ }
300
+ async ensureSchema(entities) {
301
+ for (const entity of entities) {
302
+ let e = await dbNamesOf(entity);
303
+ try {
304
+ if (!entity.options.sqlExpression) {
305
+ if (e.$entityName.toLowerCase().indexOf('from ') < 0) {
306
+ await this.createIfNotExist(entity);
307
+ await this.verifyAllColumns(entity);
308
+ }
309
+ }
310
+ }
311
+ catch (err) {
312
+ console.error("failed ensure schema of " + e.$entityName + " ", err);
313
+ }
314
+ }
315
+ }
316
+ async createIfNotExist(entity) {
317
+ const e = await dbNamesOf(entity);
318
+ if (!await this.knex.schema.hasTable(e.$entityName)) {
319
+ let cols = new Map();
320
+ for (const f of entity.fields) {
321
+ cols.set(f, {
322
+ name: e.$dbNameOf(f),
323
+ readonly: isDbReadonly(f, e)
324
+ });
325
+ }
326
+ await logSql(this.knex.schema.createTable(e.$entityName, b => {
327
+ for (const x of entity.fields) {
328
+ if (!cols.get(x).readonly || isAutoIncrement(x)) {
329
+ if (isAutoIncrement(x))
330
+ b.increments(cols.get(x).name);
331
+ else {
332
+ buildColumn(x, cols.get(x).name, b, supportsJson(this.knex));
333
+ if (x == entity.idMetadata.field)
334
+ b.primary([cols.get(x).name]);
335
+ }
336
+ }
337
+ }
338
+ }));
339
+ }
340
+ }
341
+ async addColumnIfNotExist(entity, c) {
342
+ let e = await dbNamesOf(entity);
343
+ if (isDbReadonly(c(entity), e))
344
+ return;
345
+ let col = c(entity);
346
+ let colName = e.$dbNameOf(col);
347
+ if (!await this.knex.schema.hasColumn(e.$entityName, colName)) {
348
+ await logSql(this.knex.schema.alterTable(e.$entityName, b => {
349
+ buildColumn(col, colName, b, supportsJson(this.knex));
350
+ }));
351
+ }
352
+ }
353
+ async verifyAllColumns(entity) {
354
+ let e = await dbNamesOf(entity);
355
+ try {
356
+ for (const col of entity.fields.toArray()) {
357
+ if (!isDbReadonly(col, e)) {
358
+ await this.addColumnIfNotExist(entity, () => col);
359
+ }
360
+ }
361
+ }
362
+ catch (err) {
363
+ console.error(err);
364
+ }
365
+ }
366
+ additionalWhere = '';
367
+ constructor(knex) {
368
+ this.knex = knex;
369
+ }
370
+ }
371
+ function supportsJson(knex) {
372
+ const client = knex.client.config.client;
373
+ if (client?.includes("sqlite3") || client?.includes("mssql"))
374
+ return false;
375
+ return true;
376
+ }
377
+ export function buildColumn(x, dbName, b, supportsJson = true) {
378
+ if (x.valueType == Number) {
379
+ if (!x.valueConverter.fieldTypeInDb) {
380
+ let c = b.decimal(dbName);
381
+ if (!x.allowNull) {
382
+ c.defaultTo(0).notNullable();
383
+ }
384
+ }
385
+ else if (x.valueConverter.fieldTypeInDb == "integer") {
386
+ let c = b.integer(dbName);
387
+ if (!x.allowNull) {
388
+ c.defaultTo(0).notNullable();
389
+ }
390
+ }
391
+ else
392
+ b.specificType(dbName, x.valueConverter.fieldTypeInDb);
393
+ }
394
+ else if (x.valueType == Date) {
395
+ if (!x.valueConverter.fieldTypeInDb)
396
+ if (x.valueConverter == ValueConverters.DateOnly)
397
+ b.date(dbName);
398
+ else
399
+ b.dateTime(dbName);
400
+ else if (x.valueConverter.fieldTypeInDb == "date")
401
+ b.date(dbName);
402
+ else
403
+ b.specificType(dbName, x.valueConverter.fieldTypeInDb);
404
+ }
405
+ else if (x.valueType == Boolean) {
406
+ let c = b.boolean(dbName);
407
+ if (!x.allowNull)
408
+ c.defaultTo(false).notNullable();
409
+ }
410
+ else if (x.valueConverter.fieldTypeInDb) {
411
+ if (x.valueConverter.fieldTypeInDb == "integer") {
412
+ let c = b.integer(dbName);
413
+ if (!x.allowNull) {
414
+ c.defaultTo(0).notNullable();
415
+ }
416
+ }
417
+ else if (x.valueConverter.fieldTypeInDb == "json")
418
+ if (supportsJson)
419
+ b.json(dbName);
420
+ else
421
+ b.text(dbName);
422
+ else
423
+ b.specificType(dbName, x.valueConverter.fieldTypeInDb);
424
+ }
425
+ else {
426
+ let c = b.string(dbName, x.options.maxLength);
427
+ if (!x.allowNull)
428
+ c.defaultTo('').notNullable();
429
+ }
430
+ }
431
+ function logSql(who) {
432
+ if (KnexSchemaBuilder.logToConsole)
433
+ console.info(who.toSQL());
434
+ return who;
435
+ }
436
+ export async function createKnexDataProvider(config) {
437
+ let k = (await import('knex')).default(config);
438
+ let result = new KnexDataProvider(k);
439
+ return result;
440
+ }
441
+ function translateValueAndHandleArrayAndHandleArray(field, val) {
442
+ let result = field.valueConverter.toDb(val);
443
+ if (Array.isArray(result))
444
+ return JSON.stringify(result);
445
+ return result;
446
+ }