remult 0.22.1 → 0.22.3

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 (257) hide show
  1. package/esm/graphql.js +27 -27
  2. package/esm/postgres/schema-builder.js +4 -4
  3. package/esm/remult-knex/index.js +2 -2
  4. package/esm/remult-mongo.js +6 -6
  5. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +30 -0
  6. package/esm/src/id-entity.d.ts +4 -0
  7. package/esm/src/id-entity.js +8 -0
  8. package/esm/src/remult3/RepositoryImplementation.js +7 -5
  9. package/esm/src/shared-tests/db-tests.db-tests.js +35 -0
  10. package/package.json +1 -1
  11. package/postgres/postgresColumnSyntax.d.ts +2 -0
  12. package/postgres/postgresColumnSyntax.js +34 -0
  13. package/remult-knex/index.js +2 -2
  14. package/remult-middleware.d.ts +2 -0
  15. package/remult-middleware.js +70 -0
  16. package/remult-mongo.js +6 -6
  17. package/server/register-actions-on-server.d.ts +3 -0
  18. package/server/register-actions-on-server.js +50 -0
  19. package/server/register-entities-on-server.d.ts +3 -0
  20. package/server/register-entities-on-server.js +19 -0
  21. package/src/backend-tests/backend-database-test-setup.backend-spec.js +60 -0
  22. package/{esm/core/src → src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  23. package/src/backend-tests/my-test.backend-spec.js +217 -0
  24. package/src/backend-tests/test-http-server.backend-spec.d.ts +6 -0
  25. package/src/backend-tests/test-http-server.backend-spec.js +342 -0
  26. package/src/id-entity.d.ts +4 -0
  27. package/src/id-entity.js +17 -0
  28. package/src/remult3/RepositoryImplementation.js +15 -13
  29. package/src/shared-tests/db-tests.db-tests.js +64 -0
  30. package/{esm/core/src/valueConverters.d.ts → valueConverters.d.ts} +12 -13
  31. package/valueConverters.js +168 -0
  32. package/esm/angular/interfaces/index.d.ts +0 -1
  33. package/esm/angular/interfaces/index.js +0 -1
  34. package/esm/angular/interfaces/src/column-collection.d.ts +0 -70
  35. package/esm/angular/interfaces/src/column-collection.js +0 -341
  36. package/esm/angular/interfaces/src/data-area-settings.d.ts +0 -15
  37. package/esm/angular/interfaces/src/data-area-settings.js +0 -35
  38. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +0 -36
  39. package/esm/angular/interfaces/src/data-control-interfaces.js +0 -57
  40. package/esm/angular/interfaces/src/dataList.d.ts +0 -13
  41. package/esm/angular/interfaces/src/dataList.js +0 -42
  42. package/esm/angular/interfaces/src/filter-helper.d.ts +0 -13
  43. package/esm/angular/interfaces/src/filter-helper.js +0 -59
  44. package/esm/angular/interfaces/src/grid-settings.d.ts +0 -145
  45. package/esm/angular/interfaces/src/grid-settings.js +0 -387
  46. package/esm/angular/interfaces/src/public_api.d.ts +0 -4
  47. package/esm/angular/interfaces/src/public_api.js +0 -4
  48. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +0 -4
  49. package/esm/angular/src/angular/RemultAngularPluginsService.js +0 -3
  50. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +0 -49
  51. package/esm/angular/src/angular/data-control/data-control2.component.js +0 -138
  52. package/esm/core/SseSubscriptionServer.d.ts +0 -33
  53. package/esm/core/SseSubscriptionServer.js +0 -107
  54. package/esm/core/assign.d.ts +0 -1
  55. package/esm/core/assign.js +0 -5
  56. package/esm/core/classType.d.ts +0 -3
  57. package/esm/core/classType.js +0 -1
  58. package/esm/core/index.d.ts +0 -27
  59. package/esm/core/index.js +0 -25
  60. package/esm/core/inputTypes.d.ts +0 -9
  61. package/esm/core/inputTypes.js +0 -9
  62. package/esm/core/live-query/data-provider-live-query-storage.d.ts +0 -22
  63. package/esm/core/live-query/data-provider-live-query-storage.js +0 -71
  64. package/esm/core/postgres/index.d.ts +0 -2
  65. package/esm/core/postgres/index.js +0 -2
  66. package/esm/core/postgres/postgres-data-provider.d.ts +0 -36
  67. package/esm/core/postgres/postgres-data-provider.js +0 -120
  68. package/esm/core/postgres/schema-builder.d.ts +0 -17
  69. package/esm/core/postgres/schema-builder.js +0 -153
  70. package/esm/core/remult-fresh.d.ts +0 -17
  71. package/esm/core/remult-fresh.js +0 -29
  72. package/esm/core/remult-knex/index.d.ts +0 -30
  73. package/esm/core/remult-knex/index.js +0 -446
  74. package/esm/core/remult-mongo.d.ts +0 -24
  75. package/esm/core/remult-mongo.js +0 -254
  76. package/esm/core/server/JsonEntityFileStorage.d.ts +0 -10
  77. package/esm/core/server/JsonEntityFileStorage.js +0 -25
  78. package/esm/core/server/core.d.ts +0 -4
  79. package/esm/core/server/core.js +0 -4
  80. package/esm/core/server/expressBridge.d.ts +0 -182
  81. package/esm/core/server/expressBridge.js +0 -938
  82. package/esm/core/server/index.d.ts +0 -6
  83. package/esm/core/server/index.js +0 -9
  84. package/esm/core/server/initAsyncHooks.d.ts +0 -1
  85. package/esm/core/server/initAsyncHooks.js +0 -9
  86. package/esm/core/server/initDataProvider.d.ts +0 -2
  87. package/esm/core/server/initDataProvider.js +0 -14
  88. package/esm/core/src/__EntityValueProvider.d.ts +0 -11
  89. package/esm/core/src/__EntityValueProvider.js +0 -1
  90. package/esm/core/src/__RowsOfDataForTesting.d.ts +0 -3
  91. package/esm/core/src/__RowsOfDataForTesting.js +0 -1
  92. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -6
  93. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -147
  94. package/esm/core/src/backend-tests/my-test.backend-spec.js +0 -197
  95. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +0 -1
  96. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +0 -167
  97. package/esm/core/src/buildRestDataProvider.d.ts +0 -31
  98. package/esm/core/src/buildRestDataProvider.js +0 -113
  99. package/esm/core/src/column-interfaces.d.ts +0 -154
  100. package/esm/core/src/column-interfaces.js +0 -7
  101. package/esm/core/src/column.d.ts +0 -58
  102. package/esm/core/src/column.js +0 -174
  103. package/esm/core/src/context.d.ts +0 -134
  104. package/esm/core/src/context.js +0 -286
  105. package/esm/core/src/data-api.d.ts +0 -39
  106. package/esm/core/src/data-api.js +0 -279
  107. package/esm/core/src/data-interfaces.d.ts +0 -41
  108. package/esm/core/src/data-interfaces.js +0 -12
  109. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +0 -22
  110. package/esm/core/src/data-providers/array-entity-data-provider.js +0 -252
  111. package/esm/core/src/data-providers/in-memory-database.d.ts +0 -9
  112. package/esm/core/src/data-providers/in-memory-database.js +0 -14
  113. package/esm/core/src/data-providers/json-data-provider.d.ts +0 -12
  114. package/esm/core/src/data-providers/json-data-provider.js +0 -55
  115. package/esm/core/src/data-providers/rest-data-provider.d.ts +0 -49
  116. package/esm/core/src/data-providers/rest-data-provider.js +0 -256
  117. package/esm/core/src/data-providers/sql-database.d.ts +0 -33
  118. package/esm/core/src/data-providers/sql-database.js +0 -384
  119. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +0 -24
  120. package/esm/core/src/data-providers/web-sql-data-provider.js +0 -143
  121. package/esm/core/src/entity.d.ts +0 -91
  122. package/esm/core/src/entity.js +0 -1
  123. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +0 -50
  124. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +0 -150
  125. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +0 -1
  126. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +0 -1
  127. package/esm/core/src/filter/filter-interfaces.d.ts +0 -85
  128. package/esm/core/src/filter/filter-interfaces.js +0 -477
  129. package/esm/core/src/live-query/LiveQueryClient.d.ts +0 -20
  130. package/esm/core/src/live-query/LiveQueryClient.js +0 -188
  131. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +0 -5
  132. package/esm/core/src/live-query/SseSubscriptionClient.js +0 -86
  133. package/esm/core/src/live-query/SubscriptionChannel.d.ts +0 -72
  134. package/esm/core/src/live-query/SubscriptionChannel.js +0 -123
  135. package/esm/core/src/live-query/SubscriptionServer.d.ts +0 -53
  136. package/esm/core/src/live-query/SubscriptionServer.js +0 -111
  137. package/esm/core/src/live-query/live-query-tests.spec.d.ts +0 -6
  138. package/esm/core/src/live-query/live-query-tests.spec.js +0 -952
  139. package/esm/core/src/remult-proxy.d.ts +0 -35
  140. package/esm/core/src/remult-proxy.js +0 -113
  141. package/esm/core/src/remult3/DecoratorReplacer.d.ts +0 -10
  142. package/esm/core/src/remult3/DecoratorReplacer.js +0 -20
  143. package/esm/core/src/remult3/RepositoryImplementation.d.ts +0 -355
  144. package/esm/core/src/remult3/RepositoryImplementation.js +0 -2109
  145. package/esm/core/src/remult3/index.d.ts +0 -2
  146. package/esm/core/src/remult3/index.js +0 -2
  147. package/esm/core/src/remult3/remult3.d.ts +0 -395
  148. package/esm/core/src/remult3/remult3.js +0 -2
  149. package/esm/core/src/server-action.d.ts +0 -81
  150. package/esm/core/src/server-action.js +0 -394
  151. package/esm/core/src/shared-tests/db-tests-setup.d.ts +0 -32
  152. package/esm/core/src/shared-tests/db-tests-setup.js +0 -78
  153. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +0 -25
  154. package/esm/core/src/shared-tests/db-tests.db-tests.js +0 -810
  155. package/esm/core/src/shared-tests/deleteAll.d.ts +0 -2
  156. package/esm/core/src/shared-tests/deleteAll.js +0 -4
  157. package/esm/core/src/shared-tests/entityWithValidations.d.ts +0 -14
  158. package/esm/core/src/shared-tests/entityWithValidations.js +0 -43
  159. package/esm/core/src/shared-tests/index.d.ts +0 -4
  160. package/esm/core/src/shared-tests/index.js +0 -4
  161. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +0 -1
  162. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +0 -67
  163. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +0 -10
  164. package/esm/core/src/shared-tests/test-special-value.spec.js +0 -73
  165. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +0 -1
  166. package/esm/core/src/shared-tests/test-update-with-null.spec.js +0 -31
  167. package/esm/core/src/sort.d.ts +0 -16
  168. package/esm/core/src/sort.js +0 -103
  169. package/esm/core/src/sql-command.d.ts +0 -19
  170. package/esm/core/src/sql-command.js +0 -1
  171. package/esm/core/src/test.d.ts +0 -3
  172. package/esm/core/src/test.js +0 -12
  173. package/esm/core/src/tests/Done.d.ts +0 -5
  174. package/esm/core/src/tests/Done.js +0 -9
  175. package/esm/core/src/tests/RowProvider.spec.d.ts +0 -16
  176. package/esm/core/src/tests/RowProvider.spec.js +0 -631
  177. package/esm/core/src/tests/TestDataApiResponse.d.ts +0 -10
  178. package/esm/core/src/tests/TestDataApiResponse.js +0 -22
  179. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +0 -8
  180. package/esm/core/src/tests/basicRowFunctionality.spec.js +0 -2103
  181. package/esm/core/src/tests/c.d.ts +0 -8
  182. package/esm/core/src/tests/c.js +0 -13
  183. package/esm/core/src/tests/createData.d.ts +0 -7
  184. package/esm/core/src/tests/createData.js +0 -22
  185. package/esm/core/src/tests/d.d.ts +0 -6
  186. package/esm/core/src/tests/d.js +0 -11
  187. package/esm/core/src/tests/dWithPrefilter.d.ts +0 -7
  188. package/esm/core/src/tests/dWithPrefilter.js +0 -18
  189. package/esm/core/src/tests/entityForCustomFilter.d.ts +0 -16
  190. package/esm/core/src/tests/entityForCustomFilter.js +0 -33
  191. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +0 -5
  192. package/esm/core/src/tests/entityWithValidationsOnColumn.js +0 -13
  193. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +0 -4
  194. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +0 -37
  195. package/esm/core/src/tests/h.d.ts +0 -6
  196. package/esm/core/src/tests/h.js +0 -24
  197. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +0 -1
  198. package/esm/core/src/tests/remult-3-basic-tests.spec.js +0 -236
  199. package/esm/core/src/tests/remult-3-entities.d.ts +0 -23
  200. package/esm/core/src/tests/remult-3-entities.js +0 -39
  201. package/esm/core/src/tests/tasks.d.ts +0 -6
  202. package/esm/core/src/tests/tasks.js +0 -10
  203. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  204. package/esm/core/src/tests/test-context-as-storage.spec.js +0 -1
  205. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +0 -1
  206. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +0 -389
  207. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +0 -5
  208. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +0 -152
  209. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +0 -1
  210. package/esm/core/src/tests/test-decorator-precedence.spec.js +0 -38
  211. package/esm/core/src/tests/test-default-value.spec.d.ts +0 -1
  212. package/esm/core/src/tests/test-default-value.spec.js +0 -33
  213. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +0 -14
  214. package/esm/core/src/tests/test-entity-inheritance.spec.js +0 -82
  215. package/esm/core/src/tests/test-exceptions.spec.d.ts +0 -1
  216. package/esm/core/src/tests/test-exceptions.spec.js +0 -375
  217. package/esm/core/src/tests/test-json.spec.d.ts +0 -1
  218. package/esm/core/src/tests/test-json.spec.js +0 -115
  219. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +0 -9
  220. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +0 -809
  221. package/esm/core/src/tests/test-non-active-record.spec.d.ts +0 -1
  222. package/esm/core/src/tests/test-non-active-record.spec.js +0 -66
  223. package/esm/core/src/tests/test-object-column.spec.d.ts +0 -1
  224. package/esm/core/src/tests/test-object-column.spec.js +0 -189
  225. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +0 -1
  226. package/esm/core/src/tests/test-paged-foreach.spec.js +0 -328
  227. package/esm/core/src/tests/test-remult-angular.spec.d.ts +0 -1
  228. package/esm/core/src/tests/test-remult-angular.spec.js +0 -23
  229. package/esm/core/src/tests/test-server-controller.spec.d.ts +0 -7
  230. package/esm/core/src/tests/test-server-controller.spec.js +0 -489
  231. package/esm/core/src/tests/test-server-expressions.spec.d.ts +0 -1
  232. package/esm/core/src/tests/test-server-expressions.spec.js +0 -178
  233. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +0 -1
  234. package/esm/core/src/tests/test-server-method-on-entity.spec.js +0 -306
  235. package/esm/core/src/tests/test-sql-expression.spec.d.ts +0 -5
  236. package/esm/core/src/tests/test-sql-expression.spec.js +0 -205
  237. package/esm/core/src/tests/test-sql.spec.d.ts +0 -1
  238. package/esm/core/src/tests/test-sql.spec.js +0 -170
  239. package/esm/core/src/tests/test-subscribe.spec.d.ts +0 -1
  240. package/esm/core/src/tests/test-subscribe.spec.js +0 -135
  241. package/esm/core/src/tests/test-type-recovery.spec.d.ts +0 -1
  242. package/esm/core/src/tests/test-type-recovery.spec.js +0 -49
  243. package/esm/core/src/tests/test-where-api.spec.d.ts +0 -1
  244. package/esm/core/src/tests/test-where-api.spec.js +0 -434
  245. package/esm/core/src/tests/testHelper.spec.d.ts +0 -36
  246. package/esm/core/src/tests/testHelper.spec.js +0 -226
  247. package/esm/core/src/tests/testModel/models.d.ts +0 -16
  248. package/esm/core/src/tests/testModel/models.js +0 -25
  249. package/esm/core/src/validators.d.ts +0 -14
  250. package/esm/core/src/validators.js +0 -33
  251. package/esm/core/src/valueConverters.js +0 -197
  252. package/esm/core/urlBuilder.d.ts +0 -6
  253. package/esm/core/urlBuilder.js +0 -20
  254. package/esm/test-servers/shared/Task.d.ts +0 -9
  255. package/esm/test-servers/shared/Task.js +0 -32
  256. package/esm/test.d.ts +0 -5
  257. package/esm/test.js +0 -6
package/esm/graphql.js CHANGED
@@ -208,16 +208,16 @@ export function remultGraphql(options) {
208
208
  {
209
209
  key: 'limit',
210
210
  value: 'Int',
211
- comment: `
212
- For **page by page** pagination.
213
- Limit the number of result.
211
+ comment: `
212
+ For **page by page** pagination.
213
+ Limit the number of result.
214
214
  _Side note: \`Math.ceil(totalCount / limit)\` to determine how many pages there are._`,
215
215
  },
216
216
  {
217
217
  key: 'page',
218
218
  value: 'Int',
219
- comment: `
220
- For **page by page** pagination.
219
+ comment: `
220
+ For **page by page** pagination.
221
221
  Select a dedicated page.`,
222
222
  },
223
223
  {
@@ -235,26 +235,26 @@ Select a dedicated page.`,
235
235
  queryArgsConnection.push({
236
236
  key: 'first',
237
237
  value: 'Int',
238
- comment: `
239
- For **forward cursor** pagination
238
+ comment: `
239
+ For **forward cursor** pagination
240
240
  Takes the \`first\`: \`n\` elements from the list.`,
241
241
  }, {
242
242
  key: 'after',
243
243
  value: 'String',
244
- comment: `
245
- For **forward cursor** pagination
244
+ comment: `
245
+ For **forward cursor** pagination
246
246
  \`after\` this \`cursor\`.`,
247
247
  }, {
248
248
  key: 'last',
249
249
  value: 'Int',
250
- comment: `
251
- For **backward cursor** pagination
250
+ comment: `
251
+ For **backward cursor** pagination
252
252
  Takes the \`last\`: \`n\` elements from the list.`,
253
253
  }, {
254
254
  key: 'before',
255
255
  value: 'String',
256
- comment: `
257
- For **backward cursor** pagination
256
+ comment: `
257
+ For **backward cursor** pagination
258
258
  \`before\` this \`cursor\`.`,
259
259
  });
260
260
  }
@@ -668,7 +668,7 @@ Select a dedicated page.`,
668
668
  : ``;
669
669
  return `${type}${orderByStr}${whereTypeStr}${whereTypeSubFieldsStr}`;
670
670
  })
671
- .join(`\n\n`)}
671
+ .join(`\n\n`)}
672
672
  `,
673
673
  };
674
674
  }
@@ -690,12 +690,12 @@ function blockFormat(obj) {
690
690
  if (obj.data.length === 0) {
691
691
  return ``;
692
692
  }
693
- const str = `${obj.prefix} {
694
- ${obj.data.join('\n ')}
693
+ const str = `${obj.prefix} {
694
+ ${obj.data.join('\n ')}
695
695
  }`;
696
- let commentsStr = `"""
697
- ${obj.comment}
698
- """
696
+ let commentsStr = `"""
697
+ ${obj.comment}
698
+ """
699
699
  `;
700
700
  if (_removeComments) {
701
701
  commentsStr = ``;
@@ -706,16 +706,16 @@ function argsFormat(args) {
706
706
  if (args) {
707
707
  return `(${args
708
708
  .map((arg) => {
709
- let strComment = `
710
- """
711
- ${arg.comment}
712
- """
709
+ let strComment = `
710
+ """
711
+ ${arg.comment}
712
+ """
713
713
  `;
714
714
  if (_removeComments || !arg.comment) {
715
715
  strComment = ``;
716
716
  }
717
717
  if (strComment) {
718
- return `${strComment} ${arg.key}: ${arg.value}
718
+ return `${strComment} ${arg.key}: ${arg.value}
719
719
  `;
720
720
  }
721
721
  return `${arg.key}: ${arg.value}`;
@@ -726,9 +726,9 @@ function argsFormat(args) {
726
726
  }
727
727
  function fieldFormat(field) {
728
728
  // First, the comment
729
- let strComment = `"""
730
- ${field.comment}
731
- """
729
+ let strComment = `"""
730
+ ${field.comment}
731
+ """
732
732
  `;
733
733
  if (_removeComments || !field.comment) {
734
734
  strComment = ``;
@@ -116,8 +116,8 @@ export class PostgresSchemaBuilder {
116
116
  try {
117
117
  let cmd = this.pool.createCommand();
118
118
  const colName = e.$dbNameOf(c(entity));
119
- if ((await cmd.execute(`select 1
120
- FROM information_schema.columns
119
+ if ((await cmd.execute(`select 1
120
+ FROM information_schema.columns
121
121
  WHERE table_name=${cmd.addParameterAndReturnSqlToken(e.$entityName.toLocaleLowerCase())} and column_name=${cmd.addParameterAndReturnSqlToken(colName.toLocaleLowerCase())}` + this.additionalWhere)).rows.length == 0) {
122
122
  let sql = `alter table ${e.$entityName} add column ${postgresColumnSyntax(c(entity), colName)}`;
123
123
  if (PostgresSchemaBuilder.logToConsole)
@@ -133,8 +133,8 @@ export class PostgresSchemaBuilder {
133
133
  try {
134
134
  let cmd = this.pool.createCommand();
135
135
  let e = await dbNamesOf(entity);
136
- let cols = (await cmd.execute(`select column_name
137
- FROM information_schema.columns
136
+ let cols = (await cmd.execute(`select column_name
137
+ FROM information_schema.columns
138
138
  WHERE table_name=${cmd.addParameterAndReturnSqlToken(e.$entityName.toLocaleLowerCase())} ` + this.additionalWhere)).rows.map((x) => x.column_name.toLocaleLowerCase());
139
139
  for (const col of entity.fields) {
140
140
  if (!isDbReadonly(col, e)) {
@@ -192,7 +192,7 @@ class KnexEntityDataProvider {
192
192
  let insert = this.knex(e.$entityName).insert(insertObject);
193
193
  if (isAutoIncrement(this.entity.idMetadata.field)) {
194
194
  let newId;
195
- if (this.knex.client.config.client === 'mysql2') {
195
+ if (this.knex.client.config.client === 'mysql2' || this.knex.client.config.client === 'mysql') {
196
196
  let result = await insert;
197
197
  newId = result[0];
198
198
  }
@@ -380,7 +380,7 @@ export class KnexSchemaBuilder {
380
380
  KnexSchemaBuilder.logToConsole = true;
381
381
  function supportsJson(knex) {
382
382
  const client = knex.client.config.client;
383
- if (client?.includes('sqlite3') || client?.includes('mssql'))
383
+ if (client?.includes('sqlite3') || client?.includes('mssql') || client?.includes('mysql'))
384
384
  return false;
385
385
  return true;
386
386
  }
@@ -59,7 +59,7 @@ class MongoEntityDataProvider {
59
59
  this.entity = entity;
60
60
  this.session = session;
61
61
  }
62
- translateFromJson(row, nameProvider) {
62
+ translateFromDb(row, nameProvider) {
63
63
  let result = {};
64
64
  for (const col of this.entity.fields) {
65
65
  let val = row[nameProvider.$dbNameOf(col)];
@@ -69,7 +69,7 @@ class MongoEntityDataProvider {
69
69
  }
70
70
  return result;
71
71
  }
72
- translateToJson(row, nameProvider) {
72
+ translateToDb(row, nameProvider) {
73
73
  let result = {};
74
74
  for (const col of this.entity.fields) {
75
75
  let val = col.valueConverter.toDb(row[col.key]);
@@ -109,7 +109,7 @@ class MongoEntityDataProvider {
109
109
  }
110
110
  return await Promise.all(await collection
111
111
  .find(where, op)
112
- .map((x) => this.translateFromJson(x, e))
112
+ .map((x) => this.translateFromDb(x, e))
113
113
  .toArray());
114
114
  }
115
115
  async update(id, data) {
@@ -129,7 +129,7 @@ class MongoEntityDataProvider {
129
129
  for (const f of this.entity.fields) {
130
130
  if (!f.dbReadOnly && !f.isServerExpression) {
131
131
  if (keys.includes(f.key)) {
132
- newR[f.key] = f.valueConverter.toJson(data[f.key]);
132
+ newR[f.key] = f.valueConverter.toDb(data[f.key]);
133
133
  }
134
134
  }
135
135
  }
@@ -148,10 +148,10 @@ class MongoEntityDataProvider {
148
148
  }
149
149
  async insert(data) {
150
150
  let { collection, e } = await this.collection();
151
- let r = await collection.insertOne(await this.translateToJson(data, e), {
151
+ let r = await collection.insertOne(await this.translateToDb(data, e), {
152
152
  session: this.session,
153
153
  });
154
- return await this.translateFromJson(await collection.findOne({ _id: r.insertedId }, { session: this.session }), e);
154
+ return await this.translateFromDb(await collection.findOne({ _id: r.insertedId }, { session: this.session }), e);
155
155
  }
156
156
  async collection() {
157
157
  const e = await dbNamesOf(this.entity);
@@ -64,6 +64,16 @@ export const mySqlTest = addDatabaseToTest(testKnexSqlImpl(Knex.default({
64
64
  database: 'test',
65
65
  },
66
66
  }), 'mysql2'));
67
+ addDatabaseToTest(testKnexSqlImpl(Knex.default({
68
+ client: 'mysql',
69
+ connection: {
70
+ user: 'root',
71
+ password: 'MASTERKEY',
72
+ host: '127.0.0.1',
73
+ database: 'test',
74
+ port: 3307
75
+ },
76
+ }), 'mysql'));
67
77
  let pg = createPostgresConnection();
68
78
  export function testPostgresImplementation(key, what, focus = false) {
69
79
  itWithFocus(key + ' - postgres', async () => {
@@ -199,4 +209,24 @@ testMongoNoTrans('transactions mongo no trans', async ({ db, createEntity }) =>
199
209
  }
200
210
  expect(await x.count()).toBe(1);
201
211
  }, false);
212
+ testMongoNoTrans('test Dates', async ({ createEntity }) => {
213
+ const c = class {
214
+ };
215
+ describeClass(c, Entity('test_dates_on_mongo'), {
216
+ id: Fields.integer(),
217
+ date: Fields.date(),
218
+ });
219
+ const r = await createEntity(c);
220
+ let x = await r.insert({ id: 1, date: new Date(1976, 5, 16) });
221
+ const client = new MongoClient('mongodb://localhost:27017/local');
222
+ await client.connect();
223
+ const mongoDb = client.db('test');
224
+ expect((await mongoDb.collection(await r.metadata.getDbName()).findOne())
225
+ .date instanceof Date).toBe(true);
226
+ x.date = new Date(1978, 2, 15);
227
+ await r.save(x);
228
+ expect((await mongoDb.collection(await r.metadata.getDbName()).findOne())
229
+ .date instanceof Date).toBe(true);
230
+ //let z = await r.save({ ...x, date: new Date(1978, 2, 15) })
231
+ }, false);
202
232
  import '../shared-tests';
@@ -0,0 +1,4 @@
1
+ import { EntityBase } from './remult3';
2
+ export declare class IdEntity extends EntityBase {
3
+ id: string;
4
+ }
@@ -0,0 +1,8 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { EntityBase, Fields } from './remult3';
3
+ export class IdEntity extends EntityBase {
4
+ }
5
+ __decorate([
6
+ Fields.uuid(),
7
+ __metadata("design:type", String)
8
+ ], IdEntity.prototype, "id", void 0);
@@ -1834,11 +1834,13 @@ export function decorateColumnSettings(settings, remult) {
1834
1834
  isIdNumeric =
1835
1835
  remult.repo(settings.valueType).metadata.idMetadata.field
1836
1836
  .valueType === Number;
1837
- for (const key of [
1838
- 'fieldTypeInDb',
1839
- ]) {
1840
- //@ts-ignore
1841
- target[key] = ValueConverters.Integer[key];
1837
+ if (isIdNumeric) {
1838
+ for (const key of [
1839
+ 'fieldTypeInDb',
1840
+ ]) {
1841
+ //@ts-ignore
1842
+ target[key] = ValueConverters.Integer[key];
1843
+ }
1842
1844
  }
1843
1845
  }
1844
1846
  }
@@ -1082,3 +1082,38 @@ testAll('test relation to number id', async ({ createEntity }) => {
1082
1082
  expect(await taskRepo.count({ category: cat[1] })).toBe(1);
1083
1083
  expect(await taskRepo.count({ category: { $id: cat[0].id } })).toBe(2);
1084
1084
  }, false, { exclude: [TestDbs.mongo, TestDbs.mongoNoTrans] });
1085
+ testAll('test relation to string id', async ({ createEntity }) => {
1086
+ const category = class {
1087
+ constructor() {
1088
+ this.id = '';
1089
+ this.name = '';
1090
+ }
1091
+ };
1092
+ describeClass(category, Entity('rel_ID_string_categories', { allowApiCrud: true }), {
1093
+ id: Fields.cuid(),
1094
+ name: Fields.string(),
1095
+ });
1096
+ const task = class {
1097
+ constructor() {
1098
+ this.id = 0;
1099
+ this.title = '';
1100
+ }
1101
+ };
1102
+ describeClass(task, Entity('rel_ID_string_task', { allowApiCrud: true }), {
1103
+ id: Fields.autoIncrement(),
1104
+ title: Fields.string(),
1105
+ category: Field(() => category),
1106
+ });
1107
+ const catRepo = await createEntity(category);
1108
+ const taskRepo = await createEntity(task);
1109
+ const cat = await catRepo.insert([{ name: 'cat0' }, { name: 'cat1' }]);
1110
+ await taskRepo.insert([
1111
+ { title: 't1', category: cat[0] },
1112
+ { title: 't2', category: cat[0] },
1113
+ { title: 't3', category: cat[1] },
1114
+ ]);
1115
+ expect(taskRepo.fields.category.valueConverter.fieldTypeInDb).toBeUndefined();
1116
+ expect(await taskRepo.count({ category: cat[0] })).toBe(2);
1117
+ expect(await taskRepo.count({ category: cat[1] })).toBe(1);
1118
+ expect(await taskRepo.count({ category: { $id: cat[0].id } })).toBe(2);
1119
+ }, false, { exclude: [TestDbs.mongo, TestDbs.mongoNoTrans] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.22.1",
3
+ "version": "0.22.3",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "types": "index.d.ts",
6
6
  "module": "esm/index.js",
@@ -0,0 +1,2 @@
1
+ import { FieldMetadata } from '../src/column-interfaces';
2
+ export declare function postgresColumnSyntax(x: FieldMetadata, dbName: string): string;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postgresColumnSyntax = void 0;
4
+ var valueConverters_1 = require("../valueConverters");
5
+ function postgresColumnSyntax(x, dbName) {
6
+ var result = dbName;
7
+ if (x.valueType == Number) {
8
+ if (!x.valueConverter.fieldTypeInDb)
9
+ result += " numeric" + (x.allowNull ? "" : " default 0 not null");
10
+ else
11
+ result += " " + x.valueConverter.fieldTypeInDb + (x.allowNull ? "" : " default 0 not null");
12
+ }
13
+ else if (x.valueType == Date) {
14
+ if (!x.valueConverter.fieldTypeInDb)
15
+ if (x.valueConverter == valueConverters_1.ValueConverters.DateOnly)
16
+ result += " date";
17
+ else
18
+ result += " timestamp";
19
+ else
20
+ result += " " + x.valueConverter.fieldTypeInDb;
21
+ }
22
+ else if (x.valueType == Boolean)
23
+ result += " boolean" + (x.allowNull ? "" : " default false not null");
24
+ else if (x.valueConverter.fieldTypeInDb) {
25
+ result += " " + x.valueConverter.fieldTypeInDb;
26
+ if (!x.allowNull && x.valueConverter.fieldTypeInDb == 'integer') {
27
+ result += " default 0 not null";
28
+ }
29
+ }
30
+ else
31
+ result += " varchar" + (x.allowNull ? "" : " default '' not null");
32
+ return result;
33
+ }
34
+ exports.postgresColumnSyntax = postgresColumnSyntax;
@@ -375,7 +375,7 @@ var KnexEntityDataProvider = /** @class */ (function () {
375
375
  case 10:
376
376
  insert = this.knex(e.$entityName).insert(insertObject);
377
377
  if (!remult3_1.isAutoIncrement(this.entity.idMetadata.field)) return [3 /*break*/, 15];
378
- if (!(this.knex.client.config.client === 'mysql2')) return [3 /*break*/, 12];
378
+ if (!(this.knex.client.config.client === 'mysql2' || this.knex.client.config.client === 'mysql')) return [3 /*break*/, 12];
379
379
  return [4 /*yield*/, insert];
380
380
  case 11:
381
381
  result = _d.sent();
@@ -825,7 +825,7 @@ var KnexSchemaBuilder = /** @class */ (function () {
825
825
  exports.KnexSchemaBuilder = KnexSchemaBuilder;
826
826
  function supportsJson(knex) {
827
827
  var client = knex.client.config.client;
828
- if ((client === null || client === void 0 ? void 0 : client.includes('sqlite3')) || (client === null || client === void 0 ? void 0 : client.includes('mssql')))
828
+ if ((client === null || client === void 0 ? void 0 : client.includes('sqlite3')) || (client === null || client === void 0 ? void 0 : client.includes('mssql')) || (client === null || client === void 0 ? void 0 : client.includes('mysql')))
829
829
  return false;
830
830
  return true;
831
831
  }
@@ -0,0 +1,2 @@
1
+ import { RemultMiddlewareOptions } from './server/expressBridge';
2
+ export declare function remultMiddleware(options?: RemultMiddlewareOptions): import("./server/expressBridge").RemultExpressBridge;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remultMiddleware = void 0;
4
+ var expressBridge_1 = require("./server/expressBridge");
5
+ function remultMiddleware(options) {
6
+ var m = new middleware();
7
+ var app = Object.assign(function (req, res, next) { return m.handleRequest(req, res, next); }, {
8
+ route: function (path) { return m.route(path); }
9
+ });
10
+ return expressBridge_1.remultMiddlewareBase(app, options);
11
+ }
12
+ exports.remultMiddleware = remultMiddleware;
13
+ var middleware = /** @class */ (function () {
14
+ function middleware() {
15
+ this.map = new Map();
16
+ }
17
+ middleware.prototype.route = function (path) {
18
+ //consider using:
19
+ //* https://raw.githubusercontent.com/cmorten/opine/main/src/utils/pathToRegex.ts
20
+ //* https://github.com/pillarjs/path-to-regexp
21
+ var r = path.toLowerCase();
22
+ var m = new Map();
23
+ this.map.set(r, m);
24
+ var route = {
25
+ get: function (h) {
26
+ m.set("get", h);
27
+ return route;
28
+ },
29
+ put: function (h) {
30
+ m.set("put", h);
31
+ return route;
32
+ },
33
+ post: function (h) {
34
+ m.set("post", h);
35
+ return route;
36
+ },
37
+ delete: function (h) {
38
+ m.set("delete", h);
39
+ return route;
40
+ }
41
+ };
42
+ return route;
43
+ };
44
+ middleware.prototype.handleRequest = function (req, res, next) {
45
+ var lowerPath = req.path.toLowerCase();
46
+ var m = this.map.get(lowerPath);
47
+ if (m) {
48
+ var h = m.get(req.method.toLowerCase());
49
+ if (h) {
50
+ h(req, res, next);
51
+ return;
52
+ }
53
+ }
54
+ var idPosition = req.path.lastIndexOf('/');
55
+ if (idPosition >= 0) {
56
+ lowerPath = req.path.substring(0, idPosition) + '/:id';
57
+ m = this.map.get(lowerPath);
58
+ if (m) {
59
+ var h = m.get(req.method.toLowerCase());
60
+ if (h) {
61
+ req.params.id = req.path.substring(idPosition + 1);
62
+ h(req, res, next);
63
+ return;
64
+ }
65
+ }
66
+ }
67
+ next();
68
+ };
69
+ return middleware;
70
+ }());
package/remult-mongo.js CHANGED
@@ -101,7 +101,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
101
101
  this.entity = entity;
102
102
  this.session = session;
103
103
  }
104
- MongoEntityDataProvider.prototype.translateFromJson = function (row, nameProvider) {
104
+ MongoEntityDataProvider.prototype.translateFromDb = function (row, nameProvider) {
105
105
  var e_1, _a;
106
106
  var result = {};
107
107
  try {
@@ -122,7 +122,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
122
122
  }
123
123
  return result;
124
124
  };
125
- MongoEntityDataProvider.prototype.translateToJson = function (row, nameProvider) {
125
+ MongoEntityDataProvider.prototype.translateToDb = function (row, nameProvider) {
126
126
  var e_2, _a;
127
127
  var result = {};
128
128
  try {
@@ -206,7 +206,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
206
206
  _e = (_d = Promise).all;
207
207
  return [4 /*yield*/, collection
208
208
  .find(where, op)
209
- .map(function (x) { return _this.translateFromJson(x, e); })
209
+ .map(function (x) { return _this.translateFromDb(x, e); })
210
210
  .toArray()];
211
211
  case 3: return [4 /*yield*/, _e.apply(_d, [_g.sent()])];
212
212
  case 4: return [2 /*return*/, _g.sent()];
@@ -250,7 +250,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
250
250
  f_1 = _e.value;
251
251
  if (!f_1.dbReadOnly && !f_1.isServerExpression) {
252
252
  if (keys.includes(f_1.key)) {
253
- newR[f_1.key] = f_1.valueConverter.toJson(data[f_1.key]);
253
+ newR[f_1.key] = f_1.valueConverter.toDb(data[f_1.key]);
254
254
  }
255
255
  }
256
256
  }
@@ -305,13 +305,13 @@ var MongoEntityDataProvider = /** @class */ (function () {
305
305
  case 1:
306
306
  _a = _e.sent(), collection = _a.collection, e = _a.e;
307
307
  _c = (_b = collection).insertOne;
308
- return [4 /*yield*/, this.translateToJson(data, e)];
308
+ return [4 /*yield*/, this.translateToDb(data, e)];
309
309
  case 2: return [4 /*yield*/, _c.apply(_b, [_e.sent(), {
310
310
  session: this.session,
311
311
  }])];
312
312
  case 3:
313
313
  r = _e.sent();
314
- _d = this.translateFromJson;
314
+ _d = this.translateFromDb;
315
315
  return [4 /*yield*/, collection.findOne({ _id: r.insertedId }, { session: this.session })];
316
316
  case 4: return [4 /*yield*/, _d.apply(this, [_e.sent(), e])];
317
317
  case 5: return [2 /*return*/, _e.sent()];
@@ -0,0 +1,3 @@
1
+ import { SiteArea } from "./expressBridge";
2
+ import { ClassType } from "../classType";
3
+ export declare function registerActionsOnServer(area: SiteArea, controllers?: ClassType<any>[]): void;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerActionsOnServer = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var server_action_1 = require("../src/server-action");
6
+ function registerActionsOnServer(area, controllers) {
7
+ var e_1, _a, e_2, _b;
8
+ var addAction = function (a) {
9
+ var x = a[server_action_1.serverActionField];
10
+ if (!x) {
11
+ throw 'failed to set server action, did you forget the BackendMethod Decorator?';
12
+ }
13
+ area.addAction(x);
14
+ };
15
+ server_action_1.actionInfo.runningOnServer = true;
16
+ if (controllers && controllers.length > 0) {
17
+ try {
18
+ for (var controllers_1 = tslib_1.__values(controllers), controllers_1_1 = controllers_1.next(); !controllers_1_1.done; controllers_1_1 = controllers_1.next()) {
19
+ var c = controllers_1_1.value;
20
+ var z = c[server_action_1.classBackendMethodsArray];
21
+ if (z)
22
+ try {
23
+ for (var z_1 = (e_2 = void 0, tslib_1.__values(z)), z_1_1 = z_1.next(); !z_1_1.done; z_1_1 = z_1.next()) {
24
+ var a = z_1_1.value;
25
+ addAction(a);
26
+ }
27
+ }
28
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
29
+ finally {
30
+ try {
31
+ if (z_1_1 && !z_1_1.done && (_b = z_1.return)) _b.call(z_1);
32
+ }
33
+ finally { if (e_2) throw e_2.error; }
34
+ }
35
+ }
36
+ }
37
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
38
+ finally {
39
+ try {
40
+ if (controllers_1_1 && !controllers_1_1.done && (_a = controllers_1.return)) _a.call(controllers_1);
41
+ }
42
+ finally { if (e_1) throw e_1.error; }
43
+ }
44
+ }
45
+ else
46
+ server_action_1.actionInfo.allActions.forEach(function (a) {
47
+ addAction(a);
48
+ });
49
+ }
50
+ exports.registerActionsOnServer = registerActionsOnServer;
@@ -0,0 +1,3 @@
1
+ import { SiteArea } from "./expressBridge";
2
+ import { ClassType } from "../classType";
3
+ export declare function registerEntitiesOnServer(area: SiteArea, entities?: ClassType<any>[]): void;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerEntitiesOnServer = void 0;
4
+ var remult3_1 = require("../src/remult3");
5
+ var context_1 = require("../src/context");
6
+ var data_api_1 = require("../src/data-api");
7
+ function registerEntitiesOnServer(area, entities) {
8
+ if (!entities)
9
+ entities = context_1.allEntities;
10
+ //add Api Entries
11
+ entities.forEach(function (e) {
12
+ var key = remult3_1.getEntityKey(e);
13
+ if (key != undefined)
14
+ area.add(key, function (c) {
15
+ return new data_api_1.DataApi(c.repo(e), c);
16
+ });
17
+ });
18
+ }
19
+ exports.registerEntitiesOnServer = registerEntitiesOnServer;