remult 0.22.2 → 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 (255) 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/src/backend-tests/backend-database-test-setup.backend-spec.js +10 -0
  5. package/esm/src/id-entity.d.ts +4 -0
  6. package/esm/src/id-entity.js +8 -0
  7. package/esm/src/remult3/RepositoryImplementation.js +7 -5
  8. package/esm/src/shared-tests/db-tests.db-tests.js +35 -0
  9. package/package.json +1 -1
  10. package/postgres/postgresColumnSyntax.d.ts +2 -0
  11. package/postgres/postgresColumnSyntax.js +34 -0
  12. package/remult-knex/index.js +2 -2
  13. package/remult-middleware.d.ts +2 -0
  14. package/remult-middleware.js +70 -0
  15. package/server/register-actions-on-server.d.ts +3 -0
  16. package/server/register-actions-on-server.js +50 -0
  17. package/server/register-entities-on-server.d.ts +3 -0
  18. package/server/register-entities-on-server.js +19 -0
  19. package/src/backend-tests/backend-database-test-setup.backend-spec.js +10 -0
  20. package/{esm/core/src → src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  21. package/src/backend-tests/my-test.backend-spec.js +217 -0
  22. package/src/backend-tests/test-http-server.backend-spec.d.ts +6 -0
  23. package/src/backend-tests/test-http-server.backend-spec.js +342 -0
  24. package/src/id-entity.d.ts +4 -0
  25. package/src/id-entity.js +17 -0
  26. package/src/remult3/RepositoryImplementation.js +15 -13
  27. package/src/shared-tests/db-tests.db-tests.js +64 -0
  28. package/{esm/core/src/valueConverters.d.ts → valueConverters.d.ts} +12 -13
  29. package/valueConverters.js +168 -0
  30. package/esm/angular/interfaces/index.d.ts +0 -1
  31. package/esm/angular/interfaces/index.js +0 -1
  32. package/esm/angular/interfaces/src/column-collection.d.ts +0 -70
  33. package/esm/angular/interfaces/src/column-collection.js +0 -341
  34. package/esm/angular/interfaces/src/data-area-settings.d.ts +0 -15
  35. package/esm/angular/interfaces/src/data-area-settings.js +0 -35
  36. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +0 -36
  37. package/esm/angular/interfaces/src/data-control-interfaces.js +0 -57
  38. package/esm/angular/interfaces/src/dataList.d.ts +0 -13
  39. package/esm/angular/interfaces/src/dataList.js +0 -42
  40. package/esm/angular/interfaces/src/filter-helper.d.ts +0 -13
  41. package/esm/angular/interfaces/src/filter-helper.js +0 -59
  42. package/esm/angular/interfaces/src/grid-settings.d.ts +0 -145
  43. package/esm/angular/interfaces/src/grid-settings.js +0 -387
  44. package/esm/angular/interfaces/src/public_api.d.ts +0 -4
  45. package/esm/angular/interfaces/src/public_api.js +0 -4
  46. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +0 -4
  47. package/esm/angular/src/angular/RemultAngularPluginsService.js +0 -3
  48. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +0 -49
  49. package/esm/angular/src/angular/data-control/data-control2.component.js +0 -138
  50. package/esm/core/SseSubscriptionServer.d.ts +0 -33
  51. package/esm/core/SseSubscriptionServer.js +0 -107
  52. package/esm/core/assign.d.ts +0 -1
  53. package/esm/core/assign.js +0 -5
  54. package/esm/core/classType.d.ts +0 -3
  55. package/esm/core/classType.js +0 -1
  56. package/esm/core/index.d.ts +0 -27
  57. package/esm/core/index.js +0 -25
  58. package/esm/core/inputTypes.d.ts +0 -9
  59. package/esm/core/inputTypes.js +0 -9
  60. package/esm/core/live-query/data-provider-live-query-storage.d.ts +0 -22
  61. package/esm/core/live-query/data-provider-live-query-storage.js +0 -71
  62. package/esm/core/postgres/index.d.ts +0 -2
  63. package/esm/core/postgres/index.js +0 -2
  64. package/esm/core/postgres/postgres-data-provider.d.ts +0 -36
  65. package/esm/core/postgres/postgres-data-provider.js +0 -120
  66. package/esm/core/postgres/schema-builder.d.ts +0 -17
  67. package/esm/core/postgres/schema-builder.js +0 -153
  68. package/esm/core/remult-fresh.d.ts +0 -17
  69. package/esm/core/remult-fresh.js +0 -29
  70. package/esm/core/remult-knex/index.d.ts +0 -30
  71. package/esm/core/remult-knex/index.js +0 -446
  72. package/esm/core/remult-mongo.d.ts +0 -24
  73. package/esm/core/remult-mongo.js +0 -254
  74. package/esm/core/server/JsonEntityFileStorage.d.ts +0 -10
  75. package/esm/core/server/JsonEntityFileStorage.js +0 -25
  76. package/esm/core/server/core.d.ts +0 -4
  77. package/esm/core/server/core.js +0 -4
  78. package/esm/core/server/expressBridge.d.ts +0 -182
  79. package/esm/core/server/expressBridge.js +0 -938
  80. package/esm/core/server/index.d.ts +0 -6
  81. package/esm/core/server/index.js +0 -9
  82. package/esm/core/server/initAsyncHooks.d.ts +0 -1
  83. package/esm/core/server/initAsyncHooks.js +0 -9
  84. package/esm/core/server/initDataProvider.d.ts +0 -2
  85. package/esm/core/server/initDataProvider.js +0 -14
  86. package/esm/core/src/__EntityValueProvider.d.ts +0 -11
  87. package/esm/core/src/__EntityValueProvider.js +0 -1
  88. package/esm/core/src/__RowsOfDataForTesting.d.ts +0 -3
  89. package/esm/core/src/__RowsOfDataForTesting.js +0 -1
  90. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -6
  91. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -147
  92. package/esm/core/src/backend-tests/my-test.backend-spec.js +0 -197
  93. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +0 -1
  94. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +0 -167
  95. package/esm/core/src/buildRestDataProvider.d.ts +0 -31
  96. package/esm/core/src/buildRestDataProvider.js +0 -113
  97. package/esm/core/src/column-interfaces.d.ts +0 -154
  98. package/esm/core/src/column-interfaces.js +0 -7
  99. package/esm/core/src/column.d.ts +0 -58
  100. package/esm/core/src/column.js +0 -174
  101. package/esm/core/src/context.d.ts +0 -134
  102. package/esm/core/src/context.js +0 -286
  103. package/esm/core/src/data-api.d.ts +0 -39
  104. package/esm/core/src/data-api.js +0 -279
  105. package/esm/core/src/data-interfaces.d.ts +0 -41
  106. package/esm/core/src/data-interfaces.js +0 -12
  107. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +0 -22
  108. package/esm/core/src/data-providers/array-entity-data-provider.js +0 -252
  109. package/esm/core/src/data-providers/in-memory-database.d.ts +0 -9
  110. package/esm/core/src/data-providers/in-memory-database.js +0 -14
  111. package/esm/core/src/data-providers/json-data-provider.d.ts +0 -12
  112. package/esm/core/src/data-providers/json-data-provider.js +0 -55
  113. package/esm/core/src/data-providers/rest-data-provider.d.ts +0 -49
  114. package/esm/core/src/data-providers/rest-data-provider.js +0 -256
  115. package/esm/core/src/data-providers/sql-database.d.ts +0 -33
  116. package/esm/core/src/data-providers/sql-database.js +0 -384
  117. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +0 -24
  118. package/esm/core/src/data-providers/web-sql-data-provider.js +0 -143
  119. package/esm/core/src/entity.d.ts +0 -91
  120. package/esm/core/src/entity.js +0 -1
  121. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +0 -50
  122. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +0 -150
  123. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +0 -1
  124. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +0 -1
  125. package/esm/core/src/filter/filter-interfaces.d.ts +0 -85
  126. package/esm/core/src/filter/filter-interfaces.js +0 -477
  127. package/esm/core/src/live-query/LiveQueryClient.d.ts +0 -20
  128. package/esm/core/src/live-query/LiveQueryClient.js +0 -188
  129. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +0 -5
  130. package/esm/core/src/live-query/SseSubscriptionClient.js +0 -86
  131. package/esm/core/src/live-query/SubscriptionChannel.d.ts +0 -72
  132. package/esm/core/src/live-query/SubscriptionChannel.js +0 -123
  133. package/esm/core/src/live-query/SubscriptionServer.d.ts +0 -53
  134. package/esm/core/src/live-query/SubscriptionServer.js +0 -111
  135. package/esm/core/src/live-query/live-query-tests.spec.d.ts +0 -6
  136. package/esm/core/src/live-query/live-query-tests.spec.js +0 -952
  137. package/esm/core/src/remult-proxy.d.ts +0 -35
  138. package/esm/core/src/remult-proxy.js +0 -113
  139. package/esm/core/src/remult3/DecoratorReplacer.d.ts +0 -10
  140. package/esm/core/src/remult3/DecoratorReplacer.js +0 -20
  141. package/esm/core/src/remult3/RepositoryImplementation.d.ts +0 -355
  142. package/esm/core/src/remult3/RepositoryImplementation.js +0 -2109
  143. package/esm/core/src/remult3/index.d.ts +0 -2
  144. package/esm/core/src/remult3/index.js +0 -2
  145. package/esm/core/src/remult3/remult3.d.ts +0 -395
  146. package/esm/core/src/remult3/remult3.js +0 -2
  147. package/esm/core/src/server-action.d.ts +0 -81
  148. package/esm/core/src/server-action.js +0 -394
  149. package/esm/core/src/shared-tests/db-tests-setup.d.ts +0 -32
  150. package/esm/core/src/shared-tests/db-tests-setup.js +0 -78
  151. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +0 -25
  152. package/esm/core/src/shared-tests/db-tests.db-tests.js +0 -810
  153. package/esm/core/src/shared-tests/deleteAll.d.ts +0 -2
  154. package/esm/core/src/shared-tests/deleteAll.js +0 -4
  155. package/esm/core/src/shared-tests/entityWithValidations.d.ts +0 -14
  156. package/esm/core/src/shared-tests/entityWithValidations.js +0 -43
  157. package/esm/core/src/shared-tests/index.d.ts +0 -4
  158. package/esm/core/src/shared-tests/index.js +0 -4
  159. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +0 -1
  160. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +0 -67
  161. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +0 -10
  162. package/esm/core/src/shared-tests/test-special-value.spec.js +0 -73
  163. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +0 -1
  164. package/esm/core/src/shared-tests/test-update-with-null.spec.js +0 -31
  165. package/esm/core/src/sort.d.ts +0 -16
  166. package/esm/core/src/sort.js +0 -103
  167. package/esm/core/src/sql-command.d.ts +0 -19
  168. package/esm/core/src/sql-command.js +0 -1
  169. package/esm/core/src/test.d.ts +0 -3
  170. package/esm/core/src/test.js +0 -12
  171. package/esm/core/src/tests/Done.d.ts +0 -5
  172. package/esm/core/src/tests/Done.js +0 -9
  173. package/esm/core/src/tests/RowProvider.spec.d.ts +0 -16
  174. package/esm/core/src/tests/RowProvider.spec.js +0 -631
  175. package/esm/core/src/tests/TestDataApiResponse.d.ts +0 -10
  176. package/esm/core/src/tests/TestDataApiResponse.js +0 -22
  177. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +0 -8
  178. package/esm/core/src/tests/basicRowFunctionality.spec.js +0 -2103
  179. package/esm/core/src/tests/c.d.ts +0 -8
  180. package/esm/core/src/tests/c.js +0 -13
  181. package/esm/core/src/tests/createData.d.ts +0 -7
  182. package/esm/core/src/tests/createData.js +0 -22
  183. package/esm/core/src/tests/d.d.ts +0 -6
  184. package/esm/core/src/tests/d.js +0 -11
  185. package/esm/core/src/tests/dWithPrefilter.d.ts +0 -7
  186. package/esm/core/src/tests/dWithPrefilter.js +0 -18
  187. package/esm/core/src/tests/entityForCustomFilter.d.ts +0 -16
  188. package/esm/core/src/tests/entityForCustomFilter.js +0 -33
  189. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +0 -5
  190. package/esm/core/src/tests/entityWithValidationsOnColumn.js +0 -13
  191. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +0 -4
  192. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +0 -37
  193. package/esm/core/src/tests/h.d.ts +0 -6
  194. package/esm/core/src/tests/h.js +0 -24
  195. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +0 -1
  196. package/esm/core/src/tests/remult-3-basic-tests.spec.js +0 -236
  197. package/esm/core/src/tests/remult-3-entities.d.ts +0 -23
  198. package/esm/core/src/tests/remult-3-entities.js +0 -39
  199. package/esm/core/src/tests/tasks.d.ts +0 -6
  200. package/esm/core/src/tests/tasks.js +0 -10
  201. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  202. package/esm/core/src/tests/test-context-as-storage.spec.js +0 -1
  203. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +0 -1
  204. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +0 -389
  205. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +0 -5
  206. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +0 -152
  207. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +0 -1
  208. package/esm/core/src/tests/test-decorator-precedence.spec.js +0 -38
  209. package/esm/core/src/tests/test-default-value.spec.d.ts +0 -1
  210. package/esm/core/src/tests/test-default-value.spec.js +0 -33
  211. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +0 -14
  212. package/esm/core/src/tests/test-entity-inheritance.spec.js +0 -82
  213. package/esm/core/src/tests/test-exceptions.spec.d.ts +0 -1
  214. package/esm/core/src/tests/test-exceptions.spec.js +0 -375
  215. package/esm/core/src/tests/test-json.spec.d.ts +0 -1
  216. package/esm/core/src/tests/test-json.spec.js +0 -115
  217. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +0 -9
  218. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +0 -809
  219. package/esm/core/src/tests/test-non-active-record.spec.d.ts +0 -1
  220. package/esm/core/src/tests/test-non-active-record.spec.js +0 -66
  221. package/esm/core/src/tests/test-object-column.spec.d.ts +0 -1
  222. package/esm/core/src/tests/test-object-column.spec.js +0 -189
  223. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +0 -1
  224. package/esm/core/src/tests/test-paged-foreach.spec.js +0 -328
  225. package/esm/core/src/tests/test-remult-angular.spec.d.ts +0 -1
  226. package/esm/core/src/tests/test-remult-angular.spec.js +0 -23
  227. package/esm/core/src/tests/test-server-controller.spec.d.ts +0 -7
  228. package/esm/core/src/tests/test-server-controller.spec.js +0 -489
  229. package/esm/core/src/tests/test-server-expressions.spec.d.ts +0 -1
  230. package/esm/core/src/tests/test-server-expressions.spec.js +0 -178
  231. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +0 -1
  232. package/esm/core/src/tests/test-server-method-on-entity.spec.js +0 -306
  233. package/esm/core/src/tests/test-sql-expression.spec.d.ts +0 -5
  234. package/esm/core/src/tests/test-sql-expression.spec.js +0 -205
  235. package/esm/core/src/tests/test-sql.spec.d.ts +0 -1
  236. package/esm/core/src/tests/test-sql.spec.js +0 -170
  237. package/esm/core/src/tests/test-subscribe.spec.d.ts +0 -1
  238. package/esm/core/src/tests/test-subscribe.spec.js +0 -135
  239. package/esm/core/src/tests/test-type-recovery.spec.d.ts +0 -1
  240. package/esm/core/src/tests/test-type-recovery.spec.js +0 -49
  241. package/esm/core/src/tests/test-where-api.spec.d.ts +0 -1
  242. package/esm/core/src/tests/test-where-api.spec.js +0 -434
  243. package/esm/core/src/tests/testHelper.spec.d.ts +0 -36
  244. package/esm/core/src/tests/testHelper.spec.js +0 -226
  245. package/esm/core/src/tests/testModel/models.d.ts +0 -16
  246. package/esm/core/src/tests/testModel/models.js +0 -25
  247. package/esm/core/src/validators.d.ts +0 -14
  248. package/esm/core/src/validators.js +0 -33
  249. package/esm/core/src/valueConverters.js +0 -197
  250. package/esm/core/urlBuilder.d.ts +0 -6
  251. package/esm/core/urlBuilder.js +0 -20
  252. package/esm/test-servers/shared/Task.d.ts +0 -9
  253. package/esm/test-servers/shared/Task.js +0 -32
  254. package/esm/test.d.ts +0 -5
  255. package/esm/test.js +0 -6
@@ -1,306 +0,0 @@
1
- import { ActionTestConfig, testRestDb } from './testHelper.spec';
2
- import { TestDataApiResponse } from "./TestDataApiResponse";
3
- import { Remult, isBackend } from '../context';
4
- import { actionInfo, BackendMethod } from '../server-action';
5
- import { Field, Entity, EntityBase, getEntityRef, Fields } from '../remult3';
6
- import { InMemoryDataProvider } from '../data-providers/in-memory-database';
7
- import { DataApi } from '../data-api';
8
- import { assign } from '../../assign';
9
- import { dWithPrefilter } from './dWithPrefilter';
10
- import { describeClass } from '../remult3/DecoratorReplacer';
11
- @Entity('testServerMethodOnEntity')
12
- class testServerMethodOnEntity extends EntityBase {
13
- remult;
14
- constructor(remult) {
15
- super();
16
- this.remult = remult;
17
- }
18
- @Fields.string({
19
- validate: (y, x) => {
20
- if (y.a == "errorc") {
21
- x.error = "error on client";
22
- }
23
- else if (y.a == "error on server" && isBackend()) {
24
- x.error = "error on server";
25
- }
26
- }
27
- })
28
- a;
29
- @BackendMethod({ allowed: true })
30
- async doIt1() {
31
- let result = 'hello ' + this.a;
32
- this.a = 'yael';
33
- return {
34
- onServer: isBackend(),
35
- result
36
- };
37
- }
38
- async doIt1NoDecorator() {
39
- let result = 'hello ' + this.a;
40
- this.a = 'yael';
41
- return {
42
- onServer: isBackend(),
43
- result
44
- };
45
- }
46
- @BackendMethod({ allowed: true })
47
- async doItAgain() {
48
- expect(await this.remult.repo(testServerMethodOnEntity).count()).toBe(0);
49
- await this._.save();
50
- expect(await this.remult.repo(testServerMethodOnEntity).count()).toBe(1);
51
- return (await this.remult.repo(testServerMethodOnEntity).findFirst()).a;
52
- }
53
- }
54
- describeClass(testServerMethodOnEntity, undefined, {
55
- doIt1NoDecorator: BackendMethod({ allowed: true, paramTypes: [Remult] })
56
- });
57
- @Entity('testBoolCreate123', (o, c) => assign(o, {
58
- allowApiCrud: true,
59
- saving: async (t) => {
60
- if (isBackend() && t._.isNew()) {
61
- await c.repo(testBoolCreate123).count();
62
- await new Promise((res, rej) => setTimeout(() => {
63
- res({});
64
- }, 20));
65
- t.ok123 = true;
66
- }
67
- }
68
- }))
69
- class testBoolCreate123 extends EntityBase {
70
- @Fields.number()
71
- id;
72
- @Fields.boolean({})
73
- ok123 = false;
74
- @BackendMethod({ allowed: true })
75
- async testIt() {
76
- await this._.save();
77
- }
78
- }
79
- describe("test Server method in entity", () => {
80
- let c = new Remult();
81
- it("test server method on Entity", async () => {
82
- let x = c.repo(testServerMethodOnEntity).create();
83
- x.a = 'Noam';
84
- let r = await x.doIt1();
85
- expect(r.onServer).toBe(true);
86
- expect(r.result).toBe('hello Noam');
87
- expect(x.a).toBe("yael");
88
- });
89
- it("test server method on Entity without decorator", async () => {
90
- let x = c.repo(testServerMethodOnEntity).create();
91
- x.a = 'Noam';
92
- let r = await x.doIt1NoDecorator();
93
- expect(r.onServer).toBe(true);
94
- expect(r.result).toBe('hello Noam');
95
- expect(x.a).toBe("yael");
96
- });
97
- it("test server method on Entity", async () => {
98
- let x = c.repo(testServerMethodOnEntity).create();
99
- x.a = 'Noam';
100
- expect(await x.doItAgain()).toBe("Noam");
101
- });
102
- it("test validation method", async () => {
103
- let x = c.repo(testServerMethodOnEntity).create();
104
- x.a = 'errorc';
105
- let happened = false;
106
- try {
107
- let r = await x.doIt1();
108
- happened = true;
109
- }
110
- catch (err) {
111
- expect(err.modelState.a).toBe("error on client");
112
- expect(getEntityRef(x).fields.a.error).toBe("error on client");
113
- }
114
- expect(happened).toBe(false);
115
- });
116
- it("test backend method with adhoc entity", async () => {
117
- const myClass = class {
118
- id = 0;
119
- name = '';
120
- async doSomething() {
121
- return this.name + isBackend();
122
- }
123
- };
124
- describeClass(myClass, Entity('adHocEntity'), {
125
- id: Fields.autoIncrement(),
126
- name: Fields.string(),
127
- doSomething: BackendMethod({ allowed: true }),
128
- });
129
- const x = new Remult().repo(myClass).create();
130
- x.name = "123";
131
- expect(await x.doSomething()).toBe("123true");
132
- });
133
- it("test static backend method with adhoc entity", async () => {
134
- const myClass = class {
135
- id = 0;
136
- name = '';
137
- static async adHockDoSomething() {
138
- return isBackend();
139
- }
140
- };
141
- describeClass(myClass, Entity('adHocEntity'), {
142
- id: Fields.autoIncrement(),
143
- name: Fields.string()
144
- }, {
145
- adHockDoSomething: BackendMethod({ allowed: true }),
146
- });
147
- expect(await myClass.adHockDoSomething()).toBe(true);
148
- });
149
- it("test validation on server", async () => {
150
- let x = c.repo(testServerMethodOnEntity).create();
151
- x.a = "error on server";
152
- let happened = false;
153
- try {
154
- let r = await x.doIt1();
155
- happened = true;
156
- }
157
- catch (err) {
158
- expect(err.modelState.a).toBe("error on server");
159
- expect(getEntityRef(x).fields.a.error).toBe("error on server");
160
- }
161
- expect(happened).toBe(false);
162
- });
163
- it("saves correctly to db", async () => {
164
- actionInfo.runningOnServer = true;
165
- let remult = new Remult();
166
- remult.dataProvider = (new InMemoryDataProvider());
167
- let r = remult.repo(testBoolCreate123);
168
- let dataApi = new DataApi(r, remult);
169
- let t = new TestDataApiResponse();
170
- t.created = x => {
171
- expect(x.ok123).toBe(true);
172
- };
173
- await dataApi.post(t, { id: 1, ok123: false });
174
- t.success = x => {
175
- expect(x.ok123).toBe(false);
176
- };
177
- await dataApi.put(t, 1, { ok123: false });
178
- actionInfo.runningOnServer = false;
179
- });
180
- });
181
- @Entity('a')
182
- class a extends EntityBase {
183
- @Fields.integer()
184
- id;
185
- }
186
- @Entity('b')
187
- class b extends EntityBase {
188
- @Fields.integer()
189
- id;
190
- @Field(() => a)
191
- a;
192
- }
193
- @Entity('c')
194
- class c extends EntityBase {
195
- remult;
196
- @Fields.integer()
197
- id;
198
- @Field(() => b)
199
- b;
200
- @BackendMethod({ allowed: true })
201
- async doIt() {
202
- expect(this.b.id).toBe(11);
203
- expect(this.b.a.id).toBe(1);
204
- this.b = await this.remult.repo(b).findId(12);
205
- expect(this.b.id).toBe(12);
206
- expect(this.b.a.id).toBe(2);
207
- await this.save();
208
- return this.b.a.id;
209
- }
210
- @BackendMethod({ allowed: true })
211
- async doIt2() {
212
- expect(this.b.id).toBe(12);
213
- expect(this.b.a.id).toBe(2);
214
- await this.save();
215
- return this.b.a.id;
216
- }
217
- constructor(remult) {
218
- super();
219
- this.remult = remult;
220
- }
221
- }
222
- describe("complex entity relations on server entity and backend method", () => {
223
- beforeEach(() => {
224
- ActionTestConfig.db.rows = [];
225
- });
226
- it("fix it", async () => {
227
- let remult = new Remult();
228
- remult.dataProvider = (ActionTestConfig.db);
229
- let a1 = await remult.repo(a).create({ id: 1 }).save();
230
- let a2 = await remult.repo(a).create({ id: 2 }).save();
231
- let b1 = await remult.repo(b).create({ id: 11, a: a1 }).save();
232
- let b2 = await remult.repo(b).create({ id: 12, a: a2 }).save();
233
- let c1 = await remult.repo(c).create({ id: 21, b: b1 }).save();
234
- remult = new Remult(); //clear the cache;
235
- remult.dataProvider = (ActionTestConfig.db);
236
- let r = await c1.doIt();
237
- expect(r).toBe(2);
238
- expect(c1.b.id).toBe(12);
239
- expect(c1.b.a.id).toBe(2);
240
- });
241
- it("fix it new row", async () => {
242
- let remult = new Remult();
243
- remult.dataProvider = (ActionTestConfig.db);
244
- let a1 = await remult.repo(a).create({ id: 1 }).save();
245
- let a2 = await remult.repo(a).create({ id: 2 }).save();
246
- let b1 = await remult.repo(b).create({ id: 11, a: a1 }).save();
247
- let b2 = await remult.repo(b).create({ id: 12, a: a2 }).save();
248
- remult = new Remult(); //clear the cache;
249
- remult.dataProvider = (ActionTestConfig.db);
250
- let c1 = await remult.repo(c).create({ id: 21, b: b1 });
251
- let r = await c1.doIt();
252
- expect(r).toBe(2);
253
- expect(c1.b.id).toBe(12);
254
- expect(c1.b.a.id).toBe(2);
255
- });
256
- it("fix it change value", async () => {
257
- let remult = new Remult();
258
- remult.dataProvider = (ActionTestConfig.db);
259
- let a1 = await remult.repo(a).create({ id: 1 }).save();
260
- let a2 = await remult.repo(a).create({ id: 2 }).save();
261
- let b1 = await remult.repo(b).create({ id: 11, a: a1 }).save();
262
- let b2 = await remult.repo(b).create({ id: 12, a: a2 }).save();
263
- let c1 = await remult.repo(c).create({ id: 21, b: b1 }).save();
264
- remult = new Remult(); //clear the cache;
265
- remult.dataProvider = (ActionTestConfig.db);
266
- c1 = await remult.repo(c).findId(21);
267
- c1.b = b2;
268
- let r = await c1.doIt2();
269
- expect(r).toBe(2);
270
- expect(c1.b.id).toBe(12);
271
- expect(c1.b.a.id).toBe(2);
272
- });
273
- });
274
- it("test that entity backend method respects api filter", async () => {
275
- let remult = new Remult(ActionTestConfig.db);
276
- let repo = remult.repo(dWithPrefilter);
277
- await repo.query().forEach(x => x.delete());
278
- let d1 = await repo.create({ id: 1, b: 1 }).save();
279
- await repo.create({ id: 2, b: 1 }).save();
280
- await repo.create({ id: 3, b: 2 }).save();
281
- let d4 = await repo.create({ id: 4, b: 2 }).save();
282
- dWithPrefilter.count = 0;
283
- expect(await d4.doIt()).toBe(true);
284
- ;
285
- expect(dWithPrefilter.count).toBe(1);
286
- dWithPrefilter.count = 0;
287
- let error = false;
288
- try {
289
- await d1.doIt();
290
- }
291
- catch {
292
- error = true;
293
- }
294
- expect(error).toBe(true);
295
- expect(dWithPrefilter.count).toBe(0);
296
- });
297
- it("test api filter cant be overwritten", async () => {
298
- return testRestDb(async ({ remult }) => {
299
- let repo = remult.repo(dWithPrefilter);
300
- let d1 = await repo.create({ id: 1, b: 1 }).save();
301
- await repo.create({ id: 3, b: 2 }).save();
302
- let d4 = await repo.create({ id: 4, b: 2 }).save();
303
- expect(await repo.count({ b: 1 })).toBe(0);
304
- expect((await repo.find({ where: { b: 1 } })).length).toBe(0);
305
- });
306
- });
@@ -1,5 +0,0 @@
1
- import { SqlCommand, SqlResult } from '../sql-command';
2
- export declare class myDummySQLCommand implements SqlCommand {
3
- execute(sql: string): Promise<SqlResult>;
4
- addParameterAndReturnSqlToken(val: any): string;
5
- }
@@ -1,205 +0,0 @@
1
- import { Remult } from '../context';
2
- import { SqlDatabase } from '../data-providers/sql-database';
3
- import { WebSqlDataProvider } from '../data-providers/web-sql-data-provider';
4
- import { Field, Entity, EntityBase, ValueListFieldType, Fields, getValueList, ValueListInfo, IdEntity } from '../remult3';
5
- import { postgresColumnSyntax } from '../../postgres/schema-builder';
6
- import { FilterConsumerBridgeToSqlRequest, dbNamesOf, isDbReadonly } from '../filter/filter-consumer-bridge-to-sql-request';
7
- describe("test sql database expressions", () => {
8
- let web = new WebSqlDataProvider("test");
9
- let db = new SqlDatabase(web);
10
- let remult = new Remult();
11
- remult.dataProvider = (db);
12
- async function deleteAll() {
13
- await web.dropTable(remult.repo(testSqlExpression).metadata);
14
- await web.dropTable(remult.repo(expressionEntity).metadata);
15
- }
16
- it("test basics", async () => {
17
- await deleteAll();
18
- let x = remult.repo(testSqlExpression).create();
19
- x.code = 3;
20
- await x._.save();
21
- expect(x.code).toBe(3);
22
- expect(x.testExpression).toBe(15, "after save");
23
- expect(x._.fields.testExpression.originalValue).toBe(15, "after save");
24
- x = await remult.repo(testSqlExpression).findFirst();
25
- expect(x.testExpression).toBe(15);
26
- });
27
- it("test undefined behaves as a column", async () => {
28
- await deleteAll();
29
- let x = remult.repo(expressionEntity);
30
- let n = await dbNamesOf(x.metadata);
31
- expect((n.col)).toBe('col');
32
- expect((await x.create({ col: 'abc', id: 1 }).save()).col).toBe('abc');
33
- expect(isDbReadonly(x.metadata.fields.col, n)).toBe(false);
34
- let c = new Remult();
35
- c.dataProvider = (db);
36
- expressionEntity.yes = true;
37
- x = c.repo(expressionEntity);
38
- n = await dbNamesOf(x.metadata);
39
- expect(n.col).toBe("'1+1'");
40
- expect((await x.create({ col: 'abc', id: 2 }).save()).col).toBe('1+1');
41
- expect(isDbReadonly(x.metadata.fields.col, n)).toBe(true);
42
- });
43
- it("test asyync dbname", async () => {
44
- let z = await remult.repo(testServerExpression1).metadata.getDbName();
45
- expect(z).toBe('testServerExpression1');
46
- });
47
- });
48
- @Entity('expressionEntity')
49
- class expressionEntity extends EntityBase {
50
- @Fields.integer()
51
- id;
52
- static yes;
53
- @Fields.string({
54
- sqlExpression: async () => expressionEntity.yes ? "'1+1'" : undefined
55
- })
56
- col;
57
- }
58
- @Entity('testSqlExpression')
59
- class testSqlExpression extends EntityBase {
60
- @Fields.number()
61
- code;
62
- @Fields.number({
63
- sqlExpression: async (x) => {
64
- return await x.fields.code.getDbName() + ' * 5';
65
- }
66
- })
67
- testExpression;
68
- }
69
- @Entity('testServerExpression1', {
70
- sqlExpression: async () => new Promise(res => setTimeout(() => {
71
- res('testServerExpression1');
72
- }, 30))
73
- })
74
- class testServerExpression1 extends EntityBase {
75
- @Fields.number()
76
- code;
77
- }
78
- export class myDummySQLCommand {
79
- execute(sql) {
80
- throw new Error("Method not implemented.");
81
- }
82
- addParameterAndReturnSqlToken(val) {
83
- if (val === null)
84
- return "null";
85
- if (val instanceof Date)
86
- val = val.toISOString();
87
- if (typeof (val) == "string") {
88
- return '\'' + val.replace(/'/g, '\'\'') + '\'';
89
- }
90
- return val.toString();
91
- }
92
- }
93
- describe("test filter for date", () => {
94
- it("filter", async () => {
95
- let c = new Remult();
96
- let e = c.repo(testCreate);
97
- var d = new myDummySQLCommand();
98
- var db = await dbNamesOf(e.metadata);
99
- let f = new FilterConsumerBridgeToSqlRequest(d, db);
100
- f.isGreaterOrEqualTo(e.metadata.fields.theDate, new Date("2021-08-06T05:05:25.440Z"));
101
- expect(await f.resolveWhere()).toBe(" where theDate >= '" + new Date(2021, 7, 6).toISOString() + "'");
102
- });
103
- });
104
- describe("Postgres create db", () => {
105
- let c = new Remult();
106
- it("what", () => {
107
- let e = c.repo(testCreate);
108
- expect(postgresColumnSyntax(e.metadata.fields.theDate, "x")).toBe("x date");
109
- expect(postgresColumnSyntax(e.metadata.fields.i, "x")).toBe("x integer default 0 not null");
110
- expect(postgresColumnSyntax(e.metadata.fields.s, "x")).toBe("x varchar default '' not null", "s");
111
- expect(postgresColumnSyntax(e.metadata.fields.s2, "x")).toBe("x varchar default '' not null", "s2");
112
- });
113
- });
114
- @ValueListFieldType()
115
- class intId {
116
- id;
117
- caption;
118
- static z = new intId(0, '');
119
- constructor(id, caption) {
120
- this.id = id;
121
- this.caption = caption;
122
- }
123
- }
124
- @ValueListFieldType()
125
- class stringId {
126
- id;
127
- caption;
128
- static z = new stringId('0', '');
129
- constructor(id, caption) {
130
- this.id = id;
131
- this.caption = caption;
132
- }
133
- }
134
- @ValueListFieldType()
135
- class stringId2 {
136
- id;
137
- caption;
138
- static z = new stringId2();
139
- constructor(id, caption) {
140
- this.id = id;
141
- this.caption = caption;
142
- }
143
- }
144
- @Entity('testCreate')
145
- class testCreate extends IdEntity {
146
- @Fields.dateOnly()
147
- theDate;
148
- @Field(() => intId)
149
- i;
150
- @Field(() => stringId)
151
- s;
152
- @Field(() => stringId2)
153
- s2;
154
- }
155
- @ValueListFieldType({
156
- getValues: () => [
157
- new missingCaption('abc')
158
- ]
159
- })
160
- class missingCaption {
161
- id;
162
- constructor(id) {
163
- this.id = id;
164
- }
165
- caption;
166
- }
167
- @ValueListFieldType()
168
- class missingCaption2 {
169
- id;
170
- caption;
171
- static item = new missingCaption2("abc");
172
- constructor(id, caption) {
173
- this.id = id;
174
- this.caption = caption;
175
- }
176
- }
177
- describe("Test Value List Items", () => {
178
- it("require id", () => {
179
- try {
180
- const missingId = class {
181
- };
182
- ValueListFieldType({
183
- getValues: () => [
184
- new missingId()
185
- ]
186
- })(missingId);
187
- getValueList(missingId);
188
- expect(true).toBe(false, "should have failed and not reached this since it's missing an id");
189
- }
190
- catch {
191
- }
192
- });
193
- it("getValuesWorks Early", () => {
194
- expect(getValueList(missingCaption).length).toBe(1);
195
- });
196
- it("caption is auto generated", () => {
197
- expect(getValueList(missingCaption)[0].caption).toBe("Abc");
198
- });
199
- it("test caption 2", () => {
200
- expect(getValueList(missingCaption2)[0].caption).toBe("Abc");
201
- });
202
- it("find by id", () => {
203
- expect(ValueListInfo.get(missingCaption).byId("abc").caption).toBe("Abc");
204
- });
205
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,170 +0,0 @@
1
- import { WebSqlDataProvider } from '../data-providers/web-sql-data-provider';
2
- import { Remult } from '../context';
3
- import { SqlDatabase } from '../data-providers/sql-database';
4
- import { Categories } from './remult-3-entities';
5
- import { Entity, Fields } from '../remult3';
6
- import { testWebSqlImpl } from './frontend-database-tests-setup.spec';
7
- import { entityWithValidations } from '../shared-tests/entityWithValidations';
8
- import { dbNamesOf } from '../filter/filter-consumer-bridge-to-sql-request';
9
- describe("test sql database", () => {
10
- let db = new SqlDatabase(new WebSqlDataProvider("test"));
11
- let remult = new Remult();
12
- remult.dataProvider = (db);
13
- async function deleteAll() {
14
- for (const c of await remult.repo(Categories).find()) {
15
- await c._.delete();
16
- }
17
- }
18
- it("test basics", async () => {
19
- await deleteAll();
20
- expect(await remult.repo(Categories).count()).toBe(0);
21
- let c = remult.repo(Categories).create();
22
- c.id = 1;
23
- c.categoryName = "noam";
24
- await c._.save();
25
- expect(await remult.repo(Categories).count()).toBe(1);
26
- let cats = await remult.repo(Categories).find();
27
- expect(cats.length).toBe(1);
28
- expect(cats[0].id).toBe(1);
29
- expect(cats[0].categoryName).toBe("noam");
30
- });
31
- it("test transactions", async () => {
32
- await deleteAll();
33
- let sql = new WebSqlDataProvider("test");
34
- const prev = SqlDatabase.LogToConsole;
35
- SqlDatabase.LogToConsole = true;
36
- try {
37
- let db = new SqlDatabase({
38
- createCommand: () => sql.createCommand(),
39
- entityIsUsedForTheFirstTime: (e) => sql.entityIsUsedForTheFirstTime(e),
40
- getLimitSqlSyntax: (a, b) => sql.getLimitSqlSyntax(a, b),
41
- transaction: what => what(sql)
42
- });
43
- await db.transaction(async (dp) => {
44
- const repo = new Remult(dp).repo(Categories);
45
- expect(await repo.count({ categoryName: 'a' })).toBe(0);
46
- let ok = false;
47
- try {
48
- await dp.transaction(async () => { });
49
- ok = true;
50
- }
51
- catch {
52
- }
53
- expect(ok).toBe(false);
54
- });
55
- }
56
- finally {
57
- SqlDatabase.LogToConsole = false;
58
- }
59
- });
60
- it("query after transaction should fail", async () => {
61
- await deleteAll();
62
- let sql = new WebSqlDataProvider("test");
63
- let db = new SqlDatabase({
64
- createCommand: () => sql.createCommand(),
65
- entityIsUsedForTheFirstTime: (e) => sql.entityIsUsedForTheFirstTime(e),
66
- getLimitSqlSyntax: (a, b) => sql.getLimitSqlSyntax(a, b),
67
- transaction: what => what(sql)
68
- });
69
- let repo;
70
- await db.transaction(async (dp) => {
71
- repo = new Remult(dp).repo(Categories);
72
- });
73
- let ok = false;
74
- try {
75
- await repo.count({ categoryName: 'a' });
76
- ok = true;
77
- }
78
- catch { }
79
- expect(ok).toBe(false);
80
- });
81
- it("test column error", async () => {
82
- await deleteAll();
83
- await remult.repo(Categories).insert([{ categoryName: 'a', id: 1 }]);
84
- try {
85
- await remult.repo(testErrorInFromDb).find();
86
- }
87
- catch (err) {
88
- expect(err.message).toContain("categoryName");
89
- }
90
- });
91
- it("LogToConsole true", async () => {
92
- await deleteAll();
93
- SqlDatabase.LogToConsole = true;
94
- console.info = jasmine.createSpy("log");
95
- await remult.repo(Categories).insert([{ categoryName: 'a', id: 1 }]);
96
- expect(console.info).toHaveBeenCalledWith(jasmine.objectContaining({
97
- query: 'insert into Categories (CategoryID, categoryName) values (~1~, ~2~) returning CategoryID, categoryName, description, status',
98
- arguments: { "~1~": 1, "~2~": 'a' },
99
- }));
100
- SqlDatabase.LogToConsole = false;
101
- });
102
- it("LogToConsole oneLiner", async () => {
103
- await deleteAll();
104
- SqlDatabase.LogToConsole = "oneLiner";
105
- console.info = jasmine.createSpy("log");
106
- await remult.repo(Categories).insert([{ categoryName: 'a', id: 1 }]);
107
- expect(console.info).toHaveBeenCalledWith(jasmine.stringMatching('⚪'));
108
- SqlDatabase.LogToConsole = false;
109
- });
110
- it("LogToConsole fn", async () => {
111
- await deleteAll();
112
- SqlDatabase.LogToConsole = (duration, query, args) => { };
113
- SqlDatabase.LogToConsole = jasmine.createSpy("log");
114
- await remult.repo(Categories).insert([{ categoryName: 'a', id: 1 }]);
115
- expect(SqlDatabase.LogToConsole).toHaveBeenCalledWith(jasmine.anything(), 'insert into Categories (CategoryID, categoryName) values (~1~, ~2~) returning CategoryID, categoryName, description, status', jasmine.objectContaining({ "~1~": 1, "~2~": 'a' }));
116
- SqlDatabase.LogToConsole = false;
117
- });
118
- });
119
- @Entity("Categories")
120
- class testErrorInFromDb {
121
- @Fields.integer({ dbName: 'CategoryID' })
122
- id = 0;
123
- @Fields.string({
124
- valueConverter: {
125
- fromDb: x => { throw 'error'; }
126
- }
127
- })
128
- categoryName = '';
129
- }
130
- testWebSqlImpl("work with native sql", async ({ remult, createEntity }) => {
131
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
132
- const sql = SqlDatabase.getDb(remult);
133
- const r = await sql.execute("select count(*) as c from " + repo.metadata.options.dbName);
134
- expect(r.rows[0].c).toBe(4);
135
- }, false);
136
- testWebSqlImpl("work with native sql2", async ({ remult, createEntity }) => {
137
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
138
- const sql = WebSqlDataProvider.getDb(remult);
139
- await new Promise((res) => {
140
- sql.transaction(y => {
141
- y.executeSql("select count(*) as c from " + repo.metadata.options.dbName, undefined, (_, r) => {
142
- expect(r.rows[0].c).toBe(4);
143
- res({});
144
- });
145
- });
146
- });
147
- }, false);
148
- testWebSqlImpl("test getEntityDbNames", async ({ remult, createEntity }) => {
149
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
150
- const e = await dbNamesOf(repo);
151
- expect(`select ${e.myId}, ${e.name} from ${e}`)
152
- .toBe("select myId, name from entityWithValidations");
153
- }, false);
154
- testWebSqlImpl("test work with filter", async ({ remult, createEntity }) => {
155
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
156
- const e = await dbNamesOf(repo);
157
- expect(`select ${e.myId}, ${e.name} from ${e} where ${await SqlDatabase.filterToRaw(repo, {
158
- myId: [1, 3]
159
- })}`)
160
- .toBe("select myId, name from entityWithValidations where myId in (1,3)");
161
- }, false);
162
- testWebSqlImpl("test work with filter", async ({ remult, createEntity }) => {
163
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
164
- const command = SqlDatabase.getDb(remult).createCommand();
165
- const e = await dbNamesOf(repo);
166
- expect(`select ${e.myId}, ${e.name} from ${e} where ${await SqlDatabase.filterToRaw(repo, {
167
- myId: [1, 3]
168
- }, command)}`)
169
- .toBe("select myId, name from entityWithValidations where myId in (~1~,~2~)");
170
- }, false);
@@ -1 +0,0 @@
1
- export {};