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
@@ -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 {};