remult 0.22.3 → 0.22.4

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 (253) hide show
  1. package/esm/angular/interfaces/index.d.ts +1 -0
  2. package/esm/angular/interfaces/index.js +1 -0
  3. package/esm/angular/interfaces/src/column-collection.d.ts +70 -0
  4. package/esm/angular/interfaces/src/column-collection.js +341 -0
  5. package/esm/angular/interfaces/src/data-area-settings.d.ts +15 -0
  6. package/esm/angular/interfaces/src/data-area-settings.js +35 -0
  7. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +36 -0
  8. package/esm/angular/interfaces/src/data-control-interfaces.js +57 -0
  9. package/esm/angular/interfaces/src/dataList.d.ts +13 -0
  10. package/esm/angular/interfaces/src/dataList.js +42 -0
  11. package/esm/angular/interfaces/src/filter-helper.d.ts +13 -0
  12. package/esm/angular/interfaces/src/filter-helper.js +59 -0
  13. package/esm/angular/interfaces/src/grid-settings.d.ts +145 -0
  14. package/esm/angular/interfaces/src/grid-settings.js +387 -0
  15. package/esm/angular/interfaces/src/public_api.d.ts +4 -0
  16. package/esm/angular/interfaces/src/public_api.js +4 -0
  17. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +4 -0
  18. package/esm/angular/src/angular/RemultAngularPluginsService.js +3 -0
  19. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +49 -0
  20. package/esm/angular/src/angular/data-control/data-control2.component.js +138 -0
  21. package/esm/core/SseSubscriptionServer.d.ts +33 -0
  22. package/esm/core/SseSubscriptionServer.js +107 -0
  23. package/esm/core/assign.d.ts +1 -0
  24. package/esm/core/assign.js +5 -0
  25. package/esm/core/classType.d.ts +3 -0
  26. package/esm/core/classType.js +1 -0
  27. package/esm/core/index.d.ts +27 -0
  28. package/esm/core/index.js +25 -0
  29. package/esm/core/inputTypes.d.ts +9 -0
  30. package/esm/core/inputTypes.js +9 -0
  31. package/esm/core/live-query/data-provider-live-query-storage.d.ts +22 -0
  32. package/esm/core/live-query/data-provider-live-query-storage.js +71 -0
  33. package/esm/core/postgres/index.d.ts +2 -0
  34. package/esm/core/postgres/index.js +2 -0
  35. package/esm/core/postgres/postgres-data-provider.d.ts +36 -0
  36. package/esm/core/postgres/postgres-data-provider.js +120 -0
  37. package/esm/core/postgres/schema-builder.d.ts +17 -0
  38. package/esm/core/postgres/schema-builder.js +153 -0
  39. package/esm/core/remult-fresh.d.ts +17 -0
  40. package/esm/core/remult-fresh.js +29 -0
  41. package/esm/core/remult-knex/index.d.ts +30 -0
  42. package/esm/core/remult-knex/index.js +446 -0
  43. package/esm/core/remult-mongo.d.ts +24 -0
  44. package/esm/core/remult-mongo.js +254 -0
  45. package/esm/core/server/JsonEntityFileStorage.d.ts +10 -0
  46. package/esm/core/server/JsonEntityFileStorage.js +25 -0
  47. package/esm/core/server/core.d.ts +4 -0
  48. package/esm/core/server/core.js +4 -0
  49. package/esm/core/server/expressBridge.d.ts +182 -0
  50. package/esm/core/server/expressBridge.js +938 -0
  51. package/esm/core/server/index.d.ts +6 -0
  52. package/esm/core/server/index.js +9 -0
  53. package/esm/core/server/initAsyncHooks.d.ts +1 -0
  54. package/esm/core/server/initAsyncHooks.js +9 -0
  55. package/esm/core/server/initDataProvider.d.ts +2 -0
  56. package/esm/core/server/initDataProvider.js +14 -0
  57. package/esm/core/src/__EntityValueProvider.d.ts +11 -0
  58. package/esm/core/src/__EntityValueProvider.js +1 -0
  59. package/esm/core/src/__RowsOfDataForTesting.d.ts +3 -0
  60. package/esm/core/src/__RowsOfDataForTesting.js +1 -0
  61. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +6 -0
  62. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +147 -0
  63. package/{src → esm/core/src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  64. package/esm/core/src/backend-tests/my-test.backend-spec.js +197 -0
  65. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +1 -0
  66. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +167 -0
  67. package/esm/core/src/buildRestDataProvider.d.ts +31 -0
  68. package/esm/core/src/buildRestDataProvider.js +113 -0
  69. package/esm/core/src/column-interfaces.d.ts +154 -0
  70. package/esm/core/src/column-interfaces.js +7 -0
  71. package/esm/core/src/column.d.ts +58 -0
  72. package/esm/core/src/column.js +174 -0
  73. package/esm/core/src/context.d.ts +134 -0
  74. package/esm/core/src/context.js +286 -0
  75. package/esm/core/src/data-api.d.ts +39 -0
  76. package/esm/core/src/data-api.js +279 -0
  77. package/esm/core/src/data-interfaces.d.ts +41 -0
  78. package/esm/core/src/data-interfaces.js +12 -0
  79. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +22 -0
  80. package/esm/core/src/data-providers/array-entity-data-provider.js +252 -0
  81. package/esm/core/src/data-providers/in-memory-database.d.ts +9 -0
  82. package/esm/core/src/data-providers/in-memory-database.js +14 -0
  83. package/esm/core/src/data-providers/json-data-provider.d.ts +12 -0
  84. package/esm/core/src/data-providers/json-data-provider.js +55 -0
  85. package/esm/core/src/data-providers/rest-data-provider.d.ts +49 -0
  86. package/esm/core/src/data-providers/rest-data-provider.js +256 -0
  87. package/esm/core/src/data-providers/sql-database.d.ts +33 -0
  88. package/esm/core/src/data-providers/sql-database.js +384 -0
  89. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +24 -0
  90. package/esm/core/src/data-providers/web-sql-data-provider.js +143 -0
  91. package/esm/core/src/entity.d.ts +91 -0
  92. package/esm/core/src/entity.js +1 -0
  93. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
  94. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +150 -0
  95. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
  96. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
  97. package/esm/core/src/filter/filter-interfaces.d.ts +85 -0
  98. package/esm/core/src/filter/filter-interfaces.js +477 -0
  99. package/esm/core/src/live-query/LiveQueryClient.d.ts +20 -0
  100. package/esm/core/src/live-query/LiveQueryClient.js +188 -0
  101. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +5 -0
  102. package/esm/core/src/live-query/SseSubscriptionClient.js +86 -0
  103. package/esm/core/src/live-query/SubscriptionChannel.d.ts +72 -0
  104. package/esm/core/src/live-query/SubscriptionChannel.js +123 -0
  105. package/esm/core/src/live-query/SubscriptionServer.d.ts +53 -0
  106. package/esm/core/src/live-query/SubscriptionServer.js +111 -0
  107. package/esm/core/src/live-query/live-query-tests.spec.d.ts +6 -0
  108. package/esm/core/src/live-query/live-query-tests.spec.js +952 -0
  109. package/esm/core/src/remult-proxy.d.ts +35 -0
  110. package/esm/core/src/remult-proxy.js +113 -0
  111. package/esm/core/src/remult3/DecoratorReplacer.d.ts +10 -0
  112. package/esm/core/src/remult3/DecoratorReplacer.js +20 -0
  113. package/esm/core/src/remult3/RepositoryImplementation.d.ts +355 -0
  114. package/esm/core/src/remult3/RepositoryImplementation.js +2109 -0
  115. package/esm/core/src/remult3/index.d.ts +2 -0
  116. package/esm/core/src/remult3/index.js +2 -0
  117. package/esm/core/src/remult3/remult3.d.ts +395 -0
  118. package/esm/core/src/remult3/remult3.js +2 -0
  119. package/esm/core/src/server-action.d.ts +81 -0
  120. package/esm/core/src/server-action.js +394 -0
  121. package/esm/core/src/shared-tests/db-tests-setup.d.ts +32 -0
  122. package/esm/core/src/shared-tests/db-tests-setup.js +78 -0
  123. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +25 -0
  124. package/esm/core/src/shared-tests/db-tests.db-tests.js +810 -0
  125. package/esm/core/src/shared-tests/deleteAll.d.ts +2 -0
  126. package/esm/core/src/shared-tests/deleteAll.js +4 -0
  127. package/esm/core/src/shared-tests/entityWithValidations.d.ts +14 -0
  128. package/esm/core/src/shared-tests/entityWithValidations.js +43 -0
  129. package/esm/core/src/shared-tests/index.d.ts +4 -0
  130. package/esm/core/src/shared-tests/index.js +4 -0
  131. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
  132. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +67 -0
  133. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +10 -0
  134. package/esm/core/src/shared-tests/test-special-value.spec.js +73 -0
  135. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
  136. package/esm/core/src/shared-tests/test-update-with-null.spec.js +31 -0
  137. package/esm/core/src/sort.d.ts +16 -0
  138. package/esm/core/src/sort.js +103 -0
  139. package/esm/core/src/sql-command.d.ts +19 -0
  140. package/esm/core/src/sql-command.js +1 -0
  141. package/esm/core/src/test.d.ts +3 -0
  142. package/esm/core/src/test.js +12 -0
  143. package/esm/core/src/tests/Done.d.ts +5 -0
  144. package/esm/core/src/tests/Done.js +9 -0
  145. package/esm/core/src/tests/RowProvider.spec.d.ts +16 -0
  146. package/esm/core/src/tests/RowProvider.spec.js +631 -0
  147. package/esm/core/src/tests/TestDataApiResponse.d.ts +10 -0
  148. package/esm/core/src/tests/TestDataApiResponse.js +22 -0
  149. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +8 -0
  150. package/esm/core/src/tests/basicRowFunctionality.spec.js +2103 -0
  151. package/esm/core/src/tests/c.d.ts +8 -0
  152. package/esm/core/src/tests/c.js +13 -0
  153. package/esm/core/src/tests/createData.d.ts +7 -0
  154. package/esm/core/src/tests/createData.js +22 -0
  155. package/esm/core/src/tests/d.d.ts +6 -0
  156. package/esm/core/src/tests/d.js +11 -0
  157. package/esm/core/src/tests/dWithPrefilter.d.ts +7 -0
  158. package/esm/core/src/tests/dWithPrefilter.js +18 -0
  159. package/esm/core/src/tests/entityForCustomFilter.d.ts +16 -0
  160. package/esm/core/src/tests/entityForCustomFilter.js +33 -0
  161. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
  162. package/esm/core/src/tests/entityWithValidationsOnColumn.js +13 -0
  163. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
  164. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +37 -0
  165. package/esm/core/src/tests/h.d.ts +6 -0
  166. package/esm/core/src/tests/h.js +24 -0
  167. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +1 -0
  168. package/esm/core/src/tests/remult-3-basic-tests.spec.js +236 -0
  169. package/esm/core/src/tests/remult-3-entities.d.ts +23 -0
  170. package/esm/core/src/tests/remult-3-entities.js +39 -0
  171. package/esm/core/src/tests/tasks.d.ts +6 -0
  172. package/esm/core/src/tests/tasks.js +10 -0
  173. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  174. package/esm/core/src/tests/test-context-as-storage.spec.js +1 -0
  175. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +1 -0
  176. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +389 -0
  177. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +5 -0
  178. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +152 -0
  179. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +1 -0
  180. package/esm/core/src/tests/test-decorator-precedence.spec.js +38 -0
  181. package/esm/core/src/tests/test-default-value.spec.d.ts +1 -0
  182. package/esm/core/src/tests/test-default-value.spec.js +33 -0
  183. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +14 -0
  184. package/esm/core/src/tests/test-entity-inheritance.spec.js +82 -0
  185. package/esm/core/src/tests/test-exceptions.spec.d.ts +1 -0
  186. package/esm/core/src/tests/test-exceptions.spec.js +375 -0
  187. package/esm/core/src/tests/test-json.spec.d.ts +1 -0
  188. package/esm/core/src/tests/test-json.spec.js +115 -0
  189. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +9 -0
  190. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +809 -0
  191. package/esm/core/src/tests/test-non-active-record.spec.d.ts +1 -0
  192. package/esm/core/src/tests/test-non-active-record.spec.js +66 -0
  193. package/esm/core/src/tests/test-object-column.spec.d.ts +1 -0
  194. package/esm/core/src/tests/test-object-column.spec.js +189 -0
  195. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +1 -0
  196. package/esm/core/src/tests/test-paged-foreach.spec.js +328 -0
  197. package/esm/core/src/tests/test-remult-angular.spec.d.ts +1 -0
  198. package/esm/core/src/tests/test-remult-angular.spec.js +23 -0
  199. package/esm/core/src/tests/test-server-controller.spec.d.ts +7 -0
  200. package/esm/core/src/tests/test-server-controller.spec.js +489 -0
  201. package/esm/core/src/tests/test-server-expressions.spec.d.ts +1 -0
  202. package/esm/core/src/tests/test-server-expressions.spec.js +178 -0
  203. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +1 -0
  204. package/esm/core/src/tests/test-server-method-on-entity.spec.js +306 -0
  205. package/esm/core/src/tests/test-sql-expression.spec.d.ts +5 -0
  206. package/esm/core/src/tests/test-sql-expression.spec.js +205 -0
  207. package/esm/core/src/tests/test-sql.spec.d.ts +1 -0
  208. package/esm/core/src/tests/test-sql.spec.js +170 -0
  209. package/esm/core/src/tests/test-subscribe.spec.d.ts +1 -0
  210. package/esm/core/src/tests/test-subscribe.spec.js +135 -0
  211. package/esm/core/src/tests/test-type-recovery.spec.d.ts +1 -0
  212. package/esm/core/src/tests/test-type-recovery.spec.js +49 -0
  213. package/esm/core/src/tests/test-where-api.spec.d.ts +1 -0
  214. package/esm/core/src/tests/test-where-api.spec.js +434 -0
  215. package/esm/core/src/tests/testHelper.spec.d.ts +36 -0
  216. package/esm/core/src/tests/testHelper.spec.js +226 -0
  217. package/esm/core/src/tests/testModel/models.d.ts +16 -0
  218. package/esm/core/src/tests/testModel/models.js +25 -0
  219. package/esm/core/src/validators.d.ts +14 -0
  220. package/esm/core/src/validators.js +33 -0
  221. package/{valueConverters.d.ts → esm/core/src/valueConverters.d.ts} +13 -12
  222. package/esm/core/src/valueConverters.js +197 -0
  223. package/esm/core/urlBuilder.d.ts +6 -0
  224. package/esm/core/urlBuilder.js +20 -0
  225. package/esm/graphql.js +27 -27
  226. package/esm/postgres/schema-builder.js +4 -4
  227. package/esm/src/remult3/RepositoryImplementation.d.ts +1 -1
  228. package/esm/src/remult3/RepositoryImplementation.js +27 -4
  229. package/esm/src/shared-tests/db-tests.db-tests.js +57 -0
  230. package/esm/test-servers/shared/Task.d.ts +9 -0
  231. package/esm/test-servers/shared/Task.js +32 -0
  232. package/esm/test.d.ts +5 -0
  233. package/esm/test.js +6 -0
  234. package/package.json +1 -1
  235. package/src/remult3/RepositoryImplementation.d.ts +1 -1
  236. package/src/remult3/RepositoryImplementation.js +88 -63
  237. package/src/shared-tests/db-tests.db-tests.js +97 -0
  238. package/esm/src/id-entity.d.ts +0 -4
  239. package/esm/src/id-entity.js +0 -8
  240. package/postgres/postgresColumnSyntax.d.ts +0 -2
  241. package/postgres/postgresColumnSyntax.js +0 -34
  242. package/remult-middleware.d.ts +0 -2
  243. package/remult-middleware.js +0 -70
  244. package/server/register-actions-on-server.d.ts +0 -3
  245. package/server/register-actions-on-server.js +0 -50
  246. package/server/register-entities-on-server.d.ts +0 -3
  247. package/server/register-entities-on-server.js +0 -19
  248. package/src/backend-tests/my-test.backend-spec.js +0 -217
  249. package/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
  250. package/src/backend-tests/test-http-server.backend-spec.js +0 -342
  251. package/src/id-entity.d.ts +0 -4
  252. package/src/id-entity.js +0 -17
  253. package/valueConverters.js +0 -168
@@ -0,0 +1,66 @@
1
+ import { Remult } from "../context";
2
+ import { InMemoryDataProvider } from "../data-providers/in-memory-database";
3
+ import { Entity, Fields } from "../remult3";
4
+ import { Validators } from "../validators";
5
+ @Entity("nonActiveRecord", {})
6
+ class taskNonActiveRecord {
7
+ @Fields.uuid()
8
+ id;
9
+ @Fields.string({
10
+ validate: Validators.required
11
+ })
12
+ title = '';
13
+ @Fields.boolean()
14
+ completed = false;
15
+ }
16
+ describe("test non active record", () => {
17
+ let remult = new Remult(new InMemoryDataProvider());
18
+ let repo = remult.repo(taskNonActiveRecord);
19
+ beforeEach(() => {
20
+ remult = new Remult(new InMemoryDataProvider());
21
+ repo = remult.repo(taskNonActiveRecord);
22
+ });
23
+ it("test save of new row validation", async () => {
24
+ let item = { ...new taskNonActiveRecord() };
25
+ let ok = true;
26
+ try {
27
+ await repo.save(item);
28
+ ok = false;
29
+ }
30
+ catch (err) {
31
+ expect(err?.modelState?.title).toContain("empty");
32
+ expect(item.id).toBeUndefined();
33
+ }
34
+ expect(ok).toBe(true);
35
+ });
36
+ it("test save of existing row validation", async () => {
37
+ let item = { ...await repo.insert({ title: 'test' }), title: '' };
38
+ let ok = true;
39
+ try {
40
+ await repo.save(item);
41
+ ok = false;
42
+ }
43
+ catch (err) {
44
+ expect(err?.modelState?.title).toContain("empty");
45
+ }
46
+ expect(ok).toBe(true);
47
+ });
48
+ it("test save doesn't return non row elements", async () => {
49
+ let item = { ...await repo.insert({ title: 'test' }), title: 'test1', changed: true };
50
+ item = await repo.save(item);
51
+ expect(item.changed).toBe(undefined);
52
+ });
53
+ it("delete works with non active record", async () => {
54
+ let item = await repo.save({ title: 'a' });
55
+ await repo.insert({ title: 'b' });
56
+ expect(repo.getEntityRef(item).isNew()).toBe(false);
57
+ await repo.delete({ ...item });
58
+ expect(await repo.count()).toBe(1);
59
+ });
60
+ it("test save doesn't return the messed up object", async () => {
61
+ var x = { ...new taskNonActiveRecord(), title: 'a', changed: true };
62
+ x = await repo.insert(x);
63
+ expect(x.changed).toBe(undefined);
64
+ expect(x.id.length > 1).toBe(true);
65
+ });
66
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,189 @@
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 { InMemoryDataProvider } from '../data-providers/in-memory-database';
5
+ import { Field, Entity, EntityBase, FieldType, Fields, IdEntity } from '../remult3';
6
+ import { entityFilterToJson, Filter } from '../filter/filter-interfaces';
7
+ import { assign } from '../../assign';
8
+ describe("test object column", () => {
9
+ var wsql = new WebSqlDataProvider("test");
10
+ let db = new SqlDatabase(wsql);
11
+ let remult = new Remult();
12
+ remult.dataProvider = (db);
13
+ async function deleteAll() {
14
+ let e = remult.repo(ObjectColumnTest).metadata;
15
+ await wsql.dropTable(e);
16
+ await wsql.createTable(e);
17
+ }
18
+ it("test that changes to inner items are monitored", async () => {
19
+ await deleteAll();
20
+ var x = remult.repo(ObjectColumnTest).create({ id: 1, col: { firstName: 'yael', lastName: 'katri' } });
21
+ await x.save();
22
+ x.col.lastName = 'honig';
23
+ expect(x.$.col.valueChanged()).toBe(true);
24
+ expect(x._.wasChanged()).toBe(true);
25
+ await x.save();
26
+ expect(x.$.col.valueChanged()).toBe(false);
27
+ expect(x._.wasChanged()).toBe(false);
28
+ expect(x.col.lastName).toBe("honig");
29
+ x = await remult.repo(ObjectColumnTest).findFirst();
30
+ expect(x.col.lastName).toBe("honig");
31
+ });
32
+ it("test basics with wsql", async () => {
33
+ await deleteAll();
34
+ var x = remult.repo(ObjectColumnTest).create();
35
+ x.id = 1;
36
+ x.col = {
37
+ firstName: 'noam',
38
+ lastName: 'honig'
39
+ };
40
+ await x.save();
41
+ x = await remult.repo(ObjectColumnTest).findFirst();
42
+ expect(x.col.firstName).toBe('noam');
43
+ x = await remult.repo(ObjectColumnTest).findFirst({ col: { $contains: "yael" } });
44
+ expect(x).toBeUndefined();
45
+ x = await remult.repo(ObjectColumnTest).findFirst({ col: { $contains: "noam" } });
46
+ expect(x.id).toBe(1);
47
+ expect(x.phone1).toBeNull();
48
+ expect(x.phone2).toBeNull();
49
+ expect(x.phone3).toBeNull();
50
+ let sqlr = (await db.execute('select phone1,phone2,phone3 from ' + (await x._.repository.metadata.getDbName()))).rows[0];
51
+ expect(sqlr.phone1).toBe('');
52
+ expect(sqlr.phone2).toBeNull();
53
+ expect(sqlr.phone3).toBe('');
54
+ assign(x, {
55
+ phone1: new Phone("123"),
56
+ phone2: new Phone("456"),
57
+ phone3: new Phone("789")
58
+ });
59
+ await x.save();
60
+ sqlr = (await db.execute('select phone1,phone2,phone3 from ' + (await x._.repository.metadata.getDbName()))).rows[0];
61
+ expect(sqlr.phone1).toBe('123');
62
+ expect(sqlr.phone2).toBe('456');
63
+ expect(sqlr.phone3).toBe('789');
64
+ await assign(x, {
65
+ phone1: null,
66
+ phone2: null,
67
+ phone3: null
68
+ }).save();
69
+ sqlr = (await db.execute('select phone1,phone2,phone3 from ' + (await x._.repository.metadata.getDbName()))).rows[0];
70
+ expect(sqlr.phone1).toBe('');
71
+ expect(sqlr.phone2).toBeNull();
72
+ expect(sqlr.phone3).toBe('');
73
+ });
74
+ it("test contains on custom type", async () => {
75
+ await deleteAll();
76
+ await remult.repo(ObjectColumnTest).create({
77
+ id: 1,
78
+ col: { firstName: 'noam', lastName: 'honig' },
79
+ phone1: new Phone("1234")
80
+ }).save();
81
+ await remult.repo(ObjectColumnTest).create({
82
+ id: 2,
83
+ col: { firstName: 'noam', lastName: 'honig' },
84
+ phone1: new Phone("5678")
85
+ }).save();
86
+ let r = remult.repo(ObjectColumnTest).metadata;
87
+ expect(await remult.repo(ObjectColumnTest).count({ phone1: { $contains: "23" } })).toBe(1);
88
+ expect(await remult.repo(ObjectColumnTest).count(Filter.entityFilterFromJson(r, entityFilterToJson(r, { phone1: { $contains: "23" } })))).toBe(1);
89
+ });
90
+ it("test basics with json", async () => {
91
+ var mem = new InMemoryDataProvider();
92
+ var c = new Remult();
93
+ c.dataProvider = (mem);
94
+ var x = c.repo(ObjectColumnTest).create();
95
+ x.id = 1;
96
+ x.col = {
97
+ firstName: 'noam',
98
+ lastName: 'honig'
99
+ };
100
+ await x.save();
101
+ x = await c.repo(ObjectColumnTest).findFirst();
102
+ expect(x.col.firstName).toBe('noam');
103
+ expect(mem.rows[x._.repository.metadata.key][0].col).toEqual({
104
+ firstName: 'noam',
105
+ lastName: 'honig'
106
+ });
107
+ });
108
+ it("test string[]", async () => {
109
+ await deleteAll();
110
+ let x = await remult.repo(ObjectColumnTest).create({
111
+ id: 1,
112
+ col: { firstName: 'noam', lastName: 'honig' }
113
+ }).save();
114
+ expect(x.tags).toBe(undefined);
115
+ expect(x.tags2).toBe(null);
116
+ x.tags = ["a", "b"];
117
+ await x.save();
118
+ expect(x.tags).toEqual(["a", "b"]);
119
+ let sqlr = (await db.execute('select tags,tags2 from ' + (await x._.repository.metadata.getDbName()))).rows[0];
120
+ expect(sqlr.tags).toBe(JSON.stringify(["a", "b"]));
121
+ expect(sqlr.tags2).toBeNull();
122
+ });
123
+ //
124
+ });
125
+ class Phone {
126
+ phone;
127
+ constructor(phone) {
128
+ this.phone = phone;
129
+ }
130
+ }
131
+ @FieldType({
132
+ valueConverter: {
133
+ fromJson: x => x ? new Phone4(x) : null,
134
+ toJson: x => x ? x.phone : ''
135
+ }
136
+ })
137
+ class Phone4 {
138
+ phone;
139
+ constructor(phone) {
140
+ this.phone = phone;
141
+ }
142
+ }
143
+ @Entity('objectColumnTest')
144
+ class ObjectColumnTest extends EntityBase {
145
+ @Fields.integer()
146
+ id;
147
+ @Fields.object()
148
+ col;
149
+ @Field(() => Phone, {
150
+ valueConverter: {
151
+ fromJson: x => x ? new Phone(x) : null,
152
+ toJson: x => x ? x.phone : ''
153
+ }
154
+ })
155
+ phone1;
156
+ @Field(() => Phone, {
157
+ valueConverter: {
158
+ fromJson: x => x ? new Phone(x) : null,
159
+ toJson: x => x ? x.phone : null
160
+ },
161
+ allowNull: true
162
+ })
163
+ phone2;
164
+ @Field(() => Phone, {
165
+ valueConverter: {
166
+ fromJson: x => x ? new Phone(x) : null,
167
+ toJson: x => x ? x.phone : ''
168
+ }
169
+ })
170
+ phone3;
171
+ @Field(() => Phone4)
172
+ phone4;
173
+ @Fields.object()
174
+ tags;
175
+ @Fields.object({ allowNull: true })
176
+ tags2;
177
+ }
178
+ it("Test original values address defaults", async () => {
179
+ let r = new Remult();
180
+ let c = r.repo(somethingWithDefaults).create();
181
+ expect(c.name).toBe("noam");
182
+ expect(c.$.name.value).toBe("noam");
183
+ expect(c.$.name.originalValue).toBe('noam');
184
+ });
185
+ @Entity('somethingWithDefaults', {})
186
+ class somethingWithDefaults extends IdEntity {
187
+ @Fields.string()
188
+ name = 'noam';
189
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,328 @@
1
+ import { createData } from "./createData";
2
+ import { Remult, queryConfig } from '../context';
3
+ import { Entity, EntityBase, Fields } from '../remult3';
4
+ import { Categories } from './remult-3-entities';
5
+ import { Sort } from '../sort';
6
+ import { CompoundIdField } from '../column';
7
+ import { entityFilterToJson } from '../filter/filter-interfaces';
8
+ import { testRestDb } from "./testHelper.spec";
9
+ describe("test paged foreach ", () => {
10
+ queryConfig.defaultPageSize = 2;
11
+ it("basic foreach with where", async () => {
12
+ let [c] = await createData(async (insert) => {
13
+ await insert(1, 'noam');
14
+ await insert(2, 'yael');
15
+ await insert(3, 'yoni');
16
+ await insert(4, 'shay');
17
+ await insert(5, 'ido');
18
+ });
19
+ let i = 0;
20
+ for await (const x of c.query({ where: { categoryName: { $gte: "n" } } })) {
21
+ expect(x.id).toBe([1, 2, 3, 4][i++]);
22
+ }
23
+ expect(i).toBe(4);
24
+ });
25
+ it("basic foreach with where 2", async () => {
26
+ let [c] = await createData(async (insert) => {
27
+ await insert(1, 'noam');
28
+ await insert(2, 'yael');
29
+ await insert(3, 'yoni');
30
+ await insert(4, 'shay');
31
+ await insert(5, 'ido');
32
+ });
33
+ let i = 0;
34
+ for await (const x of c.query({
35
+ where: { categoryName: { ">=": "n" } }
36
+ })) {
37
+ expect(x.id).toBe([1, 2, 3, 4][i++]);
38
+ }
39
+ expect(i).toBe(4);
40
+ });
41
+ it("basic foreach with order by", async () => {
42
+ let [c] = await createData(async (insert) => {
43
+ await insert(1, 'noam');
44
+ await insert(2, 'yael');
45
+ await insert(3, 'yoni');
46
+ await insert(4, 'shay');
47
+ await insert(5, 'ido');
48
+ });
49
+ let i = 0;
50
+ for await (const x of c.query({
51
+ orderBy: { categoryName: "asc" }
52
+ })) {
53
+ expect(x.id).toBe([5, 1, 4, 2, 3][i++]);
54
+ }
55
+ expect(i).toBe(5);
56
+ expect((await c.findFirst({}, {
57
+ orderBy: { categoryName: "asc" }
58
+ })).id).toBe(5);
59
+ });
60
+ it("basic foreach with order by desc", async () => {
61
+ let [c] = await createData(async (insert) => {
62
+ await insert(1, 'noam');
63
+ await insert(2, 'yael');
64
+ await insert(3, 'yoni');
65
+ await insert(4, 'shay');
66
+ await insert(5, 'ido');
67
+ });
68
+ let i = 0;
69
+ for await (const x of c.query({
70
+ orderBy: { categoryName: "desc" }
71
+ })) {
72
+ expect(x.id).toBe([3, 2, 4, 1, 5][i++]);
73
+ }
74
+ expect(i).toBe(5);
75
+ });
76
+ it("iterate", async () => {
77
+ let [c] = await createData(async (insert) => {
78
+ await insert(1, 'noam');
79
+ await insert(2, 'yael');
80
+ await insert(3, 'yoni');
81
+ await insert(4, 'shay');
82
+ await insert(5, 'ido');
83
+ });
84
+ var i = 0;
85
+ for await (const x of c.query()) {
86
+ expect(x.id).toBe(++i);
87
+ }
88
+ expect(i).toBe(5);
89
+ });
90
+ it("paginate", async () => {
91
+ let [c] = await createData(async (insert) => {
92
+ await insert(1, 'noam');
93
+ await insert(2, 'yael');
94
+ await insert(3, 'yoni');
95
+ await insert(4, 'shay');
96
+ await insert(5, 'ido');
97
+ });
98
+ let p = await c.query().paginator();
99
+ expect(p.items.length).toBe(2);
100
+ expect(await p.count()).toBe(5);
101
+ expect(p.items.map(x => x.id)).toEqual([1, 2]);
102
+ expect(p.hasNextPage).toBe(true);
103
+ p = await p.nextPage();
104
+ expect(p.items.map(x => x.id)).toEqual([3, 4]);
105
+ expect(p.hasNextPage).toBe(true);
106
+ p = await p.nextPage();
107
+ expect(p.items.map(x => x.id)).toEqual([5]);
108
+ expect(p.hasNextPage).toBe(false);
109
+ });
110
+ it("paginate3", async () => {
111
+ let [c] = await createData(async (insert) => {
112
+ await insert(1, 'aoam');
113
+ await insert(2, 'bael');
114
+ await insert(3, 'coni');
115
+ await insert(4, 'dhay');
116
+ await insert(5, 'edo');
117
+ });
118
+ let p = await c.query({ where: { $or: [{ categoryName: { $contains: "" } }, { categoryName: { $contains: "" } }] }, orderBy: { categoryName: "asc" } }).paginator();
119
+ expect(p.items.length).toBe(2);
120
+ expect(await p.count()).toBe(5);
121
+ expect(p.items.map(x => x.id)).toEqual([1, 2]);
122
+ expect(p.hasNextPage).toBe(true);
123
+ p = await p.nextPage();
124
+ expect(p.items.map(x => x.id)).toEqual([3, 4]);
125
+ expect(p.hasNextPage).toBe(true);
126
+ p = await p.nextPage();
127
+ expect(p.items.map(x => x.id)).toEqual([5]);
128
+ expect(p.hasNextPage).toBe(false);
129
+ });
130
+ it("paginate2", async () => {
131
+ testRestDb(async ({ remult }) => {
132
+ let c = remult.repo(Categories);
133
+ await c.insert([
134
+ { id: 1, categoryName: 'aoam' },
135
+ { id: 2, categoryName: 'bael' }
136
+ ]);
137
+ await c.insert({ id: 3, categoryName: 'coni' });
138
+ await c.insert({ id: 4, categoryName: 'dhay' });
139
+ await c.insert({ id: 5, categoryName: 'edo' });
140
+ let p = await c.query({ where: { $or: [{ categoryName: { $contains: "" } }, { categoryName: { $contains: "" } }] }, orderBy: { categoryName: "asc" } }).paginator();
141
+ expect(p.items.length).toBe(2);
142
+ expect(await p.count()).toBe(5);
143
+ expect(p.items.map(x => x.id)).toEqual([1, 2]);
144
+ expect(p.hasNextPage).toBe(true);
145
+ p = await p.nextPage();
146
+ expect(p.items.map(x => x.id)).toEqual([3, 4]);
147
+ expect(p.hasNextPage).toBe(true);
148
+ p = await p.nextPage();
149
+ expect(p.items.map(x => x.id)).toEqual([5]);
150
+ expect(p.hasNextPage).toBe(false);
151
+ });
152
+ });
153
+ it("paginate", async () => {
154
+ let [c] = await createData(async (insert) => {
155
+ await insert(1, 'noam');
156
+ await insert(2, 'yael');
157
+ await insert(3, 'yoni');
158
+ await insert(4, 'shay');
159
+ await insert(5, 'ido');
160
+ });
161
+ let p = await c.query({
162
+ pageSize: 3
163
+ });
164
+ expect((await p.getPage()).map(x => x.id)).toEqual([1, 2, 3]);
165
+ expect((await p.getPage(2)).map(x => x.id)).toEqual([4, 5]);
166
+ });
167
+ it("paginate on boundries", async () => {
168
+ let [c] = await createData(async (insert) => {
169
+ await insert(1, 'noam');
170
+ await insert(2, 'yael');
171
+ await insert(3, 'yoni');
172
+ await insert(4, 'shay');
173
+ });
174
+ let p = await c.query().paginator();
175
+ expect(p.items.length).toBe(2);
176
+ expect(await p.count()).toBe(4);
177
+ expect(p.items.map(x => x.id)).toEqual([1, 2]);
178
+ expect(p.hasNextPage).toBe(true);
179
+ p = await p.nextPage();
180
+ expect(p.items.map(x => x.id)).toEqual([3, 4]);
181
+ expect(p.hasNextPage).toBe(true);
182
+ p = await p.nextPage();
183
+ expect(p.items.map(x => x.id)).toEqual([]);
184
+ expect(p.hasNextPage).toBe(false);
185
+ });
186
+ it("test toArray", async () => {
187
+ let [c] = await createData(async (insert) => {
188
+ await insert(1, 'noam');
189
+ await insert(2, 'yael');
190
+ await insert(3, 'yoni');
191
+ await insert(4, 'shay');
192
+ await insert(5, 'ido');
193
+ });
194
+ var i = 0;
195
+ for (const x of await c.query({ pageSize: 10 }).getPage()) {
196
+ expect(x.id).toBe(++i);
197
+ }
198
+ expect(i).toBe(5);
199
+ });
200
+ it("test make sort unique", async () => {
201
+ let remult = new Remult();
202
+ let e = remult.repo(Categories);
203
+ function test(orderBy, ...sort) {
204
+ let z = { ...orderBy };
205
+ let s = Sort.createUniqueEntityOrderBy(e.metadata, orderBy);
206
+ let expected = {};
207
+ for (const c of sort) {
208
+ expected[c.key] = "asc";
209
+ }
210
+ expect(s).toEqual(expected);
211
+ expect(orderBy).toEqual(z);
212
+ }
213
+ test({ id: "asc" }, e.metadata.fields.id);
214
+ test({ categoryName: "asc" }, e.metadata.fields.categoryName, e.metadata.fields.id);
215
+ });
216
+ it("unique sort and compound id", async () => {
217
+ let remult = new Remult();
218
+ let eDefs = remult.repo(theTable).metadata;
219
+ let e = eDefs.fields;
220
+ function test(orderBy, ...sort) {
221
+ let s = Sort.createUniqueEntityOrderBy(eDefs, orderBy);
222
+ let expected = {};
223
+ for (const c of sort) {
224
+ expected[c.key] = "asc";
225
+ }
226
+ expect(s).toEqual(expected);
227
+ }
228
+ test({ b: "asc", c: "asc" }, e.b, e.c, e.a);
229
+ test({ a: "asc", b: "asc" }, e.a, e.b);
230
+ test({ a: "asc" }, e.a, e.b);
231
+ test({ b: "asc" }, e.b, e.a);
232
+ test({ c: "asc" }, e.c, e.a, e.b);
233
+ });
234
+ it("create rows after filter compound id", async () => {
235
+ let remult = new Remult();
236
+ let eDefs = remult.repo(theTable);
237
+ let e = eDefs.create();
238
+ e.a = 'a';
239
+ e.b = 'b';
240
+ e.c = 'c';
241
+ async function test(orderBy, expectedWhere) {
242
+ expect(JSON.stringify(await entityFilterToJson(eDefs.metadata, await eDefs.createAfterFilter(orderBy, e)))).toEqual(JSON.stringify(await entityFilterToJson(eDefs.metadata, expectedWhere)));
243
+ }
244
+ test({ a: "asc" }, { a: { $gt: 'a' } });
245
+ test({ a: "desc" }, { a: { $lt: 'a' } });
246
+ test({ a: "asc", b: "asc" }, {
247
+ $or: [
248
+ { a: { $gt: 'a' } },
249
+ { a: 'a', b: { $gt: 'b' } }
250
+ ]
251
+ });
252
+ });
253
+ it("create rows after filter, values are frozen when filter is created", async () => {
254
+ let remult = new Remult();
255
+ let eDefs = remult.repo(theTable);
256
+ let e = eDefs.create();
257
+ e.a = 'a';
258
+ e.b = 'b';
259
+ e.c = 'c';
260
+ let f = await eDefs.createAfterFilter({ a: "asc", b: "asc" }, e);
261
+ e.a = '1';
262
+ e.b = '2';
263
+ expect(JSON.stringify(await entityFilterToJson(eDefs.metadata, f))).toEqual(JSON.stringify(await entityFilterToJson(eDefs.metadata, {
264
+ $or: [
265
+ { a: { $gt: 'a' } },
266
+ { a: 'a', b: { $gt: 'b' } }
267
+ ]
268
+ })));
269
+ });
270
+ it("serialize filter with or", async () => {
271
+ let remult = new Remult();
272
+ let eDefs = remult.repo(theTable);
273
+ let e = eDefs.create();
274
+ async function test(expectedWhere, expected) {
275
+ expect(JSON.stringify(await entityFilterToJson(eDefs.metadata, expectedWhere))).toEqual(JSON.stringify(expected));
276
+ }
277
+ await test({
278
+ $or: [
279
+ {
280
+ a: 'a',
281
+ b: { $gt: 'b' }
282
+ },
283
+ {
284
+ a: { $gt: 'a' }
285
+ }
286
+ ]
287
+ }, {
288
+ OR: [
289
+ {
290
+ a: 'a',
291
+ "b.gt": 'b'
292
+ },
293
+ {
294
+ "a.gt": 'a'
295
+ }
296
+ ]
297
+ });
298
+ await test({
299
+ a: 'a',
300
+ b: { $gt: 'b' }
301
+ }, {
302
+ a: 'a',
303
+ "b.gt": 'b'
304
+ });
305
+ await test({
306
+ $or: [
307
+ { a: 'a' },
308
+ { b: { $gt: 'b' } }
309
+ ]
310
+ }, {
311
+ OR: [
312
+ { a: 'a' },
313
+ { "b.gt": 'b' }
314
+ ]
315
+ });
316
+ });
317
+ });
318
+ @Entity('', {
319
+ id: t => new CompoundIdField(t.a, t.b)
320
+ })
321
+ class theTable extends EntityBase {
322
+ @Fields.string()
323
+ a;
324
+ @Fields.string()
325
+ b;
326
+ @Fields.string()
327
+ c;
328
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { DataControl } from '../../../angular/interfaces';
2
+ import { DataControl2Component } from '../../../angular/src/angular/data-control/data-control2.component';
3
+ import { RemultAngularPluginsService } from '../../../angular/src/angular/RemultAngularPluginsService';
4
+ import { Fields, getFields } from '../remult3';
5
+ class classWithColumn {
6
+ static click;
7
+ @DataControl({
8
+ click: (r) => classWithColumn.click = r
9
+ })
10
+ @Fields.string()
11
+ a = '';
12
+ _ = getFields(this);
13
+ }
14
+ describe("remult angular", () => {
15
+ it("stand alone data control", async () => {
16
+ let dc = new DataControl2Component(new RemultAngularPluginsService(), undefined);
17
+ let c = new classWithColumn();
18
+ c.a = '1';
19
+ dc.field = c._.a;
20
+ dc.click();
21
+ expect(classWithColumn.click.a).toBe('1');
22
+ });
23
+ });
@@ -0,0 +1,7 @@
1
+ export declare class myType {
2
+ what: (n: number) => string;
3
+ static x: myType;
4
+ static y: myType;
5
+ id: any;
6
+ constructor(what: (n: number) => string);
7
+ }