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,631 @@
1
+ import { InMemoryDataProvider } from '../data-providers/in-memory-database';
2
+ import { ArrayEntityDataProvider } from "../data-providers/array-entity-data-provider";
3
+ import { Allow, Remult } from '../context';
4
+ import { OneToMany } from '../column';
5
+ import { FilterConsumerBridgeToSqlRequest } from '../filter/filter-consumer-bridge-to-sql-request';
6
+ import { Validators } from '../validators';
7
+ import { Categories, Categories as newCategories } from './remult-3-entities';
8
+ import { Entity as EntityDecorator, getEntityRef, decorateColumnSettings, Entity, Field, ValueListFieldType, Fields, getValueList, ValueListInfo } from '../remult3/RepositoryImplementation';
9
+ import { describeClass, Sort } from '../..';
10
+ import { EntityBase } from '../remult3';
11
+ import { ValueConverters } from '../valueConverters';
12
+ import { entityFilterToJson, Filter } from '../filter/filter-interfaces';
13
+ import { createData } from './createData';
14
+ @ValueListFieldType({
15
+ getValues: () => [
16
+ Language.Hebrew,
17
+ Language.Russian,
18
+ new Language(20, 'אמהרית')
19
+ ]
20
+ })
21
+ export class Language {
22
+ id;
23
+ caption;
24
+ static Hebrew = new Language(0, 'עברית');
25
+ static Russian = new Language(10, 'רוסית');
26
+ constructor(id, caption) {
27
+ this.id = id;
28
+ this.caption = caption;
29
+ }
30
+ }
31
+ export async function insertFourRows() {
32
+ return createData(async (i) => {
33
+ await i(1, 'noam', 'x');
34
+ await i(4, 'yael', 'x');
35
+ await i(2, 'yoni', 'y');
36
+ await i(3, 'maayan', 'y');
37
+ });
38
+ }
39
+ ;
40
+ describe("grid filter stuff", () => {
41
+ it("filter with contains", async () => {
42
+ let x = new FilterConsumerBridgeToSqlRequest({
43
+ addParameterAndReturnSqlToken: () => ""
44
+ }, {
45
+ $entityName: '',
46
+ $dbNameOf: () => 'col'
47
+ });
48
+ x.containsCaseInsensitive(new mockColumnDefs("col"), "no'am");
49
+ expect(await x.resolveWhere()).toBe(" where lower (col) like lower ('%no''am%')");
50
+ });
51
+ it("filter with contains", async () => {
52
+ let x = new FilterConsumerBridgeToSqlRequest({
53
+ addParameterAndReturnSqlToken: () => ""
54
+ }, {
55
+ $entityName: '',
56
+ $dbNameOf: () => 'col'
57
+ });
58
+ x.containsCaseInsensitive(new mockColumnDefs("col"), "no'a'm");
59
+ expect(await x.resolveWhere()).toBe(" where lower (col) like lower ('%no''a''m%')");
60
+ });
61
+ it("test in statement", async () => {
62
+ let [c] = await insertFourRows();
63
+ expect(await c.count({ id: [1, 3] })).toBe(2);
64
+ });
65
+ });
66
+ describe("Closed List column", () => {
67
+ it("Basic Operations", () => {
68
+ let x = ValueListInfo.get(Language);
69
+ expect(x.fromJson(0)).toBe(Language.Hebrew);
70
+ expect(x.toJson(Language.Russian)).toBe(10);
71
+ expect(ValueListInfo.get(Language).getValues().length).toBe(3);
72
+ });
73
+ it("test auto caption", () => {
74
+ let val = ValueListInfo.get(valueList);
75
+ expect(valueList.firstName.caption).toBe('First Name');
76
+ });
77
+ it("test with entity", async () => {
78
+ let c = new Remult()
79
+ .repo(entityWithValueList, new InMemoryDataProvider());
80
+ let e = c.create();
81
+ e.id = 1;
82
+ expect(e.l).toBe(Language.Hebrew);
83
+ e.l = Language.Russian;
84
+ await e._.save();
85
+ e = await c.findFirst();
86
+ expect(e.l).toBe(Language.Russian);
87
+ expect(e._.toApiJson().l).toBe(10);
88
+ });
89
+ it("test with entity and data defined on type", async () => {
90
+ let c = new Remult()
91
+ .repo(entityWithValueList, new InMemoryDataProvider());
92
+ let e = c.create();
93
+ e.id = 1;
94
+ expect(c.metadata.fields.v.valueType).toBe(valueList);
95
+ expect(c.metadata.fields.v.valueConverter.fromJson('listName'))
96
+ .toBe(valueList.listName);
97
+ expect(c.metadata.fields.id.valueType).toBe(Number);
98
+ expect(e.v).toBe(valueList.firstName);
99
+ e.v = valueList.listName;
100
+ await e._.save();
101
+ e = await c.findFirst();
102
+ expect(e.v).toBe(valueList.listName);
103
+ expect(e._.toApiJson().v).toBe('listName');
104
+ });
105
+ it("test entity with value list get values", () => {
106
+ var x = new Remult().repo(entityWithValueList);
107
+ expect(getValueList(x.metadata.fields.l).length).toBe(3);
108
+ expect(getValueList(x.create().$.l).length).toBe(3);
109
+ });
110
+ });
111
+ @ValueListFieldType()
112
+ class valueList {
113
+ id;
114
+ caption;
115
+ static firstName = new valueList();
116
+ static listName = new valueList();
117
+ constructor(id, caption) {
118
+ this.id = id;
119
+ this.caption = caption;
120
+ }
121
+ }
122
+ @Entity('entity with value list')
123
+ class entityWithValueList extends EntityBase {
124
+ @Fields.integer()
125
+ id = 0;
126
+ @Field(() => Language)
127
+ l = Language.Hebrew;
128
+ @Field(() => valueList)
129
+ v = valueList.firstName;
130
+ }
131
+ describe("test row provider", () => {
132
+ it("auto name", () => {
133
+ var cat = new Remult().repo(newCategories).create();
134
+ expect(cat._.repository.metadata.key).toBe('Categories');
135
+ });
136
+ it("test update", async () => {
137
+ let [c] = await createData(async (insert) => await insert(5, 'noam'));
138
+ let r = await c.find();
139
+ expect(r[0].categoryName).toBe('noam');
140
+ r[0].categoryName = 'yael';
141
+ await r[0]._.save();
142
+ r = await c.find();
143
+ expect(r[0].categoryName).toBe('yael');
144
+ });
145
+ it("test filter", async () => {
146
+ let [c] = await insertFourRows();
147
+ let rows = await c.find();
148
+ expect(rows.length).toBe(4);
149
+ rows = await c.find({ where: { description: 'x' } });
150
+ expect(rows.length).toBe(2);
151
+ rows = await c.find({ where: { id: 4 } });
152
+ expect(rows.length).toBe(1);
153
+ expect(rows[0].categoryName).toBe('yael');
154
+ rows = await c.find({ where: { description: 'y', categoryName: 'yoni' } });
155
+ expect(rows.length).toBe(1);
156
+ expect(rows[0].id).toBe(2);
157
+ rows = await c.find({
158
+ where: { description: 'y', categoryName: 'yoni' }
159
+ });
160
+ expect(rows.length).toBe(1);
161
+ expect(rows[0].id).toBe(2);
162
+ rows = await c.find({
163
+ where: { description: 'y', categoryName: 'yoni' }
164
+ });
165
+ expect(rows.length).toBe(1);
166
+ expect(rows[0].id).toBe(2);
167
+ });
168
+ it("test in filter packer", async () => {
169
+ let [r] = await insertFourRows();
170
+ let rows = await r.find();
171
+ expect(rows.length).toBe(4);
172
+ rows = await r.find({
173
+ where: Filter.entityFilterFromJson(r.metadata, entityFilterToJson(r.metadata, { description: 'x' }))
174
+ });
175
+ rows = await r.find({ where: Filter.entityFilterFromJson(r.metadata, entityFilterToJson(r.metadata, { id: [1, 3] })) });
176
+ expect(rows.length).toBe(2);
177
+ rows = await r.find({ where: Filter.entityFilterFromJson(r.metadata, entityFilterToJson(r.metadata, { id: { $ne: [1, 2, 3] } })) });
178
+ expect(rows.length).toBe(1);
179
+ });
180
+ it("sort", async () => {
181
+ let [c] = await insertFourRows();
182
+ let rows = await c.find({ orderBy: { id: "asc" } });
183
+ expect(rows[0].id).toBe(1);
184
+ expect(rows[1].id).toBe(2);
185
+ expect(rows[2].id).toBe(3);
186
+ expect(rows[3].id).toBe(4);
187
+ rows = await c.find({
188
+ orderBy: { categoryName: "desc" }
189
+ });
190
+ expect(rows[0].id).toBe(2);
191
+ expect(rows[1].id).toBe(4);
192
+ expect(rows[2].id).toBe(1);
193
+ expect(rows[3].id).toBe(3);
194
+ });
195
+ it("counts", async () => {
196
+ let [c] = await insertFourRows();
197
+ let count = await c.count();
198
+ expect(count).toBe(4);
199
+ });
200
+ it("counts with filter", async () => {
201
+ let [c] = await insertFourRows();
202
+ let count = await c.count({ id: { "<=": 2 } });
203
+ expect(count).toBe(2);
204
+ });
205
+ it("Test Validation 2", async () => {
206
+ var remult = new Remult();
207
+ remult.dataProvider = (new InMemoryDataProvider());
208
+ let type = class extends newCategories {
209
+ a;
210
+ };
211
+ EntityDecorator('')(type);
212
+ Fields.string({
213
+ validate: (entity, col) => Validators.required(entity, col, "m")
214
+ })(type.prototype, "a");
215
+ var c = remult.repo(type);
216
+ var cat = c.create();
217
+ cat.a = '';
218
+ var saved = false;
219
+ try {
220
+ await cat._.save();
221
+ saved = true;
222
+ }
223
+ catch (err) {
224
+ expect(cat._.fields.a.error).toEqual("m");
225
+ expect(cat._.error).toBe("A: m");
226
+ }
227
+ expect(saved).toBe(false);
228
+ });
229
+ it("Test Validation 2_1", async () => {
230
+ var remult = new Remult();
231
+ remult.dataProvider = (new InMemoryDataProvider());
232
+ let type = class extends newCategories {
233
+ a;
234
+ };
235
+ EntityDecorator('')(type);
236
+ Fields.string({
237
+ validate: (entity, col) => {
238
+ if (!entity.a || entity.a.length == 0)
239
+ col.error = "m";
240
+ }
241
+ })(type.prototype, "a");
242
+ var c = remult.repo(type);
243
+ var cat = c.create();
244
+ cat.a = '';
245
+ var saved = false;
246
+ try {
247
+ await cat._.save();
248
+ saved = true;
249
+ }
250
+ catch (err) {
251
+ expect(cat._.fields.a.error).toEqual("m");
252
+ }
253
+ expect(saved).toBe(false);
254
+ });
255
+ it("Test Validation 3", async () => {
256
+ var remult = new Remult();
257
+ remult.dataProvider = (new InMemoryDataProvider());
258
+ let type = class extends newCategories {
259
+ a;
260
+ };
261
+ EntityDecorator('')(type);
262
+ Fields.string({
263
+ validate: Validators.required.withMessage("m")
264
+ })(type.prototype, "a");
265
+ var c = remult.repo(type);
266
+ var cat = c.create();
267
+ cat.a = '';
268
+ var saved = false;
269
+ try {
270
+ await cat._.save();
271
+ saved = true;
272
+ }
273
+ catch (err) {
274
+ expect(cat._.fields.a.error).toEqual("m");
275
+ expect(err.message).toBe("A: m");
276
+ }
277
+ expect(saved).toBe(false);
278
+ });
279
+ it("Test unique Validation and is not empty", async () => {
280
+ var remult = new Remult();
281
+ remult.dataProvider = (new InMemoryDataProvider());
282
+ let type = class extends newCategories {
283
+ a;
284
+ };
285
+ EntityDecorator('asdfa')(type);
286
+ Fields.string({
287
+ validate: [Validators.required, Validators.unique]
288
+ })(type.prototype, "a");
289
+ var c = remult.repo(type);
290
+ var cat = c.create();
291
+ var saved = false;
292
+ cat.a = '';
293
+ try {
294
+ await cat._.save();
295
+ saved = true;
296
+ }
297
+ catch {
298
+ expect(cat._.fields.a.error).toEqual("Should not be empty");
299
+ cat.a = '12';
300
+ await cat._.save();
301
+ }
302
+ expect(saved).toBe(false);
303
+ cat = c.create();
304
+ cat.a = '12';
305
+ try {
306
+ await cat._.save();
307
+ saved = true;
308
+ }
309
+ catch (err) {
310
+ expect(cat._.fields.a.error).toEqual("already exists");
311
+ }
312
+ expect(saved).toBe(false);
313
+ });
314
+ it("test that it fails nicely", async () => {
315
+ let c = (await insertFourRows())[0].create();
316
+ c.id = 1;
317
+ c.categoryName = 'bla bla';
318
+ try {
319
+ await c._.save();
320
+ fail("Shouldnt have reached this");
321
+ }
322
+ catch (err) {
323
+ }
324
+ expect(c.categoryName).toBe('bla bla');
325
+ });
326
+ it("update should fail nicely", async () => {
327
+ let cont = new Remult();
328
+ cont.dataProvider = ({ getEntityDataProvider: (x) => new myDp(x), transaction: undefined });
329
+ let c = cont.repo(newCategories).create();
330
+ c.id = 1;
331
+ c.categoryName = 'noam';
332
+ await cont.repo(newCategories).save(c);
333
+ c.categoryName = 'yael';
334
+ try {
335
+ await cont.repo(newCategories).save(c);
336
+ fail("shouldnt be here");
337
+ }
338
+ catch (err) {
339
+ expect(c.categoryName).toBe('yael');
340
+ }
341
+ });
342
+ it("filter should return none", async () => {
343
+ let [c] = await insertFourRows();
344
+ let r = await c.findFirst({ categoryName: [] }, { createIfNotFound: true });
345
+ expect(r.categoryName).toBe(undefined);
346
+ expect(r.isNew()).toBe(true);
347
+ });
348
+ it("filter ignore works return none", async () => {
349
+ let [c] = await insertFourRows();
350
+ let r = await c.findFirst({ categoryName: undefined }, { createIfNotFound: true });
351
+ expect(r.categoryName).toBe("noam");
352
+ expect(r.isNew()).toBe(false);
353
+ });
354
+ it("lookup survives row that doesn't exist", async () => {
355
+ let [c] = await createData(async (insert) => await insert(1, 'noam'));
356
+ let r = await c.findId(5);
357
+ expect(r).toBeUndefined();
358
+ r = await c.findId(5);
359
+ expect(r).toBeUndefined();
360
+ });
361
+ });
362
+ @Entity('typeA', { dbName: 'dbnameA' })
363
+ class typeA extends EntityBase {
364
+ }
365
+ @Entity('typeB')
366
+ class typeB extends typeA {
367
+ }
368
+ describe("decorator inheritance", () => {
369
+ it("entity extends", async () => {
370
+ let c = new Remult();
371
+ let defsA = c.repo(typeA).metadata;
372
+ expect(defsA.key).toBe('typeA');
373
+ expect((await defsA.getDbName())).toBe('dbnameA');
374
+ let defsB = c.repo(typeB).metadata;
375
+ expect(defsB.key).toBe("typeB");
376
+ expect((await defsB.getDbName())).toBe("dbnameA");
377
+ ;
378
+ });
379
+ });
380
+ describe("order by api", () => {
381
+ it("works with sort", () => {
382
+ let c = new Remult().repo(Categories);
383
+ let opt = { orderBy: { id: "asc" } };
384
+ let s = Sort.translateOrderByToSort(c.metadata, opt.orderBy);
385
+ expect(s.Segments.length).toBe(1);
386
+ expect(s.Segments[0].field.key).toBe(c.metadata.fields.id.key);
387
+ });
388
+ it("works with columns array", () => {
389
+ let c = new Remult().repo(Categories);
390
+ let opt = {
391
+ orderBy: {
392
+ id: "asc",
393
+ categoryName: "asc"
394
+ }
395
+ };
396
+ let s = Sort.translateOrderByToSort(c.metadata, opt.orderBy);
397
+ expect(s.Segments.length).toBe(2);
398
+ expect(s.Segments[0].field).toBe(c.metadata.fields.id);
399
+ expect(s.Segments[1].field).toBe(c.metadata.fields.categoryName);
400
+ });
401
+ it("test several sort options", async () => {
402
+ let [c] = await createData(async (i) => {
403
+ await i(1, 'z');
404
+ await i(2, 'y');
405
+ });
406
+ let r = await c.find({ orderBy: { categoryName: "asc" } });
407
+ expect(r.length).toBe(2);
408
+ expect(r[0].id).toBe(2);
409
+ r = await c.find({ orderBy: { categoryName: "asc" } });
410
+ expect(r.length).toBe(2);
411
+ expect(r[0].id).toBe(2);
412
+ r = await c.find({ orderBy: { categoryName: "desc" } });
413
+ expect(r.length).toBe(2);
414
+ expect(r[0].id).toBe(1);
415
+ });
416
+ });
417
+ describe("test datetime column", () => {
418
+ it("stores well", () => {
419
+ let col = decorateColumnSettings({ valueType: Date }, new Remult());
420
+ let val = col.valueConverter.fromJson(col.valueConverter.toJson(new Date(1976, 11, 16, 8, 55, 31, 65)));
421
+ expect(val.toISOString()).toBe(new Date(1976, 11, 16, 8, 55, 31, 65).toISOString());
422
+ });
423
+ it("stores well undefined", () => {
424
+ let col = decorateColumnSettings({ valueType: Date }, new Remult());
425
+ expect(col.valueConverter.toJson(undefined)).toBe('');
426
+ });
427
+ it("displays empty date well", () => {
428
+ expect(ValueConverters.DateOnly.displayValue(ValueConverters.DateOnly.fromJson(''))).toBe('');
429
+ });
430
+ it("displays null date well 1", () => {
431
+ expect(ValueConverters.DateOnly.toJson(null)).toBe(null);
432
+ expect(ValueConverters.DateOnly.toJson(null)).toBe(null);
433
+ expect(ValueConverters.DateOnly.displayValue(null)).toBe('');
434
+ });
435
+ it("displays empty date well empty", () => {
436
+ expect(ValueConverters.DateOnly.displayValue(ValueConverters.DateOnly.fromJson('0000-00-00'))).toBe('');
437
+ });
438
+ it("Date only stuff", () => {
439
+ function test(d, expected) {
440
+ expect(ValueConverters.DateOnly.toJson(d)).toBe(expected);
441
+ const ed = ValueConverters.DateOnly.fromJson(expected);
442
+ expect(ed.getFullYear()).toEqual(d.getFullYear(), "year");
443
+ expect(ed.getMonth()).toEqual(d.getMonth(), "month");
444
+ expect(ed.getDate()).toEqual(d.getDate(), "day");
445
+ }
446
+ test(new Date(2021, 2, 26), '2021-03-26');
447
+ test(new Date(2021, 9, 31), '2021-10-31');
448
+ //test(new Date('1976-06-16'), '1976-06-16');
449
+ //test(new Date('1976-6-16'), '1976-06-16');
450
+ test(new Date(1976, 5, 16), '1976-06-16');
451
+ test(new Date(2021, 9, 30), '2021-10-30');
452
+ test(new Date(2021, 2, 26), '2021-03-26');
453
+ "".toString();
454
+ });
455
+ it("test display value, from and to input", () => {
456
+ let x = class {
457
+ name = 'noam';
458
+ myDate = new Date(1976, 5, 16);
459
+ };
460
+ describeClass(x, Entity("myEntity"), {
461
+ name: Fields.string(),
462
+ myDate: Fields.dateOnly({
463
+ displayValue: z => z.name + z.myDate.getFullYear()
464
+ })
465
+ });
466
+ var repo = new Remult().repo(x);
467
+ let y = {
468
+ name: 'noam',
469
+ myDate: new Date(1976, 5, 16)
470
+ };
471
+ expect(repo.fields.myDate.displayValue(y)).toBe('noam1976');
472
+ expect(repo.fields.myDate.toInput(new Date(1976, 5, 16))).toBe("1976-06-16");
473
+ expect(repo.fields.myDate.fromInput("1976-06-16")).toEqual(new Date(1976, 5, 16));
474
+ });
475
+ it("date Storage works 1", () => {
476
+ let col = decorateColumnSettings({
477
+ valueType: Date,
478
+ valueConverter: ValueConverters.DateOnly
479
+ }, new Remult());
480
+ expect(col.valueConverter.toDb(col.valueConverter.fromJson('1976-06-16')).toLocaleDateString()).toBe(new Date(1976, 5, 16, 0, 0, 0).toLocaleDateString());
481
+ expect(col.valueConverter.toDb(col.valueConverter.fromJson('1976-06-16')).getDate()).toBe(16);
482
+ });
483
+ });
484
+ describe("Test char date storage", () => {
485
+ let x = ValueConverters.DateOnlyString;
486
+ it("from db", () => {
487
+ expect(x.toJson(x.fromDb('19760616'))).toBe('1976-06-16');
488
+ });
489
+ it("to db", () => {
490
+ expect(x.toDb(x.fromJson('1976-06-16'))).toBe('19760616');
491
+ });
492
+ });
493
+ describe("value list column without id and caption", () => {
494
+ it("getValueList", () => {
495
+ expect(getValueList(Language).length).toBe(3);
496
+ });
497
+ });
498
+ describe("relation", () => {
499
+ it("should get values", async () => {
500
+ let [c] = await insertFourRows();
501
+ let r = new OneToMany(c, {
502
+ where: { description: "x" }
503
+ });
504
+ let rows = await r.load();
505
+ expect(rows.length).toBe(2);
506
+ let n = await r.create();
507
+ expect(n.description).toBe("x");
508
+ });
509
+ it("should have an array and lazy load it", async () => {
510
+ let [c] = await insertFourRows();
511
+ let r = new OneToMany(c, {
512
+ where: { description: 'x' }
513
+ });
514
+ let arr = r.lazyItems;
515
+ expect(arr.length).toBe(0);
516
+ await r.load();
517
+ expect(arr.length).toBe(2);
518
+ });
519
+ });
520
+ describe("context", () => {
521
+ it("what", () => {
522
+ var c = new Remult();
523
+ expect(c.authenticated()).toBe(false);
524
+ c.user = ({
525
+ id: '1',
526
+ name: 'name',
527
+ roles: ["a"]
528
+ });
529
+ expect(c.authenticated()).toBe(true);
530
+ c.user = (undefined);
531
+ expect(c.authenticated()).toBe(false);
532
+ });
533
+ it("is allowed for instance works with array", () => {
534
+ var remult = new Remult();
535
+ remult.user = ({ roles: ["a"], id: '', name: '' });
536
+ expect(remult.isAllowedForInstance({}, ["b", "a"])).toBe(true);
537
+ });
538
+ it("test no user is not allowed", () => {
539
+ var remult = new Remult();
540
+ remult.user = (undefined);
541
+ expect(remult.user).toBeUndefined();
542
+ });
543
+ });
544
+ it("test http provider for remult", async () => {
545
+ var remult = new Remult({
546
+ get: async (url) => {
547
+ return { count: 7 };
548
+ },
549
+ delete: async () => { },
550
+ put: async () => { },
551
+ post: async () => { }
552
+ });
553
+ // expect(await toPromise(Promise.resolve(7))).toBe(7);
554
+ expect(await remult.repo(TestCategories1).count()).toBe(7);
555
+ });
556
+ describe("allow", () => {
557
+ it("should work", () => {
558
+ expect(Allow.everyone()).toBe(true);
559
+ var remult = new Remult();
560
+ expect(Allow.authenticated(remult)).toBe(false);
561
+ remult.user = ({ id: '', name: '', roles: [] });
562
+ expect(Allow.authenticated(remult)).toBe(true);
563
+ });
564
+ });
565
+ @EntityDecorator('123')
566
+ class TestCategories1 extends newCategories {
567
+ @Fields.string({
568
+ validate: Validators.required
569
+ })
570
+ a;
571
+ }
572
+ describe("test ", () => {
573
+ it("Test Validation,", async () => {
574
+ var remult = new Remult();
575
+ remult.dataProvider = (new InMemoryDataProvider());
576
+ var c = remult.repo(TestCategories1);
577
+ var cat = c.create();
578
+ cat.a = '';
579
+ var saved = false;
580
+ try {
581
+ await c.save(cat);
582
+ saved = true;
583
+ }
584
+ catch (err) {
585
+ expect(getEntityRef(cat).fields.a.error).toEqual("Should not be empty");
586
+ }
587
+ expect(saved).toBe(false);
588
+ });
589
+ });
590
+ export class myDp extends ArrayEntityDataProvider {
591
+ constructor(entity) {
592
+ super(entity, []);
593
+ }
594
+ update(id, data) {
595
+ throw new Error("what");
596
+ }
597
+ }
598
+ class mockColumnDefs {
599
+ dbName;
600
+ constructor(dbName) {
601
+ this.dbName = dbName;
602
+ }
603
+ apiUpdateAllowed(item) {
604
+ throw new Error('Method not implemented.');
605
+ }
606
+ displayValue(item) {
607
+ throw new Error('Method not implemented.');
608
+ }
609
+ includedInApi;
610
+ toInput(value, inputType) {
611
+ throw new Error('Method not implemented.');
612
+ }
613
+ fromInput(inputValue, inputType) {
614
+ throw new Error('Method not implemented.');
615
+ }
616
+ async getDbName() {
617
+ return this.dbName;
618
+ }
619
+ options;
620
+ valueConverter = ValueConverters.Default;
621
+ target;
622
+ readonly;
623
+ dbReadOnly;
624
+ isServerExpression;
625
+ key;
626
+ caption;
627
+ inputType;
628
+ valueType;
629
+ allowNull;
630
+ dbType;
631
+ }
@@ -0,0 +1,10 @@
1
+ import { DataApiResponse } from "../data-api";
2
+ export declare class TestDataApiResponse implements DataApiResponse {
3
+ progress(progress: number): void;
4
+ success(data: any): void;
5
+ forbidden(): void;
6
+ created(data: any): void;
7
+ deleted(): void;
8
+ notFound(): void;
9
+ error(data: any): void;
10
+ }
@@ -0,0 +1,22 @@
1
+ export class TestDataApiResponse {
2
+ progress(progress) {
3
+ }
4
+ success(data) {
5
+ throw new Error(('didnt expect success: ' + JSON.stringify(data)));
6
+ }
7
+ forbidden() {
8
+ throw new Error('didnt expect forbidden:');
9
+ }
10
+ created(data) {
11
+ throw new Error('didnt expect created: ' + JSON.stringify(data));
12
+ }
13
+ deleted() {
14
+ throw new Error('didnt expect deleted:');
15
+ }
16
+ notFound() {
17
+ throw new Error('not found');
18
+ }
19
+ error(data) {
20
+ throw new Error('error: ' + data + " " + JSON.stringify(data));
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ import { EntityBase } from '../remult3';
2
+ export declare class entityWithValidationsOnEntityEvent extends EntityBase {
3
+ myId: number;
4
+ name: string;
5
+ }
6
+ export declare class EntityWithLateBoundDbName extends EntityBase {
7
+ id: number;
8
+ }